From 5e42c4193fcb5dbabf8d486f339854d44cd43f64 Mon Sep 17 00:00:00 2001 From: Ivan Frolov <59515280+frolvanya@users.noreply.github.com> Date: Tue, 15 Oct 2024 11:00:23 +0100 Subject: [PATCH 01/21] feat: added native fee in structures (#69) * chore: added `nativeFee` field closes #47 * chore: renamed `eth` to `evm` In general all methods that we're using for eth are also appliable for evm * feat: handled scenario with insufficient fees * chore: reordered events * feat: get `wormhole_chain_id` based on recipient * chore: renamed `withdraw_log` to `init_log` Changed due to the new name in bridge token factory structure * feat: updated to the latest version of omni-types * feat: removed `check_bad_fees` logic * chore: renamed `BAD_FEE_EVENTS` to `BAD_FEES` * feat: removed whole bad fees logic * feat: provided proper fee structure into signing method * feat: updated accordingly to new version of bridge-sdk --- omni-relayer/Cargo.lock | 752 +++++++++++--------- omni-relayer/Cargo.toml | 8 +- omni-relayer/config.toml | 2 +- omni-relayer/src/config.rs | 4 +- omni-relayer/src/main.rs | 4 +- omni-relayer/src/startup/{eth.rs => evm.rs} | 156 ++-- omni-relayer/src/startup/mod.rs | 8 +- omni-relayer/src/utils/fee.rs | 6 +- omni-relayer/src/utils/near.rs | 30 +- omni-relayer/src/utils/redis.rs | 3 + omni-relayer/src/workers/{eth.rs => evm.rs} | 0 omni-relayer/src/workers/mod.rs | 2 +- omni-relayer/src/workers/near.rs | 2 +- 13 files changed, 554 insertions(+), 423 deletions(-) rename omni-relayer/src/startup/{eth.rs => evm.rs} (66%) rename omni-relayer/src/workers/{eth.rs => evm.rs} (100%) diff --git a/omni-relayer/Cargo.lock b/omni-relayer/Cargo.lock index 5748fba7..1691c3f8 100644 --- a/omni-relayer/Cargo.lock +++ b/omni-relayer/Cargo.lock @@ -44,7 +44,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -65,7 +65,7 @@ checksum = "b6ac1e58cded18cb28ddc17143c4dea5345b3ad575e14f32f66e4054a56eb271" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -79,11 +79,11 @@ dependencies = [ [[package]] name = "addr2line" -version = "0.24.1" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5fb1d8e4442bd405fdfd1dacb42792696b0cf9cb15882e5d097b742a676d375" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ - "gimli 0.31.0", + "gimli 0.31.1", ] [[package]] @@ -143,9 +143,9 @@ checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" [[package]] name = "alloy" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8367891bf380210abb0d6aa30c5f85a9080cb4a066c4d5c5acadad630823751b" +checksum = "056f2c01b2aed86e15b43c47d109bfc8b82553dc34e66452875e51247ec31ab2" dependencies = [ "alloy-consensus", "alloy-contract", @@ -166,33 +166,36 @@ dependencies = [ [[package]] name = "alloy-chains" -version = "0.1.33" +version = "0.1.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "805f7a974de5804f5c053edc6ca43b20883bdd3a733b3691200ae3a4b454a2db" +checksum = "156bfc5dcd52ef9a5f33381701fa03310317e14c65093a9430d3e3557b08dcd3" dependencies = [ + "alloy-primitives", "num_enum", "strum 0.26.3", ] [[package]] name = "alloy-consensus" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "629b62e38d471cc15fea534eb7283d2f8a4e8bdb1811bcc5d66dda6cfce6fae1" +checksum = "705687d5bfd019fee57cf9e206b27b30a9a9617535d5590a02b171e813208f8e" dependencies = [ "alloy-eips", "alloy-primitives", "alloy-rlp", "alloy-serde", + "auto_impl", "c-kzg", + "derive_more 1.0.0", "serde", ] [[package]] name = "alloy-contract" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eefe64fd344cffa9cf9e3435ec4e93e6e9c3481bc37269af988bf497faf4a6a" +checksum = "917f7d12cf3971dc8c11c9972f732b35ccb9aaaf5f28f2f87e9e6523bee3a8ad" dependencies = [ "alloy-dyn-abi", "alloy-json-abi", @@ -211,9 +214,9 @@ dependencies = [ [[package]] name = "alloy-core" -version = "0.8.5" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ce854562e7cafd5049189d0268d6e5cba05fe6c9cb7c6f8126a79b94800629c" +checksum = "a54c7158ea4a394bef220d82d8fdd412fb9b1ca2d6024db539070b7bc01b6401" dependencies = [ "alloy-dyn-abi", "alloy-json-abi", @@ -224,9 +227,9 @@ dependencies = [ [[package]] name = "alloy-dyn-abi" -version = "0.8.5" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b499852e1d0e9b8c6db0f24c48998e647c0d5762a01090f955106a7700e4611" +checksum = "e6228abfc751a29cde117b0879b805a3e0b3b641358f063272c83ca459a56886" dependencies = [ "alloy-json-abi", "alloy-primitives", @@ -252,9 +255,9 @@ dependencies = [ [[package]] name = "alloy-eip7702" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d319bb544ca6caeab58c39cea8921c55d924d4f68f2c60f24f914673f9a74a" +checksum = "ea59dc42102bc9a1905dc57901edc6dd48b9f38115df86c7d252acba70d71d04" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -263,9 +266,9 @@ dependencies = [ [[package]] name = "alloy-eips" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f923dd5fca5f67a43d81ed3ebad0880bd41f6dd0ada930030353ac356c54cd0f" +checksum = "6ffb906284a1e1f63c4607da2068c8197458a352d0b3e9796e67353d72a9be85" dependencies = [ "alloy-eip2930", "alloy-eip7702", @@ -281,9 +284,9 @@ dependencies = [ [[package]] name = "alloy-genesis" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a7a18afb0b318616b6b2b0e2e7ac5529d32a966c673b48091c9919e284e6aca" +checksum = "8429cf4554eed9b40feec7f4451113e76596086447550275e3def933faf47ce3" dependencies = [ "alloy-primitives", "alloy-serde", @@ -292,9 +295,9 @@ dependencies = [ [[package]] name = "alloy-json-abi" -version = "0.8.5" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a438d4486b5d525df3b3004188f9d5cd1d65cd30ecc41e5a3ccef6f6342e8af9" +checksum = "d46eb5871592c216d39192499c95a99f7175cb94104f88c307e6dc960676d9f1" dependencies = [ "alloy-primitives", "alloy-sol-type-parser", @@ -304,9 +307,9 @@ dependencies = [ [[package]] name = "alloy-json-rpc" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3c717b5298fad078cd3a418335b266eba91b511383ca9bd497f742d5975d5ab" +checksum = "f8fa8a1a3c4cbd221f2b8e3693aeb328fca79a757fe556ed08e47bbbc2a70db7" dependencies = [ "alloy-primitives", "alloy-sol-types", @@ -318,9 +321,9 @@ dependencies = [ [[package]] name = "alloy-network" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb3705ce7d8602132bcf5ac7a1dd293a42adc2f183abf5907c30ac535ceca049" +checksum = "85fa23a6a9d612b52e402c995f2d582c25165ec03ac6edf64c861a76bc5b87cd" dependencies = [ "alloy-consensus", "alloy-eips", @@ -339,10 +342,11 @@ dependencies = [ [[package]] name = "alloy-network-primitives" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94ad40869867ed2d9cd3842b1e800889e5b49e6b92da346e93862b4a741bedf3" +checksum = "801492711d4392b2ccf5fc0bc69e299fa1aab15167d74dcaa9aab96a54f684bd" dependencies = [ + "alloy-consensus", "alloy-eips", "alloy-primitives", "alloy-serde", @@ -351,9 +355,9 @@ dependencies = [ [[package]] name = "alloy-node-bindings" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5988a227293f949525f0a1b3e1ef728d2ef24afa96bad2b7788c6c9617fa3eec" +checksum = "4f1334a738aa1710cb8227441b3fcc319202ce78e967ef37406940242df4a454" dependencies = [ "alloy-genesis", "alloy-primitives", @@ -368,18 +372,19 @@ dependencies = [ [[package]] name = "alloy-primitives" -version = "0.8.5" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "260d3ff3bff0bb84599f032a2f2c6828180b0ea0cd41fdaf44f39cef3ba41861" +checksum = "38f35429a652765189c1c5092870d8360ee7b7769b09b06d89ebaefd34676446" dependencies = [ "alloy-rlp", "bytes", "cfg-if 1.0.0", "const-hex", "derive_more 1.0.0", - "hashbrown 0.14.5", + "foldhash", + "hashbrown 0.15.0", "hex-literal", - "indexmap 2.5.0", + "indexmap 2.6.0", "itoa", "k256", "keccak-asm", @@ -395,9 +400,9 @@ dependencies = [ [[package]] name = "alloy-provider" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "927f708dd457ed63420400ee5f06945df9632d5d101851952056840426a10dc5" +checksum = "fcfaa4ffec0af04e3555686b8aacbcdf7d13638133a0672749209069750f78a6" dependencies = [ "alloy-chains", "alloy-consensus", @@ -421,9 +426,9 @@ dependencies = [ "dashmap", "futures", "futures-utils-wasm", - "lru 0.12.4", + "lru 0.12.5", "pin-project", - "reqwest 0.12.7", + "reqwest 0.12.8", "serde", "serde_json", "thiserror", @@ -434,9 +439,9 @@ dependencies = [ [[package]] name = "alloy-pubsub" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d05f63677e210d758cd5d6d1ce10f20c980c3560ccfbe79ba1997791862a04f" +checksum = "f32cef487122ae75c91eb50154c70801d71fabdb976fec6c49e0af5e6486ab15" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -470,14 +475,14 @@ checksum = "4d0f2d905ebd295e7effec65e5f6868d153936130ae718352771de3e7d03c75c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] name = "alloy-rpc-client" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d82952dca71173813d4e5733e2c986d8b04aea9e0f3b0a576664c232ad050a5" +checksum = "370143ed581aace6e663342d21d209c6b2e34ee6142f7d6675adb518deeaf0dc" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -487,7 +492,7 @@ dependencies = [ "alloy-transport-ws", "futures", "pin-project", - "reqwest 0.12.7", + "reqwest 0.12.8", "serde", "serde_json", "tokio", @@ -499,10 +504,11 @@ dependencies = [ [[package]] name = "alloy-rpc-types" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64333d639f2a0cf73491813c629a405744e16343a4bc5640931be707c345ecc5" +checksum = "9ffc534b7919e18f35e3aa1f507b6f3d9d92ec298463a9f6beaac112809d8d06" dependencies = [ + "alloy-primitives", "alloy-rpc-types-eth", "alloy-serde", "serde", @@ -510,9 +516,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-anvil" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d25cb45ad7c0930dd62eecf164d2afe4c3d2dd2c82af85680ad1f118e1e5cb83" +checksum = "d780adaa5d95b07ad92006b2feb68ecfa7e2015f7d5976ceaac4c906c73ebd07" dependencies = [ "alloy-primitives", "alloy-serde", @@ -521,9 +527,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-eth" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83aa984386deda02482660aa31cb8ca1e63d533f1c31a52d7d181ac5ec68e9b8" +checksum = "413f4aa3ccf2c3e4234a047c5fa4727916d7daf25a89f9b765df0ba09784fd87" dependencies = [ "alloy-consensus", "alloy-eips", @@ -532,9 +538,7 @@ dependencies = [ "alloy-rlp", "alloy-serde", "alloy-sol-types", - "cfg-if 1.0.0", "derive_more 1.0.0", - "hashbrown 0.14.5", "itertools 0.13.0", "serde", "serde_json", @@ -542,9 +546,9 @@ dependencies = [ [[package]] name = "alloy-serde" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "731f75ec5d383107fd745d781619bd9cedf145836c51ecb991623d41278e71fa" +checksum = "9dff0ab1cdd43ca001e324dc27ee0e8606bd2161d6623c63e0e0b8c4dfc13600" dependencies = [ "alloy-primitives", "serde", @@ -553,9 +557,9 @@ dependencies = [ [[package]] name = "alloy-signer" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "307324cca94354cd654d6713629f0383ec037e1ff9e3e3d547212471209860c0" +checksum = "2fd4e0ad79c81a27ca659be5d176ca12399141659fef2bcbfdc848da478f4504" dependencies = [ "alloy-primitives", "async-trait", @@ -567,9 +571,9 @@ dependencies = [ [[package]] name = "alloy-signer-local" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fabe917ab1778e760b4701628d1cae8e028ee9d52ac6307de4e1e9286ab6b5f" +checksum = "494e0a256f3e99f2426f994bcd1be312c02cb8f88260088dacb33a8b8936475f" dependencies = [ "alloy-consensus", "alloy-network", @@ -583,56 +587,56 @@ dependencies = [ [[package]] name = "alloy-sol-macro" -version = "0.8.5" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68e7f6e8fe5b443f82b3f1e15abfa191128f71569148428e49449d01f6f49e8b" +checksum = "3b2395336745358cc47207442127c47c63801a7065ecc0aa928da844f8bb5576" dependencies = [ "alloy-sol-macro-expander", "alloy-sol-macro-input", "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] name = "alloy-sol-macro-expander" -version = "0.8.5" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b96ce28d2fde09abb6135f410c41fad670a3a770b6776869bd852f1df102e6f" +checksum = "9ed5047c9a241df94327879c2b0729155b58b941eae7805a7ada2e19436e6b39" dependencies = [ "alloy-sol-macro-input", "const-hex", "heck 0.5.0", - "indexmap 2.5.0", + "indexmap 2.6.0", "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", "syn-solidity", "tiny-keccak", ] [[package]] name = "alloy-sol-macro-input" -version = "0.8.5" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "906746396a8296537745711630d9185746c0b50c033d5e9d18b0a6eba3d53f90" +checksum = "5dee02a81f529c415082235129f0df8b8e60aa1601b9c9298ffe54d75f57210b" dependencies = [ "const-hex", "dunce", "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", "syn-solidity", ] [[package]] name = "alloy-sol-type-parser" -version = "0.8.5" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc85178909a49c8827ffccfc9103a7ce1767ae66a801b69bdc326913870bf8e6" +checksum = "f631f0bd9a9d79619b27c91b6b1ab2c4ef4e606a65192369a1ee05d40dcf81cc" dependencies = [ "serde", "winnow", @@ -640,9 +644,9 @@ dependencies = [ [[package]] name = "alloy-sol-types" -version = "0.8.5" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d86a533ce22525969661b25dfe296c112d35eb6861f188fd284f8bd4bb3842ae" +checksum = "c2841af22d99e2c0f82a78fe107b6481be3dd20b89bfb067290092794734343a" dependencies = [ "alloy-json-abi", "alloy-primitives", @@ -653,9 +657,9 @@ dependencies = [ [[package]] name = "alloy-transport" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33616b2edf7454302a1d48084db185e52c309f73f6c10be99b0fe39354b3f1e9" +checksum = "2ac3e97dad3d31770db0fc89bd6a63b789fbae78963086733f960cf32c483904" dependencies = [ "alloy-json-rpc", "base64 0.22.1", @@ -672,13 +676,13 @@ dependencies = [ [[package]] name = "alloy-transport-http" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a944f5310c690b62bbb3e7e5ce34527cbd36b2d18532a797af123271ce595a49" +checksum = "b367dcccada5b28987c2296717ee04b9a5637aacd78eacb1726ef211678b5212" dependencies = [ "alloy-json-rpc", "alloy-transport", - "reqwest 0.12.7", + "reqwest 0.12.8", "serde_json", "tower 0.5.1", "tracing", @@ -687,18 +691,18 @@ dependencies = [ [[package]] name = "alloy-transport-ws" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9704761f6297fe482276bee7f77a93cb42bd541c2bd6c1c560b6f3a9ece672e" +checksum = "7153b88690de6a50bba81c11e1d706bc41dbb90126d607404d60b763f6a3947f" dependencies = [ "alloy-pubsub", "alloy-transport", "futures", "http 1.1.0", - "rustls 0.23.13", + "rustls 0.23.14", "serde_json", "tokio", - "tokio-tungstenite 0.23.1", + "tokio-tungstenite 0.24.0", "tracing", "ws_stream_wasm", ] @@ -947,9 +951,9 @@ checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" [[package]] name = "async-stream" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" dependencies = [ "async-stream-impl", "futures-core", @@ -958,13 +962,13 @@ dependencies = [ [[package]] name = "async-stream-impl" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -975,7 +979,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -1003,20 +1007,20 @@ checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] name = "autocfg" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "aws-config" -version = "1.5.6" +version = "1.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "848d7b9b605720989929279fa644ce8f244d0ce3146fcca5b70e4eb7b3c020fc" +checksum = "7198e6f03240fdceba36656d8be440297b6b82270325908c7381f37d826a74f6" dependencies = [ "aws-credential-types", "aws-runtime", @@ -1082,9 +1086,9 @@ dependencies = [ [[package]] name = "aws-sdk-s3" -version = "1.51.0" +version = "1.56.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c09fd4b5c7ed75f52b913b4f3ff0501dae7f8cb9125f6d45db4553980cbc0528" +checksum = "cecd672c8d4265fd4fbecacd4a479180e616881bbe639250cf81ddb604e4c301" dependencies = [ "ahash 0.8.11", "aws-credential-types", @@ -1106,7 +1110,7 @@ dependencies = [ "hmac", "http 0.2.12", "http-body 0.4.6", - "lru 0.12.4", + "lru 0.12.5", "once_cell", "percent-encoding", "regex-lite", @@ -1117,9 +1121,9 @@ dependencies = [ [[package]] name = "aws-sdk-sso" -version = "1.43.0" +version = "1.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70a9d27ed1c12b1140c47daf1bc541606c43fdafd918c4797d520db0043ceef2" +checksum = "0dc2faec3205d496c7e57eff685dd944203df7ce16a4116d0281c44021788a7b" dependencies = [ "aws-credential-types", "aws-runtime", @@ -1139,9 +1143,9 @@ dependencies = [ [[package]] name = "aws-sdk-ssooidc" -version = "1.44.0" +version = "1.47.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44514a6ca967686cde1e2a1b81df6ef1883d0e3e570da8d8bc5c491dcb6fc29b" +checksum = "c93c241f52bc5e0476e259c953234dab7e2a35ee207ee202e86c0095ec4951dc" dependencies = [ "aws-credential-types", "aws-runtime", @@ -1161,9 +1165,9 @@ dependencies = [ [[package]] name = "aws-sdk-sts" -version = "1.43.0" +version = "1.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd7a4d279762a35b9df97209f6808b95d4fe78547fe2316b4d200a0283960c5a" +checksum = "b259429be94a3459fa1b00c5684faee118d74f9577cc50aebadc36e507c63b5f" dependencies = [ "aws-credential-types", "aws-runtime", @@ -1296,9 +1300,9 @@ dependencies = [ [[package]] name = "aws-smithy-runtime" -version = "1.7.1" +version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1ce695746394772e7000b39fe073095db6d45a862d0767dd5ad0ac0d7f8eb87" +checksum = "a065c0fe6fdbdf9f11817eb68582b2ab4aff9e9c39e986ae48f7ec576c6322db" dependencies = [ "aws-smithy-async", "aws-smithy-http", @@ -1340,9 +1344,9 @@ dependencies = [ [[package]] name = "aws-smithy-types" -version = "1.2.6" +version = "1.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03701449087215b5369c7ea17fef0dd5d24cb93439ec5af0c7615f58c3f22605" +checksum = "147100a7bea70fa20ef224a6bad700358305f5dc0f84649c53769761395b355b" dependencies = [ "base64-simd", "bytes", @@ -1393,11 +1397,11 @@ version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" dependencies = [ - "addr2line 0.24.1", + "addr2line 0.24.2", "cfg-if 1.0.0", "libc", "miniz_oxide", - "object 0.36.4", + "object 0.36.5", "rustc-demangle", "windows-targets 0.52.6", ] @@ -1607,7 +1611,7 @@ dependencies = [ "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", "syn_derive", ] @@ -1636,12 +1640,13 @@ dependencies = [ [[package]] name = "bridge-connector-common" version = "0.1.0" -source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs?branch=omni-token-support#a9922eca00939901d0b649a655b29b19a2dc0994" +source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs#003ea92153ac0f38548c1beec023dfa38185fc14" dependencies = [ "eth-proof", "ethers", "near-light-client-on-eth", "near-rpc-client", + "serde_json", "thiserror", ] @@ -1809,9 +1814,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.21" +version = "1.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07b1695e2c7e8fc85310cde85aeaab7e3097f593c91d209d3f9df76c928100f0" +checksum = "b16803a61b81d9eabb7eae2588776c4c1e584b738ede45fdbb4c972cec1e9945" dependencies = [ "jobserver", "libc", @@ -1878,14 +1883,14 @@ checksum = "0f0bc31eabef0259183d03c3846ad6818eaa8e542c31dae751c9d22ea030fb7d" dependencies = [ "hasher", "parking_lot 0.12.3", - "rlp", + "rlp 0.5.2", ] [[package]] name = "clap" -version = "4.5.18" +version = "4.5.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0956a43b323ac1afaffc053ed5c4b7c1f1800bacd1683c353aabbb752515dd3" +checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" dependencies = [ "clap_builder", "clap_derive", @@ -1893,9 +1898,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.18" +version = "4.5.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d72166dd41634086d5803a47eb71ae740e61d84709c36f3c34110173db3961b" +checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" dependencies = [ "anstream", "anstyle", @@ -1912,7 +1917,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -2004,9 +2009,9 @@ dependencies = [ [[package]] name = "const-hex" -version = "1.12.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94fb8a24a26d37e1ffd45343323dc9fe6654ceea44c12f2fcb3d7ac29e610bc6" +checksum = "0121754e84117e65f9d90648ee6aa4882a6e63110307ab73967a4c5e7e69e586" dependencies = [ "cfg-if 1.0.0", "cpufeatures", @@ -2312,7 +2317,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -2360,7 +2365,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -2382,7 +2387,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core 0.20.10", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -2463,7 +2468,7 @@ checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -2477,11 +2482,11 @@ dependencies = [ [[package]] name = "derive_builder" -version = "0.20.1" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd33f37ee6a119146a1781d3356a7c26028f83d779b2e04ecd45fdc75c76877b" +checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" dependencies = [ - "derive_builder_macro 0.20.1", + "derive_builder_macro 0.20.2", ] [[package]] @@ -2498,14 +2503,14 @@ dependencies = [ [[package]] name = "derive_builder_core" -version = "0.20.1" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7431fa049613920234f22c47fdc33e6cf3ee83067091ea4277a3f8c4587aae38" +checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" dependencies = [ "darling 0.20.10", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -2520,12 +2525,12 @@ dependencies = [ [[package]] name = "derive_builder_macro" -version = "0.20.1" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4abae7035bf79b9877b779505d8cf3749285b80c43941eda66604841889451dc" +checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ - "derive_builder_core 0.20.1", - "syn 2.0.77", + "derive_builder_core 0.20.2", + "syn 2.0.79", ] [[package]] @@ -2538,7 +2543,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version 0.4.1", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -2558,7 +2563,7 @@ checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", "unicode-xid", ] @@ -2834,7 +2839,7 @@ dependencies = [ "k256", "log", "rand 0.8.5", - "rlp", + "rlp 0.5.2", "serde", "sha3", "zeroize", @@ -2857,7 +2862,7 @@ checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -2878,7 +2883,7 @@ dependencies = [ "darling 0.20.10", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -2956,16 +2961,16 @@ dependencies = [ [[package]] name = "eth-proof" version = "0.1.0" -source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs?branch=omni-token-support#a9922eca00939901d0b649a655b29b19a2dc0994" +source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs#003ea92153ac0f38548c1beec023dfa38185fc14" dependencies = [ "borsh 1.5.1", "cita_trie", - "ethereum-types", + "ethereum-types 0.14.1", "hasher", "hex", "omni-types", "reqwest 0.11.27", - "rlp", + "rlp 0.5.2", "serde", "serde_json", "thiserror", @@ -2978,7 +2983,7 @@ version = "18.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7413c5f74cc903ea37386a8965a936cbeb334bd270862fdece542c1b2dcbc898" dependencies = [ - "ethereum-types", + "ethereum-types 0.14.1", "hex", "once_cell", "regex", @@ -2986,7 +2991,7 @@ dependencies = [ "serde_json", "sha3", "thiserror", - "uint", + "uint 0.9.5", ] [[package]] @@ -2998,26 +3003,53 @@ dependencies = [ "crunchy", "fixed-hash 0.8.0", "impl-codec", - "impl-rlp", - "impl-serde", + "impl-rlp 0.3.0", + "impl-serde 0.4.0", "scale-info", "tiny-keccak", ] +[[package]] +name = "ethbloom" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c321610643004cf908ec0f5f2aa0d8f1f8e14b540562a2887a1111ff1ecbf7b" +dependencies = [ + "crunchy", + "fixed-hash 0.8.0", + "impl-rlp 0.4.0", + "impl-serde 0.5.0", + "tiny-keccak", +] + [[package]] name = "ethereum-types" version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" dependencies = [ - "ethbloom", + "ethbloom 0.13.0", "fixed-hash 0.8.0", "impl-codec", - "impl-rlp", - "impl-serde", + "impl-rlp 0.3.0", + "impl-serde 0.4.0", "primitive-types 0.12.2", "scale-info", - "uint", + "uint 0.9.5", +] + +[[package]] +name = "ethereum-types" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ab15ed80916029f878e0267c3a9f92b67df55e79af370bf66199059ae2b4ee3" +dependencies = [ + "ethbloom 0.14.1", + "fixed-hash 0.8.0", + "impl-rlp 0.4.0", + "impl-serde 0.5.0", + "primitive-types 0.13.1", + "uint 0.10.0", ] [[package]] @@ -3086,7 +3118,7 @@ dependencies = [ "reqwest 0.11.27", "serde", "serde_json", - "syn 2.0.77", + "syn 2.0.79", "toml 0.8.19", "walkdir", ] @@ -3104,7 +3136,7 @@ dependencies = [ "proc-macro2", "quote", "serde_json", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -3126,11 +3158,11 @@ dependencies = [ "once_cell", "open-fastrlp", "rand 0.8.5", - "rlp", + "rlp 0.5.2", "serde", "serde_json", "strum 0.26.3", - "syn 2.0.77", + "syn 2.0.79", "tempfile", "thiserror", "tiny-keccak", @@ -3372,9 +3404,9 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.0.33" +version = "1.0.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "324a1be68054ef05ad64b861cc9eaf1d623d2d8cb25b4bf2cb9cdd902b4bf253" +checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" dependencies = [ "crc32fast", "miniz_oxide", @@ -3386,6 +3418,12 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f81ec6369c545a7d40e4589b5597581fa1c441fe1cce96dd1de43159910a36a2" + [[package]] name = "foreign-types" version = "0.3.2" @@ -3428,9 +3466,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -3443,9 +3481,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -3453,15 +3491,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -3470,9 +3508,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-locks" @@ -3486,26 +3524,26 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] name = "futures-sink" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-timer" @@ -3519,9 +3557,9 @@ dependencies = [ [[package]] name = "futures-util" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-channel", "futures-core", @@ -3612,15 +3650,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" dependencies = [ "fallible-iterator", - "indexmap 2.5.0", + "indexmap 2.6.0", "stable_deref_trait", ] [[package]] name = "gimli" -version = "0.31.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32085ea23f3234fc7846555e85283ba4de91e21016dc0455a16286d87a292d64" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "glob" @@ -3674,7 +3712,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.5.0", + "indexmap 2.6.0", "slab", "tokio", "tokio-util 0.7.12", @@ -3693,7 +3731,7 @@ dependencies = [ "futures-core", "futures-sink", "http 1.1.0", - "indexmap 2.5.0", + "indexmap 2.6.0", "slab", "tokio", "tokio-util 0.7.12", @@ -3734,7 +3772,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ "ahash 0.8.11", +] + +[[package]] +name = "hashbrown" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" +dependencies = [ "allocator-api2", + "equivalent", + "foldhash", "serde", ] @@ -3880,9 +3928,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.9.4" +version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" +checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" [[package]] name = "httpdate" @@ -3966,7 +4014,7 @@ dependencies = [ "http 1.1.0", "hyper 1.4.1", "hyper-util", - "rustls 0.23.13", + "rustls 0.23.14", "rustls-pki-types", "tokio", "tokio-rustls 0.26.0", @@ -4087,7 +4135,16 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f28220f89297a075ddc7245cd538076ee98b01f2a9c23a53a4f1105d5a322808" dependencies = [ - "rlp", + "rlp 0.5.2", +] + +[[package]] +name = "impl-rlp" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54ed8ad1f3877f7e775b8cbf30ed1bd3209a95401817f19a0eb4402d13f8cf90" +dependencies = [ + "rlp 0.6.1", ] [[package]] @@ -4099,6 +4156,15 @@ dependencies = [ "serde", ] +[[package]] +name = "impl-serde" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a143eada6a1ec4aefa5049037a26a6d597bfd64f8c026d07b77133e02b7dd0b" +dependencies = [ + "serde", +] + [[package]] name = "impl-trait-for-tuples" version = "0.2.2" @@ -4129,12 +4195,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", - "hashbrown 0.14.5", + "hashbrown 0.15.0", "serde", ] @@ -4158,9 +4224,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.10.0" +version = "2.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "187674a687eed5fe42285b40c6291f9a01517d415fad1c3cbc6a9f778af7fcd4" +checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" [[package]] name = "is-terminal" @@ -4223,9 +4289,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.70" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" +checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" dependencies = [ "wasm-bindgen", ] @@ -4296,7 +4362,7 @@ dependencies = [ "lalrpop-util", "petgraph", "regex", - "regex-syntax 0.8.4", + "regex-syntax 0.8.5", "string_cache", "term", "tiny-keccak", @@ -4310,7 +4376,7 @@ version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "507460a910eb7b32ee961886ff48539633b788a36b65692b95f225b844c82553" dependencies = [ - "regex-automata 0.4.7", + "regex-automata 0.4.8", ] [[package]] @@ -4412,11 +4478,11 @@ dependencies = [ [[package]] name = "lru" -version = "0.12.4" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37ee39891760e7d94734f6f63fedc29a2e4a152f836120753a72503f09fcf904" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" dependencies = [ - "hashbrown 0.14.5", + "hashbrown 0.15.0", ] [[package]] @@ -4849,7 +4915,7 @@ dependencies = [ "near-crypto 0.26.0", "near-jsonrpc-primitives 0.26.0", "near-primitives 0.26.0", - "reqwest 0.12.7", + "reqwest 0.12.8", "serde", "serde_json", "thiserror", @@ -4916,9 +4982,9 @@ dependencies = [ [[package]] name = "near-light-client-on-eth" version = "0.1.0" -source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs?branch=omni-token-support#a9922eca00939901d0b649a655b29b19a2dc0994" +source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs#003ea92153ac0f38548c1beec023dfa38185fc14" dependencies = [ - "ethereum-types", + "ethereum-types 0.14.1", "ethers", "thiserror", "tokio", @@ -5200,7 +5266,7 @@ dependencies = [ [[package]] name = "near-rpc-client" version = "0.1.0" -source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs?branch=omni-token-support#a9922eca00939901d0b649a655b29b19a2dc0994" +source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs#003ea92153ac0f38548c1beec023dfa38185fc14" dependencies = [ "borsh 1.5.1", "lazy_static", @@ -5222,7 +5288,7 @@ checksum = "3610517a56329b7cce0c8c4cf2686fc4bbe0b155181b118acf20d2a301bf29b6" dependencies = [ "quote", "serde", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -5233,7 +5299,7 @@ checksum = "cf41b149dcc1f5a35d6a96fbcd8c28c92625c05b52025a72ee7378c72bcd68ce" dependencies = [ "quote", "serde", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -5244,7 +5310,7 @@ checksum = "df598b0785a3e36d7e4fb73afcdf20536988b13d07cead71dfa777db4783e552" dependencies = [ "quote", "serde", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -5256,7 +5322,7 @@ dependencies = [ "fs2", "near-rpc-error-core 0.21.2", "serde", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -5267,7 +5333,7 @@ checksum = "73c7f0f12f426792dd2c9d83df43d73c3b15d80f6e99e8d0e16ff3e024d0f9ba" dependencies = [ "near-rpc-error-core 0.23.0", "serde", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -5278,7 +5344,7 @@ checksum = "647ef261df99ad877c08c97af2f10368c8b8cde0968250d3482a5a249e9f3926" dependencies = [ "near-rpc-error-core 0.26.0", "serde", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -5315,7 +5381,7 @@ dependencies = [ "serde_json", "strum 0.26.3", "strum_macros 0.26.4", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -5666,7 +5732,7 @@ dependencies = [ "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -5677,15 +5743,15 @@ checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" dependencies = [ "crc32fast", "hashbrown 0.14.5", - "indexmap 2.5.0", + "indexmap 2.6.0", "memchr", ] [[package]] name = "object" -version = "0.36.4" +version = "0.36.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a" +checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" dependencies = [ "memchr", ] @@ -5693,18 +5759,20 @@ dependencies = [ [[package]] name = "omni-connector" version = "0.1.0" -source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs?branch=omni-token-support#a9922eca00939901d0b649a655b29b19a2dc0994" +source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs#003ea92153ac0f38548c1beec023dfa38185fc14" dependencies = [ "borsh 1.5.1", "bridge-connector-common", - "derive_builder 0.20.1", + "derive_builder 0.20.2", "eth-proof", "ethers", "hex", + "near-contract-standards", "near-crypto 0.21.2", "near-jsonrpc-client 0.9.0", "near-primitives 0.21.2", "near-rpc-client", + "near-token", "omni-types", "serde_json", "tracing", @@ -5719,7 +5787,7 @@ dependencies = [ "clap", "dotenv", "eth-proof", - "ethereum-types", + "ethereum-types 0.14.1", "futures", "log", "near-crypto 0.26.0", @@ -5731,7 +5799,7 @@ dependencies = [ "omni-types", "pretty_env_logger", "redis", - "reqwest 0.12.7", + "reqwest 0.12.8", "serde", "serde_json", "tokio", @@ -5742,25 +5810,28 @@ dependencies = [ [[package]] name = "omni-types" version = "2.0.0" -source = "git+https://github.com/near-one/omni-bridge?rev=8371f5651be317b601703642903a136e8c8c4f13#8371f5651be317b601703642903a136e8c8c4f13" +source = "git+https://github.com/near-one/omni-bridge?rev=21a328f5388bfa98d1ba1eb40b541316429a4369#21a328f5388bfa98d1ba1eb40b541316429a4369" dependencies = [ "alloy-primitives", "alloy-rlp", "alloy-sol-macro", "alloy-sol-types", "borsh 1.5.1", + "ethereum-types 0.15.1", "hex", "near-contract-standards", "near-sdk", + "rlp 0.6.1", "serde", + "sha3", "strum_macros 0.26.4", ] [[package]] name = "once_cell" -version = "1.19.0" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "opaque-debug" @@ -5777,7 +5848,7 @@ dependencies = [ "arrayvec 0.7.6", "auto_impl", "bytes", - "ethereum-types", + "ethereum-types 0.14.1", "open-fastrlp-derive", ] @@ -5816,7 +5887,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -6016,7 +6087,7 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if 1.0.0", "libc", - "redox_syscall 0.5.6", + "redox_syscall 0.5.7", "smallvec", "windows-targets 0.52.6", ] @@ -6083,9 +6154,9 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" -version = "2.7.13" +version = "2.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdbef9d1d47087a895abd220ed25eb4ad973a5e26f6a4367b038c25e28dfc2d9" +checksum = "879952a81a83930934cbf1786752d6dedc3b1f29e8f8fb2ad1d0a36f377cf442" dependencies = [ "memchr", "thiserror", @@ -6099,7 +6170,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.5.0", + "indexmap 2.6.0", ] [[package]] @@ -6142,7 +6213,7 @@ dependencies = [ "phf_shared 0.11.2", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -6165,22 +6236,22 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.5" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +checksum = "baf123a161dde1e524adf36f90bc5d8d3462824a9c43553ad07a8183161189ec" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.5" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +checksum = "a4502d8515ca9f32f1fb543d987f63d95a14934883db45bdb48060b6b69257f8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -6265,7 +6336,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479cf940fbbb3426c32c5d5176f62ad57549a0bb84773423ba8be9d089f5faba" dependencies = [ "proc-macro2", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -6275,7 +6346,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05e4722c697a58a99d5d06a08c30821d7c082a4632198de1eaa5a6c22ef42373" dependencies = [ "fixed-hash 0.7.0", - "uint", + "uint 0.9.5", ] [[package]] @@ -6286,10 +6357,22 @@ checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" dependencies = [ "fixed-hash 0.8.0", "impl-codec", - "impl-rlp", - "impl-serde", + "impl-rlp 0.3.0", + "impl-serde 0.4.0", "scale-info", - "uint", + "uint 0.9.5", +] + +[[package]] +name = "primitive-types" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d15600a7d856470b7d278b3fe0e311fe28c2526348549f8ef2ff7db3299c87f5" +dependencies = [ + "fixed-hash 0.8.0", + "impl-rlp 0.4.0", + "impl-serde 0.5.0", + "uint 0.10.0", ] [[package]] @@ -6353,14 +6436,14 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "b3e4daa0dcf6feba26f985457cdf104d4b4256fc5a09547140f3631bb076b19a" dependencies = [ "unicode-ident", ] @@ -6394,7 +6477,7 @@ dependencies = [ "rand 0.8.5", "rand_chacha 0.3.1", "rand_xorshift", - "regex-syntax 0.8.4", + "regex-syntax 0.8.5", "rusty-fork", "tempfile", "unarray", @@ -6624,9 +6707,9 @@ dependencies = [ [[package]] name = "redis" -version = "0.27.2" +version = "0.27.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7e86f5670bd8b028edfb240f0616cad620705b31ec389d55e4f3da2c38dcd48" +checksum = "dc6baebe319ef5e4b470f248335620098d1c2e9261e995be05f56f719ca4bdb2" dependencies = [ "arc-swap", "async-trait", @@ -6653,9 +6736,9 @@ checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" [[package]] name = "redox_syscall" -version = "0.5.6" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "355ae415ccd3a04315d3f8246e86d67689ea74d88d915576e1589a351062a13b" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" dependencies = [ "bitflags 2.6.0", ] @@ -6695,14 +6778,14 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.6" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" +checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.7", - "regex-syntax 0.8.4", + "regex-automata 0.4.8", + "regex-syntax 0.8.5", ] [[package]] @@ -6716,13 +6799,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.7" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.4", + "regex-syntax 0.8.5", ] [[package]] @@ -6739,9 +6822,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "region" @@ -6810,9 +6893,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.7" +version = "0.12.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8f4955649ef5c38cc7f9e8aa41761d48fb9677197daea9984dc54f56aad5e63" +checksum = "f713147fbe92361e52392c73b8c9e48c04c6625bce969ef54dc901e58e042a7b" dependencies = [ "base64 0.22.1", "bytes", @@ -6835,7 +6918,7 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls-pemfile 2.1.3", + "rustls-pemfile 2.2.0", "serde", "serde_json", "serde_urlencoded", @@ -6951,6 +7034,16 @@ dependencies = [ "rustc-hex", ] +[[package]] +name = "rlp" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa24e92bb2a83198bb76d661a71df9f7076b8c420b8696e4d3d97d50d94479e3" +dependencies = [ + "bytes", + "rustc-hex", +] + [[package]] name = "rlp-derive" version = "0.1.0" @@ -6979,7 +7072,7 @@ dependencies = [ "primitive-types 0.12.2", "proptest", "rand 0.8.5", - "rlp", + "rlp 0.5.2", "ruint-macro", "serde", "valuable", @@ -7070,9 +7163,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.13" +version = "0.23.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2dabaac7466917e566adb06783a81ca48944c6898a1b08b9374106dd671f4c8" +checksum = "415d9944693cb90382053259f89fbb077ea730ad7273047ec63b19bc9b160ba8" dependencies = [ "once_cell", "ring 0.17.8", @@ -7105,19 +7198,18 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "2.1.3" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "196fe16b00e106300d3e45ecfcb764fa292a535d7326a29a5875c579c7417425" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" dependencies = [ - "base64 0.22.1", "rustls-pki-types", ] [[package]] name = "rustls-pki-types" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0a2ce646f8655401bb81e7927b812614bd5d91dbc968696be50603510fcaf0" +checksum = "0e696e35370c65c9c541198af4543ccd580cf17fc25d8e05c5a242b202488c55" [[package]] name = "rustls-webpki" @@ -7208,9 +7300,9 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.24" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9aaafd5a2b6e3d657ff009d82fbd630b6bd54dd4eb06f21693925cdf80f9b8b" +checksum = "01227be5826fa0690321a2ba6c5cd57a19cf3f6a09e76973b58e61de6ab9d1c1" dependencies = [ "windows-sys 0.59.0", ] @@ -7409,7 +7501,7 @@ checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -7432,7 +7524,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -7458,15 +7550,15 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.9.0" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cecfa94848272156ea67b2b1a53f20fc7bc638c4a46d2f8abde08f05f4b857" +checksum = "8e28bdad6db2b8340e449f7108f020b3b092e8583a9e3fb82713e1d4e71fe817" dependencies = [ "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.5.0", + "indexmap 2.6.0", "serde", "serde_derive", "serde_json", @@ -7476,14 +7568,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.9.0" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8fee4991ef4f274617a51ad4af30519438dacb2f56ac773b08a1922ff743350" +checksum = "9d846214a9854ef724f3da161b426242d8de7c1fc7de2f89bb1efcb154dca79d" dependencies = [ "darling 0.20.10", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -7492,7 +7584,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.5.0", + "indexmap 2.6.0", "itoa", "ryu", "serde", @@ -7787,7 +7879,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -7829,9 +7921,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.77" +version = "2.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" +checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" dependencies = [ "proc-macro2", "quote", @@ -7840,14 +7932,14 @@ dependencies = [ [[package]] name = "syn-solidity" -version = "0.8.5" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ab661c8148c2261222a4d641ad5477fd4bea79406a99056096a0b41b35617a5" +checksum = "ebfc1bfd06acc78f16d8fd3ef846bc222ee7002468d10a7dce8d703d6eab89a3" dependencies = [ "paste", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -7859,7 +7951,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -7939,9 +8031,9 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tempfile" -version = "3.12.0" +version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" +checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" dependencies = [ "cfg-if 1.0.0", "fastrand", @@ -7987,7 +8079,7 @@ checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -8100,7 +8192,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -8129,7 +8221,7 @@ version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" dependencies = [ - "rustls 0.23.13", + "rustls 0.23.14", "rustls-pki-types", "tokio", ] @@ -8163,17 +8255,17 @@ dependencies = [ [[package]] name = "tokio-tungstenite" -version = "0.23.1" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6989540ced10490aaf14e6bad2e3d33728a2813310a0c71d1574304c49631cd" +checksum = "edc5f74e248dc973e0dbb7b74c7e0d6fcc301c694ff50049504004ef4d0cdcd9" dependencies = [ "futures-util", "log", - "rustls 0.23.13", + "rustls 0.23.14", "rustls-pki-types", "tokio", "tokio-rustls 0.26.0", - "tungstenite 0.23.0", + "tungstenite 0.24.0", "webpki-roots 0.26.6", ] @@ -8240,7 +8332,7 @@ version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ - "indexmap 2.5.0", + "indexmap 2.6.0", "serde", "serde_spanned", "toml_datetime", @@ -8368,7 +8460,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -8473,9 +8565,9 @@ dependencies = [ [[package]] name = "tungstenite" -version = "0.23.0" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e2e2ce1e47ed2994fd43b04c8f618008d4cabdd5ee34027cf14f9d918edd9c8" +checksum = "18e5b8366ee7a95b16d32197d0b2604b43a0be89dc5fac9f8e96ccafbaedda8a" dependencies = [ "byteorder", "bytes", @@ -8484,7 +8576,7 @@ dependencies = [ "httparse", "log", "rand 0.8.5", - "rustls 0.23.13", + "rustls 0.23.14", "rustls-pki-types", "sha1", "thiserror", @@ -8499,9 +8591,9 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "ucd-trie" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" [[package]] name = "uint" @@ -8515,6 +8607,18 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "uint" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "909988d098b2f738727b161a106cfc7cab00c539c2687a8836f8e565976fb53e" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + [[package]] name = "unarray" version = "0.1.4" @@ -8523,9 +8627,9 @@ checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" [[package]] name = "unicode-bidi" -version = "0.3.15" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" +checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" [[package]] name = "unicode-ident" @@ -8689,9 +8793,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" +checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" dependencies = [ "cfg-if 1.0.0", "once_cell", @@ -8700,24 +8804,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" +checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.43" +version = "0.4.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" +checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" dependencies = [ "cfg-if 1.0.0", "js-sys", @@ -8727,9 +8831,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" +checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -8737,22 +8841,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" +checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" +checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" [[package]] name = "wasm-encoder" @@ -8978,7 +9082,7 @@ version = "0.115.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e06c0641a4add879ba71ccb3a1e4278fd546f76f1eafb21d8f7b07733b547cd5" dependencies = [ - "indexmap 2.5.0", + "indexmap 2.6.0", "semver 1.0.23", ] @@ -9003,7 +9107,7 @@ dependencies = [ "bumpalo", "cfg-if 1.0.0", "fxprof-processed-profile", - "indexmap 2.5.0", + "indexmap 2.6.0", "libc", "log", "object 0.32.2", @@ -9082,7 +9186,7 @@ dependencies = [ "anyhow", "cranelift-entity", "gimli 0.28.1", - "indexmap 2.5.0", + "indexmap 2.6.0", "log", "object 0.32.2", "serde", @@ -9148,7 +9252,7 @@ dependencies = [ "anyhow", "cc", "cfg-if 1.0.0", - "indexmap 2.5.0", + "indexmap 2.6.0", "libc", "log", "mach", @@ -9188,7 +9292,7 @@ checksum = "09b5575a75e711ca6c36bb9ad647c93541cdc8e34218031acba5da3f35919dd3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -9199,9 +9303,9 @@ checksum = "9dafab2db172a53e23940e0fa3078c202f567ee5f13f4b42f66b694fab43c658" [[package]] name = "web-sys" -version = "0.3.70" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" +checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" dependencies = [ "js-sys", "wasm-bindgen", @@ -9541,7 +9645,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -9561,7 +9665,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] diff --git a/omni-relayer/Cargo.toml b/omni-relayer/Cargo.toml index 685508b2..9824dafe 100644 --- a/omni-relayer/Cargo.toml +++ b/omni-relayer/Cargo.toml @@ -20,17 +20,17 @@ tokio = { version = "1", features = ["sync", "time", "macros", "rt-multi-thread" tokio-stream = { version = "0.1" } ethereum-types = "0.14.1" -omni-types = { git = "https://github.com/near-one/omni-bridge", package = "omni-types", rev = "8371f5651be317b601703642903a136e8c8c4f13" } +omni-types = { git = "https://github.com/near-one/omni-bridge", package = "omni-types", rev = "21a328f5388bfa98d1ba1eb40b541316429a4369" } near-lake-framework = "0.7.9" near-jsonrpc-client = "0.13.0" near-jsonrpc-primitives = "0.26.0" near-primitives = "0.26.0" near-crypto = "0.26.0" -eth-proof = { git = "https://github.com/Near-One/rainbow-bridge-sdk-rs", branch = "omni-token-support", package = "eth-proof" } -omni-connector = { git = "https://github.com/Near-One/rainbow-bridge-sdk-rs", branch = "omni-token-support", package = "omni-connector" } +eth-proof = { git = "https://github.com/Near-One/rainbow-bridge-sdk-rs", package = "eth-proof" } +omni-connector = { git = "https://github.com/Near-One/rainbow-bridge-sdk-rs", package = "omni-connector" } -alloy = { version = "0.3", features = ["node-bindings", "providers", "rpc-types", "sol-types", "provider-ws"] } +alloy = { version = "0.4.2", features = ["node-bindings", "providers", "rpc-types", "sol-types", "provider-ws"] } redis = { version = "0.27.0", features = ["aio", "tokio-comp"] } reqwest = "0.12" diff --git a/omni-relayer/config.toml b/omni-relayer/config.toml index b1e3d70e..cd2e28a1 100644 --- a/omni-relayer/config.toml +++ b/omni-relayer/config.toml @@ -6,7 +6,7 @@ network = "testnet" rpc_url = "https://rpc.testnet.near.org/" token_locker_id = "omni-locker.testnet" -[eth] +[evm] rpc_http_url = "https://eth-sepolia.g.alchemy.com/v2/API-KEY" rpc_ws_url = "wss://eth-sepolia.g.alchemy.com/v2/API-KEY" chain_id = 11_155_111 diff --git a/omni-relayer/src/config.rs b/omni-relayer/src/config.rs index 9d79cec9..fbb1aacf 100644 --- a/omni-relayer/src/config.rs +++ b/omni-relayer/src/config.rs @@ -5,7 +5,7 @@ use near_primitives::types::AccountId; pub struct Config { pub redis: Redis, pub near: Near, - pub eth: Eth, + pub evm: Evm, } #[derive(Debug, Clone, serde::Deserialize)] @@ -29,7 +29,7 @@ pub struct Near { } #[derive(Debug, Clone, serde::Deserialize)] -pub struct Eth { +pub struct Evm { pub rpc_http_url: String, pub rpc_ws_url: String, pub chain_id: u64, diff --git a/omni-relayer/src/main.rs b/omni-relayer/src/main.rs index ce928c73..9c337eda 100644 --- a/omni-relayer/src/main.rs +++ b/omni-relayer/src/main.rs @@ -52,7 +52,7 @@ async fn main() -> Result<()> { handles.push(tokio::spawn({ let redis_client = redis_client.clone(); let connector = connector.clone(); - async move { workers::eth::finalize_withdraw(redis_client, connector).await } + async move { workers::evm::finalize_withdraw(redis_client, connector).await } })); handles.push(tokio::spawn({ @@ -65,7 +65,7 @@ async fn main() -> Result<()> { let config = config.clone(); let redis_client = redis_client.clone(); let jsonrpc_client = jsonrpc_client.clone(); - async move { startup::eth::start_indexer(config, redis_client, jsonrpc_client).await } + async move { startup::evm::start_indexer(config, redis_client, jsonrpc_client).await } })); tokio::select! { diff --git a/omni-relayer/src/startup/eth.rs b/omni-relayer/src/startup/evm.rs similarity index 66% rename from omni-relayer/src/startup/eth.rs rename to omni-relayer/src/startup/evm.rs index 985406d7..091586f5 100644 --- a/omni-relayer/src/startup/eth.rs +++ b/omni-relayer/src/startup/evm.rs @@ -1,3 +1,5 @@ +use std::str::FromStr; + use anyhow::{Context, Result}; use log::{info, warn}; use tokio_stream::StreamExt; @@ -8,7 +10,7 @@ use omni_types::{ locker_args::{ClaimFeeArgs, FinTransferArgs, StorageDepositArgs}, prover_args::{EvmVerifyProofArgs, WormholeVerifyProofArgs}, prover_result::ProofKind, - ChainKind, + ChainKind, OmniAddress, H160, }; use alloy::{ @@ -21,8 +23,6 @@ use ethereum_types::H256; use crate::{config, utils}; -const WORMHOLE_CHAIN_ID: u64 = 2; - sol!( #[derive(Debug, serde::Serialize, serde::Deserialize)] event InitTransfer( @@ -32,6 +32,7 @@ sol!( string token, uint128 amount, uint128 fee, + uint128 nativeFee, string recipient ); @@ -61,14 +62,14 @@ pub async fn start_indexer( let http_provider = ProviderBuilder::new().on_http( config - .eth + .evm .rpc_http_url .parse() .context("Failed to parse ETH rpc provider as url")?, ); let ws_provider = ProviderBuilder::new() - .on_ws(WsConnect::new(config.eth.rpc_ws_url.clone())) + .on_ws(WsConnect::new(config.evm.rpc_ws_url.clone())) .await .context("Failed to initialize WS provider")?; @@ -77,20 +78,20 @@ pub async fn start_indexer( utils::redis::get_last_processed_block(&mut redis_connection, "eth_last_processed_block") .await .map_or_else( - || latest_block.saturating_sub(config.eth.block_processing_batch_size), + || latest_block.saturating_sub(config.evm.block_processing_batch_size), |block| block, ); let filter = Filter::new() - .address(config.eth.bridge_token_factory_address) - .event_signature([FinTransfer::SIGNATURE_HASH, InitTransfer::SIGNATURE_HASH].to_vec()); + .address(config.evm.bridge_token_factory_address) + .event_signature([InitTransfer::SIGNATURE_HASH, FinTransfer::SIGNATURE_HASH].to_vec()); for current_block in - (from_block..latest_block).step_by(config.eth.block_processing_batch_size as usize) + (from_block..latest_block).step_by(config.evm.block_processing_batch_size as usize) { let logs = http_provider .get_logs(&filter.clone().from_block(current_block).to_block( - (current_block + config.eth.block_processing_batch_size).min(latest_block), + (current_block + config.evm.block_processing_batch_size).min(latest_block), )) .await?; @@ -105,8 +106,8 @@ pub async fn start_indexer( continue; }; - let Some(log_index) = log.log_index else { - warn!("No log index in log: {:?}", log); + let Some(topic) = log.topic0() else { + warn!("No topic in log: {:?}", log); continue; }; @@ -116,8 +117,8 @@ pub async fn start_indexer( &jsonrpc_client, H256::from_slice(tx_hash.as_slice()), tx_logs, - log, - log_index, + log.clone(), + H256::from_slice(topic.as_slice()), ) .await; } @@ -137,8 +138,8 @@ pub async fn start_indexer( continue; }; - let Some(log_index) = log.log_index else { - warn!("No log index in log: {:?}", log); + let Some(topic) = log.topic0() else { + warn!("No topic in log: {:?}", log); continue; }; @@ -148,8 +149,8 @@ pub async fn start_indexer( &jsonrpc_client, H256::from_slice(tx_hash.as_slice()), tx_logs, - log, - log_index, + log.clone(), + H256::from_slice(topic.as_slice()), ) .await; } @@ -164,7 +165,7 @@ async fn process_log( tx_hash: H256, tx_logs: Option, log: Log, - log_index: u64, + topic: H256, ) { if let Some(block_height) = log.block_number { utils::redis::update_last_processed_block( @@ -178,15 +179,37 @@ async fn process_log( let vaa = if let Some(tx_logs) = tx_logs { let mut vaa = None; - for log in tx_logs.inner.logs() { - if let Ok(log) = log.log_decode::() { - vaa = utils::wormhole::get_vaa( - WORMHOLE_CHAIN_ID, - config.eth.bridge_token_factory_address, - log.inner.sequence, - ) - .await - .ok(); + let recipient = if let Ok(init_log) = log.log_decode::() { + init_log.inner.recipient.parse::().ok() + } else if let Ok(fin_log) = log.log_decode::() { + fin_log + .inner + .recipient + .to_string() + .parse::() + .ok() + } else { + None + }; + + if let Some(address) = recipient { + let chain_id = match address { + OmniAddress::Eth(_) => 2, + OmniAddress::Near(_) => 15, + OmniAddress::Sol(_) => 1, + OmniAddress::Arb(_) | OmniAddress::Base(_) => todo!(), + }; + + for log in tx_logs.inner.logs() { + if let Ok(log) = log.log_decode::() { + vaa = utils::wormhole::get_vaa( + chain_id, + config.evm.bridge_token_factory_address, + log.inner.sequence, + ) + .await + .ok(); + } } } @@ -195,58 +218,55 @@ async fn process_log( None }; - let prover_args = - if let Some(vaa) = vaa { - let wormhole_proof_args = WormholeVerifyProofArgs { - proof_kind: ProofKind::InitTransfer, - vaa, - }; + let prover_args = if let Some(vaa) = vaa { + let wormhole_proof_args = WormholeVerifyProofArgs { + proof_kind: ProofKind::InitTransfer, + vaa, + }; - let mut prover_args = Vec::new(); - if let Err(err) = wormhole_proof_args.serialize(&mut prover_args) { - warn!("Failed to serialize wormhole proof: {}", err); - } + let mut prover_args = Vec::new(); + if let Err(err) = wormhole_proof_args.serialize(&mut prover_args) { + warn!("Failed to serialize wormhole proof: {}", err); + } - prover_args - } else { - let evm_proof_args = - match eth_proof::get_proof_for_event(tx_hash, log_index, &config.eth.rpc_http_url) - .await - { - Ok(proof) => proof, - Err(err) => { - warn!("Failed to get proof: {}", err); - return; - } - }; - - let evm_proof_args = EvmVerifyProofArgs { - proof_kind: ProofKind::InitTransfer, - proof: evm_proof_args, + prover_args + } else { + let evm_proof_args = + match eth_proof::get_proof_for_event(tx_hash, topic, &config.evm.rpc_http_url).await { + Ok(proof) => proof, + Err(err) => { + warn!("Failed to get proof: {}", err); + return; + } }; - let mut prover_args = Vec::new(); - if let Err(err) = evm_proof_args.serialize(&mut prover_args) { - warn!("Failed to serialize evm proof: {}", err); - return; - } - - prover_args + let evm_proof_args = EvmVerifyProofArgs { + proof_kind: ProofKind::InitTransfer, + proof: evm_proof_args, }; - if let Ok(withdraw_log) = log.log_decode::() { - let Ok(token) = withdraw_log.inner.token.parse::() else { + let mut prover_args = Vec::new(); + if let Err(err) = evm_proof_args.serialize(&mut prover_args) { + warn!("Failed to serialize evm proof: {}", err); + return; + } + + prover_args + }; + + if let Ok(init_log) = log.log_decode::() { + let Ok(token) = init_log.inner.token.parse::() else { warn!( "Failed to parse token as AccountId: {:?}", - withdraw_log.inner.token + init_log.inner.token ); return; }; - let Ok(recipient) = withdraw_log.inner.recipient.parse::() else { + let Ok(recipient) = init_log.inner.recipient.parse::() else { warn!( "Failed to parse recipient as AccountId: {:?}", - withdraw_log.inner.recipient + init_log.inner.recipient ); return; }; @@ -265,6 +285,8 @@ async fn process_log( let fin_transfer_args = FinTransferArgs { chain_kind: ChainKind::Eth, + // TODO: Add native fee recipient + native_fee_recipient: OmniAddress::Eth(H160::from_str("").unwrap()), storage_deposit_args: StorageDepositArgs { token, accounts: vec![ @@ -292,6 +314,8 @@ async fn process_log( let claim_fee_args = ClaimFeeArgs { chain_kind: ChainKind::Eth, prover_args, + // TODO: Add native fee recipient + native_fee_recipient: OmniAddress::Eth(H160::from_str("").unwrap()), }; let mut serialized_claim_fee_args = Vec::new(); diff --git a/omni-relayer/src/startup/mod.rs b/omni-relayer/src/startup/mod.rs index ce2a9878..034afa4b 100644 --- a/omni-relayer/src/startup/mod.rs +++ b/omni-relayer/src/startup/mod.rs @@ -6,7 +6,7 @@ use omni_connector::{OmniConnector, OmniConnectorBuilder}; use crate::config; -pub mod eth; +pub mod evm; pub mod near; pub fn build_connector( @@ -16,11 +16,11 @@ pub fn build_connector( info!("Building Omni connector"); OmniConnectorBuilder::default() - .eth_endpoint(Some(config.eth.rpc_http_url.clone())) - .eth_chain_id(Some(config.eth.chain_id)) + .eth_endpoint(Some(config.evm.rpc_http_url.clone())) + .eth_chain_id(Some(config.evm.chain_id)) .near_endpoint(Some(config.near.rpc_url.clone())) .token_locker_id(Some(config.near.token_locker_id.to_string())) - .bridge_token_factory_address(Some(config.eth.bridge_token_factory_address.to_string())) + .bridge_token_factory_address(Some(config.evm.bridge_token_factory_address.to_string())) .eth_private_key(Some( std::env::var("ETH_PRIVATE_KEY") .context("Failed to get `ETH_PRIVATE_KEY` env variable")?, diff --git a/omni-relayer/src/utils/fee.rs b/omni-relayer/src/utils/fee.rs index 791d265f..14af4c94 100644 --- a/omni-relayer/src/utils/fee.rs +++ b/omni-relayer/src/utils/fee.rs @@ -66,12 +66,14 @@ pub async fn is_fee_sufficient(jsonrpc_client: &JsonRpcClient, sender: &OmniAddr let sender_fee = match sender { OmniAddress::Near(_) => 0.03 * get_price_by_symbol("near").await?, OmniAddress::Eth(_) => 0.00005 * get_price_by_symbol("ethereum").await?, - OmniAddress::Sol(_) => 0.001 * get_price_by_symbol("solana").await? + OmniAddress::Sol(_) => 0.001 * get_price_by_symbol("solana").await?, + OmniAddress::Arb(_) | OmniAddress::Base(_) => todo!() }; let recipient_fee = match recipient { OmniAddress::Near(_) => 0.03 * get_price_by_symbol("near").await?, OmniAddress::Eth(_) => 0.00005 * get_price_by_symbol("ethereum").await?, - OmniAddress::Sol(_) => 0.001 * get_price_by_symbol("solana").await? + OmniAddress::Sol(_) => 0.001 * get_price_by_symbol("solana").await?, + OmniAddress::Arb(_) | OmniAddress::Base(_) => todo!() }; Ok(sender_fee + recipient_fee <= given_fee) diff --git a/omni-relayer/src/utils/near.rs b/omni-relayer/src/utils/near.rs index 3b617894..443b4c8c 100644 --- a/omni-relayer/src/utils/near.rs +++ b/omni-relayer/src/utils/near.rs @@ -46,39 +46,35 @@ pub async fn handle_streamer_message( Nep141LockerEvent::InitTransferEvent { ref transfer_message, } - // TODO: Later it's better to add a separate key in db for storing events with any - // troubles there. For now we just update whole event with a new fee for the same nonce | Nep141LockerEvent::UpdateFeeEvent { ref transfer_message, } => { - // TODO: If fee is insufficient, it should be handled later. For example, - // add to redis and try again in 1 hour match utils::fee::is_fee_sufficient( jsonrpc_client, &transfer_message.sender, &transfer_message.recipient, &transfer_message.token, - transfer_message.fee.into(), + transfer_message.fee.fee.into(), ) .await { Ok(res) => { - if !res { - warn!("Fee is insufficient"); + if res { + utils::redis::add_event( + redis_connection, + utils::redis::NEAR_INIT_TRANSFER_EVENTS, + transfer_message.origin_nonce.0.to_string(), + log, + ) + .await; + } else { + warn!("Fee is not sufficient for transfer: {:?}", transfer_message); } } Err(err) => { warn!("Failed to check fee: {}", err); } } - - utils::redis::add_event( - redis_connection, - utils::redis::NEAR_INIT_TRANSFER_EVENTS, - transfer_message.origin_nonce.0.to_string(), - log, - ) - .await; } Nep141LockerEvent::SignTransferEvent { ref message_payload, @@ -93,7 +89,9 @@ pub async fn handle_streamer_message( .await; } Nep141LockerEvent::FinTransferEvent { .. } - | Nep141LockerEvent::LogMetadataEvent { .. } => {} + | Nep141LockerEvent::LogMetadataEvent { .. } + | Nep141LockerEvent::SignClaimNativeFeeEvent { .. } + | Nep141LockerEvent::ClaimFeeEvent { .. } => {} } } } diff --git a/omni-relayer/src/utils/redis.rs b/omni-relayer/src/utils/redis.rs index 728e3179..a70e1e26 100644 --- a/omni-relayer/src/utils/redis.rs +++ b/omni-relayer/src/utils/redis.rs @@ -4,9 +4,12 @@ use redis::{aio::MultiplexedConnection, AsyncCommands}; pub const NEAR_LAST_PROCESSED_BLOCK: &str = "near_last_processed_block"; pub const NEAR_INIT_TRANSFER_EVENTS: &str = "near_init_transfer_events"; pub const NEAR_SIGN_TRANSFER_EVENTS: &str = "near_sign_transfer_events"; + pub const ETH_LAST_PROCESSED_BLOCK: &str = "eth_last_processed_block"; pub const ETH_WITHDRAW_EVENTS: &str = "eth_withdraw_events"; + pub const FINALIZED_TRANSFERS: &str = "finalized_transfers"; + pub const SLEEP_TIME_AFTER_EVENTS_PROCESS_SECS: u64 = 10; const RETRY_ATTEMPTS: u64 = 10; diff --git a/omni-relayer/src/workers/eth.rs b/omni-relayer/src/workers/evm.rs similarity index 100% rename from omni-relayer/src/workers/eth.rs rename to omni-relayer/src/workers/evm.rs diff --git a/omni-relayer/src/workers/mod.rs b/omni-relayer/src/workers/mod.rs index 745cd160..b2aa3b5d 100644 --- a/omni-relayer/src/workers/mod.rs +++ b/omni-relayer/src/workers/mod.rs @@ -1,2 +1,2 @@ -pub mod eth; +pub mod evm; pub mod near; diff --git a/omni-relayer/src/workers/near.rs b/omni-relayer/src/workers/near.rs index 868517e7..ada516c5 100644 --- a/omni-relayer/src/workers/near.rs +++ b/omni-relayer/src/workers/near.rs @@ -56,7 +56,7 @@ pub async fn sign_transfer( .sign_transfer( transfer_message.origin_nonce.into(), Some(config.near.token_locker_id), - transfer_message.fee.into(), + Some(transfer_message.fee), ) .await { From 91c51c1c98167fd4322dbfb03910a3b1ebb6850e Mon Sep 17 00:00:00 2001 From: Ivan Frolov <59515280+frolvanya@users.noreply.github.com> Date: Thu, 17 Oct 2024 10:26:00 +0100 Subject: [PATCH 02/21] feat: claim native fee (#70) * feat: added `fin_transfer` event to redis db * feat: signing claiming native fee * fix: sign_claim_native_fee call * feat: added `claim_native_fee` call * feat: handled `ClaimFeeEvent` * fix: issues after merging * chore: renamed `relayer` -> `relayer_address_on_evm` * chore: use relayer from config * fix: typo in redis key * fix: expected different event * chore: recipient should be our relayer * fix: bunch of naming mistakes * chore: renamed `fin_transfer_events` redis key * feat: handled `FinTransferEvent` with some nonce * chore: improved readability * refactor: changed logging style * feat: derive eth address from private key (#76) * feat: derived eth pk from sk * refactor: removed optional typing * refactor: shortened code * feat: used existing crate to derive pk * refactor: moved `relayer_address` under `evm` struct * chore: some renamings --- omni-relayer/Cargo.lock | 125 +++++++++++++++++++++---------- omni-relayer/Cargo.toml | 4 +- omni-relayer/src/config.rs | 25 ++++++- omni-relayer/src/main.rs | 12 +++ omni-relayer/src/startup/evm.rs | 10 +-- omni-relayer/src/utils/near.rs | 80 ++++++++++++++++++-- omni-relayer/src/utils/redis.rs | 4 +- omni-relayer/src/workers/evm.rs | 74 ++++++++++++++++-- omni-relayer/src/workers/near.rs | 92 +++++++++++++++++++++-- 9 files changed, 362 insertions(+), 64 deletions(-) diff --git a/omni-relayer/Cargo.lock b/omni-relayer/Cargo.lock index 1691c3f8..f640896d 100644 --- a/omni-relayer/Cargo.lock +++ b/omni-relayer/Cargo.lock @@ -159,6 +159,8 @@ dependencies = [ "alloy-rpc-client", "alloy-rpc-types", "alloy-serde", + "alloy-signer", + "alloy-signer-local", "alloy-transport", "alloy-transport-http", "alloy-transport-ws", @@ -699,7 +701,7 @@ dependencies = [ "alloy-transport", "futures", "http 1.1.0", - "rustls 0.23.14", + "rustls 0.23.15", "serde_json", "tokio", "tokio-tungstenite 0.24.0", @@ -1081,7 +1083,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "tracing", - "uuid 1.10.0", + "uuid 1.11.0", ] [[package]] @@ -1315,7 +1317,7 @@ dependencies = [ "http-body 0.4.6", "http-body 1.0.1", "httparse", - "hyper 0.14.30", + "hyper 0.14.31", "hyper-rustls 0.24.2", "once_cell", "pin-project-lite", @@ -1488,6 +1490,22 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" +[[package]] +name = "bitcoin-io" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "340e09e8399c7bd8912f495af6aa58bea0c9214773417ffaa8f6460f93aaee56" + +[[package]] +name = "bitcoin_hashes" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb18c03d0db0247e147a21a6faafd5a7eb851c743db062de72018b6b7e8e4d16" +dependencies = [ + "bitcoin-io", + "hex-conservative", +] + [[package]] name = "bitflags" version = "1.3.2" @@ -2416,7 +2434,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef552e6f588e446098f6ba40d89ac146c8c7b64aade83c051ee00bb5d2bc18d" dependencies = [ - "uuid 1.10.0", + "uuid 1.11.0", ] [[package]] @@ -3846,6 +3864,15 @@ dependencies = [ "serde", ] +[[package]] +name = "hex-conservative" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5313b072ce3c597065a808dbf612c4c8e8590bdbf8b579508bf7a762c5eae6cd" +dependencies = [ + "arrayvec 0.7.6", +] + [[package]] name = "hex-literal" version = "0.4.1" @@ -3946,9 +3973,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.30" +version = "0.14.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" +checksum = "8c08302e8fa335b151b788c775ff56e7a03ae64ff85c548ee820fecb70356e85" dependencies = [ "bytes", "futures-channel", @@ -3970,9 +3997,9 @@ dependencies = [ [[package]] name = "hyper" -version = "1.4.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" +checksum = "bbbff0a806a4728c99295b254c8838933b5b082d75e3cb70c8dab21fdfbcfa9a" dependencies = [ "bytes", "futures-channel", @@ -3996,7 +4023,7 @@ checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ "futures-util", "http 0.2.12", - "hyper 0.14.30", + "hyper 0.14.31", "log", "rustls 0.21.12", "rustls-native-certs", @@ -4012,9 +4039,9 @@ checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" dependencies = [ "futures-util", "http 1.1.0", - "hyper 1.4.1", + "hyper 1.5.0", "hyper-util", - "rustls 0.23.14", + "rustls 0.23.15", "rustls-pki-types", "tokio", "tokio-rustls 0.26.0", @@ -4027,7 +4054,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" dependencies = [ - "hyper 0.14.30", + "hyper 0.14.31", "pin-project-lite", "tokio", "tokio-io-timeout", @@ -4040,7 +4067,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" dependencies = [ "bytes", - "hyper 0.14.30", + "hyper 0.14.31", "native-tls", "tokio", "tokio-native-tls", @@ -4054,7 +4081,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper 1.4.1", + "hyper 1.5.0", "hyper-util", "native-tls", "tokio", @@ -4073,7 +4100,7 @@ dependencies = [ "futures-util", "http 1.1.0", "http-body 1.0.1", - "hyper 1.4.1", + "hyper 1.5.0", "pin-project-lite", "socket2", "tokio", @@ -4777,7 +4804,7 @@ dependencies = [ "once_cell", "primitive-types 0.10.1", "rand 0.7.3", - "secp256k1", + "secp256k1 0.27.0", "serde", "serde_json", "subtle", @@ -4802,7 +4829,7 @@ dependencies = [ "near-stdx 0.23.0", "once_cell", "primitive-types 0.10.1", - "secp256k1", + "secp256k1 0.27.0", "serde", "serde_json", "subtle", @@ -4828,7 +4855,7 @@ dependencies = [ "once_cell", "primitive-types 0.10.1", "rand 0.8.5", - "secp256k1", + "secp256k1 0.27.0", "serde", "serde_json", "subtle", @@ -5789,6 +5816,7 @@ dependencies = [ "eth-proof", "ethereum-types 0.14.1", "futures", + "hex", "log", "near-crypto 0.26.0", "near-jsonrpc-client 0.13.0", @@ -5800,6 +5828,7 @@ dependencies = [ "pretty_env_logger", "redis", "reqwest 0.12.8", + "secp256k1 0.30.0", "serde", "serde_json", "tokio", @@ -5866,9 +5895,9 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.66" +version = "0.10.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" +checksum = "7b8cefcf97f41316955f9294cd61f639bdcfa9f2f230faac6cb896aa8ab64704" dependencies = [ "bitflags 2.6.0", "cfg-if 1.0.0", @@ -5898,9 +5927,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.103" +version = "0.9.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" +checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" dependencies = [ "cc", "libc", @@ -6861,7 +6890,7 @@ dependencies = [ "h2 0.3.26", "http 0.2.12", "http-body 0.4.6", - "hyper 0.14.30", + "hyper 0.14.31", "hyper-rustls 0.24.2", "hyper-tls 0.5.0", "ipnet", @@ -6906,7 +6935,7 @@ dependencies = [ "http 1.1.0", "http-body 1.0.1", "http-body-util", - "hyper 1.4.1", + "hyper 1.5.0", "hyper-rustls 0.27.3", "hyper-tls 0.6.0", "hyper-util", @@ -7009,7 +7038,7 @@ dependencies = [ "rkyv_derive", "seahash", "tinyvec", - "uuid 1.10.0", + "uuid 1.11.0", ] [[package]] @@ -7163,9 +7192,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.14" +version = "0.23.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "415d9944693cb90382053259f89fbb077ea730ad7273047ec63b19bc9b160ba8" +checksum = "5fbb44d7acc4e873d613422379f69f237a1b141928c02f6bc6ccfddddc2d7993" dependencies = [ "once_cell", "ring 0.17.8", @@ -7207,9 +7236,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e696e35370c65c9c541198af4543ccd580cf17fc25d8e05c5a242b202488c55" +checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" [[package]] name = "rustls-webpki" @@ -7234,9 +7263,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" +checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" [[package]] name = "rusty-fork" @@ -7376,7 +7405,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25996b82292a7a57ed3508f052cfff8640d38d32018784acd714758b43da9c8f" dependencies = [ "rand 0.8.5", - "secp256k1-sys", + "secp256k1-sys 0.8.1", +] + +[[package]] +name = "secp256k1" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b50c5943d326858130af85e049f2661ba3c78b26589b8ab98e65e80ae44a1252" +dependencies = [ + "bitcoin_hashes", + "rand 0.8.5", + "secp256k1-sys 0.10.1", ] [[package]] @@ -7388,6 +7428,15 @@ dependencies = [ "cc", ] +[[package]] +name = "secp256k1-sys" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4387882333d3aa8cb20530a17c69a3752e97837832f34f6dccc760e715001d9" +dependencies = [ + "cc", +] + [[package]] name = "security-framework" version = "2.11.1" @@ -8221,7 +8270,7 @@ version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" dependencies = [ - "rustls 0.23.14", + "rustls 0.23.15", "rustls-pki-types", "tokio", ] @@ -8261,7 +8310,7 @@ checksum = "edc5f74e248dc973e0dbb7b74c7e0d6fcc301c694ff50049504004ef4d0cdcd9" dependencies = [ "futures-util", "log", - "rustls 0.23.14", + "rustls 0.23.15", "rustls-pki-types", "tokio", "tokio-rustls 0.26.0", @@ -8354,7 +8403,7 @@ dependencies = [ "h2 0.3.26", "http 0.2.12", "http-body 0.4.6", - "hyper 0.14.30", + "hyper 0.14.31", "hyper-timeout", "percent-encoding", "pin-project", @@ -8576,7 +8625,7 @@ dependencies = [ "httparse", "log", "rand 0.8.5", - "rustls 0.23.14", + "rustls 0.23.15", "rustls-pki-types", "sha1", "thiserror", @@ -8717,9 +8766,9 @@ dependencies = [ [[package]] name = "uuid" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314" +checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" [[package]] name = "valuable" diff --git a/omni-relayer/Cargo.toml b/omni-relayer/Cargo.toml index 9824dafe..0d7e63eb 100644 --- a/omni-relayer/Cargo.toml +++ b/omni-relayer/Cargo.toml @@ -30,7 +30,9 @@ near-crypto = "0.26.0" eth-proof = { git = "https://github.com/Near-One/rainbow-bridge-sdk-rs", package = "eth-proof" } omni-connector = { git = "https://github.com/Near-One/rainbow-bridge-sdk-rs", package = "omni-connector" } -alloy = { version = "0.4.2", features = ["node-bindings", "providers", "rpc-types", "sol-types", "provider-ws"] } +hex = "0.4.3" +secp256k1 = "0.30.0" +alloy = { version = "0.4.2", features = ["node-bindings", "providers", "rpc-types", "sol-types", "provider-ws", "signers", "signer-local"] } redis = { version = "0.27.0", features = ["aio", "tokio-comp"] } reqwest = "0.12" diff --git a/omni-relayer/src/config.rs b/omni-relayer/src/config.rs index fbb1aacf..1cce3b41 100644 --- a/omni-relayer/src/config.rs +++ b/omni-relayer/src/config.rs @@ -1,5 +1,25 @@ use alloy::primitives::Address; -use near_primitives::types::AccountId; +use alloy::signers::k256::ecdsa::SigningKey; +use alloy::signers::local::LocalSigner; +use near_primitives::{borsh::BorshDeserialize, types::AccountId}; +use omni_types::{OmniAddress, H160}; + +fn derive_evm_address_from_private_key() -> OmniAddress { + let decoded_private_key = hex::decode( + std::env::var("ETH_PRIVATE_KEY").expect("Failed to get `ETH_PRIVATE_KEY` env variable"), + ) + .expect("Failed to decode `ETH_PRIVATE_KEY`"); + + let secret_key = SigningKey::from_slice(&decoded_private_key) + .expect("Failed to create a `SecretKey` from the provided private key"); + + let signer = LocalSigner::from_signing_key(secret_key); + + OmniAddress::Eth( + H160::try_from_slice(signer.address().as_slice()) + .expect("Failed to create `OmniAddress` from the derived public key"), + ) +} #[derive(Debug, Clone, serde::Deserialize)] pub struct Config { @@ -35,4 +55,7 @@ pub struct Evm { pub chain_id: u64, pub bridge_token_factory_address: Address, pub block_processing_batch_size: u64, + + #[serde(default = "derive_evm_address_from_private_key")] + pub relayer_address_on_eth: OmniAddress, } diff --git a/omni-relayer/src/main.rs b/omni-relayer/src/main.rs index 9c337eda..f90745ac 100644 --- a/omni-relayer/src/main.rs +++ b/omni-relayer/src/main.rs @@ -49,11 +49,23 @@ async fn main() -> Result<()> { let connector = connector.clone(); async move { workers::near::claim_fee(redis_client, connector).await } })); + handles.push(tokio::spawn({ + let config = config.clone(); + let redis_client = redis_client.clone(); + let connector = connector.clone(); + async move { workers::near::sign_claim_native_fee(config, redis_client, connector).await } + })); + handles.push(tokio::spawn({ let redis_client = redis_client.clone(); let connector = connector.clone(); async move { workers::evm::finalize_withdraw(redis_client, connector).await } })); + handles.push(tokio::spawn({ + let redis_client = redis_client.clone(); + let connector = connector.clone(); + async move { workers::evm::claim_native_fee(redis_client, connector).await } + })); handles.push(tokio::spawn({ let config = config.clone(); diff --git a/omni-relayer/src/startup/evm.rs b/omni-relayer/src/startup/evm.rs index 091586f5..6fe04633 100644 --- a/omni-relayer/src/startup/evm.rs +++ b/omni-relayer/src/startup/evm.rs @@ -1,5 +1,3 @@ -use std::str::FromStr; - use anyhow::{Context, Result}; use log::{info, warn}; use tokio_stream::StreamExt; @@ -10,7 +8,7 @@ use omni_types::{ locker_args::{ClaimFeeArgs, FinTransferArgs, StorageDepositArgs}, prover_args::{EvmVerifyProofArgs, WormholeVerifyProofArgs}, prover_result::ProofKind, - ChainKind, OmniAddress, H160, + ChainKind, OmniAddress, }; use alloy::{ @@ -285,8 +283,7 @@ async fn process_log( let fin_transfer_args = FinTransferArgs { chain_kind: ChainKind::Eth, - // TODO: Add native fee recipient - native_fee_recipient: OmniAddress::Eth(H160::from_str("").unwrap()), + native_fee_recipient: config.evm.relayer_address_on_eth.clone(), storage_deposit_args: StorageDepositArgs { token, accounts: vec![ @@ -314,8 +311,7 @@ async fn process_log( let claim_fee_args = ClaimFeeArgs { chain_kind: ChainKind::Eth, prover_args, - // TODO: Add native fee recipient - native_fee_recipient: OmniAddress::Eth(H160::from_str("").unwrap()), + native_fee_recipient: config.evm.relayer_address_on_eth.clone(), }; let mut serialized_claim_fee_args = Vec::new(); diff --git a/omni-relayer/src/utils/near.rs b/omni-relayer/src/utils/near.rs index 443b4c8c..be72fba7 100644 --- a/omni-relayer/src/utils/near.rs +++ b/omni-relayer/src/utils/near.rs @@ -62,7 +62,7 @@ pub async fn handle_streamer_message( if res { utils::redis::add_event( redis_connection, - utils::redis::NEAR_INIT_TRANSFER_EVENTS, + utils::redis::NEAR_INIT_TRANSFER_QUEUE, transfer_message.origin_nonce.0.to_string(), log, ) @@ -88,10 +88,80 @@ pub async fn handle_streamer_message( ) .await; } - Nep141LockerEvent::FinTransferEvent { .. } - | Nep141LockerEvent::LogMetadataEvent { .. } - | Nep141LockerEvent::SignClaimNativeFeeEvent { .. } - | Nep141LockerEvent::ClaimFeeEvent { .. } => {} + Nep141LockerEvent::FinTransferEvent { + ref nonce, + ref transfer_message, + } => { + if nonce.is_some() { + match utils::fee::is_fee_sufficient( + jsonrpc_client, + &transfer_message.sender, + &transfer_message.recipient, + &transfer_message.token, + transfer_message.fee.fee.into(), + ) + .await + { + Ok(res) => { + if res { + utils::redis::add_event( + redis_connection, + utils::redis::NEAR_INIT_TRANSFER_QUEUE, + transfer_message.origin_nonce.0.to_string(), + log, + ) + .await; + } else { + warn!("Fee is not sufficient for transfer: {:?}", transfer_message); + } + } + Err(err) => { + warn!("Failed to check fee: {}", err); + } + } + } else { + utils::redis::add_event( + redis_connection, + utils::redis::NEAR_SIGN_CLAIM_NATIVE_FEE_QUEUE, + transfer_message.origin_nonce.0.to_string(), + log, + ) + .await; + } + } + Nep141LockerEvent::ClaimFeeEvent { + ref transfer_message, + ref native_fee_recipient, + } => { + if native_fee_recipient == &config.evm.relayer_address_on_eth { + utils::redis::add_event( + redis_connection, + utils::redis::NEAR_SIGN_CLAIM_NATIVE_FEE_QUEUE, + transfer_message.origin_nonce.0.to_string(), + log, + ) + .await; + } + } + Nep141LockerEvent::SignClaimNativeFeeEvent { + ref claim_payload, .. + } => { + if claim_payload.recipient == config.evm.relayer_address_on_eth { + utils::redis::add_event( + redis_connection, + utils::redis::NEAR_SIGN_CLAIM_NATIVE_FEE_EVENTS, + claim_payload + .nonces + .iter() + .map(|nonce| nonce.0.to_string()) + .collect::>() + .join(","), + log, + ) + .await; + } + } + Nep141LockerEvent::LogMetadataEvent { .. } => {} } } } diff --git a/omni-relayer/src/utils/redis.rs b/omni-relayer/src/utils/redis.rs index a70e1e26..93f6fb99 100644 --- a/omni-relayer/src/utils/redis.rs +++ b/omni-relayer/src/utils/redis.rs @@ -2,8 +2,10 @@ use log::warn; use redis::{aio::MultiplexedConnection, AsyncCommands}; pub const NEAR_LAST_PROCESSED_BLOCK: &str = "near_last_processed_block"; -pub const NEAR_INIT_TRANSFER_EVENTS: &str = "near_init_transfer_events"; +pub const NEAR_INIT_TRANSFER_QUEUE: &str = "near_init_transfer_queue"; pub const NEAR_SIGN_TRANSFER_EVENTS: &str = "near_sign_transfer_events"; +pub const NEAR_SIGN_CLAIM_NATIVE_FEE_QUEUE: &str = "near_sign_claim_native_fee_queue"; +pub const NEAR_SIGN_CLAIM_NATIVE_FEE_EVENTS: &str = "near_sign_claim_native_fee_events"; pub const ETH_LAST_PROCESSED_BLOCK: &str = "eth_last_processed_block"; pub const ETH_WITHDRAW_EVENTS: &str = "eth_withdraw_events"; diff --git a/omni-relayer/src/workers/evm.rs b/omni-relayer/src/workers/evm.rs index 89549bbc..7003fe7b 100644 --- a/omni-relayer/src/workers/evm.rs +++ b/omni-relayer/src/workers/evm.rs @@ -2,11 +2,11 @@ use std::sync::Arc; use anyhow::Result; use futures::future::join_all; -use log::warn; +use log::{error, info, warn}; use near_primitives::borsh; use omni_connector::OmniConnector; -use omni_types::locker_args::FinTransferArgs; +use omni_types::{locker_args::FinTransferArgs, near_events::Nep141LockerEvent}; use crate::utils; @@ -39,8 +39,6 @@ pub async fn finalize_withdraw( let connector = connector.clone(); async move { - log::info!("Received FinTransfer log"); - let Ok(fin_transfer_args) = borsh::from_slice::(&withdraw_log) else { @@ -48,9 +46,11 @@ pub async fn finalize_withdraw( return; }; + info!("Received FinTransfer log"); + match connector.near_fin_transfer(fin_transfer_args).await { Ok(tx_hash) => { - log::info!("Finalized withdraw: {:?}", tx_hash); + info!("Finalized withdraw: {:?}", tx_hash); utils::redis::remove_event( &mut redis_connection, utils::redis::ETH_WITHDRAW_EVENTS, @@ -58,7 +58,69 @@ pub async fn finalize_withdraw( ) .await; } - Err(err) => log::error!("Failed to finalize withdraw: {}", err), + Err(err) => error!("Failed to finalize withdraw: {}", err), + } + } + })); + } + } + + join_all(handlers).await; + + tokio::time::sleep(tokio::time::Duration::from_secs( + utils::redis::SLEEP_TIME_AFTER_EVENTS_PROCESS_SECS, + )) + .await; + } +} + +pub async fn claim_native_fee( + redis_client: redis::Client, + connector: Arc, +) -> Result<()> { + let redis_connection = redis_client.get_multiplexed_tokio_connection().await?; + + loop { + let mut redis_connection_clone = redis_connection.clone(); + let Some(events) = utils::redis::get_events( + &mut redis_connection_clone, + utils::redis::NEAR_SIGN_CLAIM_NATIVE_FEE_EVENTS.to_string(), + ) + .await + else { + tokio::time::sleep(tokio::time::Duration::from_secs( + utils::redis::SLEEP_TIME_AFTER_EVENTS_PROCESS_SECS, + )) + .await; + continue; + }; + + let mut handlers = Vec::new(); + for (key, event) in events { + if let Ok(event) = serde_json::from_str::(&event) { + handlers.push(tokio::spawn({ + let mut redis_connection = redis_connection.clone(); + let connector = connector.clone(); + + async move { + let Nep141LockerEvent::SignClaimNativeFeeEvent { .. } = event else { + warn!("Expected SignClaimNativeFeeEvent, got: {:?}", event); + return; + }; + + info!("Received SignClaimNativeFeeEvent log"); + + match connector.evm_claim_native_fee_with_log(event).await { + Ok(tx_hash) => { + info!("Claimed native fee: {:?}", tx_hash); + utils::redis::remove_event( + &mut redis_connection, + utils::redis::NEAR_SIGN_CLAIM_NATIVE_FEE_EVENTS, + key, + ) + .await; + } + Err(err) => error!("Failed to claim native fee: {}", err), } } })); diff --git a/omni-relayer/src/workers/near.rs b/omni-relayer/src/workers/near.rs index ada516c5..fcb426c2 100644 --- a/omni-relayer/src/workers/near.rs +++ b/omni-relayer/src/workers/near.rs @@ -21,7 +21,7 @@ pub async fn sign_transfer( let mut redis_connection_clone = redis_connection.clone(); let Some(events) = utils::redis::get_events( &mut redis_connection_clone, - utils::redis::NEAR_INIT_TRANSFER_EVENTS.to_string(), + utils::redis::NEAR_INIT_TRANSFER_QUEUE.to_string(), ) .await else { @@ -41,14 +41,20 @@ pub async fn sign_transfer( let connector = connector.clone(); async move { - let Nep141LockerEvent::InitTransferEvent { transfer_message } = event + let (Nep141LockerEvent::InitTransferEvent { transfer_message } + | Nep141LockerEvent::FinTransferEvent { + transfer_message, .. + }) = event else { - warn!("Expected InitTransferEvent, got: {:?}", event); + warn!( + "Expected InitTransferEvent/FinTransferEvent, got: {:?}", + event + ); return; }; info!( - "Received InitTransferEvent: {}", + "Received InitTransferEvent/FinTransferEvent: {}", transfer_message.origin_nonce.0 ); @@ -64,7 +70,7 @@ pub async fn sign_transfer( info!("Signed transfer: {:?}", outcome.transaction.hash); utils::redis::remove_event( &mut redis_connection, - utils::redis::NEAR_INIT_TRANSFER_EVENTS, + utils::redis::NEAR_INIT_TRANSFER_QUEUE, &key, ) .await; @@ -121,6 +127,8 @@ pub async fn finalize_transfer( return; }; + info!("Received SignTransferEvent"); + match connector.evm_fin_transfer_with_log(event).await { Ok(tx_hash) => { info!("Finalized deposit: {}", tx_hash); @@ -206,3 +214,77 @@ pub async fn claim_fee(redis_client: redis::Client, connector: Arc, +) -> Result<()> { + let redis_connection = redis_client.get_multiplexed_tokio_connection().await?; + + loop { + let mut redis_connection_clone = redis_connection.clone(); + let Some(events) = utils::redis::get_events( + &mut redis_connection_clone, + utils::redis::NEAR_SIGN_CLAIM_NATIVE_FEE_QUEUE.to_string(), + ) + .await + else { + tokio::time::sleep(tokio::time::Duration::from_secs( + utils::redis::SLEEP_TIME_AFTER_EVENTS_PROCESS_SECS, + )) + .await; + continue; + }; + + let mut handlers = Vec::new(); + for (key, event) in events { + if let Ok(event) = serde_json::from_str::(&event) { + handlers.push(tokio::spawn({ + let config = config.clone(); + let mut redis_connection = redis_connection.clone(); + let connector = connector.clone(); + + async move { + let Nep141LockerEvent::ClaimFeeEvent { + ref transfer_message, + .. + } = event + else { + warn!("Expected ClaimFeeEvent, got: {:?}", event); + return; + }; + + info!("Received ClaimFeeEvent log"); + + match connector + .sign_claim_native_fee( + vec![transfer_message.origin_nonce.into()], + config.evm.relayer_address_on_eth, + ) + .await + { + Ok(tx_hash) => { + info!("Signed claiming native fee: {:?}", tx_hash); + utils::redis::remove_event( + &mut redis_connection, + utils::redis::NEAR_SIGN_CLAIM_NATIVE_FEE_QUEUE, + key, + ) + .await; + } + Err(err) => error!("Failed to sign claiming native fee: {}", err), + }; + } + })); + } + } + + join_all(handlers).await; + + tokio::time::sleep(tokio::time::Duration::from_secs( + utils::redis::SLEEP_TIME_AFTER_EVENTS_PROCESS_SECS, + )) + .await; + } +} From 47861239a1dcf7ba0d2f1a3df509f706b9fe1baf Mon Sep 17 00:00:00 2001 From: Ivan Frolov <59515280+frolvanya@users.noreply.github.com> Date: Thu, 24 Oct 2024 01:00:24 +0200 Subject: [PATCH 03/21] chore: updated omni-types (#92) --- omni-relayer/Cargo.lock | 246 ++++++++++++++++---------------- omni-relayer/Cargo.toml | 2 +- omni-relayer/src/startup/evm.rs | 4 +- omni-relayer/src/utils/near.rs | 17 +-- 4 files changed, 133 insertions(+), 136 deletions(-) diff --git a/omni-relayer/Cargo.lock b/omni-relayer/Cargo.lock index f640896d..92aa7c97 100644 --- a/omni-relayer/Cargo.lock +++ b/omni-relayer/Cargo.lock @@ -44,7 +44,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.79", + "syn 2.0.84", ] [[package]] @@ -65,7 +65,7 @@ checksum = "b6ac1e58cded18cb28ddc17143c4dea5345b3ad575e14f32f66e4054a56eb271" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.84", ] [[package]] @@ -168,9 +168,9 @@ dependencies = [ [[package]] name = "alloy-chains" -version = "0.1.38" +version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "156bfc5dcd52ef9a5f33381701fa03310317e14c65093a9430d3e3557b08dcd3" +checksum = "d4932d790c723181807738cf1ac68198ab581cd699545b155601332541ee47bd" dependencies = [ "alloy-primitives", "num_enum", @@ -216,9 +216,9 @@ dependencies = [ [[package]] name = "alloy-core" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a54c7158ea4a394bef220d82d8fdd412fb9b1ca2d6024db539070b7bc01b6401" +checksum = "5cce174ca699ddee3bfb2ec1fbd99ad7efd05eca20c5c888d8320db41f7e8f04" dependencies = [ "alloy-dyn-abi", "alloy-json-abi", @@ -229,9 +229,9 @@ dependencies = [ [[package]] name = "alloy-dyn-abi" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6228abfc751a29cde117b0879b805a3e0b3b641358f063272c83ca459a56886" +checksum = "5647fce5a168f9630f935bf7821c4207b1755184edaeba783cb4e11d35058484" dependencies = [ "alloy-json-abi", "alloy-primitives", @@ -297,9 +297,9 @@ dependencies = [ [[package]] name = "alloy-json-abi" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d46eb5871592c216d39192499c95a99f7175cb94104f88c307e6dc960676d9f1" +checksum = "4b5671117c38b1c2306891f97ad3828d85487087f54ebe2c7591a055ea5bcea7" dependencies = [ "alloy-primitives", "alloy-sol-type-parser", @@ -374,9 +374,9 @@ dependencies = [ [[package]] name = "alloy-primitives" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f35429a652765189c1c5092870d8360ee7b7769b09b06d89ebaefd34676446" +checksum = "c71738eb20c42c5fb149571e76536a0f309d142f3957c28791662b96baf77a3d" dependencies = [ "alloy-rlp", "bytes", @@ -460,9 +460,9 @@ dependencies = [ [[package]] name = "alloy-rlp" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26154390b1d205a4a7ac7352aa2eb4f81f391399d4e2f546fb81a2f8bb383f62" +checksum = "da0822426598f95e45dd1ea32a738dac057529a709ee645fcc516ffa4cbde08f" dependencies = [ "alloy-rlp-derive", "arrayvec 0.7.6", @@ -471,13 +471,13 @@ dependencies = [ [[package]] name = "alloy-rlp-derive" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d0f2d905ebd295e7effec65e5f6868d153936130ae718352771de3e7d03c75c" +checksum = "2b09cae092c27b6f1bde952653a22708691802e57bfef4a2973b80bea21efd3f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.84", ] [[package]] @@ -589,23 +589,23 @@ dependencies = [ [[package]] name = "alloy-sol-macro" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b2395336745358cc47207442127c47c63801a7065ecc0aa928da844f8bb5576" +checksum = "b0900b83f4ee1f45c640ceee596afbc118051921b9438fdb5a3175c1a7e05f8b" dependencies = [ "alloy-sol-macro-expander", "alloy-sol-macro-input", "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.84", ] [[package]] name = "alloy-sol-macro-expander" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed5047c9a241df94327879c2b0729155b58b941eae7805a7ada2e19436e6b39" +checksum = "a41b1e78dde06b5e12e6702fa8c1d30621bf07728ba75b801fb801c9c6a0ba10" dependencies = [ "alloy-sol-macro-input", "const-hex", @@ -614,31 +614,31 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.84", "syn-solidity", "tiny-keccak", ] [[package]] name = "alloy-sol-macro-input" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dee02a81f529c415082235129f0df8b8e60aa1601b9c9298ffe54d75f57210b" +checksum = "91dc311a561a306664393407b88d3e53ae58581624128afd8a15faa5de3627dc" dependencies = [ "const-hex", "dunce", "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.84", "syn-solidity", ] [[package]] name = "alloy-sol-type-parser" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f631f0bd9a9d79619b27c91b6b1ab2c4ef4e606a65192369a1ee05d40dcf81cc" +checksum = "45d1fbee9e698f3ba176b6e7a145f4aefe6d2b746b611e8bb246fe11a0e9f6c4" dependencies = [ "serde", "winnow", @@ -646,9 +646,9 @@ dependencies = [ [[package]] name = "alloy-sol-types" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2841af22d99e2c0f82a78fe107b6481be3dd20b89bfb067290092794734343a" +checksum = "086f41bc6ebcd8cb15f38ba20e47be38dd03692149681ce8061c35d960dbf850" dependencies = [ "alloy-json-abi", "alloy-primitives", @@ -775,9 +775,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.89" +version = "1.0.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" +checksum = "c042108f3ed77fd83760a5fd79b53be043192bb3b9dba91d8c574c0ada7850c8" [[package]] name = "arbitrary" @@ -970,7 +970,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.84", ] [[package]] @@ -981,7 +981,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.84", ] [[package]] @@ -1009,7 +1009,7 @@ checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.84", ] [[package]] @@ -1088,9 +1088,9 @@ dependencies = [ [[package]] name = "aws-sdk-s3" -version = "1.56.0" +version = "1.57.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cecd672c8d4265fd4fbecacd4a479180e616881bbe639250cf81ddb604e4c301" +checksum = "8888c238bf93c77c5df8274b3999fd7fc1bb3fb658616f40dfde9e4fcd9efd94" dependencies = [ "ahash 0.8.11", "aws-credential-types", @@ -1629,7 +1629,7 @@ dependencies = [ "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.84", "syn_derive", ] @@ -1658,7 +1658,7 @@ dependencies = [ [[package]] name = "bridge-connector-common" version = "0.1.0" -source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs#003ea92153ac0f38548c1beec023dfa38185fc14" +source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs#1ba4e3ba230b515957edbf3eb1cd5a2b71dac973" dependencies = [ "eth-proof", "ethers", @@ -1726,9 +1726,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.7.2" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" +checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" dependencies = [ "serde", ] @@ -1832,9 +1832,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.30" +version = "1.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b16803a61b81d9eabb7eae2588776c4c1e584b738ede45fdbb4c972cec1e9945" +checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" dependencies = [ "jobserver", "libc", @@ -1935,7 +1935,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.84", ] [[package]] @@ -2335,7 +2335,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.84", ] [[package]] @@ -2383,7 +2383,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.79", + "syn 2.0.84", ] [[package]] @@ -2405,7 +2405,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core 0.20.10", "quote", - "syn 2.0.79", + "syn 2.0.84", ] [[package]] @@ -2486,7 +2486,7 @@ checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.84", ] [[package]] @@ -2528,7 +2528,7 @@ dependencies = [ "darling 0.20.10", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.84", ] [[package]] @@ -2548,7 +2548,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core 0.20.2", - "syn 2.0.79", + "syn 2.0.84", ] [[package]] @@ -2561,7 +2561,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version 0.4.1", - "syn 2.0.79", + "syn 2.0.84", ] [[package]] @@ -2581,7 +2581,7 @@ checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.84", "unicode-xid", ] @@ -2880,7 +2880,7 @@ checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.84", ] [[package]] @@ -2901,7 +2901,7 @@ dependencies = [ "darling 0.20.10", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.84", ] [[package]] @@ -2979,7 +2979,7 @@ dependencies = [ [[package]] name = "eth-proof" version = "0.1.0" -source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs#003ea92153ac0f38548c1beec023dfa38185fc14" +source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs#1ba4e3ba230b515957edbf3eb1cd5a2b71dac973" dependencies = [ "borsh 1.5.1", "cita_trie", @@ -3136,7 +3136,7 @@ dependencies = [ "reqwest 0.11.27", "serde", "serde_json", - "syn 2.0.79", + "syn 2.0.84", "toml 0.8.19", "walkdir", ] @@ -3154,7 +3154,7 @@ dependencies = [ "proc-macro2", "quote", "serde_json", - "syn 2.0.79", + "syn 2.0.84", ] [[package]] @@ -3180,7 +3180,7 @@ dependencies = [ "serde", "serde_json", "strum 0.26.3", - "syn 2.0.79", + "syn 2.0.84", "tempfile", "thiserror", "tiny-keccak", @@ -3548,7 +3548,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.84", ] [[package]] @@ -4423,9 +4423,9 @@ checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" [[package]] name = "libc" -version = "0.2.159" +version = "0.2.161" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" +checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" [[package]] name = "libm" @@ -5009,7 +5009,7 @@ dependencies = [ [[package]] name = "near-light-client-on-eth" version = "0.1.0" -source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs#003ea92153ac0f38548c1beec023dfa38185fc14" +source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs#1ba4e3ba230b515957edbf3eb1cd5a2b71dac973" dependencies = [ "ethereum-types 0.14.1", "ethers", @@ -5293,7 +5293,7 @@ dependencies = [ [[package]] name = "near-rpc-client" version = "0.1.0" -source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs#003ea92153ac0f38548c1beec023dfa38185fc14" +source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs#1ba4e3ba230b515957edbf3eb1cd5a2b71dac973" dependencies = [ "borsh 1.5.1", "lazy_static", @@ -5315,7 +5315,7 @@ checksum = "3610517a56329b7cce0c8c4cf2686fc4bbe0b155181b118acf20d2a301bf29b6" dependencies = [ "quote", "serde", - "syn 2.0.79", + "syn 2.0.84", ] [[package]] @@ -5326,7 +5326,7 @@ checksum = "cf41b149dcc1f5a35d6a96fbcd8c28c92625c05b52025a72ee7378c72bcd68ce" dependencies = [ "quote", "serde", - "syn 2.0.79", + "syn 2.0.84", ] [[package]] @@ -5337,7 +5337,7 @@ checksum = "df598b0785a3e36d7e4fb73afcdf20536988b13d07cead71dfa777db4783e552" dependencies = [ "quote", "serde", - "syn 2.0.79", + "syn 2.0.84", ] [[package]] @@ -5349,7 +5349,7 @@ dependencies = [ "fs2", "near-rpc-error-core 0.21.2", "serde", - "syn 2.0.79", + "syn 2.0.84", ] [[package]] @@ -5360,7 +5360,7 @@ checksum = "73c7f0f12f426792dd2c9d83df43d73c3b15d80f6e99e8d0e16ff3e024d0f9ba" dependencies = [ "near-rpc-error-core 0.23.0", "serde", - "syn 2.0.79", + "syn 2.0.84", ] [[package]] @@ -5371,7 +5371,7 @@ checksum = "647ef261df99ad877c08c97af2f10368c8b8cde0968250d3482a5a249e9f3926" dependencies = [ "near-rpc-error-core 0.26.0", "serde", - "syn 2.0.79", + "syn 2.0.84", ] [[package]] @@ -5408,7 +5408,7 @@ dependencies = [ "serde_json", "strum 0.26.3", "strum_macros 0.26.4", - "syn 2.0.79", + "syn 2.0.84", ] [[package]] @@ -5759,7 +5759,7 @@ dependencies = [ "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.84", ] [[package]] @@ -5786,7 +5786,7 @@ dependencies = [ [[package]] name = "omni-connector" version = "0.1.0" -source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs#003ea92153ac0f38548c1beec023dfa38185fc14" +source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs#1ba4e3ba230b515957edbf3eb1cd5a2b71dac973" dependencies = [ "borsh 1.5.1", "bridge-connector-common", @@ -5839,7 +5839,7 @@ dependencies = [ [[package]] name = "omni-types" version = "2.0.0" -source = "git+https://github.com/near-one/omni-bridge?rev=21a328f5388bfa98d1ba1eb40b541316429a4369#21a328f5388bfa98d1ba1eb40b541316429a4369" +source = "git+https://github.com/near-one/omni-bridge?rev=234cc6af6920027f779b842a6d8afc00530ddbc2#234cc6af6920027f779b842a6d8afc00530ddbc2" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -5895,9 +5895,9 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.67" +version = "0.10.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b8cefcf97f41316955f9294cd61f639bdcfa9f2f230faac6cb896aa8ab64704" +checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" dependencies = [ "bitflags 2.6.0", "cfg-if 1.0.0", @@ -5916,7 +5916,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.84", ] [[package]] @@ -5993,9 +5993,9 @@ checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" [[package]] name = "ordered-float" -version = "4.3.0" +version = "4.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d501f1a72f71d3c063a6bbc8f7271fa73aa09fe5d6283b6571e2ed176a2537" +checksum = "83e7ccb95e240b7c9506a3d544f10d935e142cc90b0a1d56954fb44d89ad6b97" dependencies = [ "borsh 1.5.1", "num-traits", @@ -6242,7 +6242,7 @@ dependencies = [ "phf_shared 0.11.2", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.84", ] [[package]] @@ -6280,7 +6280,7 @@ checksum = "a4502d8515ca9f32f1fb543d987f63d95a14934883db45bdb48060b6b69257f8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.84", ] [[package]] @@ -6360,12 +6360,12 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.22" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479cf940fbbb3426c32c5d5176f62ad57549a0bb84773423ba8be9d089f5faba" +checksum = "910d41a655dac3b764f1ade94821093d3610248694320cd072303a8eedcf221d" dependencies = [ "proc-macro2", - "syn 2.0.79", + "syn 2.0.84", ] [[package]] @@ -6465,14 +6465,14 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.84", ] [[package]] name = "proc-macro2" -version = "1.0.87" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3e4daa0dcf6feba26f985457cdf104d4b4256fc5a09547140f3631bb076b19a" +checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" dependencies = [ "unicode-ident", ] @@ -6736,9 +6736,9 @@ dependencies = [ [[package]] name = "redis" -version = "0.27.4" +version = "0.27.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc6baebe319ef5e4b470f248335620098d1c2e9261e995be05f56f719ca4bdb2" +checksum = "81cccf17a692ce51b86564334614d72dcae1def0fd5ecebc9f02956da74352b5" dependencies = [ "arc-swap", "async-trait", @@ -7305,21 +7305,21 @@ dependencies = [ [[package]] name = "scale-info" -version = "2.11.3" +version = "2.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca070c12893629e2cc820a9761bedf6ce1dcddc9852984d1dc734b8bd9bd024" +checksum = "22760a375f81a31817aeaf6f5081e9ccb7ffd7f2da1809a6e3fc82b6656f10d5" dependencies = [ "cfg-if 1.0.0", - "derive_more 0.99.18", + "derive_more 1.0.0", "parity-scale-codec", "scale-info-derive", ] [[package]] name = "scale-info-derive" -version = "2.11.3" +version = "2.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d35494501194174bda522a32605929eefc9ecf7e0a326c26db1fdd85881eb62" +checksum = "abc61ebe25a5c410c0e245028fc9934bf8fa4817199ef5a24a68092edfd34614" dependencies = [ "proc-macro-crate 3.2.0", "proc-macro2", @@ -7516,9 +7516,9 @@ checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" [[package]] name = "serde" -version = "1.0.210" +version = "1.0.213" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" +checksum = "3ea7893ff5e2466df8d720bb615088341b295f849602c6956047f8f80f0e9bc1" dependencies = [ "serde_derive", ] @@ -7544,20 +7544,20 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.210" +version = "1.0.213" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" +checksum = "7e85ad2009c50b58e87caa8cd6dac16bdf511bbfb7af6c33df902396aa480fa5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.84", ] [[package]] name = "serde_json" -version = "1.0.128" +version = "1.0.132" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" +checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" dependencies = [ "itoa", "memchr", @@ -7573,7 +7573,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.84", ] [[package]] @@ -7624,7 +7624,7 @@ dependencies = [ "darling 0.20.10", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.84", ] [[package]] @@ -7928,7 +7928,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.79", + "syn 2.0.84", ] [[package]] @@ -7970,9 +7970,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.79" +version = "2.0.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" +checksum = "6a2c4efbc0b0670e3d41f388e3cb936ff364bf681703b4c92ae26ca509966111" dependencies = [ "proc-macro2", "quote", @@ -7981,14 +7981,14 @@ dependencies = [ [[package]] name = "syn-solidity" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebfc1bfd06acc78f16d8fd3ef846bc222ee7002468d10a7dce8d703d6eab89a3" +checksum = "9d5e0c2ea8db64b2898b62ea2fbd60204ca95e0b2c6bdf53ff768bbe916fbe4d" dependencies = [ "paste", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.84", ] [[package]] @@ -8000,7 +8000,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.84", ] [[package]] @@ -8113,22 +8113,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.64" +version = "1.0.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" +checksum = "5d11abd9594d9b38965ef50805c5e469ca9cc6f197f883f717e0269a3057b3d5" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.64" +version = "1.0.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" +checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.84", ] [[package]] @@ -8207,9 +8207,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.40.0" +version = "1.41.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" +checksum = "145f3413504347a2be84393cc8a7d2fb4d863b375909ea59f2158261aa258bbb" dependencies = [ "backtrace", "bytes", @@ -8241,7 +8241,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.84", ] [[package]] @@ -8509,7 +8509,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.84", ] [[package]] @@ -8862,7 +8862,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.84", "wasm-bindgen-shared", ] @@ -8896,7 +8896,7 @@ checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.84", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -9341,7 +9341,7 @@ checksum = "09b5575a75e711ca6c36bb9ad647c93541cdc8e34218031acba5da3f35919dd3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.84", ] [[package]] @@ -9694,7 +9694,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.84", ] [[package]] @@ -9714,7 +9714,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.84", ] [[package]] diff --git a/omni-relayer/Cargo.toml b/omni-relayer/Cargo.toml index 0d7e63eb..233fb4b5 100644 --- a/omni-relayer/Cargo.toml +++ b/omni-relayer/Cargo.toml @@ -20,7 +20,7 @@ tokio = { version = "1", features = ["sync", "time", "macros", "rt-multi-thread" tokio-stream = { version = "0.1" } ethereum-types = "0.14.1" -omni-types = { git = "https://github.com/near-one/omni-bridge", package = "omni-types", rev = "21a328f5388bfa98d1ba1eb40b541316429a4369" } +omni-types = { git = "https://github.com/near-one/omni-bridge", package = "omni-types", rev = "234cc6af6920027f779b842a6d8afc00530ddbc2" } near-lake-framework = "0.7.9" near-jsonrpc-client = "0.13.0" diff --git a/omni-relayer/src/startup/evm.rs b/omni-relayer/src/startup/evm.rs index 6fe04633..b68eb2c2 100644 --- a/omni-relayer/src/startup/evm.rs +++ b/omni-relayer/src/startup/evm.rs @@ -283,7 +283,7 @@ async fn process_log( let fin_transfer_args = FinTransferArgs { chain_kind: ChainKind::Eth, - native_fee_recipient: config.evm.relayer_address_on_eth.clone(), + native_fee_recipient: Some(config.evm.relayer_address_on_eth.clone()), storage_deposit_args: StorageDepositArgs { token, accounts: vec![ @@ -311,7 +311,7 @@ async fn process_log( let claim_fee_args = ClaimFeeArgs { chain_kind: ChainKind::Eth, prover_args, - native_fee_recipient: config.evm.relayer_address_on_eth.clone(), + native_fee_recipient: Some(config.evm.relayer_address_on_eth.clone()), }; let mut serialized_claim_fee_args = Vec::new(); diff --git a/omni-relayer/src/utils/near.rs b/omni-relayer/src/utils/near.rs index be72fba7..d2cb8701 100644 --- a/omni-relayer/src/utils/near.rs +++ b/omni-relayer/src/utils/near.rs @@ -131,17 +131,14 @@ pub async fn handle_streamer_message( } Nep141LockerEvent::ClaimFeeEvent { ref transfer_message, - ref native_fee_recipient, } => { - if native_fee_recipient == &config.evm.relayer_address_on_eth { - utils::redis::add_event( - redis_connection, - utils::redis::NEAR_SIGN_CLAIM_NATIVE_FEE_QUEUE, - transfer_message.origin_nonce.0.to_string(), - log, - ) - .await; - } + utils::redis::add_event( + redis_connection, + utils::redis::NEAR_SIGN_CLAIM_NATIVE_FEE_QUEUE, + transfer_message.origin_nonce.0.to_string(), + log, + ) + .await; } Nep141LockerEvent::SignClaimNativeFeeEvent { ref claim_payload, .. From ba153c2711f05764ea89bde02884b3d4cdc77e18 Mon Sep 17 00:00:00 2001 From: Ivan Frolov <59515280+frolvanya@users.noreply.github.com> Date: Wed, 30 Oct 2024 15:24:56 +0100 Subject: [PATCH 04/21] feat: wait for eth light client (#71) * feat: wait until light client receives info about block closes #63 * chore: added config.toml to .gitignore * chore: renamed method in evm worker * chore: made clippy happy * fix: issues after merging * chore: fixed style * chore: added example config * chore: moved `eth_light_client` under `evm` config * feat: check block number before claiming fee * feat: added sleep for light client waiting time * fix: don't wait for light client if we have vaa * fix: constructed proper `FinTransferArgs` * feat: added wormhole support for `claim_fee` worker * feat: expect either fintransfer or claimfee event * fix: provided correct args for claiming fee * chore: provided proper name for prover args constructor --- .gitignore | 1 + omni-relayer/Cargo.lock | 139 ++++----- omni-relayer/Cargo.toml | 1 + .../{config.toml => example-config.toml} | 1 + omni-relayer/src/config.rs | 2 + omni-relayer/src/main.rs | 28 +- omni-relayer/src/startup/evm.rs | 284 +++--------------- omni-relayer/src/utils/evm.rs | 132 ++++++++ omni-relayer/src/utils/mod.rs | 1 + omni-relayer/src/utils/near.rs | 38 ++- omni-relayer/src/utils/storage.rs | 2 +- omni-relayer/src/workers/evm.rs | 149 ++++++++- omni-relayer/src/workers/near.rs | 82 ++++- 13 files changed, 515 insertions(+), 345 deletions(-) rename omni-relayer/{config.toml => example-config.toml} (89%) create mode 100644 omni-relayer/src/utils/evm.rs diff --git a/.gitignore b/.gitignore index 878038ac..de3fbc79 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .DS_Store **/target +**/config.toml diff --git a/omni-relayer/Cargo.lock b/omni-relayer/Cargo.lock index 92aa7c97..4c46b4bf 100644 --- a/omni-relayer/Cargo.lock +++ b/omni-relayer/Cargo.lock @@ -44,7 +44,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.84", + "syn 2.0.85", ] [[package]] @@ -65,7 +65,7 @@ checksum = "b6ac1e58cded18cb28ddc17143c4dea5345b3ad575e14f32f66e4054a56eb271" dependencies = [ "proc-macro2", "quote", - "syn 2.0.84", + "syn 2.0.85", ] [[package]] @@ -477,7 +477,7 @@ checksum = "2b09cae092c27b6f1bde952653a22708691802e57bfef4a2973b80bea21efd3f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.84", + "syn 2.0.85", ] [[package]] @@ -598,7 +598,7 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.84", + "syn 2.0.85", ] [[package]] @@ -614,7 +614,7 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.84", + "syn 2.0.85", "syn-solidity", "tiny-keccak", ] @@ -630,7 +630,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.84", + "syn 2.0.85", "syn-solidity", ] @@ -970,7 +970,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.84", + "syn 2.0.85", ] [[package]] @@ -981,7 +981,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.84", + "syn 2.0.85", ] [[package]] @@ -1009,7 +1009,7 @@ checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" dependencies = [ "proc-macro2", "quote", - "syn 2.0.84", + "syn 2.0.85", ] [[package]] @@ -1629,7 +1629,7 @@ dependencies = [ "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 2.0.84", + "syn 2.0.85", "syn_derive", ] @@ -1935,7 +1935,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.84", + "syn 2.0.85", ] [[package]] @@ -2335,7 +2335,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.84", + "syn 2.0.85", ] [[package]] @@ -2383,7 +2383,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.84", + "syn 2.0.85", ] [[package]] @@ -2405,7 +2405,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core 0.20.10", "quote", - "syn 2.0.84", + "syn 2.0.85", ] [[package]] @@ -2486,7 +2486,7 @@ checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" dependencies = [ "proc-macro2", "quote", - "syn 2.0.84", + "syn 2.0.85", ] [[package]] @@ -2528,7 +2528,7 @@ dependencies = [ "darling 0.20.10", "proc-macro2", "quote", - "syn 2.0.84", + "syn 2.0.85", ] [[package]] @@ -2548,7 +2548,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core 0.20.2", - "syn 2.0.84", + "syn 2.0.85", ] [[package]] @@ -2561,7 +2561,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version 0.4.1", - "syn 2.0.84", + "syn 2.0.85", ] [[package]] @@ -2581,7 +2581,7 @@ checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" dependencies = [ "proc-macro2", "quote", - "syn 2.0.84", + "syn 2.0.85", "unicode-xid", ] @@ -2838,9 +2838,9 @@ dependencies = [ [[package]] name = "encoding_rs" -version = "0.8.34" +version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" dependencies = [ "cfg-if 1.0.0", ] @@ -2880,7 +2880,7 @@ checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.84", + "syn 2.0.85", ] [[package]] @@ -2901,7 +2901,7 @@ dependencies = [ "darling 0.20.10", "proc-macro2", "quote", - "syn 2.0.84", + "syn 2.0.85", ] [[package]] @@ -3136,7 +3136,7 @@ dependencies = [ "reqwest 0.11.27", "serde", "serde_json", - "syn 2.0.84", + "syn 2.0.85", "toml 0.8.19", "walkdir", ] @@ -3154,7 +3154,7 @@ dependencies = [ "proc-macro2", "quote", "serde_json", - "syn 2.0.84", + "syn 2.0.85", ] [[package]] @@ -3180,7 +3180,7 @@ dependencies = [ "serde", "serde_json", "strum 0.26.3", - "syn 2.0.84", + "syn 2.0.85", "tempfile", "thiserror", "tiny-keccak", @@ -3548,7 +3548,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.84", + "syn 2.0.85", ] [[package]] @@ -5315,7 +5315,7 @@ checksum = "3610517a56329b7cce0c8c4cf2686fc4bbe0b155181b118acf20d2a301bf29b6" dependencies = [ "quote", "serde", - "syn 2.0.84", + "syn 2.0.85", ] [[package]] @@ -5326,7 +5326,7 @@ checksum = "cf41b149dcc1f5a35d6a96fbcd8c28c92625c05b52025a72ee7378c72bcd68ce" dependencies = [ "quote", "serde", - "syn 2.0.84", + "syn 2.0.85", ] [[package]] @@ -5337,7 +5337,7 @@ checksum = "df598b0785a3e36d7e4fb73afcdf20536988b13d07cead71dfa777db4783e552" dependencies = [ "quote", "serde", - "syn 2.0.84", + "syn 2.0.85", ] [[package]] @@ -5349,7 +5349,7 @@ dependencies = [ "fs2", "near-rpc-error-core 0.21.2", "serde", - "syn 2.0.84", + "syn 2.0.85", ] [[package]] @@ -5360,7 +5360,7 @@ checksum = "73c7f0f12f426792dd2c9d83df43d73c3b15d80f6e99e8d0e16ff3e024d0f9ba" dependencies = [ "near-rpc-error-core 0.23.0", "serde", - "syn 2.0.84", + "syn 2.0.85", ] [[package]] @@ -5371,7 +5371,7 @@ checksum = "647ef261df99ad877c08c97af2f10368c8b8cde0968250d3482a5a249e9f3926" dependencies = [ "near-rpc-error-core 0.26.0", "serde", - "syn 2.0.84", + "syn 2.0.85", ] [[package]] @@ -5408,7 +5408,7 @@ dependencies = [ "serde_json", "strum 0.26.3", "strum_macros 0.26.4", - "syn 2.0.84", + "syn 2.0.85", ] [[package]] @@ -5759,7 +5759,7 @@ dependencies = [ "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 2.0.84", + "syn 2.0.85", ] [[package]] @@ -5811,6 +5811,7 @@ version = "0.1.0" dependencies = [ "alloy", "anyhow", + "borsh 1.5.1", "clap", "dotenv", "eth-proof", @@ -5916,7 +5917,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.84", + "syn 2.0.85", ] [[package]] @@ -6242,7 +6243,7 @@ dependencies = [ "phf_shared 0.11.2", "proc-macro2", "quote", - "syn 2.0.84", + "syn 2.0.85", ] [[package]] @@ -6265,29 +6266,29 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.6" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf123a161dde1e524adf36f90bc5d8d3462824a9c43553ad07a8183161189ec" +checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.6" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4502d8515ca9f32f1fb543d987f63d95a14934883db45bdb48060b6b69257f8" +checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.84", + "syn 2.0.85", ] [[package]] name = "pin-project-lite" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" +checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" [[package]] name = "pin-utils" @@ -6360,12 +6361,12 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.24" +version = "0.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "910d41a655dac3b764f1ade94821093d3610248694320cd072303a8eedcf221d" +checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" dependencies = [ "proc-macro2", - "syn 2.0.84", + "syn 2.0.85", ] [[package]] @@ -6465,7 +6466,7 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.84", + "syn 2.0.85", ] [[package]] @@ -7305,9 +7306,9 @@ dependencies = [ [[package]] name = "scale-info" -version = "2.11.4" +version = "2.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22760a375f81a31817aeaf6f5081e9ccb7ffd7f2da1809a6e3fc82b6656f10d5" +checksum = "1aa7ffc1c0ef49b0452c6e2986abf2b07743320641ffd5fc63d552458e3b779b" dependencies = [ "cfg-if 1.0.0", "derive_more 1.0.0", @@ -7317,14 +7318,14 @@ dependencies = [ [[package]] name = "scale-info-derive" -version = "2.11.4" +version = "2.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abc61ebe25a5c410c0e245028fc9934bf8fa4817199ef5a24a68092edfd34614" +checksum = "46385cc24172cf615450267463f937c10072516359b3ff1cb24228a4a08bf951" dependencies = [ "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.85", ] [[package]] @@ -7550,7 +7551,7 @@ checksum = "7e85ad2009c50b58e87caa8cd6dac16bdf511bbfb7af6c33df902396aa480fa5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.84", + "syn 2.0.85", ] [[package]] @@ -7573,7 +7574,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.84", + "syn 2.0.85", ] [[package]] @@ -7624,7 +7625,7 @@ dependencies = [ "darling 0.20.10", "proc-macro2", "quote", - "syn 2.0.84", + "syn 2.0.85", ] [[package]] @@ -7928,7 +7929,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.84", + "syn 2.0.85", ] [[package]] @@ -7970,9 +7971,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.84" +version = "2.0.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a2c4efbc0b0670e3d41f388e3cb936ff364bf681703b4c92ae26ca509966111" +checksum = "5023162dfcd14ef8f32034d8bcd4cc5ddc61ef7a247c024a33e24e1f24d21b56" dependencies = [ "proc-macro2", "quote", @@ -7988,7 +7989,7 @@ dependencies = [ "paste", "proc-macro2", "quote", - "syn 2.0.84", + "syn 2.0.85", ] [[package]] @@ -8000,7 +8001,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.84", + "syn 2.0.85", ] [[package]] @@ -8128,7 +8129,7 @@ checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602" dependencies = [ "proc-macro2", "quote", - "syn 2.0.84", + "syn 2.0.85", ] [[package]] @@ -8241,7 +8242,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.84", + "syn 2.0.85", ] [[package]] @@ -8509,7 +8510,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.84", + "syn 2.0.85", ] [[package]] @@ -8862,7 +8863,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.84", + "syn 2.0.85", "wasm-bindgen-shared", ] @@ -8896,7 +8897,7 @@ checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.84", + "syn 2.0.85", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -9341,7 +9342,7 @@ checksum = "09b5575a75e711ca6c36bb9ad647c93541cdc8e34218031acba5da3f35919dd3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.84", + "syn 2.0.85", ] [[package]] @@ -9694,7 +9695,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.84", + "syn 2.0.85", ] [[package]] @@ -9714,7 +9715,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.84", + "syn 2.0.85", ] [[package]] diff --git a/omni-relayer/Cargo.toml b/omni-relayer/Cargo.toml index 233fb4b5..7584a4c7 100644 --- a/omni-relayer/Cargo.toml +++ b/omni-relayer/Cargo.toml @@ -15,6 +15,7 @@ dotenv = "0.15" toml = "0.8.19" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" +borsh = "1.5.1" tokio = { version = "1", features = ["sync", "time", "macros", "rt-multi-thread"] } tokio-stream = { version = "0.1" } diff --git a/omni-relayer/config.toml b/omni-relayer/example-config.toml similarity index 89% rename from omni-relayer/config.toml rename to omni-relayer/example-config.toml index cd2e28a1..e4b939c9 100644 --- a/omni-relayer/config.toml +++ b/omni-relayer/example-config.toml @@ -12,3 +12,4 @@ rpc_ws_url = "wss://eth-sepolia.g.alchemy.com/v2/API-KEY" chain_id = 11_155_111 bridge_token_factory_address = "0xAD167CA3A900c977d9edDf6Ec80d6095381DFD33" block_processing_batch_size = 10_000 +eth_light_client = "client-eth2.sepolia.testnet" diff --git a/omni-relayer/src/config.rs b/omni-relayer/src/config.rs index 1cce3b41..cea4c7a4 100644 --- a/omni-relayer/src/config.rs +++ b/omni-relayer/src/config.rs @@ -58,4 +58,6 @@ pub struct Evm { #[serde(default = "derive_evm_address_from_private_key")] pub relayer_address_on_eth: OmniAddress, + + pub eth_light_client: AccountId, } diff --git a/omni-relayer/src/main.rs b/omni-relayer/src/main.rs index f90745ac..712bfede 100644 --- a/omni-relayer/src/main.rs +++ b/omni-relayer/src/main.rs @@ -1,6 +1,6 @@ use std::sync::Arc; -use anyhow::Result; +use anyhow::{Context, Result}; use clap::Parser; use log::{error, info}; @@ -23,7 +23,10 @@ async fn main() -> Result<()> { let args = CliArgs::parse(); - let config = toml::from_str::(&std::fs::read_to_string(args.config)?)?; + let config = toml::from_str::( + &std::fs::read_to_string(args.config).context("Config file doesn't exist")?, + ) + .context("Failed to parse config file")?; let redis_client = redis::Client::open(config.redis.url.clone())?; let jsonrpc_client = near_jsonrpc_client::JsonRpcClient::connect(config.near.rpc_url.clone()); @@ -45,9 +48,11 @@ async fn main() -> Result<()> { async move { workers::near::finalize_transfer(redis_client, connector).await } })); handles.push(tokio::spawn({ + let config = config.clone(); let redis_client = redis_client.clone(); let connector = connector.clone(); - async move { workers::near::claim_fee(redis_client, connector).await } + let jsonrpc_client = jsonrpc_client.clone(); + async move { workers::near::claim_fee(config, redis_client, connector, jsonrpc_client).await } })); handles.push(tokio::spawn({ let config = config.clone(); @@ -57,9 +62,21 @@ async fn main() -> Result<()> { })); handles.push(tokio::spawn({ + let config = config.clone(); let redis_client = redis_client.clone(); let connector = connector.clone(); - async move { workers::evm::finalize_withdraw(redis_client, connector).await } + let jsonrpc_client = jsonrpc_client.clone(); + let near_signer = near_signer.clone(); + async move { + workers::evm::finalize_transfer( + config, + redis_client, + connector, + jsonrpc_client, + near_signer, + ) + .await + } })); handles.push(tokio::spawn({ let redis_client = redis_client.clone(); @@ -76,8 +93,7 @@ async fn main() -> Result<()> { handles.push(tokio::spawn({ let config = config.clone(); let redis_client = redis_client.clone(); - let jsonrpc_client = jsonrpc_client.clone(); - async move { startup::evm::start_indexer(config, redis_client, jsonrpc_client).await } + async move { startup::evm::start_indexer(config, redis_client).await } })); tokio::select! { diff --git a/omni-relayer/src/startup/evm.rs b/omni-relayer/src/startup/evm.rs index b68eb2c2..db592db2 100644 --- a/omni-relayer/src/startup/evm.rs +++ b/omni-relayer/src/startup/evm.rs @@ -1,61 +1,19 @@ use anyhow::{Context, Result}; use log::{info, warn}; +use reqwest::Client; use tokio_stream::StreamExt; -use near_jsonrpc_client::JsonRpcClient; -use near_primitives::{borsh::BorshSerialize, types::AccountId}; -use omni_types::{ - locker_args::{ClaimFeeArgs, FinTransferArgs, StorageDepositArgs}, - prover_args::{EvmVerifyProofArgs, WormholeVerifyProofArgs}, - prover_result::ProofKind, - ChainKind, OmniAddress, -}; - use alloy::{ - providers::{Provider, ProviderBuilder, WsConnect}, - rpc::types::{Filter, Log, TransactionReceipt}, - sol, + providers::{Provider, ProviderBuilder, RootProvider, WsConnect}, + rpc::types::{Filter, Log}, sol_types::SolEvent, + transports::http::Http, }; use ethereum_types::H256; use crate::{config, utils}; -sol!( - #[derive(Debug, serde::Serialize, serde::Deserialize)] - event InitTransfer( - address indexed sender, - address indexed tokenAddress, - uint128 indexed nonce, - string token, - uint128 amount, - uint128 fee, - uint128 nativeFee, - string recipient - ); - - #[derive(Debug, serde::Serialize, serde::Deserialize)] - event FinTransfer( - uint128 indexed nonce, - string token, - uint128 amount, - address recipient, - string feeRecipient - ); - - #[derive(Debug, serde::Serialize, serde::Deserialize)] - event LogMessagePublished( - uint64 sequence, - uint32 nonce, - uint8 consistencyLevel - ); -); - -pub async fn start_indexer( - config: config::Config, - redis_client: redis::Client, - jsonrpc_client: JsonRpcClient, -) -> Result<()> { +pub async fn start_indexer(config: config::Config, redis_client: redis::Client) -> Result<()> { let mut redis_connection = redis_client.get_multiplexed_tokio_connection().await?; let http_provider = ProviderBuilder::new().on_http( @@ -82,7 +40,13 @@ pub async fn start_indexer( let filter = Filter::new() .address(config.evm.bridge_token_factory_address) - .event_signature([InitTransfer::SIGNATURE_HASH, FinTransfer::SIGNATURE_HASH].to_vec()); + .event_signature( + [ + utils::evm::InitTransfer::SIGNATURE_HASH, + utils::evm::FinTransfer::SIGNATURE_HASH, + ] + .to_vec(), + ); for current_block in (from_block..latest_block).step_by(config.evm.block_processing_batch_size as usize) @@ -94,31 +58,7 @@ pub async fn start_indexer( .await?; for log in logs { - let Some(tx_hash) = log.transaction_hash else { - warn!("No transaction hash in log: {:?}", log); - continue; - }; - - let Ok(tx_logs) = http_provider.get_transaction_receipt(tx_hash).await else { - warn!("Failed to get transaction receipt for tx: {:?}", tx_hash); - continue; - }; - - let Some(topic) = log.topic0() else { - warn!("No topic in log: {:?}", log); - continue; - }; - - process_log( - &config, - &mut redis_connection, - &jsonrpc_client, - H256::from_slice(tx_hash.as_slice()), - tx_logs, - log.clone(), - H256::from_slice(topic.as_slice()), - ) - .await; + process_log(&mut redis_connection, &http_provider, log).await; } } @@ -126,206 +66,56 @@ pub async fn start_indexer( let mut stream = ws_provider.subscribe_logs(&filter).await?.into_stream(); while let Some(log) = stream.next().await { - let Some(tx_hash) = log.transaction_hash else { - warn!("No transaction hash in log: {:?}", log); - continue; - }; - - let Ok(tx_logs) = http_provider.get_transaction_receipt(tx_hash).await else { - warn!("Failed to get transaction receipt for tx: {:?}", tx_hash); - continue; - }; - - let Some(topic) = log.topic0() else { - warn!("No topic in log: {:?}", log); - continue; - }; - - process_log( - &config, - &mut redis_connection, - &jsonrpc_client, - H256::from_slice(tx_hash.as_slice()), - tx_logs, - log.clone(), - H256::from_slice(topic.as_slice()), - ) - .await; + process_log(&mut redis_connection, &http_provider, log).await; } Ok(()) } async fn process_log( - config: &config::Config, redis_connection: &mut redis::aio::MultiplexedConnection, - jsonrpc_client: &JsonRpcClient, - tx_hash: H256, - tx_logs: Option, + http_provider: &RootProvider>, log: Log, - topic: H256, ) { - if let Some(block_height) = log.block_number { - utils::redis::update_last_processed_block( - redis_connection, - utils::redis::ETH_LAST_PROCESSED_BLOCK, - block_height, - ) - .await; - } - - let vaa = if let Some(tx_logs) = tx_logs { - let mut vaa = None; - - let recipient = if let Ok(init_log) = log.log_decode::() { - init_log.inner.recipient.parse::().ok() - } else if let Ok(fin_log) = log.log_decode::() { - fin_log - .inner - .recipient - .to_string() - .parse::() - .ok() - } else { - None - }; - - if let Some(address) = recipient { - let chain_id = match address { - OmniAddress::Eth(_) => 2, - OmniAddress::Near(_) => 15, - OmniAddress::Sol(_) => 1, - OmniAddress::Arb(_) | OmniAddress::Base(_) => todo!(), - }; - - for log in tx_logs.inner.logs() { - if let Ok(log) = log.log_decode::() { - vaa = utils::wormhole::get_vaa( - chain_id, - config.evm.bridge_token_factory_address, - log.inner.sequence, - ) - .await - .ok(); - } - } - } - - vaa - } else { - None + let Some(tx_hash) = log.transaction_hash else { + warn!("No transaction hash in log: {:?}", log); + return; }; - let prover_args = if let Some(vaa) = vaa { - let wormhole_proof_args = WormholeVerifyProofArgs { - proof_kind: ProofKind::InitTransfer, - vaa, - }; - - let mut prover_args = Vec::new(); - if let Err(err) = wormhole_proof_args.serialize(&mut prover_args) { - warn!("Failed to serialize wormhole proof: {}", err); - } - - prover_args - } else { - let evm_proof_args = - match eth_proof::get_proof_for_event(tx_hash, topic, &config.evm.rpc_http_url).await { - Ok(proof) => proof, - Err(err) => { - warn!("Failed to get proof: {}", err); - return; - } - }; - - let evm_proof_args = EvmVerifyProofArgs { - proof_kind: ProofKind::InitTransfer, - proof: evm_proof_args, - }; - - let mut prover_args = Vec::new(); - if let Err(err) = evm_proof_args.serialize(&mut prover_args) { - warn!("Failed to serialize evm proof: {}", err); - return; - } - - prover_args + let Ok(tx_logs) = http_provider.get_transaction_receipt(tx_hash).await else { + warn!("Failed to get transaction receipt for tx: {:?}", tx_hash); + return; }; - if let Ok(init_log) = log.log_decode::() { - let Ok(token) = init_log.inner.token.parse::() else { - warn!( - "Failed to parse token as AccountId: {:?}", - init_log.inner.token - ); - return; - }; - - let Ok(recipient) = init_log.inner.recipient.parse::() else { - warn!( - "Failed to parse recipient as AccountId: {:?}", - init_log.inner.recipient - ); - return; - }; - - let sender = config.near.token_locker_id.clone(); + let tx_hash = H256::from_slice(tx_hash.as_slice()); - // If storage is sufficient, then flag should be false, otherwise true - let sender_is_storage_deposit = - !utils::storage::is_storage_sufficient(jsonrpc_client, &token, &sender) - .await - .unwrap_or_default(); - let recipient_is_storage_deposit = - !utils::storage::is_storage_sufficient(jsonrpc_client, &token, &recipient) - .await - .unwrap_or_default(); - - let fin_transfer_args = FinTransferArgs { - chain_kind: ChainKind::Eth, - native_fee_recipient: Some(config.evm.relayer_address_on_eth.clone()), - storage_deposit_args: StorageDepositArgs { - token, - accounts: vec![ - (sender, sender_is_storage_deposit), - (recipient, recipient_is_storage_deposit), - ], - }, - prover_args, - }; - - let mut serialized_fin_transfer_args = Vec::new(); - if let Err(err) = fin_transfer_args.serialize(&mut serialized_fin_transfer_args) { - warn!("Failed to serialize fin transfer args: {}", err); - return; - } + let Some(block_number) = log.block_number else { + warn!("No block number in log: {:?}", log); + return; + }; + if log.log_decode::().is_ok() { utils::redis::add_event( redis_connection, utils::redis::ETH_WITHDRAW_EVENTS, tx_hash.to_string(), - serialized_fin_transfer_args, + (block_number, log, tx_logs), ) .await; - } else if log.log_decode::().is_ok() { - let claim_fee_args = ClaimFeeArgs { - chain_kind: ChainKind::Eth, - prover_args, - native_fee_recipient: Some(config.evm.relayer_address_on_eth.clone()), - }; - - let mut serialized_claim_fee_args = Vec::new(); - if let Err(err) = claim_fee_args.serialize(&mut serialized_claim_fee_args) { - warn!("Failed to serialize claim fee args: {}", err); - return; - } - + } else if log.log_decode::().is_ok() { utils::redis::add_event( redis_connection, utils::redis::FINALIZED_TRANSFERS, tx_hash.to_string(), - serialized_claim_fee_args, + (block_number, log, tx_logs), ) .await; } + + utils::redis::update_last_processed_block( + redis_connection, + utils::redis::ETH_LAST_PROCESSED_BLOCK, + block_number, + ) + .await; } diff --git a/omni-relayer/src/utils/evm.rs b/omni-relayer/src/utils/evm.rs new file mode 100644 index 00000000..db97604a --- /dev/null +++ b/omni-relayer/src/utils/evm.rs @@ -0,0 +1,132 @@ +use log::warn; + +use near_primitives::borsh::BorshSerialize; +use omni_types::{ + prover_args::{EvmVerifyProofArgs, WormholeVerifyProofArgs}, + prover_result::ProofKind, + OmniAddress, +}; + +use alloy::{rpc::types::Log, sol}; +use ethereum_types::H256; + +use crate::{config, utils}; + +sol!( + #[derive(Debug, serde::Serialize, serde::Deserialize)] + event InitTransfer( + address indexed sender, + address indexed tokenAddress, + uint128 indexed nonce, + string token, + uint128 amount, + uint128 fee, + uint128 nativeFee, + string recipient + ); + + #[derive(Debug, serde::Serialize, serde::Deserialize)] + event FinTransfer( + uint128 indexed nonce, + string token, + uint128 amount, + address recipient, + string feeRecipient + ); + + #[derive(Debug, serde::Serialize, serde::Deserialize)] + event LogMessagePublished( + uint64 sequence, + uint32 nonce, + uint8 consistencyLevel + ); +); + +pub async fn get_vaa( + tx_logs: Option, + log: &Log, + config: &config::Config, +) -> Option { + if let Some(tx_logs) = tx_logs { + let mut vaa = None; + + let recipient = if let Ok(init_log) = log.log_decode::() { + init_log.inner.recipient.parse::().ok() + } else if let Ok(fin_log) = log.log_decode::() { + fin_log + .inner + .recipient + .to_string() + .parse::() + .ok() + } else { + None + }; + + if let Some(address) = recipient { + let chain_id = match address { + OmniAddress::Eth(_) => 2, + OmniAddress::Near(_) => 15, + OmniAddress::Sol(_) => 1, + OmniAddress::Arb(_) | OmniAddress::Base(_) => todo!(), + }; + + for log in tx_logs.inner.logs() { + if let Ok(log) = log.log_decode::() { + vaa = utils::wormhole::get_vaa( + chain_id, + config.evm.bridge_token_factory_address, + log.inner.sequence, + ) + .await + .ok(); + } + } + } + + vaa + } else { + None + } +} + +pub async fn construct_prover_args( + config: &config::Config, + vaa: Option, + tx_hash: H256, + topic: H256, + proof_kind: ProofKind, +) -> Option> { + if let Some(vaa) = vaa { + let wormhole_proof_args = WormholeVerifyProofArgs { proof_kind, vaa }; + + let mut prover_args = Vec::new(); + if let Err(err) = wormhole_proof_args.serialize(&mut prover_args) { + warn!("Failed to serialize wormhole proof: {}", err); + } + + Some(prover_args) + } else { + let evm_proof_args = + match eth_proof::get_proof_for_event(tx_hash, topic, &config.evm.rpc_http_url).await { + Ok(proof) => proof, + Err(err) => { + warn!("Failed to get proof: {}", err); + return None; + } + }; + + let evm_proof_args = EvmVerifyProofArgs { + proof_kind, + proof: evm_proof_args, + }; + + let mut prover_args = Vec::new(); + if let Err(err) = evm_proof_args.serialize(&mut prover_args) { + warn!("Failed to serialize evm proof: {}", err); + return None; + } + + Some(prover_args) + } +} diff --git a/omni-relayer/src/utils/mod.rs b/omni-relayer/src/utils/mod.rs index 5bdec141..32170ec6 100644 --- a/omni-relayer/src/utils/mod.rs +++ b/omni-relayer/src/utils/mod.rs @@ -1,3 +1,4 @@ +pub mod evm; pub mod fee; pub mod near; pub mod redis; diff --git a/omni-relayer/src/utils/near.rs b/omni-relayer/src/utils/near.rs index d2cb8701..7a7cbb04 100644 --- a/omni-relayer/src/utils/near.rs +++ b/omni-relayer/src/utils/near.rs @@ -1,11 +1,20 @@ use anyhow::Result; use log::{info, warn}; -use near_jsonrpc_client::{methods::block::RpcBlockRequest, JsonRpcClient}; +use near_jsonrpc_client::{ + methods::{self, block::RpcBlockRequest}, + JsonRpcClient, +}; +use near_jsonrpc_primitives::types::query::QueryResponseKind; use near_lake_framework::near_indexer_primitives::{ views::{ActionView, ReceiptEnumView, ReceiptView}, IndexerExecutionOutcomeWithReceipt, StreamerMessage, }; +use near_primitives::{ + borsh::{from_slice, BorshDeserialize}, + types::BlockReference, + views::QueryRequest, +}; use omni_types::near_events::Nep141LockerEvent; use crate::{config, utils}; @@ -25,6 +34,33 @@ pub async fn get_final_block(jsonrpc_client: &JsonRpcClient) -> Result { .map_err(Into::into) } +#[derive(BorshDeserialize)] +struct EthLightClientResponse { + last_block_number: u64, +} + +pub async fn get_eth_light_client_last_block_number( + config: &config::Config, + jsonrpc_client: &JsonRpcClient, +) -> Result { + let request = methods::query::RpcQueryRequest { + block_reference: BlockReference::latest(), + request: QueryRequest::CallFunction { + account_id: config.evm.eth_light_client.clone(), + method_name: "last_block_number".to_string(), + args: Vec::new().into(), + }, + }; + + let response = jsonrpc_client.call(request).await?; + + if let QueryResponseKind::CallResult(result) = response.kind { + Ok(from_slice::(&result.result)?.last_block_number) + } else { + anyhow::bail!("Failed to get token decimals") + } +} + pub async fn handle_streamer_message( config: &config::Config, redis_connection: &mut redis::aio::MultiplexedConnection, diff --git a/omni-relayer/src/utils/storage.rs b/omni-relayer/src/utils/storage.rs index a4ac82aa..832bc03b 100644 --- a/omni-relayer/src/utils/storage.rs +++ b/omni-relayer/src/utils/storage.rs @@ -14,7 +14,7 @@ struct StorageBalance { total: String, } -pub async fn is_storage_sufficient( +pub async fn has_storage_deposit( jsonrpc_client: &JsonRpcClient, token: &AccountId, accound_id: &AccountId, diff --git a/omni-relayer/src/workers/evm.rs b/omni-relayer/src/workers/evm.rs index 7003fe7b..f83c2f07 100644 --- a/omni-relayer/src/workers/evm.rs +++ b/omni-relayer/src/workers/evm.rs @@ -1,18 +1,28 @@ use std::sync::Arc; +use alloy::rpc::types::{Log, TransactionReceipt}; use anyhow::Result; +use ethereum_types::H256; use futures::future::join_all; use log::{error, info, warn}; -use near_primitives::borsh; +use near_primitives::types::AccountId; use omni_connector::OmniConnector; -use omni_types::{locker_args::FinTransferArgs, near_events::Nep141LockerEvent}; +use omni_types::{ + locker_args::{FinTransferArgs, StorageDepositArgs}, + near_events::Nep141LockerEvent, + prover_result::ProofKind, + ChainKind, OmniAddress, +}; -use crate::utils; +use crate::{config, utils}; -pub async fn finalize_withdraw( +pub async fn finalize_transfer( + config: config::Config, redis_client: redis::Client, connector: Arc, + jsonrpc_client: near_jsonrpc_client::JsonRpcClient, + near_signer: near_crypto::InMemorySigner, ) -> Result<()> { let redis_connection = redis_client.get_multiplexed_tokio_connection().await?; @@ -33,24 +43,141 @@ pub async fn finalize_withdraw( let mut handlers = Vec::new(); for (key, event) in events { - if let Ok(withdraw_log) = serde_json::from_str::>(&event) { + if let Ok((block_number, log, tx_logs)) = + serde_json::from_str::<(u64, Log, Option)>(&event) + { + let vaa = utils::evm::get_vaa(tx_logs, &log, &config).await; + + if vaa.is_none() { + let Ok(light_client_latest_block_number) = + utils::near::get_eth_light_client_last_block_number( + &config, + &jsonrpc_client, + ) + .await + else { + warn!("Failed to get eth light client last block number"); + continue; + }; + + if block_number > light_client_latest_block_number { + tokio::time::sleep(tokio::time::Duration::from_secs( + utils::redis::SLEEP_TIME_AFTER_EVENTS_PROCESS_SECS, + )) + .await; + continue; + } + } + + let Ok(init_log) = log.log_decode::() else { + warn!("Failed to decode log as InitTransfer: {:?}", log); + continue; + }; + handlers.push(tokio::spawn({ + let config = config.clone(); let mut redis_connection = redis_connection.clone(); let connector = connector.clone(); + let jsonrpc_client = jsonrpc_client.clone(); + let near_signer = near_signer.clone(); async move { - let Ok(fin_transfer_args) = - borsh::from_slice::(&withdraw_log) + info!("Received InitTransfer log"); + + let Some(tx_hash) = log.transaction_hash else { + warn!("No transaction hash in log: {:?}", log); + return; + }; + + let Some(topic) = log.topic0() else { + warn!("No topic0 in log: {:?}", log); + return; + }; + + let tx_hash = H256::from_slice(tx_hash.as_slice()); + + let Ok(token) = init_log.inner.token.parse::() else { + warn!( + "Failed to parse token as AccountId: {:?}", + init_log.inner.token + ); + return; + }; + let Ok(recipient) = init_log.inner.recipient.parse::() else { + warn!( + "Failed to parse recipient as OmniAddress: {:?}", + init_log.inner.recipient + ); + return; + }; + + 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 decode log: {:?}", withdraw_log); return; }; - info!("Received FinTransfer log"); + let storage_deposit_accounts = + if let OmniAddress::Near(near_recipient) = &recipient { + let Ok(recipient_account_id) = near_recipient.parse::() + else { + warn!( + "Failed to parse recipient as AccountId: {:?}", + near_recipient + ); + return; + }; + + let Ok(sender_has_storage_deposit) = + utils::storage::has_storage_deposit( + &jsonrpc_client, + &token, + &near_signer.account_id, + ) + .await + else { + warn!("Failed to check sender storage balance"); + return; + }; + let Ok(recipient_has_storage_deposit) = + utils::storage::has_storage_deposit( + &jsonrpc_client, + &token, + &recipient_account_id, + ) + .await + else { + warn!("Failed to check recipient storage balance"); + return; + }; + + vec![ + (near_signer.account_id, !sender_has_storage_deposit), + (recipient_account_id, !recipient_has_storage_deposit), + ] + } else { + Vec::new() + }; + + let fin_transfer_args = FinTransferArgs { + chain_kind: ChainKind::Eth, + native_fee_recipient: Some(config.evm.relayer_address_on_eth.clone()), + storage_deposit_args: StorageDepositArgs { + token, + accounts: storage_deposit_accounts, + }, + prover_args, + }; match connector.near_fin_transfer(fin_transfer_args).await { Ok(tx_hash) => { - info!("Finalized withdraw: {:?}", tx_hash); + info!("Finalized InitTransfer: {:?}", tx_hash); utils::redis::remove_event( &mut redis_connection, utils::redis::ETH_WITHDRAW_EVENTS, @@ -58,7 +185,7 @@ pub async fn finalize_withdraw( ) .await; } - Err(err) => error!("Failed to finalize withdraw: {}", err), + Err(err) => error!("Failed to finalize InitTransfer: {}", err), } } })); diff --git a/omni-relayer/src/workers/near.rs b/omni-relayer/src/workers/near.rs index fcb426c2..ec8b3e81 100644 --- a/omni-relayer/src/workers/near.rs +++ b/omni-relayer/src/workers/near.rs @@ -1,12 +1,15 @@ use std::sync::Arc; +use alloy::rpc::types::{Log, TransactionReceipt}; use anyhow::Result; +use ethereum_types::H256; use futures::future::join_all; use log::{error, info, warn}; -use near_primitives::borsh; use omni_connector::OmniConnector; -use omni_types::{locker_args::ClaimFeeArgs, near_events::Nep141LockerEvent}; +use omni_types::{ + locker_args::ClaimFeeArgs, near_events::Nep141LockerEvent, prover_result::ProofKind, ChainKind, +}; use crate::{config, utils}; @@ -157,7 +160,12 @@ pub async fn finalize_transfer( } } -pub async fn claim_fee(redis_client: redis::Client, connector: Arc) -> Result<()> { +pub async fn claim_fee( + config: config::Config, + redis_client: redis::Client, + connector: Arc, + jsonrpc_client: near_jsonrpc_client::JsonRpcClient, +) -> Result<()> { let redis_connection = redis_client.get_multiplexed_tokio_connection().await?; loop { @@ -178,20 +186,71 @@ pub async fn claim_fee(redis_client: redis::Client, connector: Arc>(&event) { + if let Ok((block_number, log, tx_logs)) = + serde_json::from_str::<(u64, Log, Option)>(&event) + { + let vaa = utils::evm::get_vaa(tx_logs, &log, &config).await; + + if vaa.is_none() { + let Ok(light_client_latest_block_number) = + utils::near::get_eth_light_client_last_block_number( + &config, + &jsonrpc_client, + ) + .await + else { + warn!("Failed to get eth light client last block number"); + continue; + }; + + if block_number > light_client_latest_block_number { + tokio::time::sleep(tokio::time::Duration::from_secs( + utils::redis::SLEEP_TIME_AFTER_EVENTS_PROCESS_SECS, + )) + .await; + continue; + } + } + handlers.push(tokio::spawn({ + let config = config.clone(); let mut redis_connection = redis_connection.clone(); let connector = connector.clone(); async move { info!("Received finalized transfer"); - let Ok(claim_fee_args) = borsh::from_slice::(&deposit_log) + let Some(tx_hash) = log.transaction_hash else { + warn!("No transaction hash in log: {:?}", log); + return; + }; + + let Some(topic) = log.topic0() else { + warn!("No topic0 in log: {:?}", 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::FinTransfer, + ) + .await else { - warn!("Failed to decode claim fee args"); + warn!("Failed to get prover args"); return; }; + let claim_fee_args = ClaimFeeArgs { + chain_kind: ChainKind::Eth, + prover_args, + native_fee_recipient: Some(config.evm.relayer_address_on_eth), + }; + if let Ok(response) = connector.claim_fee(claim_fee_args).await { info!("Claimed fee: {:?}", response); utils::redis::remove_event( @@ -246,16 +305,19 @@ pub async fn sign_claim_native_fee( let connector = connector.clone(); async move { - let Nep141LockerEvent::ClaimFeeEvent { + let (Nep141LockerEvent::FinTransferEvent { ref transfer_message, .. - } = event + } + | Nep141LockerEvent::ClaimFeeEvent { + ref transfer_message, + }) = event else { - warn!("Expected ClaimFeeEvent, got: {:?}", event); + warn!("Expected FinTransferEvent/ClaimFeeEvent, got: {:?}", event); return; }; - info!("Received ClaimFeeEvent log"); + info!("Received FinTransferEvent/ClaimFeeEvent log"); match connector .sign_claim_native_fee( From 268a57e33caf8f16dd94afffd1e2ec87582633f4 Mon Sep 17 00:00:00 2001 From: Ivan Frolov <59515280+frolvanya@users.noreply.github.com> Date: Thu, 7 Nov 2024 13:48:38 +0100 Subject: [PATCH 05/21] feat: scratch implementation of fee estimation (#81) * feat: scratch implementation of fee estimation * refactor: few tweaks * chore: better way to handle `UpdateFee` event * Squashed commit of the following: commit 3d2e905d78ac5b68d6a393801a8eebd871212f78 Author: Ivan Frolov Date: Fri Oct 25 16:39:22 2024 +0200 chore: provided proper name for prover args constructor commit 885714035c72e4c669bec4e458b7c85e2973f62c Author: Ivan Frolov Date: Thu Oct 24 22:48:15 2024 +0200 fix: provided correct args for claiming fee commit 160e0e3eceb32088c305157956e00132151fb4bf Author: Ivan Frolov Date: Thu Oct 24 22:14:02 2024 +0200 feat: expect either fintransfer or claimfee event commit 1a8def1c8769bde5bacf888685ea0f803e717cef Author: Ivan Frolov Date: Thu Oct 24 21:07:14 2024 +0200 feat: added wormhole support for `claim_fee` worker commit 1a3c711a1d5bf9bb82841a3e92aba4c2f7e52f72 Author: Ivan Frolov Date: Thu Oct 24 20:49:32 2024 +0200 fix: constructed proper `FinTransferArgs` commit ad16b81f875c6a20e9e73f4ab5d656d55f84cd85 Merge: 8b469bc 4786123 Author: Ivan Frolov Date: Thu Oct 24 15:35:10 2024 +0200 Merge branch 'relayer' into feat/wait-for-light-client commit 8b469bcfb87d9b739b7c6f0eb65aef319472e8fa Author: Ivan Frolov Date: Thu Oct 24 15:26:28 2024 +0200 fix: don't wait for light client if we have vaa commit 68821cd6c74704de0c4f7c7de430e53ca9247c02 Author: Ivan Frolov Date: Thu Oct 24 15:23:01 2024 +0200 feat: added sleep for light client waiting time commit 998b21ecfa6a7370bbc4cbd04ae52bf8efdb3ad2 Author: Ivan Frolov Date: Thu Oct 24 15:21:32 2024 +0200 feat: check block number before claiming fee commit ad692b60a1ebed7de2768a88d25ef482b24f99a4 Author: Ivan Frolov Date: Thu Oct 24 15:18:27 2024 +0200 chore: moved `eth_light_client` under `evm` config commit 47861239a1dcf7ba0d2f1a3df509f706b9fe1baf Author: Ivan Frolov <59515280+frolvanya@users.noreply.github.com> Date: Thu Oct 24 01:00:24 2024 +0200 chore: updated omni-types (#92) commit 96954ae2785cbad15314fdc5ad21739a624549c8 Author: Ivan Frolov Date: Thu Oct 17 11:16:32 2024 +0100 chore: added example config commit ad35e5687703adb9580fc19baf1ba2150051804a Author: Ivan Frolov Date: Thu Oct 17 11:09:49 2024 +0100 chore: fixed style commit 7473caa9323a94a66ecdae3f5f02b0ed7868e2b8 Author: Ivan Frolov Date: Thu Oct 17 11:07:26 2024 +0100 fix: issues after merging commit 316a90f9d3f78385f2fc3c0a580db5c006857e23 Author: Ivan Frolov Date: Wed Oct 9 14:42:46 2024 +0100 chore: made clippy happy commit 8d442546a2b4cc2f0d1015ab6f3f150ffe86374f Author: Ivan Frolov Date: Wed Oct 9 14:07:31 2024 +0100 chore: renamed method in evm worker commit b3118d9c0d7f6bd3e4e67b5ff1bfe7b24734b829 Author: Ivan Frolov Date: Wed Oct 9 13:56:14 2024 +0100 chore: added config.toml to .gitignore commit f0677a8956c9d93f8ce3f62a0f2677d58dc769ba Author: Ivan Frolov Date: Wed Oct 9 13:42:03 2024 +0100 feat: wait until light client receives info about block closes #63 * Squashed commit of the following: commit 47861239a1dcf7ba0d2f1a3df509f706b9fe1baf Author: Ivan Frolov <59515280+frolvanya@users.noreply.github.com> Date: Thu Oct 24 01:00:24 2024 +0200 chore: updated omni-types (#92) * fix: read estimated gas as u64 * chore: updated bridge-sdk * fix: removed unnecessary things from fee estimation * feat: added retry logic while estimating fee (#105) * feat: added retry logic and changed location for checking fee * refactor: swapped if blocks * feat: changed retry logic * fix: addressed issues --- omni-relayer/Cargo.lock | 592 +++++++++++++++++++++--------- omni-relayer/Cargo.toml | 1 + omni-relayer/example-config.toml | 2 + omni-relayer/src/config.rs | 1 + omni-relayer/src/main.rs | 5 +- omni-relayer/src/startup/evm.rs | 16 +- omni-relayer/src/startup/near.rs | 2 - omni-relayer/src/utils/fee.rs | 121 ++++-- omni-relayer/src/utils/near.rs | 73 ++-- omni-relayer/src/utils/redis.rs | 27 +- omni-relayer/src/utils/storage.rs | 2 +- omni-relayer/src/workers/evm.rs | 189 +++++++--- omni-relayer/src/workers/near.rs | 123 ++++++- 13 files changed, 811 insertions(+), 343 deletions(-) diff --git a/omni-relayer/Cargo.lock b/omni-relayer/Cargo.lock index 4c46b4bf..62861451 100644 --- a/omni-relayer/Cargo.lock +++ b/omni-relayer/Cargo.lock @@ -44,7 +44,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -65,7 +65,7 @@ checksum = "b6ac1e58cded18cb28ddc17143c4dea5345b3ad575e14f32f66e4054a56eb271" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -168,9 +168,9 @@ dependencies = [ [[package]] name = "alloy-chains" -version = "0.1.40" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4932d790c723181807738cf1ac68198ab581cd699545b155601332541ee47bd" +checksum = "836cf02383d9ebb35502d379bcd1ae803155094077eaab9c29131d888cd5fa3e" dependencies = [ "alloy-primitives", "num_enum", @@ -216,9 +216,9 @@ dependencies = [ [[package]] name = "alloy-core" -version = "0.8.9" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cce174ca699ddee3bfb2ec1fbd99ad7efd05eca20c5c888d8320db41f7e8f04" +checksum = "b72bf30967a232bec83809bea1623031f6285a013096229330c68c406192a4ca" dependencies = [ "alloy-dyn-abi", "alloy-json-abi", @@ -229,9 +229,9 @@ dependencies = [ [[package]] name = "alloy-dyn-abi" -version = "0.8.9" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5647fce5a168f9630f935bf7821c4207b1755184edaeba783cb4e11d35058484" +checksum = "f5228b189b18b85761340dc9eaac0141148a8503657b36f9bc3a869413d987ca" dependencies = [ "alloy-json-abi", "alloy-primitives", @@ -297,9 +297,9 @@ dependencies = [ [[package]] name = "alloy-json-abi" -version = "0.8.9" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b5671117c38b1c2306891f97ad3828d85487087f54ebe2c7591a055ea5bcea7" +checksum = "31a0f0d51db8a1a30a4d98a9f90e090a94c8f44cb4d9eafc7e03aa6d00aae984" dependencies = [ "alloy-primitives", "alloy-sol-type-parser", @@ -374,9 +374,9 @@ dependencies = [ [[package]] name = "alloy-primitives" -version = "0.8.9" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c71738eb20c42c5fb149571e76536a0f309d142f3957c28791662b96baf77a3d" +checksum = "8edae627382349b56cd6a7a2106f4fd69b243a9233e560c55c2e03cabb7e1d3c" dependencies = [ "alloy-rlp", "bytes", @@ -430,7 +430,7 @@ dependencies = [ "futures-utils-wasm", "lru 0.12.5", "pin-project", - "reqwest 0.12.8", + "reqwest 0.12.9", "serde", "serde_json", "thiserror", @@ -477,7 +477,7 @@ checksum = "2b09cae092c27b6f1bde952653a22708691802e57bfef4a2973b80bea21efd3f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -494,7 +494,7 @@ dependencies = [ "alloy-transport-ws", "futures", "pin-project", - "reqwest 0.12.8", + "reqwest 0.12.9", "serde", "serde_json", "tokio", @@ -589,23 +589,23 @@ dependencies = [ [[package]] name = "alloy-sol-macro" -version = "0.8.9" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0900b83f4ee1f45c640ceee596afbc118051921b9438fdb5a3175c1a7e05f8b" +checksum = "841eabaa4710f719fddbc24c95d386eae313f07e6da4babc25830ee37945be0c" dependencies = [ "alloy-sol-macro-expander", "alloy-sol-macro-input", "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] name = "alloy-sol-macro-expander" -version = "0.8.9" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a41b1e78dde06b5e12e6702fa8c1d30621bf07728ba75b801fb801c9c6a0ba10" +checksum = "6672337f19d837b9f7073c45853aeb528ed9f7dd6a4154ce683e9e5cb7794014" dependencies = [ "alloy-sol-macro-input", "const-hex", @@ -614,31 +614,31 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", "syn-solidity", "tiny-keccak", ] [[package]] name = "alloy-sol-macro-input" -version = "0.8.9" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91dc311a561a306664393407b88d3e53ae58581624128afd8a15faa5de3627dc" +checksum = "0dff37dd20bfb118b777c96eda83b2067f4226d2644c5cfa00187b3bc01770ba" dependencies = [ "const-hex", "dunce", "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", "syn-solidity", ] [[package]] name = "alloy-sol-type-parser" -version = "0.8.9" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45d1fbee9e698f3ba176b6e7a145f4aefe6d2b746b611e8bb246fe11a0e9f6c4" +checksum = "5b853d42292dbb159671a3edae3b2750277ff130f32b726fe07dc2b17aa6f2b5" dependencies = [ "serde", "winnow", @@ -646,9 +646,9 @@ dependencies = [ [[package]] name = "alloy-sol-types" -version = "0.8.9" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "086f41bc6ebcd8cb15f38ba20e47be38dd03692149681ce8061c35d960dbf850" +checksum = "aa828bb1b9a6dc52208fbb18084fb9ce2c30facc2bfda6a5d922349b4990354f" dependencies = [ "alloy-json-abi", "alloy-primitives", @@ -684,7 +684,7 @@ checksum = "b367dcccada5b28987c2296717ee04b9a5637aacd78eacb1726ef211678b5212" dependencies = [ "alloy-json-rpc", "alloy-transport", - "reqwest 0.12.8", + "reqwest 0.12.9", "serde_json", "tower 0.5.1", "tracing", @@ -701,7 +701,7 @@ dependencies = [ "alloy-transport", "futures", "http 1.1.0", - "rustls 0.23.15", + "rustls 0.23.16", "serde_json", "tokio", "tokio-tungstenite 0.24.0", @@ -726,9 +726,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.15" +version = "0.6.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" +checksum = "23a1e53f0f5d86382dafe1cf314783b2044280f406e7e1506368220ad11b1338" dependencies = [ "anstyle", "anstyle-parse", @@ -741,43 +741,43 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.8" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" [[package]] name = "anstyle-parse" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.4" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" +checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" dependencies = [ "anstyle", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "anyhow" -version = "1.0.91" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c042108f3ed77fd83760a5fd79b53be043192bb3b9dba91d8c574c0ada7850c8" +checksum = "74f37166d7d48a0284b99dd824694c26119c700b53bf0d1540cdb147dbdaaf13" [[package]] name = "arbitrary" @@ -970,7 +970,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -981,7 +981,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -1009,7 +1009,7 @@ checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -1020,9 +1020,9 @@ checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "aws-config" -version = "1.5.8" +version = "1.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7198e6f03240fdceba36656d8be440297b6b82270325908c7381f37d826a74f6" +checksum = "2d6448cfb224dd6a9b9ac734f58622dd0d4751f3589f3b777345745f46b2eb14" dependencies = [ "aws-credential-types", "aws-runtime", @@ -1088,11 +1088,10 @@ dependencies = [ [[package]] name = "aws-sdk-s3" -version = "1.57.0" +version = "1.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8888c238bf93c77c5df8274b3999fd7fc1bb3fb658616f40dfde9e4fcd9efd94" +checksum = "9f883bb1e349fa8343dc46336c252c0f32ceb6e81acb146aeef2e0f8afc9183e" dependencies = [ - "ahash 0.8.11", "aws-credential-types", "aws-runtime", "aws-sigv4", @@ -1123,9 +1122,9 @@ dependencies = [ [[package]] name = "aws-sdk-sso" -version = "1.46.0" +version = "1.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dc2faec3205d496c7e57eff685dd944203df7ce16a4116d0281c44021788a7b" +checksum = "ded855583fa1d22e88fe39fd6062b062376e50a8211989e07cf5e38d52eb3453" dependencies = [ "aws-credential-types", "aws-runtime", @@ -1145,9 +1144,9 @@ dependencies = [ [[package]] name = "aws-sdk-ssooidc" -version = "1.47.0" +version = "1.49.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c93c241f52bc5e0476e259c953234dab7e2a35ee207ee202e86c0095ec4951dc" +checksum = "9177ea1192e6601ae16c7273385690d88a7ed386a00b74a6bc894d12103cd933" dependencies = [ "aws-credential-types", "aws-runtime", @@ -1167,9 +1166,9 @@ dependencies = [ [[package]] name = "aws-sdk-sts" -version = "1.46.0" +version = "1.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b259429be94a3459fa1b00c5684faee118d74f9577cc50aebadc36e507c63b5f" +checksum = "823ef553cf36713c97453e2ddff1eb8f62be7f4523544e2a5db64caf80100f0a" dependencies = [ "aws-credential-types", "aws-runtime", @@ -1190,9 +1189,9 @@ dependencies = [ [[package]] name = "aws-sigv4" -version = "1.2.4" +version = "1.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc8db6904450bafe7473c6ca9123f88cc11089e41a025408f992db4e22d3be68" +checksum = "5619742a0d8f253be760bfbb8e8e8368c69e3587e4637af5754e488a611499b1" dependencies = [ "aws-credential-types", "aws-smithy-eventstream", @@ -1230,9 +1229,9 @@ dependencies = [ [[package]] name = "aws-smithy-checksums" -version = "0.60.12" +version = "0.60.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "598b1689d001c4d4dc3cb386adb07d37786783aee3ac4b324bcadac116bf3d23" +checksum = "ba1a71073fca26775c8b5189175ea8863afb1c9ea2cceb02a5de5ad9dfbaa795" dependencies = [ "aws-smithy-http", "aws-smithy-types", @@ -1302,9 +1301,9 @@ dependencies = [ [[package]] name = "aws-smithy-runtime" -version = "1.7.2" +version = "1.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a065c0fe6fdbdf9f11817eb68582b2ab4aff9e9c39e986ae48f7ec576c6322db" +checksum = "be28bd063fa91fd871d131fc8b68d7cd4c5fa0869bea68daca50dcb1cbd76be2" dependencies = [ "aws-smithy-async", "aws-smithy-http", @@ -1346,9 +1345,9 @@ dependencies = [ [[package]] name = "aws-smithy-types" -version = "1.2.7" +version = "1.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147100a7bea70fa20ef224a6bad700358305f5dc0f84649c53769761395b355b" +checksum = "07c9cdc179e6afbf5d391ab08c85eac817b51c87e1892a5edb5f7bbdc64314b4" dependencies = [ "base64-simd", "bytes", @@ -1492,9 +1491,9 @@ checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" [[package]] name = "bitcoin-io" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "340e09e8399c7bd8912f495af6aa58bea0c9214773417ffaa8f6460f93aaee56" +checksum = "0b47c4ab7a93edb0c7198c5535ed9b52b63095f4e9b45279c6736cec4b856baf" [[package]] name = "bitcoin_hashes" @@ -1629,7 +1628,7 @@ dependencies = [ "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", "syn_derive", ] @@ -1658,7 +1657,7 @@ dependencies = [ [[package]] name = "bridge-connector-common" version = "0.1.0" -source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs#1ba4e3ba230b515957edbf3eb1cd5a2b71dac973" +source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs#542c21874b286e62d9e9420f44a1cd967084fac3" dependencies = [ "eth-proof", "ethers", @@ -1832,9 +1831,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.31" +version = "1.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" +checksum = "67b9470d453346108f93a59222a9a1a5724db32d0a4727b7ab7ace4b4d822dc9" dependencies = [ "jobserver", "libc", @@ -1935,7 +1934,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -2007,9 +2006,9 @@ dependencies = [ [[package]] name = "colorchoice" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" [[package]] name = "combine" @@ -2335,7 +2334,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -2383,7 +2382,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -2405,7 +2404,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core 0.20.10", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -2486,7 +2485,7 @@ checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -2528,7 +2527,7 @@ dependencies = [ "darling 0.20.10", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -2548,7 +2547,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core 0.20.2", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -2561,7 +2560,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version 0.4.1", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -2581,7 +2580,7 @@ checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", "unicode-xid", ] @@ -2657,6 +2656,17 @@ dependencies = [ "winapi", ] +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "dissimilar" version = "1.0.9" @@ -2880,7 +2890,7 @@ checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -2901,7 +2911,7 @@ dependencies = [ "darling 0.20.10", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -2979,7 +2989,7 @@ dependencies = [ [[package]] name = "eth-proof" version = "0.1.0" -source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs#1ba4e3ba230b515957edbf3eb1cd5a2b71dac973" +source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs#542c21874b286e62d9e9420f44a1cd967084fac3" dependencies = [ "borsh 1.5.1", "cita_trie", @@ -3136,7 +3146,7 @@ dependencies = [ "reqwest 0.11.27", "serde", "serde_json", - "syn 2.0.85", + "syn 2.0.87", "toml 0.8.19", "walkdir", ] @@ -3154,7 +3164,7 @@ dependencies = [ "proc-macro2", "quote", "serde_json", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -3180,7 +3190,7 @@ dependencies = [ "serde", "serde_json", "strum 0.26.3", - "syn 2.0.85", + "syn 2.0.87", "tempfile", "thiserror", "tiny-keccak", @@ -3548,7 +3558,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -4041,7 +4051,7 @@ dependencies = [ "http 1.1.0", "hyper 1.5.0", "hyper-util", - "rustls 0.23.15", + "rustls 0.23.16", "rustls-pki-types", "tokio", "tokio-rustls 0.26.0", @@ -4091,9 +4101,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41296eb09f183ac68eec06e03cdbea2e759633d4067b2f6552fc2e009bcad08b" +checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" dependencies = [ "bytes", "futures-channel", @@ -4131,6 +4141,124 @@ dependencies = [ "cc", ] +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "ident_case" version = "1.0.1" @@ -4139,12 +4267,23 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "0.5.0" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "icu_normalizer", + "icu_properties", ] [[package]] @@ -4429,9 +4568,9 @@ checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" [[package]] name = "libm" -version = "0.2.8" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" +checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" [[package]] name = "libredox" @@ -4449,6 +4588,12 @@ version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +[[package]] +name = "litemap" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704" + [[package]] name = "lock_api" version = "0.3.4" @@ -4942,7 +5087,7 @@ dependencies = [ "near-crypto 0.26.0", "near-jsonrpc-primitives 0.26.0", "near-primitives 0.26.0", - "reqwest 0.12.8", + "reqwest 0.12.9", "serde", "serde_json", "thiserror", @@ -5009,7 +5154,7 @@ dependencies = [ [[package]] name = "near-light-client-on-eth" version = "0.1.0" -source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs#1ba4e3ba230b515957edbf3eb1cd5a2b71dac973" +source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs#542c21874b286e62d9e9420f44a1cd967084fac3" dependencies = [ "ethereum-types 0.14.1", "ethers", @@ -5293,7 +5438,7 @@ dependencies = [ [[package]] name = "near-rpc-client" version = "0.1.0" -source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs#1ba4e3ba230b515957edbf3eb1cd5a2b71dac973" +source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs#542c21874b286e62d9e9420f44a1cd967084fac3" dependencies = [ "borsh 1.5.1", "lazy_static", @@ -5315,7 +5460,7 @@ checksum = "3610517a56329b7cce0c8c4cf2686fc4bbe0b155181b118acf20d2a301bf29b6" dependencies = [ "quote", "serde", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -5326,7 +5471,7 @@ checksum = "cf41b149dcc1f5a35d6a96fbcd8c28c92625c05b52025a72ee7378c72bcd68ce" dependencies = [ "quote", "serde", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -5337,7 +5482,7 @@ checksum = "df598b0785a3e36d7e4fb73afcdf20536988b13d07cead71dfa777db4783e552" dependencies = [ "quote", "serde", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -5349,7 +5494,7 @@ dependencies = [ "fs2", "near-rpc-error-core 0.21.2", "serde", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -5360,7 +5505,7 @@ checksum = "73c7f0f12f426792dd2c9d83df43d73c3b15d80f6e99e8d0e16ff3e024d0f9ba" dependencies = [ "near-rpc-error-core 0.23.0", "serde", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -5371,7 +5516,7 @@ checksum = "647ef261df99ad877c08c97af2f10368c8b8cde0968250d3482a5a249e9f3926" dependencies = [ "near-rpc-error-core 0.26.0", "serde", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -5408,7 +5553,7 @@ dependencies = [ "serde_json", "strum 0.26.3", "strum_macros 0.26.4", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -5759,7 +5904,7 @@ dependencies = [ "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -5786,7 +5931,7 @@ dependencies = [ [[package]] name = "omni-connector" version = "0.1.0" -source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs#1ba4e3ba230b515957edbf3eb1cd5a2b71dac973" +source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs#542c21874b286e62d9e9420f44a1cd967084fac3" dependencies = [ "borsh 1.5.1", "bridge-connector-common", @@ -5802,6 +5947,7 @@ dependencies = [ "near-token", "omni-types", "serde_json", + "sha3", "tracing", ] @@ -5812,6 +5958,7 @@ dependencies = [ "alloy", "anyhow", "borsh 1.5.1", + "chrono", "clap", "dotenv", "eth-proof", @@ -5828,7 +5975,7 @@ dependencies = [ "omni-types", "pretty_env_logger", "redis", - "reqwest 0.12.8", + "reqwest 0.12.9", "secp256k1 0.30.0", "serde", "serde_json", @@ -5917,7 +6064,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -5994,9 +6141,9 @@ checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" [[package]] name = "ordered-float" -version = "4.4.0" +version = "4.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83e7ccb95e240b7c9506a3d544f10d935e142cc90b0a1d56954fb44d89ad6b97" +checksum = "c65ee1f9701bf938026630b455d5315f490640234259037edb259798b3bcf85e" dependencies = [ "borsh 1.5.1", "num-traits", @@ -6243,7 +6390,7 @@ dependencies = [ "phf_shared 0.11.2", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -6281,7 +6428,7 @@ checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -6366,7 +6513,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" dependencies = [ "proc-macro2", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -6466,7 +6613,7 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -6808,9 +6955,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.11.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", @@ -6923,9 +7070,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.8" +version = "0.12.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f713147fbe92361e52392c73b8c9e48c04c6625bce969ef54dc901e58e042a7b" +checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" dependencies = [ "base64 0.22.1", "bytes", @@ -7168,9 +7315,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.37" +version = "0.38.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" +checksum = "aa260229e6538e52293eeb577aabd09945a09d6d9cc0fc550ed7529056c2e32a" dependencies = [ "bitflags 2.6.0", "errno 0.3.9", @@ -7193,9 +7340,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.15" +version = "0.23.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fbb44d7acc4e873d613422379f69f237a1b141928c02f6bc6ccfddddc2d7993" +checksum = "eee87ff5d9b36712a58574e12e9f0ea80f915a5b0ac518d322b24a465617925e" dependencies = [ "once_cell", "ring 0.17.8", @@ -7325,7 +7472,7 @@ dependencies = [ "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -7517,9 +7664,9 @@ checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" [[package]] name = "serde" -version = "1.0.213" +version = "1.0.214" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ea7893ff5e2466df8d720bb615088341b295f849602c6956047f8f80f0e9bc1" +checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5" dependencies = [ "serde_derive", ] @@ -7545,13 +7692,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.213" +version = "1.0.214" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e85ad2009c50b58e87caa8cd6dac16bdf511bbfb7af6c33df902396aa480fa5" +checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -7574,7 +7721,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -7625,7 +7772,7 @@ dependencies = [ "darling 0.20.10", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -7929,7 +8076,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -7971,9 +8118,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.85" +version = "2.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5023162dfcd14ef8f32034d8bcd4cc5ddc61ef7a247c024a33e24e1f24d21b56" +checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" dependencies = [ "proc-macro2", "quote", @@ -7982,14 +8129,14 @@ dependencies = [ [[package]] name = "syn-solidity" -version = "0.8.9" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d5e0c2ea8db64b2898b62ea2fbd60204ca95e0b2c6bdf53ff768bbe916fbe4d" +checksum = "16320d4a2021ba1a32470b3759676114a918885e9800e68ad60f2c67969fba62" dependencies = [ "paste", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -8001,7 +8148,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -8019,6 +8166,17 @@ dependencies = [ "futures-core", ] +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "system-configuration" version = "0.5.1" @@ -8114,22 +8272,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.65" +version = "1.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d11abd9594d9b38965ef50805c5e469ca9cc6f197f883f717e0269a3057b3d5" +checksum = "02dd99dc800bbb97186339685293e1cc5d9df1f8fae2d0aecd9ff1c77efea892" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.65" +version = "1.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602" +checksum = "a7c61ec9a6f64d2793d8a45faba21efbe3ced62a886d44c36a009b2b519b4c7e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -8191,6 +8349,16 @@ dependencies = [ "crunchy", ] +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + [[package]] name = "tinyvec" version = "1.8.0" @@ -8242,7 +8410,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -8271,7 +8439,7 @@ version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" dependencies = [ - "rustls 0.23.15", + "rustls 0.23.16", "rustls-pki-types", "tokio", ] @@ -8311,7 +8479,7 @@ checksum = "edc5f74e248dc973e0dbb7b74c7e0d6fcc301c694ff50049504004ef4d0cdcd9" dependencies = [ "futures-util", "log", - "rustls 0.23.15", + "rustls 0.23.16", "rustls-pki-types", "tokio", "tokio-rustls 0.26.0", @@ -8510,7 +8678,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -8626,7 +8794,7 @@ dependencies = [ "httparse", "log", "rand 0.8.5", - "rustls 0.23.15", + "rustls 0.23.16", "rustls-pki-types", "sha1", "thiserror", @@ -8675,27 +8843,12 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" -[[package]] -name = "unicode-bidi" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" - [[package]] name = "unicode-ident" version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" -[[package]] -name = "unicode-normalization" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" -dependencies = [ - "tinyvec", -] - [[package]] name = "unicode-segmentation" version = "1.12.0" @@ -8728,9 +8881,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.2" +version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +checksum = "8d157f1b96d14500ffdc1f10ba712e780825526c03d9a49b4d0324b0d9113ada" dependencies = [ "form_urlencoded", "idna", @@ -8749,6 +8902,18 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "utf8parse" version = "0.2.2" @@ -8863,7 +9028,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", "wasm-bindgen-shared", ] @@ -8897,7 +9062,7 @@ checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -9342,7 +9507,7 @@ checksum = "09b5575a75e711ca6c36bb9ad647c93541cdc8e34218031acba5da3f35919dd3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -9637,6 +9802,18 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + [[package]] name = "ws_stream_wasm" version = "0.7.4" @@ -9677,6 +9854,30 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" +[[package]] +name = "yoke" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", + "synstructure", +] + [[package]] name = "zerocopy" version = "0.7.35" @@ -9695,7 +9896,28 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", +] + +[[package]] +name = "zerofrom" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", + "synstructure", ] [[package]] @@ -9715,7 +9937,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -9731,6 +9953,28 @@ dependencies = [ "rustc-hex", ] +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "zip" version = "0.6.6" diff --git a/omni-relayer/Cargo.toml b/omni-relayer/Cargo.toml index 7584a4c7..bcaff4c8 100644 --- a/omni-relayer/Cargo.toml +++ b/omni-relayer/Cargo.toml @@ -6,6 +6,7 @@ edition = "2021" [dependencies] log = "0.4" pretty_env_logger = "0.5" +chrono = "0.4" anyhow = "1" futures = "0.3.5" diff --git a/omni-relayer/example-config.toml b/omni-relayer/example-config.toml index e4b939c9..84a3c56c 100644 --- a/omni-relayer/example-config.toml +++ b/omni-relayer/example-config.toml @@ -13,3 +13,5 @@ chain_id = 11_155_111 bridge_token_factory_address = "0xAD167CA3A900c977d9edDf6Ec80d6095381DFD33" block_processing_batch_size = 10_000 eth_light_client = "client-eth2.sepolia.testnet" + +fin_transfer_gas_estimation = 150_000 diff --git a/omni-relayer/src/config.rs b/omni-relayer/src/config.rs index cea4c7a4..2af40b4b 100644 --- a/omni-relayer/src/config.rs +++ b/omni-relayer/src/config.rs @@ -55,6 +55,7 @@ pub struct Evm { pub chain_id: u64, pub bridge_token_factory_address: Address, pub block_processing_batch_size: u64, + pub fin_transfer_gas_estimation: u64, #[serde(default = "derive_evm_address_from_private_key")] pub relayer_address_on_eth: OmniAddress, diff --git a/omni-relayer/src/main.rs b/omni-relayer/src/main.rs index 712bfede..6ffde92d 100644 --- a/omni-relayer/src/main.rs +++ b/omni-relayer/src/main.rs @@ -40,7 +40,10 @@ async fn main() -> Result<()> { let config = config.clone(); let redis_client = redis_client.clone(); let connector = connector.clone(); - async move { workers::near::sign_transfer(config, redis_client, connector).await } + let jsonrpc_client = jsonrpc_client.clone(); + async move { + workers::near::sign_transfer(config, redis_client, connector, jsonrpc_client).await + } })); handles.push(tokio::spawn({ let redis_client = redis_client.clone(); diff --git a/omni-relayer/src/startup/evm.rs b/omni-relayer/src/startup/evm.rs index db592db2..6212088d 100644 --- a/omni-relayer/src/startup/evm.rs +++ b/omni-relayer/src/startup/evm.rs @@ -11,7 +11,7 @@ use alloy::{ }; use ethereum_types::H256; -use crate::{config, utils}; +use crate::{config, utils, workers::near::FinTransfer}; pub async fn start_indexer(config: config::Config, redis_client: redis::Client) -> Result<()> { let mut redis_connection = redis_client.get_multiplexed_tokio_connection().await?; @@ -99,7 +99,13 @@ async fn process_log( redis_connection, utils::redis::ETH_WITHDRAW_EVENTS, tx_hash.to_string(), - (block_number, log, tx_logs), + crate::workers::evm::InitTransferWithTimestamp { + block_number, + log, + tx_logs, + creation_timestamp: chrono::Utc::now().timestamp(), + last_update_timestamp: None, + }, ) .await; } else if log.log_decode::().is_ok() { @@ -107,7 +113,11 @@ async fn process_log( redis_connection, utils::redis::FINALIZED_TRANSFERS, tx_hash.to_string(), - (block_number, log, tx_logs), + FinTransfer { + block_number, + log, + tx_logs, + }, ) .await; } diff --git a/omni-relayer/src/startup/near.rs b/omni-relayer/src/startup/near.rs index f85bcfde..860510a1 100644 --- a/omni-relayer/src/startup/near.rs +++ b/omni-relayer/src/startup/near.rs @@ -112,13 +112,11 @@ pub async fn start_indexer( .map(move |streamer_message| { let config = config.clone(); let mut redis_connection = redis_connection.clone(); - let jsonrpc_client = jsonrpc_client.clone(); async move { utils::near::handle_streamer_message( &config, &mut redis_connection, - &jsonrpc_client, &streamer_message, ) .await; diff --git a/omni-relayer/src/utils/fee.rs b/omni-relayer/src/utils/fee.rs index 14af4c94..fabdc5d8 100644 --- a/omni-relayer/src/utils/fee.rs +++ b/omni-relayer/src/utils/fee.rs @@ -1,25 +1,33 @@ use std::collections::HashMap; -use anyhow::Result; +use alloy::providers::{Provider, ProviderBuilder}; +use anyhow::{Context, Result}; use near_jsonrpc_client::{methods, JsonRpcClient}; use near_jsonrpc_primitives::types::query::QueryResponseKind; -use near_primitives::{types::{AccountId, BlockReference}, views::QueryRequest}; -use omni_types::OmniAddress; +use near_primitives::{ + types::{AccountId, BlockReference}, + views::QueryRequest, +}; +use omni_types::{ChainKind, Fee, OmniAddress}; use serde_json::from_slice; +use crate::config; + +use super::storage; + #[derive(Debug, serde::Deserialize)] -pub struct Metadata { - pub decimals: u32, +struct Metadata { + decimals: u32, } -pub async fn get_token_decimals(jsonrpc_client: &JsonRpcClient, token: &AccountId) -> Result { +async fn get_token_decimals(jsonrpc_client: &JsonRpcClient, token: &AccountId) -> Result { let request = methods::query::RpcQueryRequest { block_reference: BlockReference::latest(), request: QueryRequest::CallFunction { account_id: token.clone(), method_name: "ft_metadata".to_string(), - args: Vec::new().into() + args: Vec::new().into(), }, }; @@ -32,49 +40,88 @@ pub async fn get_token_decimals(jsonrpc_client: &JsonRpcClient, token: &AccountI } } -pub async fn get_price_by_symbol(symbol: &str) -> Result { +async fn get_price_by_symbol(symbol: &str) -> Result { let url = format!("https://api.coingecko.com/api/v3/simple/price?ids={symbol}&vs_currencies=usd"); let response = reqwest::get(&url).await?; - let json = response.json::>>().await?; + let json = response + .json::>>() + .await?; json.get(symbol) .and_then(|inner_map| inner_map.get("usd").copied()) .ok_or_else(|| anyhow::anyhow!("Failed to get price for symbol: {}", symbol)) } -pub async fn get_price_by_contract_address(platform: &str, address: &str) -> Result { - let url = - format!("https://api.coingecko.com/api/v3/simple/token_price/{platform}?contract_addresses={address}&vs_currencies=usd"); - - let response = reqwest::get(&url).await?; - let json = response.json::>>().await?; - - json.get(address) - .and_then(|inner_map| inner_map.get("usd").copied()) - .ok_or_else(|| anyhow::anyhow!("Failed to get price for address: {}", address)) +fn get_symbol_and_decimals_by_chain(chain: ChainKind) -> (&'static str, u32) { + match chain { + ChainKind::Eth => ("ethereum", 18), + ChainKind::Near => ("near", 24), + ChainKind::Sol => ("solana", 9), + ChainKind::Arb => ("arbitrum", 18), + ChainKind::Base => ("base", 18), + } } -pub async fn is_fee_sufficient(jsonrpc_client: &JsonRpcClient, sender: &OmniAddress, recipient: &OmniAddress, token: &AccountId, fee: u128) -> Result { - let token_price = get_price_by_contract_address("near-protocol", token.as_ref()).await?; - let token_decimals = get_token_decimals(jsonrpc_client, token).await?; - - let given_fee = fee as f64 / 10u128.pow(token_decimals) as f64 * token_price; +async fn calculate_price(amount: u128, symbol: &str, decimals: u32) -> Result { + Ok(amount as f64 / 10u128.pow(decimals) as f64 * get_price_by_symbol(symbol).await?) +} - // TODO: Right now I chose a random fee (around 0.10 USD), but it should be calculated based on the chain in the future - let sender_fee = match sender { - OmniAddress::Near(_) => 0.03 * get_price_by_symbol("near").await?, - OmniAddress::Eth(_) => 0.00005 * get_price_by_symbol("ethereum").await?, - OmniAddress::Sol(_) => 0.001 * get_price_by_symbol("solana").await?, - OmniAddress::Arb(_) | OmniAddress::Base(_) => todo!() - }; - let recipient_fee = match recipient { - OmniAddress::Near(_) => 0.03 * get_price_by_symbol("near").await?, - OmniAddress::Eth(_) => 0.00005 * get_price_by_symbol("ethereum").await?, - OmniAddress::Sol(_) => 0.001 * get_price_by_symbol("solana").await?, - OmniAddress::Arb(_) | OmniAddress::Base(_) => todo!() +pub async fn is_fee_sufficient( + config: &config::Config, + jsonrpc_client: &JsonRpcClient, + sender: &OmniAddress, + recipient: &OmniAddress, + token: &AccountId, + fee: &Fee, +) -> Result { + let (sender_symbol, sender_token_decimals) = + get_symbol_and_decimals_by_chain(sender.get_chain()); + let (recipient_symbol, recipient_token_decimals) = + get_symbol_and_decimals_by_chain(recipient.get_chain()); + + let native_fee_usd = + calculate_price(fee.native_fee.0, sender_symbol, sender_token_decimals).await?; + + let fee_token_decimals = get_token_decimals(jsonrpc_client, token).await?; + let token_fee_usd = calculate_price(fee.fee.0, token.as_ref(), fee_token_decimals).await?; + + let expected_recipient_fee_usd = match recipient { + OmniAddress::Eth(_) => { + let http_provider = ProviderBuilder::new().on_http( + config + .evm + .rpc_http_url + .parse() + .context("Failed to parse ETH rpc provider as url")?, + ); + calculate_price( + config.evm.fin_transfer_gas_estimation as u128 + * http_provider.get_gas_price().await?, + recipient_symbol, + recipient_token_decimals, + ) + .await? + } + OmniAddress::Near(address) => { + if storage::has_storage_deposit(jsonrpc_client, token, &address.parse::()?) + .await? + { + 0.0 + } else { + calculate_price( + storage::NEP141_STORAGE_DEPOSIT, + recipient_symbol, + recipient_token_decimals, + ) + .await? + } + } + OmniAddress::Sol(_) => todo!(), + OmniAddress::Arb(_) => todo!(), + OmniAddress::Base(_) => todo!(), }; - Ok(sender_fee + recipient_fee <= given_fee) + Ok(native_fee_usd + token_fee_usd >= expected_recipient_fee_usd) } diff --git a/omni-relayer/src/utils/near.rs b/omni-relayer/src/utils/near.rs index 7a7cbb04..ca3fc0f8 100644 --- a/omni-relayer/src/utils/near.rs +++ b/omni-relayer/src/utils/near.rs @@ -1,5 +1,5 @@ use anyhow::Result; -use log::{info, warn}; +use log::info; use near_jsonrpc_client::{ methods::{self, block::RpcBlockRequest}, @@ -64,7 +64,6 @@ pub async fn get_eth_light_client_last_block_number( pub async fn handle_streamer_message( config: &config::Config, redis_connection: &mut redis::aio::MultiplexedConnection, - jsonrpc_client: &JsonRpcClient, streamer_message: &StreamerMessage, ) { let nep_locker_event_outcomes = find_nep_locker_event_outcomes(config, streamer_message); @@ -85,32 +84,17 @@ pub async fn handle_streamer_message( | Nep141LockerEvent::UpdateFeeEvent { ref transfer_message, } => { - match utils::fee::is_fee_sufficient( - jsonrpc_client, - &transfer_message.sender, - &transfer_message.recipient, - &transfer_message.token, - transfer_message.fee.fee.into(), + utils::redis::add_event( + redis_connection, + utils::redis::NEAR_INIT_TRANSFER_QUEUE, + transfer_message.origin_nonce.0.to_string(), + crate::workers::near::InitTransferWithTimestamp { + event: log, + creation_timestamp: chrono::Utc::now().timestamp(), + last_update_timestamp: None, + }, ) - .await - { - Ok(res) => { - if res { - utils::redis::add_event( - redis_connection, - utils::redis::NEAR_INIT_TRANSFER_QUEUE, - transfer_message.origin_nonce.0.to_string(), - log, - ) - .await; - } else { - warn!("Fee is not sufficient for transfer: {:?}", transfer_message); - } - } - Err(err) => { - warn!("Failed to check fee: {}", err); - } - } + .await; } Nep141LockerEvent::SignTransferEvent { ref message_payload, @@ -129,32 +113,17 @@ pub async fn handle_streamer_message( ref transfer_message, } => { if nonce.is_some() { - match utils::fee::is_fee_sufficient( - jsonrpc_client, - &transfer_message.sender, - &transfer_message.recipient, - &transfer_message.token, - transfer_message.fee.fee.into(), + utils::redis::add_event( + redis_connection, + utils::redis::NEAR_INIT_TRANSFER_QUEUE, + transfer_message.origin_nonce.0.to_string(), + crate::workers::near::InitTransferWithTimestamp { + event: log, + creation_timestamp: chrono::Utc::now().timestamp(), + last_update_timestamp: None, + }, ) - .await - { - Ok(res) => { - if res { - utils::redis::add_event( - redis_connection, - utils::redis::NEAR_INIT_TRANSFER_QUEUE, - transfer_message.origin_nonce.0.to_string(), - log, - ) - .await; - } else { - warn!("Fee is not sufficient for transfer: {:?}", transfer_message); - } - } - Err(err) => { - warn!("Failed to check fee: {}", err); - } - } + .await; } else { utils::redis::add_event( redis_connection, diff --git a/omni-relayer/src/utils/redis.rs b/omni-relayer/src/utils/redis.rs index 93f6fb99..29be650d 100644 --- a/omni-relayer/src/utils/redis.rs +++ b/omni-relayer/src/utils/redis.rs @@ -12,21 +12,24 @@ pub const ETH_WITHDRAW_EVENTS: &str = "eth_withdraw_events"; pub const FINALIZED_TRANSFERS: &str = "finalized_transfers"; +pub const KEEP_INSUFFICIENT_FEE_TRANSFERS_FOR: i64 = 60 * 60 * 24 * 14; // 14 days +pub const CHECK_INSUFFICIENT_FEE_TRANSFERS_EVERY_SECS: i64 = 60 * 30; // 30 minutes + pub const SLEEP_TIME_AFTER_EVENTS_PROCESS_SECS: u64 = 10; -const RETRY_ATTEMPTS: u64 = 10; -const RETRY_SLEEP_SECS: u64 = 1; +const QUERY_RETRY_ATTEMPTS: u64 = 10; +const QUERY_RETRY_SLEEP_SECS: u64 = 1; pub async fn get_last_processed_block( redis_connection: &mut MultiplexedConnection, key: &str, ) -> Option { - for _ in 0..RETRY_ATTEMPTS { + for _ in 0..QUERY_RETRY_ATTEMPTS { if let Ok(res) = redis_connection.get::<&str, u64>(key).await { return Some(res); } - tokio::time::sleep(tokio::time::Duration::from_secs(RETRY_SLEEP_SECS)).await; + tokio::time::sleep(tokio::time::Duration::from_secs(QUERY_RETRY_SLEEP_SECS)).await; } warn!("Failed to get last processed block from redis db"); @@ -38,7 +41,7 @@ pub async fn update_last_processed_block( key: &str, value: u64, ) { - for _ in 0..RETRY_ATTEMPTS { + for _ in 0..QUERY_RETRY_ATTEMPTS { if redis_connection .set::<&str, u64, ()>(key, value) .await @@ -47,7 +50,7 @@ pub async fn update_last_processed_block( return; } - tokio::time::sleep(tokio::time::Duration::from_secs(RETRY_SLEEP_SECS)).await; + tokio::time::sleep(tokio::time::Duration::from_secs(QUERY_RETRY_SLEEP_SECS)).await; } warn!("Failed to update last processed block in redis db"); @@ -57,7 +60,7 @@ pub async fn get_events( redis_connection: &mut MultiplexedConnection, key: String, ) -> Option> { - for _ in 0..RETRY_ATTEMPTS { + for _ in 0..QUERY_RETRY_ATTEMPTS { if let Ok(mut iter) = redis_connection .hscan::(key.clone()) .await @@ -71,7 +74,7 @@ pub async fn get_events( return Some(events); } - tokio::time::sleep(tokio::time::Duration::from_secs(RETRY_SLEEP_SECS)).await; + tokio::time::sleep(tokio::time::Duration::from_secs(QUERY_RETRY_SLEEP_SECS)).await; } warn!("Failed to get events from redis db"); @@ -92,7 +95,7 @@ pub async fn add_event( return; }; - for _ in 0..RETRY_ATTEMPTS { + for _ in 0..QUERY_RETRY_ATTEMPTS { if redis_connection .hset::<&str, F, String, ()>(key, field.clone(), serialized_event.clone()) .await @@ -101,7 +104,7 @@ pub async fn add_event( return; } - tokio::time::sleep(tokio::time::Duration::from_secs(RETRY_SLEEP_SECS)).await; + tokio::time::sleep(tokio::time::Duration::from_secs(QUERY_RETRY_SLEEP_SECS)).await; } warn!("Failed to add event to redis db"); @@ -111,7 +114,7 @@ pub async fn remove_event(redis_connection: &mut MultiplexedConnection, key: where F: redis::ToRedisArgs + Clone + Send + Sync, { - for _ in 0..RETRY_ATTEMPTS { + for _ in 0..QUERY_RETRY_ATTEMPTS { if redis_connection .hdel::<&str, F, ()>(key, field.clone()) .await @@ -120,7 +123,7 @@ where return; } - tokio::time::sleep(tokio::time::Duration::from_secs(RETRY_SLEEP_SECS)).await; + tokio::time::sleep(tokio::time::Duration::from_secs(QUERY_RETRY_SLEEP_SECS)).await; } warn!("Failed to remove event from redis db"); diff --git a/omni-relayer/src/utils/storage.rs b/omni-relayer/src/utils/storage.rs index 832bc03b..625f6c56 100644 --- a/omni-relayer/src/utils/storage.rs +++ b/omni-relayer/src/utils/storage.rs @@ -7,7 +7,7 @@ use near_primitives::{ views::QueryRequest, }; -const NEP141_STORAGE_DEPOSIT: u128 = 1_250_000_000_000_000_000_000; +pub const NEP141_STORAGE_DEPOSIT: u128 = 1_250_000_000_000_000_000_000; #[derive(Debug, serde::Deserialize)] struct StorageBalance { diff --git a/omni-relayer/src/workers/evm.rs b/omni-relayer/src/workers/evm.rs index f83c2f07..4183f858 100644 --- a/omni-relayer/src/workers/evm.rs +++ b/omni-relayer/src/workers/evm.rs @@ -2,6 +2,7 @@ use std::sync::Arc; use alloy::rpc::types::{Log, TransactionReceipt}; use anyhow::Result; +use borsh::BorshDeserialize; use ethereum_types::H256; use futures::future::join_all; use log::{error, info, warn}; @@ -12,11 +13,20 @@ use omni_types::{ locker_args::{FinTransferArgs, StorageDepositArgs}, near_events::Nep141LockerEvent, prover_result::ProofKind, - ChainKind, OmniAddress, + ChainKind, Fee, OmniAddress, H160, }; use crate::{config, utils}; +#[derive(Debug, serde::Serialize, serde::Deserialize)] +pub struct InitTransferWithTimestamp { + pub block_number: u64, + pub log: Log, + pub tx_logs: Option, + pub creation_timestamp: i64, + pub last_update_timestamp: Option, +} + pub async fn finalize_transfer( config: config::Config, redis_client: redis::Client, @@ -27,9 +37,9 @@ pub async fn finalize_transfer( let redis_connection = redis_client.get_multiplexed_tokio_connection().await?; loop { - let mut redis_connection_clone = redis_connection.clone(); + let mut redis_connection = redis_connection.clone(); let Some(events) = utils::redis::get_events( - &mut redis_connection_clone, + &mut redis_connection, utils::redis::ETH_WITHDRAW_EVENTS.to_string(), ) .await @@ -43,59 +53,59 @@ pub async fn finalize_transfer( let mut handlers = Vec::new(); for (key, event) in events { - if let Ok((block_number, log, tx_logs)) = - serde_json::from_str::<(u64, Log, Option)>(&event) + if let Ok(init_transfer_with_timestamp) = + serde_json::from_str::(&event) { - let vaa = utils::evm::get_vaa(tx_logs, &log, &config).await; - - if vaa.is_none() { - let Ok(light_client_latest_block_number) = - utils::near::get_eth_light_client_last_block_number( - &config, - &jsonrpc_client, - ) - .await - else { - warn!("Failed to get eth light client last block number"); - continue; - }; - - if block_number > light_client_latest_block_number { - tokio::time::sleep(tokio::time::Duration::from_secs( - utils::redis::SLEEP_TIME_AFTER_EVENTS_PROCESS_SECS, - )) - .await; - continue; - } - } - - let Ok(init_log) = log.log_decode::() else { - warn!("Failed to decode log as InitTransfer: {:?}", log); - continue; - }; - handlers.push(tokio::spawn({ let config = config.clone(); - let mut redis_connection = redis_connection.clone(); let connector = connector.clone(); let jsonrpc_client = jsonrpc_client.clone(); + let mut redis_connection = redis_connection.clone(); let near_signer = near_signer.clone(); async move { - info!("Received InitTransfer log"); + let current_timestamp = chrono::Utc::now().timestamp(); - let Some(tx_hash) = log.transaction_hash else { - warn!("No transaction hash in log: {:?}", log); + if current_timestamp + - init_transfer_with_timestamp + .last_update_timestamp + .unwrap_or_default() + < utils::redis::CHECK_INSUFFICIENT_FEE_TRANSFERS_EVERY_SECS + { return; - }; + } - let Some(topic) = log.topic0() else { - warn!("No topic0 in log: {:?}", log); + let Ok(init_log) = init_transfer_with_timestamp + .log + .log_decode::() + else { + warn!( + "Failed to decode log as InitTransfer: {:?}", + init_transfer_with_timestamp.log + ); return; }; - let tx_hash = H256::from_slice(tx_hash.as_slice()); + info!("Received InitTransfer log"); + + let Some(tx_hash) = init_transfer_with_timestamp.log.transaction_hash + else { + warn!("No transaction hash in log: {:?}", init_log); + return; + }; + let Ok(sender) = H160::try_from_slice(init_log.inner.sender.as_slice()) + else { + warn!("Failed to construct `H160` from sender address"); + return; + }; + let Ok(recipient) = init_log.inner.recipient.parse::() else { + warn!( + "Failed to parse recipient as OmniAddress: {:?}", + init_log.inner.recipient + ); + return; + }; let Ok(token) = init_log.inner.token.parse::() else { warn!( "Failed to parse token as AccountId: {:?}", @@ -103,14 +113,105 @@ pub async fn finalize_transfer( ); return; }; - let Ok(recipient) = init_log.inner.recipient.parse::() else { + + if current_timestamp - init_transfer_with_timestamp.creation_timestamp + > utils::redis::KEEP_INSUFFICIENT_FEE_TRANSFERS_FOR + { warn!( - "Failed to parse recipient as OmniAddress: {:?}", - init_log.inner.recipient + "Removing an old InitTransfer: {:?}", + init_transfer_with_timestamp ); + utils::redis::remove_event( + &mut redis_connection, + utils::redis::ETH_WITHDRAW_EVENTS, + &key, + ) + .await; return; + } + + let is_fee_sufficient = match utils::fee::is_fee_sufficient( + &config, + &jsonrpc_client, + &OmniAddress::Eth(sender), + &recipient, + &token, + &Fee { + fee: init_log.inner.fee.into(), + native_fee: init_log.inner.nativeFee.into(), + }, + ) + .await + { + Ok(is_fee_sufficient) => { + if !is_fee_sufficient { + warn!("Fee is not sufficient for transfer: {:?}", init_log); + } + + is_fee_sufficient + } + Err(err) => { + warn!("Failed to check fee: {}", err); + + false + } }; + if !is_fee_sufficient { + utils::redis::add_event( + &mut redis_connection, + utils::redis::ETH_WITHDRAW_EVENTS, + tx_hash.to_string(), + InitTransferWithTimestamp { + block_number: init_transfer_with_timestamp.block_number, + log: init_transfer_with_timestamp.log, + tx_logs: init_transfer_with_timestamp.tx_logs, + creation_timestamp: init_transfer_with_timestamp + .creation_timestamp, + last_update_timestamp: Some(current_timestamp), + }, + ) + .await; + return; + } + + let vaa = utils::evm::get_vaa( + init_transfer_with_timestamp.tx_logs, + &init_transfer_with_timestamp.log, + &config, + ) + .await; + + if vaa.is_none() { + let Ok(light_client_latest_block_number) = + utils::near::get_eth_light_client_last_block_number( + &config, + &jsonrpc_client, + ) + .await + else { + warn!("Failed to get eth light client last block number"); + return; + }; + + if init_transfer_with_timestamp.block_number + > light_client_latest_block_number + { + tokio::time::sleep(tokio::time::Duration::from_secs( + utils::redis::SLEEP_TIME_AFTER_EVENTS_PROCESS_SECS, + )) + .await; + return; + } + } + + 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, diff --git a/omni-relayer/src/workers/near.rs b/omni-relayer/src/workers/near.rs index ec8b3e81..c22ae4df 100644 --- a/omni-relayer/src/workers/near.rs +++ b/omni-relayer/src/workers/near.rs @@ -6,6 +6,7 @@ use ethereum_types::H256; use futures::future::join_all; use log::{error, info, warn}; +use near_jsonrpc_client::JsonRpcClient; use omni_connector::OmniConnector; use omni_types::{ locker_args::ClaimFeeArgs, near_events::Nep141LockerEvent, prover_result::ProofKind, ChainKind, @@ -13,10 +14,18 @@ use omni_types::{ use crate::{config, utils}; +#[derive(Debug, serde::Serialize, serde::Deserialize)] +pub struct InitTransferWithTimestamp { + pub event: Nep141LockerEvent, + pub creation_timestamp: i64, + pub last_update_timestamp: Option, +} + pub async fn sign_transfer( config: config::Config, redis_client: redis::Client, connector: Arc, + jsonrpc_client: JsonRpcClient, ) -> Result<()> { let redis_connection = redis_client.get_multiplexed_tokio_connection().await?; @@ -37,35 +46,109 @@ pub async fn sign_transfer( let mut handlers = Vec::new(); for (key, event) in events { - if let Ok(event) = serde_json::from_str::(&event) { + if let Ok(init_transfer_with_timestamp) = + serde_json::from_str::(&event) + { handlers.push(tokio::spawn({ let config = config.clone(); let mut redis_connection = redis_connection.clone(); let connector = connector.clone(); + let jsonrpc_client = jsonrpc_client.clone(); async move { - let (Nep141LockerEvent::InitTransferEvent { transfer_message } + let current_timestamp = chrono::Utc::now().timestamp(); + + if current_timestamp + - init_transfer_with_timestamp + .last_update_timestamp + .unwrap_or_default() + < utils::redis::CHECK_INSUFFICIENT_FEE_TRANSFERS_EVERY_SECS + { + return; + } + + let (Nep141LockerEvent::InitTransferEvent { + ref transfer_message, + } | Nep141LockerEvent::FinTransferEvent { - transfer_message, .. - }) = event + ref transfer_message, + .. + } + | Nep141LockerEvent::UpdateFeeEvent { + ref transfer_message, + }) = init_transfer_with_timestamp.event else { warn!( - "Expected InitTransferEvent/FinTransferEvent, got: {:?}", + "Expected InitTransferEvent/FinTransferEvent/UpdateFeeEvent, got: {:?}", event ); return; }; info!( - "Received InitTransferEvent/FinTransferEvent: {}", - transfer_message.origin_nonce.0 + "Received InitTransferEvent/FinTransferEvent/UpdateFeeEvent", ); + if current_timestamp - init_transfer_with_timestamp.creation_timestamp + > utils::redis::KEEP_INSUFFICIENT_FEE_TRANSFERS_FOR + { + warn!( + "Removing an old InitTransfer: {:?}", + init_transfer_with_timestamp + ); + utils::redis::remove_event( + &mut redis_connection, + utils::redis::NEAR_INIT_TRANSFER_QUEUE, + &key, + ) + .await; + return; + } + + let is_fee_sufficient = match utils::fee::is_fee_sufficient( + &config, + &jsonrpc_client, + &transfer_message.sender, + &transfer_message.recipient, + &transfer_message.token, + &transfer_message.fee, + ) + .await + { + Ok(is_fee_sufficient) => { + if !is_fee_sufficient { + warn!("Fee is not sufficient for transfer: {:?}", init_transfer_with_timestamp.event); + } + + is_fee_sufficient + } + Err(err) => { + warn!("Failed to check fee: {}", err); + + false + } + }; + + if !is_fee_sufficient { + utils::redis::add_event( + &mut redis_connection, + utils::redis::NEAR_INIT_TRANSFER_QUEUE, + transfer_message.origin_nonce.0.to_string(), + InitTransferWithTimestamp { + event: init_transfer_with_timestamp.event, + creation_timestamp: init_transfer_with_timestamp.creation_timestamp, + last_update_timestamp: Some(current_timestamp), + }, + ) + .await; + return; + } + match connector .sign_transfer( transfer_message.origin_nonce.into(), Some(config.near.token_locker_id), - Some(transfer_message.fee), + Some(transfer_message.fee.clone()), ) .await { @@ -160,6 +243,13 @@ pub async fn finalize_transfer( } } +#[derive(Debug, serde::Serialize, serde::Deserialize)] +pub struct FinTransfer { + pub block_number: u64, + pub log: Log, + pub tx_logs: Option, +} + pub async fn claim_fee( config: config::Config, redis_client: redis::Client, @@ -186,10 +276,9 @@ pub async fn claim_fee( let mut handlers = Vec::new(); for (key, event) in events { - if let Ok((block_number, log, tx_logs)) = - serde_json::from_str::<(u64, Log, Option)>(&event) - { - let vaa = utils::evm::get_vaa(tx_logs, &log, &config).await; + if let Ok(fin_transfer) = serde_json::from_str::(&event) { + let vaa = + utils::evm::get_vaa(fin_transfer.tx_logs, &fin_transfer.log, &config).await; if vaa.is_none() { let Ok(light_client_latest_block_number) = @@ -203,7 +292,7 @@ pub async fn claim_fee( continue; }; - if block_number > light_client_latest_block_number { + if fin_transfer.block_number > light_client_latest_block_number { tokio::time::sleep(tokio::time::Duration::from_secs( utils::redis::SLEEP_TIME_AFTER_EVENTS_PROCESS_SECS, )) @@ -220,13 +309,13 @@ pub async fn claim_fee( async move { info!("Received finalized transfer"); - let Some(tx_hash) = log.transaction_hash else { - warn!("No transaction hash in log: {:?}", log); + let Some(tx_hash) = fin_transfer.log.transaction_hash else { + warn!("No transaction hash in log: {:?}", fin_transfer.log); return; }; - let Some(topic) = log.topic0() else { - warn!("No topic0 in log: {:?}", log); + let Some(topic) = fin_transfer.log.topic0() else { + warn!("No topic0 in log: {:?}", fin_transfer.log); return; }; From 26e5414b66f53fb065d17a980bb897fed5eb7ba8 Mon Sep 17 00:00:00 2001 From: Ivan Frolov <59515280+frolvanya@users.noreply.github.com> Date: Fri, 6 Dec 2024 18:50:08 -0500 Subject: [PATCH 06/21] feat: support of multiple chains (#146) * feat: scratch implementation of supporting multiple chains * chore: removed claiming native fee on EVM chain * chore: updated example configuration * fix: getting vaa * feat: working version of relayer with multiple chains support * feat: call proper `fin_transfer` based on recipient chain * refactor: reduced code duplication by abstracting evm indexer * feat: removed `sign_claim_native_fee` logic * chore: removed few newlines * refactor: reduced code duplication in config structs * feat: getting native token id by calling a method * chore: added a disclaimer that `get_native_token_id` is not working for now * feat: made evm chains optional * feat: refactor evm bridge clients initialization --- omni-relayer/Cargo.lock | 4568 +++++++++++++++++++++++----- omni-relayer/Cargo.toml | 15 +- omni-relayer/example-config.toml | 32 +- omni-relayer/src/config.rs | 50 +- omni-relayer/src/main.rs | 55 +- omni-relayer/src/startup/evm.rs | 91 +- omni-relayer/src/startup/mod.rs | 68 +- omni-relayer/src/utils/evm.rs | 159 +- omni-relayer/src/utils/fee.rs | 127 - omni-relayer/src/utils/mod.rs | 3 - omni-relayer/src/utils/near.rs | 74 +- omni-relayer/src/utils/redis.rs | 9 +- omni-relayer/src/utils/storage.rs | 45 - omni-relayer/src/utils/wormhole.rs | 20 - omni-relayer/src/workers/evm.rs | 606 ++-- omni-relayer/src/workers/near.rs | 153 +- 16 files changed, 4485 insertions(+), 1590 deletions(-) delete mode 100644 omni-relayer/src/utils/fee.rs delete mode 100644 omni-relayer/src/utils/storage.rs delete mode 100644 omni-relayer/src/utils/wormhole.rs diff --git a/omni-relayer/Cargo.lock b/omni-relayer/Cargo.lock index 62861451..63d492e4 100644 --- a/omni-relayer/Cargo.lock +++ b/omni-relayer/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "Inflector" @@ -34,7 +34,7 @@ dependencies = [ "pin-project-lite", "smallvec", "tokio", - "tokio-util 0.7.12", + "tokio-util 0.7.13", ] [[package]] @@ -44,7 +44,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -65,7 +65,7 @@ checksum = "b6ac1e58cded18cb28ddc17143c4dea5345b3ad575e14f32f66e4054a56eb271" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -92,6 +92,16 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +[[package]] +name = "aead" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" +dependencies = [ + "crypto-common", + "generic-array 0.14.7", +] + [[package]] name = "aes" version = "0.8.4" @@ -103,6 +113,21 @@ dependencies = [ "cpufeatures", ] +[[package]] +name = "aes-gcm-siv" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae0784134ba9375416d469ec31e7c5f9fa94405049cf08c5ce5b4698be673e0d" +dependencies = [ + "aead", + "aes", + "cipher 0.4.4", + "ctr", + "polyval", + "subtle", + "zeroize", +] + [[package]] name = "ahash" version = "0.7.8" @@ -121,6 +146,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if 1.0.0", + "getrandom 0.2.15", "once_cell", "version_check", "zerocopy", @@ -135,17 +161,32 @@ dependencies = [ "memchr", ] +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] + [[package]] name = "allocator-api2" -version = "0.2.18" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "alloy" -version = "0.4.2" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "056f2c01b2aed86e15b43c47d109bfc8b82553dc34e66452875e51247ec31ab2" +checksum = "b5b524b8c28a7145d1fe4950f84360b5de3e307601679ff0558ddc20ea229399" dependencies = [ "alloy-consensus", "alloy-contract", @@ -168,9 +209,9 @@ dependencies = [ [[package]] name = "alloy-chains" -version = "0.1.46" +version = "0.1.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836cf02383d9ebb35502d379bcd1ae803155094077eaab9c29131d888cd5fa3e" +checksum = "a0161082e0edd9013d23083465cc04b20e44b7a15646d36ba7b0cdb7cd6fe18f" dependencies = [ "alloy-primitives", "num_enum", @@ -179,9 +220,9 @@ dependencies = [ [[package]] name = "alloy-consensus" -version = "0.4.2" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "705687d5bfd019fee57cf9e206b27b30a9a9617535d5590a02b171e813208f8e" +checksum = "ae09ffd7c29062431dd86061deefe4e3c6f07fa0d674930095f8dcedb0baf02c" dependencies = [ "alloy-eips", "alloy-primitives", @@ -195,9 +236,9 @@ dependencies = [ [[package]] name = "alloy-contract" -version = "0.4.2" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "917f7d12cf3971dc8c11c9972f732b35ccb9aaaf5f28f2f87e9e6523bee3a8ad" +checksum = "66430a72d5bf5edead101c8c2f0a24bada5ec9f3cf9909b3e08b6d6899b4803e" dependencies = [ "alloy-dyn-abi", "alloy-json-abi", @@ -211,14 +252,14 @@ dependencies = [ "alloy-transport", "futures", "futures-util", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "alloy-core" -version = "0.8.10" +version = "0.8.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b72bf30967a232bec83809bea1623031f6285a013096229330c68c406192a4ca" +checksum = "c3d14d531c99995de71558e8e2206c27d709559ee8e5a0452b965ea82405a013" dependencies = [ "alloy-dyn-abi", "alloy-json-abi", @@ -229,9 +270,9 @@ dependencies = [ [[package]] name = "alloy-dyn-abi" -version = "0.8.10" +version = "0.8.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5228b189b18b85761340dc9eaac0141148a8503657b36f9bc3a869413d987ca" +checksum = "80759b3f57b3b20fa7cd8fef6479930fc95461b58ff8adea6e87e618449c8a1d" dependencies = [ "alloy-json-abi", "alloy-primitives", @@ -257,20 +298,21 @@ dependencies = [ [[package]] name = "alloy-eip7702" -version = "0.1.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea59dc42102bc9a1905dc57901edc6dd48b9f38115df86c7d252acba70d71d04" +checksum = "4c986539255fb839d1533c128e190e557e52ff652c9ef62939e233a81dd93f7e" dependencies = [ "alloy-primitives", "alloy-rlp", + "derive_more 1.0.0", "serde", ] [[package]] name = "alloy-eips" -version = "0.4.2" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ffb906284a1e1f63c4607da2068c8197458a352d0b3e9796e67353d72a9be85" +checksum = "5b6aa3961694b30ba53d41006131a2fca3bdab22e4c344e46db2c639e7c2dfdd" dependencies = [ "alloy-eip2930", "alloy-eip7702", @@ -281,14 +323,14 @@ dependencies = [ "derive_more 1.0.0", "once_cell", "serde", - "sha2", + "sha2 0.10.8", ] [[package]] name = "alloy-genesis" -version = "0.4.2" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8429cf4554eed9b40feec7f4451113e76596086447550275e3def933faf47ce3" +checksum = "e53f7877ded3921d18a0a9556d55bedf84535567198c9edab2aa23106da91855" dependencies = [ "alloy-primitives", "alloy-serde", @@ -297,9 +339,9 @@ dependencies = [ [[package]] name = "alloy-json-abi" -version = "0.8.10" +version = "0.8.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31a0f0d51db8a1a30a4d98a9f90e090a94c8f44cb4d9eafc7e03aa6d00aae984" +checksum = "ac4b22b3e51cac09fd2adfcc73b55f447b4df669f983c13f7894ec82b607c63f" dependencies = [ "alloy-primitives", "alloy-sol-type-parser", @@ -309,23 +351,23 @@ dependencies = [ [[package]] name = "alloy-json-rpc" -version = "0.4.2" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8fa8a1a3c4cbd221f2b8e3693aeb328fca79a757fe556ed08e47bbbc2a70db7" +checksum = "3694b7e480728c0b3e228384f223937f14c10caef5a4c766021190fc8f283d35" dependencies = [ "alloy-primitives", "alloy-sol-types", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", "tracing", ] [[package]] name = "alloy-network" -version = "0.4.2" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85fa23a6a9d612b52e402c995f2d582c25165ec03ac6edf64c861a76bc5b87cd" +checksum = "ea94b8ceb5c75d7df0a93ba0acc53b55a22b47b532b600a800a87ef04eb5b0b4" dependencies = [ "alloy-consensus", "alloy-eips", @@ -339,14 +381,16 @@ dependencies = [ "async-trait", "auto_impl", "futures-utils-wasm", - "thiserror", + "serde", + "serde_json", + "thiserror 1.0.69", ] [[package]] name = "alloy-network-primitives" -version = "0.4.2" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "801492711d4392b2ccf5fc0bc69e299fa1aab15167d74dcaa9aab96a54f684bd" +checksum = "df9f3e281005943944d15ee8491534a1c7b3cbf7a7de26f8c433b842b93eb5f9" dependencies = [ "alloy-consensus", "alloy-eips", @@ -357,9 +401,9 @@ dependencies = [ [[package]] name = "alloy-node-bindings" -version = "0.4.2" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f1334a738aa1710cb8227441b3fcc319202ce78e967ef37406940242df4a454" +checksum = "c9805d126f24be459b958973c0569c73e1aadd27d4535eee82b2b6764aa03616" dependencies = [ "alloy-genesis", "alloy-primitives", @@ -367,16 +411,16 @@ dependencies = [ "rand 0.8.5", "serde_json", "tempfile", - "thiserror", + "thiserror 1.0.69", "tracing", "url", ] [[package]] name = "alloy-primitives" -version = "0.8.10" +version = "0.8.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8edae627382349b56cd6a7a2106f4fd69b243a9233e560c55c2e03cabb7e1d3c" +checksum = "9db948902dfbae96a73c2fbf1f7abec62af034ab883e4c777c3fd29702bd6e2c" dependencies = [ "alloy-rlp", "bytes", @@ -384,9 +428,9 @@ dependencies = [ "const-hex", "derive_more 1.0.0", "foldhash", - "hashbrown 0.15.0", + "hashbrown 0.15.2", "hex-literal", - "indexmap 2.6.0", + "indexmap 2.7.0", "itoa", "k256", "keccak-asm", @@ -394,7 +438,7 @@ dependencies = [ "proptest", "rand 0.8.5", "ruint", - "rustc-hash 2.0.0", + "rustc-hash 2.1.0", "serde", "sha3", "tiny-keccak", @@ -402,9 +446,9 @@ dependencies = [ [[package]] name = "alloy-provider" -version = "0.4.2" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcfaa4ffec0af04e3555686b8aacbcdf7d13638133a0672749209069750f78a6" +checksum = "40c1f9eede27bf4c13c099e8e64d54efd7ce80ef6ea47478aa75d5d74e2dba3b" dependencies = [ "alloy-chains", "alloy-consensus", @@ -418,6 +462,7 @@ dependencies = [ "alloy-rpc-client", "alloy-rpc-types-anvil", "alloy-rpc-types-eth", + "alloy-signer", "alloy-signer-local", "alloy-transport", "alloy-transport-http", @@ -425,25 +470,28 @@ dependencies = [ "async-stream", "async-trait", "auto_impl", - "dashmap", + "dashmap 6.1.0", "futures", "futures-utils-wasm", "lru 0.12.5", + "parking_lot 0.12.3", "pin-project", "reqwest 0.12.9", + "schnellru", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", "tokio", "tracing", "url", + "wasmtimer", ] [[package]] name = "alloy-pubsub" -version = "0.4.2" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f32cef487122ae75c91eb50154c70801d71fabdb976fec6c49e0af5e6486ab15" +checksum = "90f1f34232f77341076541c405482e4ae12f0ee7153d8f9969fc1691201b2247" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -465,7 +513,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da0822426598f95e45dd1ea32a738dac057529a709ee645fcc516ffa4cbde08f" dependencies = [ "alloy-rlp-derive", - "arrayvec 0.7.6", + "arrayvec", "bytes", ] @@ -477,14 +525,14 @@ checksum = "2b09cae092c27b6f1bde952653a22708691802e57bfef4a2973b80bea21efd3f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] name = "alloy-rpc-client" -version = "0.4.2" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "370143ed581aace6e663342d21d209c6b2e34ee6142f7d6675adb518deeaf0dc" +checksum = "374dbe0dc3abdc2c964f36b3d3edf9cdb3db29d16bda34aa123f03d810bec1dd" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -502,13 +550,14 @@ dependencies = [ "tower 0.5.1", "tracing", "url", + "wasmtimer", ] [[package]] name = "alloy-rpc-types" -version = "0.4.2" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ffc534b7919e18f35e3aa1f507b6f3d9d92ec298463a9f6beaac112809d8d06" +checksum = "c74832aa474b670309c20fffc2a869fa141edab7c79ff7963fad0a08de60bae1" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", @@ -518,20 +567,21 @@ dependencies = [ [[package]] name = "alloy-rpc-types-anvil" -version = "0.4.2" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d780adaa5d95b07ad92006b2feb68ecfa7e2015f7d5976ceaac4c906c73ebd07" +checksum = "5ca97963132f78ddfc60e43a017348e6d52eea983925c23652f5b330e8e02291" dependencies = [ "alloy-primitives", + "alloy-rpc-types-eth", "alloy-serde", "serde", ] [[package]] name = "alloy-rpc-types-eth" -version = "0.4.2" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413f4aa3ccf2c3e4234a047c5fa4727916d7daf25a89f9b765df0ba09784fd87" +checksum = "a8a477281940d82d29315846c7216db45b15e90bcd52309da9f54bcf7ad94a11" dependencies = [ "alloy-consensus", "alloy-eips", @@ -548,9 +598,9 @@ dependencies = [ [[package]] name = "alloy-serde" -version = "0.4.2" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dff0ab1cdd43ca001e324dc27ee0e8606bd2161d6623c63e0e0b8c4dfc13600" +checksum = "4dfa4a7ccf15b2492bb68088692481fd6b2604ccbee1d0d6c44c21427ae4df83" dependencies = [ "alloy-primitives", "serde", @@ -559,23 +609,23 @@ dependencies = [ [[package]] name = "alloy-signer" -version = "0.4.2" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fd4e0ad79c81a27ca659be5d176ca12399141659fef2bcbfdc848da478f4504" +checksum = "2e10aec39d60dc27edcac447302c7803d2371946fb737245320a05b78eb2fafd" dependencies = [ "alloy-primitives", "async-trait", "auto_impl", "elliptic-curve 0.13.8", "k256", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "alloy-signer-local" -version = "0.4.2" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "494e0a256f3e99f2426f994bcd1be312c02cb8f88260088dacb33a8b8936475f" +checksum = "d8396f6dff60700bc1d215ee03d86ff56de268af96e2bf833a14d0bafcab9882" dependencies = [ "alloy-consensus", "alloy-network", @@ -584,61 +634,61 @@ dependencies = [ "async-trait", "k256", "rand 0.8.5", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "alloy-sol-macro" -version = "0.8.10" +version = "0.8.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841eabaa4710f719fddbc24c95d386eae313f07e6da4babc25830ee37945be0c" +checksum = "3bfd7853b65a2b4f49629ec975fee274faf6dff15ab8894c620943398ef283c0" dependencies = [ "alloy-sol-macro-expander", "alloy-sol-macro-input", "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] name = "alloy-sol-macro-expander" -version = "0.8.10" +version = "0.8.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6672337f19d837b9f7073c45853aeb528ed9f7dd6a4154ce683e9e5cb7794014" +checksum = "82ec42f342d9a9261699f8078e57a7a4fda8aaa73c1a212ed3987080e6a9cd13" dependencies = [ "alloy-sol-macro-input", "const-hex", "heck 0.5.0", - "indexmap 2.6.0", + "indexmap 2.7.0", "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", "syn-solidity", "tiny-keccak", ] [[package]] name = "alloy-sol-macro-input" -version = "0.8.10" +version = "0.8.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dff37dd20bfb118b777c96eda83b2067f4226d2644c5cfa00187b3bc01770ba" +checksum = "ed2c50e6a62ee2b4f7ab3c6d0366e5770a21cad426e109c2f40335a1b3aff3df" dependencies = [ "const-hex", "dunce", "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", "syn-solidity", ] [[package]] name = "alloy-sol-type-parser" -version = "0.8.10" +version = "0.8.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b853d42292dbb159671a3edae3b2750277ff130f32b726fe07dc2b17aa6f2b5" +checksum = "ac17c6e89a50fb4a758012e4b409d9a0ba575228e69b539fe37d7a1bd507ca4a" dependencies = [ "serde", "winnow", @@ -646,9 +696,9 @@ dependencies = [ [[package]] name = "alloy-sol-types" -version = "0.8.10" +version = "0.8.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa828bb1b9a6dc52208fbb18084fb9ce2c30facc2bfda6a5d922349b4990354f" +checksum = "c9dc0fffe397aa17628160e16b89f704098bf3c9d74d5d369ebc239575936de5" dependencies = [ "alloy-json-abi", "alloy-primitives", @@ -659,9 +709,9 @@ dependencies = [ [[package]] name = "alloy-transport" -version = "0.4.2" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ac3e97dad3d31770db0fc89bd6a63b789fbae78963086733f960cf32c483904" +checksum = "f99acddb34000d104961897dbb0240298e8b775a7efffb9fda2a1a3efedd65b3" dependencies = [ "alloy-json-rpc", "base64 0.22.1", @@ -669,18 +719,19 @@ dependencies = [ "futures-utils-wasm", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", "tokio", "tower 0.5.1", "tracing", "url", + "wasmtimer", ] [[package]] name = "alloy-transport-http" -version = "0.4.2" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b367dcccada5b28987c2296717ee04b9a5637aacd78eacb1726ef211678b5212" +checksum = "5dc013132e34eeadaa0add7e74164c1503988bfba8bae885b32e0918ba85a8a6" dependencies = [ "alloy-json-rpc", "alloy-transport", @@ -693,15 +744,15 @@ dependencies = [ [[package]] name = "alloy-transport-ws" -version = "0.4.2" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7153b88690de6a50bba81c11e1d706bc41dbb90126d607404d60b763f6a3947f" +checksum = "abd170e600801116d5efe64f74a4fc073dbbb35c807013a7d0a388742aeebba0" dependencies = [ "alloy-pubsub", "alloy-transport", "futures", - "http 1.1.0", - "rustls 0.23.16", + "http 1.2.0", + "rustls 0.23.19", "serde_json", "tokio", "tokio-tungstenite 0.24.0", @@ -726,9 +777,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.17" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23a1e53f0f5d86382dafe1cf314783b2044280f406e7e1506368220ad11b1338" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" dependencies = [ "anstyle", "anstyle-parse", @@ -775,15 +826,15 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.92" +version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74f37166d7d48a0284b99dd824694c26119c700b53bf0d1540cdb147dbdaaf13" +checksum = "c1fd03a028ef38ba2276dce7e33fcd6369c158a1bca17946c4b1b701891c1ff7" [[package]] name = "arbitrary" -version = "1.3.2" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" +checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" dependencies = [ "derive_arbitrary", ] @@ -794,6 +845,34 @@ version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" +[[package]] +name = "ark-bn254" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a22f4561524cd949590d78d7d4c5df8f592430d221f7f3c9497bbafd8972120f" +dependencies = [ + "ark-ec", + "ark-ff 0.4.2", + "ark-std 0.4.0", +] + +[[package]] +name = "ark-ec" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" +dependencies = [ + "ark-ff 0.4.2", + "ark-poly", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "hashbrown 0.13.2", + "itertools 0.10.5", + "num-traits", + "zeroize", +] + [[package]] name = "ark-ff" version = "0.3.0" @@ -877,6 +956,19 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "ark-poly" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" +dependencies = [ + "ark-ff 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "hashbrown 0.13.2", +] + [[package]] name = "ark-serialize" version = "0.3.0" @@ -893,11 +985,23 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" dependencies = [ + "ark-serialize-derive", "ark-std 0.4.0", "digest 0.10.7", "num-bigint 0.4.6", ] +[[package]] +name = "ark-serialize-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "ark-std" version = "0.3.0" @@ -926,15 +1030,15 @@ checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" [[package]] name = "arrayvec" -version = "0.5.2" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] -name = "arrayvec" -version = "0.7.6" +name = "ascii" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +checksum = "eab1c04a571841102f5345a8fc0f6bb3d31c315dec879b5c6e42e40ce7ffa34e" [[package]] name = "ascii-canvas" @@ -945,12 +1049,87 @@ dependencies = [ "term", ] +[[package]] +name = "asn1-rs" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6fd5ddaf0351dff5b8da21b2fb4ff8e08ddd02857f0bf69c47639106c0fff0" +dependencies = [ + "asn1-rs-derive", + "asn1-rs-impl", + "displaydoc", + "nom", + "num-traits", + "rusticata-macros", + "thiserror 1.0.69", + "time", +] + +[[package]] +name = "asn1-rs-derive" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "726535892e8eae7e70657b4c8ea93d26b8553afb1ce617caee529ef96d7dee6c" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "synstructure 0.12.6", +] + +[[package]] +name = "asn1-rs-impl" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2777730b2039ac0f95f093556e61b6d26cebed5393ca6f152717777cec3a42ed" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "assert_matches" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" +[[package]] +name = "async-channel" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +dependencies = [ + "concurrent-queue", + "event-listener 2.5.3", + "futures-core", +] + +[[package]] +name = "async-compression" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df895a515f70646414f4b45c0b79082783b80552b373a68283012928df56f522" +dependencies = [ + "brotli", + "flate2", + "futures-core", + "memchr", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "async-lock" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +dependencies = [ + "event-listener 5.3.1", + "event-listener-strategy", + "pin-project-lite", +] + [[package]] name = "async-stream" version = "0.3.6" @@ -970,7 +1149,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -981,7 +1160,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -1009,7 +1188,7 @@ checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -1020,9 +1199,9 @@ checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "aws-config" -version = "1.5.9" +version = "1.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d6448cfb224dd6a9b9ac734f58622dd0d4751f3589f3b777345745f46b2eb14" +checksum = "9b49afaa341e8dd8577e1a2200468f98956d6eda50bcf4a53246cc00174ba924" dependencies = [ "aws-credential-types", "aws-runtime", @@ -1031,7 +1210,7 @@ dependencies = [ "aws-sdk-sts", "aws-smithy-async", "aws-smithy-http", - "aws-smithy-json", + "aws-smithy-json 0.60.7", "aws-smithy-runtime", "aws-smithy-runtime-api", "aws-smithy-types", @@ -1062,9 +1241,9 @@ dependencies = [ [[package]] name = "aws-runtime" -version = "1.4.3" +version = "1.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a10d5c055aa540164d9561a0e2e74ad30f0dcf7393c3a92f6733ddf9c5762468" +checksum = "b5ac934720fbb46206292d2c75b57e67acfc56fe7dfd34fb9a02334af08409ea" dependencies = [ "aws-credential-types", "aws-sigv4", @@ -1088,9 +1267,9 @@ dependencies = [ [[package]] name = "aws-sdk-s3" -version = "1.59.0" +version = "1.65.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f883bb1e349fa8343dc46336c252c0f32ceb6e81acb146aeef2e0f8afc9183e" +checksum = "d3ba2c5c0f2618937ce3d4a5ad574b86775576fa24006bcb3128c6e2cbf3c34e" dependencies = [ "aws-credential-types", "aws-runtime", @@ -1099,7 +1278,7 @@ dependencies = [ "aws-smithy-checksums", "aws-smithy-eventstream", "aws-smithy-http", - "aws-smithy-json", + "aws-smithy-json 0.61.1", "aws-smithy-runtime", "aws-smithy-runtime-api", "aws-smithy-types", @@ -1108,29 +1287,29 @@ dependencies = [ "bytes", "fastrand", "hex", - "hmac", + "hmac 0.12.1", "http 0.2.12", "http-body 0.4.6", "lru 0.12.5", "once_cell", "percent-encoding", "regex-lite", - "sha2", + "sha2 0.10.8", "tracing", "url", ] [[package]] name = "aws-sdk-sso" -version = "1.48.0" +version = "1.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded855583fa1d22e88fe39fd6062b062376e50a8211989e07cf5e38d52eb3453" +checksum = "05ca43a4ef210894f93096039ef1d6fa4ad3edfabb3be92b80908b9f2e4b4eab" dependencies = [ "aws-credential-types", "aws-runtime", "aws-smithy-async", "aws-smithy-http", - "aws-smithy-json", + "aws-smithy-json 0.61.1", "aws-smithy-runtime", "aws-smithy-runtime-api", "aws-smithy-types", @@ -1144,15 +1323,15 @@ dependencies = [ [[package]] name = "aws-sdk-ssooidc" -version = "1.49.0" +version = "1.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9177ea1192e6601ae16c7273385690d88a7ed386a00b74a6bc894d12103cd933" +checksum = "abaf490c2e48eed0bb8e2da2fb08405647bd7f253996e0f93b981958ea0f73b0" dependencies = [ "aws-credential-types", "aws-runtime", "aws-smithy-async", "aws-smithy-http", - "aws-smithy-json", + "aws-smithy-json 0.61.1", "aws-smithy-runtime", "aws-smithy-runtime-api", "aws-smithy-types", @@ -1166,15 +1345,15 @@ dependencies = [ [[package]] name = "aws-sdk-sts" -version = "1.48.0" +version = "1.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "823ef553cf36713c97453e2ddff1eb8f62be7f4523544e2a5db64caf80100f0a" +checksum = "b68fde0d69c8bfdc1060ea7da21df3e39f6014da316783336deff0a9ec28f4bf" dependencies = [ "aws-credential-types", "aws-runtime", "aws-smithy-async", "aws-smithy-http", - "aws-smithy-json", + "aws-smithy-json 0.61.1", "aws-smithy-query", "aws-smithy-runtime", "aws-smithy-runtime-api", @@ -1189,9 +1368,9 @@ dependencies = [ [[package]] name = "aws-sigv4" -version = "1.2.5" +version = "1.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5619742a0d8f253be760bfbb8e8e8368c69e3587e4637af5754e488a611499b1" +checksum = "7d3820e0c08d0737872ff3c7c1f21ebbb6693d832312d6152bf18ef50a5471c2" dependencies = [ "aws-credential-types", "aws-smithy-eventstream", @@ -1202,14 +1381,14 @@ dependencies = [ "crypto-bigint 0.5.5", "form_urlencoded", "hex", - "hmac", + "hmac 0.12.1", "http 0.2.12", - "http 1.1.0", + "http 1.2.0", "once_cell", "p256", "percent-encoding", "ring 0.17.8", - "sha2", + "sha2 0.10.8", "subtle", "time", "tracing", @@ -1244,7 +1423,7 @@ dependencies = [ "md-5", "pin-project-lite", "sha1", - "sha2", + "sha2 0.10.8", "tracing", ] @@ -1289,6 +1468,15 @@ dependencies = [ "aws-smithy-types", ] +[[package]] +name = "aws-smithy-json" +version = "0.61.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee4e69cc50921eb913c6b662f8d909131bb3e6ad6cb6090d3a39b66fc5c52095" +dependencies = [ + "aws-smithy-types", +] + [[package]] name = "aws-smithy-query" version = "0.60.7" @@ -1301,9 +1489,9 @@ dependencies = [ [[package]] name = "aws-smithy-runtime" -version = "1.7.3" +version = "1.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be28bd063fa91fd871d131fc8b68d7cd4c5fa0869bea68daca50dcb1cbd76be2" +checksum = "9f20685047ca9d6f17b994a07f629c813f08b5bce65523e47124879e60103d45" dependencies = [ "aws-smithy-async", "aws-smithy-http", @@ -1328,15 +1516,15 @@ dependencies = [ [[package]] name = "aws-smithy-runtime-api" -version = "1.7.2" +version = "1.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e086682a53d3aa241192aa110fa8dfce98f2f5ac2ead0de84d41582c7e8fdb96" +checksum = "92165296a47a812b267b4f41032ff8069ab7ff783696d217f0994a0d7ab585cd" dependencies = [ "aws-smithy-async", "aws-smithy-types", "bytes", "http 0.2.12", - "http 1.1.0", + "http 1.2.0", "pin-project-lite", "tokio", "tracing", @@ -1345,16 +1533,16 @@ dependencies = [ [[package]] name = "aws-smithy-types" -version = "1.2.8" +version = "1.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07c9cdc179e6afbf5d391ab08c85eac817b51c87e1892a5edb5f7bbdc64314b4" +checksum = "4fbd94a32b3a7d55d3806fe27d98d3ad393050439dd05eb53ece36ec5e3d3510" dependencies = [ "base64-simd", "bytes", "bytes-utils", "futures-core", "http 0.2.12", - "http 1.1.0", + "http 1.2.0", "http-body 0.4.6", "http-body 1.0.1", "http-body-util", @@ -1366,7 +1554,7 @@ dependencies = [ "serde", "time", "tokio", - "tokio-util 0.7.12", + "tokio-util 0.7.13", ] [[package]] @@ -1419,6 +1607,12 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" +[[package]] +name = "base64" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" + [[package]] name = "base64" version = "0.13.1" @@ -1516,6 +1710,9 @@ name = "bitflags" version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +dependencies = [ + "serde", +] [[package]] name = "bitvec" @@ -1551,17 +1748,25 @@ dependencies = [ [[package]] name = "blake3" -version = "0.3.8" +version = "1.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b64485778c4f16a6a5a9d335e80d449ac6c70cdd6a06d2af18a6f6f775a125b3" +checksum = "b8ee0c1824c4dea5b5f81736aff91bae041d2c07ee1192bec91054e10e3e601e" dependencies = [ "arrayref", - "arrayvec 0.5.2", + "arrayvec", "cc", - "cfg-if 0.1.10", - "constant_time_eq", - "crypto-mac", - "digest 0.9.0", + "cfg-if 1.0.0", + "constant_time_eq 0.3.1", + "digest 0.10.7", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array 0.14.7", ] [[package]] @@ -1587,29 +1792,29 @@ dependencies = [ [[package]] name = "borsh" -version = "0.9.3" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15bf3650200d8bffa99015595e10f1fbd17de07abbc25bb067da79e769939bfa" +checksum = "115e54d64eb62cdebad391c19efc9dce4981c690c85a33a12199d99bb9546fee" dependencies = [ - "borsh-derive 0.9.3", - "hashbrown 0.11.2", + "borsh-derive 0.10.4", + "hashbrown 0.13.2", ] [[package]] name = "borsh" -version = "1.5.1" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6362ed55def622cddc70a4746a68554d7b687713770de539e59a739b249f8ed" +checksum = "2506947f73ad44e344215ccd6403ac2ae18cd8e046e581a441bf8d199f257f03" dependencies = [ - "borsh-derive 1.5.1", + "borsh-derive 1.5.3", "cfg_aliases", ] [[package]] name = "borsh-derive" -version = "0.9.3" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6441c552f230375d18e3cc377677914d2ca2b0d36e52129fe15450a2dce46775" +checksum = "831213f80d9423998dd696e2c5345aba6be7a0bd8cd19e31c5243e13df1cef89" dependencies = [ "borsh-derive-internal", "borsh-schema-derive-internal", @@ -1620,23 +1825,22 @@ dependencies = [ [[package]] name = "borsh-derive" -version = "1.5.1" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3ef8005764f53cd4dca619f5bf64cafd4664dada50ece25e4d81de54c80cc0b" +checksum = "c2593a3b8b938bd68373196c9832f516be11fa487ef4ae745eb282e6a56a7244" dependencies = [ "once_cell", "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 2.0.87", - "syn_derive", + "syn 2.0.90", ] [[package]] name = "borsh-derive-internal" -version = "0.9.3" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5449c28a7b352f2d1e592a8a28bf139bc71afb0764a14f3c02500935d8c44065" +checksum = "65d6ba50644c98714aa2a70d13d7df3cd75cd2b523a2b452bf010443800976b3" dependencies = [ "proc-macro2", "quote", @@ -1645,9 +1849,9 @@ dependencies = [ [[package]] name = "borsh-schema-derive-internal" -version = "0.9.3" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdbd5696d8bfa21d53d9fe39a714a18538bad11492a42d066dbbc395fb1951c0" +checksum = "276691d96f063427be83e6692b86148e488ebba9f48f77788724ca027ba3b6d4" dependencies = [ "proc-macro2", "quote", @@ -1657,14 +1861,35 @@ dependencies = [ [[package]] name = "bridge-connector-common" version = "0.1.0" -source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs#542c21874b286e62d9e9420f44a1cd967084fac3" +source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs?branch=refactor%2Fconnectors#2585f2e681cd2f0513f663227ff2ca10c6eefd5f" dependencies = [ "eth-proof", "ethers", "near-light-client-on-eth", "near-rpc-client", "serde_json", - "thiserror", + "thiserror 2.0.4", +] + +[[package]] +name = "brotli" +version = "7.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc97b8f16f944bba54f0433f07e30be199b6dc2bd25937444bbad560bcea29bd" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "4.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a45bd2e4095a8b518033b128020dd4a55aab1c0a381ba4404a472630f4bc362" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", ] [[package]] @@ -1679,7 +1904,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" dependencies = [ - "sha2", + "sha2 0.10.8", "tinyvec", ] @@ -1689,6 +1914,16 @@ version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +[[package]] +name = "bv" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8834bb1d8ee5dc048ee3124f2c7c1afcc6bc9aed03f11e9dfd8c69470a5db340" +dependencies = [ + "feature-probe", + "serde", +] + [[package]] name = "byte-slice-cast" version = "1.2.2" @@ -1717,6 +1952,26 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "bytemuck" +version = "1.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b37c88a63ffd85d15b406896cc343916d7cf57838a847b3a6f2ca5d39a5695a" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcfcc3cd946cb52f0bbfdbbcfa2f4e24f75ebb6c0e1002f7c25904fada18b9ec" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", +] + [[package]] name = "byteorder" version = "1.5.0" @@ -1725,9 +1980,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" +checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" dependencies = [ "serde", ] @@ -1807,12 +2062,22 @@ dependencies = [ ] [[package]] -name = "cargo-platform" -version = "0.1.8" +name = "caps" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24b1f0365a6c6bb4020cd05806fd0d33c44d38046b8bd7f0e40814b9763cabfc" +checksum = "190baaad529bcfbde9e1a19022c42781bdb6ff9de25721abdb8fd98c0807730b" dependencies = [ - "serde", + "libc", + "thiserror 1.0.69", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", ] [[package]] @@ -1826,20 +2091,26 @@ dependencies = [ "semver 1.0.23", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "cc" -version = "1.1.34" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b9470d453346108f93a59222a9a1a5724db32d0a4727b7ab7ace4b4d822dc9" +checksum = "f34d93e62b03caf570cccc334cbc6c2fceca82f39211051345108adcba3eebdc" dependencies = [ "jobserver", "libc", "shlex", ] +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + [[package]] name = "cfg-if" version = "0.1.10" @@ -1858,6 +2129,17 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +[[package]] +name = "cfg_eval" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45565fc9416b9896014f5732ac776f810ee53a66730c17e4020c3ec064a8f88f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", +] + [[package]] name = "chrono" version = "0.4.38" @@ -1905,9 +2187,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.20" +version = "4.5.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" +checksum = "3135e7ec2ef7b10c6ed8950f0f792ed96ee093fa088608f1c76e569722700c84" dependencies = [ "clap_builder", "clap_derive", @@ -1915,9 +2197,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.20" +version = "4.5.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" +checksum = "30582fc632330df2bd26877bde0c1f4470d57c582bbc070376afcd04d8cb4838" dependencies = [ "anstream", "anstyle", @@ -1934,14 +2216,14 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] name = "clap_lex" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" [[package]] name = "cloudabi" @@ -1961,11 +2243,11 @@ dependencies = [ "bs58 0.5.1", "coins-core", "digest 0.10.7", - "hmac", + "hmac 0.12.1", "k256", "serde", - "sha2", - "thiserror", + "sha2 0.10.8", + "thiserror 1.0.69", ] [[package]] @@ -1976,12 +2258,12 @@ checksum = "3db8fba409ce3dc04f7d804074039eb68b960b0829161f8e06c95fea3f122528" dependencies = [ "bitvec", "coins-bip32", - "hmac", + "hmac 0.12.1", "once_cell", "pbkdf2 0.12.2", "rand 0.8.5", - "sha2", - "thiserror", + "sha2 0.10.8", + "thiserror 1.0.69", ] [[package]] @@ -1999,9 +2281,9 @@ dependencies = [ "ripemd", "serde", "serde_derive", - "sha2", + "sha2 0.10.8", "sha3", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -2010,6 +2292,19 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" +[[package]] +name = "combine" +version = "3.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3da6baa321ec19e1cc41d31bf599f00c783d0517095cdaf0332e3fe8d20680" +dependencies = [ + "ascii", + "byteorder", + "either", + "memchr", + "unreachable", +] + [[package]] name = "combine" version = "4.6.7" @@ -2021,14 +2316,56 @@ dependencies = [ "memchr", "pin-project-lite", "tokio", - "tokio-util 0.7.12", + "tokio-util 0.7.13", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "console" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" +dependencies = [ + "encode_unicode", + "lazy_static", + "libc", + "unicode-width 0.1.14", + "windows-sys 0.52.0", +] + +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if 1.0.0", + "wasm-bindgen", +] + +[[package]] +name = "console_log" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89f72f65e8501878b8a004d5a1afb780987e2ce2b4532c562e367a72c57499f" +dependencies = [ + "log", + "web-sys", ] [[package]] name = "const-hex" -version = "1.13.1" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0121754e84117e65f9d90648ee6aa4882a6e63110307ab73967a4c5e7e69e586" +checksum = "4b0485bab839b018a8f1723fc5391819fea5f8f0f32288ef8a735fd096b6160c" dependencies = [ "cfg-if 1.0.0", "cpufeatures", @@ -2049,6 +2386,12 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" +[[package]] +name = "constant_time_eq" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" + [[package]] name = "convert_case" version = "0.4.0" @@ -2082,9 +2425,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.14" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" +checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" dependencies = [ "libc", ] @@ -2287,6 +2630,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ "generic-array 0.14.7", + "rand_core 0.6.4", "typenum", ] @@ -2309,6 +2653,19 @@ dependencies = [ "cipher 0.4.4", ] +[[package]] +name = "curve25519-dalek" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.5.1", + "subtle", + "zeroize", +] + [[package]] name = "curve25519-dalek" version = "4.1.3" @@ -2322,6 +2679,7 @@ dependencies = [ "fiat-crypto", "rand_core 0.6.4", "rustc_version 0.4.1", + "serde", "subtle", "zeroize", ] @@ -2334,7 +2692,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -2382,7 +2740,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -2404,7 +2762,20 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core 0.20.10", "quote", - "syn 2.0.87", + "syn 2.0.90", +] + +[[package]] +name = "dashmap" +version = "5.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +dependencies = [ + "cfg-if 1.0.0", + "hashbrown 0.14.5", + "lock_api 0.4.12", + "once_cell", + "parking_lot_core 0.9.10", ] [[package]] @@ -2456,6 +2827,20 @@ dependencies = [ "zeroize", ] +[[package]] +name = "der-parser" +version = "8.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbd676fbbab537128ef0278adb5576cf363cff6aa22a7b24effe97347cfab61e" +dependencies = [ + "asn1-rs", + "displaydoc", + "nom", + "num-bigint 0.4.6", + "num-traits", + "rusticata-macros", +] + [[package]] name = "deranged" version = "0.3.11" @@ -2466,6 +2851,12 @@ dependencies = [ "serde", ] +[[package]] +name = "derivation-path" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e5c37193a1db1d8ed868c03ec7b152175f26160a5b740e5e484143877e0adf0" + [[package]] name = "derivative" version = "2.2.0" @@ -2479,13 +2870,13 @@ dependencies = [ [[package]] name = "derive_arbitrary" -version = "1.3.2" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" +checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -2527,7 +2918,7 @@ dependencies = [ "darling 0.20.10", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -2547,7 +2938,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core 0.20.2", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -2560,7 +2951,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version 0.4.1", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -2580,7 +2971,7 @@ checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", "unicode-xid", ] @@ -2608,7 +2999,7 @@ version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer", + "block-buffer 0.10.4", "const-oid", "crypto-common", "subtle", @@ -2664,7 +3055,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -2673,6 +3064,29 @@ version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59f8e79d1fbf76bdfbde321e902714bf6c49df88a7dda6fc682fc2979226962d" +[[package]] +name = "dlopen2" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09b4f5f101177ff01b8ec4ecc81eead416a8aa42819a2869311b3420fa114ffa" +dependencies = [ + "dlopen2_derive", + "libc", + "once_cell", + "winapi", +] + +[[package]] +name = "dlopen2_derive" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cbae11b3de8fce2a456e8ea3dada226b35fe791f0dc1d360c0941f0bb681f3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", +] + [[package]] name = "dotenv" version = "0.15.0" @@ -2738,6 +3152,12 @@ dependencies = [ "memmap2", ] +[[package]] +name = "eager" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abe71d579d1812060163dff96056261deb5bf6729b100fa2e36a68b9649ba3d3" + [[package]] name = "easy-ext" version = "0.2.9" @@ -2770,6 +3190,15 @@ dependencies = [ "spki 0.7.3", ] +[[package]] +name = "ed25519" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" +dependencies = [ + "signature 1.6.4", +] + [[package]] name = "ed25519" version = "2.2.3" @@ -2779,19 +3208,45 @@ dependencies = [ "signature 2.2.0", ] +[[package]] +name = "ed25519-dalek" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" +dependencies = [ + "curve25519-dalek 3.2.0", + "ed25519 1.5.3", + "rand 0.7.3", + "serde", + "sha2 0.9.9", + "zeroize", +] + [[package]] name = "ed25519-dalek" version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" dependencies = [ - "curve25519-dalek", - "ed25519", + "curve25519-dalek 4.1.3", + "ed25519 2.2.3", "rand_core 0.6.4", - "sha2", + "sha2 0.10.8", "subtle", ] +[[package]] +name = "ed25519-dalek-bip32" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d2be62a4061b872c8c0873ee4fc6f101ce7b889d039f019c5fa2af471a59908" +dependencies = [ + "derivation-path", + "ed25519-dalek 1.0.1", + "hmac 0.12.1", + "sha2 0.10.8", +] + [[package]] name = "either" version = "1.13.0" @@ -2846,6 +3301,12 @@ dependencies = [ "log", ] +[[package]] +name = "encode_unicode" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" + [[package]] name = "encoding_rs" version = "0.8.35" @@ -2873,6 +3334,26 @@ dependencies = [ "zeroize", ] +[[package]] +name = "enum-iterator" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fd242f399be1da0a5354aa462d57b4ab2b4ee0683cc552f7c007d2d12d36e94" +dependencies = [ + "enum-iterator-derive", +] + +[[package]] +name = "enum-iterator-derive" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1ab991c1362ac86c61ab6f556cff143daa22e5a15e4e189df818b2fd19fe65b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", +] + [[package]] name = "enum-map" version = "2.7.3" @@ -2890,7 +3371,7 @@ checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -2911,7 +3392,7 @@ dependencies = [ "darling 0.20.10", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -2946,12 +3427,12 @@ dependencies = [ [[package]] name = "errno" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -2974,24 +3455,24 @@ dependencies = [ "ctr", "digest 0.10.7", "hex", - "hmac", + "hmac 0.12.1", "pbkdf2 0.11.0", "rand 0.8.5", "scrypt", "serde", "serde_json", - "sha2", + "sha2 0.10.8", "sha3", - "thiserror", + "thiserror 1.0.69", "uuid 0.8.2", ] [[package]] name = "eth-proof" version = "0.1.0" -source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs#542c21874b286e62d9e9420f44a1cd967084fac3" +source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs?branch=refactor%2Fconnectors#2585f2e681cd2f0513f663227ff2ca10c6eefd5f" dependencies = [ - "borsh 1.5.1", + "borsh 1.5.3", "cita_trie", "ethereum-types 0.14.1", "hasher", @@ -3001,7 +3482,7 @@ dependencies = [ "rlp 0.5.2", "serde", "serde_json", - "thiserror", + "thiserror 2.0.4", "tokio", ] @@ -3018,7 +3499,7 @@ dependencies = [ "serde", "serde_json", "sha3", - "thiserror", + "thiserror 1.0.69", "uint 0.9.5", ] @@ -3124,7 +3605,7 @@ dependencies = [ "pin-project", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -3146,7 +3627,7 @@ dependencies = [ "reqwest 0.11.27", "serde", "serde_json", - "syn 2.0.87", + "syn 2.0.90", "toml 0.8.19", "walkdir", ] @@ -3164,7 +3645,7 @@ dependencies = [ "proc-macro2", "quote", "serde_json", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -3173,7 +3654,7 @@ version = "2.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "82d80cc6ad30b14a48ab786523af33b37f28a8623fc06afd55324816ef18fb1f" dependencies = [ - "arrayvec 0.7.6", + "arrayvec", "bytes", "cargo_metadata", "chrono", @@ -3190,9 +3671,9 @@ dependencies = [ "serde", "serde_json", "strum 0.26.3", - "syn 2.0.87", + "syn 2.0.90", "tempfile", - "thiserror", + "thiserror 1.0.69", "tiny-keccak", "unicode-xid", ] @@ -3209,7 +3690,7 @@ dependencies = [ "semver 1.0.23", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", "tracing", ] @@ -3233,7 +3714,7 @@ dependencies = [ "reqwest 0.11.27", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", "tokio", "tracing", "tracing-futures", @@ -3265,7 +3746,7 @@ dependencies = [ "reqwest 0.11.27", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-tungstenite 0.20.1", "tracing", @@ -3291,8 +3772,8 @@ dependencies = [ "eth-keystore", "ethers-core", "rand 0.8.5", - "sha2", - "thiserror", + "sha2 0.10.8", + "thiserror 1.0.69", "tracing", ] @@ -3320,7 +3801,7 @@ dependencies = [ "serde_json", "solang-parser", "svm-rs", - "thiserror", + "thiserror 1.0.69", "tiny-keccak", "tokio", "tracing", @@ -3328,6 +3809,57 @@ dependencies = [ "yansi", ] +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + +[[package]] +name = "event-listener" +version = "5.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2" +dependencies = [ + "event-listener 5.3.1", + "pin-project-lite", +] + +[[package]] +name = "evm-bridge-client" +version = "0.1.0" +source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs?branch=refactor%2Fconnectors#2585f2e681cd2f0513f663227ff2ca10c6eefd5f" +dependencies = [ + "borsh 1.5.3", + "bridge-connector-common", + "derive_builder 0.20.2", + "eth-proof", + "ethers", + "hex", + "near-bridge-client", + "near-contract-standards", + "near-crypto 0.21.2", + "near-jsonrpc-client 0.9.0", + "near-primitives 0.21.2", + "near-rpc-client", + "near-token", + "omni-types", + "serde_json", + "sha3", + "tracing", +] + [[package]] name = "eyre" version = "0.6.12" @@ -3346,9 +3878,9 @@ checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" [[package]] name = "fastrand" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" +checksum = "486f806e73c5707928240ddc295403b1b93c96a02038563881c4a2fd84b81ac4" [[package]] name = "fastrlp" @@ -3356,11 +3888,17 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "139834ddba373bbdd213dffe02c8d110508dcf1726c2be27e8d1f7d7e1856418" dependencies = [ - "arrayvec 0.7.6", + "arrayvec", "auto_impl", "bytes", ] +[[package]] +name = "feature-probe" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835a3dc7d1ec9e75e2b5fb4ba75396837112d2060b03f7d43bc1897c7f7211da" + [[package]] name = "ff" version = "0.12.1" @@ -3397,12 +3935,27 @@ dependencies = [ "dissimilar", "num-traits", "prefix-sum-vec", - "thiserror", + "thiserror 1.0.69", "wasm-encoder 0.27.0", "wasmparser 0.105.0", "wasmprinter", ] +[[package]] +name = "five8_const" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b4f62f0f8ca357f93ae90c8c2dd1041a1f665fde2f889ea9b1787903829015" +dependencies = [ + "five8_core", +] + +[[package]] +name = "five8_core" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94474d15a76982be62ca8a39570dccce148d98c238ebb7408b0a21b2c4bdddc4" + [[package]] name = "fixed-hash" version = "0.7.0" @@ -3432,9 +3985,9 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.0.34" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" +checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" dependencies = [ "crc32fast", "miniz_oxide", @@ -3558,7 +4111,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -3644,11 +4197,22 @@ version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ + "serde", "typenum", "version_check", "zeroize", ] +[[package]] +name = "gethostname" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1ebd34e35c46e00bb73e81363248d627782724609fe1b6396f553f68fe3862e" +dependencies = [ + "libc", + "winapi", +] + [[package]] name = "getrandom" version = "0.1.16" @@ -3656,8 +4220,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ "cfg-if 1.0.0", + "js-sys", "libc", "wasi 0.9.0+wasi-snapshot-preview1", + "wasm-bindgen", ] [[package]] @@ -3667,8 +4233,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if 1.0.0", + "js-sys", "libc", "wasi 0.11.0+wasi-snapshot-preview1", + "wasm-bindgen", ] [[package]] @@ -3678,7 +4246,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" dependencies = [ "fallible-iterator", - "indexmap 2.6.0", + "indexmap 2.7.0", "stable_deref_trait", ] @@ -3706,6 +4274,26 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "governor" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68a7f542ee6b35af73b06abc0dad1c1bae89964e4e253bc4b587b91c9637867b" +dependencies = [ + "cfg-if 1.0.0", + "dashmap 5.5.3", + "futures", + "futures-timer", + "no-std-compat", + "nonzero_ext", + "parking_lot 0.12.3", + "portable-atomic", + "quanta", + "rand 0.8.5", + "smallvec", + "spinning_top", +] + [[package]] name = "group" version = "0.12.1" @@ -3740,39 +4328,39 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.6.0", + "indexmap 2.7.0", "slab", "tokio", - "tokio-util 0.7.12", + "tokio-util 0.7.13", "tracing", ] [[package]] name = "h2" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205" +checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e" dependencies = [ "atomic-waker", "bytes", "fnv", "futures-core", "futures-sink", - "http 1.1.0", - "indexmap 2.6.0", + "http 1.2.0", + "indexmap 2.7.0", "slab", "tokio", - "tokio-util 0.7.12", + "tokio-util 0.7.13", "tracing", ] [[package]] -name = "hashbrown" -version = "0.11.2" +name = "hash32" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" +checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" dependencies = [ - "ahash 0.7.8", + "byteorder", ] [[package]] @@ -3804,9 +4392,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.0" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" dependencies = [ "allocator-api2", "equivalent", @@ -3880,7 +4468,7 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5313b072ce3c597065a808dbf612c4c8e8590bdbf8b579508bf7a762c5eae6cd" dependencies = [ - "arrayvec 0.7.6", + "arrayvec", ] [[package]] @@ -3889,6 +4477,22 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" +[[package]] +name = "histogram" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12cb882ccb290b8646e554b157ab0b71e64e8d5bef775cd66b6531e52d302669" + +[[package]] +name = "hmac" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" +dependencies = [ + "crypto-mac", + "digest 0.9.0", +] + [[package]] name = "hmac" version = "0.12.1" @@ -3898,6 +4502,17 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "hmac-drbg" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17ea0a1394df5b6574da6e0c1ade9e78868c9fb0a4e5ef4428e32da4676b85b1" +dependencies = [ + "digest 0.9.0", + "generic-array 0.14.7", + "hmac 0.8.1", +] + [[package]] name = "home" version = "0.5.9" @@ -3920,9 +4535,9 @@ dependencies = [ [[package]] name = "http" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" dependencies = [ "bytes", "fnv", @@ -3947,7 +4562,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http 1.1.0", + "http 1.2.0", ] [[package]] @@ -3958,7 +4573,7 @@ checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" dependencies = [ "bytes", "futures-util", - "http 1.1.0", + "http 1.2.0", "http-body 1.0.1", "pin-project-lite", ] @@ -4007,15 +4622,15 @@ dependencies = [ [[package]] name = "hyper" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbbff0a806a4728c99295b254c8838933b5b082d75e3cb70c8dab21fdfbcfa9a" +checksum = "97818827ef4f364230e16705d4706e2897df2bb60617d6ca15d598025a3c481f" dependencies = [ "bytes", "futures-channel", "futures-util", - "h2 0.4.6", - "http 1.1.0", + "h2 0.4.7", + "http 1.2.0", "http-body 1.0.1", "httparse", "itoa", @@ -4036,7 +4651,7 @@ dependencies = [ "hyper 0.14.31", "log", "rustls 0.21.12", - "rustls-native-certs", + "rustls-native-certs 0.6.3", "tokio", "tokio-rustls 0.24.1", ] @@ -4048,13 +4663,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" dependencies = [ "futures-util", - "http 1.1.0", - "hyper 1.5.0", + "http 1.2.0", + "hyper 1.5.1", "hyper-util", - "rustls 0.23.16", + "rustls 0.23.19", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.0", + "tokio-rustls 0.26.1", "tower-service", ] @@ -4091,7 +4706,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper 1.5.0", + "hyper 1.5.1", "hyper-util", "native-tls", "tokio", @@ -4108,9 +4723,9 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.1.0", + "http 1.2.0", "http-body 1.0.1", - "hyper 1.5.0", + "hyper 1.5.1", "pin-project-lite", "socket2", "tokio", @@ -4256,7 +4871,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -4333,13 +4948,13 @@ dependencies = [ [[package]] name = "impl-trait-for-tuples" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" +checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.90", ] [[package]] @@ -4361,15 +4976,28 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" dependencies = [ "equivalent", - "hashbrown 0.15.0", + "hashbrown 0.15.2", "serde", ] +[[package]] +name = "indicatif" +version = "0.17.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbf675b85ed934d3c67b5c5469701eec7db22689d0a2139d856e0925fa28b281" +dependencies = [ + "console", + "number_prefix", + "portable-atomic", + "unicode-width 0.2.0", + "web-time", +] + [[package]] name = "inout" version = "0.1.3" @@ -4429,6 +5057,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.13.0" @@ -4440,9 +5077,29 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.11" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" + +[[package]] +name = "jni" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6df18c2e3db7e453d3c6ac5b3e9d5182664d28788126d39b91f2d1e22b017ec" +dependencies = [ + "cesu8", + "combine 4.6.7", + "jni-sys", + "log", + "thiserror 1.0.69", + "walkdir", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" [[package]] name = "jobserver" @@ -4455,10 +5112,11 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.72" +version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +checksum = "a865e038f7f6ed956f788f0d7d60c541fff74c7bd74272c5d4cf15c63743e705" dependencies = [ + "once_cell", "wasm-bindgen", ] @@ -4468,6 +5126,21 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9dbbfed4e59ba9750e15ba154fdfd9329cee16ff3df539c2666b70f58cc32105" +[[package]] +name = "jsonrpc-core" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14f7f76aef2d054868398427f6c54943cf3d1caa9a7ec7d0c38d69df97a965eb" +dependencies = [ + "futures", + "futures-executor", + "futures-util", + "log", + "serde", + "serde_derive", + "serde_json", +] + [[package]] name = "jsonwebtoken" version = "8.3.0" @@ -4492,7 +5165,7 @@ dependencies = [ "ecdsa 0.16.9", "elliptic-curve 0.13.8", "once_cell", - "sha2", + "sha2 0.10.8", "signature 2.2.0", ] @@ -4542,7 +5215,7 @@ version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "507460a910eb7b32ee961886ff48539633b788a36b65692b95f225b844c82553" dependencies = [ - "regex-automata 0.4.8", + "regex-automata 0.4.9", ] [[package]] @@ -4562,9 +5235,9 @@ checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" [[package]] name = "libc" -version = "0.2.161" +version = "0.2.167" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" +checksum = "09d6582e104315a817dff97f75133544b2e094ee22447d2acf4a74e189ba06fc" [[package]] name = "libm" @@ -4582,6 +5255,54 @@ dependencies = [ "libc", ] +[[package]] +name = "libsecp256k1" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9d220bc1feda2ac231cb78c3d26f27676b8cf82c96971f7aeef3d0cf2797c73" +dependencies = [ + "arrayref", + "base64 0.12.3", + "digest 0.9.0", + "hmac-drbg", + "libsecp256k1-core", + "libsecp256k1-gen-ecmult", + "libsecp256k1-gen-genmult", + "rand 0.7.3", + "serde", + "sha2 0.9.9", + "typenum", +] + +[[package]] +name = "libsecp256k1-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0f6ab710cec28cef759c5f18671a27dae2a5f952cdaaee1d8e2908cb2478a80" +dependencies = [ + "crunchy", + "digest 0.9.0", + "subtle", +] + +[[package]] +name = "libsecp256k1-gen-ecmult" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccab96b584d38fac86a83f07e659f0deafd0253dc096dab5a36d53efe653c5c3" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "libsecp256k1-gen-genmult" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67abfe149395e3aa1c48a2beb32b068e2334402df8181f818d3aee2b304c4f5d" +dependencies = [ + "libsecp256k1-core", +] + [[package]] name = "linux-raw-sys" version = "0.4.14" @@ -4590,9 +5311,9 @@ checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] name = "litemap" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704" +checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" [[package]] name = "lock_api" @@ -4654,7 +5375,7 @@ version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" dependencies = [ - "hashbrown 0.15.0", + "hashbrown 0.15.2", ] [[package]] @@ -4761,12 +5482,40 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8452105ba047068f40ff7093dd1d9da90898e63dd61736462e9cdda6a90ad3c3" +[[package]] +name = "merlin" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" +dependencies = [ + "byteorder", + "keccak", + "rand_core 0.6.4", + "zeroize", +] + [[package]] name = "mime" version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "mime_guess" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" +dependencies = [ + "mime", + "unicase", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + [[package]] name = "miniz_oxide" version = "0.8.0" @@ -4778,11 +5527,10 @@ dependencies = [ [[package]] name = "mio" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ - "hermit-abi 0.3.9", "libc", "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.52.0", @@ -4794,6 +5542,19 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7843ec2de400bcbc6a6328c958dc38e5359da6e93e72e37bc5246bf1ae776389" +[[package]] +name = "mpl-token-metadata" +version = "5.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "989e6a3000e761d3b2d685662a3a9ee99826f9369fb033bd1bc7011b1cf02ed9" +dependencies = [ + "borsh 0.10.4", + "num-derive 0.3.3", + "num-traits", + "solana-program", + "thiserror 1.0.69", +] + [[package]] name = "multimap" version = "0.8.3" @@ -4823,10 +5584,29 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35cbb989542587b47205e608324ddd391f0cee1c22b4b64ae49f458334b95907" dependencies = [ - "borsh 1.5.1", + "borsh 1.5.3", "serde", ] +[[package]] +name = "near-bridge-client" +version = "0.1.0" +source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs?branch=refactor%2Fconnectors#2585f2e681cd2f0513f663227ff2ca10c6eefd5f" +dependencies = [ + "borsh 1.5.3", + "bridge-connector-common", + "derive_builder 0.20.2", + "near-contract-standards", + "near-crypto 0.21.2", + "near-jsonrpc-client 0.9.0", + "near-primitives 0.21.2", + "near-rpc-client", + "near-token", + "omni-types", + "serde_json", + "tracing", +] + [[package]] name = "near-cache" version = "0.21.2" @@ -4850,11 +5630,11 @@ dependencies = [ "near-crypto 0.21.2", "near-parameters 0.21.2", "near-primitives 0.21.2", - "num-rational", + "num-rational 0.3.2", "once_cell", "serde", "serde_json", - "sha2", + "sha2 0.10.8", "smart-default", "tracing", ] @@ -4874,11 +5654,11 @@ dependencies = [ "near-parameters 0.26.0", "near-primitives 0.26.0", "near-time 0.26.0", - "num-rational", + "num-rational 0.3.2", "once_cell", "serde", "serde_json", - "sha2", + "sha2 0.10.8", "smart-default", "time", "tracing", @@ -4892,39 +5672,39 @@ checksum = "ae1c9ff519efa8c778d341fa34971dee93e8adf4e8ae51feaefaa63bdf7e496a" dependencies = [ "anyhow", "json_comments", - "thiserror", + "thiserror 1.0.69", "tracing", ] [[package]] name = "near-config-utils" -version = "0.23.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43b3db4ac2d4340caef06b6363c3fd16c0be1f70267908dfa53e2e6241649b0c" +checksum = "d96c1682d13e9a8a62ea696395bf17afc4ed4b60535223251168217098c27a50" dependencies = [ "anyhow", "json_comments", - "thiserror", + "thiserror 1.0.69", "tracing", ] [[package]] name = "near-config-utils" -version = "0.26.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d96c1682d13e9a8a62ea696395bf17afc4ed4b60535223251168217098c27a50" +checksum = "4e7b41110a20f1d82bb06f06e4800068c5ade6d8ff844787f8753bc2ce7b16f7" dependencies = [ "anyhow", "json_comments", - "thiserror", + "thiserror 1.0.69", "tracing", ] [[package]] name = "near-contract-standards" -version = "5.5.0" +version = "5.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3b985c4df43237b6ae533a6451cfa13de1f12f79f7d6254ba376f0ccd017286" +checksum = "9b352e9b2f7c3abe5db91d91e446810433c6afbd3e43d7b3d989a2ef32c1dc2e" dependencies = [ "near-sdk", ] @@ -4936,12 +5716,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d927e95742aea981b9fd60996fbeba3b61e90acafd54c2c3c2a4ed40065ff03" dependencies = [ "blake2 0.9.2", - "borsh 1.5.1", + "borsh 1.5.3", "bs58 0.4.0", "c2-chacha", - "curve25519-dalek", + "curve25519-dalek 4.1.3", "derive_more 0.99.18", - "ed25519-dalek", + "ed25519-dalek 2.1.1", "hex", "near-account-id", "near-config-utils 0.21.2", @@ -4953,58 +5733,58 @@ dependencies = [ "serde", "serde_json", "subtle", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "near-crypto" -version = "0.23.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9807fb257f7dda41383bb33e14cfd4a8840ffa7932cb972db9eabff19ce3bf4" +checksum = "907fdcefa3a42976cd6a8bf626fe2a87eb0d3b3ff144adc67cf32d53c9494b32" dependencies = [ "blake2 0.10.6", - "borsh 1.5.1", + "borsh 1.5.3", "bs58 0.4.0", - "curve25519-dalek", + "curve25519-dalek 4.1.3", "derive_more 0.99.18", - "ed25519-dalek", + "ed25519-dalek 2.1.1", "hex", "near-account-id", - "near-config-utils 0.23.0", - "near-stdx 0.23.0", + "near-config-utils 0.26.0", + "near-stdx 0.26.0", "once_cell", "primitive-types 0.10.1", + "rand 0.8.5", "secp256k1 0.27.0", "serde", "serde_json", "subtle", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "near-crypto" -version = "0.26.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "907fdcefa3a42976cd6a8bf626fe2a87eb0d3b3ff144adc67cf32d53c9494b32" +checksum = "43b17944c8d0f274c684227d79fcd46d583b1e36064b597c53a9ebec187a86f3" dependencies = [ "blake2 0.10.6", - "borsh 1.5.1", + "borsh 1.5.3", "bs58 0.4.0", - "curve25519-dalek", + "curve25519-dalek 4.1.3", "derive_more 0.99.18", - "ed25519-dalek", + "ed25519-dalek 2.1.1", "hex", "near-account-id", - "near-config-utils 0.26.0", - "near-stdx 0.26.0", - "once_cell", + "near-config-utils 0.27.0", + "near-schema-checker-lib", + "near-stdx 0.27.0", "primitive-types 0.10.1", - "rand 0.8.5", "secp256k1 0.27.0", "serde", "serde_json", "subtle", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -5018,20 +5798,20 @@ dependencies = [ [[package]] name = "near-fmt" -version = "0.23.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00ce363e4078b870775e2a5a5189feae22f0870ca673f6409b1974922dada0c4" +checksum = "7a36518bfcf2177096d4298d9158ba698ffd6944cb035ecc0938b098337b933c" dependencies = [ - "near-primitives-core 0.23.0", + "near-primitives-core 0.26.0", ] [[package]] name = "near-fmt" -version = "0.26.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a36518bfcf2177096d4298d9158ba698ffd6944cb035ecc0938b098337b933c" +checksum = "b1eff0731995774d1498f017c968a3ebbfdadad84f556afea4b83679f6706ac9" dependencies = [ - "near-primitives-core 0.26.0", + "near-primitives-core 0.27.0", ] [[package]] @@ -5040,17 +5820,17 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "180edcc7dc2fac41f93570d0c7b759c1b6d492f6ad093d749d644a40b4310a97" dependencies = [ - "borsh 1.5.1", + "borsh 1.5.3", "serde", ] [[package]] name = "near-indexer-primitives" -version = "0.23.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca85c74772338d1b8c8b8729ffa14dec44dacefa2ce367795f3de8846f2fdc06" +checksum = "ce9644d23252a0af5c5151b40d440d64339618f356d7ec19ddfd1ce004863a1d" dependencies = [ - "near-primitives 0.23.0", + "near-primitives 0.27.0", "serde", "serde_json", ] @@ -5061,7 +5841,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c5225c0f97a61fd4534dee3169959dd91bb812be7d0573c1130a3cf86fd16b3e" dependencies = [ - "borsh 1.5.1", + "borsh 1.5.3", "lazy_static", "log", "near-chain-configs 0.21.2", @@ -5071,7 +5851,7 @@ dependencies = [ "reqwest 0.11.27", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -5080,7 +5860,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "161fdc8f73fd9e19a97e05acb10e985ba89bd06e88543cdfd0c8dad0dac266c5" dependencies = [ - "borsh 1.5.1", + "borsh 1.5.3", "lazy_static", "log", "near-chain-configs 0.26.0", @@ -5090,7 +5870,7 @@ dependencies = [ "reqwest 0.12.9", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -5106,7 +5886,7 @@ dependencies = [ "near-rpc-error-macro 0.21.2", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -5122,15 +5902,15 @@ dependencies = [ "near-rpc-error-macro 0.26.0", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", "time", ] [[package]] name = "near-lake-framework" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cf514c5d43ac5e0309b80545583a35c09a5cf19f77894241e755e0223a8c50c" +checksum = "b784d25c9eae449a09f432c85bfc98ab4ea30af0242ec81b37acf357652641d7" dependencies = [ "anyhow", "async-stream", @@ -5143,9 +5923,10 @@ dependencies = [ "derive_builder 0.13.1", "futures", "near-indexer-primitives", + "reqwest 0.12.9", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-stream", "tracing", @@ -5154,11 +5935,11 @@ dependencies = [ [[package]] name = "near-light-client-on-eth" version = "0.1.0" -source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs#542c21874b286e62d9e9420f44a1cd967084fac3" +source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs?branch=refactor%2Fconnectors#2585f2e681cd2f0513f663227ff2ca10c6eefd5f" dependencies = [ "ethereum-types 0.14.1", "ethers", - "thiserror", + "thiserror 2.0.4", "tokio", ] @@ -5182,7 +5963,7 @@ dependencies = [ "serde", "serde_json", "strum 0.24.1", - "thiserror", + "thiserror 1.0.69", "tokio", "tracing", "tracing-appender", @@ -5197,52 +5978,53 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a996c8654020f7eb3c11039cb39123fd4cd78654fde4c9e7c3fd6d092c84f342" dependencies = [ "assert_matches", - "borsh 1.5.1", + "borsh 1.5.3", "enum-map", "near-account-id", "near-primitives-core 0.21.2", - "num-rational", + "num-rational 0.3.2", "serde", "serde_repr", "serde_yaml", "strum 0.24.1", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "near-parameters" -version = "0.23.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fddf39f5f729976a791d86e0e30a71ec4d8e8dcf58117c8694e7b22fb3f50ee6" +checksum = "e41afea5c5e84763586bafc5f5e1b63d90ef4e5454e18406cab8df120178db8d" dependencies = [ - "borsh 1.5.1", + "borsh 1.5.3", "enum-map", "near-account-id", - "near-primitives-core 0.23.0", - "num-rational", + "near-primitives-core 0.26.0", + "num-rational 0.3.2", "serde", "serde_repr", "serde_yaml", "strum 0.24.1", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "near-parameters" -version = "0.26.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e41afea5c5e84763586bafc5f5e1b63d90ef4e5454e18406cab8df120178db8d" +checksum = "0d4b4d014ac9f46baf0eeac7214567a08db97d5fd26157ea13edfbb8ffc5fd8c" dependencies = [ - "borsh 1.5.1", + "borsh 1.5.3", "enum-map", "near-account-id", - "near-primitives-core 0.26.0", - "num-rational", + "near-primitives-core 0.27.0", + "near-schema-checker-lib", + "num-rational 0.3.2", "serde", "serde_repr", "serde_yaml", "strum 0.24.1", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -5253,7 +6035,7 @@ checksum = "7c880397c022d3b8f592cef18f85fd6e79181a2a04c31154afb1730f9fa21098" dependencies = [ "arbitrary", "base64 0.21.7", - "borsh 1.5.1", + "borsh 1.5.3", "bytesize", "cfg-if 1.0.0", "chrono", @@ -5269,7 +6051,7 @@ dependencies = [ "near-rpc-error-macro 0.21.2", "near-stdx 0.21.2", "near-vm-runner", - "num-rational", + "num-rational 0.3.2", "once_cell", "primitive-types 0.10.1", "rand 0.8.5", @@ -5282,20 +6064,20 @@ dependencies = [ "sha3", "smart-default", "strum 0.24.1", - "thiserror", + "thiserror 1.0.69", "time", "tracing", ] [[package]] name = "near-primitives" -version = "0.23.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d58c175262923db9885ed0347e96ec3bcbec57825e3b6d7de03da220f5e14ef5" +checksum = "165c2dc0fc20d839cfd7948d930ef5e8a4ed2b095abe83e0076ef5d4a5df58ed" dependencies = [ "arbitrary", "base64 0.21.7", - "borsh 1.5.1", + "borsh 1.5.3", "bytes", "bytesize", "cfg-if 1.0.0", @@ -5305,39 +6087,41 @@ dependencies = [ "enum-map", "hex", "itertools 0.10.5", - "near-crypto 0.23.0", - "near-fmt 0.23.0", - "near-parameters 0.23.0", - "near-primitives-core 0.23.0", - "near-rpc-error-macro 0.23.0", - "near-stdx 0.23.0", - "near-time 0.23.0", - "num-rational", + "near-crypto 0.26.0", + "near-fmt 0.26.0", + "near-parameters 0.26.0", + "near-primitives-core 0.26.0", + "near-rpc-error-macro 0.26.0", + "near-stdx 0.26.0", + "near-structs-checker-lib", + "near-time 0.26.0", + "num-rational 0.3.2", "once_cell", + "ordered-float", "primitive-types 0.10.1", "rand 0.8.5", "rand_chacha 0.3.1", - "reed-solomon-erasure", "serde", "serde_json", "serde_with", "sha3", "smart-default", "strum 0.24.1", - "thiserror", + "thiserror 1.0.69", "tracing", "zstd 0.13.2", ] [[package]] name = "near-primitives" -version = "0.26.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "165c2dc0fc20d839cfd7948d930ef5e8a4ed2b095abe83e0076ef5d4a5df58ed" +checksum = "b45b4742a1817ff7d80dcf51c6facb8134478f8c4a6d717825cca2e4b834b17f" dependencies = [ "arbitrary", "base64 0.21.7", - "borsh 1.5.1", + "bitvec", + "borsh 1.5.3", "bytes", "bytesize", "cfg-if 1.0.0", @@ -5346,28 +6130,23 @@ dependencies = [ "easy-ext", "enum-map", "hex", - "itertools 0.10.5", - "near-crypto 0.26.0", - "near-fmt 0.26.0", - "near-parameters 0.26.0", - "near-primitives-core 0.26.0", - "near-rpc-error-macro 0.26.0", - "near-stdx 0.26.0", - "near-structs-checker-lib", - "near-time 0.26.0", - "num-rational", - "once_cell", + "near-crypto 0.27.0", + "near-fmt 0.27.0", + "near-parameters 0.27.0", + "near-primitives-core 0.27.0", + "near-schema-checker-lib", + "near-stdx 0.27.0", + "near-time 0.27.0", + "num-rational 0.3.2", "ordered-float", "primitive-types 0.10.1", - "rand 0.8.5", - "rand_chacha 0.3.1", "serde", "serde_json", "serde_with", "sha3", "smart-default", "strum 0.24.1", - "thiserror", + "thiserror 1.0.69", "tracing", "zstd 0.13.2", ] @@ -5380,67 +6159,68 @@ checksum = "082b1d3f6c7e273ec5cd9588e00bdbfc51be6cc9a3a7ec31fc899b4b7d2d3f9d" dependencies = [ "arbitrary", "base64 0.21.7", - "borsh 1.5.1", + "borsh 1.5.3", "bs58 0.4.0", "derive_more 0.99.18", "enum-map", "near-account-id", - "num-rational", + "num-rational 0.3.2", "serde", "serde_repr", "serde_with", - "sha2", + "sha2 0.10.8", "strum 0.24.1", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "near-primitives-core" -version = "0.23.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45de00d413f5bb890a3912f32fcd0974b2b0a975cc7874012e2c4c4fa7f28917" +checksum = "51fd53f992168589c52022dd220c84a7f2ede92251631a06a3817e4b22af5836" dependencies = [ "arbitrary", "base64 0.21.7", - "borsh 1.5.1", + "borsh 1.5.3", "bs58 0.4.0", "derive_more 0.99.18", "enum-map", "near-account-id", - "num-rational", + "near-structs-checker-lib", + "num-rational 0.3.2", "serde", "serde_repr", - "sha2", - "thiserror", + "sha2 0.10.8", + "thiserror 1.0.69", ] [[package]] name = "near-primitives-core" -version = "0.26.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51fd53f992168589c52022dd220c84a7f2ede92251631a06a3817e4b22af5836" +checksum = "0de2c9da5de096b5cd4786a270900ff32a49d267e442a2e7f271fb23eb925c87" dependencies = [ "arbitrary", "base64 0.21.7", - "borsh 1.5.1", + "borsh 1.5.3", "bs58 0.4.0", "derive_more 0.99.18", "enum-map", "near-account-id", - "near-structs-checker-lib", - "num-rational", + "near-schema-checker-lib", + "num-rational 0.3.2", "serde", "serde_repr", - "sha2", - "thiserror", + "sha2 0.10.8", + "thiserror 1.0.69", ] [[package]] name = "near-rpc-client" version = "0.1.0" -source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs#542c21874b286e62d9e9420f44a1cd967084fac3" +source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs?branch=refactor%2Fconnectors#2585f2e681cd2f0513f663227ff2ca10c6eefd5f" dependencies = [ - "borsh 1.5.1", + "borsh 1.5.3", "lazy_static", "near-crypto 0.21.2", "near-jsonrpc-client 0.9.0", @@ -5448,7 +6228,7 @@ dependencies = [ "near-primitives 0.21.2", "reqwest 0.11.27", "serde_json", - "thiserror", + "thiserror 2.0.4", "tokio", ] @@ -5460,18 +6240,7 @@ checksum = "3610517a56329b7cce0c8c4cf2686fc4bbe0b155181b118acf20d2a301bf29b6" dependencies = [ "quote", "serde", - "syn 2.0.87", -] - -[[package]] -name = "near-rpc-error-core" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf41b149dcc1f5a35d6a96fbcd8c28c92625c05b52025a72ee7378c72bcd68ce" -dependencies = [ - "quote", - "serde", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -5482,7 +6251,7 @@ checksum = "df598b0785a3e36d7e4fb73afcdf20536988b13d07cead71dfa777db4783e552" dependencies = [ "quote", "serde", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -5494,39 +6263,50 @@ dependencies = [ "fs2", "near-rpc-error-core 0.21.2", "serde", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] name = "near-rpc-error-macro" -version = "0.23.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73c7f0f12f426792dd2c9d83df43d73c3b15d80f6e99e8d0e16ff3e024d0f9ba" +checksum = "647ef261df99ad877c08c97af2f10368c8b8cde0968250d3482a5a249e9f3926" dependencies = [ - "near-rpc-error-core 0.23.0", + "near-rpc-error-core 0.26.0", "serde", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] -name = "near-rpc-error-macro" -version = "0.26.0" +name = "near-schema-checker-core" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "647ef261df99ad877c08c97af2f10368c8b8cde0968250d3482a5a249e9f3926" +checksum = "03541d1dadd0b5dd0a2e1ae1fbe5735fdab79332ed556af36cdcbe50d4b8cf04" + +[[package]] +name = "near-schema-checker-lib" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa9050b0822d2c0dbd90d8c523fd74634f77c5be4ed3337e7010c0d986121982" dependencies = [ - "near-rpc-error-core 0.26.0", - "serde", - "syn 2.0.87", + "near-schema-checker-core", + "near-schema-checker-macro", ] +[[package]] +name = "near-schema-checker-macro" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1bca8c93ff0ad17138c147323a07f036d11c9e1602e3bc2ac9d29c3cf78b89d" + [[package]] name = "near-sdk" -version = "5.5.0" +version = "5.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e296b02c85539c16659e171242d6c6bbea87eec7c9ef860d8dfd3fb3168a18a" +checksum = "581c7e6b1962fca1637bf668c18b498328100f8974aa798ed44702ba77c3bdac" dependencies = [ "base64 0.22.1", - "borsh 1.5.1", + "borsh 1.5.3", "bs58 0.5.1", "near-account-id", "near-gas", @@ -5541,9 +6321,9 @@ dependencies = [ [[package]] name = "near-sdk-macros" -version = "5.5.0" +version = "5.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0adc79466aa556f56a995c0db34a933b32597ab92bbb0e526597118899c8bcaf" +checksum = "0818798144d69a248d76e22b04d1b89b84b80575c96c4af0f7f0332b22487a08" dependencies = [ "Inflector", "darling 0.20.10", @@ -5553,7 +6333,7 @@ dependencies = [ "serde_json", "strum 0.26.3", "strum_macros 0.26.4", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -5564,15 +6344,15 @@ checksum = "73a697f311c110d0fabae6c8c49ab0a8eff0ec37df82cc860deba92156e77c43" [[package]] name = "near-stdx" -version = "0.23.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29e1897481272eb144328abd51ca9f59b5b558e7a6dc6e2177c8c9bb18fbd818" +checksum = "6d5c43f6181873287ddaa25edcc2943d0f2d5da9588231516f2ed0549db1fbac" [[package]] name = "near-stdx" -version = "0.26.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d5c43f6181873287ddaa25edcc2943d0f2d5da9588231516f2ed0549db1fbac" +checksum = "427b4e4af5e32f682064772da8b1a7558b3f090e6151c8804cff24ee6c5c4966" [[package]] name = "near-structs-checker-core" @@ -5604,9 +6384,9 @@ checksum = "dbf4ca5c805cb78700e10e43484902d8da05f25788db277999d209568aaf4c8e" [[package]] name = "near-time" -version = "0.23.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56db32f26b089441c1a7c5451f0d68637afa9d66f6d8f6a6f2d6c2f7953520a" +checksum = "f1d37b864f04d9aebbc3b88ac63ba989d94f221de694bcc8af639cc284a89f64" dependencies = [ "once_cell", "serde", @@ -5616,14 +6396,12 @@ dependencies = [ [[package]] name = "near-time" -version = "0.26.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1d37b864f04d9aebbc3b88ac63ba989d94f221de694bcc8af639cc284a89f64" +checksum = "66ade805f0ca8211f0ca2e6ea130f8ddd03bf70c9c93ebeabdddf37314e3f30b" dependencies = [ - "once_cell", "serde", "time", - "tokio", ] [[package]] @@ -5632,7 +6410,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd3e60aa26a74dc514b1b6408fdd06cefe2eb0ff029020956c1c6517594048fd" dependencies = [ - "borsh 1.5.1", + "borsh 1.5.3", "serde", ] @@ -5649,7 +6427,7 @@ dependencies = [ "rkyv", "smallvec", "target-lexicon 0.12.16", - "thiserror", + "thiserror 1.0.69", "tracing", "wasmparser 0.99.0", ] @@ -5696,7 +6474,7 @@ dependencies = [ "rkyv", "rustc-demangle", "target-lexicon 0.12.16", - "thiserror", + "thiserror 1.0.69", "tracing", ] @@ -5708,8 +6486,8 @@ checksum = "20569500ca56e161c6ed81da9a24c7bf7b974c4238b2f08b2582113b66fa0060" dependencies = [ "anyhow", "base64 0.21.7", - "borsh 1.5.1", - "ed25519-dalek", + "borsh 1.5.3", + "ed25519-dalek 2.1.1", "enum-map", "finite-wasm", "loupe", @@ -5724,7 +6502,7 @@ dependencies = [ "near-vm-engine", "near-vm-types", "near-vm-vm", - "num-rational", + "num-rational 0.3.2", "once_cell", "parity-wasm 0.41.0", "parity-wasm 0.42.2", @@ -5734,10 +6512,10 @@ dependencies = [ "serde", "serde_repr", "serde_with", - "sha2", + "sha2 0.10.8", "sha3", "strum 0.24.1", - "thiserror", + "thiserror 1.0.69", "tracing", "wasm-encoder 0.27.0", "wasmer-compiler-near", @@ -5762,7 +6540,7 @@ dependencies = [ "indexmap 1.9.3", "num-traits", "rkyv", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -5782,7 +6560,7 @@ dependencies = [ "near-vm-types", "region", "rkyv", - "thiserror", + "thiserror 1.0.69", "tracing", "wasmparser 0.99.0", "winapi", @@ -5808,8 +6586,43 @@ dependencies = [ ] [[package]] -name = "nu-ansi-term" -version = "0.46.0" +name = "nix" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" +dependencies = [ + "bitflags 2.6.0", + "cfg-if 1.0.0", + "cfg_aliases", + "libc", + "memoffset 0.9.1", +] + +[[package]] +name = "no-std-compat" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b93853da6d84c2e3c7d730d6473e8817692dd89be387eb01b94d7f108ecb5b8c" + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "nonzero_ext" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38bf9645c8b145698bb0b18a4637dcacbc421ea49bef2317e4fd8065a387cf21" + +[[package]] +name = "nu-ansi-term" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" dependencies = [ @@ -5817,6 +6630,31 @@ dependencies = [ "winapi", ] +[[package]] +name = "num" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8536030f9fea7127f841b45bb6243b27255787fb4eb83958aa1ef9d2fdc0c36" +dependencies = [ + "num-bigint 0.2.6", + "num-complex", + "num-integer", + "num-iter", + "num-rational 0.2.4", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + [[package]] name = "num-bigint" version = "0.3.3" @@ -5838,12 +6676,44 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-complex" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6b19411a9719e753aff12e5187b74d60d3dc449ec3f4dc21e3989c3f554bc95" +dependencies = [ + "autocfg", + "num-traits", +] + [[package]] name = "num-conv" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +[[package]] +name = "num-derive" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", +] + [[package]] name = "num-integer" version = "0.1.46" @@ -5853,6 +6723,29 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c000134b5dbf44adc5cb772486d335293351644b801551abe8f75c84cfa4aef" +dependencies = [ + "autocfg", + "num-bigint 0.2.6", + "num-integer", + "num-traits", +] + [[package]] name = "num-rational" version = "0.3.2" @@ -5904,9 +6797,15 @@ dependencies = [ "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] +[[package]] +name = "number_prefix" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" + [[package]] name = "object" version = "0.32.2" @@ -5915,7 +6814,7 @@ checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" dependencies = [ "crc32fast", "hashbrown 0.14.5", - "indexmap 2.6.0", + "indexmap 2.7.0", "memchr", ] @@ -5928,17 +6827,28 @@ dependencies = [ "memchr", ] +[[package]] +name = "oid-registry" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bedf36ffb6ba96c2eb7144ef6270557b52e54b20c0a8e1eb2ff99a6c6959bff" +dependencies = [ + "asn1-rs", +] + [[package]] name = "omni-connector" version = "0.1.0" -source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs#542c21874b286e62d9e9420f44a1cd967084fac3" +source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs?branch=refactor%2Fconnectors#2585f2e681cd2f0513f663227ff2ca10c6eefd5f" dependencies = [ - "borsh 1.5.1", + "borsh 1.5.3", "bridge-connector-common", "derive_builder 0.20.2", "eth-proof", "ethers", + "evm-bridge-client", "hex", + "near-bridge-client", "near-contract-standards", "near-crypto 0.21.2", "near-jsonrpc-client 0.9.0", @@ -5948,7 +6858,10 @@ dependencies = [ "omni-types", "serde_json", "sha3", + "solana-bridge-client", + "solana-sdk", "tracing", + "wormhole-bridge-client", ] [[package]] @@ -5957,15 +6870,17 @@ version = "0.1.0" dependencies = [ "alloy", "anyhow", - "borsh 1.5.1", + "borsh 1.5.3", "chrono", "clap", "dotenv", "eth-proof", "ethereum-types 0.14.1", + "evm-bridge-client", "futures", "hex", "log", + "near-bridge-client", "near-crypto 0.26.0", "near-jsonrpc-client 0.13.0", "near-jsonrpc-primitives 0.26.0", @@ -5979,21 +6894,23 @@ dependencies = [ "secp256k1 0.30.0", "serde", "serde_json", + "solana-bridge-client", "tokio", "tokio-stream", "toml 0.8.19", + "wormhole-bridge-client", ] [[package]] name = "omni-types" version = "2.0.0" -source = "git+https://github.com/near-one/omni-bridge?rev=234cc6af6920027f779b842a6d8afc00530ddbc2#234cc6af6920027f779b842a6d8afc00530ddbc2" +source = "git+https://github.com/near-one/omni-bridge?rev=11ffdb63706ceba175f7581585bd837aad9f1559#11ffdb63706ceba175f7581585bd837aad9f1559" dependencies = [ "alloy-primitives", "alloy-rlp", "alloy-sol-macro", "alloy-sol-types", - "borsh 1.5.1", + "borsh 1.5.3", "ethereum-types 0.15.1", "hex", "near-contract-standards", @@ -6022,7 +6939,7 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "786393f80485445794f6043fd3138854dd109cc6c4bd1a6383db304c9ce9b9ce" dependencies = [ - "arrayvec 0.7.6", + "arrayvec", "auto_impl", "bytes", "ethereum-types 0.14.1", @@ -6064,7 +6981,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -6073,6 +6990,15 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +[[package]] +name = "openssl-src" +version = "300.4.1+3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faa4eac4138c62414b5622d1b31c5c304f34b406b013c079c2bbc652fdd6678c" +dependencies = [ + "cc", +] + [[package]] name = "openssl-sys" version = "0.9.104" @@ -6081,6 +7007,7 @@ checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" dependencies = [ "cc", "libc", + "openssl-src", "pkg-config", "vcpkg", ] @@ -6101,7 +7028,7 @@ dependencies = [ "percent-encoding", "pin-project", "rand 0.8.5", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-stream", ] @@ -6118,7 +7045,7 @@ dependencies = [ "http 0.2.12", "opentelemetry", "prost", - "thiserror", + "thiserror 1.0.69", "tokio", "tonic", "tonic-build", @@ -6145,7 +7072,7 @@ version = "4.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c65ee1f9701bf938026630b455d5315f490640234259037edb259798b3bcf85e" dependencies = [ - "borsh 1.5.1", + "borsh 1.5.3", "num-traits", "rand 0.8.5", "serde", @@ -6171,7 +7098,7 @@ checksum = "51f44edd08f51e2ade572f141051021c5af22677e42b7dd28a88155151c33594" dependencies = [ "ecdsa 0.14.8", "elliptic-curve 0.12.3", - "sha2", + "sha2 0.10.8", ] [[package]] @@ -6190,7 +7117,7 @@ version = "3.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee" dependencies = [ - "arrayvec 0.7.6", + "arrayvec", "bitvec", "byte-slice-cast", "impl-trait-for-tuples", @@ -6222,6 +7149,12 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be5e13c266502aadf83426d87d81a0f5d1ef45b8027f5a471c360abfe4bfae92" +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + [[package]] name = "parking_lot" version = "0.10.2" @@ -6299,9 +7232,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" dependencies = [ "digest 0.10.7", - "hmac", + "hmac 0.12.1", "password-hash", - "sha2", + "sha2 0.10.8", ] [[package]] @@ -6311,7 +7244,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" dependencies = [ "digest 0.10.7", - "hmac", + "hmac 0.12.1", ] [[package]] @@ -6329,6 +7262,15 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +[[package]] +name = "percentage" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fd23b938276f14057220b707937bcb42fa76dda7560e57a2da30cb52d557937" +dependencies = [ + "num", +] + [[package]] name = "pest" version = "2.7.14" @@ -6336,7 +7278,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "879952a81a83930934cbf1786752d6dedc3b1f29e8f8fb2ad1d0a36f377cf442" dependencies = [ "memchr", - "thiserror", + "thiserror 1.0.69", "ucd-trie", ] @@ -6347,7 +7289,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.6.0", + "indexmap 2.7.0", ] [[package]] @@ -6390,7 +7332,7 @@ dependencies = [ "phf_shared 0.11.2", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -6428,7 +7370,7 @@ checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -6469,6 +7411,24 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" +[[package]] +name = "polyval" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" +dependencies = [ + "cfg-if 1.0.0", + "cpufeatures", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "portable-atomic" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "280dc24453071f1b63954171985a0b0d30058d287960968b9b2aca264c8d4ee6" + [[package]] name = "powerfmt" version = "0.2.0" @@ -6513,7 +7473,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" dependencies = [ "proc-macro2", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -6613,14 +7573,14 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] name = "proc-macro2" -version = "1.0.89" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" dependencies = [ "unicode-ident", ] @@ -6637,7 +7597,7 @@ dependencies = [ "memchr", "parking_lot 0.12.3", "protobuf", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -6721,9 +7681,9 @@ checksum = "106dd99e98437432fed6519dedecfade6a06a73bb7b2a1e019fdd2bee5778d94" [[package]] name = "psm" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa37f80ca58604976033fae9515a8a2989fc13797d953f7c04fb8fa36a11f205" +checksum = "200b9ff220857e53e184257720a14553b2f4aa02577d2ed9842d45d4b9654810" dependencies = [ "cc", ] @@ -6759,12 +7719,89 @@ dependencies = [ "parity-wasm 0.41.0", ] +[[package]] +name = "qstring" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d464fae65fff2680baf48019211ce37aaec0c78e9264c84a3e484717f965104e" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "quanta" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5167a477619228a0b284fac2674e3c388cba90631d7b7de620e6f1fcd08da5" +dependencies = [ + "crossbeam-utils", + "libc", + "once_cell", + "raw-cpuid", + "wasi 0.11.0+wasi-snapshot-preview1", + "web-sys", + "winapi", +] + [[package]] name = "quick-error" version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" +[[package]] +name = "quinn" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62e96808277ec6f97351a2380e6c25114bc9e67037775464979f3037c92d05ef" +dependencies = [ + "bytes", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash 2.1.0", + "rustls 0.23.19", + "socket2", + "thiserror 2.0.4", + "tokio", + "tracing", +] + +[[package]] +name = "quinn-proto" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d" +dependencies = [ + "bytes", + "getrandom 0.2.15", + "rand 0.8.5", + "ring 0.17.8", + "rustc-hash 2.1.0", + "rustls 0.23.19", + "rustls-pki-types", + "rustls-platform-verifier", + "slab", + "thiserror 2.0.4", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5a626c6807713b15cac82a6acaccd6043c9a5408c24baae07611fec3f243da" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.59.0", +] + [[package]] name = "quote" version = "1.0.37" @@ -6862,6 +7899,15 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "raw-cpuid" +version = "11.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ab240315c661615f2ee9f0f2cd32d5a7343a84d5ebcccb99d46e6637565e7b0" +dependencies = [ + "bitflags 2.6.0", +] + [[package]] name = "rayon" version = "1.10.0" @@ -6884,15 +7930,16 @@ dependencies = [ [[package]] name = "redis" -version = "0.27.5" +version = "0.27.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cccf17a692ce51b86564334614d72dcae1def0fd5ecebc9f02956da74352b5" +checksum = "09d8f99a4090c89cc489a94833c901ead69bfbf3877b4867d5482e321ee875bc" dependencies = [ "arc-swap", "async-trait", "bytes", - "combine", + "combine 4.6.7", "futures-util", + "itertools 0.13.0", "itoa", "num-bigint 0.4.6", "percent-encoding", @@ -6901,7 +7948,7 @@ dependencies = [ "sha1_smol", "socket2", "tokio", - "tokio-util 0.7.12", + "tokio-util 0.7.13", "url", ] @@ -6928,7 +7975,7 @@ checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ "getrandom 0.2.15", "libredox", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -6961,7 +8008,7 @@ checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.8", + "regex-automata 0.4.9", "regex-syntax 0.8.5", ] @@ -6976,9 +8023,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", @@ -7030,6 +8077,7 @@ version = "0.11.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" dependencies = [ + "async-compression", "base64 0.21.7", "bytes", "encoding_rs", @@ -7045,6 +8093,7 @@ dependencies = [ "js-sys", "log", "mime", + "mime_guess", "native-tls", "once_cell", "percent-encoding", @@ -7059,6 +8108,7 @@ dependencies = [ "tokio", "tokio-native-tls", "tokio-rustls 0.24.1", + "tokio-util 0.7.13", "tower-service", "url", "wasm-bindgen", @@ -7079,11 +8129,11 @@ dependencies = [ "encoding_rs", "futures-core", "futures-util", - "h2 0.4.6", - "http 1.1.0", + "h2 0.4.7", + "http 1.2.0", "http-body 1.0.1", "http-body-util", - "hyper 1.5.0", + "hyper 1.5.1", "hyper-rustls 0.27.3", "hyper-tls 0.6.0", "hyper-util", @@ -7099,7 +8149,7 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", - "sync_wrapper 1.0.1", + "sync_wrapper 1.0.2", "system-configuration 0.6.1", "tokio", "tokio-native-tls", @@ -7111,6 +8161,21 @@ dependencies = [ "windows-registry", ] +[[package]] +name = "reqwest-middleware" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a735987236a8e238bf0296c7e351b999c188ccc11477f311b82b55c93984216" +dependencies = [ + "anyhow", + "async-trait", + "http 0.2.12", + "reqwest 0.11.27", + "serde", + "task-local-extensions", + "thiserror 1.0.69", +] + [[package]] name = "rfc6979" version = "0.3.1" @@ -7118,7 +8183,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" dependencies = [ "crypto-bigint 0.4.9", - "hmac", + "hmac 0.12.1", "zeroize", ] @@ -7128,7 +8193,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" dependencies = [ - "hmac", + "hmac 0.12.1", "subtle", ] @@ -7276,9 +8341,9 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustc-hash" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" +checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497" [[package]] name = "rustc-hex" @@ -7313,14 +8378,23 @@ dependencies = [ "semver 1.0.23", ] +[[package]] +name = "rusticata-macros" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" +dependencies = [ + "nom", +] + [[package]] name = "rustix" -version = "0.38.38" +version = "0.38.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa260229e6538e52293eeb577aabd09945a09d6d9cc0fc550ed7529056c2e32a" +checksum = "d7f649912bc1495e167a6edee79151c84b1bad49748cb4f1f1167f459f6224f6" dependencies = [ "bitflags 2.6.0", - "errno 0.3.9", + "errno 0.3.10", "libc", "linux-raw-sys", "windows-sys 0.52.0", @@ -7340,9 +8414,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.16" +version = "0.23.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eee87ff5d9b36712a58574e12e9f0ea80f915a5b0ac518d322b24a465617925e" +checksum = "934b404430bb06b3fae2cba809eb45a1ab1aecd64491213d7c3301b88393f8d1" dependencies = [ "once_cell", "ring 0.17.8", @@ -7364,6 +8438,19 @@ dependencies = [ "security-framework", ] +[[package]] +name = "rustls-native-certs" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5bfb394eeed242e909609f56089eecfe5fda225042e8b171791b9c95f5931e5" +dependencies = [ + "openssl-probe", + "rustls-pemfile 2.2.0", + "rustls-pki-types", + "schannel", + "security-framework", +] + [[package]] name = "rustls-pemfile" version = "1.0.4" @@ -7387,6 +8474,36 @@ name = "rustls-pki-types" version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" +dependencies = [ + "web-time", +] + +[[package]] +name = "rustls-platform-verifier" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4c7dc240fec5517e6c4eab3310438636cfe6391dfc345ba013109909a90d136" +dependencies = [ + "core-foundation", + "core-foundation-sys", + "jni", + "log", + "once_cell", + "rustls 0.23.19", + "rustls-native-certs 0.7.3", + "rustls-platform-verifier-android", + "rustls-webpki 0.102.8", + "security-framework", + "security-framework-sys", + "webpki-root-certs", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustls-platform-verifier-android" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" [[package]] name = "rustls-webpki" @@ -7453,9 +8570,9 @@ dependencies = [ [[package]] name = "scale-info" -version = "2.11.5" +version = "2.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aa7ffc1c0ef49b0452c6e2986abf2b07743320641ffd5fc63d552458e3b779b" +checksum = "346a3b32eba2640d17a9cb5927056b08f3de90f65b72fe09402c2ad07d684d0b" dependencies = [ "cfg-if 1.0.0", "derive_more 1.0.0", @@ -7465,41 +8582,58 @@ dependencies = [ [[package]] name = "scale-info-derive" -version = "2.11.5" +version = "2.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46385cc24172cf615450267463f937c10072516359b3ff1cb24228a4a08bf951" +checksum = "c6630024bf739e2179b91fb424b28898baf819414262c5d376677dbff1fe7ebf" dependencies = [ "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] name = "schannel" -version = "0.1.26" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01227be5826fa0690321a2ba6c5cd57a19cf3f6a09e76973b58e61de6ab9d1c1" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "schnellru" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9a8ef13a93c54d20580de1e5c413e624e53121d42fc7e2c11d10ef7f8b02367" +dependencies = [ + "ahash 0.8.11", + "cfg-if 1.0.0", + "hashbrown 0.13.2", +] + [[package]] name = "scopeguard" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "scroll" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04c565b551bafbef4157586fa379538366e4385d42082f255bfd96e4fe8519da" + [[package]] name = "scrypt" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f9e24d2b632954ded8ab2ef9fea0a0c769ea56ea98bddbafbad22caeeadf45d" dependencies = [ - "hmac", + "hmac 0.12.1", "pbkdf2 0.11.0", "salsa20", - "sha2", + "sha2 0.10.8", ] [[package]] @@ -7595,14 +8729,15 @@ dependencies = [ "core-foundation", "core-foundation-sys", "libc", + "num-bigint 0.4.6", "security-framework-sys", ] [[package]] name = "security-framework-sys" -version = "2.12.0" +version = "2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6" +checksum = "fa39c7303dc58b5543c94d22c1766b0d31f2ee58306363ea622b10bbc075eaa2" dependencies = [ "core-foundation-sys", "libc", @@ -7623,7 +8758,7 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" dependencies = [ - "semver-parser 0.10.2", + "semver-parser 0.10.3", ] [[package]] @@ -7643,9 +8778,9 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "semver-parser" -version = "0.10.2" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" +checksum = "9900206b54a3527fdc7b8a938bffd94a568bac4f4aa8113b209df75a09c0dec2" dependencies = [ "pest", ] @@ -7664,9 +8799,9 @@ checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" [[package]] name = "serde" -version = "1.0.214" +version = "1.0.215" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5" +checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f" dependencies = [ "serde_derive", ] @@ -7692,20 +8827,20 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.214" +version = "1.0.215" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" +checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] name = "serde_json" -version = "1.0.132" +version = "1.0.133" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" +checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" dependencies = [ "itoa", "memchr", @@ -7721,7 +8856,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -7755,7 +8890,7 @@ dependencies = [ "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.6.0", + "indexmap 2.7.0", "serde", "serde_derive", "serde_json", @@ -7772,7 +8907,7 @@ dependencies = [ "darling 0.20.10", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -7781,7 +8916,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.6.0", + "indexmap 2.7.0", "itoa", "ryu", "serde", @@ -7805,6 +8940,19 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d" +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if 1.0.0", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + [[package]] name = "sha2" version = "0.10.8" @@ -7864,132 +9012,1927 @@ dependencies = [ name = "signature" version = "1.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" +checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" +dependencies = [ + "digest 0.10.7", + "rand_core 0.6.4", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest 0.10.7", + "rand_core 0.6.4", +] + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + +[[package]] +name = "simple_asn1" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085" +dependencies = [ + "num-bigint 0.4.6", + "num-traits", + "thiserror 1.0.69", + "time", +] + +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "slice-group-by" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "826167069c09b99d56f31e9ae5c99049e932a98c9dc2dac47645b08dbbf76ba7" + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "smart-default" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "133659a15339456eeeb07572eb02a91c91e9815e9cbc89566944d2c8d3efdbf6" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "socket2" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "solana-account" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fc175269051361f32d8651405676a59ba229173cf51d33a36cd0d00e28170ee" +dependencies = [ + "bincode", + "serde", + "serde_bytes", + "serde_derive", + "solana-instruction", + "solana-program", +] + +[[package]] +name = "solana-account-decoder" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ba531da629cc203b5044e632ce1b3543e80681e1a6223014aa0b5a937e3c9bc" +dependencies = [ + "Inflector", + "base64 0.22.1", + "bincode", + "bs58 0.5.1", + "bv", + "lazy_static", + "serde", + "serde_derive", + "serde_json", + "solana-account-decoder-client-types", + "solana-config-program", + "solana-sdk", + "spl-token 6.0.0", + "spl-token-2022 4.0.0", + "spl-token-group-interface 0.3.0", + "spl-token-metadata-interface 0.4.0", + "thiserror 1.0.69", + "zstd 0.13.2", +] + +[[package]] +name = "solana-account-decoder-client-types" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c818475cd26500a5f4c8a214fcfdbfc9070a0847085c915fbbde78f88efceb6" +dependencies = [ + "base64 0.22.1", + "bs58 0.5.1", + "serde", + "serde_derive", + "serde_json", + "solana-account", + "solana-pubkey", + "zstd 0.13.2", +] + +[[package]] +name = "solana-account-info" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57f86633175ed13054cf901a9386e4f447ba51917fc93e746b76658e57cd87a1" +dependencies = [ + "bincode", + "serde", + "solana-program-error", + "solana-program-memory", + "solana-pubkey", +] + +[[package]] +name = "solana-atomic-u64" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11b89f3a07c2bd4aeab92616b7be2fd39c2bbe2caf0702cd561cabc59e4e5a19" +dependencies = [ + "parking_lot 0.12.3", +] + +[[package]] +name = "solana-bincode" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2c1720ee13a7ea06ace039d810af7c4e895f857315a0bdface95e839633cae" +dependencies = [ + "bincode", + "serde", + "solana-instruction", +] + +[[package]] +name = "solana-bn254" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ce95c5ff034d5ed2db19144e74b0a3598f32aee1a669164a9fe7bd4fca6a40a" +dependencies = [ + "ark-bn254", + "ark-ec", + "ark-ff 0.4.2", + "ark-serialize 0.4.2", + "bytemuck", + "solana-program", + "thiserror 1.0.69", +] + +[[package]] +name = "solana-borsh" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ce4df354110b7a3d40b0722028eabe87e897e4a316acb76ef27e6953e8eebe" +dependencies = [ + "borsh 0.10.4", + "borsh 1.5.3", +] + +[[package]] +name = "solana-bridge-client" +version = "0.1.0" +source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs?branch=refactor%2Fconnectors#2585f2e681cd2f0513f663227ff2ca10c6eefd5f" +dependencies = [ + "borsh 1.5.3", + "derive_builder 0.20.2", + "mpl-token-metadata", + "sha2 0.10.8", + "solana-client", + "solana-sdk", + "spl-associated-token-account", + "spl-token 7.0.0", + "thiserror 2.0.4", +] + +[[package]] +name = "solana-client" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f302bd43b697d9a27a4d21eafe20b7be13ebc8ddd22d64419eaa5a265fbc451c" +dependencies = [ + "async-trait", + "bincode", + "dashmap 5.5.3", + "futures", + "futures-util", + "indexmap 2.7.0", + "indicatif", + "log", + "quinn", + "rayon", + "solana-connection-cache", + "solana-measure", + "solana-pubsub-client", + "solana-quic-client", + "solana-rpc-client", + "solana-rpc-client-api", + "solana-rpc-client-nonce-utils", + "solana-sdk", + "solana-streamer", + "solana-thin-client", + "solana-tpu-client", + "solana-udp-client", + "thiserror 1.0.69", + "tokio", +] + +[[package]] +name = "solana-clock" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf504af72783141ad1594958a4e8244d9589105143bc0b329972cbbbb6317137" +dependencies = [ + "serde", + "serde_derive", + "solana-sdk-macro", + "solana-sysvar-id", +] + +[[package]] +name = "solana-compute-budget" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f2b45606ec0f3045d695cd81da6dd35ccf8a71ad05d99d31d0a5e6028818e08" +dependencies = [ + "solana-sdk", +] + +[[package]] +name = "solana-config-program" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32c6881f452959ab16a3be51b700128ed91fd4b8dda3086d22a71ee6016595d3" +dependencies = [ + "bincode", + "chrono", + "serde", + "serde_derive", + "solana-log-collector", + "solana-program-runtime", + "solana-sdk", + "solana-short-vec", +] + +[[package]] +name = "solana-connection-cache" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7d4c9e78e187476f7dc4b3dfcbf1a32a386a5446a32234181f8babdaca009f8" +dependencies = [ + "async-trait", + "bincode", + "crossbeam-channel", + "futures-util", + "indexmap 2.7.0", + "log", + "rand 0.8.5", + "rayon", + "solana-measure", + "solana-metrics", + "solana-sdk", + "thiserror 1.0.69", + "tokio", +] + +[[package]] +name = "solana-cpi" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6246ad163c7a1ec62ef3182732b91748631af5214a13176257b98919e699fe4e" +dependencies = [ + "solana-account-info", + "solana-define-syscall", + "solana-instruction", + "solana-program-error", + "solana-pubkey", + "solana-stable-layout", +] + +[[package]] +name = "solana-curve25519" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85b8226b3a12bc753151a79e073bac46e0643c85a57a4fdeba7e15841116644f" +dependencies = [ + "bytemuck", + "bytemuck_derive", + "curve25519-dalek 4.1.3", + "solana-program", + "thiserror 1.0.69", +] + +[[package]] +name = "solana-decode-error" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61efcc865627988f6cc96cbe038776d16d378b7ed644268017f73ea8db947c0e" +dependencies = [ + "num-traits", +] + +[[package]] +name = "solana-define-syscall" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8973c0e4811e915f5ee84b68cea4af8231e8157f47b6f6a7aebbac2777227eb5" + +[[package]] +name = "solana-derivation-path" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b873e47fe9c2f2cbc674d555a4fba4513e12dd9e45e170f07d05901b40105b0c" +dependencies = [ + "derivation-path", + "qstring", + "uriparse", +] + +[[package]] +name = "solana-epoch-schedule" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44e1f2e668cf1c0ace134d6eb54635f1c1e60dd2cdd65e8b14adc4ac383b3e5f" +dependencies = [ + "serde", + "serde_derive", + "solana-sdk-macro", + "solana-sysvar-id", +] + +[[package]] +name = "solana-feature-set" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6992929b65cc56c406edde40483c9160476eef2479da1f324686649992ee4f5" +dependencies = [ + "lazy_static", + "solana-clock", + "solana-epoch-schedule", + "solana-hash", + "solana-pubkey", + "solana-sha256-hasher", +] + +[[package]] +name = "solana-fee-calculator" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cc687e6b60ddf1c0e0140a9cb4c524ea8d8c2836d7b723384c382cf8ceb462d" +dependencies = [ + "log", + "serde", + "serde_derive", +] + +[[package]] +name = "solana-hash" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1eb018925ea07bf67ce767430fd580a52ed7406f61844ece6b53fdd0d97e8b2e" +dependencies = [ + "borsh 1.5.3", + "bs58 0.5.1", + "bytemuck", + "bytemuck_derive", + "js-sys", + "serde", + "serde_derive", + "solana-atomic-u64", + "solana-sanitize", + "wasm-bindgen", +] + +[[package]] +name = "solana-inflation" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4c7ea5a7f6bef23a9abc26f2300c208f1d64c20b319245a92eb145d4579a412" +dependencies = [ + "serde", + "serde_derive", +] + +[[package]] +name = "solana-inline-spl" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57338f44084dcdda57146c49e66f5561eacb37b44573dffa550c25d9799518e8" +dependencies = [ + "bytemuck", + "solana-pubkey", +] + +[[package]] +name = "solana-instruction" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac2ccec24c601f939880ec3e9aa4824c689dafb8a3289987f3af6fdfb579f69" +dependencies = [ + "bincode", + "borsh 1.5.3", + "getrandom 0.2.15", + "js-sys", + "num-traits", + "serde", + "serde_derive", + "solana-define-syscall", + "solana-pubkey", + "wasm-bindgen", +] + +[[package]] +name = "solana-last-restart-slot" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdf7477c989eecc4b23f7f27ffd0e11492d3dd43c4ae5afcf24942e653def5de" +dependencies = [ + "serde", + "serde_derive", + "solana-sdk-macro", + "solana-sysvar-id", +] + +[[package]] +name = "solana-log-collector" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94415c115b9de46b906d797991986213639f86426fece3571c2b2dd992e79292" +dependencies = [ + "log", +] + +[[package]] +name = "solana-measure" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc36b279e4825178c07940cb0a64feb5cb58f57b6215e1415c3c90c91409b384" + +[[package]] +name = "solana-metrics" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b53cc12bfbc197ea85bc2c6fbd4f881ade20d09543c9d2666d9b25e996f685" +dependencies = [ + "crossbeam-channel", + "gethostname", + "lazy_static", + "log", + "reqwest 0.11.27", + "solana-sdk", + "thiserror 1.0.69", +] + +[[package]] +name = "solana-msg" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9ceb28774c48fa2bf3493e96216f530c4fe555b378062eaff0c597213c93ec7" +dependencies = [ + "solana-define-syscall", +] + +[[package]] +name = "solana-native-token" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed34b47a38511a53ea6aea47ebbcd0168971b095143b867d14f67a51392a2df5" + +[[package]] +name = "solana-net-utils" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95933bfbb79f654da5a0bb181f5d735f64a657b6bc9716e6d253f47df34b0121" +dependencies = [ + "bincode", + "crossbeam-channel", + "log", + "nix 0.29.0", + "rand 0.8.5", + "serde", + "serde_derive", + "socket2", + "solana-sdk", + "tokio", + "url", +] + +[[package]] +name = "solana-packet" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925a39e728e33a331a72737a1c90c1587951d7a5be8f9db6368ee73ea7a2c323" +dependencies = [ + "bincode", + "bitflags 2.6.0", + "cfg_eval", + "serde", + "serde_derive", + "serde_with", +] + +[[package]] +name = "solana-perf" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70d302f5567ee9d3ffd369980f42484c81144e4a2a8f6b8dd100743bb49d54b3" +dependencies = [ + "ahash 0.8.11", + "bincode", + "bv", + "caps", + "curve25519-dalek 4.1.3", + "dlopen2", + "fnv", + "lazy_static", + "libc", + "log", + "nix 0.29.0", + "rand 0.8.5", + "rayon", + "serde", + "solana-metrics", + "solana-rayon-threadlimit", + "solana-sdk", + "solana-short-vec", + "solana-vote-program", +] + +[[package]] +name = "solana-precompile-error" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0e5c73f0253cd8a3c25efb2f1e509e631a3181a0f7376c61d00f6b954042579" +dependencies = [ + "num-traits", + "solana-decode-error", +] + +[[package]] +name = "solana-program" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8318fafc6f83d0a84b29ea5db73e03abb7e8f5b797f2e14ec28eb5f50a07ee07" +dependencies = [ + "base64 0.22.1", + "bincode", + "bitflags 2.6.0", + "blake3", + "borsh 0.10.4", + "borsh 1.5.3", + "bs58 0.5.1", + "bv", + "bytemuck", + "bytemuck_derive", + "console_error_panic_hook", + "console_log", + "curve25519-dalek 4.1.3", + "five8_const", + "getrandom 0.2.15", + "js-sys", + "lazy_static", + "log", + "memoffset 0.9.1", + "num-bigint 0.4.6", + "num-derive 0.4.2", + "num-traits", + "parking_lot 0.12.3", + "rand 0.8.5", + "serde", + "serde_bytes", + "serde_derive", + "sha2 0.10.8", + "sha3", + "solana-account-info", + "solana-atomic-u64", + "solana-bincode", + "solana-borsh", + "solana-clock", + "solana-cpi", + "solana-decode-error", + "solana-define-syscall", + "solana-epoch-schedule", + "solana-fee-calculator", + "solana-hash", + "solana-instruction", + "solana-last-restart-slot", + "solana-msg", + "solana-native-token", + "solana-program-entrypoint", + "solana-program-error", + "solana-program-memory", + "solana-program-option", + "solana-program-pack", + "solana-pubkey", + "solana-rent", + "solana-sanitize", + "solana-sdk-macro", + "solana-secp256k1-recover", + "solana-serde-varint", + "solana-serialize-utils", + "solana-sha256-hasher", + "solana-short-vec", + "solana-slot-hashes", + "solana-slot-history", + "solana-stable-layout", + "solana-sysvar-id", + "solana-transaction-error", + "thiserror 1.0.69", + "wasm-bindgen", +] + +[[package]] +name = "solana-program-entrypoint" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fa45480f3ea73930aae9bcf379f605565cd0288feba78dab73a33fa96c8255a" +dependencies = [ + "solana-account-info", + "solana-msg", + "solana-program-error", + "solana-pubkey", +] + +[[package]] +name = "solana-program-error" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037b650450ebe2c0079319303e68cfdadda9806d0268200f08e1680a1d2b0796" +dependencies = [ + "borsh 1.5.3", + "num-traits", + "serde", + "serde_derive", + "solana-decode-error", + "solana-instruction", + "solana-msg", + "solana-pubkey", +] + +[[package]] +name = "solana-program-memory" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4cab560df1cca31a480d49f0a7de1eaba77b4335b1d964b4ff3dd6c90bc919f" +dependencies = [ + "num-traits", + "solana-define-syscall", +] + +[[package]] +name = "solana-program-option" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7adea2c59db099fdb6aa12519f7158265c4e43dcbf3ada77421fdf8fc6a60ff1" + +[[package]] +name = "solana-program-pack" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e59db3ffc2fe4d000ac4f2663f55f6e3c0b9e7a634a8e1ad2770cd37380b97" +dependencies = [ + "solana-program-error", +] + +[[package]] +name = "solana-program-runtime" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12cafddf4520976bfb5462002d158a2edd68d171ac4af07e0639fa5c1cf0d6f3" +dependencies = [ + "base64 0.22.1", + "bincode", + "enum-iterator", + "itertools 0.12.1", + "libc", + "log", + "num-derive 0.4.2", + "num-traits", + "percentage", + "rand 0.8.5", + "serde", + "solana-compute-budget", + "solana-feature-set", + "solana-log-collector", + "solana-measure", + "solana-metrics", + "solana-sdk", + "solana-timings", + "solana-type-overrides", + "solana-vote", + "solana_rbpf", + "thiserror 1.0.69", +] + +[[package]] +name = "solana-pubkey" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d75991d40b6717ad11d0357d435c494fbb2af46ffbffdec015d2abb2e5e8bd62" +dependencies = [ + "borsh 0.10.4", + "borsh 1.5.3", + "bs58 0.5.1", + "bytemuck", + "bytemuck_derive", + "curve25519-dalek 4.1.3", + "five8_const", + "getrandom 0.2.15", + "js-sys", + "num-traits", + "rand 0.8.5", + "serde", + "serde_derive", + "solana-atomic-u64", + "solana-decode-error", + "solana-define-syscall", + "solana-sanitize", + "solana-sha256-hasher", + "wasm-bindgen", +] + +[[package]] +name = "solana-pubsub-client" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f027b8985a475f32d48d3121833b510d9fe629b0de53778ae24cb43af045d5d" +dependencies = [ + "crossbeam-channel", + "futures-util", + "log", + "reqwest 0.11.27", + "semver 1.0.23", + "serde", + "serde_derive", + "serde_json", + "solana-account-decoder", + "solana-rpc-client-api", + "solana-sdk", + "thiserror 1.0.69", + "tokio", + "tokio-stream", + "tokio-tungstenite 0.20.1", + "tungstenite 0.20.1", + "url", +] + +[[package]] +name = "solana-quic-client" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925444d9129523f12b34a51a8855cd3ec8f4e807a3fe10dbe6012a4a4b8039d9" +dependencies = [ + "async-lock", + "async-trait", + "futures", + "itertools 0.12.1", + "lazy_static", + "log", + "quinn", + "quinn-proto", + "rustls 0.23.19", + "solana-connection-cache", + "solana-measure", + "solana-metrics", + "solana-net-utils", + "solana-rpc-client-api", + "solana-sdk", + "solana-streamer", + "thiserror 1.0.69", + "tokio", +] + +[[package]] +name = "solana-rayon-threadlimit" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd35d0923065953174ee0daeb15c79496356ea18ca92c3ac719544f8828eb2a" +dependencies = [ + "lazy_static", + "num_cpus", +] + +[[package]] +name = "solana-rent" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef59feb19504816b3910a901ef3586eb50d6e6bf68707fbd6275faa393a07d54" +dependencies = [ + "serde", + "serde_derive", + "solana-sdk-macro", + "solana-sysvar-id", +] + +[[package]] +name = "solana-rpc-client" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "069e0e9c89316166fd82892bac7cb4ccb3c252b42966fa44c1d112f2501b25b7" +dependencies = [ + "async-trait", + "base64 0.22.1", + "bincode", + "bs58 0.5.1", + "indicatif", + "log", + "reqwest 0.11.27", + "reqwest-middleware", + "semver 1.0.23", + "serde", + "serde_derive", + "serde_json", + "solana-account-decoder-client-types", + "solana-rpc-client-api", + "solana-sdk", + "solana-transaction-status-client-types", + "solana-version", + "solana-vote-program", + "tokio", +] + +[[package]] +name = "solana-rpc-client-api" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9da556eb0234c9b845df290f8adf78b651936bc6bfdfa2057d1958be60ae5f89" +dependencies = [ + "anyhow", + "base64 0.22.1", + "bs58 0.5.1", + "jsonrpc-core", + "reqwest 0.11.27", + "reqwest-middleware", + "semver 1.0.23", + "serde", + "serde_derive", + "serde_json", + "solana-account-decoder-client-types", + "solana-inline-spl", + "solana-sdk", + "solana-transaction-status-client-types", + "solana-version", + "thiserror 1.0.69", +] + +[[package]] +name = "solana-rpc-client-nonce-utils" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "379366d29add56b16e3c164789a6c0eb48175b2d6c4bb14ad9da0b4f88cea886" +dependencies = [ + "solana-rpc-client", + "solana-sdk", + "thiserror 1.0.69", +] + +[[package]] +name = "solana-sanitize" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2e1169636c290f2bc4d9fb3fc7ab137bf8646ec349212248fa6b96af7eb1807" + +[[package]] +name = "solana-sdk" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49364109ac57076e4722a6ef9c3cc0fafb8327a2d29cf964350fc91604b2b745" +dependencies = [ + "bincode", + "bitflags 2.6.0", + "borsh 1.5.3", + "bs58 0.5.1", + "bytemuck", + "bytemuck_derive", + "byteorder", + "chrono", + "digest 0.10.7", + "ed25519-dalek 1.0.1", + "ed25519-dalek-bip32", + "getrandom 0.1.16", + "hmac 0.12.1", + "itertools 0.12.1", + "js-sys", + "lazy_static", + "libsecp256k1", + "log", + "memmap2", + "num-derive 0.4.2", + "num-traits", + "num_enum", + "pbkdf2 0.11.0", + "rand 0.7.3", + "rand 0.8.5", + "serde", + "serde_bytes", + "serde_derive", + "serde_json", + "serde_with", + "sha2 0.10.8", + "sha3", + "siphasher", + "solana-account", + "solana-bn254", + "solana-decode-error", + "solana-derivation-path", + "solana-feature-set", + "solana-inflation", + "solana-instruction", + "solana-native-token", + "solana-packet", + "solana-precompile-error", + "solana-program", + "solana-program-memory", + "solana-pubkey", + "solana-sanitize", + "solana-sdk-macro", + "solana-secp256k1-recover", + "solana-secp256r1-program", + "solana-serde-varint", + "solana-short-vec", + "solana-signature", + "solana-transaction-error", + "thiserror 1.0.69", + "wasm-bindgen", +] + +[[package]] +name = "solana-sdk-macro" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "467496ce2b6ea87de69fa34c7dfd9a09197c50906fa5d35cd36025a3ba034e64" +dependencies = [ + "bs58 0.5.1", + "proc-macro2", + "quote", + "syn 2.0.90", +] + +[[package]] +name = "solana-secp256k1-recover" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "548f2b996441f5dbbc3b60fc9d59f20614807c5eddb2936a686036837d9b5c4e" +dependencies = [ + "borsh 1.5.3", + "libsecp256k1", + "solana-define-syscall", + "thiserror 1.0.69", +] + +[[package]] +name = "solana-secp256r1-program" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b71f9f41eef97932bbed8d4ed6b62df4643fd445a62996cbd4d5e0ac96ba6b9c" +dependencies = [ + "bytemuck", + "openssl", + "solana-feature-set", + "solana-instruction", + "solana-precompile-error", + "solana-pubkey", +] + +[[package]] +name = "solana-security-txt" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" + +[[package]] +name = "solana-serde-varint" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5022865cd3461837f6e8309fcaef816a2f6d46481aa6d307eb0689580fa3011" +dependencies = [ + "serde", +] + +[[package]] +name = "solana-serialize-utils" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aba668bcfbaa1deccef081f5174c1c7f4442c455f934ac0334f10b881550990" +dependencies = [ + "solana-instruction", + "solana-pubkey", + "solana-sanitize", +] + +[[package]] +name = "solana-sha256-hasher" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cee22aa72b8e5a58674d6b933ab8099915483a9f0fd5d0363540b32b200c7c6" +dependencies = [ + "sha2 0.10.8", + "solana-define-syscall", + "solana-hash", +] + +[[package]] +name = "solana-short-vec" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13773ca0f4bdf868440cd2dc389c4a02ce1ae3fafe062bf274bf4131bbf36a55" +dependencies = [ + "serde", +] + +[[package]] +name = "solana-signature" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "761eaf5d57cdceaf1e40bb1f1206ed40d713808bb536a29eab755edba24d8251" +dependencies = [ + "bs58 0.5.1", + "ed25519-dalek 1.0.1", + "generic-array 0.14.7", + "rand 0.8.5", + "serde", + "serde_derive", + "solana-sanitize", +] + +[[package]] +name = "solana-slot-hashes" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9c3c34cf7bf90511c914cbe34c6f1815812bcc0116c2f5dd39f597c1921ceb" +dependencies = [ + "serde", + "serde_derive", + "solana-hash", + "solana-sysvar-id", +] + +[[package]] +name = "solana-slot-history" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b23b5c0aed6181f3acd1906a73ad6e7f50f13774c3cce5714f52d142f42d6a8" +dependencies = [ + "bv", + "serde", + "serde_derive", + "solana-sysvar-id", +] + +[[package]] +name = "solana-stable-layout" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba0c6df67ce1caf21048320a79008aa56c514c6d940464af190bd02508e06888" +dependencies = [ + "solana-instruction", + "solana-pubkey", +] + +[[package]] +name = "solana-streamer" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156321c6a80a28376a4b8cfe450cc3cb9ff3ef6031c869c66730c5d1c7a5b39" +dependencies = [ + "async-channel", + "bytes", + "crossbeam-channel", + "dashmap 5.5.3", + "futures", + "futures-util", + "governor", + "histogram", + "indexmap 2.7.0", + "itertools 0.12.1", + "libc", + "log", + "nix 0.29.0", + "pem", + "percentage", + "quinn", + "quinn-proto", + "rand 0.8.5", + "rustls 0.23.19", + "smallvec", + "socket2", + "solana-measure", + "solana-metrics", + "solana-perf", + "solana-sdk", + "solana-transaction-metrics-tracker", + "thiserror 1.0.69", + "tokio", + "tokio-util 0.7.13", + "x509-parser", +] + +[[package]] +name = "solana-sysvar-id" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c14a73d5d544353f640fc0aef023939a5fed91a51b615286227d06d8074eaca7" +dependencies = [ + "solana-pubkey", +] + +[[package]] +name = "solana-thin-client" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0282df26de64893ff1747f6aebbc4cf9e1a48fdc3f9c2f5abb2678689e5f018d" +dependencies = [ + "bincode", + "log", + "rayon", + "solana-connection-cache", + "solana-rpc-client", + "solana-rpc-client-api", + "solana-sdk", +] + +[[package]] +name = "solana-timings" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b0e7496f3c01ea411307c737c4fc1e1cce0702ef25c8214fc0eb19e555bb714" +dependencies = [ + "eager", + "enum-iterator", + "solana-sdk", +] + +[[package]] +name = "solana-tpu-client" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9edcd8cefc03f0fada182c669e2d5fb274769e409af573a53a9be2367d5b661" +dependencies = [ + "async-trait", + "bincode", + "futures-util", + "indexmap 2.7.0", + "indicatif", + "log", + "rayon", + "solana-connection-cache", + "solana-measure", + "solana-pubsub-client", + "solana-rpc-client", + "solana-rpc-client-api", + "solana-sdk", + "thiserror 1.0.69", + "tokio", +] + +[[package]] +name = "solana-transaction-error" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "941819f2d9a9c747417417ce7e569de5093809726667ea81ceec3a002a9de5b7" +dependencies = [ + "serde", + "serde_derive", + "solana-instruction", + "solana-sanitize", +] + +[[package]] +name = "solana-transaction-metrics-tracker" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e9a0b73abafab9e43a2edf7f87d9fb9c278675aa971dfaecb8f013ee9954041" +dependencies = [ + "base64 0.22.1", + "bincode", + "lazy_static", + "log", + "rand 0.8.5", + "solana-perf", + "solana-sdk", + "solana-short-vec", +] + +[[package]] +name = "solana-transaction-status-client-types" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0991234ba1e3dd61e64621f15ea203286df4f531cc878c96bb16e75ee465627" +dependencies = [ + "base64 0.22.1", + "bincode", + "bs58 0.5.1", + "serde", + "serde_derive", + "serde_json", + "solana-account-decoder-client-types", + "solana-sdk", + "solana-signature", + "thiserror 1.0.69", +] + +[[package]] +name = "solana-type-overrides" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ab02e327455bc5d1e7112c1ae2605e018088499b0ca8104a452d15d5bf5a7e7" +dependencies = [ + "lazy_static", + "rand 0.8.5", +] + +[[package]] +name = "solana-udp-client" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e96db922848a8af5118be6450b9578e96901bc2d9766c95e546ebf77d7b7060a" +dependencies = [ + "async-trait", + "solana-connection-cache", + "solana-net-utils", + "solana-sdk", + "solana-streamer", + "thiserror 1.0.69", + "tokio", +] + +[[package]] +name = "solana-version" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78f02c941987e7c6cdc66c344e178d8f20060343bfc19b9036d4f1ac4bcb00ba" +dependencies = [ + "semver 1.0.23", + "serde", + "serde_derive", + "solana-feature-set", + "solana-sanitize", + "solana-serde-varint", +] + +[[package]] +name = "solana-vote" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c8cfc69cb402926b1caac547b66c79526e5cc1a24bb471cff6c3635cc7b4087" +dependencies = [ + "itertools 0.12.1", + "log", + "serde", + "serde_derive", + "solana-sdk", + "thiserror 1.0.69", +] + +[[package]] +name = "solana-vote-program" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcd7208621ca973dca21cdb531ce16e5bb51249a9aac64abe08664944058ce68" +dependencies = [ + "bincode", + "log", + "num-derive 0.4.2", + "num-traits", + "serde", + "serde_derive", + "solana-feature-set", + "solana-metrics", + "solana-program", + "solana-program-runtime", + "solana-sdk", + "thiserror 1.0.69", +] + +[[package]] +name = "solana-zk-sdk" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1745e79296b52100d86a6c0b6413e93a81df0dd8e7612f14018e645597af95ab" +dependencies = [ + "aes-gcm-siv", + "base64 0.22.1", + "bincode", + "bytemuck", + "bytemuck_derive", + "curve25519-dalek 4.1.3", + "itertools 0.12.1", + "js-sys", + "lazy_static", + "merlin", + "num-derive 0.4.2", + "num-traits", + "rand 0.8.5", + "serde", + "serde_derive", + "serde_json", + "sha3", + "solana-derivation-path", + "solana-program", + "solana-sdk", + "subtle", + "thiserror 1.0.69", + "wasm-bindgen", + "zeroize", +] + +[[package]] +name = "solana-zk-token-sdk" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91c3da9372371eef8b32341b639c5861904875dd70518bb3fe882f104dc94912" +dependencies = [ + "aes-gcm-siv", + "base64 0.22.1", + "bincode", + "bytemuck", + "bytemuck_derive", + "byteorder", + "curve25519-dalek 4.1.3", + "itertools 0.12.1", + "lazy_static", + "merlin", + "num-derive 0.4.2", + "num-traits", + "rand 0.8.5", + "serde", + "serde_derive", + "serde_json", + "sha3", + "solana-curve25519", + "solana-derivation-path", + "solana-program", + "solana-sdk", + "subtle", + "thiserror 1.0.69", + "zeroize", +] + +[[package]] +name = "solana_rbpf" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c1941b5ef0c3ce8f2ac5dd984d0fb1a97423c4ff2a02eec81e3913f02e2ac2b" +dependencies = [ + "byteorder", + "combine 3.8.1", + "hash32", + "libc", + "log", + "rand 0.8.5", + "rustc-demangle", + "scroll", + "thiserror 1.0.69", + "winapi", +] + +[[package]] +name = "solang-parser" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c425ce1c59f4b154717592f0bdf4715c3a1d55058883622d3157e1f0908a5b26" +dependencies = [ + "itertools 0.11.0", + "lalrpop", + "lalrpop-util", + "phf", + "thiserror 1.0.69", + "unicode-xid", +] + +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "spinning_top" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d96d2d1d716fb500937168cc09353ffdc7a012be8475ac7308e1bdf0e3923300" +dependencies = [ + "lock_api 0.4.12", +] + +[[package]] +name = "spki" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" +dependencies = [ + "base64ct", + "der 0.6.1", +] + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der 0.7.9", +] + +[[package]] +name = "spl-associated-token-account" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76fee7d65013667032d499adc3c895e286197a35a0d3a4643c80e7fd3e9969e3" +dependencies = [ + "borsh 1.5.3", + "num-derive 0.4.2", + "num-traits", + "solana-program", + "spl-associated-token-account-client", + "spl-token 7.0.0", + "spl-token-2022 6.0.0", + "thiserror 1.0.69", +] + +[[package]] +name = "spl-associated-token-account-client" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f8349dbcbe575f354f9a533a21f272f3eb3808a49e2fdc1c34393b88ba76cb" +dependencies = [ + "solana-instruction", + "solana-pubkey", +] + +[[package]] +name = "spl-discriminator" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a38ea8b6dedb7065887f12d62ed62c1743aa70749e8558f963609793f6fb12bc" +dependencies = [ + "bytemuck", + "solana-program", + "spl-discriminator-derive", +] + +[[package]] +name = "spl-discriminator" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a20542d4c8264856d205c0090512f374dbf7b3124479a3d93ab6184ae3631aa" +dependencies = [ + "bytemuck", + "solana-program-error", + "solana-sha256-hasher", + "spl-discriminator-derive", +] + +[[package]] +name = "spl-discriminator-derive" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9e8418ea6269dcfb01c712f0444d2c75542c04448b480e87de59d2865edc750" +dependencies = [ + "quote", + "spl-discriminator-syn", + "syn 2.0.90", +] + +[[package]] +name = "spl-discriminator-syn" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c1f05593b7ca9eac7caca309720f2eafb96355e037e6d373b909a80fe7b69b9" +dependencies = [ + "proc-macro2", + "quote", + "sha2 0.10.8", + "syn 2.0.90", + "thiserror 1.0.69", +] + +[[package]] +name = "spl-elgamal-registry" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a157622a63a4d12fbd8b347fd75ee442cb913137fa98647824c992fb049a15b" +dependencies = [ + "bytemuck", + "solana-program", + "solana-zk-sdk", + "spl-pod 0.5.0", + "spl-token-confidential-transfer-proof-extraction", +] + +[[package]] +name = "spl-memo" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0dba2f2bb6419523405d21c301a32c9f9568354d4742552e7972af801f4bdb3" +dependencies = [ + "solana-program", +] + +[[package]] +name = "spl-memo" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f09647c0974e33366efeb83b8e2daebb329f0420149e74d3a4bd2c08cf9f7cb" +dependencies = [ + "solana-account-info", + "solana-instruction", + "solana-msg", + "solana-program-entrypoint", + "solana-program-error", + "solana-pubkey", +] + +[[package]] +name = "spl-pod" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c704c88fc457fa649ba3aabe195c79d885c3f26709efaddc453c8de352c90b87" +dependencies = [ + "borsh 1.5.3", + "bytemuck", + "bytemuck_derive", + "solana-program", + "solana-zk-token-sdk", + "spl-program-error 0.5.0", +] + +[[package]] +name = "spl-pod" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41a7d5950993e1ff2680bd989df298eeb169367fb2f9deeef1f132de6e4e8016" +dependencies = [ + "borsh 1.5.3", + "bytemuck", + "bytemuck_derive", + "num-derive 0.4.2", + "num-traits", + "solana-decode-error", + "solana-msg", + "solana-program-error", + "solana-program-option", + "solana-pubkey", + "solana-zk-sdk", + "thiserror 1.0.69", +] + +[[package]] +name = "spl-program-error" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7b28bed65356558133751cc32b48a7a5ddfc59ac4e941314630bbed1ac10532" +dependencies = [ + "num-derive 0.4.2", + "num-traits", + "solana-program", + "spl-program-error-derive", + "thiserror 1.0.69", +] + +[[package]] +name = "spl-program-error" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d39b5186f42b2b50168029d81e58e800b690877ef0b30580d107659250da1d1" +dependencies = [ + "num-derive 0.4.2", + "num-traits", + "solana-program", + "spl-program-error-derive", + "thiserror 1.0.69", +] + +[[package]] +name = "spl-program-error-derive" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d375dd76c517836353e093c2dbb490938ff72821ab568b545fd30ab3256b3e" +dependencies = [ + "proc-macro2", + "quote", + "sha2 0.10.8", + "syn 2.0.90", +] + +[[package]] +name = "spl-tlv-account-resolution" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37a75a5f0fcc58126693ed78a17042e9dc53f07e357d6be91789f7d62aff61a4" dependencies = [ - "digest 0.10.7", - "rand_core 0.6.4", + "bytemuck", + "solana-program", + "spl-discriminator 0.3.0", + "spl-pod 0.3.1", + "spl-program-error 0.5.0", + "spl-type-length-value 0.5.0", ] [[package]] -name = "signature" -version = "2.2.0" +name = "spl-tlv-account-resolution" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +checksum = "cd99ff1e9ed2ab86e3fd582850d47a739fec1be9f4661cba1782d3a0f26805f3" dependencies = [ - "digest 0.10.7", - "rand_core 0.6.4", + "bytemuck", + "num-derive 0.4.2", + "num-traits", + "solana-account-info", + "solana-decode-error", + "solana-instruction", + "solana-msg", + "solana-program-error", + "solana-pubkey", + "spl-discriminator 0.4.0", + "spl-pod 0.5.0", + "spl-program-error 0.6.0", + "spl-type-length-value 0.7.0", + "thiserror 1.0.69", ] [[package]] -name = "simdutf8" -version = "0.1.5" +name = "spl-token" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" +checksum = "70a0f06ac7f23dc0984931b1fe309468f14ea58e32660439c1cef19456f5d0e3" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive 0.4.2", + "num-traits", + "num_enum", + "solana-program", + "thiserror 1.0.69", +] [[package]] -name = "simple_asn1" -version = "0.6.2" +name = "spl-token" +version = "7.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085" +checksum = "ed320a6c934128d4f7e54fe00e16b8aeaecf215799d060ae14f93378da6dc834" dependencies = [ - "num-bigint 0.4.6", + "arrayref", + "bytemuck", + "num-derive 0.4.2", "num-traits", - "thiserror", - "time", + "num_enum", + "solana-program", + "thiserror 1.0.69", ] [[package]] -name = "siphasher" -version = "0.3.11" +name = "spl-token-2022" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" +checksum = "d9c10f3483e48679619c76598d4e4aebb955bc49b0a5cc63323afbf44135c9bf" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive 0.4.2", + "num-traits", + "num_enum", + "solana-program", + "solana-security-txt", + "solana-zk-token-sdk", + "spl-memo 5.0.0", + "spl-pod 0.3.1", + "spl-token 6.0.0", + "spl-token-group-interface 0.3.0", + "spl-token-metadata-interface 0.4.0", + "spl-transfer-hook-interface 0.7.0", + "spl-type-length-value 0.5.0", + "thiserror 1.0.69", +] [[package]] -name = "slab" -version = "0.4.9" +name = "spl-token-2022" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +checksum = "5b27f7405010ef816587c944536b0eafbcc35206ab6ba0f2ca79f1d28e488f4f" dependencies = [ - "autocfg", + "arrayref", + "bytemuck", + "num-derive 0.4.2", + "num-traits", + "num_enum", + "solana-program", + "solana-security-txt", + "solana-zk-sdk", + "spl-elgamal-registry", + "spl-memo 6.0.0", + "spl-pod 0.5.0", + "spl-token 7.0.0", + "spl-token-confidential-transfer-ciphertext-arithmetic", + "spl-token-confidential-transfer-proof-extraction", + "spl-token-confidential-transfer-proof-generation", + "spl-token-group-interface 0.5.0", + "spl-token-metadata-interface 0.6.0", + "spl-transfer-hook-interface 0.9.0", + "spl-type-length-value 0.7.0", + "thiserror 1.0.69", +] + +[[package]] +name = "spl-token-confidential-transfer-ciphertext-arithmetic" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1f1bf731fc65546330a7929a9735679add70f828dd076a4e69b59d3afb5423c" +dependencies = [ + "base64 0.22.1", + "bytemuck", + "solana-curve25519", + "solana-zk-sdk", ] [[package]] -name = "slice-group-by" -version = "0.3.1" +name = "spl-token-confidential-transfer-proof-extraction" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "826167069c09b99d56f31e9ae5c99049e932a98c9dc2dac47645b08dbbf76ba7" +checksum = "383937e637ccbe546f736d5115344351ebd4d2a076907582335261da58236816" +dependencies = [ + "bytemuck", + "solana-curve25519", + "solana-program", + "solana-zk-sdk", + "spl-pod 0.5.0", + "thiserror 1.0.69", +] [[package]] -name = "smallvec" -version = "1.13.2" +name = "spl-token-confidential-transfer-proof-generation" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +checksum = "8627184782eec1894de8ea26129c61303f1f0adeed65c20e0b10bc584f09356d" +dependencies = [ + "curve25519-dalek 4.1.3", + "solana-zk-sdk", + "thiserror 1.0.69", +] [[package]] -name = "smart-default" -version = "0.6.0" +name = "spl-token-group-interface" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "133659a15339456eeeb07572eb02a91c91e9815e9cbc89566944d2c8d3efdbf6" +checksum = "df8752b85a5ecc1d9f3a43bce3dd9a6a053673aacf5deb513d1cbb88d3534ffd" dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", + "bytemuck", + "solana-program", + "spl-discriminator 0.3.0", + "spl-pod 0.3.1", + "spl-program-error 0.5.0", ] [[package]] -name = "socket2" -version = "0.5.7" +name = "spl-token-group-interface" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +checksum = "d595667ed72dbfed8c251708f406d7c2814a3fa6879893b323d56a10bedfc799" dependencies = [ - "libc", - "windows-sys 0.52.0", + "bytemuck", + "num-derive 0.4.2", + "num-traits", + "solana-decode-error", + "solana-instruction", + "solana-msg", + "solana-program-error", + "solana-pubkey", + "spl-discriminator 0.4.0", + "spl-pod 0.5.0", + "thiserror 1.0.69", ] [[package]] -name = "solang-parser" -version = "0.3.3" +name = "spl-token-metadata-interface" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c425ce1c59f4b154717592f0bdf4715c3a1d55058883622d3157e1f0908a5b26" +checksum = "c6c2318ddff97e006ed9b1291ebec0750a78547f870f62a69c56fe3b46a5d8fc" dependencies = [ - "itertools 0.11.0", - "lalrpop", - "lalrpop-util", - "phf", - "thiserror", - "unicode-xid", + "borsh 1.5.3", + "solana-program", + "spl-discriminator 0.3.0", + "spl-pod 0.3.1", + "spl-program-error 0.5.0", + "spl-type-length-value 0.5.0", ] [[package]] -name = "spin" -version = "0.5.2" +name = "spl-token-metadata-interface" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" +checksum = "dfb9c89dbc877abd735f05547dcf9e6e12c00c11d6d74d8817506cab4c99fdbb" +dependencies = [ + "borsh 1.5.3", + "num-derive 0.4.2", + "num-traits", + "solana-borsh", + "solana-decode-error", + "solana-instruction", + "solana-msg", + "solana-program-error", + "solana-pubkey", + "spl-discriminator 0.4.0", + "spl-pod 0.5.0", + "spl-type-length-value 0.7.0", + "thiserror 1.0.69", +] [[package]] -name = "spin" -version = "0.9.8" +name = "spl-transfer-hook-interface" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +checksum = "a110f33d941275d9f868b96daaa993f1e73b6806cc8836e43075b4d3ad8338a7" +dependencies = [ + "arrayref", + "bytemuck", + "solana-program", + "spl-discriminator 0.3.0", + "spl-pod 0.3.1", + "spl-program-error 0.5.0", + "spl-tlv-account-resolution 0.7.0", + "spl-type-length-value 0.5.0", +] [[package]] -name = "spki" -version = "0.6.0" +name = "spl-transfer-hook-interface" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" +checksum = "4aa7503d52107c33c88e845e1351565050362c2314036ddf19a36cd25137c043" dependencies = [ - "base64ct", - "der 0.6.1", + "arrayref", + "bytemuck", + "num-derive 0.4.2", + "num-traits", + "solana-account-info", + "solana-cpi", + "solana-decode-error", + "solana-instruction", + "solana-msg", + "solana-program-error", + "solana-pubkey", + "spl-discriminator 0.4.0", + "spl-pod 0.5.0", + "spl-program-error 0.6.0", + "spl-tlv-account-resolution 0.9.0", + "spl-type-length-value 0.7.0", + "thiserror 1.0.69", +] + +[[package]] +name = "spl-type-length-value" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdcd73ec187bc409464c60759232e309f83b52a18a9c5610bf281c9c6432918c" +dependencies = [ + "bytemuck", + "solana-program", + "spl-discriminator 0.3.0", + "spl-pod 0.3.1", + "spl-program-error 0.5.0", ] [[package]] -name = "spki" -version = "0.7.3" +name = "spl-type-length-value" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +checksum = "ba70ef09b13af616a4c987797870122863cba03acc4284f226a4473b043923f9" dependencies = [ - "base64ct", - "der 0.7.9", + "bytemuck", + "num-derive 0.4.2", + "num-traits", + "solana-account-info", + "solana-decode-error", + "solana-msg", + "solana-program-error", + "spl-discriminator 0.4.0", + "spl-pod 0.5.0", + "thiserror 1.0.69", ] [[package]] @@ -8076,7 +11019,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -8099,8 +11042,8 @@ dependencies = [ "semver 1.0.23", "serde", "serde_json", - "sha2", - "thiserror", + "sha2 0.10.8", + "thiserror 1.0.69", "url", "zip", ] @@ -8118,9 +11061,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.87" +version = "2.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" +checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" dependencies = [ "proc-macro2", "quote", @@ -8129,26 +11072,14 @@ dependencies = [ [[package]] name = "syn-solidity" -version = "0.8.10" +version = "0.8.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16320d4a2021ba1a32470b3759676114a918885e9800e68ad60f2c67969fba62" +checksum = "da0523f59468a2696391f2a772edc089342aacd53c3caa2ac3264e598edf119b" dependencies = [ "paste", "proc-macro2", "quote", - "syn 2.0.87", -] - -[[package]] -name = "syn_derive" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b" -dependencies = [ - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -8159,13 +11090,25 @@ checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" [[package]] name = "sync_wrapper" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" dependencies = [ "futures-core", ] +[[package]] +name = "synstructure" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "unicode-xid", +] + [[package]] name = "synstructure" version = "0.13.1" @@ -8174,7 +11117,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -8237,11 +11180,20 @@ version = "0.12.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" +[[package]] +name = "task-local-extensions" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba323866e5d033818e3240feeb9f7db2c4296674e4d9e16b97b7bf8f490434e8" +dependencies = [ + "pin-utils", +] + [[package]] name = "tempfile" -version = "3.13.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" +checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" dependencies = [ "cfg-if 1.0.0", "fastrand", @@ -8272,22 +11224,42 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.68" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f49a1853cf82743e3b7950f77e0f4d622ca36cf4317cba00c767838bac8d490" +dependencies = [ + "thiserror-impl 2.0.4", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02dd99dc800bbb97186339685293e1cc5d9df1f8fae2d0aecd9ff1c77efea892" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ - "thiserror-impl", + "proc-macro2", + "quote", + "syn 2.0.90", ] [[package]] name = "thiserror-impl" -version = "1.0.68" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7c61ec9a6f64d2793d8a45faba21efbe3ced62a886d44c36a009b2b519b4c7e" +checksum = "8381894bb3efe0c4acac3ded651301ceee58a15d47c2e34885ed1908ad667061" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -8311,9 +11283,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.36" +version = "0.3.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" dependencies = [ "deranged", "itoa", @@ -8332,9 +11304,9 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" dependencies = [ "num-conv", "time-core", @@ -8376,9 +11348,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.41.0" +version = "1.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "145f3413504347a2be84393cc8a7d2fb4d863b375909ea59f2158261aa258bbb" +checksum = "5cec9b21b0450273377fc97bd4c33a8acffc8c996c987a7c5b319a0083707551" dependencies = [ "backtrace", "bytes", @@ -8410,7 +11382,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -8435,12 +11407,11 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.0" +version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" +checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" dependencies = [ - "rustls 0.23.16", - "rustls-pki-types", + "rustls 0.23.19", "tokio", ] @@ -8453,7 +11424,7 @@ dependencies = [ "futures-core", "pin-project-lite", "tokio", - "tokio-util 0.7.12", + "tokio-util 0.7.13", ] [[package]] @@ -8479,12 +11450,12 @@ checksum = "edc5f74e248dc973e0dbb7b74c7e0d6fcc301c694ff50049504004ef4d0cdcd9" dependencies = [ "futures-util", "log", - "rustls 0.23.16", + "rustls 0.23.19", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.0", + "tokio-rustls 0.26.1", "tungstenite 0.24.0", - "webpki-roots 0.26.6", + "webpki-roots 0.26.7", ] [[package]] @@ -8503,9 +11474,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.12" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" +checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" dependencies = [ "bytes", "futures-core", @@ -8550,7 +11521,7 @@ version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ - "indexmap 2.6.0", + "indexmap 2.7.0", "serde", "serde_spanned", "toml_datetime", @@ -8614,7 +11585,7 @@ dependencies = [ "rand 0.8.5", "slab", "tokio", - "tokio-util 0.7.12", + "tokio-util 0.7.13", "tower-layer", "tower-service", "tracing", @@ -8648,9 +11619,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.40" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ "log", "pin-project-lite", @@ -8665,27 +11636,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3566e8ce28cc0a3fe42519fc80e6b4c943cc4c8cef275620eb8dac2d3d4e06cf" dependencies = [ "crossbeam-channel", - "thiserror", + "thiserror 1.0.69", "time", "tracing-subscriber", ] [[package]] name = "tracing-attributes" -version = "0.1.27" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] name = "tracing-core" -version = "0.1.32" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" dependencies = [ "once_cell", "valuable", @@ -8739,9 +11710,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.18" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" dependencies = [ "matchers", "nu-ansi-term", @@ -8776,9 +11747,10 @@ dependencies = [ "rand 0.8.5", "rustls 0.21.12", "sha1", - "thiserror", + "thiserror 1.0.69", "url", "utf-8", + "webpki-roots 0.24.0", ] [[package]] @@ -8790,14 +11762,14 @@ dependencies = [ "byteorder", "bytes", "data-encoding", - "http 1.1.0", + "http 1.2.0", "httparse", "log", "rand 0.8.5", - "rustls 0.23.16", + "rustls 0.23.19", "rustls-pki-types", "sha1", - "thiserror", + "thiserror 1.0.69", "utf-8", ] @@ -8843,11 +11815,17 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" +[[package]] +name = "unicase" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df" + [[package]] name = "unicode-ident" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" [[package]] name = "unicode-segmentation" @@ -8855,12 +11833,43 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" +[[package]] +name = "unicode-width" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + +[[package]] +name = "unicode-width" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" + [[package]] name = "unicode-xid" version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" +[[package]] +name = "universal-hash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" +dependencies = [ + "crypto-common", + "subtle", +] + +[[package]] +name = "unreachable" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" +dependencies = [ + "void", +] + [[package]] name = "unsafe-libyaml" version = "0.2.11" @@ -8879,11 +11888,21 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" +[[package]] +name = "uriparse" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0200d0fc04d809396c2ad43f3c95da3582a2556eba8d453c1087f4120ee352ff" +dependencies = [ + "fnv", + "lazy_static", +] + [[package]] name = "url" -version = "2.5.3" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d157f1b96d14500ffdc1f10ba712e780825526c03d9a49b4d0324b0d9113ada" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ "form_urlencoded", "idna", @@ -9008,9 +12027,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.95" +version = "0.2.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +checksum = "d15e63b4482863c109d70a7b8706c1e364eb6ea449b201a76c5b89cedcec2d5c" dependencies = [ "cfg-if 1.0.0", "once_cell", @@ -9019,36 +12038,37 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.95" +version = "0.2.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" +checksum = "8d36ef12e3aaca16ddd3f67922bc63e48e953f126de60bd33ccc0101ef9998cd" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.45" +version = "0.4.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" +checksum = "9dfaf8f50e5f293737ee323940c7d8b08a66a95a419223d9f41610ca08b0833d" dependencies = [ "cfg-if 1.0.0", "js-sys", + "once_cell", "wasm-bindgen", "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.95" +version = "0.2.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +checksum = "705440e08b42d3e4b36de7d66c944be628d579796b8090bfa3471478a2260051" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -9056,22 +12076,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.95" +version = "0.2.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +checksum = "98c9ae5a76e46f4deecd0f0255cc223cfa18dc9b261213b8aa0c7b36f61b3f1d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.95" +version = "0.2.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" +checksum = "6ee99da9c5ba11bd675621338ef6fa52296b76b83305e9b6e5c77d4c286d6d49" [[package]] name = "wasm-encoder" @@ -9101,7 +12121,7 @@ dependencies = [ "rkyv", "smallvec", "target-lexicon 0.12.16", - "thiserror", + "thiserror 1.0.69", "wasmer-types-near", "wasmer-vm-near", "wasmparser 0.78.2", @@ -9139,7 +12159,7 @@ dependencies = [ "more-asserts", "rustc-demangle", "target-lexicon 0.12.16", - "thiserror", + "thiserror 1.0.69", "wasmer-compiler-near", "wasmer-types-near", "wasmer-vm-near", @@ -9156,7 +12176,7 @@ dependencies = [ "leb128", "region", "rkyv", - "thiserror", + "thiserror 1.0.69", "wasmer-compiler-near", "wasmer-engine-near", "wasmer-types-near", @@ -9166,21 +12186,21 @@ dependencies = [ [[package]] name = "wasmer-runtime-core-near" -version = "0.18.3" +version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3fac37da3c625e98708c5dd92d3f642aaf700fd077168d3d0fff277ec6a165" +checksum = "af9c54899b847f8bab6d47295487c9827f14cc411bd70b168e87a4ea017ccd7e" dependencies = [ "bincode", "blake3", - "borsh 0.9.3", + "borsh 1.5.3", "cc", "digest 0.8.1", "errno 0.2.8", "hex", - "indexmap 1.9.3", + "indexmap 2.7.0", "lazy_static", "libc", - "nix", + "nix 0.15.0", "page_size", "parking_lot 0.10.2", "rustc_version 0.2.3", @@ -9210,18 +12230,18 @@ dependencies = [ [[package]] name = "wasmer-singlepass-backend-near" -version = "0.18.1" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6edd0ba6c0bcf9b279186d4dbe81649dda3e5ef38f586865943de4dcd653f8" +checksum = "9358673d39c3b4a15374fba0536bfe5e50485e7c826de50d2dbef8c96df07674" dependencies = [ "bincode", - "borsh 0.9.3", + "borsh 1.5.3", "byteorder", "dynasm 1.2.3", "dynasmrt 1.2.3", "lazy_static", "libc", - "nix", + "nix 0.15.0", "serde", "serde_derive", "smallvec", @@ -9236,7 +12256,7 @@ checksum = "1ba154adffb0fbd33f5dabd3788a1744d846b43e6e090d44269c7ee8fa5743e4" dependencies = [ "indexmap 1.9.3", "rkyv", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -9254,7 +12274,7 @@ dependencies = [ "more-asserts", "region", "rkyv", - "thiserror", + "thiserror 1.0.69", "wasmer-types-near", "winapi", ] @@ -9297,7 +12317,7 @@ version = "0.115.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e06c0641a4add879ba71ccb3a1e4278fd546f76f1eafb21d8f7b07733b547cd5" dependencies = [ - "indexmap 2.6.0", + "indexmap 2.7.0", "semver 1.0.23", ] @@ -9322,7 +12342,7 @@ dependencies = [ "bumpalo", "cfg-if 1.0.0", "fxprof-processed-profile", - "indexmap 2.6.0", + "indexmap 2.7.0", "libc", "log", "object 0.32.2", @@ -9369,7 +12389,7 @@ dependencies = [ "log", "object 0.32.2", "target-lexicon 0.12.16", - "thiserror", + "thiserror 1.0.69", "wasmparser 0.115.0", "wasmtime-cranelift-shared", "wasmtime-environ", @@ -9401,13 +12421,13 @@ dependencies = [ "anyhow", "cranelift-entity", "gimli 0.28.1", - "indexmap 2.6.0", + "indexmap 2.7.0", "log", "object 0.32.2", "serde", "serde_derive", "target-lexicon 0.12.16", - "thiserror", + "thiserror 1.0.69", "wasmparser 0.115.0", "wasmtime-types", ] @@ -9467,7 +12487,7 @@ dependencies = [ "anyhow", "cc", "cfg-if 1.0.0", - "indexmap 2.6.0", + "indexmap 2.7.0", "libc", "log", "mach", @@ -9495,7 +12515,7 @@ dependencies = [ "cranelift-entity", "serde", "serde_derive", - "thiserror", + "thiserror 1.0.69", "wasmparser 0.115.0", ] @@ -9507,7 +12527,7 @@ checksum = "09b5575a75e711ca6c36bb9ad647c93541cdc8e34218031acba5da3f35919dd3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -9516,16 +12536,58 @@ version = "14.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9dafab2db172a53e23940e0fa3078c202f567ee5f13f4b42f66b694fab43c658" +[[package]] +name = "wasmtimer" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0048ad49a55b9deb3953841fa1fc5858f0efbcb7a18868c899a360269fac1b23" +dependencies = [ + "futures", + "js-sys", + "parking_lot 0.12.3", + "pin-utils", + "slab", + "wasm-bindgen", +] + [[package]] name = "web-sys" -version = "0.3.72" +version = "0.3.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a98bc3c33f0fe7e59ad7cd041b89034fa82a7c2d4365ca538dda6cdaf513863c" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" dependencies = [ "js-sys", "wasm-bindgen", ] +[[package]] +name = "webpki-root-certs" +version = "0.26.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cd5da49bdf1f30054cfe0b8ce2958b8fbeb67c4d82c8967a598af481bef255c" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "webpki-roots" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b291546d5d9d1eab74f069c77749f2cb8504a12caa20f0f2de93ddbf6f411888" +dependencies = [ + "rustls-webpki 0.101.7", +] + [[package]] name = "webpki-roots" version = "0.25.4" @@ -9534,9 +12596,9 @@ checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" [[package]] name = "webpki-roots" -version = "0.26.6" +version = "0.26.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841c67bff177718f1d4dfefde8d8f0e78f9b6589319ba88312f567fc5841a958" +checksum = "5d642ff16b7e79272ae451b7322067cdc17cadf68c23264be9d94a32319efe7e" dependencies = [ "rustls-pki-types", ] @@ -9802,6 +12864,20 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "wormhole-bridge-client" +version = "0.1.0" +source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs?branch=refactor%2Fconnectors#2585f2e681cd2f0513f663227ff2ca10c6eefd5f" +dependencies = [ + "bridge-connector-common", + "derive_builder 0.20.2", + "hex", + "near-primitives 0.21.2", + "reqwest 0.11.27", + "serde", + "serde_json", +] + [[package]] name = "write16" version = "1.0.0" @@ -9827,7 +12903,7 @@ dependencies = [ "pharos", "rustc_version 0.4.1", "send_wrapper 0.6.0", - "thiserror", + "thiserror 1.0.69", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", @@ -9842,6 +12918,24 @@ dependencies = [ "tap", ] +[[package]] +name = "x509-parser" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0ecbeb7b67ce215e40e3cc7f2ff902f94a223acf44995934763467e7b1febc8" +dependencies = [ + "asn1-rs", + "base64 0.13.1", + "data-encoding", + "der-parser", + "lazy_static", + "nom", + "oid-registry", + "rusticata-macros", + "thiserror 1.0.69", + "time", +] + [[package]] name = "xmlparser" version = "0.13.6" @@ -9856,9 +12950,9 @@ checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" [[package]] name = "yoke" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" dependencies = [ "serde", "stable_deref_trait", @@ -9868,14 +12962,14 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", - "synstructure", + "syn 2.0.90", + "synstructure 0.13.1", ] [[package]] @@ -9896,28 +12990,28 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] name = "zerofrom" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55" +checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" +checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", - "synstructure", + "syn 2.0.90", + "synstructure 0.13.1", ] [[package]] @@ -9937,7 +13031,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -9972,7 +13066,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -9984,11 +13078,11 @@ dependencies = [ "aes", "byteorder", "bzip2", - "constant_time_eq", + "constant_time_eq 0.1.5", "crc32fast", "crossbeam-utils", "flate2", - "hmac", + "hmac 0.12.1", "pbkdf2 0.11.0", "sha1", "time", diff --git a/omni-relayer/Cargo.toml b/omni-relayer/Cargo.toml index bcaff4c8..ba246718 100644 --- a/omni-relayer/Cargo.toml +++ b/omni-relayer/Cargo.toml @@ -22,19 +22,26 @@ tokio = { version = "1", features = ["sync", "time", "macros", "rt-multi-thread" tokio-stream = { version = "0.1" } ethereum-types = "0.14.1" -omni-types = { git = "https://github.com/near-one/omni-bridge", package = "omni-types", rev = "234cc6af6920027f779b842a6d8afc00530ddbc2" } +omni-types = { git = "https://github.com/near-one/omni-bridge", package = "omni-types", rev = "11ffdb63706ceba175f7581585bd837aad9f1559" } near-lake-framework = "0.7.9" near-jsonrpc-client = "0.13.0" near-jsonrpc-primitives = "0.26.0" near-primitives = "0.26.0" near-crypto = "0.26.0" -eth-proof = { git = "https://github.com/Near-One/rainbow-bridge-sdk-rs", package = "eth-proof" } -omni-connector = { git = "https://github.com/Near-One/rainbow-bridge-sdk-rs", package = "omni-connector" } hex = "0.4.3" secp256k1 = "0.30.0" -alloy = { version = "0.4.2", features = ["node-bindings", "providers", "rpc-types", "sol-types", "provider-ws", "signers", "signer-local"] } +alloy = { version = "0.6.4", features = ["node-bindings", "providers", "rpc-types", "sol-types", "provider-ws", "signers", "signer-local"] } redis = { version = "0.27.0", features = ["aio", "tokio-comp"] } reqwest = "0.12" + +eth-proof = { git = "https://github.com/Near-One/rainbow-bridge-sdk-rs", package = "eth-proof", branch = "refactor/connectors" } + +near-bridge-client = { git = "https://github.com/Near-One/rainbow-bridge-sdk-rs", package = "near-bridge-client", branch = "refactor/connectors" } +evm-bridge-client = { git = "https://github.com/Near-One/rainbow-bridge-sdk-rs", package = "evm-bridge-client", branch = "refactor/connectors" } +solana-bridge-client = { git = "https://github.com/Near-One/rainbow-bridge-sdk-rs", package = "solana-bridge-client", branch = "refactor/connectors" } +wormhole-bridge-client = { git = "https://github.com/Near-One/rainbow-bridge-sdk-rs", package = "wormhole-bridge-client", branch = "refactor/connectors" } + +omni-connector = { git = "https://github.com/Near-One/rainbow-bridge-sdk-rs", package = "omni-connector", branch = "refactor/connectors" } diff --git a/omni-relayer/example-config.toml b/omni-relayer/example-config.toml index 84a3c56c..0d4b94b2 100644 --- a/omni-relayer/example-config.toml +++ b/omni-relayer/example-config.toml @@ -6,12 +6,32 @@ network = "testnet" rpc_url = "https://rpc.testnet.near.org/" token_locker_id = "omni-locker.testnet" -[evm] -rpc_http_url = "https://eth-sepolia.g.alchemy.com/v2/API-KEY" -rpc_ws_url = "wss://eth-sepolia.g.alchemy.com/v2/API-KEY" +[eth] +rpc_http_url = "https://sepolia.infura.io/v3/API_KEY" +rpc_ws_url = "wss://sepolia.infura.io/ws/v3/API_KEY" chain_id = 11_155_111 -bridge_token_factory_address = "0xAD167CA3A900c977d9edDf6Ec80d6095381DFD33" +bridge_token_factory_address = "0x9Bb4BEC352c456183852AfB9b6C4098E20009928" +light_client = "client-eth2.sepolia.testnet" block_processing_batch_size = 10_000 -eth_light_client = "client-eth2.sepolia.testnet" -fin_transfer_gas_estimation = 150_000 +[base] +rpc_http_url = "https://base-sepolia.infura.io/v3/API_KEY" +rpc_ws_url = "wss://base-sepolia.infura.io/ws/v3/API_KEY" +chain_id = 84_532 +bridge_token_factory_address = "0xd565f7CcE0FA1bB8DBe73FCDA281390d545f6200" +block_processing_batch_size = 10_000 + +[arb] +rpc_http_url = "https://arbitrum-sepolia.infura.io/v3/API_KEY" +rpc_ws_url = "wss://arbitrum-sepolia.infura.io/ws/v3/API_KEY" +chain_id = 421_614 +bridge_token_factory_address = "0xd565f7CcE0FA1bB8DBe73FCDA281390d545f6200" +block_processing_batch_size = 10_000 + +[wormhole] +api_url = "https://api.testnet.wormholescan.io/" +sol_chain_id = 1 +near_chain_id = 15 +eth_chain_id = 10_002 +arb_chain_id = 10_003 +base_chain_id = 10_004 diff --git a/omni-relayer/src/config.rs b/omni-relayer/src/config.rs index 2af40b4b..ff8b145c 100644 --- a/omni-relayer/src/config.rs +++ b/omni-relayer/src/config.rs @@ -1,31 +1,26 @@ use alloy::primitives::Address; -use alloy::signers::k256::ecdsa::SigningKey; -use alloy::signers::local::LocalSigner; -use near_primitives::{borsh::BorshDeserialize, types::AccountId}; -use omni_types::{OmniAddress, H160}; - -fn derive_evm_address_from_private_key() -> OmniAddress { - let decoded_private_key = hex::decode( - std::env::var("ETH_PRIVATE_KEY").expect("Failed to get `ETH_PRIVATE_KEY` env variable"), - ) - .expect("Failed to decode `ETH_PRIVATE_KEY`"); - - let secret_key = SigningKey::from_slice(&decoded_private_key) - .expect("Failed to create a `SecretKey` from the provided private key"); - - let signer = LocalSigner::from_signing_key(secret_key); - - OmniAddress::Eth( - H160::try_from_slice(signer.address().as_slice()) - .expect("Failed to create `OmniAddress` from the derived public key"), - ) +use near_primitives::types::AccountId; +use omni_types::ChainKind; + +pub fn get_evm_private_key(chain_kind: ChainKind) -> String { + let env_var = match chain_kind { + ChainKind::Eth => "ETH_PRIVATE_KEY", + ChainKind::Base => "BASE_PRIVATE_KEY", + ChainKind::Arb => "ARB_PRIVATE_KEY", + _ => unreachable!("Unsupported chain kind"), + }; + + std::env::var(env_var).unwrap_or_else(|_| panic!("Failed to get `{env_var}` env variable")) } #[derive(Debug, Clone, serde::Deserialize)] pub struct Config { pub redis: Redis, pub near: Near, - pub evm: Evm, + pub eth: Option, + pub base: Option, + pub arb: Option, + pub wormhole: Wormhole, } #[derive(Debug, Clone, serde::Deserialize)] @@ -54,11 +49,14 @@ pub struct Evm { pub rpc_ws_url: String, pub chain_id: u64, pub bridge_token_factory_address: Address, + pub light_client: Option, pub block_processing_batch_size: u64, - pub fin_transfer_gas_estimation: u64, - - #[serde(default = "derive_evm_address_from_private_key")] - pub relayer_address_on_eth: OmniAddress, +} - pub eth_light_client: AccountId, +#[derive(Debug, Clone, serde::Deserialize)] +pub struct Wormhole { + pub api_url: String, + pub eth_chain_id: u64, + pub base_chain_id: u64, + pub arb_chain_id: u64, } diff --git a/omni-relayer/src/main.rs b/omni-relayer/src/main.rs index 6ffde92d..fa843208 100644 --- a/omni-relayer/src/main.rs +++ b/omni-relayer/src/main.rs @@ -3,6 +3,7 @@ use std::sync::Arc; use anyhow::{Context, Result}; use clap::Parser; use log::{error, info}; +use omni_types::ChainKind; mod config; mod startup; @@ -32,7 +33,7 @@ async fn main() -> Result<()> { let jsonrpc_client = near_jsonrpc_client::JsonRpcClient::connect(config.near.rpc_url.clone()); let near_signer = startup::near::create_signer(config.near.credentials_path.clone())?; - let connector = Arc::new(startup::build_connector(&config, &near_signer)?); + let connector = Arc::new(startup::build_omni_connector(&config, &near_signer)?); let mut handles = Vec::new(); @@ -40,10 +41,7 @@ async fn main() -> Result<()> { let config = config.clone(); let redis_client = redis_client.clone(); let connector = connector.clone(); - let jsonrpc_client = jsonrpc_client.clone(); - async move { - workers::near::sign_transfer(config, redis_client, connector, jsonrpc_client).await - } + async move { workers::near::sign_transfer(config, redis_client, connector).await } })); handles.push(tokio::spawn({ let redis_client = redis_client.clone(); @@ -57,35 +55,16 @@ async fn main() -> Result<()> { let jsonrpc_client = jsonrpc_client.clone(); async move { workers::near::claim_fee(config, redis_client, connector, jsonrpc_client).await } })); - handles.push(tokio::spawn({ - let config = config.clone(); - let redis_client = redis_client.clone(); - let connector = connector.clone(); - async move { workers::near::sign_claim_native_fee(config, redis_client, connector).await } - })); handles.push(tokio::spawn({ let config = config.clone(); let redis_client = redis_client.clone(); let connector = connector.clone(); let jsonrpc_client = jsonrpc_client.clone(); - let near_signer = near_signer.clone(); async move { - workers::evm::finalize_transfer( - config, - redis_client, - connector, - jsonrpc_client, - near_signer, - ) - .await + workers::evm::finalize_transfer(config, redis_client, connector, jsonrpc_client).await } })); - handles.push(tokio::spawn({ - let redis_client = redis_client.clone(); - let connector = connector.clone(); - async move { workers::evm::claim_native_fee(redis_client, connector).await } - })); handles.push(tokio::spawn({ let config = config.clone(); @@ -93,11 +72,27 @@ async fn main() -> Result<()> { let jsonrpc_client = jsonrpc_client.clone(); async move { startup::near::start_indexer(config, redis_client, jsonrpc_client).await } })); - handles.push(tokio::spawn({ - let config = config.clone(); - let redis_client = redis_client.clone(); - async move { startup::evm::start_indexer(config, redis_client).await } - })); + if config.eth.is_some() { + handles.push(tokio::spawn({ + let config = config.clone(); + let redis_client = redis_client.clone(); + async move { startup::evm::start_indexer(config, redis_client, ChainKind::Eth).await } + })); + } + if config.base.is_some() { + handles.push(tokio::spawn({ + let config = config.clone(); + let redis_client = redis_client.clone(); + async move { startup::evm::start_indexer(config, redis_client, ChainKind::Base).await } + })); + } + if config.arb.is_some() { + handles.push(tokio::spawn({ + let config = config.clone(); + let redis_client = redis_client.clone(); + async move { startup::evm::start_indexer(config, redis_client, ChainKind::Arb).await } + })); + } tokio::select! { _ = tokio::signal::ctrl_c() => { diff --git a/omni-relayer/src/startup/evm.rs b/omni-relayer/src/startup/evm.rs index 6212088d..e27c836c 100644 --- a/omni-relayer/src/startup/evm.rs +++ b/omni-relayer/src/startup/evm.rs @@ -1,5 +1,6 @@ use anyhow::{Context, Result}; use log::{info, warn}; +use omni_types::ChainKind; use reqwest::Client; use tokio_stream::StreamExt; @@ -13,33 +14,81 @@ use ethereum_types::H256; use crate::{config, utils, workers::near::FinTransfer}; -pub async fn start_indexer(config: config::Config, redis_client: redis::Client) -> Result<()> { +pub async fn start_indexer( + config: config::Config, + redis_client: redis::Client, + chain_kind: ChainKind, +) -> Result<()> { let mut redis_connection = redis_client.get_multiplexed_tokio_connection().await?; + let ( + rpc_http_url, + rpc_ws_url, + bridge_token_factory_address, + last_processed_block_key, + block_processing_batch_size, + ) = match chain_kind { + ChainKind::Eth => { + let Some(ref eth) = config.eth else { + anyhow::bail!("Failed to get ETH config"); + }; + ( + eth.rpc_http_url.clone(), + eth.rpc_ws_url.clone(), + eth.bridge_token_factory_address, + utils::redis::ETH_LAST_PROCESSED_BLOCK, + eth.block_processing_batch_size, + ) + } + ChainKind::Base => { + let Some(ref base) = config.base else { + anyhow::bail!("Failed to get Base config"); + }; + ( + base.rpc_http_url.clone(), + base.rpc_ws_url.clone(), + base.bridge_token_factory_address, + utils::redis::BASE_LAST_PROCESSED_BLOCK, + base.block_processing_batch_size, + ) + } + ChainKind::Arb => { + let Some(ref arb) = config.arb else { + anyhow::bail!("Failed to get Arb config"); + }; + ( + arb.rpc_http_url.clone(), + arb.rpc_ws_url.clone(), + arb.bridge_token_factory_address, + utils::redis::ARB_LAST_PROCESSED_BLOCK, + arb.block_processing_batch_size, + ) + } + _ => anyhow::bail!("Unsupported chain kind: {:?}", chain_kind), + }; + let http_provider = ProviderBuilder::new().on_http( - config - .evm - .rpc_http_url + rpc_http_url .parse() .context("Failed to parse ETH rpc provider as url")?, ); let ws_provider = ProviderBuilder::new() - .on_ws(WsConnect::new(config.evm.rpc_ws_url.clone())) + .on_ws(WsConnect::new(rpc_ws_url)) .await - .context("Failed to initialize WS provider")?; + .context("Failed to initialize ETH WS provider")?; let latest_block = http_provider.get_block_number().await?; let from_block = - utils::redis::get_last_processed_block(&mut redis_connection, "eth_last_processed_block") + utils::redis::get_last_processed_block(&mut redis_connection, last_processed_block_key) .await .map_or_else( - || latest_block.saturating_sub(config.evm.block_processing_batch_size), + || latest_block.saturating_sub(block_processing_batch_size), |block| block, ); let filter = Filter::new() - .address(config.evm.bridge_token_factory_address) + .address(bridge_token_factory_address) .event_signature( [ utils::evm::InitTransfer::SIGNATURE_HASH, @@ -48,31 +97,33 @@ pub async fn start_indexer(config: config::Config, redis_client: redis::Client) .to_vec(), ); - for current_block in - (from_block..latest_block).step_by(config.evm.block_processing_batch_size as usize) - { + for current_block in (from_block..latest_block).step_by(block_processing_batch_size as usize) { let logs = http_provider - .get_logs(&filter.clone().from_block(current_block).to_block( - (current_block + config.evm.block_processing_batch_size).min(latest_block), - )) + .get_logs( + &filter + .clone() + .from_block(current_block) + .to_block((current_block + block_processing_batch_size).min(latest_block)), + ) .await?; for log in logs { - process_log(&mut redis_connection, &http_provider, log).await; + process_log(chain_kind, &mut redis_connection, &http_provider, log).await; } } - info!("All historical logs processed, starting WS subscription"); + info!("All historical logs processed, starting ETH WS subscription"); let mut stream = ws_provider.subscribe_logs(&filter).await?.into_stream(); while let Some(log) = stream.next().await { - process_log(&mut redis_connection, &http_provider, log).await; + process_log(ChainKind::Eth, &mut redis_connection, &http_provider, log).await; } Ok(()) } async fn process_log( + chain_kind: ChainKind, redis_connection: &mut redis::aio::MultiplexedConnection, http_provider: &RootProvider>, log: Log, @@ -97,9 +148,10 @@ async fn process_log( if log.log_decode::().is_ok() { utils::redis::add_event( redis_connection, - utils::redis::ETH_WITHDRAW_EVENTS, + utils::redis::EVM_INIT_TRANSFER_EVENTS, tx_hash.to_string(), crate::workers::evm::InitTransferWithTimestamp { + chain_kind, block_number, log, tx_logs, @@ -114,6 +166,7 @@ async fn process_log( utils::redis::FINALIZED_TRANSFERS, tx_hash.to_string(), FinTransfer { + chain_kind, block_number, log, tx_logs, diff --git a/omni-relayer/src/startup/mod.rs b/omni-relayer/src/startup/mod.rs index 034afa4b..6b2fd010 100644 --- a/omni-relayer/src/startup/mod.rs +++ b/omni-relayer/src/startup/mod.rs @@ -2,31 +2,75 @@ use anyhow::{Context, Result}; use log::info; use near_crypto::InMemorySigner; + +use evm_bridge_client::{EvmBridgeClient, EvmBridgeClientBuilder}; +use near_bridge_client::NearBridgeClientBuilder; use omni_connector::{OmniConnector, OmniConnectorBuilder}; +use omni_types::ChainKind; +use wormhole_bridge_client::WormholeBridgeClientBuilder; use crate::config; pub mod evm; pub mod near; -pub fn build_connector( +fn build_evm_bridge_client( + config: &config::Config, + chain_kind: ChainKind, +) -> Result> { + let evm = match chain_kind { + ChainKind::Eth => &config.eth, + ChainKind::Base => &config.base, + ChainKind::Arb => &config.arb, + _ => unreachable!("Function `build_evm_bridge_client` supports only EVM chains"), + }; + + evm.as_ref() + .map(|evm| { + EvmBridgeClientBuilder::default() + .endpoint(Some(evm.rpc_http_url.clone())) + .chain_id(Some(evm.chain_id)) + .private_key(Some(crate::config::get_evm_private_key(chain_kind))) + .bridge_token_factory_address(Some(evm.bridge_token_factory_address.to_string())) + .build() + .context(format!( + "Failed to build EvmBridgeClient ({:?})", + chain_kind + )) + }) + .transpose() +} + +pub fn build_omni_connector( config: &config::Config, near_signer: &InMemorySigner, ) -> Result { info!("Building Omni connector"); - OmniConnectorBuilder::default() - .eth_endpoint(Some(config.evm.rpc_http_url.clone())) - .eth_chain_id(Some(config.evm.chain_id)) - .near_endpoint(Some(config.near.rpc_url.clone())) + let near_bridge_client = NearBridgeClientBuilder::default() + .endpoint(Some(config.near.rpc_url.clone())) + .private_key(Some(near_signer.secret_key.to_string())) + .signer(Some(near_signer.account_id.to_string())) .token_locker_id(Some(config.near.token_locker_id.to_string())) - .bridge_token_factory_address(Some(config.evm.bridge_token_factory_address.to_string())) - .eth_private_key(Some( - std::env::var("ETH_PRIVATE_KEY") - .context("Failed to get `ETH_PRIVATE_KEY` env variable")?, - )) - .near_signer(Some(near_signer.account_id.to_string())) - .near_private_key(Some(near_signer.secret_key.to_string())) + .build() + .context("Failed to build NearBridgeClient")?; + + let eth_bridge_client = build_evm_bridge_client(config, ChainKind::Eth)?; + let base_bridge_client = build_evm_bridge_client(config, ChainKind::Base)?; + let arb_bridge_client = build_evm_bridge_client(config, ChainKind::Arb)?; + + let wormhole_bridge_client = WormholeBridgeClientBuilder::default() + .endpoint(Some(config.wormhole.api_url.clone())) + .build() + .context("Failed to build WormholeBridgeClient")?; + + OmniConnectorBuilder::default() + .near_bridge_client(Some(near_bridge_client)) + .eth_bridge_client(eth_bridge_client) + .base_bridge_client(base_bridge_client) + .arb_bridge_client(arb_bridge_client) + .solana_bridge_client(None) + .wormhole_bridge_client(Some(wormhole_bridge_client)) .build() .context("Failed to build OmniConnector") } diff --git a/omni-relayer/src/utils/evm.rs b/omni-relayer/src/utils/evm.rs index db97604a..9d630d0a 100644 --- a/omni-relayer/src/utils/evm.rs +++ b/omni-relayer/src/utils/evm.rs @@ -1,34 +1,37 @@ +use std::sync::Arc; + use log::warn; -use near_primitives::borsh::BorshSerialize; +use omni_connector::OmniConnector; use omni_types::{ prover_args::{EvmVerifyProofArgs, WormholeVerifyProofArgs}, prover_result::ProofKind, - OmniAddress, + ChainKind, }; -use alloy::{rpc::types::Log, sol}; +use alloy::sol; use ethereum_types::H256; -use crate::{config, utils}; +use crate::config; sol!( #[derive(Debug, serde::Serialize, serde::Deserialize)] event InitTransfer( address indexed sender, address indexed tokenAddress, - uint128 indexed nonce, - string token, + uint64 indexed originNonce, uint128 amount, uint128 fee, uint128 nativeFee, - string recipient + string recipient, + string message ); #[derive(Debug, serde::Serialize, serde::Deserialize)] event FinTransfer( - uint128 indexed nonce, - string token, + uint8 indexed originChain, + uint64 indexed originNonce, + address tokenAddress, uint128 amount, address recipient, string feeRecipient @@ -36,58 +39,71 @@ sol!( #[derive(Debug, serde::Serialize, serde::Deserialize)] event LogMessagePublished( + address sender, uint64 sequence, uint32 nonce, + bytes payload, uint8 consistencyLevel ); ); -pub async fn get_vaa( +pub async fn get_vaa_from_evm_log( + connector: Arc, + chain_kind: ChainKind, tx_logs: Option, - log: &Log, config: &config::Config, ) -> Option { - if let Some(tx_logs) = tx_logs { - let mut vaa = None; - - let recipient = if let Ok(init_log) = log.log_decode::() { - init_log.inner.recipient.parse::().ok() - } else if let Ok(fin_log) = log.log_decode::() { - fin_log - .inner - .recipient - .to_string() - .parse::() - .ok() - } else { - None + let Some(tx_logs) = tx_logs else { + warn!("Tx logs are empty"); + return None; + }; + + let (chain_id, bridge_token_factory) = match chain_kind { + ChainKind::Eth => ( + config.wormhole.eth_chain_id, + if let Some(eth) = &config.eth { + eth.bridge_token_factory_address + } else { + return None; + }, + ), + ChainKind::Base => ( + config.wormhole.base_chain_id, + if let Some(base) = &config.base { + base.bridge_token_factory_address + } else { + return None; + }, + ), + ChainKind::Arb => ( + config.wormhole.arb_chain_id, + if let Some(arb) = &config.arb { + arb.bridge_token_factory_address + } else { + return None; + }, + ), + _ => unreachable!( + "Function `get_vaa_from_evm_log` supports getting VAA from only EVM chains" + ), + }; + + for log in tx_logs.inner.logs() { + let Ok(log) = log.log_decode::() else { + continue; }; - if let Some(address) = recipient { - let chain_id = match address { - OmniAddress::Eth(_) => 2, - OmniAddress::Near(_) => 15, - OmniAddress::Sol(_) => 1, - OmniAddress::Arb(_) | OmniAddress::Base(_) => todo!(), - }; - - for log in tx_logs.inner.logs() { - if let Ok(log) = log.log_decode::() { - vaa = utils::wormhole::get_vaa( - chain_id, - config.evm.bridge_token_factory_address, - log.inner.sequence, - ) - .await - .ok(); - } - } - } + let Ok(vaa) = connector + .wormhole_get_vaa(chain_id, bridge_token_factory, log.inner.sequence) + .await + else { + continue; + }; - vaa - } else { - None + return Some(vaa); } + + None } pub async fn construct_prover_args( @@ -100,33 +116,28 @@ pub async fn construct_prover_args( if let Some(vaa) = vaa { let wormhole_proof_args = WormholeVerifyProofArgs { proof_kind, vaa }; - let mut prover_args = Vec::new(); - if let Err(err) = wormhole_proof_args.serialize(&mut prover_args) { - warn!("Failed to serialize wormhole proof: {}", err); - } - - Some(prover_args) - } else { - let evm_proof_args = - match eth_proof::get_proof_for_event(tx_hash, topic, &config.evm.rpc_http_url).await { - Ok(proof) => proof, - Err(err) => { - warn!("Failed to get proof: {}", err); - return None; - } - }; - - let evm_proof_args = EvmVerifyProofArgs { - proof_kind, - proof: evm_proof_args, + return borsh::to_vec(&wormhole_proof_args).ok(); + } + + // For now only Eth chain is supported since it has a light client + let Some(ref eth) = config.eth else { + warn!("Eth chain is not configured"); + return None; + }; + + let evm_proof_args = + match eth_proof::get_proof_for_event(tx_hash, topic, ð.rpc_http_url).await { + Ok(proof) => proof, + Err(err) => { + warn!("Failed to get proof: {}", err); + return None; + } }; - let mut prover_args = Vec::new(); - if let Err(err) = evm_proof_args.serialize(&mut prover_args) { - warn!("Failed to serialize evm proof: {}", err); - return None; - } + let evm_proof_args = EvmVerifyProofArgs { + proof_kind, + proof: evm_proof_args, + }; - Some(prover_args) - } + borsh::to_vec(&evm_proof_args).ok() } diff --git a/omni-relayer/src/utils/fee.rs b/omni-relayer/src/utils/fee.rs deleted file mode 100644 index fabdc5d8..00000000 --- a/omni-relayer/src/utils/fee.rs +++ /dev/null @@ -1,127 +0,0 @@ -use std::collections::HashMap; - -use alloy::providers::{Provider, ProviderBuilder}; -use anyhow::{Context, Result}; - -use near_jsonrpc_client::{methods, JsonRpcClient}; -use near_jsonrpc_primitives::types::query::QueryResponseKind; -use near_primitives::{ - types::{AccountId, BlockReference}, - views::QueryRequest, -}; -use omni_types::{ChainKind, Fee, OmniAddress}; -use serde_json::from_slice; - -use crate::config; - -use super::storage; - -#[derive(Debug, serde::Deserialize)] -struct Metadata { - decimals: u32, -} - -async fn get_token_decimals(jsonrpc_client: &JsonRpcClient, token: &AccountId) -> Result { - let request = methods::query::RpcQueryRequest { - block_reference: BlockReference::latest(), - request: QueryRequest::CallFunction { - account_id: token.clone(), - method_name: "ft_metadata".to_string(), - args: Vec::new().into(), - }, - }; - - let response = jsonrpc_client.call(request).await?; - - if let QueryResponseKind::CallResult(result) = response.kind { - Ok(from_slice::(&result.result)?.decimals) - } else { - anyhow::bail!("Failed to get token decimals") - } -} - -async fn get_price_by_symbol(symbol: &str) -> Result { - let url = - format!("https://api.coingecko.com/api/v3/simple/price?ids={symbol}&vs_currencies=usd"); - - let response = reqwest::get(&url).await?; - let json = response - .json::>>() - .await?; - - json.get(symbol) - .and_then(|inner_map| inner_map.get("usd").copied()) - .ok_or_else(|| anyhow::anyhow!("Failed to get price for symbol: {}", symbol)) -} - -fn get_symbol_and_decimals_by_chain(chain: ChainKind) -> (&'static str, u32) { - match chain { - ChainKind::Eth => ("ethereum", 18), - ChainKind::Near => ("near", 24), - ChainKind::Sol => ("solana", 9), - ChainKind::Arb => ("arbitrum", 18), - ChainKind::Base => ("base", 18), - } -} - -async fn calculate_price(amount: u128, symbol: &str, decimals: u32) -> Result { - Ok(amount as f64 / 10u128.pow(decimals) as f64 * get_price_by_symbol(symbol).await?) -} - -pub async fn is_fee_sufficient( - config: &config::Config, - jsonrpc_client: &JsonRpcClient, - sender: &OmniAddress, - recipient: &OmniAddress, - token: &AccountId, - fee: &Fee, -) -> Result { - let (sender_symbol, sender_token_decimals) = - get_symbol_and_decimals_by_chain(sender.get_chain()); - let (recipient_symbol, recipient_token_decimals) = - get_symbol_and_decimals_by_chain(recipient.get_chain()); - - let native_fee_usd = - calculate_price(fee.native_fee.0, sender_symbol, sender_token_decimals).await?; - - let fee_token_decimals = get_token_decimals(jsonrpc_client, token).await?; - let token_fee_usd = calculate_price(fee.fee.0, token.as_ref(), fee_token_decimals).await?; - - let expected_recipient_fee_usd = match recipient { - OmniAddress::Eth(_) => { - let http_provider = ProviderBuilder::new().on_http( - config - .evm - .rpc_http_url - .parse() - .context("Failed to parse ETH rpc provider as url")?, - ); - calculate_price( - config.evm.fin_transfer_gas_estimation as u128 - * http_provider.get_gas_price().await?, - recipient_symbol, - recipient_token_decimals, - ) - .await? - } - OmniAddress::Near(address) => { - if storage::has_storage_deposit(jsonrpc_client, token, &address.parse::()?) - .await? - { - 0.0 - } else { - calculate_price( - storage::NEP141_STORAGE_DEPOSIT, - recipient_symbol, - recipient_token_decimals, - ) - .await? - } - } - OmniAddress::Sol(_) => todo!(), - OmniAddress::Arb(_) => todo!(), - OmniAddress::Base(_) => todo!(), - }; - - Ok(native_fee_usd + token_fee_usd >= expected_recipient_fee_usd) -} diff --git a/omni-relayer/src/utils/mod.rs b/omni-relayer/src/utils/mod.rs index 32170ec6..4972661c 100644 --- a/omni-relayer/src/utils/mod.rs +++ b/omni-relayer/src/utils/mod.rs @@ -1,6 +1,3 @@ pub mod evm; -pub mod fee; pub mod near; pub mod redis; -pub mod storage; -pub mod wormhole; diff --git a/omni-relayer/src/utils/near.rs b/omni-relayer/src/utils/near.rs index ca3fc0f8..7ca8e99e 100644 --- a/omni-relayer/src/utils/near.rs +++ b/omni-relayer/src/utils/near.rs @@ -1,4 +1,4 @@ -use anyhow::Result; +use anyhow::{Context, Result}; use log::info; use near_jsonrpc_client::{ @@ -43,10 +43,17 @@ pub async fn get_eth_light_client_last_block_number( config: &config::Config, jsonrpc_client: &JsonRpcClient, ) -> Result { + let Some(ref eth) = config.eth else { + anyhow::bail!("Failed to get ETH light client"); + }; + let request = methods::query::RpcQueryRequest { block_reference: BlockReference::latest(), request: QueryRequest::CallFunction { - account_id: config.evm.eth_light_client.clone(), + account_id: eth + .light_client + .clone() + .context("Failed to get ETH light client")?, method_name: "last_block_number".to_string(), args: Vec::new().into(), }, @@ -87,7 +94,7 @@ pub async fn handle_streamer_message( utils::redis::add_event( redis_connection, utils::redis::NEAR_INIT_TRANSFER_QUEUE, - transfer_message.origin_nonce.0.to_string(), + transfer_message.origin_nonce.to_string(), crate::workers::near::InitTransferWithTimestamp { event: log, creation_timestamp: chrono::Utc::now().timestamp(), @@ -103,67 +110,14 @@ pub async fn handle_streamer_message( utils::redis::add_event( redis_connection, utils::redis::NEAR_SIGN_TRANSFER_EVENTS, - message_payload.nonce.0.to_string(), + message_payload.destination_nonce.to_string(), log, ) .await; } - Nep141LockerEvent::FinTransferEvent { - ref nonce, - ref transfer_message, - } => { - if nonce.is_some() { - utils::redis::add_event( - redis_connection, - utils::redis::NEAR_INIT_TRANSFER_QUEUE, - transfer_message.origin_nonce.0.to_string(), - crate::workers::near::InitTransferWithTimestamp { - event: log, - creation_timestamp: chrono::Utc::now().timestamp(), - last_update_timestamp: None, - }, - ) - .await; - } else { - utils::redis::add_event( - redis_connection, - utils::redis::NEAR_SIGN_CLAIM_NATIVE_FEE_QUEUE, - transfer_message.origin_nonce.0.to_string(), - log, - ) - .await; - } - } - Nep141LockerEvent::ClaimFeeEvent { - ref transfer_message, - } => { - utils::redis::add_event( - redis_connection, - utils::redis::NEAR_SIGN_CLAIM_NATIVE_FEE_QUEUE, - transfer_message.origin_nonce.0.to_string(), - log, - ) - .await; - } - Nep141LockerEvent::SignClaimNativeFeeEvent { - ref claim_payload, .. - } => { - if claim_payload.recipient == config.evm.relayer_address_on_eth { - utils::redis::add_event( - redis_connection, - utils::redis::NEAR_SIGN_CLAIM_NATIVE_FEE_EVENTS, - claim_payload - .nonces - .iter() - .map(|nonce| nonce.0.to_string()) - .collect::>() - .join(","), - log, - ) - .await; - } - } - Nep141LockerEvent::LogMetadataEvent { .. } => {} + Nep141LockerEvent::FinTransferEvent { .. } + | Nep141LockerEvent::ClaimFeeEvent { .. } + | Nep141LockerEvent::LogMetadataEvent { .. } => {} } } } diff --git a/omni-relayer/src/utils/redis.rs b/omni-relayer/src/utils/redis.rs index 29be650d..4ce29b59 100644 --- a/omni-relayer/src/utils/redis.rs +++ b/omni-relayer/src/utils/redis.rs @@ -2,13 +2,14 @@ use log::warn; use redis::{aio::MultiplexedConnection, AsyncCommands}; pub const NEAR_LAST_PROCESSED_BLOCK: &str = "near_last_processed_block"; +pub const ETH_LAST_PROCESSED_BLOCK: &str = "eth_last_processed_block"; +pub const BASE_LAST_PROCESSED_BLOCK: &str = "base_last_processed_block"; +pub const ARB_LAST_PROCESSED_BLOCK: &str = "arb_last_processed_block"; + pub const NEAR_INIT_TRANSFER_QUEUE: &str = "near_init_transfer_queue"; pub const NEAR_SIGN_TRANSFER_EVENTS: &str = "near_sign_transfer_events"; -pub const NEAR_SIGN_CLAIM_NATIVE_FEE_QUEUE: &str = "near_sign_claim_native_fee_queue"; -pub const NEAR_SIGN_CLAIM_NATIVE_FEE_EVENTS: &str = "near_sign_claim_native_fee_events"; -pub const ETH_LAST_PROCESSED_BLOCK: &str = "eth_last_processed_block"; -pub const ETH_WITHDRAW_EVENTS: &str = "eth_withdraw_events"; +pub const EVM_INIT_TRANSFER_EVENTS: &str = "evm_init_tranfer_events"; pub const FINALIZED_TRANSFERS: &str = "finalized_transfers"; diff --git a/omni-relayer/src/utils/storage.rs b/omni-relayer/src/utils/storage.rs deleted file mode 100644 index 625f6c56..00000000 --- a/omni-relayer/src/utils/storage.rs +++ /dev/null @@ -1,45 +0,0 @@ -use anyhow::Result; - -use near_jsonrpc_client::{methods::query::RpcQueryRequest, JsonRpcClient}; -use near_jsonrpc_primitives::types::query::QueryResponseKind; -use near_primitives::{ - types::{AccountId, BlockReference, Finality}, - views::QueryRequest, -}; - -pub const NEP141_STORAGE_DEPOSIT: u128 = 1_250_000_000_000_000_000_000; - -#[derive(Debug, serde::Deserialize)] -struct StorageBalance { - total: String, -} - -pub async fn has_storage_deposit( - jsonrpc_client: &JsonRpcClient, - token: &AccountId, - accound_id: &AccountId, -) -> Result { - let request = RpcQueryRequest { - block_reference: BlockReference::Finality(Finality::Final), - request: QueryRequest::CallFunction { - account_id: token.clone(), - method_name: "storage_balance_of".to_string(), - args: serde_json::json!({ "account_id": accound_id }) - .to_string() - .into_bytes() - .into(), - }, - }; - - if let QueryResponseKind::CallResult(result) = jsonrpc_client.call(request).await?.kind { - if let Ok(storage) = serde_json::from_slice::(&result.result) { - if let Ok(parsed_total) = storage.total.parse::() { - return Ok(parsed_total >= NEP141_STORAGE_DEPOSIT); - } - } - - Ok(false) - } else { - anyhow::bail!("Failed to get storage balance") - } -} diff --git a/omni-relayer/src/utils/wormhole.rs b/omni-relayer/src/utils/wormhole.rs deleted file mode 100644 index 2ed578dd..00000000 --- a/omni-relayer/src/utils/wormhole.rs +++ /dev/null @@ -1,20 +0,0 @@ -use anyhow::Result; - -use alloy::primitives::Address; - -#[derive(Debug, serde::Deserialize)] -struct WormholeApiResponse { - data: WormholeApiData, -} - -#[derive(Debug, serde::Deserialize)] -struct WormholeApiData { - vaa: String, -} - -pub async fn get_vaa(chain_id: u64, emitter: Address, sequence: u64) -> Result { - let url = format!("https://api.wormholescan.io/api/v1/vaas/{chain_id}/{emitter}/{sequence}"); - - let response = reqwest::get(url).await?; - Ok(response.json::().await?.data.vaa) -} diff --git a/omni-relayer/src/workers/evm.rs b/omni-relayer/src/workers/evm.rs index 4183f858..7d009ea7 100644 --- a/omni-relayer/src/workers/evm.rs +++ b/omni-relayer/src/workers/evm.rs @@ -7,19 +7,16 @@ use ethereum_types::H256; use futures::future::join_all; use log::{error, info, warn}; -use near_primitives::types::AccountId; use omni_connector::OmniConnector; use omni_types::{ - locker_args::{FinTransferArgs, StorageDepositArgs}, - near_events::Nep141LockerEvent, - prover_result::ProofKind, - ChainKind, Fee, OmniAddress, H160, + locker_args::StorageDepositAction, prover_result::ProofKind, ChainKind, OmniAddress, H160, }; use crate::{config, utils}; #[derive(Debug, serde::Serialize, serde::Deserialize)] pub struct InitTransferWithTimestamp { + pub chain_kind: ChainKind, pub block_number: u64, pub log: Log, pub tx_logs: Option, @@ -32,264 +29,43 @@ pub async fn finalize_transfer( redis_client: redis::Client, connector: Arc, jsonrpc_client: near_jsonrpc_client::JsonRpcClient, - near_signer: near_crypto::InMemorySigner, ) -> Result<()> { let redis_connection = redis_client.get_multiplexed_tokio_connection().await?; loop { let mut redis_connection = redis_connection.clone(); - let Some(events) = utils::redis::get_events( + + let events = match utils::redis::get_events( &mut redis_connection, - utils::redis::ETH_WITHDRAW_EVENTS.to_string(), + utils::redis::EVM_INIT_TRANSFER_EVENTS.to_string(), ) .await - else { - tokio::time::sleep(tokio::time::Duration::from_secs( - utils::redis::SLEEP_TIME_AFTER_EVENTS_PROCESS_SECS, - )) - .await; - continue; + { + Some(events) => events, + None => { + tokio::time::sleep(tokio::time::Duration::from_secs( + utils::redis::SLEEP_TIME_AFTER_EVENTS_PROCESS_SECS, + )) + .await; + continue; + } }; let mut handlers = Vec::new(); + for (key, event) in events { if let Ok(init_transfer_with_timestamp) = serde_json::from_str::(&event) { - handlers.push(tokio::spawn({ - let config = config.clone(); - let connector = connector.clone(); - let jsonrpc_client = jsonrpc_client.clone(); - let mut redis_connection = redis_connection.clone(); - let near_signer = near_signer.clone(); - - async move { - let current_timestamp = chrono::Utc::now().timestamp(); - - if current_timestamp - - init_transfer_with_timestamp - .last_update_timestamp - .unwrap_or_default() - < utils::redis::CHECK_INSUFFICIENT_FEE_TRANSFERS_EVERY_SECS - { - return; - } - - let Ok(init_log) = init_transfer_with_timestamp - .log - .log_decode::() - else { - warn!( - "Failed to decode log as InitTransfer: {:?}", - init_transfer_with_timestamp.log - ); - return; - }; - - info!("Received InitTransfer log"); - - let Some(tx_hash) = init_transfer_with_timestamp.log.transaction_hash - else { - warn!("No transaction hash in log: {:?}", init_log); - return; - }; - - let Ok(sender) = H160::try_from_slice(init_log.inner.sender.as_slice()) - else { - warn!("Failed to construct `H160` from sender address"); - return; - }; - let Ok(recipient) = init_log.inner.recipient.parse::() else { - warn!( - "Failed to parse recipient as OmniAddress: {:?}", - init_log.inner.recipient - ); - return; - }; - let Ok(token) = init_log.inner.token.parse::() else { - warn!( - "Failed to parse token as AccountId: {:?}", - init_log.inner.token - ); - return; - }; - - if current_timestamp - init_transfer_with_timestamp.creation_timestamp - > utils::redis::KEEP_INSUFFICIENT_FEE_TRANSFERS_FOR - { - warn!( - "Removing an old InitTransfer: {:?}", - init_transfer_with_timestamp - ); - utils::redis::remove_event( - &mut redis_connection, - utils::redis::ETH_WITHDRAW_EVENTS, - &key, - ) - .await; - return; - } - - let is_fee_sufficient = match utils::fee::is_fee_sufficient( - &config, - &jsonrpc_client, - &OmniAddress::Eth(sender), - &recipient, - &token, - &Fee { - fee: init_log.inner.fee.into(), - native_fee: init_log.inner.nativeFee.into(), - }, - ) - .await - { - Ok(is_fee_sufficient) => { - if !is_fee_sufficient { - warn!("Fee is not sufficient for transfer: {:?}", init_log); - } - - is_fee_sufficient - } - Err(err) => { - warn!("Failed to check fee: {}", err); - - false - } - }; - - if !is_fee_sufficient { - utils::redis::add_event( - &mut redis_connection, - utils::redis::ETH_WITHDRAW_EVENTS, - tx_hash.to_string(), - InitTransferWithTimestamp { - block_number: init_transfer_with_timestamp.block_number, - log: init_transfer_with_timestamp.log, - tx_logs: init_transfer_with_timestamp.tx_logs, - creation_timestamp: init_transfer_with_timestamp - .creation_timestamp, - last_update_timestamp: Some(current_timestamp), - }, - ) - .await; - return; - } - - let vaa = utils::evm::get_vaa( - init_transfer_with_timestamp.tx_logs, - &init_transfer_with_timestamp.log, - &config, - ) - .await; - - if vaa.is_none() { - let Ok(light_client_latest_block_number) = - utils::near::get_eth_light_client_last_block_number( - &config, - &jsonrpc_client, - ) - .await - else { - warn!("Failed to get eth light client last block number"); - return; - }; - - if init_transfer_with_timestamp.block_number - > light_client_latest_block_number - { - tokio::time::sleep(tokio::time::Duration::from_secs( - utils::redis::SLEEP_TIME_AFTER_EVENTS_PROCESS_SECS, - )) - .await; - return; - } - } - - 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 { - return; - }; - - let storage_deposit_accounts = - if let OmniAddress::Near(near_recipient) = &recipient { - let Ok(recipient_account_id) = near_recipient.parse::() - else { - warn!( - "Failed to parse recipient as AccountId: {:?}", - near_recipient - ); - return; - }; - - let Ok(sender_has_storage_deposit) = - utils::storage::has_storage_deposit( - &jsonrpc_client, - &token, - &near_signer.account_id, - ) - .await - else { - warn!("Failed to check sender storage balance"); - return; - }; - let Ok(recipient_has_storage_deposit) = - utils::storage::has_storage_deposit( - &jsonrpc_client, - &token, - &recipient_account_id, - ) - .await - else { - warn!("Failed to check recipient storage balance"); - return; - }; - - vec![ - (near_signer.account_id, !sender_has_storage_deposit), - (recipient_account_id, !recipient_has_storage_deposit), - ] - } else { - Vec::new() - }; - - let fin_transfer_args = FinTransferArgs { - chain_kind: ChainKind::Eth, - native_fee_recipient: Some(config.evm.relayer_address_on_eth.clone()), - storage_deposit_args: StorageDepositArgs { - token, - accounts: storage_deposit_accounts, - }, - prover_args, - }; - - match connector.near_fin_transfer(fin_transfer_args).await { - Ok(tx_hash) => { - info!("Finalized InitTransfer: {:?}", tx_hash); - utils::redis::remove_event( - &mut redis_connection, - utils::redis::ETH_WITHDRAW_EVENTS, - key, - ) - .await; - } - Err(err) => error!("Failed to finalize InitTransfer: {}", err), - } - } - })); + let handler = handle_init_transfer_event( + config.clone(), + connector.clone(), + jsonrpc_client.clone(), + redis_connection.clone(), + key.clone(), + init_transfer_with_timestamp, + ); + handlers.push(tokio::spawn(handler)); } } @@ -302,64 +78,302 @@ pub async fn finalize_transfer( } } -pub async fn claim_native_fee( - redis_client: redis::Client, +async fn handle_init_transfer_event( + config: config::Config, connector: Arc, -) -> Result<()> { - let redis_connection = redis_client.get_multiplexed_tokio_connection().await?; + jsonrpc_client: near_jsonrpc_client::JsonRpcClient, + mut redis_connection: redis::aio::MultiplexedConnection, + key: String, + init_transfer_with_timestamp: InitTransferWithTimestamp, +) { + let current_timestamp = chrono::Utc::now().timestamp(); + + if current_timestamp + - init_transfer_with_timestamp + .last_update_timestamp + .unwrap_or_default() + < utils::redis::CHECK_INSUFFICIENT_FEE_TRANSFERS_EVERY_SECS + { + return; + } - loop { - let mut redis_connection_clone = redis_connection.clone(); - let Some(events) = utils::redis::get_events( - &mut redis_connection_clone, - utils::redis::NEAR_SIGN_CLAIM_NATIVE_FEE_EVENTS.to_string(), + let init_log = match init_transfer_with_timestamp + .log + .log_decode::() + { + Ok(init_log) => init_log, + Err(_) => { + warn!( + "Failed to decode log as InitTransfer: {:?}", + init_transfer_with_timestamp.log + ); + return; + } + }; + + info!("Received InitTransfer log"); + + let tx_hash = match init_transfer_with_timestamp.log.transaction_hash { + Some(tx_hash) => tx_hash, + None => { + warn!("No transaction hash in log: {:?}", init_log); + return; + } + }; + + let recipient = match init_log.inner.recipient.parse::() { + Ok(recipient) => recipient, + Err(_) => { + warn!( + "Failed to parse recipient as OmniAddress: {:?}", + init_log.inner.recipient + ); + return; + } + }; + + if current_timestamp - init_transfer_with_timestamp.creation_timestamp + > utils::redis::KEEP_INSUFFICIENT_FEE_TRANSFERS_FOR + { + warn!( + "Removing an old InitTransfer: {:?}", + init_transfer_with_timestamp + ); + utils::redis::remove_event( + &mut redis_connection, + utils::redis::EVM_INIT_TRANSFER_EVENTS, + &key, ) - .await - else { + .await; + return; + } + + // TODO: Use existing API to check if fee is sufficient here + + let vaa = utils::evm::get_vaa_from_evm_log( + connector.clone(), + init_transfer_with_timestamp.chain_kind, + init_transfer_with_timestamp.tx_logs.clone(), + &config, + ) + .await; + + if vaa.is_none() { + let light_client_latest_block_number = + match utils::near::get_eth_light_client_last_block_number(&config, &jsonrpc_client) + .await + { + Ok(block_number) => block_number, + Err(_) => { + warn!("Failed to get eth light client last block number"); + return; + } + }; + + if init_transfer_with_timestamp.block_number > light_client_latest_block_number { tokio::time::sleep(tokio::time::Duration::from_secs( utils::redis::SLEEP_TIME_AFTER_EVENTS_PROCESS_SECS, )) .await; - continue; - }; + return; + } + } - let mut handlers = Vec::new(); - for (key, event) in events { - if let Ok(event) = serde_json::from_str::(&event) { - handlers.push(tokio::spawn({ - let mut redis_connection = redis_connection.clone(); - let connector = connector.clone(); - - async move { - let Nep141LockerEvent::SignClaimNativeFeeEvent { .. } = event else { - warn!("Expected SignClaimNativeFeeEvent, got: {:?}", event); - return; - }; - - info!("Received SignClaimNativeFeeEvent log"); - - match connector.evm_claim_native_fee_with_log(event).await { - Ok(tx_hash) => { - info!("Claimed native fee: {:?}", tx_hash); - utils::redis::remove_event( - &mut redis_connection, - utils::redis::NEAR_SIGN_CLAIM_NATIVE_FEE_EVENTS, - key, - ) - .await; - } - Err(err) => error!("Failed to claim native fee: {}", err), - } - } - })); - } + let topic = match init_transfer_with_timestamp.log.topic0() { + Some(topic) => topic, + None => { + warn!("No topic0 in log: {:?}", init_transfer_with_timestamp.log); + return; + } + }; + + let tx_hash = H256::from_slice(tx_hash.as_slice()); + + let prover_args = match utils::evm::construct_prover_args( + &config, + vaa, + tx_hash, + H256::from_slice(topic.as_slice()), + ProofKind::InitTransfer, + ) + .await + { + Some(prover_args) => prover_args, + None => { + warn!("Failed to construct prover args"); + return; + } + }; + + let storage_deposit_actions = match get_storage_deposit_actions( + &connector, + &init_log.inner, + &recipient, + &init_transfer_with_timestamp, + ) + .await + { + Ok(actions) => actions, + Err(err) => { + warn!("{}", err); + return; + } + }; + + let fin_transfer_args = match recipient.get_chain() { + ChainKind::Near => omni_connector::FinTransferArgs::NearFinTransfer { + chain_kind: init_transfer_with_timestamp.chain_kind, + storage_deposit_actions, + prover_args, + }, + _ => todo!(), + }; + + match connector.fin_transfer(fin_transfer_args).await { + Ok(tx_hash) => { + info!("Finalized InitTransfer: {:?}", tx_hash); + utils::redis::remove_event( + &mut redis_connection, + utils::redis::EVM_INIT_TRANSFER_EVENTS, + &key, + ) + .await; } + Err(err) => error!("Failed to finalize InitTransfer: {}", err), + } +} - join_all(handlers).await; +async fn get_storage_deposit_actions( + connector: &OmniConnector, + init_log: &utils::evm::InitTransfer, + recipient: &OmniAddress, + init_transfer_with_timestamp: &InitTransferWithTimestamp, +) -> Result, String> { + let mut storage_deposit_actions = Vec::new(); + + if let OmniAddress::Near(near_recipient) = recipient { + let evm_token_address = + H160::try_from_slice(init_log.tokenAddress.as_slice()).map_err(|_| { + format!( + "Failed to parse token address as H160: {:?}", + init_log.tokenAddress + ) + })?; + + let omni_token_address = OmniAddress::new_from_evm_address( + init_transfer_with_timestamp.chain_kind, + evm_token_address.clone(), + ) + .map_err(|_| { + format!( + "Failed to convert EVM token address to OmniAddress: {:?}", + evm_token_address + ) + })?; + + let token_id = connector + .near_get_token_id(omni_token_address.clone()) + .await + .map_err(|_| { + format!( + "Failed to get token id by omni token address: {:?}", + omni_token_address + ) + })?; + + let near_recipient_storage_deposit_amount = connector + .near_get_required_storage_deposit(token_id.clone(), near_recipient.clone()) + .await + .map_err(|_| { + format!( + "Failed to get required storage deposit for recipient: {:?}", + near_recipient + ) + })?; + + storage_deposit_actions.push(StorageDepositAction { + token_id, + account_id: near_recipient.clone(), + storage_deposit_amount: Some(near_recipient_storage_deposit_amount), + }); + }; + + if init_log.fee > 0 { + let evm_token_address = + H160::try_from_slice(init_log.tokenAddress.as_slice()).map_err(|_| { + format!( + "Failed to parse token address as H160: {:?}", + init_log.tokenAddress + ) + })?; + + let omni_token_address = OmniAddress::new_from_evm_address( + init_transfer_with_timestamp.chain_kind, + evm_token_address.clone(), + ) + .map_err(|_| { + format!( + "Failed to convert EVM token address to OmniAddress: {:?}", + evm_token_address + ) + })?; + + let token_id = connector + .near_get_token_id(omni_token_address.clone()) + .await + .map_err(|_| { + format!( + "Failed to get token id by omni token address: {:?}", + omni_token_address + ) + })?; + + let relayer = connector + .near_bridge_client() + .and_then(|client| client.signer().map(|signer| signer.account_id)) + .map_err(|_| "Failed to get relayer account id".to_string())?; + + let near_relayer_storage_deposit_amount = connector + .near_get_required_storage_deposit(token_id.clone(), relayer.clone()) + .await + .map_err(|_| { + format!( + "Failed to get required storage deposit for recipient: {:?}", + relayer + ) + })?; + + storage_deposit_actions.push(StorageDepositAction { + token_id, + account_id: relayer, + storage_deposit_amount: Some(near_relayer_storage_deposit_amount), + }); + } - tokio::time::sleep(tokio::time::Duration::from_secs( - utils::redis::SLEEP_TIME_AFTER_EVENTS_PROCESS_SECS, - )) - .await; + if init_log.nativeFee > 0 { + // TODO: Right now `get_native_token_id` is private, so either we make it public in a smart + // contract or make the logic manually + let token_id = connector + .near_get_native_token_id(init_transfer_with_timestamp.chain_kind) + .await + .map_err(|_| { + format!( + "Failed to get native token id by chain kind: {:?}", + init_transfer_with_timestamp.chain_kind + ) + })?; + + let relayer = connector + .near_bridge_client() + .and_then(|client| client.signer().map(|signer| signer.account_id)) + .map_err(|_| "Failed to get relayer account id".to_string())?; + + storage_deposit_actions.push(StorageDepositAction { + token_id, + account_id: relayer, + storage_deposit_amount: None, + }); } + + Ok(storage_deposit_actions) } diff --git a/omni-relayer/src/workers/near.rs b/omni-relayer/src/workers/near.rs index c22ae4df..bb67258f 100644 --- a/omni-relayer/src/workers/near.rs +++ b/omni-relayer/src/workers/near.rs @@ -6,7 +6,6 @@ use ethereum_types::H256; use futures::future::join_all; use log::{error, info, warn}; -use near_jsonrpc_client::JsonRpcClient; use omni_connector::OmniConnector; use omni_types::{ locker_args::ClaimFeeArgs, near_events::Nep141LockerEvent, prover_result::ProofKind, ChainKind, @@ -25,7 +24,6 @@ pub async fn sign_transfer( config: config::Config, redis_client: redis::Client, connector: Arc, - jsonrpc_client: JsonRpcClient, ) -> Result<()> { let redis_connection = redis_client.get_multiplexed_tokio_connection().await?; @@ -53,7 +51,6 @@ pub async fn sign_transfer( let config = config.clone(); let mut redis_connection = redis_connection.clone(); let connector = connector.clone(); - let jsonrpc_client = jsonrpc_client.clone(); async move { let current_timestamp = chrono::Utc::now().timestamp(); @@ -105,48 +102,11 @@ pub async fn sign_transfer( return; } - let is_fee_sufficient = match utils::fee::is_fee_sufficient( - &config, - &jsonrpc_client, - &transfer_message.sender, - &transfer_message.recipient, - &transfer_message.token, - &transfer_message.fee, - ) - .await - { - Ok(is_fee_sufficient) => { - if !is_fee_sufficient { - warn!("Fee is not sufficient for transfer: {:?}", init_transfer_with_timestamp.event); - } - - is_fee_sufficient - } - Err(err) => { - warn!("Failed to check fee: {}", err); - - false - } - }; - - if !is_fee_sufficient { - utils::redis::add_event( - &mut redis_connection, - utils::redis::NEAR_INIT_TRANSFER_QUEUE, - transfer_message.origin_nonce.0.to_string(), - InitTransferWithTimestamp { - event: init_transfer_with_timestamp.event, - creation_timestamp: init_transfer_with_timestamp.creation_timestamp, - last_update_timestamp: Some(current_timestamp), - }, - ) - .await; - return; - } + // TODO: Use existing API to check if fee is sufficient match connector - .sign_transfer( - transfer_message.origin_nonce.into(), + .near_sign_transfer( + transfer_message.origin_nonce, Some(config.near.token_locker_id), Some(transfer_message.fee.clone()), ) @@ -208,14 +168,25 @@ pub async fn finalize_transfer( let connector = connector.clone(); async move { - let Nep141LockerEvent::SignTransferEvent { .. } = &event else { + let Nep141LockerEvent::SignTransferEvent { + message_payload, .. + } = &event + else { error!("Expected SignTransferEvent, got: {:?}", event); return; }; info!("Received SignTransferEvent"); - match connector.evm_fin_transfer_with_log(event).await { + let fin_transfer_args = match message_payload.recipient.get_chain() { + ChainKind::Eth => omni_connector::FinTransferArgs::EvmFinTransfer { + chain_kind: message_payload.recipient.get_chain(), + event, + }, + _ => todo!(), + }; + + match connector.fin_transfer(fin_transfer_args).await { Ok(tx_hash) => { info!("Finalized deposit: {}", tx_hash); utils::redis::remove_event( @@ -245,6 +216,7 @@ pub async fn finalize_transfer( #[derive(Debug, serde::Serialize, serde::Deserialize)] pub struct FinTransfer { + pub chain_kind: ChainKind, pub block_number: u64, pub log: Log, pub tx_logs: Option, @@ -277,8 +249,13 @@ pub async fn claim_fee( for (key, event) in events { if let Ok(fin_transfer) = serde_json::from_str::(&event) { - let vaa = - utils::evm::get_vaa(fin_transfer.tx_logs, &fin_transfer.log, &config).await; + let vaa = utils::evm::get_vaa_from_evm_log( + connector.clone(), + fin_transfer.chain_kind, + fin_transfer.tx_logs, + &config, + ) + .await; if vaa.is_none() { let Ok(light_client_latest_block_number) = @@ -335,12 +312,11 @@ pub async fn claim_fee( }; let claim_fee_args = ClaimFeeArgs { - chain_kind: ChainKind::Eth, + chain_kind: fin_transfer.chain_kind, prover_args, - native_fee_recipient: Some(config.evm.relayer_address_on_eth), }; - if let Ok(response) = connector.claim_fee(claim_fee_args).await { + if let Ok(response) = connector.near_claim_fee(claim_fee_args).await { info!("Claimed fee: {:?}", response); utils::redis::remove_event( &mut redis_connection, @@ -362,80 +338,3 @@ pub async fn claim_fee( .await; } } - -pub async fn sign_claim_native_fee( - config: config::Config, - redis_client: redis::Client, - connector: Arc, -) -> Result<()> { - let redis_connection = redis_client.get_multiplexed_tokio_connection().await?; - - loop { - let mut redis_connection_clone = redis_connection.clone(); - let Some(events) = utils::redis::get_events( - &mut redis_connection_clone, - utils::redis::NEAR_SIGN_CLAIM_NATIVE_FEE_QUEUE.to_string(), - ) - .await - else { - tokio::time::sleep(tokio::time::Duration::from_secs( - utils::redis::SLEEP_TIME_AFTER_EVENTS_PROCESS_SECS, - )) - .await; - continue; - }; - - let mut handlers = Vec::new(); - for (key, event) in events { - if let Ok(event) = serde_json::from_str::(&event) { - handlers.push(tokio::spawn({ - let config = config.clone(); - let mut redis_connection = redis_connection.clone(); - let connector = connector.clone(); - - async move { - let (Nep141LockerEvent::FinTransferEvent { - ref transfer_message, - .. - } - | Nep141LockerEvent::ClaimFeeEvent { - ref transfer_message, - }) = event - else { - warn!("Expected FinTransferEvent/ClaimFeeEvent, got: {:?}", event); - return; - }; - - info!("Received FinTransferEvent/ClaimFeeEvent log"); - - match connector - .sign_claim_native_fee( - vec![transfer_message.origin_nonce.into()], - config.evm.relayer_address_on_eth, - ) - .await - { - Ok(tx_hash) => { - info!("Signed claiming native fee: {:?}", tx_hash); - utils::redis::remove_event( - &mut redis_connection, - utils::redis::NEAR_SIGN_CLAIM_NATIVE_FEE_QUEUE, - key, - ) - .await; - } - Err(err) => error!("Failed to sign claiming native fee: {}", err), - }; - } - })); - } - } - - join_all(handlers).await; - - tokio::time::sleep(tokio::time::Duration::from_secs( - utils::redis::SLEEP_TIME_AFTER_EVENTS_PROCESS_SECS, - )) - .await; - } -} From 4db842489aac0b29b9236b3002354c79f0c50c23 Mon Sep 17 00:00:00 2001 From: Ivan Frolov <59515280+frolvanya@users.noreply.github.com> Date: Mon, 23 Dec 2024 13:47:32 -0500 Subject: [PATCH 07/21] feat: solana support (#153) * feat: added solana indexer * feat: added finalization from solana * feat: finished solana init&finalize transfer * feat: added solana live logs support * feat: added support for `..._transfer_sol` methods * chore: updated bridge token addresses * fix: bug with provided chain_kind * fix: storage deposit amount calculation * chore: few log modifications * fix: few tweaks to make solana transfers work * feat: added native_fee support for storage_deposit args from solana * chore: add a todo mentioning that `get_storage_deposit_actions` method is redundant * chore: added comment about aws usage * refactor: reduced code duplication for creating storage deposit actions * fix: h160 address parsing * feat: solana transfer native tokens * fix: near -> sol native token transfer * fix: solana indexer logic * feat: support non-near to non-near transfers * feat: replaced anchor deserialization with borsh * chore: start from block + 1 Since this block was already processed, there's no need to check it one more time * fix: near sign transfer * fix: prevented issues that could result in panic * chore: updated bridge token address * fix: use eth light client only for eth chain * refactor: moved timestamps checks to the bottom This ensures at least one execution * chore: added some comments for solana network configuation * fix: use eth light client only for eth chain and when vaa is none * feat: made solana-indexer less complicated --- .gitignore | 1 + omni-relayer/.example-env | 15 + omni-relayer/Cargo.lock | 1129 +++++++++++++++------------- omni-relayer/Cargo.toml | 19 +- omni-relayer/example-config.toml | 27 +- omni-relayer/src/config.rs | 24 +- omni-relayer/src/main.rs | 66 +- omni-relayer/src/startup/evm.rs | 121 ++- omni-relayer/src/startup/mod.rs | 26 +- omni-relayer/src/startup/near.rs | 14 +- omni-relayer/src/startup/solana.rs | 112 +++ omni-relayer/src/utils/evm.rs | 2 +- omni-relayer/src/utils/mod.rs | 2 + omni-relayer/src/utils/near.rs | 22 +- omni-relayer/src/utils/redis.rs | 45 +- omni-relayer/src/utils/solana.rs | 187 +++++ omni-relayer/src/utils/storage.rs | 143 ++++ omni-relayer/src/workers/evm.rs | 228 ++---- omni-relayer/src/workers/mod.rs | 1 + omni-relayer/src/workers/near.rs | 314 +++++--- omni-relayer/src/workers/solana.rs | 289 +++++++ 21 files changed, 1866 insertions(+), 921 deletions(-) create mode 100644 omni-relayer/.example-env create mode 100644 omni-relayer/src/startup/solana.rs create mode 100644 omni-relayer/src/utils/solana.rs create mode 100644 omni-relayer/src/utils/storage.rs create mode 100644 omni-relayer/src/workers/solana.rs diff --git a/.gitignore b/.gitignore index de3fbc79..d4eb1003 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .DS_Store **/target **/config.toml +**/.env diff --git a/omni-relayer/.example-env b/omni-relayer/.example-env new file mode 100644 index 00000000..a4709c1e --- /dev/null +++ b/omni-relayer/.example-env @@ -0,0 +1,15 @@ +RUST_LOG=info + +# It's used for near-lake-framework +AWS_ACCESS_KEY_ID=... +AWS_SECRET_ACCESS_KEY=... + +NEAR_ACCOUNT_ID=... +NEAR_PRIVATE_KEY=... + +ETH_PRIVATE_KEY=... +BASE_PRIVATE_KEY=... +ARB_PRIVATE_KEY=... + +# Note that solana private key must be encoded to bs58 string in order to use it +SOLANA_PRIVATE_KEY=... diff --git a/omni-relayer/Cargo.lock b/omni-relayer/Cargo.lock index 63d492e4..1e3409c8 100644 --- a/omni-relayer/Cargo.lock +++ b/omni-relayer/Cargo.lock @@ -44,7 +44,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -65,7 +65,7 @@ checksum = "b6ac1e58cded18cb28ddc17143c4dea5345b3ad575e14f32f66e4054a56eb271" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -184,9 +184,9 @@ checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "alloy" -version = "0.6.4" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b524b8c28a7145d1fe4950f84360b5de3e307601679ff0558ddc20ea229399" +checksum = "59febb24956a41c29bb5f450978fbe825bd6456b3f80586c8bd558dc882e7b6a" dependencies = [ "alloy-consensus", "alloy-contract", @@ -209,9 +209,9 @@ dependencies = [ [[package]] name = "alloy-chains" -version = "0.1.48" +version = "0.1.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0161082e0edd9013d23083465cc04b20e44b7a15646d36ba7b0cdb7cd6fe18f" +checksum = "830045a4421ee38d3ab570d36d4d2b5152c066e72797139224da8de5d5981fd0" dependencies = [ "alloy-primitives", "num_enum", @@ -220,25 +220,40 @@ dependencies = [ [[package]] name = "alloy-consensus" -version = "0.6.4" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae09ffd7c29062431dd86061deefe4e3c6f07fa0d674930095f8dcedb0baf02c" +checksum = "e88e1edea70787c33e11197d3f32ae380f3db19e6e061e539a5bcf8184a6b326" dependencies = [ "alloy-eips", "alloy-primitives", "alloy-rlp", "alloy-serde", + "alloy-trie", "auto_impl", "c-kzg", "derive_more 1.0.0", "serde", ] +[[package]] +name = "alloy-consensus-any" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57b1bb53f40c0273cd1975573cd457b39213e68584e36d1401d25fd0398a1d65" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "serde", +] + [[package]] name = "alloy-contract" -version = "0.6.4" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66430a72d5bf5edead101c8c2f0a24bada5ec9f3cf9909b3e08b6d6899b4803e" +checksum = "1b668c78c4b1f12f474ede5a85e8ce550d0aa1ef7d49fd1d22855a43b960e725" dependencies = [ "alloy-dyn-abi", "alloy-json-abi", @@ -252,14 +267,14 @@ dependencies = [ "alloy-transport", "futures", "futures-util", - "thiserror 1.0.69", + "thiserror 2.0.9", ] [[package]] name = "alloy-core" -version = "0.8.14" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d14d531c99995de71558e8e2206c27d709559ee8e5a0452b965ea82405a013" +checksum = "c618bd382f0bc2ac26a7e4bfae01c9b015ca8f21b37ca40059ae35a7e62b3dc6" dependencies = [ "alloy-dyn-abi", "alloy-json-abi", @@ -270,9 +285,9 @@ dependencies = [ [[package]] name = "alloy-dyn-abi" -version = "0.8.14" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80759b3f57b3b20fa7cd8fef6479930fc95461b58ff8adea6e87e618449c8a1d" +checksum = "41056bde53ae10ffbbf11618efbe1e0290859e5eab0fe9ef82ebdb62f12a866f" dependencies = [ "alloy-json-abi", "alloy-primitives", @@ -310,9 +325,9 @@ dependencies = [ [[package]] name = "alloy-eips" -version = "0.6.4" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b6aa3961694b30ba53d41006131a2fca3bdab22e4c344e46db2c639e7c2dfdd" +checksum = "5f9fadfe089e9ccc0650473f2d4ef0a28bc015bbca5631d9f0f09e49b557fdb3" dependencies = [ "alloy-eip2930", "alloy-eip7702", @@ -328,20 +343,21 @@ dependencies = [ [[package]] name = "alloy-genesis" -version = "0.6.4" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e53f7877ded3921d18a0a9556d55bedf84535567198c9edab2aa23106da91855" +checksum = "2b2a4cf7b70f3495788e74ce1c765260ffe38820a2a774ff4aacb62e31ea73f9" dependencies = [ "alloy-primitives", "alloy-serde", + "alloy-trie", "serde", ] [[package]] name = "alloy-json-abi" -version = "0.8.14" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac4b22b3e51cac09fd2adfcc73b55f447b4df669f983c13f7894ec82b607c63f" +checksum = "c357da577dfb56998d01f574d81ad7a1958d248740a7981b205d69d65a7da404" dependencies = [ "alloy-primitives", "alloy-sol-type-parser", @@ -351,29 +367,31 @@ dependencies = [ [[package]] name = "alloy-json-rpc" -version = "0.6.4" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3694b7e480728c0b3e228384f223937f14c10caef5a4c766021190fc8f283d35" +checksum = "e29040b9d5fe2fb70415531882685b64f8efd08dfbd6cc907120650504821105" dependencies = [ "alloy-primitives", "alloy-sol-types", "serde", "serde_json", - "thiserror 1.0.69", + "thiserror 2.0.9", "tracing", ] [[package]] name = "alloy-network" -version = "0.6.4" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea94b8ceb5c75d7df0a93ba0acc53b55a22b47b532b600a800a87ef04eb5b0b4" +checksum = "510cc00b318db0dfccfdd2d032411cfae64fc144aef9679409e014145d3dacc4" dependencies = [ "alloy-consensus", + "alloy-consensus-any", "alloy-eips", "alloy-json-rpc", "alloy-network-primitives", "alloy-primitives", + "alloy-rpc-types-any", "alloy-rpc-types-eth", "alloy-serde", "alloy-signer", @@ -383,14 +401,14 @@ dependencies = [ "futures-utils-wasm", "serde", "serde_json", - "thiserror 1.0.69", + "thiserror 2.0.9", ] [[package]] name = "alloy-network-primitives" -version = "0.6.4" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df9f3e281005943944d15ee8491534a1c7b3cbf7a7de26f8c433b842b93eb5f9" +checksum = "9081c099e798b8a2bba2145eb82a9a146f01fc7a35e9ab6e7b43305051f97550" dependencies = [ "alloy-consensus", "alloy-eips", @@ -401,9 +419,9 @@ dependencies = [ [[package]] name = "alloy-node-bindings" -version = "0.6.4" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9805d126f24be459b958973c0569c73e1aadd27d4535eee82b2b6764aa03616" +checksum = "aef9849fb8bbb28f69f2cbdb4b0dac2f0e35c04f6078a00dfb8486469aed02de" dependencies = [ "alloy-genesis", "alloy-primitives", @@ -411,16 +429,16 @@ dependencies = [ "rand 0.8.5", "serde_json", "tempfile", - "thiserror 1.0.69", + "thiserror 2.0.9", "tracing", "url", ] [[package]] name = "alloy-primitives" -version = "0.8.14" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9db948902dfbae96a73c2fbf1f7abec62af034ab883e4c777c3fd29702bd6e2c" +checksum = "6259a506ab13e1d658796c31e6e39d2e2ee89243bcc505ddc613b35732e0a430" dependencies = [ "alloy-rlp", "bytes", @@ -446,9 +464,9 @@ dependencies = [ [[package]] name = "alloy-provider" -version = "0.6.4" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40c1f9eede27bf4c13c099e8e64d54efd7ce80ef6ea47478aa75d5d74e2dba3b" +checksum = "dc2dfaddd9a30aa870a78a4e1316e3e115ec1e12e552cbc881310456b85c1f24" dependencies = [ "alloy-chains", "alloy-consensus", @@ -480,7 +498,7 @@ dependencies = [ "schnellru", "serde", "serde_json", - "thiserror 1.0.69", + "thiserror 2.0.9", "tokio", "tracing", "url", @@ -489,9 +507,9 @@ dependencies = [ [[package]] name = "alloy-pubsub" -version = "0.6.4" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90f1f34232f77341076541c405482e4ae12f0ee7153d8f9969fc1691201b2247" +checksum = "695809e743628d54510c294ad17a4645bd9f465aeb0d20ee9ce9877c9712dc9c" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -502,15 +520,15 @@ dependencies = [ "serde_json", "tokio", "tokio-stream", - "tower 0.5.1", + "tower 0.5.2", "tracing", ] [[package]] name = "alloy-rlp" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0822426598f95e45dd1ea32a738dac057529a709ee645fcc516ffa4cbde08f" +checksum = "f542548a609dca89fcd72b3b9f355928cf844d4363c5eed9c5273a3dd225e097" dependencies = [ "alloy-rlp-derive", "arrayvec", @@ -519,20 +537,20 @@ dependencies = [ [[package]] name = "alloy-rlp-derive" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b09cae092c27b6f1bde952653a22708691802e57bfef4a2973b80bea21efd3f" +checksum = "5a833d97bf8a5f0f878daf2c8451fff7de7f9de38baa5a45d936ec718d81255a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] name = "alloy-rpc-client" -version = "0.6.4" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374dbe0dc3abdc2c964f36b3d3edf9cdb3db29d16bda34aa123f03d810bec1dd" +checksum = "531137b283547d5b9a5cafc96b006c64ef76810c681d606f28be9781955293b6" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -547,7 +565,7 @@ dependencies = [ "serde_json", "tokio", "tokio-stream", - "tower 0.5.1", + "tower 0.5.2", "tracing", "url", "wasmtimer", @@ -555,9 +573,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types" -version = "0.6.4" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c74832aa474b670309c20fffc2a869fa141edab7c79ff7963fad0a08de60bae1" +checksum = "3410a472ce26c457e9780f708ee6bd540b30f88f1f31fdab7a11d00bd6aa1aee" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", @@ -567,9 +585,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-anvil" -version = "0.6.4" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca97963132f78ddfc60e43a017348e6d52eea983925c23652f5b330e8e02291" +checksum = "9ed06bd8a5fc57b352a6cbac24eec52a4760f08ae2c1eb56ac49c8ed4b02c351" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", @@ -577,13 +595,25 @@ dependencies = [ "serde", ] +[[package]] +name = "alloy-rpc-types-any" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed98e1af55a7d856bfa385f30f63d8d56be2513593655c904a8f4a7ec963aa3e" +dependencies = [ + "alloy-consensus-any", + "alloy-rpc-types-eth", + "alloy-serde", +] + [[package]] name = "alloy-rpc-types-eth" -version = "0.6.4" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8a477281940d82d29315846c7216db45b15e90bcd52309da9f54bcf7ad94a11" +checksum = "8737d7a6e37ca7bba9c23e9495c6534caec6760eb24abc9d5ffbaaba147818e1" dependencies = [ "alloy-consensus", + "alloy-consensus-any", "alloy-eips", "alloy-network-primitives", "alloy-primitives", @@ -598,9 +628,9 @@ dependencies = [ [[package]] name = "alloy-serde" -version = "0.6.4" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dfa4a7ccf15b2492bb68088692481fd6b2604ccbee1d0d6c44c21427ae4df83" +checksum = "5851bf8d5ad33014bd0c45153c603303e730acc8a209450a7ae6b4a12c2789e2" dependencies = [ "alloy-primitives", "serde", @@ -609,23 +639,23 @@ dependencies = [ [[package]] name = "alloy-signer" -version = "0.6.4" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e10aec39d60dc27edcac447302c7803d2371946fb737245320a05b78eb2fafd" +checksum = "7e10ca565da6500cca015ba35ee424d59798f2e1b85bc0dd8f81dafd401f029a" dependencies = [ "alloy-primitives", "async-trait", "auto_impl", "elliptic-curve 0.13.8", "k256", - "thiserror 1.0.69", + "thiserror 2.0.9", ] [[package]] name = "alloy-signer-local" -version = "0.6.4" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8396f6dff60700bc1d215ee03d86ff56de268af96e2bf833a14d0bafcab9882" +checksum = "47fababf5a745133490cde927d48e50267f97d3d1209b9fc9f1d1d666964d172" dependencies = [ "alloy-consensus", "alloy-network", @@ -634,28 +664,28 @@ dependencies = [ "async-trait", "k256", "rand 0.8.5", - "thiserror 1.0.69", + "thiserror 2.0.9", ] [[package]] name = "alloy-sol-macro" -version = "0.8.14" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bfd7853b65a2b4f49629ec975fee274faf6dff15ab8894c620943398ef283c0" +checksum = "d9d64f851d95619233f74b310f12bcf16e0cbc27ee3762b6115c14a84809280a" dependencies = [ "alloy-sol-macro-expander", "alloy-sol-macro-input", "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] name = "alloy-sol-macro-expander" -version = "0.8.14" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82ec42f342d9a9261699f8078e57a7a4fda8aaa73c1a212ed3987080e6a9cd13" +checksum = "6bf7ed1574b699f48bf17caab4e6e54c6d12bc3c006ab33d58b1e227c1c3559f" dependencies = [ "alloy-sol-macro-input", "const-hex", @@ -664,31 +694,31 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", "syn-solidity", "tiny-keccak", ] [[package]] name = "alloy-sol-macro-input" -version = "0.8.14" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2c50e6a62ee2b4f7ab3c6d0366e5770a21cad426e109c2f40335a1b3aff3df" +checksum = "8c02997ccef5f34f9c099277d4145f183b422938ed5322dc57a089fe9b9ad9ee" dependencies = [ "const-hex", "dunce", "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", "syn-solidity", ] [[package]] name = "alloy-sol-type-parser" -version = "0.8.14" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac17c6e89a50fb4a758012e4b409d9a0ba575228e69b539fe37d7a1bd507ca4a" +checksum = "ce13ff37285b0870d0a0746992a4ae48efaf34b766ae4c2640fa15e5305f8e73" dependencies = [ "serde", "winnow", @@ -696,9 +726,9 @@ dependencies = [ [[package]] name = "alloy-sol-types" -version = "0.8.14" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9dc0fffe397aa17628160e16b89f704098bf3c9d74d5d369ebc239575936de5" +checksum = "1174cafd6c6d810711b4e00383037bdb458efc4fe3dbafafa16567e0320c54d8" dependencies = [ "alloy-json-abi", "alloy-primitives", @@ -709,9 +739,9 @@ dependencies = [ [[package]] name = "alloy-transport" -version = "0.6.4" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f99acddb34000d104961897dbb0240298e8b775a7efffb9fda2a1a3efedd65b3" +checksum = "538a04a37221469cac0ce231b737fd174de2fdfcdd843bdd068cb39ed3e066ad" dependencies = [ "alloy-json-rpc", "base64 0.22.1", @@ -719,9 +749,9 @@ dependencies = [ "futures-utils-wasm", "serde", "serde_json", - "thiserror 1.0.69", + "thiserror 2.0.9", "tokio", - "tower 0.5.1", + "tower 0.5.2", "tracing", "url", "wasmtimer", @@ -729,30 +759,30 @@ dependencies = [ [[package]] name = "alloy-transport-http" -version = "0.6.4" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dc013132e34eeadaa0add7e74164c1503988bfba8bae885b32e0918ba85a8a6" +checksum = "2ed40eb1e1265b2911512f6aa1dcece9702d078f5a646730c45e39e2be00ac1c" dependencies = [ "alloy-json-rpc", "alloy-transport", "reqwest 0.12.9", "serde_json", - "tower 0.5.1", + "tower 0.5.2", "tracing", "url", ] [[package]] name = "alloy-transport-ws" -version = "0.6.4" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abd170e600801116d5efe64f74a4fc073dbbb35c807013a7d0a388742aeebba0" +checksum = "fba0e39d181d13c266dbb8ca54ed584a2c66d6e9279afca89c7a6b1825e98abb" dependencies = [ "alloy-pubsub", "alloy-transport", "futures", "http 1.2.0", - "rustls 0.23.19", + "rustls 0.23.20", "serde_json", "tokio", "tokio-tungstenite 0.24.0", @@ -760,6 +790,22 @@ dependencies = [ "ws_stream_wasm", ] +[[package]] +name = "alloy-trie" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e428104b2445a4f929030891b3dbf8c94433a8349ba6480946bf6af7975c2f6" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "arrayvec", + "derive_more 1.0.0", + "nybbles", + "serde", + "smallvec", + "tracing", +] + [[package]] name = "android-tzdata" version = "0.1.1" @@ -826,9 +872,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.94" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1fd03a028ef38ba2276dce7e33fcd6369c158a1bca17946c4b1b701891c1ff7" +checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" [[package]] name = "arbitrary" @@ -1033,6 +1079,9 @@ name = "arrayvec" version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +dependencies = [ + "serde", +] [[package]] name = "ascii" @@ -1149,7 +1198,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -1160,7 +1209,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -1188,7 +1237,7 @@ checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -1199,9 +1248,9 @@ checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "aws-config" -version = "1.5.10" +version = "1.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b49afaa341e8dd8577e1a2200468f98956d6eda50bcf4a53246cc00174ba924" +checksum = "a5d1c2c88936a73c699225d0bc00684a534166b0cebc2659c3cdf08de8edc64c" dependencies = [ "aws-credential-types", "aws-runtime", @@ -1210,7 +1259,7 @@ dependencies = [ "aws-sdk-sts", "aws-smithy-async", "aws-smithy-http", - "aws-smithy-json 0.60.7", + "aws-smithy-json", "aws-smithy-runtime", "aws-smithy-runtime-api", "aws-smithy-types", @@ -1241,9 +1290,9 @@ dependencies = [ [[package]] name = "aws-runtime" -version = "1.4.4" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5ac934720fbb46206292d2c75b57e67acfc56fe7dfd34fb9a02334af08409ea" +checksum = "300a12520b4e6d08b73f77680f12c16e8ae43250d55100e0b2be46d78da16a48" dependencies = [ "aws-credential-types", "aws-sigv4", @@ -1267,9 +1316,9 @@ dependencies = [ [[package]] name = "aws-sdk-s3" -version = "1.65.0" +version = "1.66.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3ba2c5c0f2618937ce3d4a5ad574b86775576fa24006bcb3128c6e2cbf3c34e" +checksum = "154488d16ab0d627d15ab2832b57e68a16684c8c902f14cb8a75ec933fc94852" dependencies = [ "aws-credential-types", "aws-runtime", @@ -1278,7 +1327,7 @@ dependencies = [ "aws-smithy-checksums", "aws-smithy-eventstream", "aws-smithy-http", - "aws-smithy-json 0.61.1", + "aws-smithy-json", "aws-smithy-runtime", "aws-smithy-runtime-api", "aws-smithy-types", @@ -1301,15 +1350,15 @@ dependencies = [ [[package]] name = "aws-sdk-sso" -version = "1.50.0" +version = "1.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05ca43a4ef210894f93096039ef1d6fa4ad3edfabb3be92b80908b9f2e4b4eab" +checksum = "74995133da38f109a0eb8e8c886f9e80c713b6e9f2e6e5a6a1ba4450ce2ffc46" dependencies = [ "aws-credential-types", "aws-runtime", "aws-smithy-async", "aws-smithy-http", - "aws-smithy-json 0.61.1", + "aws-smithy-json", "aws-smithy-runtime", "aws-smithy-runtime-api", "aws-smithy-types", @@ -1323,15 +1372,15 @@ dependencies = [ [[package]] name = "aws-sdk-ssooidc" -version = "1.51.0" +version = "1.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abaf490c2e48eed0bb8e2da2fb08405647bd7f253996e0f93b981958ea0f73b0" +checksum = "e7062a779685cbf3b2401eb36151e2c6589fd5f3569b8a6bc2d199e5aaa1d059" dependencies = [ "aws-credential-types", "aws-runtime", "aws-smithy-async", "aws-smithy-http", - "aws-smithy-json 0.61.1", + "aws-smithy-json", "aws-smithy-runtime", "aws-smithy-runtime-api", "aws-smithy-types", @@ -1345,15 +1394,15 @@ dependencies = [ [[package]] name = "aws-sdk-sts" -version = "1.51.0" +version = "1.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b68fde0d69c8bfdc1060ea7da21df3e39f6014da316783336deff0a9ec28f4bf" +checksum = "299dae7b1dc0ee50434453fa5a229dc4b22bd3ee50409ff16becf1f7346e0193" dependencies = [ "aws-credential-types", "aws-runtime", "aws-smithy-async", "aws-smithy-http", - "aws-smithy-json 0.61.1", + "aws-smithy-json", "aws-smithy-query", "aws-smithy-runtime", "aws-smithy-runtime-api", @@ -1397,9 +1446,9 @@ dependencies = [ [[package]] name = "aws-smithy-async" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62220bc6e97f946ddd51b5f1361f78996e704677afc518a4ff66b7a72ea1378c" +checksum = "8aa8ff1492fd9fb99ae28e8467af0dbbb7c31512b16fabf1a0f10d7bb6ef78bb" dependencies = [ "futures-util", "pin-project-lite", @@ -1459,15 +1508,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "aws-smithy-json" -version = "0.60.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4683df9469ef09468dad3473d129960119a0d3593617542b7d52086c8486f2d6" -dependencies = [ - "aws-smithy-types", -] - [[package]] name = "aws-smithy-json" version = "0.61.1" @@ -1489,9 +1529,9 @@ dependencies = [ [[package]] name = "aws-smithy-runtime" -version = "1.7.4" +version = "1.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f20685047ca9d6f17b994a07f629c813f08b5bce65523e47124879e60103d45" +checksum = "431a10d0e07e09091284ef04453dae4069283aa108d209974d67e77ae1caa658" dependencies = [ "aws-smithy-async", "aws-smithy-http", @@ -1504,7 +1544,7 @@ dependencies = [ "http-body 0.4.6", "http-body 1.0.1", "httparse", - "hyper 0.14.31", + "hyper 0.14.32", "hyper-rustls 0.24.2", "once_cell", "pin-project-lite", @@ -1533,9 +1573,9 @@ dependencies = [ [[package]] name = "aws-smithy-types" -version = "1.2.9" +version = "1.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fbd94a32b3a7d55d3806fe27d98d3ad393050439dd05eb53ece36ec5e3d3510" +checksum = "8ecbf4d5dfb169812e2b240a4350f15ad3c6b03a54074e5712818801615f2dc5" dependencies = [ "base64-simd", "bytes", @@ -1590,7 +1630,7 @@ dependencies = [ "cfg-if 1.0.0", "libc", "miniz_oxide", - "object 0.36.5", + "object 0.36.7", "rustc-demangle", "windows-targets 0.52.6", ] @@ -1833,7 +1873,7 @@ dependencies = [ "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -1861,14 +1901,14 @@ dependencies = [ [[package]] name = "bridge-connector-common" version = "0.1.0" -source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs?branch=refactor%2Fconnectors#2585f2e681cd2f0513f663227ff2ca10c6eefd5f" +source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs?branch=refactor%2Fsolana-bridge-client#dc416510fc760d22fdf047ac42d68d75da63b0e6" dependencies = [ "eth-proof", "ethers", "near-light-client-on-eth", "near-rpc-client", "serde_json", - "thiserror 2.0.4", + "thiserror 2.0.9", ] [[package]] @@ -1954,22 +1994,22 @@ dependencies = [ [[package]] name = "bytemuck" -version = "1.20.0" +version = "1.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b37c88a63ffd85d15b406896cc343916d7cf57838a847b3a6f2ca5d39a5695a" +checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcfcc3cd946cb52f0bbfdbbcfa2f4e24f75ebb6c0e1002f7c25904fada18b9ec" +checksum = "3fa76293b4f7bb636ab88fd78228235b5248b4d05cc589aed610f954af5d7c7a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -2088,7 +2128,7 @@ checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" dependencies = [ "camino", "cargo-platform", - "semver 1.0.23", + "semver 1.0.24", "serde", "serde_json", "thiserror 1.0.69", @@ -2096,9 +2136,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.2" +version = "1.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f34d93e62b03caf570cccc334cbc6c2fceca82f39211051345108adcba3eebdc" +checksum = "c31a0499c1dc64f458ad13872de75c0eb7e3fdb0e67964610c914b034fc5956e" dependencies = [ "jobserver", "libc", @@ -2137,14 +2177,14 @@ checksum = "45565fc9416b9896014f5732ac776f810ee53a66730c17e4020c3ec064a8f88f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] name = "chrono" -version = "0.4.38" +version = "0.4.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" dependencies = [ "android-tzdata", "iana-time-zone", @@ -2216,7 +2256,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -2330,15 +2370,15 @@ dependencies = [ [[package]] name = "console" -version = "0.15.8" +version = "0.15.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" +checksum = "ea3c6ecd8059b57859df5c69830340ed3c41d30e3da0c1cbed90a96ac853041b" dependencies = [ "encode_unicode", - "lazy_static", "libc", - "unicode-width 0.1.14", - "windows-sys 0.52.0", + "once_cell", + "unicode-width", + "windows-sys 0.59.0", ] [[package]] @@ -2561,18 +2601,18 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.13" +version = "0.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" +checksum = "06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-deque" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" dependencies = [ "crossbeam-epoch", "crossbeam-utils", @@ -2589,9 +2629,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.20" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crunchy" @@ -2692,7 +2732,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -2740,7 +2780,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -2762,7 +2802,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core 0.20.10", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -2876,7 +2916,7 @@ checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -2918,7 +2958,7 @@ dependencies = [ "darling 0.20.10", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -2938,7 +2978,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core 0.20.2", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -2951,7 +2991,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version 0.4.1", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -2971,7 +3011,7 @@ checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", "unicode-xid", ] @@ -3055,7 +3095,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -3084,7 +3124,7 @@ checksum = "a6cbae11b3de8fce2a456e8ea3dada226b35fe791f0dc1d360c0941f0bb681f3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -3303,9 +3343,9 @@ dependencies = [ [[package]] name = "encode_unicode" -version = "0.3.6" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" [[package]] name = "encoding_rs" @@ -3351,7 +3391,7 @@ checksum = "a1ab991c1362ac86c61ab6f556cff143daa22e5a15e4e189df818b2fd19fe65b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -3371,7 +3411,7 @@ checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -3392,7 +3432,7 @@ dependencies = [ "darling 0.20.10", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -3470,7 +3510,7 @@ dependencies = [ [[package]] name = "eth-proof" version = "0.1.0" -source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs?branch=refactor%2Fconnectors#2585f2e681cd2f0513f663227ff2ca10c6eefd5f" +source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs?branch=refactor%2Fsolana-bridge-client#dc416510fc760d22fdf047ac42d68d75da63b0e6" dependencies = [ "borsh 1.5.3", "cita_trie", @@ -3482,7 +3522,7 @@ dependencies = [ "rlp 0.5.2", "serde", "serde_json", - "thiserror 2.0.4", + "thiserror 2.0.9", "tokio", ] @@ -3627,7 +3667,7 @@ dependencies = [ "reqwest 0.11.27", "serde", "serde_json", - "syn 2.0.90", + "syn 2.0.91", "toml 0.8.19", "walkdir", ] @@ -3645,7 +3685,7 @@ dependencies = [ "proc-macro2", "quote", "serde_json", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -3671,7 +3711,7 @@ dependencies = [ "serde", "serde_json", "strum 0.26.3", - "syn 2.0.90", + "syn 2.0.91", "tempfile", "thiserror 1.0.69", "tiny-keccak", @@ -3687,7 +3727,7 @@ dependencies = [ "chrono", "ethers-core", "reqwest 0.11.27", - "semver 1.0.23", + "semver 1.0.24", "serde", "serde_json", "thiserror 1.0.69", @@ -3796,7 +3836,7 @@ dependencies = [ "path-slash", "rayon", "regex", - "semver 1.0.23", + "semver 1.0.24", "serde", "serde_json", "solang-parser", @@ -3839,7 +3879,7 @@ dependencies = [ [[package]] name = "evm-bridge-client" version = "0.1.0" -source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs?branch=refactor%2Fconnectors#2585f2e681cd2f0513f663227ff2ca10c6eefd5f" +source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs?branch=refactor%2Fsolana-bridge-client#dc416510fc760d22fdf047ac42d68d75da63b0e6" dependencies = [ "borsh 1.5.3", "bridge-connector-common", @@ -3878,9 +3918,9 @@ checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" [[package]] name = "fastrand" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "486f806e73c5707928240ddc295403b1b93c96a02038563881c4a2fd84b81ac4" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "fastrlp" @@ -3893,6 +3933,17 @@ dependencies = [ "bytes", ] +[[package]] +name = "fastrlp" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce8dba4714ef14b8274c371879b175aa55b16b30f269663f19d576f380018dc4" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] + [[package]] name = "feature-probe" version = "0.1.1" @@ -4001,9 +4052,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "foldhash" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f81ec6369c545a7d40e4589b5597581fa1c441fe1cce96dd1de43159910a36a2" +checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" [[package]] name = "foreign-types" @@ -4111,7 +4162,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -4515,11 +4566,11 @@ dependencies = [ [[package]] name = "home" -version = "0.5.9" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -4598,9 +4649,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.31" +version = "0.14.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c08302e8fa335b151b788c775ff56e7a03ae64ff85c548ee820fecb70356e85" +checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" dependencies = [ "bytes", "futures-channel", @@ -4622,9 +4673,9 @@ dependencies = [ [[package]] name = "hyper" -version = "1.5.1" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97818827ef4f364230e16705d4706e2897df2bb60617d6ca15d598025a3c481f" +checksum = "256fb8d4bd6413123cc9d91832d78325c48ff41677595be797d90f42969beae0" dependencies = [ "bytes", "futures-channel", @@ -4648,7 +4699,7 @@ checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ "futures-util", "http 0.2.12", - "hyper 0.14.31", + "hyper 0.14.32", "log", "rustls 0.21.12", "rustls-native-certs 0.6.3", @@ -4658,15 +4709,15 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.3" +version = "0.27.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" +checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" dependencies = [ "futures-util", "http 1.2.0", - "hyper 1.5.1", + "hyper 1.5.2", "hyper-util", - "rustls 0.23.19", + "rustls 0.23.20", "rustls-pki-types", "tokio", "tokio-rustls 0.26.1", @@ -4679,7 +4730,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" dependencies = [ - "hyper 0.14.31", + "hyper 0.14.32", "pin-project-lite", "tokio", "tokio-io-timeout", @@ -4692,7 +4743,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" dependencies = [ "bytes", - "hyper 0.14.31", + "hyper 0.14.32", "native-tls", "tokio", "tokio-native-tls", @@ -4706,7 +4757,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper 1.5.1", + "hyper 1.5.2", "hyper-util", "native-tls", "tokio", @@ -4725,7 +4776,7 @@ dependencies = [ "futures-util", "http 1.2.0", "http-body 1.0.1", - "hyper 1.5.1", + "hyper 1.5.2", "pin-project-lite", "socket2", "tokio", @@ -4871,7 +4922,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -4954,7 +5005,7 @@ checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -4994,7 +5045,7 @@ dependencies = [ "console", "number_prefix", "portable-atomic", - "unicode-width 0.2.0", + "unicode-width", "web-time", ] @@ -5112,9 +5163,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.74" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a865e038f7f6ed956f788f0d7d60c541fff74c7bd74272c5d4cf15c63743e705" +checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" dependencies = [ "once_cell", "wasm-bindgen", @@ -5235,9 +5286,9 @@ checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" [[package]] name = "libc" -version = "0.2.167" +version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09d6582e104315a817dff97f75133544b2e094ee22447d2acf4a74e189ba06fc" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" [[package]] name = "libm" @@ -5518,9 +5569,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.8.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +checksum = "4ffbe83022cedc1d264172192511ae958937694cd57ce297164951b8b3568394" dependencies = [ "adler2", ] @@ -5591,7 +5642,7 @@ dependencies = [ [[package]] name = "near-bridge-client" version = "0.1.0" -source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs?branch=refactor%2Fconnectors#2585f2e681cd2f0513f663227ff2ca10c6eefd5f" +source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs?branch=refactor%2Fsolana-bridge-client#dc416510fc760d22fdf047ac42d68d75da63b0e6" dependencies = [ "borsh 1.5.3", "bridge-connector-common", @@ -5603,6 +5654,7 @@ dependencies = [ "near-rpc-client", "near-token", "omni-types", + "serde", "serde_json", "tracing", ] @@ -5702,9 +5754,9 @@ dependencies = [ [[package]] name = "near-contract-standards" -version = "5.6.0" +version = "5.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b352e9b2f7c3abe5db91d91e446810433c6afbd3e43d7b3d989a2ef32c1dc2e" +checksum = "6b8bc68a8c2bac5e44b38e322e41cadeefe33f766993bf067375b63cc860a73b" dependencies = [ "near-sdk", ] @@ -5935,11 +5987,11 @@ dependencies = [ [[package]] name = "near-light-client-on-eth" version = "0.1.0" -source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs?branch=refactor%2Fconnectors#2585f2e681cd2f0513f663227ff2ca10c6eefd5f" +source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs?branch=refactor%2Fsolana-bridge-client#dc416510fc760d22fdf047ac42d68d75da63b0e6" dependencies = [ "ethereum-types 0.14.1", "ethers", - "thiserror 2.0.4", + "thiserror 2.0.9", "tokio", ] @@ -6218,7 +6270,7 @@ dependencies = [ [[package]] name = "near-rpc-client" version = "0.1.0" -source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs?branch=refactor%2Fconnectors#2585f2e681cd2f0513f663227ff2ca10c6eefd5f" +source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs?branch=refactor%2Fsolana-bridge-client#dc416510fc760d22fdf047ac42d68d75da63b0e6" dependencies = [ "borsh 1.5.3", "lazy_static", @@ -6228,7 +6280,7 @@ dependencies = [ "near-primitives 0.21.2", "reqwest 0.11.27", "serde_json", - "thiserror 2.0.4", + "thiserror 2.0.9", "tokio", ] @@ -6240,7 +6292,7 @@ checksum = "3610517a56329b7cce0c8c4cf2686fc4bbe0b155181b118acf20d2a301bf29b6" dependencies = [ "quote", "serde", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -6251,7 +6303,7 @@ checksum = "df598b0785a3e36d7e4fb73afcdf20536988b13d07cead71dfa777db4783e552" dependencies = [ "quote", "serde", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -6263,7 +6315,7 @@ dependencies = [ "fs2", "near-rpc-error-core 0.21.2", "serde", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -6274,7 +6326,7 @@ checksum = "647ef261df99ad877c08c97af2f10368c8b8cde0968250d3482a5a249e9f3926" dependencies = [ "near-rpc-error-core 0.26.0", "serde", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -6301,9 +6353,9 @@ checksum = "a1bca8c93ff0ad17138c147323a07f036d11c9e1602e3bc2ac9d29c3cf78b89d" [[package]] name = "near-sdk" -version = "5.6.0" +version = "5.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581c7e6b1962fca1637bf668c18b498328100f8974aa798ed44702ba77c3bdac" +checksum = "befb9df6da1a6a0b6656388c0db76084867062a87f1cbc066c188a8e360b6463" dependencies = [ "base64 0.22.1", "borsh 1.5.3", @@ -6321,9 +6373,9 @@ dependencies = [ [[package]] name = "near-sdk-macros" -version = "5.6.0" +version = "5.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0818798144d69a248d76e22b04d1b89b84b80575c96c4af0f7f0332b22487a08" +checksum = "1268c4fc56bf53d70c200261fb8d57c6c1c6692243660f5f889c7fa4cf5771d2" dependencies = [ "Inflector", "darling 0.20.10", @@ -6333,7 +6385,7 @@ dependencies = [ "serde_json", "strum 0.26.3", "strum_macros 0.26.4", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -6711,7 +6763,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -6797,7 +6849,7 @@ dependencies = [ "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -6806,6 +6858,19 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" +[[package]] +name = "nybbles" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55a62e678a89501192cc5ebf47dcbc656b608ae5e1c61c9251fe35230f119fe3" +dependencies = [ + "alloy-rlp", + "const-hex", + "proptest", + "serde", + "smallvec", +] + [[package]] name = "object" version = "0.32.2" @@ -6820,9 +6885,9 @@ dependencies = [ [[package]] name = "object" -version = "0.36.5" +version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ "memchr", ] @@ -6839,7 +6904,7 @@ dependencies = [ [[package]] name = "omni-connector" version = "0.1.0" -source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs?branch=refactor%2Fconnectors#2585f2e681cd2f0513f663227ff2ca10c6eefd5f" +source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs?branch=refactor%2Fsolana-bridge-client#dc416510fc760d22fdf047ac42d68d75da63b0e6" dependencies = [ "borsh 1.5.3", "bridge-connector-common", @@ -6895,6 +6960,9 @@ dependencies = [ "serde", "serde_json", "solana-bridge-client", + "solana-client", + "solana-sdk", + "solana-transaction-status", "tokio", "tokio-stream", "toml 0.8.19", @@ -6981,7 +7049,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -7068,9 +7136,9 @@ checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" [[package]] name = "ordered-float" -version = "4.5.0" +version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c65ee1f9701bf938026630b455d5315f490640234259037edb259798b3bcf85e" +checksum = "7bb71e1b3fa6ca1c61f383464aaf2bb0e2f8e772a1f01d486832464de363b951" dependencies = [ "borsh 1.5.3", "num-traits", @@ -7197,7 +7265,7 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if 1.0.0", "libc", - "redox_syscall 0.5.7", + "redox_syscall 0.5.8", "smallvec", "windows-targets 0.52.6", ] @@ -7273,12 +7341,12 @@ dependencies = [ [[package]] name = "pest" -version = "2.7.14" +version = "2.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879952a81a83930934cbf1786752d6dedc3b1f29e8f8fb2ad1d0a36f377cf442" +checksum = "8b7cafe60d6cf8e62e1b9b2ea516a089c008945bb5a275416789e7db0bc199dc" dependencies = [ "memchr", - "thiserror 1.0.69", + "thiserror 2.0.9", "ucd-trie", ] @@ -7332,7 +7400,7 @@ dependencies = [ "phf_shared 0.11.2", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -7370,7 +7438,7 @@ checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -7473,7 +7541,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" dependencies = [ "proc-macro2", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -7573,7 +7641,7 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -7730,9 +7798,9 @@ dependencies = [ [[package]] name = "quanta" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5167a477619228a0b284fac2674e3c388cba90631d7b7de620e6f1fcd08da5" +checksum = "773ce68d0bb9bc7ef20be3536ffe94e223e1f365bd374108b2659fac0c65cfe6" dependencies = [ "crossbeam-utils", "libc", @@ -7760,9 +7828,9 @@ dependencies = [ "quinn-proto", "quinn-udp", "rustc-hash 2.1.0", - "rustls 0.23.19", + "rustls 0.23.20", "socket2", - "thiserror 2.0.4", + "thiserror 2.0.9", "tokio", "tracing", ] @@ -7778,11 +7846,11 @@ dependencies = [ "rand 0.8.5", "ring 0.17.8", "rustc-hash 2.1.0", - "rustls 0.23.19", + "rustls 0.23.20", "rustls-pki-types", "rustls-platform-verifier", "slab", - "thiserror 2.0.4", + "thiserror 2.0.9", "tinyvec", "tracing", "web-time", @@ -7790,9 +7858,9 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.7" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d5a626c6807713b15cac82a6acaccd6043c9a5408c24baae07611fec3f243da" +checksum = "1c40286217b4ba3a71d644d752e6a0b71f13f1b6a2c5311acfcbe0c2418ed904" dependencies = [ "cfg_aliases", "libc", @@ -7960,9 +8028,9 @@ checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" [[package]] name = "redox_syscall" -version = "0.5.7" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" +checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" dependencies = [ "bitflags 2.6.0", ] @@ -8086,7 +8154,7 @@ dependencies = [ "h2 0.3.26", "http 0.2.12", "http-body 0.4.6", - "hyper 0.14.31", + "hyper 0.14.32", "hyper-rustls 0.24.2", "hyper-tls 0.5.0", "ipnet", @@ -8133,8 +8201,8 @@ dependencies = [ "http 1.2.0", "http-body 1.0.1", "http-body-util", - "hyper 1.5.1", - "hyper-rustls 0.27.3", + "hyper 1.5.2", + "hyper-rustls 0.27.5", "hyper-tls 0.6.0", "hyper-util", "ipnet", @@ -8299,16 +8367,18 @@ dependencies = [ [[package]] name = "ruint" -version = "1.12.3" +version = "1.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c3cc4c2511671f327125da14133d0c5c5d137f006a1017a16f557bc85b16286" +checksum = "f5ef8fb1dd8de3870cb8400d51b4c2023854bbafd5431a3ac7e7317243e22d2f" dependencies = [ "alloy-rlp", "ark-ff 0.3.0", "ark-ff 0.4.2", "bytes", - "fastrlp", + "fastrlp 0.3.1", + "fastrlp 0.4.0", "num-bigint 0.4.6", + "num-integer", "num-traits", "parity-scale-codec", "primitive-types 0.12.2", @@ -8375,7 +8445,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ - "semver 1.0.23", + "semver 1.0.24", ] [[package]] @@ -8389,15 +8459,15 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.41" +version = "0.38.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7f649912bc1495e167a6edee79151c84b1bad49748cb4f1f1167f459f6224f6" +checksum = "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85" dependencies = [ "bitflags 2.6.0", "errno 0.3.10", "libc", "linux-raw-sys", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -8414,9 +8484,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.19" +version = "0.23.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "934b404430bb06b3fae2cba809eb45a1ab1aecd64491213d7c3301b88393f8d1" +checksum = "5065c3f250cbd332cd894be57c40fa52387247659b14a2d6041d121547903b1b" dependencies = [ "once_cell", "ring 0.17.8", @@ -8471,9 +8541,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.10.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" +checksum = "d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37" dependencies = [ "web-time", ] @@ -8489,7 +8559,7 @@ dependencies = [ "jni", "log", "once_cell", - "rustls 0.23.19", + "rustls 0.23.20", "rustls-native-certs 0.7.3", "rustls-platform-verifier-android", "rustls-webpki 0.102.8", @@ -8589,7 +8659,7 @@ dependencies = [ "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -8735,9 +8805,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.12.1" +version = "2.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa39c7303dc58b5543c94d22c1766b0d31f2ee58306363ea622b10bbc075eaa2" +checksum = "1863fd3768cd83c56a7f60faa4dc0d403f1b6df0a38c3c25f44b7894e45370d5" dependencies = [ "core-foundation-sys", "libc", @@ -8763,9 +8833,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.23" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +checksum = "3cb6eb87a131f756572d7fb904f6e7b68633f09cca868c5df1c4b8d1a694bbba" dependencies = [ "serde", ] @@ -8799,9 +8869,9 @@ checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" [[package]] name = "serde" -version = "1.0.215" +version = "1.0.216" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f" +checksum = "0b9781016e935a97e8beecf0c933758c97a5520d32930e460142b4cd80c6338e" dependencies = [ "serde_derive", ] @@ -8827,20 +8897,20 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.215" +version = "1.0.216" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" +checksum = "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] name = "serde_json" -version = "1.0.133" +version = "1.0.134" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" +checksum = "d00f4175c42ee48b15416f6193a959ba3a0d67fc699a0db9ad12df9f83991c7d" dependencies = [ "itoa", "memchr", @@ -8856,7 +8926,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -8907,7 +8977,7 @@ dependencies = [ "darling 0.20.10", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -9072,6 +9142,9 @@ name = "smallvec" version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +dependencies = [ + "serde", +] [[package]] name = "smart-default" @@ -9096,9 +9169,9 @@ dependencies = [ [[package]] name = "solana-account" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fc175269051361f32d8651405676a59ba229173cf51d33a36cd0d00e28170ee" +checksum = "c5b4e43476f7e13b6a8f571008cc6aff6ff0cae6e9c71ca96e6feb787e3409fd" dependencies = [ "bincode", "serde", @@ -9110,9 +9183,9 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ba531da629cc203b5044e632ce1b3543e80681e1a6223014aa0b5a937e3c9bc" +checksum = "c195abdb9665bb390eda3972b750d04f87a5b023cfde6674a61b03452de15585" dependencies = [ "Inflector", "base64 0.22.1", @@ -9136,9 +9209,9 @@ dependencies = [ [[package]] name = "solana-account-decoder-client-types" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c818475cd26500a5f4c8a214fcfdbfc9070a0847085c915fbbde78f88efceb6" +checksum = "88b743d836d14dea475cc0a82a3f31316563888af97d06f5575a90f8ceb859f2" dependencies = [ "base64 0.22.1", "bs58 0.5.1", @@ -9152,9 +9225,9 @@ dependencies = [ [[package]] name = "solana-account-info" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57f86633175ed13054cf901a9386e4f447ba51917fc93e746b76658e57cd87a1" +checksum = "42051fa2def3a2d9123f0e33b62a983b25c13d153a30e707b14d3c3b79a91592" dependencies = [ "bincode", "serde", @@ -9165,18 +9238,18 @@ dependencies = [ [[package]] name = "solana-atomic-u64" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11b89f3a07c2bd4aeab92616b7be2fd39c2bbe2caf0702cd561cabc59e4e5a19" +checksum = "10dad9cf8527bbf74d3668505f563bd362e2e14d0fc77338d20973e881bbad0b" dependencies = [ "parking_lot 0.12.3", ] [[package]] name = "solana-bincode" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2c1720ee13a7ea06ace039d810af7c4e895f857315a0bdface95e839633cae" +checksum = "3e3b178d3783809a2480c542cd7c57c06e1bab2c0f21562fcb8cd13eabd0138e" dependencies = [ "bincode", "serde", @@ -9185,9 +9258,9 @@ dependencies = [ [[package]] name = "solana-bn254" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ce95c5ff034d5ed2db19144e74b0a3598f32aee1a669164a9fe7bd4fca6a40a" +checksum = "c8f9c849dac8e6ef87c3c8035886df648ef5ec4c6d9d45b96fc045477e23a9b0" dependencies = [ "ark-bn254", "ark-ec", @@ -9200,9 +9273,9 @@ dependencies = [ [[package]] name = "solana-borsh" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ce4df354110b7a3d40b0722028eabe87e897e4a316acb76ef27e6953e8eebe" +checksum = "870197ea4929500d8e6f624c3eb578912b5063bbd5c8bfbe87396cd5b4257465" dependencies = [ "borsh 0.10.4", "borsh 1.5.3", @@ -9211,24 +9284,25 @@ dependencies = [ [[package]] name = "solana-bridge-client" version = "0.1.0" -source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs?branch=refactor%2Fconnectors#2585f2e681cd2f0513f663227ff2ca10c6eefd5f" +source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs?branch=refactor%2Fsolana-bridge-client#dc416510fc760d22fdf047ac42d68d75da63b0e6" dependencies = [ "borsh 1.5.3", "derive_builder 0.20.2", "mpl-token-metadata", + "omni-types", "sha2 0.10.8", "solana-client", "solana-sdk", - "spl-associated-token-account", + "spl-associated-token-account 6.0.0", "spl-token 7.0.0", - "thiserror 2.0.4", + "thiserror 2.0.9", ] [[package]] name = "solana-client" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f302bd43b697d9a27a4d21eafe20b7be13ebc8ddd22d64419eaa5a265fbc451c" +checksum = "1502052be06ff6bfc86363955c2bf06e5f9640689fdb5900e5aa7d5b22633a9d" dependencies = [ "async-trait", "bincode", @@ -9258,9 +9332,9 @@ dependencies = [ [[package]] name = "solana-clock" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf504af72783141ad1594958a4e8244d9589105143bc0b329972cbbbb6317137" +checksum = "b26a68f89972fddb370ba33a49340bd3419da529893d9ee851211588aee811fa" dependencies = [ "serde", "serde_derive", @@ -9270,18 +9344,18 @@ dependencies = [ [[package]] name = "solana-compute-budget" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f2b45606ec0f3045d695cd81da6dd35ccf8a71ad05d99d31d0a5e6028818e08" +checksum = "3366dd8be1d12ea197392cdc261ea1630d156b5685647ed7769959ef473f8aae" dependencies = [ "solana-sdk", ] [[package]] name = "solana-config-program" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32c6881f452959ab16a3be51b700128ed91fd4b8dda3086d22a71ee6016595d3" +checksum = "01b94dd5229242839bf71572d903a38f2ea40db5ad408eca57015bcaaf2a7607" dependencies = [ "bincode", "chrono", @@ -9295,9 +9369,9 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d4c9e78e187476f7dc4b3dfcbf1a32a386a5446a32234181f8babdaca009f8" +checksum = "1445dd6a6d47b7a025af9f9c44ecb333716a5a6859f77f8da210d86bb89a7627" dependencies = [ "async-trait", "bincode", @@ -9316,9 +9390,9 @@ dependencies = [ [[package]] name = "solana-cpi" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6246ad163c7a1ec62ef3182732b91748631af5214a13176257b98919e699fe4e" +checksum = "9e3b62e1ca838f92b90c25ab68c297272cee8e2256dad18806a219b05cfcd247" dependencies = [ "solana-account-info", "solana-define-syscall", @@ -9330,9 +9404,9 @@ dependencies = [ [[package]] name = "solana-curve25519" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85b8226b3a12bc753151a79e073bac46e0643c85a57a4fdeba7e15841116644f" +checksum = "d2ce85c03e05856b4094891fbaedf9ea9b0334b19d8fba72bd4b106442b46e12" dependencies = [ "bytemuck", "bytemuck_derive", @@ -9343,24 +9417,24 @@ dependencies = [ [[package]] name = "solana-decode-error" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61efcc865627988f6cc96cbe038776d16d378b7ed644268017f73ea8db947c0e" +checksum = "1323dbdb7c8ca717bcd7987a3f45619b5b6517dc3ee22a21342122a5516125c3" dependencies = [ "num-traits", ] [[package]] name = "solana-define-syscall" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8973c0e4811e915f5ee84b68cea4af8231e8157f47b6f6a7aebbac2777227eb5" +checksum = "a23cf0144176f94019a27ce46372661f67007232eea16cae96cb985fc25131d5" [[package]] name = "solana-derivation-path" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b873e47fe9c2f2cbc674d555a4fba4513e12dd9e45e170f07d05901b40105b0c" +checksum = "a1ccae348499724f35dd03f395b415c54ab3929799c90df0d33e9878947e0987" dependencies = [ "derivation-path", "qstring", @@ -9369,9 +9443,9 @@ dependencies = [ [[package]] name = "solana-epoch-schedule" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44e1f2e668cf1c0ace134d6eb54635f1c1e60dd2cdd65e8b14adc4ac383b3e5f" +checksum = "c60dde3613fcd1af91c2033e67ffe8c8d2bcd58085c53c842fa7903fa839ad38" dependencies = [ "serde", "serde_derive", @@ -9381,9 +9455,9 @@ dependencies = [ [[package]] name = "solana-feature-set" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6992929b65cc56c406edde40483c9160476eef2479da1f324686649992ee4f5" +checksum = "57c225a8a8be02a514d4180e6a7c6ff68e193c8e722ac14cde565fe68b671a4a" dependencies = [ "lazy_static", "solana-clock", @@ -9395,9 +9469,9 @@ dependencies = [ [[package]] name = "solana-fee-calculator" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cc687e6b60ddf1c0e0140a9cb4c524ea8d8c2836d7b723384c382cf8ceb462d" +checksum = "2c706f3d151d0abc197ca2fcecf877ace03d613be6fae766de12f5fb41c96b04" dependencies = [ "log", "serde", @@ -9406,9 +9480,9 @@ dependencies = [ [[package]] name = "solana-hash" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1eb018925ea07bf67ce767430fd580a52ed7406f61844ece6b53fdd0d97e8b2e" +checksum = "a86aabbd7ebf807689a0355f053d6dc31d2131c2d83613011a374a18cc5d61b7" dependencies = [ "borsh 1.5.3", "bs58 0.5.1", @@ -9424,9 +9498,9 @@ dependencies = [ [[package]] name = "solana-inflation" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4c7ea5a7f6bef23a9abc26f2300c208f1d64c20b319245a92eb145d4579a412" +checksum = "6954cd9fb4cd351e9e01d3fda020936f7cb44eb9efab3baecc3a5de1c9de8c1a" dependencies = [ "serde", "serde_derive", @@ -9434,9 +9508,9 @@ dependencies = [ [[package]] name = "solana-inline-spl" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57338f44084dcdda57146c49e66f5561eacb37b44573dffa550c25d9799518e8" +checksum = "f116f35b0b8ec99abf0e0cda7064eb3dfb6d16e8bc8767c116f91c256db9b859" dependencies = [ "bytemuck", "solana-pubkey", @@ -9444,9 +9518,9 @@ dependencies = [ [[package]] name = "solana-instruction" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aac2ccec24c601f939880ec3e9aa4824c689dafb8a3289987f3af6fdfb579f69" +checksum = "94ed5710c998efd09ffb596cf5e7266c11cd56e3a136c8a1f940e8525fd5be6e" dependencies = [ "bincode", "borsh 1.5.3", @@ -9462,9 +9536,9 @@ dependencies = [ [[package]] name = "solana-last-restart-slot" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdf7477c989eecc4b23f7f27ffd0e11492d3dd43c4ae5afcf24942e653def5de" +checksum = "bd5647af0980c796c942e33f1f7dbffca29b7747630b720e6975abb1d7c531f6" dependencies = [ "serde", "serde_derive", @@ -9474,24 +9548,24 @@ dependencies = [ [[package]] name = "solana-log-collector" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94415c115b9de46b906d797991986213639f86426fece3571c2b2dd992e79292" +checksum = "636132217fc00b32a72a3fff2dfdda5a377291edc788d3286a3fbf73caaf89cf" dependencies = [ "log", ] [[package]] name = "solana-measure" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc36b279e4825178c07940cb0a64feb5cb58f57b6215e1415c3c90c91409b384" +checksum = "2cc2470b663cde7fcd3dc644fdcb19181cf5d87ece8cab270e182ff33b48b357" [[package]] name = "solana-metrics" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b53cc12bfbc197ea85bc2c6fbd4f881ade20d09543c9d2666d9b25e996f685" +checksum = "dc3248d11553718544485736382dd9a8b619f42f39fba41b9211638d35414bbc" dependencies = [ "crossbeam-channel", "gethostname", @@ -9504,24 +9578,24 @@ dependencies = [ [[package]] name = "solana-msg" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9ceb28774c48fa2bf3493e96216f530c4fe555b378062eaff0c597213c93ec7" +checksum = "6d6a46fcbbaa38193b5b6aeec531395da8dac8dcd183ac6d80d94e6513fc4ad8" dependencies = [ "solana-define-syscall", ] [[package]] name = "solana-native-token" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed34b47a38511a53ea6aea47ebbcd0168971b095143b867d14f67a51392a2df5" +checksum = "0aa3c5006bbea99b810ad8fc6ae168fc83891b607a13a9aa6be39db71a700f87" [[package]] name = "solana-net-utils" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95933bfbb79f654da5a0bb181f5d735f64a657b6bc9716e6d253f47df34b0121" +checksum = "521d93b4023bfce59bff12f7821ab6803ddfdf8d6ead19e8bbdeaee84a609a18" dependencies = [ "bincode", "crossbeam-channel", @@ -9538,9 +9612,9 @@ dependencies = [ [[package]] name = "solana-packet" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "925a39e728e33a331a72737a1c90c1587951d7a5be8f9db6368ee73ea7a2c323" +checksum = "05fd58e2633824294a4eb1159e3f2cd9fed8d8c4d25fb4e3388f872c314e5ffd" dependencies = [ "bincode", "bitflags 2.6.0", @@ -9552,9 +9626,9 @@ dependencies = [ [[package]] name = "solana-perf" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70d302f5567ee9d3ffd369980f42484c81144e4a2a8f6b8dd100743bb49d54b3" +checksum = "adbb524303dd629a59dc08352da0d232f54172c5454948749966b370eac3ea2a" dependencies = [ "ahash 0.8.11", "bincode", @@ -9579,9 +9653,9 @@ dependencies = [ [[package]] name = "solana-precompile-error" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0e5c73f0253cd8a3c25efb2f1e509e631a3181a0f7376c61d00f6b954042579" +checksum = "e289d47a9c60b9636d86458e050eca1a74f7c932abeee3bca2a0c256b8c9814e" dependencies = [ "num-traits", "solana-decode-error", @@ -9589,9 +9663,9 @@ dependencies = [ [[package]] name = "solana-program" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8318fafc6f83d0a84b29ea5db73e03abb7e8f5b797f2e14ec28eb5f50a07ee07" +checksum = "8afc847b91b77c48113a55f7f492cc7e982e1778c6b954a05feb499f9b8c3cc4" dependencies = [ "base64 0.22.1", "bincode", @@ -9662,9 +9736,9 @@ dependencies = [ [[package]] name = "solana-program-entrypoint" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fa45480f3ea73930aae9bcf379f605565cd0288feba78dab73a33fa96c8255a" +checksum = "988a49fb8231e95861d11b40931f49e06f0dea5a29241acf7cbca644c52abd6b" dependencies = [ "solana-account-info", "solana-msg", @@ -9674,9 +9748,9 @@ dependencies = [ [[package]] name = "solana-program-error" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "037b650450ebe2c0079319303e68cfdadda9806d0268200f08e1680a1d2b0796" +checksum = "2473773ee9cebf6ba3d7d1fe911938bc2a3a694e85bea33fd7a99d397cde1202" dependencies = [ "borsh 1.5.3", "num-traits", @@ -9690,9 +9764,9 @@ dependencies = [ [[package]] name = "solana-program-memory" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4cab560df1cca31a480d49f0a7de1eaba77b4335b1d964b4ff3dd6c90bc919f" +checksum = "5d9e6ca90bbc3020b7b37091c05049f5de48e397545093ec303dc6eff3d4720c" dependencies = [ "num-traits", "solana-define-syscall", @@ -9700,24 +9774,24 @@ dependencies = [ [[package]] name = "solana-program-option" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7adea2c59db099fdb6aa12519f7158265c4e43dcbf3ada77421fdf8fc6a60ff1" +checksum = "6c2334c5f9adcc25c6390fbf87ac127adbfbd8943465726e5f389159677ceba2" [[package]] name = "solana-program-pack" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e59db3ffc2fe4d000ac4f2663f55f6e3c0b9e7a634a8e1ad2770cd37380b97" +checksum = "305475eef9404539cce0c561ab9997b875cc5509f7c553859cd059fdf93b0ab2" dependencies = [ "solana-program-error", ] [[package]] name = "solana-program-runtime" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12cafddf4520976bfb5462002d158a2edd68d171ac4af07e0639fa5c1cf0d6f3" +checksum = "05abf5a66475f23769700597129cce9f76cfaacb45babf83ffec3157da8c7ce4" dependencies = [ "base64 0.22.1", "bincode", @@ -9745,9 +9819,9 @@ dependencies = [ [[package]] name = "solana-pubkey" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75991d40b6717ad11d0357d435c494fbb2af46ffbffdec015d2abb2e5e8bd62" +checksum = "a954fba3af498201179981818b0ed61f95c32b4a3db5ea9cc042c971c84cdeae" dependencies = [ "borsh 0.10.4", "borsh 1.5.3", @@ -9772,15 +9846,15 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f027b8985a475f32d48d3121833b510d9fe629b0de53778ae24cb43af045d5d" +checksum = "28f6f2c554cec02f87eca3e2461e1923db157d2d615e919fc2b93807465cbe6a" dependencies = [ "crossbeam-channel", "futures-util", "log", "reqwest 0.11.27", - "semver 1.0.23", + "semver 1.0.24", "serde", "serde_derive", "serde_json", @@ -9797,9 +9871,9 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "925444d9129523f12b34a51a8855cd3ec8f4e807a3fe10dbe6012a4a4b8039d9" +checksum = "4c707a5c4aba604c06c0eeced102355229a7696ed4dc6a26c71bba5d74d86fc5" dependencies = [ "async-lock", "async-trait", @@ -9809,7 +9883,7 @@ dependencies = [ "log", "quinn", "quinn-proto", - "rustls 0.23.19", + "rustls 0.23.20", "solana-connection-cache", "solana-measure", "solana-metrics", @@ -9823,9 +9897,9 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fd35d0923065953174ee0daeb15c79496356ea18ca92c3ac719544f8828eb2a" +checksum = "6eeb2db0e5055cc45bbb9b6f8e4bc879b49dadf5734397a749c4b7da9193e71e" dependencies = [ "lazy_static", "num_cpus", @@ -9833,9 +9907,9 @@ dependencies = [ [[package]] name = "solana-rent" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef59feb19504816b3910a901ef3586eb50d6e6bf68707fbd6275faa393a07d54" +checksum = "4ebcc59bff8b3c773214545d038b718a3e2e63c920b8172f85725463029f7f00" dependencies = [ "serde", "serde_derive", @@ -9845,9 +9919,9 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "069e0e9c89316166fd82892bac7cb4ccb3c252b42966fa44c1d112f2501b25b7" +checksum = "c85883f214cff98a97432646ace94eea3cfe309b068841c0feae93d0a1e7b238" dependencies = [ "async-trait", "base64 0.22.1", @@ -9857,7 +9931,7 @@ dependencies = [ "log", "reqwest 0.11.27", "reqwest-middleware", - "semver 1.0.23", + "semver 1.0.24", "serde", "serde_derive", "serde_json", @@ -9872,9 +9946,9 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9da556eb0234c9b845df290f8adf78b651936bc6bfdfa2057d1958be60ae5f89" +checksum = "791168d04387734755d3a7e81f5228cb305041c09bf4fbfc0823c8380acdf3e7" dependencies = [ "anyhow", "base64 0.22.1", @@ -9882,7 +9956,7 @@ dependencies = [ "jsonrpc-core", "reqwest 0.11.27", "reqwest-middleware", - "semver 1.0.23", + "semver 1.0.24", "serde", "serde_derive", "serde_json", @@ -9896,9 +9970,9 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "379366d29add56b16e3c164789a6c0eb48175b2d6c4bb14ad9da0b4f88cea886" +checksum = "46e515480bef7a3476cee636a69aa237e2e8ba73f82ba95d6e307397144ce4fc" dependencies = [ "solana-rpc-client", "solana-sdk", @@ -9907,15 +9981,15 @@ dependencies = [ [[package]] name = "solana-sanitize" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2e1169636c290f2bc4d9fb3fc7ab137bf8646ec349212248fa6b96af7eb1807" +checksum = "d05ecd7ec442abf0561cbf06984484d6368e71a4882213bfa68b658b0f8d6a0e" [[package]] name = "solana-sdk" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49364109ac57076e4722a6ef9c3cc0fafb8327a2d29cf964350fc91604b2b745" +checksum = "216fa7d6ef4d741ec21e0054e78d86c5da0c2033f377b03de5eb65d264d8df13" dependencies = [ "bincode", "bitflags 2.6.0", @@ -9977,21 +10051,21 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "467496ce2b6ea87de69fa34c7dfd9a09197c50906fa5d35cd36025a3ba034e64" +checksum = "85df4723291cfec8ffe9dadc59d565afcae12ea9a6460b7b28c4da21c2c4a887" dependencies = [ "bs58 0.5.1", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] name = "solana-secp256k1-recover" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "548f2b996441f5dbbc3b60fc9d59f20614807c5eddb2936a686036837d9b5c4e" +checksum = "41c38fc7bc33f78af99c4848c9a924b2b6e5d33d96f269d108777d982de72f73" dependencies = [ "borsh 1.5.3", "libsecp256k1", @@ -10001,9 +10075,9 @@ dependencies = [ [[package]] name = "solana-secp256r1-program" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b71f9f41eef97932bbed8d4ed6b62df4643fd445a62996cbd4d5e0ac96ba6b9c" +checksum = "c5bbc17379248923203317b337ce871bbf1ba6c59f01c49dc65895ffdc684f0a" dependencies = [ "bytemuck", "openssl", @@ -10021,18 +10095,18 @@ checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" [[package]] name = "solana-serde-varint" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5022865cd3461837f6e8309fcaef816a2f6d46481aa6d307eb0689580fa3011" +checksum = "9e2fc696c10a2b02356584cbd45d83d42b01b10256cb36b5d0c3768e5adf9283" dependencies = [ "serde", ] [[package]] name = "solana-serialize-utils" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aba668bcfbaa1deccef081f5174c1c7f4442c455f934ac0334f10b881550990" +checksum = "2b04c6fb71e4cdd10480bc8d306aca6d2a7494e6267e4f103085a89b2ec04e4c" dependencies = [ "solana-instruction", "solana-pubkey", @@ -10041,9 +10115,9 @@ dependencies = [ [[package]] name = "solana-sha256-hasher" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cee22aa72b8e5a58674d6b933ab8099915483a9f0fd5d0363540b32b200c7c6" +checksum = "cb4c977c6c4d95c8b43a9f405844f29a73c9d8b0a7c561b91d4f6a44f290d35c" dependencies = [ "sha2 0.10.8", "solana-define-syscall", @@ -10052,18 +10126,18 @@ dependencies = [ [[package]] name = "solana-short-vec" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13773ca0f4bdf868440cd2dc389c4a02ce1ae3fafe062bf274bf4131bbf36a55" +checksum = "2ca5799b37642e4e273d7d848564739eab45df670edcc61b4696ef0d5ebe4a8c" dependencies = [ "serde", ] [[package]] name = "solana-signature" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "761eaf5d57cdceaf1e40bb1f1206ed40d713808bb536a29eab755edba24d8251" +checksum = "d28fe70f88bffb651a6ff8c37c236b935e97589865ca32e4a4544cdd10c7b268" dependencies = [ "bs58 0.5.1", "ed25519-dalek 1.0.1", @@ -10076,9 +10150,9 @@ dependencies = [ [[package]] name = "solana-slot-hashes" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9c3c34cf7bf90511c914cbe34c6f1815812bcc0116c2f5dd39f597c1921ceb" +checksum = "7e596d3719b4c03987de87c8cc25b34b6afcf7464c82b4d9c9b114304d882c97" dependencies = [ "serde", "serde_derive", @@ -10088,9 +10162,9 @@ dependencies = [ [[package]] name = "solana-slot-history" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b23b5c0aed6181f3acd1906a73ad6e7f50f13774c3cce5714f52d142f42d6a8" +checksum = "4022b0e8a7f043bd61504fff79176c02b52f69a69299023884b194a1405c0f05" dependencies = [ "bv", "serde", @@ -10100,9 +10174,9 @@ dependencies = [ [[package]] name = "solana-stable-layout" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba0c6df67ce1caf21048320a79008aa56c514c6d940464af190bd02508e06888" +checksum = "e82f0665dfcfcb4433708abff54db5ee105fe1bb8db7fd409074bd0275582105" dependencies = [ "solana-instruction", "solana-pubkey", @@ -10110,9 +10184,9 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156321c6a80a28376a4b8cfe450cc3cb9ff3ef6031c869c66730c5d1c7a5b39" +checksum = "3173f4634b4e0acc366dec277744af50ffbf661dfe41291adf1406841a1b9c96" dependencies = [ "async-channel", "bytes", @@ -10132,7 +10206,7 @@ dependencies = [ "quinn", "quinn-proto", "rand 0.8.5", - "rustls 0.23.19", + "rustls 0.23.20", "smallvec", "socket2", "solana-measure", @@ -10148,18 +10222,18 @@ dependencies = [ [[package]] name = "solana-sysvar-id" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c14a73d5d544353f640fc0aef023939a5fed91a51b615286227d06d8074eaca7" +checksum = "6bbed7acdd711e0d620c9b7f788d041d35731c2c675d1d687498745d73826ca4" dependencies = [ "solana-pubkey", ] [[package]] name = "solana-thin-client" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0282df26de64893ff1747f6aebbc4cf9e1a48fdc3f9c2f5abb2678689e5f018d" +checksum = "9facb2fbf83b8a3acb1cb4523bffa3db7be838faf2cfda374f0d99120917d870" dependencies = [ "bincode", "log", @@ -10172,9 +10246,9 @@ dependencies = [ [[package]] name = "solana-timings" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b0e7496f3c01ea411307c737c4fc1e1cce0702ef25c8214fc0eb19e555bb714" +checksum = "c6a83fbf8377e65d4c8e6a3c3c877c944a530ca9003f94389fd1528213c7c001" dependencies = [ "eager", "enum-iterator", @@ -10183,9 +10257,9 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9edcd8cefc03f0fada182c669e2d5fb274769e409af573a53a9be2367d5b661" +checksum = "31cb5c39698855b236b6266025b2f31b1948ee370cd53a5cca6c7c62eea3104d" dependencies = [ "async-trait", "bincode", @@ -10206,9 +10280,9 @@ dependencies = [ [[package]] name = "solana-transaction-error" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "941819f2d9a9c747417417ce7e569de5093809726667ea81ceec3a002a9de5b7" +checksum = "ae45f064c8e6006a426b31a1182123ec4daf8cca50bd7aea6e796e6205a7911e" dependencies = [ "serde", "serde_derive", @@ -10218,9 +10292,9 @@ dependencies = [ [[package]] name = "solana-transaction-metrics-tracker" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e9a0b73abafab9e43a2edf7f87d9fb9c278675aa971dfaecb8f013ee9954041" +checksum = "cb406ed0db097a5d2067c3c737bec3f515ea70a2cfa5abec8fc0606098049e42" dependencies = [ "base64 0.22.1", "bincode", @@ -10232,11 +10306,39 @@ dependencies = [ "solana-short-vec", ] +[[package]] +name = "solana-transaction-status" +version = "2.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "254b3f1295b8654604d1f1b2980a4ec81621c071cc7bcbb8b3e6eb44ce98e8b1" +dependencies = [ + "Inflector", + "base64 0.22.1", + "bincode", + "borsh 1.5.3", + "bs58 0.5.1", + "lazy_static", + "log", + "serde", + "serde_derive", + "serde_json", + "solana-account-decoder", + "solana-sdk", + "solana-transaction-status-client-types", + "spl-associated-token-account 4.0.0", + "spl-memo 5.0.0", + "spl-token 6.0.0", + "spl-token-2022 4.0.0", + "spl-token-group-interface 0.3.0", + "spl-token-metadata-interface 0.4.0", + "thiserror 1.0.69", +] + [[package]] name = "solana-transaction-status-client-types" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0991234ba1e3dd61e64621f15ea203286df4f531cc878c96bb16e75ee465627" +checksum = "3a853cb1b1d5d1b521a51ae4666668f321505f0280839b00337d2620a9aba641" dependencies = [ "base64 0.22.1", "bincode", @@ -10252,9 +10354,9 @@ dependencies = [ [[package]] name = "solana-type-overrides" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ab02e327455bc5d1e7112c1ae2605e018088499b0ca8104a452d15d5bf5a7e7" +checksum = "4347abe10a8290cb6b135b1e40115e4d390d29588fb5ba598be891a98d09e10d" dependencies = [ "lazy_static", "rand 0.8.5", @@ -10262,9 +10364,9 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e96db922848a8af5118be6450b9578e96901bc2d9766c95e546ebf77d7b7060a" +checksum = "2b3064f000984b1f1032b3686577e452c423cbe3f8208efc713c16408f3a4086" dependencies = [ "async-trait", "solana-connection-cache", @@ -10277,11 +10379,11 @@ dependencies = [ [[package]] name = "solana-version" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78f02c941987e7c6cdc66c344e178d8f20060343bfc19b9036d4f1ac4bcb00ba" +checksum = "85b16c635fe2ccc3287bd5f84c6c86fbf316510df4229506d0bd9af50f2f1780" dependencies = [ - "semver 1.0.23", + "semver 1.0.24", "serde", "serde_derive", "solana-feature-set", @@ -10291,9 +10393,9 @@ dependencies = [ [[package]] name = "solana-vote" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c8cfc69cb402926b1caac547b66c79526e5cc1a24bb471cff6c3635cc7b4087" +checksum = "228c93777a3ad6dc60abe422c558e8476ed0de4fe2b8784dfacb07951ca38355" dependencies = [ "itertools 0.12.1", "log", @@ -10305,9 +10407,9 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcd7208621ca973dca21cdb531ce16e5bb51249a9aac64abe08664944058ce68" +checksum = "94b556c4d1e742e8ab829bfa33b01cc22b823e7f42351e7ba24e4b2e26c3138f" dependencies = [ "bincode", "log", @@ -10325,9 +10427,9 @@ dependencies = [ [[package]] name = "solana-zk-sdk" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1745e79296b52100d86a6c0b6413e93a81df0dd8e7612f14018e645597af95ab" +checksum = "bea58ce4bcac4c6f3577ffc753b8bff3d259169bde1827b4466acb5daae088d2" dependencies = [ "aes-gcm-siv", "base64 0.22.1", @@ -10357,9 +10459,9 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91c3da9372371eef8b32341b639c5861904875dd70518bb3fe882f104dc94912" +checksum = "f4340e5b7e4c3aa1d41ee638ab7d13eb1bcfc32d59c275a9f41838f059728aa6" dependencies = [ "aes-gcm-siv", "base64 0.22.1", @@ -10460,6 +10562,22 @@ dependencies = [ "der 0.7.9", ] +[[package]] +name = "spl-associated-token-account" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68034596cf4804880d265f834af1ff2f821ad5293e41fa0f8f59086c181fc38e" +dependencies = [ + "assert_matches", + "borsh 1.5.3", + "num-derive 0.4.2", + "num-traits", + "solana-program", + "spl-token 6.0.0", + "spl-token-2022 4.0.0", + "thiserror 1.0.69", +] + [[package]] name = "spl-associated-token-account" version = "6.0.0" @@ -10499,9 +10617,9 @@ dependencies = [ [[package]] name = "spl-discriminator" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a20542d4c8264856d205c0090512f374dbf7b3124479a3d93ab6184ae3631aa" +checksum = "a7398da23554a31660f17718164e31d31900956054f54f52d5ec1be51cb4f4b3" dependencies = [ "bytemuck", "solana-program-error", @@ -10517,7 +10635,7 @@ checksum = "d9e8418ea6269dcfb01c712f0444d2c75542c04448b480e87de59d2865edc750" dependencies = [ "quote", "spl-discriminator-syn", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -10529,7 +10647,7 @@ dependencies = [ "proc-macro2", "quote", "sha2 0.10.8", - "syn 2.0.90", + "syn 2.0.91", "thiserror 1.0.69", ] @@ -10638,7 +10756,7 @@ dependencies = [ "proc-macro2", "quote", "sha2 0.10.8", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -10670,7 +10788,7 @@ dependencies = [ "solana-msg", "solana-program-error", "solana-pubkey", - "spl-discriminator 0.4.0", + "spl-discriminator 0.4.1", "spl-pod 0.5.0", "spl-program-error 0.6.0", "spl-type-length-value 0.7.0", @@ -10823,7 +10941,7 @@ dependencies = [ "solana-msg", "solana-program-error", "solana-pubkey", - "spl-discriminator 0.4.0", + "spl-discriminator 0.4.1", "spl-pod 0.5.0", "thiserror 1.0.69", ] @@ -10857,7 +10975,7 @@ dependencies = [ "solana-msg", "solana-program-error", "solana-pubkey", - "spl-discriminator 0.4.0", + "spl-discriminator 0.4.1", "spl-pod 0.5.0", "spl-type-length-value 0.7.0", "thiserror 1.0.69", @@ -10896,7 +11014,7 @@ dependencies = [ "solana-msg", "solana-program-error", "solana-pubkey", - "spl-discriminator 0.4.0", + "spl-discriminator 0.4.1", "spl-pod 0.5.0", "spl-program-error 0.6.0", "spl-tlv-account-resolution 0.9.0", @@ -10930,7 +11048,7 @@ dependencies = [ "solana-decode-error", "solana-msg", "solana-program-error", - "spl-discriminator 0.4.0", + "spl-discriminator 0.4.1", "spl-pod 0.5.0", "thiserror 1.0.69", ] @@ -11019,7 +11137,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -11039,7 +11157,7 @@ dependencies = [ "hex", "once_cell", "reqwest 0.11.27", - "semver 1.0.23", + "semver 1.0.24", "serde", "serde_json", "sha2 0.10.8", @@ -11061,9 +11179,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.90" +version = "2.0.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" +checksum = "d53cbcb5a243bd33b7858b1d7f4aca2153490815872d86d955d6ea29f743c035" dependencies = [ "proc-macro2", "quote", @@ -11072,14 +11190,14 @@ dependencies = [ [[package]] name = "syn-solidity" -version = "0.8.14" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0523f59468a2696391f2a772edc089342aacd53c3caa2ac3264e598edf119b" +checksum = "219389c1ebe89f8333df8bdfb871f6631c552ff399c23cac02480b6088aad8f0" dependencies = [ "paste", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -11117,7 +11235,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -11233,11 +11351,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.4" +version = "2.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f49a1853cf82743e3b7950f77e0f4d622ca36cf4317cba00c767838bac8d490" +checksum = "f072643fd0190df67a8bab670c20ef5d8737177d6ac6b2e9a236cb096206b2cc" dependencies = [ - "thiserror-impl 2.0.4", + "thiserror-impl 2.0.9", ] [[package]] @@ -11248,18 +11366,18 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] name = "thiserror-impl" -version = "2.0.4" +version = "2.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8381894bb3efe0c4acac3ded651301ceee58a15d47c2e34885ed1908ad667061" +checksum = "7b50fa271071aae2e6ee85f842e2e28ba8cd2c5fb67f11fcb1fd70b276f9e7d4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -11333,9 +11451,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" dependencies = [ "tinyvec_macros", ] @@ -11382,7 +11500,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -11411,15 +11529,15 @@ version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" dependencies = [ - "rustls 0.23.19", + "rustls 0.23.20", "tokio", ] [[package]] name = "tokio-stream" -version = "0.1.16" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f4e6ce100d0eb49a2734f8c0812bcd324cf357d21810932c5df6b96ef2b86f1" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" dependencies = [ "futures-core", "pin-project-lite", @@ -11450,7 +11568,7 @@ checksum = "edc5f74e248dc973e0dbb7b74c7e0d6fcc301c694ff50049504004ef4d0cdcd9" dependencies = [ "futures-util", "log", - "rustls 0.23.19", + "rustls 0.23.20", "rustls-pki-types", "tokio", "tokio-rustls 0.26.1", @@ -11543,7 +11661,7 @@ dependencies = [ "h2 0.3.26", "http 0.2.12", "http-body 0.4.6", - "hyper 0.14.31", + "hyper 0.14.32", "hyper-timeout", "percent-encoding", "pin-project", @@ -11593,14 +11711,14 @@ dependencies = [ [[package]] name = "tower" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2873938d487c3cfb9aed7546dc9f2711d867c9f90c46b889989a2cb84eba6b4f" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" dependencies = [ "futures-core", "futures-util", "pin-project-lite", - "sync_wrapper 0.1.2", + "sync_wrapper 1.0.2", "tower-layer", "tower-service", ] @@ -11649,7 +11767,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -11766,7 +11884,7 @@ dependencies = [ "httparse", "log", "rand 0.8.5", - "rustls 0.23.19", + "rustls 0.23.20", "rustls-pki-types", "sha1", "thiserror 1.0.69", @@ -11833,12 +11951,6 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" -[[package]] -name = "unicode-width" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" - [[package]] name = "unicode-width" version = "0.2.0" @@ -12027,9 +12139,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.97" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d15e63b4482863c109d70a7b8706c1e364eb6ea449b201a76c5b89cedcec2d5c" +checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" dependencies = [ "cfg-if 1.0.0", "once_cell", @@ -12038,24 +12150,23 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.97" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d36ef12e3aaca16ddd3f67922bc63e48e953f126de60bd33ccc0101ef9998cd" +checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.47" +version = "0.4.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dfaf8f50e5f293737ee323940c7d8b08a66a95a419223d9f41610ca08b0833d" +checksum = "38176d9b44ea84e9184eff0bc34cc167ed044f816accfe5922e54d84cf48eca2" dependencies = [ "cfg-if 1.0.0", "js-sys", @@ -12066,9 +12177,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.97" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "705440e08b42d3e4b36de7d66c944be628d579796b8090bfa3471478a2260051" +checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -12076,22 +12187,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.97" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98c9ae5a76e46f4deecd0f0255cc223cfa18dc9b261213b8aa0c7b36f61b3f1d" +checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.97" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ee99da9c5ba11bd675621338ef6fa52296b76b83305e9b6e5c77d4c286d6d49" +checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" [[package]] name = "wasm-encoder" @@ -12318,7 +12429,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e06c0641a4add879ba71ccb3a1e4278fd546f76f1eafb21d8f7b07733b547cd5" dependencies = [ "indexmap 2.7.0", - "semver 1.0.23", + "semver 1.0.24", ] [[package]] @@ -12527,7 +12638,7 @@ checksum = "09b5575a75e711ca6c36bb9ad647c93541cdc8e34218031acba5da3f35919dd3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -12552,9 +12663,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.74" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a98bc3c33f0fe7e59ad7cd041b89034fa82a7c2d4365ca538dda6cdaf513863c" +checksum = "04dd7223427d52553d3702c004d3b2fe07c148165faa56313cb00211e31c12bc" dependencies = [ "js-sys", "wasm-bindgen", @@ -12867,7 +12978,7 @@ dependencies = [ [[package]] name = "wormhole-bridge-client" version = "0.1.0" -source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs?branch=refactor%2Fconnectors#2585f2e681cd2f0513f663227ff2ca10c6eefd5f" +source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs?branch=refactor%2Fsolana-bridge-client#dc416510fc760d22fdf047ac42d68d75da63b0e6" dependencies = [ "bridge-connector-common", "derive_builder 0.20.2", @@ -12968,7 +13079,7 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", "synstructure 0.13.1", ] @@ -12990,7 +13101,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -13010,7 +13121,7 @@ checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", "synstructure 0.13.1", ] @@ -13031,7 +13142,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -13066,7 +13177,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] diff --git a/omni-relayer/Cargo.toml b/omni-relayer/Cargo.toml index ba246718..b5f2ca02 100644 --- a/omni-relayer/Cargo.toml +++ b/omni-relayer/Cargo.toml @@ -2,6 +2,7 @@ name = "omni-relayer" version = "0.1.0" edition = "2021" +resolver = "2" [dependencies] log = "0.4" @@ -21,6 +22,10 @@ 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" + ethereum-types = "0.14.1" omni-types = { git = "https://github.com/near-one/omni-bridge", package = "omni-types", rev = "11ffdb63706ceba175f7581585bd837aad9f1559" } @@ -32,16 +37,16 @@ near-crypto = "0.26.0" hex = "0.4.3" secp256k1 = "0.30.0" -alloy = { version = "0.6.4", features = ["node-bindings", "providers", "rpc-types", "sol-types", "provider-ws", "signers", "signer-local"] } +alloy = { version = "0.8.3", features = ["node-bindings", "providers", "rpc-types", "sol-types", "provider-ws", "signers", "signer-local"] } redis = { version = "0.27.0", features = ["aio", "tokio-comp"] } reqwest = "0.12" -eth-proof = { git = "https://github.com/Near-One/rainbow-bridge-sdk-rs", package = "eth-proof", branch = "refactor/connectors" } +eth-proof = { git = "https://github.com/Near-One/rainbow-bridge-sdk-rs", package = "eth-proof", branch = "refactor/solana-bridge-client" } -near-bridge-client = { git = "https://github.com/Near-One/rainbow-bridge-sdk-rs", package = "near-bridge-client", branch = "refactor/connectors" } -evm-bridge-client = { git = "https://github.com/Near-One/rainbow-bridge-sdk-rs", package = "evm-bridge-client", branch = "refactor/connectors" } -solana-bridge-client = { git = "https://github.com/Near-One/rainbow-bridge-sdk-rs", package = "solana-bridge-client", branch = "refactor/connectors" } -wormhole-bridge-client = { git = "https://github.com/Near-One/rainbow-bridge-sdk-rs", package = "wormhole-bridge-client", branch = "refactor/connectors" } +near-bridge-client = { git = "https://github.com/Near-One/rainbow-bridge-sdk-rs", package = "near-bridge-client", branch = "refactor/solana-bridge-client" } +evm-bridge-client = { git = "https://github.com/Near-One/rainbow-bridge-sdk-rs", package = "evm-bridge-client", branch = "refactor/solana-bridge-client"} +solana-bridge-client = { git = "https://github.com/Near-One/rainbow-bridge-sdk-rs", package = "solana-bridge-client", branch = "refactor/solana-bridge-client" } +wormhole-bridge-client = { git = "https://github.com/Near-One/rainbow-bridge-sdk-rs", package = "wormhole-bridge-client", branch = "refactor/solana-bridge-client" } -omni-connector = { git = "https://github.com/Near-One/rainbow-bridge-sdk-rs", package = "omni-connector", branch = "refactor/connectors" } +omni-connector = { git = "https://github.com/Near-One/rainbow-bridge-sdk-rs", package = "omni-connector", branch = "refactor/solana-bridge-client" } diff --git a/omni-relayer/example-config.toml b/omni-relayer/example-config.toml index 0d4b94b2..4e500a8f 100644 --- a/omni-relayer/example-config.toml +++ b/omni-relayer/example-config.toml @@ -10,7 +10,7 @@ token_locker_id = "omni-locker.testnet" rpc_http_url = "https://sepolia.infura.io/v3/API_KEY" rpc_ws_url = "wss://sepolia.infura.io/ws/v3/API_KEY" chain_id = 11_155_111 -bridge_token_factory_address = "0x9Bb4BEC352c456183852AfB9b6C4098E20009928" +bridge_token_factory_address = "0x3701B9859Dbb9a4333A3dd933ab18e9011ddf2C8" light_client = "client-eth2.sepolia.testnet" block_processing_batch_size = 10_000 @@ -18,19 +18,38 @@ block_processing_batch_size = 10_000 rpc_http_url = "https://base-sepolia.infura.io/v3/API_KEY" rpc_ws_url = "wss://base-sepolia.infura.io/ws/v3/API_KEY" chain_id = 84_532 -bridge_token_factory_address = "0xd565f7CcE0FA1bB8DBe73FCDA281390d545f6200" +bridge_token_factory_address = "0x0C981337fFe39a555d3A40dbb32f21aD0eF33FFA" block_processing_batch_size = 10_000 [arb] rpc_http_url = "https://arbitrum-sepolia.infura.io/v3/API_KEY" rpc_ws_url = "wss://arbitrum-sepolia.infura.io/ws/v3/API_KEY" chain_id = 421_614 -bridge_token_factory_address = "0xd565f7CcE0FA1bB8DBe73FCDA281390d545f6200" +bridge_token_factory_address = "0xd025b38762B4A4E36F0Cde483b86CB13ea00D989" block_processing_batch_size = 10_000 +[solana] +rpc_http_url = "https://api.devnet.solana.com" +rpc_ws_url = "wss://api.devnet.solana.com" +# Program ID on Solana is an account ID whitch the bridge contract (basically bridge_token_factory_address on Solana) +program_id = "Gy1XPwYZURfBzHiGAxnw3SYC33SfqsEpGSS5zeBge28p" +# This is the wormhole contract ID on Solana (can be found here https://wormhole.com/docs/build/reference/contract-addresses/#__tabbed_1_2) +wormhole_id = "3u8hJUVTA4jH1wYAyUur7FFZVQ8H635K3tSHHF4ssjQ5" +# There's a list of account keys and they are store in a strict order. We need indexes to get the right key +init_transfer_token_index = 6 +init_transfer_emitter_index = 15 +init_transfer_sol_emitter_index = 11 +# Discriminators are used to identify the type of the event (can be found during the building process of solana's contract) +init_transfer_discriminator = [174, 50, 134, 99, 122, 243, 243, 224] +init_transfer_sol_discriminator = [124, 167, 164, 191, 81, 140, 108, 30] +finalize_transfer_emitter_index = 9 +finalize_transfer_sol_emitter_index = 8 +finalize_transfer_discriminator = [124, 126, 103, 188, 144, 65, 135, 51] +finalize_transfer_sol_discriminator = [104, 27, 121, 69, 3, 70, 217, 66] + [wormhole] api_url = "https://api.testnet.wormholescan.io/" -sol_chain_id = 1 +solana_chain_id = 1 near_chain_id = 15 eth_chain_id = 10_002 arb_chain_id = 10_003 diff --git a/omni-relayer/src/config.rs b/omni-relayer/src/config.rs index ff8b145c..58f1e130 100644 --- a/omni-relayer/src/config.rs +++ b/omni-relayer/src/config.rs @@ -2,12 +2,13 @@ use alloy::primitives::Address; use near_primitives::types::AccountId; use omni_types::ChainKind; -pub fn get_evm_private_key(chain_kind: ChainKind) -> String { +pub fn get_private_key(chain_kind: ChainKind) -> String { let env_var = match chain_kind { + ChainKind::Near => "NEAR_PRIVATE_KEY", ChainKind::Eth => "ETH_PRIVATE_KEY", ChainKind::Base => "BASE_PRIVATE_KEY", ChainKind::Arb => "ARB_PRIVATE_KEY", - _ => unreachable!("Unsupported chain kind"), + ChainKind::Sol => "SOLANA_PRIVATE_KEY", }; std::env::var(env_var).unwrap_or_else(|_| panic!("Failed to get `{env_var}` env variable")) @@ -20,6 +21,7 @@ pub struct Config { pub eth: Option, pub base: Option, pub arb: Option, + pub solana: Option, pub wormhole: Wormhole, } @@ -53,10 +55,28 @@ pub struct Evm { pub block_processing_batch_size: u64, } +#[derive(Debug, Clone, serde::Deserialize)] +pub struct Solana { + pub rpc_http_url: String, + pub rpc_ws_url: String, + pub program_id: String, + pub wormhole_id: String, + pub init_transfer_token_index: usize, + pub init_transfer_emitter_index: usize, + pub init_transfer_sol_emitter_index: usize, + pub init_transfer_discriminator: Vec, + pub init_transfer_sol_discriminator: Vec, + pub finalize_transfer_emitter_index: usize, + pub finalize_transfer_sol_emitter_index: usize, + pub finalize_transfer_discriminator: Vec, + pub finalize_transfer_sol_discriminator: Vec, +} + #[derive(Debug, Clone, serde::Deserialize)] pub struct Wormhole { pub api_url: String, pub eth_chain_id: u64, pub base_chain_id: u64, pub arb_chain_id: u64, + pub solana_chain_id: u64, } diff --git a/omni-relayer/src/main.rs b/omni-relayer/src/main.rs index fa843208..7c75f365 100644 --- a/omni-relayer/src/main.rs +++ b/omni-relayer/src/main.rs @@ -19,8 +19,8 @@ struct CliArgs { #[tokio::main] async fn main() -> Result<()> { - pretty_env_logger::init(); dotenv::dotenv().ok(); + pretty_env_logger::init(); let args = CliArgs::parse(); @@ -40,38 +40,21 @@ async fn main() -> Result<()> { handles.push(tokio::spawn({ let config = config.clone(); let redis_client = redis_client.clone(); - let connector = connector.clone(); - async move { workers::near::sign_transfer(config, redis_client, connector).await } - })); - handles.push(tokio::spawn({ - let redis_client = redis_client.clone(); - let connector = connector.clone(); - async move { workers::near::finalize_transfer(redis_client, connector).await } + let jsonrpc_client = jsonrpc_client.clone(); + async move { startup::near::start_indexer(config, redis_client, jsonrpc_client).await } })); handles.push(tokio::spawn({ let config = config.clone(); let redis_client = redis_client.clone(); let connector = connector.clone(); - let jsonrpc_client = jsonrpc_client.clone(); - async move { workers::near::claim_fee(config, redis_client, connector, jsonrpc_client).await } + async move { workers::near::sign_transfer(config, redis_client, connector).await } })); - handles.push(tokio::spawn({ - let config = config.clone(); let redis_client = redis_client.clone(); let connector = connector.clone(); - let jsonrpc_client = jsonrpc_client.clone(); - async move { - workers::evm::finalize_transfer(config, redis_client, connector, jsonrpc_client).await - } + async move { workers::near::finalize_transfer(redis_client, connector).await } })); - handles.push(tokio::spawn({ - let config = config.clone(); - let redis_client = redis_client.clone(); - let jsonrpc_client = jsonrpc_client.clone(); - async move { startup::near::start_indexer(config, redis_client, jsonrpc_client).await } - })); if config.eth.is_some() { handles.push(tokio::spawn({ let config = config.clone(); @@ -93,6 +76,45 @@ async fn main() -> Result<()> { async move { startup::evm::start_indexer(config, redis_client, ChainKind::Arb).await } })); } + if config.solana.is_some() { + handles.push(tokio::spawn({ + let config = config.clone(); + let redis_client = redis_client.clone(); + async move { startup::solana::start_indexer(config, redis_client).await } + })); + handles.push(tokio::spawn({ + let config = config.clone(); + let redis_client = redis_client.clone(); + async move { workers::solana::process_signature(config, redis_client).await } + })); + handles.push(tokio::spawn({ + let config = config.clone(); + let redis_client = redis_client.clone(); + let connector = connector.clone(); + async move { workers::solana::finalize_transfer(config, redis_client, connector).await } + })); + } + + if config.eth.is_some() || config.base.is_some() || config.arb.is_some() { + handles.push(tokio::spawn({ + let config = config.clone(); + let redis_client = redis_client.clone(); + let connector = connector.clone(); + let jsonrpc_client = jsonrpc_client.clone(); + async move { + workers::evm::finalize_transfer(config, redis_client, connector, jsonrpc_client) + .await + } + })); + } + + handles.push(tokio::spawn({ + let config = config.clone(); + let redis_client = redis_client.clone(); + let connector = connector.clone(); + let jsonrpc_client = jsonrpc_client.clone(); + async move { workers::near::claim_fee(config, redis_client, connector, jsonrpc_client).await } + })); tokio::select! { _ = tokio::signal::ctrl_c() => { diff --git a/omni-relayer/src/startup/evm.rs b/omni-relayer/src/startup/evm.rs index e27c836c..220daaac 100644 --- a/omni-relayer/src/startup/evm.rs +++ b/omni-relayer/src/startup/evm.rs @@ -21,71 +21,61 @@ pub async fn start_indexer( ) -> Result<()> { let mut redis_connection = redis_client.get_multiplexed_tokio_connection().await?; - let ( - rpc_http_url, - rpc_ws_url, - bridge_token_factory_address, - last_processed_block_key, - block_processing_batch_size, - ) = match chain_kind { - ChainKind::Eth => { - let Some(ref eth) = config.eth else { - anyhow::bail!("Failed to get ETH config"); - }; - ( - eth.rpc_http_url.clone(), - eth.rpc_ws_url.clone(), - eth.bridge_token_factory_address, - utils::redis::ETH_LAST_PROCESSED_BLOCK, - eth.block_processing_batch_size, - ) - } - ChainKind::Base => { - let Some(ref base) = config.base else { - anyhow::bail!("Failed to get Base config"); - }; - ( - base.rpc_http_url.clone(), - base.rpc_ws_url.clone(), - base.bridge_token_factory_address, - utils::redis::BASE_LAST_PROCESSED_BLOCK, - base.block_processing_batch_size, - ) - } - ChainKind::Arb => { - let Some(ref arb) = config.arb else { - anyhow::bail!("Failed to get Arb config"); - }; - ( - arb.rpc_http_url.clone(), - arb.rpc_ws_url.clone(), - arb.bridge_token_factory_address, - utils::redis::ARB_LAST_PROCESSED_BLOCK, - arb.block_processing_batch_size, - ) - } - _ => anyhow::bail!("Unsupported chain kind: {:?}", chain_kind), - }; - - let http_provider = ProviderBuilder::new().on_http( - rpc_http_url - .parse() - .context("Failed to parse ETH rpc provider as url")?, - ); + let (rpc_http_url, rpc_ws_url, bridge_token_factory_address, block_processing_batch_size) = + match chain_kind { + ChainKind::Eth => { + let Some(ref eth) = config.eth else { + anyhow::bail!("Failed to get ETH config"); + }; + ( + eth.rpc_http_url.clone(), + eth.rpc_ws_url.clone(), + eth.bridge_token_factory_address, + eth.block_processing_batch_size, + ) + } + ChainKind::Base => { + let Some(ref base) = config.base else { + anyhow::bail!("Failed to get Base config"); + }; + ( + base.rpc_http_url.clone(), + base.rpc_ws_url.clone(), + base.bridge_token_factory_address, + base.block_processing_batch_size, + ) + } + ChainKind::Arb => { + let Some(ref arb) = config.arb else { + anyhow::bail!("Failed to get Arb config"); + }; + ( + arb.rpc_http_url.clone(), + arb.rpc_ws_url.clone(), + arb.bridge_token_factory_address, + arb.block_processing_batch_size, + ) + } + _ => anyhow::bail!("Unsupported chain kind: {:?}", chain_kind), + }; + + let http_provider = ProviderBuilder::new().on_http(rpc_http_url.parse().context(format!( + "Failed to parse {:?} rpc provider as url", + chain_kind + ))?); let ws_provider = ProviderBuilder::new() .on_ws(WsConnect::new(rpc_ws_url)) .await - .context("Failed to initialize ETH WS provider")?; + .context(format!("Failed to initialize {:?} WS provider", chain_kind))?; + let last_processed_block_key = utils::redis::get_last_processed_key(chain_kind).await; let latest_block = http_provider.get_block_number().await?; let from_block = - utils::redis::get_last_processed_block(&mut redis_connection, last_processed_block_key) + utils::redis::get_last_processed(&mut redis_connection, &last_processed_block_key) .await - .map_or_else( - || latest_block.saturating_sub(block_processing_batch_size), - |block| block, - ); + .unwrap_or(latest_block) + + 1; let filter = Filter::new() .address(bridge_token_factory_address) @@ -112,11 +102,14 @@ pub async fn start_indexer( } } - info!("All historical logs processed, starting ETH WS subscription"); + info!( + "All historical logs processed, starting {:?} WS subscription", + chain_kind + ); let mut stream = ws_provider.subscribe_logs(&filter).await?.into_stream(); while let Some(log) = stream.next().await { - process_log(ChainKind::Eth, &mut redis_connection, &http_provider, log).await; + process_log(chain_kind, &mut redis_connection, &http_provider, log).await; } Ok(()) @@ -154,7 +147,7 @@ async fn process_log( chain_kind, block_number, log, - tx_logs, + tx_logs: tx_logs.map(Box::new), creation_timestamp: chrono::Utc::now().timestamp(), last_update_timestamp: None, }, @@ -165,19 +158,19 @@ async fn process_log( redis_connection, utils::redis::FINALIZED_TRANSFERS, tx_hash.to_string(), - FinTransfer { + FinTransfer::Evm { chain_kind, block_number, log, - tx_logs, + tx_logs: tx_logs.map(Box::new), }, ) .await; } - utils::redis::update_last_processed_block( + utils::redis::update_last_processed( redis_connection, - utils::redis::ETH_LAST_PROCESSED_BLOCK, + &utils::redis::get_last_processed_key(chain_kind).await, block_number, ) .await; diff --git a/omni-relayer/src/startup/mod.rs b/omni-relayer/src/startup/mod.rs index 6b2fd010..81f9fab3 100644 --- a/omni-relayer/src/startup/mod.rs +++ b/omni-relayer/src/startup/mod.rs @@ -7,12 +7,16 @@ use evm_bridge_client::{EvmBridgeClient, EvmBridgeClientBuilder}; use near_bridge_client::NearBridgeClientBuilder; use omni_connector::{OmniConnector, OmniConnectorBuilder}; use omni_types::ChainKind; +use solana_bridge_client::SolanaBridgeClientBuilder; +use solana_client::nonblocking::rpc_client::RpcClient; +use solana_sdk::{bs58, signature::Keypair}; use wormhole_bridge_client::WormholeBridgeClientBuilder; use crate::config; pub mod evm; pub mod near; +pub mod solana; fn build_evm_bridge_client( config: &config::Config, @@ -30,7 +34,7 @@ fn build_evm_bridge_client( EvmBridgeClientBuilder::default() .endpoint(Some(evm.rpc_http_url.clone())) .chain_id(Some(evm.chain_id)) - .private_key(Some(crate::config::get_evm_private_key(chain_kind))) + .private_key(Some(crate::config::get_private_key(chain_kind))) .bridge_token_factory_address(Some(evm.bridge_token_factory_address.to_string())) .build() .context(format!( @@ -59,6 +63,24 @@ pub fn build_omni_connector( let base_bridge_client = build_evm_bridge_client(config, ChainKind::Base)?; let arb_bridge_client = build_evm_bridge_client(config, ChainKind::Arb)?; + let solana_bridge_client = config + .solana + .as_ref() + .map(|solana| { + SolanaBridgeClientBuilder::default() + .client(Some(RpcClient::new(solana.rpc_http_url.clone()))) + .program_id(Some(solana.program_id.parse()?)) + .wormhole_core(Some(solana.wormhole_id.parse()?)) + .keypair(Some(Keypair::from_bytes( + &bs58::decode(config::get_private_key(ChainKind::Sol)) + .into_vec() + .context("Failed to decode Solana keypair")?, + )?)) + .build() + .context("Failed to build SolanaBridgeClient") + }) + .transpose()?; + let wormhole_bridge_client = WormholeBridgeClientBuilder::default() .endpoint(Some(config.wormhole.api_url.clone())) .build() @@ -69,7 +91,7 @@ pub fn build_omni_connector( .eth_bridge_client(eth_bridge_client) .base_bridge_client(base_bridge_client) .arb_bridge_client(arb_bridge_client) - .solana_bridge_client(None) + .solana_bridge_client(solana_bridge_client) .wormhole_bridge_client(Some(wormhole_bridge_client)) .build() .context("Failed to build OmniConnector") diff --git a/omni-relayer/src/startup/near.rs b/omni-relayer/src/startup/near.rs index 860510a1..69a6279a 100644 --- a/omni-relayer/src/startup/near.rs +++ b/omni-relayer/src/startup/near.rs @@ -8,6 +8,7 @@ use near_crypto::{InMemorySigner, SecretKey}; use near_jsonrpc_client::JsonRpcClient; use near_lake_framework::{LakeConfig, LakeConfigBuilder}; use near_primitives::types::AccountId; +use omni_types::ChainKind; use crate::{config, utils}; @@ -45,8 +46,7 @@ fn get_private_key(file: Option) -> Result { } } - let private_key_str = std::env::var("NEAR_PRIVATE_KEY") - .context("Failed to get `NEAR_PRIVATE_KEY` environment variable")?; + let private_key_str = config::get_private_key(ChainKind::Near); info!("Retrieved private key from env"); @@ -69,13 +69,13 @@ async fn create_lake_config( redis_connection: &mut redis::aio::MultiplexedConnection, jsonrpc_client: &JsonRpcClient, ) -> Result { - let start_block_height = match utils::redis::get_last_processed_block( + let start_block_height = match utils::redis::get_last_processed::<&str, u64>( redis_connection, - utils::redis::NEAR_LAST_PROCESSED_BLOCK, + &utils::redis::get_last_processed_key(ChainKind::Near).await, ) .await { - Some(block_height) => block_height, + Some(block_height) => block_height + 1, None => utils::near::get_final_block(jsonrpc_client).await?, }; @@ -121,9 +121,9 @@ pub async fn start_indexer( ) .await; - utils::redis::update_last_processed_block( + utils::redis::update_last_processed( &mut redis_connection, - utils::redis::NEAR_LAST_PROCESSED_BLOCK, + &utils::redis::get_last_processed_key(ChainKind::Near).await, streamer_message.block.header.height, ) .await; diff --git a/omni-relayer/src/startup/solana.rs b/omni-relayer/src/startup/solana.rs new file mode 100644 index 00000000..d487f62c --- /dev/null +++ b/omni-relayer/src/startup/solana.rs @@ -0,0 +1,112 @@ +use std::str::FromStr; + +use anyhow::Result; +use log::{info, warn}; +use tokio_stream::StreamExt; + +use omni_types::ChainKind; +use solana_client::nonblocking::{pubsub_client::PubsubClient, rpc_client::RpcClient}; +use solana_client::rpc_client::GetConfirmedSignaturesForAddress2Config; +use solana_client::rpc_config::{RpcTransactionLogsConfig, RpcTransactionLogsFilter}; +use solana_client::rpc_response::RpcConfirmedTransactionStatusWithSignature; +use solana_sdk::signature::Signature; +use solana_sdk::{commitment_config::CommitmentConfig, pubkey::Pubkey}; + +use crate::{config, utils}; + +pub async fn start_indexer(config: config::Config, redis_client: redis::Client) -> Result<()> { + let Some(solana_config) = config.solana else { + anyhow::bail!("Failed to get Solana config"); + }; + + let mut redis_connection = redis_client.get_multiplexed_tokio_connection().await?; + + let rpc_http_url = &solana_config.rpc_http_url; + let rpc_ws_url = &solana_config.rpc_ws_url; + let program_id = Pubkey::from_str(&solana_config.program_id)?; + + let http_client = RpcClient::new(rpc_http_url.to_string()); + + if let Err(e) = + process_recent_signatures(&mut redis_connection, &http_client, &program_id).await + { + warn!("Failed to fetch recent logs: {}", e); + } + + info!("All historical logs processed, starting Solana WS subscription"); + + let Ok(ws_client) = PubsubClient::new(rpc_ws_url).await else { + anyhow::bail!("Failed to connect to Solana WebSocket"); + }; + + let filter = RpcTransactionLogsFilter::Mentions(vec![program_id.to_string()]); + let config = RpcTransactionLogsConfig { + commitment: Some(CommitmentConfig::processed()), + }; + + let Ok((mut log_stream, _)) = ws_client.logs_subscribe(filter, config).await else { + anyhow::bail!("Failed to subscribe to Solana logs"); + }; + + info!("Subscribed to live Solana logs"); + + while let Some(log) = log_stream.next().await { + let Ok(signature) = Signature::from_str(&log.value.signature) else { + warn!("Failed to parse signature: {:?}", log.value.signature); + continue; + }; + + info!("Found a signature on Solana: {:?}", signature); + + utils::redis::add_event( + &mut redis_connection, + utils::redis::SOLANA_EVENTS, + signature.to_string(), + // TODO: It's better to come up with a solution that wouldn't require storing `Null` value + serde_json::Value::Null, + ) + .await; + } + + Ok(()) +} + +async fn process_recent_signatures( + redis_connection: &mut redis::aio::MultiplexedConnection, + http_client: &RpcClient, + program_id: &Pubkey, +) -> Result<()> { + let Some(last_signature) = utils::redis::get_last_processed::<&str, String>( + redis_connection, + &utils::redis::get_last_processed_key(ChainKind::Sol).await, + ) + .await + .map(|s| Signature::from_str(&s).ok()) else { + return Ok(()); + }; + + let signatures: Vec = http_client + .get_signatures_for_address_with_config( + program_id, + GetConfirmedSignaturesForAddress2Config { + limit: None, + before: None, + until: last_signature, + commitment: Some(CommitmentConfig::confirmed()), + }, + ) + .await?; + + for signature_status in &signatures { + utils::redis::add_event( + redis_connection, + utils::redis::SOLANA_EVENTS, + signature_status.signature.clone(), + // TODO: It's better to come up with a solution that wouldn't require storing `Null` value + serde_json::Value::Null, + ) + .await; + } + + Ok(()) +} diff --git a/omni-relayer/src/utils/evm.rs b/omni-relayer/src/utils/evm.rs index 9d630d0a..93c22657 100644 --- a/omni-relayer/src/utils/evm.rs +++ b/omni-relayer/src/utils/evm.rs @@ -50,7 +50,7 @@ sol!( pub async fn get_vaa_from_evm_log( connector: Arc, chain_kind: ChainKind, - tx_logs: Option, + tx_logs: Option>, config: &config::Config, ) -> Option { let Some(tx_logs) = tx_logs else { diff --git a/omni-relayer/src/utils/mod.rs b/omni-relayer/src/utils/mod.rs index 4972661c..818f92ea 100644 --- a/omni-relayer/src/utils/mod.rs +++ b/omni-relayer/src/utils/mod.rs @@ -1,3 +1,5 @@ pub mod evm; pub mod near; pub mod redis; +pub mod solana; +pub mod storage; diff --git a/omni-relayer/src/utils/near.rs b/omni-relayer/src/utils/near.rs index 7ca8e99e..d1810e44 100644 --- a/omni-relayer/src/utils/near.rs +++ b/omni-relayer/src/utils/near.rs @@ -15,7 +15,7 @@ use near_primitives::{ types::BlockReference, views::QueryRequest, }; -use omni_types::near_events::Nep141LockerEvent; +use omni_types::{near_events::Nep141LockerEvent, ChainKind}; use crate::{config, utils}; @@ -115,8 +115,24 @@ pub async fn handle_streamer_message( ) .await; } - Nep141LockerEvent::FinTransferEvent { .. } - | Nep141LockerEvent::ClaimFeeEvent { .. } + Nep141LockerEvent::FinTransferEvent { + ref transfer_message, + } => { + if transfer_message.recipient.get_chain() != ChainKind::Near { + utils::redis::add_event( + redis_connection, + utils::redis::NEAR_INIT_TRANSFER_QUEUE, + transfer_message.origin_nonce.to_string(), + crate::workers::near::InitTransferWithTimestamp { + event: log, + creation_timestamp: chrono::Utc::now().timestamp(), + last_update_timestamp: None, + }, + ) + .await; + } + } + Nep141LockerEvent::ClaimFeeEvent { .. } | Nep141LockerEvent::LogMetadataEvent { .. } => {} } } diff --git a/omni-relayer/src/utils/redis.rs b/omni-relayer/src/utils/redis.rs index 4ce29b59..c31eee25 100644 --- a/omni-relayer/src/utils/redis.rs +++ b/omni-relayer/src/utils/redis.rs @@ -1,16 +1,15 @@ use log::warn; +use omni_types::ChainKind; use redis::{aio::MultiplexedConnection, AsyncCommands}; -pub const NEAR_LAST_PROCESSED_BLOCK: &str = "near_last_processed_block"; -pub const ETH_LAST_PROCESSED_BLOCK: &str = "eth_last_processed_block"; -pub const BASE_LAST_PROCESSED_BLOCK: &str = "base_last_processed_block"; -pub const ARB_LAST_PROCESSED_BLOCK: &str = "arb_last_processed_block"; - pub const NEAR_INIT_TRANSFER_QUEUE: &str = "near_init_transfer_queue"; pub const NEAR_SIGN_TRANSFER_EVENTS: &str = "near_sign_transfer_events"; pub const EVM_INIT_TRANSFER_EVENTS: &str = "evm_init_tranfer_events"; +pub const SOLANA_EVENTS: &str = "solana_events"; +pub const SOLANA_INIT_TRANSFER_EVENTS: &str = "solana_init_transfer_events"; + pub const FINALIZED_TRANSFERS: &str = "finalized_transfers"; pub const KEEP_INSUFFICIENT_FEE_TRANSFERS_FOR: i64 = 60 * 60 * 24 * 14; // 14 days @@ -21,12 +20,23 @@ pub const SLEEP_TIME_AFTER_EVENTS_PROCESS_SECS: u64 = 10; const QUERY_RETRY_ATTEMPTS: u64 = 10; const QUERY_RETRY_SLEEP_SECS: u64 = 1; -pub async fn get_last_processed_block( +pub async fn get_last_processed_key(chain_kind: ChainKind) -> String { + match chain_kind { + ChainKind::Sol => "SOLANA_LAST_PROCESSED_SIGNATURE".to_string(), + _ => format!("{:?}_LAST_PROCESSED_BLOCK", chain_kind), + } +} + +pub async fn get_last_processed( redis_connection: &mut MultiplexedConnection, - key: &str, -) -> Option { + key: K, +) -> Option +where + K: redis::ToRedisArgs + Copy + Send + Sync, + V: redis::FromRedisValue + Send + Sync, +{ for _ in 0..QUERY_RETRY_ATTEMPTS { - if let Ok(res) = redis_connection.get::<&str, u64>(key).await { + if let Ok(res) = redis_connection.get::(key).await { return Some(res); } @@ -37,17 +47,16 @@ pub async fn get_last_processed_block( None } -pub async fn update_last_processed_block( +pub async fn update_last_processed( redis_connection: &mut MultiplexedConnection, - key: &str, - value: u64, -) { + key: K, + value: V, +) where + K: redis::ToRedisArgs + Copy + Send + Sync, + V: redis::ToRedisArgs + Copy + Send + Sync, +{ for _ in 0..QUERY_RETRY_ATTEMPTS { - if redis_connection - .set::<&str, u64, ()>(key, value) - .await - .is_ok() - { + if redis_connection.set::(key, value).await.is_ok() { return; } diff --git a/omni-relayer/src/utils/solana.rs b/omni-relayer/src/utils/solana.rs new file mode 100644 index 00000000..b8ccc19d --- /dev/null +++ b/omni-relayer/src/utils/solana.rs @@ -0,0 +1,187 @@ +use anyhow::{Context, Result}; +use log::{info, warn}; + +use borsh::BorshDeserialize; +use solana_sdk::{bs58, pubkey::Pubkey, signature::Signature}; +use solana_transaction_status::{ + option_serializer::OptionSerializer, EncodedTransactionWithStatusMeta, UiRawMessage, +}; + +use crate::workers::near::FinTransfer; +use crate::workers::solana::InitTransferWithTimestamp; +use crate::{config, utils}; + +#[derive(Debug, BorshDeserialize)] +struct InitTransferPayload { + pub amount: u128, + pub recipient: String, + pub fee: u128, + pub native_fee: u64, +} + +pub async fn process_message( + redis_connection: &mut redis::aio::MultiplexedConnection, + solana: &config::Solana, + transaction: &EncodedTransactionWithStatusMeta, + message: &UiRawMessage, + signature: Signature, +) { + for instruction in message.instructions.clone() { + if let Err(err) = decode_instruction( + redis_connection, + solana, + signature, + transaction, + &instruction.data, + &message.account_keys, + ) + .await + { + warn!("Failed to decode instruction: {}", err); + } + } +} + +async fn decode_instruction( + redis_connection: &mut redis::aio::MultiplexedConnection, + solana: &config::Solana, + signature: Signature, + transaction: &EncodedTransactionWithStatusMeta, + data: &str, + account_keys: &[String], +) -> Result<()> { + let decoded_data = bs58::decode(data).into_vec()?; + + if let Some((discriminator, offset)) = [ + ( + &solana.init_transfer_discriminator, + solana.init_transfer_discriminator.len(), + ), + ( + &solana.init_transfer_sol_discriminator, + solana.init_transfer_sol_discriminator.len(), + ), + ] + .into_iter() + .find_map(|(discriminator, len)| { + decoded_data + .starts_with(discriminator) + .then_some((discriminator, len)) + }) { + info!("Received InitTransfer on Solana"); + + let mut payload_data = decoded_data + .get(offset..) + .context("Decoded data is too short")?; + + if let Ok(payload) = InitTransferPayload::deserialize(&mut payload_data) { + let (token, emitter) = if discriminator == &solana.init_transfer_discriminator { + let token = account_keys + .get(solana.init_transfer_token_index) + .context("Missing token account key")?; + let emitter = account_keys + .get(solana.init_transfer_emitter_index) + .context("Missing emitter account key")?; + (token, emitter) + } else { + let emitter = account_keys + .get(solana.init_transfer_sol_emitter_index) + .context("Missing SOL emitter account key")?; + (&Pubkey::default().to_string(), emitter) + }; + + if let Some(OptionSerializer::Some(logs)) = + transaction.clone().meta.map(|meta| meta.log_messages) + { + for log in logs { + if log.contains("Sequence") { + let Some(sequence) = log + .split_ascii_whitespace() + .last() + .map(|sequence| sequence.to_string()) + else { + warn!("Failed to parse sequence number from log: {:?}", log); + continue; + }; + + let Ok(sequence) = sequence.parse() else { + warn!("Failed to parse sequence as a number: {:?}", sequence); + continue; + }; + + utils::redis::add_event( + redis_connection, + utils::redis::SOLANA_INIT_TRANSFER_EVENTS, + signature.to_string(), + InitTransferWithTimestamp { + amount: payload.amount, + token: token.clone(), + recipient: payload.recipient.clone(), + fee: payload.fee, + native_fee: payload.native_fee, + emitter: emitter.clone(), + sequence, + creation_timestamp: chrono::Utc::now().timestamp(), + last_update_timestamp: None, + }, + ) + .await; + } + } + } + } + } else if let Some(discriminator) = [ + &solana.finalize_transfer_discriminator, + &solana.finalize_transfer_sol_discriminator, + ] + .into_iter() + .find(|discriminator| decoded_data.starts_with(discriminator)) + { + info!("Received FinTransfer on Solana"); + + let emitter = if discriminator == &solana.finalize_transfer_discriminator { + account_keys + .get(solana.finalize_transfer_emitter_index) + .context("Missing emitter account key")? + } else { + account_keys + .get(solana.finalize_transfer_sol_emitter_index) + .context("Missing SOL emitter account key")? + }; + + if let Some(OptionSerializer::Some(logs)) = + transaction.clone().meta.map(|meta| meta.log_messages) + { + for log in logs { + if log.contains("Sequence") { + let Some(sequence) = log + .split_ascii_whitespace() + .last() + .map(|sequence| sequence.to_string()) + else { + warn!("Failed to parse sequence number from log: {:?}", log); + continue; + }; + + let Ok(sequence) = sequence.parse() else { + warn!("Failed to parse sequence as a number: {:?}", sequence); + continue; + }; + + utils::redis::add_event( + redis_connection, + utils::redis::FINALIZED_TRANSFERS, + signature.to_string(), + FinTransfer::Solana { + emitter: emitter.clone(), + sequence, + }, + ) + .await; + } + } + } + } + + Ok(()) +} diff --git a/omni-relayer/src/utils/storage.rs b/omni-relayer/src/utils/storage.rs new file mode 100644 index 00000000..4376cc14 --- /dev/null +++ b/omni-relayer/src/utils/storage.rs @@ -0,0 +1,143 @@ +use std::str::FromStr; + +use anyhow::Result; + +use near_primitives::types::AccountId; +use omni_connector::OmniConnector; +use omni_types::{locker_args::StorageDepositAction, ChainKind, OmniAddress, H160}; +use solana_sdk::pubkey::Pubkey; + +async fn get_token_id( + connector: &OmniConnector, + chain_kind: ChainKind, + token_address: &str, +) -> Result { + let omni_token_address = match chain_kind { + ChainKind::Near => { + let token = AccountId::from_str(token_address).map_err(|_| { + format!( + "Failed to parse token address as AccountId: {:?}", + token_address + ) + })?; + Ok(OmniAddress::Near(token)) + } + ChainKind::Eth | ChainKind::Base | ChainKind::Arb => { + let token = H160::from_str(token_address).map_err(|_| { + format!("Failed to parse token address as H160: {:?}", token_address) + })?; + OmniAddress::new_from_evm_address(chain_kind, token) + } + ChainKind::Sol => { + let token = Pubkey::from_str(token_address).map_err(|_| { + format!( + "Failed to parse token address as Pubkey: {:?}", + token_address + ) + })?; + OmniAddress::new_from_slice(ChainKind::Sol, &token.to_bytes()) + } + } + .map_err(|_| { + format!( + "Failed to convert token address to OmniAddress: {:?}", + token_address + ) + })?; + + let token_id = connector + .near_get_token_id(omni_token_address.clone()) + .await + .map_err(|_| { + format!( + "Failed to get token id by omni token address: {:?}", + omni_token_address + ) + })?; + + Ok(token_id) +} + +async fn add_storage_deposit_action( + connector: &OmniConnector, + storage_deposit_actions: &mut Vec, + token_id: AccountId, + account_id: AccountId, +) -> Result<(), String> { + let storage_deposit_amount = match connector + .near_get_required_storage_deposit(token_id.clone(), account_id.clone()) + .await + .map_err(|_| { + format!( + "Failed to get required storage deposit for account: {:?}", + account_id + ) + })? { + amount if amount > 0 => Some(amount), + _ => None, + }; + + storage_deposit_actions.push(StorageDepositAction { + token_id, + account_id, + storage_deposit_amount, + }); + + Ok(()) +} + +pub async fn get_storage_deposit_actions( + connector: &OmniConnector, + chain_kind: ChainKind, + recipient: &OmniAddress, + token_address: &str, + fee: u128, + native_fee: u128, +) -> Result, String> { + let mut storage_deposit_actions = Vec::new(); + + if let OmniAddress::Near(near_recipient) = recipient { + let token_id = get_token_id(connector, chain_kind, token_address).await?; + add_storage_deposit_action( + connector, + &mut storage_deposit_actions, + token_id, + near_recipient.clone(), + ) + .await?; + } + + if fee > 0 { + let token_id = get_token_id(connector, chain_kind, token_address).await?; + + let relayer = connector + .near_bridge_client() + .and_then(|client| client.signer().map(|signer| signer.account_id)) + .map_err(|_| "Failed to get relayer account id".to_string())?; + + add_storage_deposit_action(connector, &mut storage_deposit_actions, token_id, relayer) + .await?; + } + + if native_fee > 0 { + let token_id = connector + .near_get_native_token_id(chain_kind) + .await + .map_err(|_| { + format!( + "Failed to get native token id by chain kind: {:?}", + chain_kind + ) + })?; + + let relayer = connector + .near_bridge_client() + .and_then(|client| client.signer().map(|signer| signer.account_id)) + .map_err(|_| "Failed to get relayer account id".to_string())?; + + add_storage_deposit_action(connector, &mut storage_deposit_actions, token_id, relayer) + .await?; + } + + Ok(storage_deposit_actions) +} diff --git a/omni-relayer/src/workers/evm.rs b/omni-relayer/src/workers/evm.rs index 7d009ea7..2dac2986 100644 --- a/omni-relayer/src/workers/evm.rs +++ b/omni-relayer/src/workers/evm.rs @@ -1,16 +1,13 @@ use std::sync::Arc; -use alloy::rpc::types::{Log, TransactionReceipt}; use anyhow::Result; -use borsh::BorshDeserialize; -use ethereum_types::H256; use futures::future::join_all; use log::{error, info, warn}; +use alloy::rpc::types::{Log, TransactionReceipt}; +use ethereum_types::H256; use omni_connector::OmniConnector; -use omni_types::{ - locker_args::StorageDepositAction, prover_result::ProofKind, ChainKind, OmniAddress, H160, -}; +use omni_types::{prover_result::ProofKind, ChainKind, OmniAddress}; use crate::{config, utils}; @@ -19,7 +16,7 @@ pub struct InitTransferWithTimestamp { pub chain_kind: ChainKind, pub block_number: u64, pub log: Log, - pub tx_logs: Option, + pub tx_logs: Option>, pub creation_timestamp: i64, pub last_update_timestamp: Option, } @@ -111,7 +108,10 @@ async fn handle_init_transfer_event( } }; - info!("Received InitTransfer log"); + info!( + "Trying to process InitTransfer log on {:?}", + init_transfer_with_timestamp.chain_kind + ); let tx_hash = match init_transfer_with_timestamp.log.transaction_hash { Some(tx_hash) => tx_hash, @@ -132,22 +132,6 @@ async fn handle_init_transfer_event( } }; - if current_timestamp - init_transfer_with_timestamp.creation_timestamp - > utils::redis::KEEP_INSUFFICIENT_FEE_TRANSFERS_FOR - { - warn!( - "Removing an old InitTransfer: {:?}", - init_transfer_with_timestamp - ); - utils::redis::remove_event( - &mut redis_connection, - utils::redis::EVM_INIT_TRANSFER_EVENTS, - &key, - ) - .await; - return; - } - // TODO: Use existing API to check if fee is sufficient here let vaa = utils::evm::get_vaa_from_evm_log( @@ -159,18 +143,27 @@ async fn handle_init_transfer_event( .await; if vaa.is_none() { - let light_client_latest_block_number = - match utils::near::get_eth_light_client_last_block_number(&config, &jsonrpc_client) - .await - { - Ok(block_number) => block_number, - Err(_) => { - warn!("Failed to get eth light client last block number"); - return; - } - }; - - if init_transfer_with_timestamp.block_number > light_client_latest_block_number { + if init_transfer_with_timestamp.chain_kind == ChainKind::Eth { + let light_client_latest_block_number = + match utils::near::get_eth_light_client_last_block_number(&config, &jsonrpc_client) + .await + { + Ok(block_number) => block_number, + Err(_) => { + warn!("Failed to get eth light client last block number"); + return; + } + }; + + if init_transfer_with_timestamp.block_number > light_client_latest_block_number { + tokio::time::sleep(tokio::time::Duration::from_secs( + utils::redis::SLEEP_TIME_AFTER_EVENTS_PROCESS_SECS, + )) + .await; + return; + } + } else { + warn!("VAA is not ready yet"); tokio::time::sleep(tokio::time::Duration::from_secs( utils::redis::SLEEP_TIME_AFTER_EVENTS_PROCESS_SECS, )) @@ -205,11 +198,13 @@ async fn handle_init_transfer_event( } }; - let storage_deposit_actions = match get_storage_deposit_actions( + let storage_deposit_actions = match utils::storage::get_storage_deposit_actions( &connector, - &init_log.inner, + init_transfer_with_timestamp.chain_kind, &recipient, - &init_transfer_with_timestamp, + &init_log.inner.tokenAddress.to_string(), + init_log.inner.fee, + init_log.inner.nativeFee, ) .await { @@ -220,13 +215,10 @@ async fn handle_init_transfer_event( } }; - let fin_transfer_args = match recipient.get_chain() { - ChainKind::Near => omni_connector::FinTransferArgs::NearFinTransfer { - chain_kind: init_transfer_with_timestamp.chain_kind, - storage_deposit_actions, - prover_args, - }, - _ => todo!(), + let fin_transfer_args = omni_connector::FinTransferArgs::NearFinTransfer { + chain_kind: init_transfer_with_timestamp.chain_kind, + storage_deposit_actions, + prover_args, }; match connector.fin_transfer(fin_transfer_args).await { @@ -241,139 +233,19 @@ async fn handle_init_transfer_event( } Err(err) => error!("Failed to finalize InitTransfer: {}", err), } -} - -async fn get_storage_deposit_actions( - connector: &OmniConnector, - init_log: &utils::evm::InitTransfer, - recipient: &OmniAddress, - init_transfer_with_timestamp: &InitTransferWithTimestamp, -) -> Result, String> { - let mut storage_deposit_actions = Vec::new(); - - if let OmniAddress::Near(near_recipient) = recipient { - let evm_token_address = - H160::try_from_slice(init_log.tokenAddress.as_slice()).map_err(|_| { - format!( - "Failed to parse token address as H160: {:?}", - init_log.tokenAddress - ) - })?; - let omni_token_address = OmniAddress::new_from_evm_address( - init_transfer_with_timestamp.chain_kind, - evm_token_address.clone(), - ) - .map_err(|_| { - format!( - "Failed to convert EVM token address to OmniAddress: {:?}", - evm_token_address - ) - })?; - - let token_id = connector - .near_get_token_id(omni_token_address.clone()) - .await - .map_err(|_| { - format!( - "Failed to get token id by omni token address: {:?}", - omni_token_address - ) - })?; - - let near_recipient_storage_deposit_amount = connector - .near_get_required_storage_deposit(token_id.clone(), near_recipient.clone()) - .await - .map_err(|_| { - format!( - "Failed to get required storage deposit for recipient: {:?}", - near_recipient - ) - })?; - - storage_deposit_actions.push(StorageDepositAction { - token_id, - account_id: near_recipient.clone(), - storage_deposit_amount: Some(near_recipient_storage_deposit_amount), - }); - }; - - if init_log.fee > 0 { - let evm_token_address = - H160::try_from_slice(init_log.tokenAddress.as_slice()).map_err(|_| { - format!( - "Failed to parse token address as H160: {:?}", - init_log.tokenAddress - ) - })?; - - let omni_token_address = OmniAddress::new_from_evm_address( - init_transfer_with_timestamp.chain_kind, - evm_token_address.clone(), + if current_timestamp - init_transfer_with_timestamp.creation_timestamp + > utils::redis::KEEP_INSUFFICIENT_FEE_TRANSFERS_FOR + { + warn!( + "Removing an old InitTransfer: {:?}", + init_transfer_with_timestamp + ); + utils::redis::remove_event( + &mut redis_connection, + utils::redis::EVM_INIT_TRANSFER_EVENTS, + &key, ) - .map_err(|_| { - format!( - "Failed to convert EVM token address to OmniAddress: {:?}", - evm_token_address - ) - })?; - - let token_id = connector - .near_get_token_id(omni_token_address.clone()) - .await - .map_err(|_| { - format!( - "Failed to get token id by omni token address: {:?}", - omni_token_address - ) - })?; - - let relayer = connector - .near_bridge_client() - .and_then(|client| client.signer().map(|signer| signer.account_id)) - .map_err(|_| "Failed to get relayer account id".to_string())?; - - let near_relayer_storage_deposit_amount = connector - .near_get_required_storage_deposit(token_id.clone(), relayer.clone()) - .await - .map_err(|_| { - format!( - "Failed to get required storage deposit for recipient: {:?}", - relayer - ) - })?; - - storage_deposit_actions.push(StorageDepositAction { - token_id, - account_id: relayer, - storage_deposit_amount: Some(near_relayer_storage_deposit_amount), - }); - } - - if init_log.nativeFee > 0 { - // TODO: Right now `get_native_token_id` is private, so either we make it public in a smart - // contract or make the logic manually - let token_id = connector - .near_get_native_token_id(init_transfer_with_timestamp.chain_kind) - .await - .map_err(|_| { - format!( - "Failed to get native token id by chain kind: {:?}", - init_transfer_with_timestamp.chain_kind - ) - })?; - - let relayer = connector - .near_bridge_client() - .and_then(|client| client.signer().map(|signer| signer.account_id)) - .map_err(|_| "Failed to get relayer account id".to_string())?; - - storage_deposit_actions.push(StorageDepositAction { - token_id, - account_id: relayer, - storage_deposit_amount: None, - }); + .await; } - - Ok(storage_deposit_actions) } diff --git a/omni-relayer/src/workers/mod.rs b/omni-relayer/src/workers/mod.rs index b2aa3b5d..ed4e27a1 100644 --- a/omni-relayer/src/workers/mod.rs +++ b/omni-relayer/src/workers/mod.rs @@ -1,2 +1,3 @@ pub mod evm; pub mod near; +pub mod solana; diff --git a/omni-relayer/src/workers/near.rs b/omni-relayer/src/workers/near.rs index bb67258f..cc6bec61 100644 --- a/omni-relayer/src/workers/near.rs +++ b/omni-relayer/src/workers/near.rs @@ -1,14 +1,19 @@ use std::sync::Arc; -use alloy::rpc::types::{Log, TransactionReceipt}; use anyhow::Result; -use ethereum_types::H256; use futures::future::join_all; use log::{error, info, warn}; +use alloy::rpc::types::{Log, TransactionReceipt}; +use ethereum_types::H256; + +use solana_sdk::pubkey::Pubkey; + use omni_connector::OmniConnector; use omni_types::{ - locker_args::ClaimFeeArgs, near_events::Nep141LockerEvent, prover_result::ProofKind, ChainKind, + locker_args::ClaimFeeArgs, near_events::Nep141LockerEvent, + prover_args::WormholeVerifyProofArgs, prover_result::ProofKind, ChainKind, OmniAddress, + TransferId, }; use crate::{config, utils}; @@ -69,7 +74,6 @@ pub async fn sign_transfer( } | Nep141LockerEvent::FinTransferEvent { ref transfer_message, - .. } | Nep141LockerEvent::UpdateFeeEvent { ref transfer_message, @@ -86,34 +90,27 @@ pub async fn sign_transfer( "Received InitTransferEvent/FinTransferEvent/UpdateFeeEvent", ); - if current_timestamp - init_transfer_with_timestamp.creation_timestamp - > utils::redis::KEEP_INSUFFICIENT_FEE_TRANSFERS_FOR - { - warn!( - "Removing an old InitTransfer: {:?}", - init_transfer_with_timestamp - ); - utils::redis::remove_event( - &mut redis_connection, - utils::redis::NEAR_INIT_TRANSFER_QUEUE, - &key, - ) - .await; - return; - } // TODO: Use existing API to check if fee is sufficient + let fee_recipient = connector + .near_bridge_client() + .and_then(|connector| connector.signer().map(|signer| signer.account_id)) + .unwrap_or(config.near.token_locker_id.clone()); + match connector .near_sign_transfer( - transfer_message.origin_nonce, - Some(config.near.token_locker_id), + TransferId { + origin_chain: transfer_message.sender.get_chain(), + origin_nonce: transfer_message.origin_nonce, + }, + Some(fee_recipient), Some(transfer_message.fee.clone()), ) .await { - Ok(outcome) => { - info!("Signed transfer: {:?}", outcome.transaction.hash); + Ok(tx_hash) => { + info!("Signed transfer: {:?}", tx_hash); utils::redis::remove_event( &mut redis_connection, utils::redis::NEAR_INIT_TRANSFER_QUEUE, @@ -125,6 +122,21 @@ pub async fn sign_transfer( error!("Failed to sign transfer: {}", err); } } + + if current_timestamp - init_transfer_with_timestamp.creation_timestamp + > utils::redis::KEEP_INSUFFICIENT_FEE_TRANSFERS_FOR + { + warn!( + "Removing an old InitTransfer: {:?}", + init_transfer_with_timestamp + ); + utils::redis::remove_event( + &mut redis_connection, + utils::redis::NEAR_INIT_TRANSFER_QUEUE, + &key, + ) + .await; + } } })); } @@ -179,11 +191,31 @@ pub async fn finalize_transfer( info!("Received SignTransferEvent"); let fin_transfer_args = match message_payload.recipient.get_chain() { - ChainKind::Eth => omni_connector::FinTransferArgs::EvmFinTransfer { - chain_kind: message_payload.recipient.get_chain(), - event, - }, - _ => todo!(), + ChainKind::Near => { + warn!("Near to Near transfers are not supported yet"); + return; + } + ChainKind::Eth | ChainKind::Base | ChainKind::Arb => { + omni_connector::FinTransferArgs::EvmFinTransfer { + chain_kind: message_payload.recipient.get_chain(), + event, + } + } + ChainKind::Sol => { + let OmniAddress::Sol(token) = message_payload.token_address.clone() + else { + warn!( + "Expected Sol token address, got: {:?}", + message_payload.token_address + ); + return; + }; + + omni_connector::FinTransferArgs::SolanaFinTransfer { + event, + solana_token: Pubkey::new_from_array(token.0), + } + } }; match connector.fin_transfer(fin_transfer_args).await { @@ -215,11 +247,17 @@ pub async fn finalize_transfer( } #[derive(Debug, serde::Serialize, serde::Deserialize)] -pub struct FinTransfer { - pub chain_kind: ChainKind, - pub block_number: u64, - pub log: Log, - pub tx_logs: Option, +pub enum FinTransfer { + Evm { + chain_kind: ChainKind, + block_number: u64, + log: Log, + tx_logs: Option>, + }, + Solana { + emitter: String, + sequence: u64, + }, } pub async fn claim_fee( @@ -249,84 +287,152 @@ pub async fn claim_fee( for (key, event) in events { if let Ok(fin_transfer) = serde_json::from_str::(&event) { - let vaa = utils::evm::get_vaa_from_evm_log( - connector.clone(), - fin_transfer.chain_kind, - fin_transfer.tx_logs, - &config, - ) - .await; - - if vaa.is_none() { - let Ok(light_client_latest_block_number) = - utils::near::get_eth_light_client_last_block_number( - &config, - &jsonrpc_client, - ) - .await - else { - warn!("Failed to get eth light client last block number"); - continue; - }; - - if fin_transfer.block_number > light_client_latest_block_number { - tokio::time::sleep(tokio::time::Duration::from_secs( - utils::redis::SLEEP_TIME_AFTER_EVENTS_PROCESS_SECS, - )) - .await; - continue; - } - } - - handlers.push(tokio::spawn({ - let config = config.clone(); - let mut redis_connection = redis_connection.clone(); - let connector = connector.clone(); + if let FinTransfer::Evm { + chain_kind, + block_number, + log, + tx_logs, + } = fin_transfer + { + info!("Trying to process FinTransfer log on {:?}", chain_kind); + + handlers.push(tokio::spawn({ + let config = config.clone(); + let mut redis_connection = redis_connection.clone(); + let connector = connector.clone(); + let jsonrpc_client = jsonrpc_client.clone(); + + async move { + info!("Received finalized transfer"); + + let vaa = utils::evm::get_vaa_from_evm_log( + connector.clone(), + chain_kind, + tx_logs, + &config, + ) + .await; - async move { - info!("Received finalized transfer"); + if vaa.is_none() { + if chain_kind == ChainKind::Eth { + let Ok(light_client_latest_block_number) = + utils::near::get_eth_light_client_last_block_number( + &config, + &jsonrpc_client, + ) + .await + else { + warn!("Failed to get eth light client last block number"); + return; + }; + + if block_number > light_client_latest_block_number { + warn!("ETH light client is not synced yet"); + tokio::time::sleep(tokio::time::Duration::from_secs( + utils::redis::SLEEP_TIME_AFTER_EVENTS_PROCESS_SECS, + )) + .await; + return; + } + } else { + warn!("VAA is not ready yet"); + tokio::time::sleep(tokio::time::Duration::from_secs( + utils::redis::SLEEP_TIME_AFTER_EVENTS_PROCESS_SECS, + )) + .await; + return; + } + } - let Some(tx_hash) = fin_transfer.log.transaction_hash else { - warn!("No transaction hash in log: {:?}", fin_transfer.log); - return; - }; + let Some(tx_hash) = log.transaction_hash else { + warn!("No transaction hash in log: {:?}", log); + return; + }; - let Some(topic) = fin_transfer.log.topic0() else { - warn!("No topic0 in log: {:?}", fin_transfer.log); - return; - }; + let Some(topic) = log.topic0() else { + warn!("No topic0 in log: {:?}", log); + return; + }; - let tx_hash = H256::from_slice(tx_hash.as_slice()); + 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::FinTransfer, - ) - .await - else { - warn!("Failed to get prover args"); - return; - }; - - let claim_fee_args = ClaimFeeArgs { - chain_kind: fin_transfer.chain_kind, - prover_args, - }; - - if let Ok(response) = connector.near_claim_fee(claim_fee_args).await { - info!("Claimed fee: {:?}", response); - utils::redis::remove_event( - &mut redis_connection, - utils::redis::FINALIZED_TRANSFERS, - &key, + let Some(prover_args) = utils::evm::construct_prover_args( + &config, + vaa, + tx_hash, + H256::from_slice(topic.as_slice()), + ProofKind::FinTransfer, ) - .await; + .await + else { + warn!("Failed to get prover args"); + return; + }; + + let claim_fee_args = ClaimFeeArgs { + chain_kind, + prover_args, + }; + + if let Ok(response) = connector.near_claim_fee(claim_fee_args).await { + info!("Claimed fee: {:?}", response); + utils::redis::remove_event( + &mut redis_connection, + utils::redis::FINALIZED_TRANSFERS, + &key, + ) + .await; + } } - } - })); + })); + } else if let FinTransfer::Solana { emitter, sequence } = fin_transfer { + handlers.push(tokio::spawn({ + let mut redis_connection = redis_connection.clone(); + let connector = connector.clone(); + async move { + info!("Trying to process FinTransfer log on Solana"); + + let Ok(vaa) = connector + .wormhole_get_vaa( + config.wormhole.solana_chain_id, + emitter, + sequence, + ) + .await + else { + warn!("Failed to get VAA for sequence: {}", sequence); + return; + }; + + let Ok(prover_args) = borsh::to_vec(&WormholeVerifyProofArgs { + proof_kind: ProofKind::FinTransfer, + vaa, + }) else { + warn!("Failed to serialize prover args to finalize transfer from Solana"); + return; + }; + + let claim_fee_args = ClaimFeeArgs { + chain_kind: ChainKind::Sol, + prover_args, + }; + match connector.near_claim_fee(claim_fee_args).await { + Ok(tx_hash) => { + info!("Claimed fee: {:?}", tx_hash); + utils::redis::remove_event( + &mut redis_connection, + utils::redis::FINALIZED_TRANSFERS, + &key, + ) + .await; + } + Err(err) => { + warn!("Failed to claim fee: {}", err); + } + }; + } + })); + } } } diff --git a/omni-relayer/src/workers/solana.rs b/omni-relayer/src/workers/solana.rs new file mode 100644 index 00000000..8546a26c --- /dev/null +++ b/omni-relayer/src/workers/solana.rs @@ -0,0 +1,289 @@ +use std::{str::FromStr, sync::Arc}; + +use anyhow::Result; +use futures::future::join_all; +use log::{error, info, warn}; + +use omni_connector::OmniConnector; +use omni_types::{ + prover_args::WormholeVerifyProofArgs, prover_result::ProofKind, ChainKind, OmniAddress, +}; +use solana_client::nonblocking::rpc_client::RpcClient; +use solana_sdk::signature::Signature; +use solana_transaction_status::{UiMessage, UiTransactionEncoding}; + +use crate::{config, utils}; + +pub async fn process_signature(config: config::Config, redis_client: redis::Client) -> Result<()> { + let Some(solana_config) = config.solana else { + anyhow::bail!("Failed to get Solana config"); + }; + + let rpc_http_url = &solana_config.rpc_http_url; + let http_client = Arc::new(RpcClient::new(rpc_http_url.to_string())); + + let redis_connection = redis_client.get_multiplexed_tokio_connection().await?; + + loop { + let mut redis_connection = redis_connection.clone(); + + let events = match utils::redis::get_events( + &mut redis_connection, + utils::redis::SOLANA_EVENTS.to_string(), + ) + .await + { + Some(events) => events, + None => { + tokio::time::sleep(tokio::time::Duration::from_secs( + utils::redis::SLEEP_TIME_AFTER_EVENTS_PROCESS_SECS, + )) + .await; + continue; + } + }; + + let mut handlers = Vec::new(); + + for (key, _) in events { + handlers.push(tokio::spawn({ + let mut redis_connection = redis_connection.clone(); + let solana = solana_config.clone(); + let http_client = http_client.clone(); + + async move { + let Ok(signature) = Signature::from_str(&key) else { + warn!("Failed to parse signature: {:?}", key); + return; + }; + + info!("Trying to process signature: {:?}", signature); + + match http_client + .get_transaction(&signature, UiTransactionEncoding::Json) + .await + { + Ok(tx) => { + let transaction = tx.transaction; + + if let solana_transaction_status::EncodedTransaction::Json(ref tx) = + transaction.transaction + { + if let UiMessage::Raw(ref raw) = tx.message { + utils::solana::process_message( + &mut redis_connection, + &solana, + &transaction, + raw, + signature, + ) + .await + } + } + + utils::redis::remove_event( + &mut redis_connection, + utils::redis::SOLANA_EVENTS, + &signature.to_string(), + ) + .await; + utils::redis::update_last_processed( + &mut redis_connection, + &utils::redis::get_last_processed_key(ChainKind::Sol).await, + &signature.to_string(), + ) + .await; + } + Err(e) => { + warn!("Failed to fetch transaction (probably signature wasn't finalized yet): {}", e); + } + }; + } + })); + } + + join_all(handlers).await; + + tokio::time::sleep(tokio::time::Duration::from_secs( + utils::redis::SLEEP_TIME_AFTER_EVENTS_PROCESS_SECS, + )) + .await; + } +} + +#[derive(Debug, serde::Serialize, serde::Deserialize)] +pub struct InitTransferWithTimestamp { + pub amount: u128, + pub token: String, + pub recipient: String, + pub fee: u128, + pub native_fee: u64, + pub emitter: String, + pub sequence: u64, + pub creation_timestamp: i64, + pub last_update_timestamp: Option, +} + +pub async fn finalize_transfer( + config: config::Config, + redis_client: redis::Client, + connector: Arc, +) -> Result<()> { + let redis_connection = redis_client.get_multiplexed_tokio_connection().await?; + + loop { + let mut redis_connection = redis_connection.clone(); + + let events = match utils::redis::get_events( + &mut redis_connection, + utils::redis::SOLANA_INIT_TRANSFER_EVENTS.to_string(), + ) + .await + { + Some(events) => events, + None => { + tokio::time::sleep(tokio::time::Duration::from_secs( + utils::redis::SLEEP_TIME_AFTER_EVENTS_PROCESS_SECS, + )) + .await; + continue; + } + }; + + let mut handlers = Vec::new(); + + for (key, event) in events { + if let Ok(init_transfer_with_timestamp) = + serde_json::from_str::(&event) + { + let handler = handle_init_transfer_event( + config.clone(), + connector.clone(), + redis_connection.clone(), + key.clone(), + init_transfer_with_timestamp, + ); + handlers.push(tokio::spawn(handler)); + } + } + + join_all(handlers).await; + + tokio::time::sleep(tokio::time::Duration::from_secs( + utils::redis::SLEEP_TIME_AFTER_EVENTS_PROCESS_SECS, + )) + .await; + } +} + +async fn handle_init_transfer_event( + config: config::Config, + connector: Arc, + mut redis_connection: redis::aio::MultiplexedConnection, + key: String, + init_transfer_with_timestamp: InitTransferWithTimestamp, +) { + let current_timestamp = chrono::Utc::now().timestamp(); + + if current_timestamp + - init_transfer_with_timestamp + .last_update_timestamp + .unwrap_or_default() + < utils::redis::CHECK_INSUFFICIENT_FEE_TRANSFERS_EVERY_SECS + { + return; + } + + info!("Trying to process InitTransfer log on Solana"); + + let recipient = match init_transfer_with_timestamp + .recipient + .parse::() + { + Ok(recipient) => recipient, + Err(_) => { + warn!( + "Failed to parse recipient as OmniAddress: {:?}", + init_transfer_with_timestamp.recipient + ); + return; + } + }; + + // TODO: Use existing API to check if fee is sufficient here + + let Ok(vaa) = connector + .wormhole_get_vaa( + config.wormhole.solana_chain_id, + &init_transfer_with_timestamp.emitter, + init_transfer_with_timestamp.sequence, + ) + .await + else { + warn!( + "Failed to get VAA for sequence: {}", + init_transfer_with_timestamp.sequence + ); + 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, + &recipient, + &init_transfer_with_timestamp.token, + init_transfer_with_timestamp.fee, + init_transfer_with_timestamp.native_fee as u128, + ) + .await + { + Ok(actions) => actions, + Err(err) => { + warn!("{}", err); + return; + } + }; + + let fin_transfer_args = omni_connector::FinTransferArgs::NearFinTransfer { + chain_kind: ChainKind::Sol, + storage_deposit_actions, + prover_args, + }; + + match connector.fin_transfer(fin_transfer_args).await { + Ok(tx_hash) => { + info!("Finalized InitTransfer: {:?}", tx_hash); + utils::redis::remove_event( + &mut redis_connection, + utils::redis::SOLANA_INIT_TRANSFER_EVENTS, + &key, + ) + .await; + } + Err(err) => error!("Failed to finalize InitTransfer: {}", err), + } + + if current_timestamp - init_transfer_with_timestamp.creation_timestamp + > utils::redis::KEEP_INSUFFICIENT_FEE_TRANSFERS_FOR + { + warn!( + "Removing an old InitTransfer on Solana: {:?}", + init_transfer_with_timestamp + ); + utils::redis::remove_event( + &mut redis_connection, + utils::redis::SOLANA_INIT_TRANSFER_EVENTS, + &key, + ) + .await; + } +} From cf237bc84b70e12ac7eb938de3a12bf3197a7830 Mon Sep 17 00:00:00 2001 From: Ivan Frolov <59515280+frolvanya@users.noreply.github.com> Date: Tue, 14 Jan 2025 15:23:16 -0500 Subject: [PATCH 08/21] feat: implemented fee check (#172) --- omni-relayer/.example-env | 1 + omni-relayer/Cargo.lock | 3854 ++++------------- omni-relayer/Cargo.toml | 30 +- omni-relayer/example-mainnet-config.toml | 64 + ...onfig.toml => example-testnet-config.toml} | 11 + omni-relayer/src/config.rs | 41 +- omni-relayer/src/main.rs | 73 +- omni-relayer/src/startup/evm.rs | 119 +- omni-relayer/src/startup/near.rs | 22 +- omni-relayer/src/startup/solana.rs | 50 +- omni-relayer/src/utils/evm.rs | 17 +- omni-relayer/src/utils/fee.rs | 41 + omni-relayer/src/utils/mod.rs | 2 + omni-relayer/src/utils/solana.rs | 13 +- omni-relayer/src/utils/storage.rs | 11 +- omni-relayer/src/workers/evm.rs | 111 +- omni-relayer/src/workers/near.rs | 65 +- omni-relayer/src/workers/solana.rs | 72 +- 18 files changed, 1442 insertions(+), 3155 deletions(-) create mode 100644 omni-relayer/example-mainnet-config.toml rename omni-relayer/{example-config.toml => example-testnet-config.toml} (84%) create mode 100644 omni-relayer/src/utils/fee.rs diff --git a/omni-relayer/.example-env b/omni-relayer/.example-env index a4709c1e..16bc08b1 100644 --- a/omni-relayer/.example-env +++ b/omni-relayer/.example-env @@ -7,6 +7,7 @@ AWS_SECRET_ACCESS_KEY=... NEAR_ACCOUNT_ID=... NEAR_PRIVATE_KEY=... +RPC_API_KEY=... ETH_PRIVATE_KEY=... BASE_PRIVATE_KEY=... ARB_PRIVATE_KEY=... diff --git a/omni-relayer/Cargo.lock b/omni-relayer/Cargo.lock index 1e3409c8..a5820f89 100644 --- a/omni-relayer/Cargo.lock +++ b/omni-relayer/Cargo.lock @@ -12,78 +12,13 @@ dependencies = [ "regex", ] -[[package]] -name = "actix" -version = "0.13.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de7fa236829ba0841304542f7614c42b80fca007455315c45c785ccfa873a85b" -dependencies = [ - "actix-macros", - "actix-rt", - "actix_derive", - "bitflags 2.6.0", - "bytes", - "crossbeam-channel", - "futures-core", - "futures-sink", - "futures-task", - "futures-util", - "log", - "once_cell", - "parking_lot 0.12.3", - "pin-project-lite", - "smallvec", - "tokio", - "tokio-util 0.7.13", -] - -[[package]] -name = "actix-macros" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" -dependencies = [ - "quote", - "syn 2.0.91", -] - -[[package]] -name = "actix-rt" -version = "2.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24eda4e2a6e042aa4e55ac438a2ae052d3b5da0ecf83d7411e1a368946925208" -dependencies = [ - "futures-core", - "tokio", -] - -[[package]] -name = "actix_derive" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6ac1e58cded18cb28ddc17143c4dea5345b3ad575e14f32f66e4054a56eb271" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.91", -] - -[[package]] -name = "addr2line" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" -dependencies = [ - "gimli 0.28.1", -] - [[package]] name = "addr2line" version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ - "gimli 0.31.1", + "gimli", ] [[package]] @@ -99,7 +34,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" dependencies = [ "crypto-common", - "generic-array 0.14.7", + "generic-array", ] [[package]] @@ -109,7 +44,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" dependencies = [ "cfg-if 1.0.0", - "cipher 0.4.4", + "cipher", "cpufeatures", ] @@ -121,24 +56,13 @@ checksum = "ae0784134ba9375416d469ec31e7c5f9fa94405049cf08c5ce5b4698be673e0d" dependencies = [ "aead", "aes", - "cipher 0.4.4", + "cipher", "ctr", "polyval", "subtle", "zeroize", ] -[[package]] -name = "ahash" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" -dependencies = [ - "getrandom 0.2.15", - "once_cell", - "version_check", -] - [[package]] name = "ahash" version = "0.8.11" @@ -209,9 +133,9 @@ dependencies = [ [[package]] name = "alloy-chains" -version = "0.1.49" +version = "0.1.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830045a4421ee38d3ab570d36d4d2b5152c066e72797139224da8de5d5981fd0" +checksum = "1e39f295f876b61a1222d937e1dd31f965e4a1acc3bba98e448dd7e84b1a4566" dependencies = [ "alloy-primitives", "num_enum", @@ -267,14 +191,14 @@ dependencies = [ "alloy-transport", "futures", "futures-util", - "thiserror 2.0.9", + "thiserror 2.0.11", ] [[package]] name = "alloy-core" -version = "0.8.15" +version = "0.8.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c618bd382f0bc2ac26a7e4bfae01c9b015ca8f21b37ca40059ae35a7e62b3dc6" +checksum = "d0713007d14d88a6edb8e248cddab783b698dbb954a28b8eee4bab21cfb7e578" dependencies = [ "alloy-dyn-abi", "alloy-json-abi", @@ -285,9 +209,9 @@ dependencies = [ [[package]] name = "alloy-dyn-abi" -version = "0.8.15" +version = "0.8.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41056bde53ae10ffbbf11618efbe1e0290859e5eab0fe9ef82ebdb62f12a866f" +checksum = "44e3b98c37b3218924cd1d2a8570666b89662be54e5b182643855f783ea68b33" dependencies = [ "alloy-json-abi", "alloy-primitives", @@ -355,9 +279,9 @@ dependencies = [ [[package]] name = "alloy-json-abi" -version = "0.8.15" +version = "0.8.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c357da577dfb56998d01f574d81ad7a1958d248740a7981b205d69d65a7da404" +checksum = "731ea743b3d843bc657e120fb1d1e9cc94f5dab8107e35a82125a63e6420a102" dependencies = [ "alloy-primitives", "alloy-sol-type-parser", @@ -375,7 +299,7 @@ dependencies = [ "alloy-sol-types", "serde", "serde_json", - "thiserror 2.0.9", + "thiserror 2.0.11", "tracing", ] @@ -401,7 +325,7 @@ dependencies = [ "futures-utils-wasm", "serde", "serde_json", - "thiserror 2.0.9", + "thiserror 2.0.11", ] [[package]] @@ -429,16 +353,16 @@ dependencies = [ "rand 0.8.5", "serde_json", "tempfile", - "thiserror 2.0.9", + "thiserror 2.0.11", "tracing", "url", ] [[package]] name = "alloy-primitives" -version = "0.8.15" +version = "0.8.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6259a506ab13e1d658796c31e6e39d2e2ee89243bcc505ddc613b35732e0a430" +checksum = "788bb18e8f61d5d9340b52143f27771daf7e1dccbaf2741621d2493f9debf52e" dependencies = [ "alloy-rlp", "bytes", @@ -447,7 +371,6 @@ dependencies = [ "derive_more 1.0.0", "foldhash", "hashbrown 0.15.2", - "hex-literal", "indexmap 2.7.0", "itoa", "k256", @@ -456,7 +379,7 @@ dependencies = [ "proptest", "rand 0.8.5", "ruint", - "rustc-hash 2.1.0", + "rustc-hash", "serde", "sha3", "tiny-keccak", @@ -491,14 +414,14 @@ dependencies = [ "dashmap 6.1.0", "futures", "futures-utils-wasm", - "lru 0.12.5", - "parking_lot 0.12.3", + "lru", + "parking_lot", "pin-project", - "reqwest 0.12.9", + "reqwest 0.12.12", "schnellru", "serde", "serde_json", - "thiserror 2.0.9", + "thiserror 2.0.11", "tokio", "tracing", "url", @@ -520,7 +443,7 @@ dependencies = [ "serde_json", "tokio", "tokio-stream", - "tower 0.5.2", + "tower", "tracing", ] @@ -543,7 +466,7 @@ checksum = "5a833d97bf8a5f0f878daf2c8451fff7de7f9de38baa5a45d936ec718d81255a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.96", ] [[package]] @@ -560,12 +483,12 @@ dependencies = [ "alloy-transport-ws", "futures", "pin-project", - "reqwest 0.12.9", + "reqwest 0.12.12", "serde", "serde_json", "tokio", "tokio-stream", - "tower 0.5.2", + "tower", "tracing", "url", "wasmtimer", @@ -648,7 +571,7 @@ dependencies = [ "auto_impl", "elliptic-curve 0.13.8", "k256", - "thiserror 2.0.9", + "thiserror 2.0.11", ] [[package]] @@ -664,28 +587,28 @@ dependencies = [ "async-trait", "k256", "rand 0.8.5", - "thiserror 2.0.9", + "thiserror 2.0.11", ] [[package]] name = "alloy-sol-macro" -version = "0.8.15" +version = "0.8.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9d64f851d95619233f74b310f12bcf16e0cbc27ee3762b6115c14a84809280a" +checksum = "a07b74d48661ab2e4b50bb5950d74dbff5e61dd8ed03bb822281b706d54ebacb" dependencies = [ "alloy-sol-macro-expander", "alloy-sol-macro-input", "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.96", ] [[package]] name = "alloy-sol-macro-expander" -version = "0.8.15" +version = "0.8.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bf7ed1574b699f48bf17caab4e6e54c6d12bc3c006ab33d58b1e227c1c3559f" +checksum = "19cc9c7f20b90f9be1a8f71a3d8e283a43745137b0837b1a1cb13159d37cad72" dependencies = [ "alloy-sol-macro-input", "const-hex", @@ -694,31 +617,31 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.96", "syn-solidity", "tiny-keccak", ] [[package]] name = "alloy-sol-macro-input" -version = "0.8.15" +version = "0.8.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c02997ccef5f34f9c099277d4145f183b422938ed5322dc57a089fe9b9ad9ee" +checksum = "713b7e6dfe1cb2f55c80fb05fd22ed085a1b4e48217611365ed0ae598a74c6ac" dependencies = [ "const-hex", "dunce", "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.96", "syn-solidity", ] [[package]] name = "alloy-sol-type-parser" -version = "0.8.15" +version = "0.8.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce13ff37285b0870d0a0746992a4ae48efaf34b766ae4c2640fa15e5305f8e73" +checksum = "1eda2711ab2e1fb517fc6e2ffa9728c9a232e296d16810810e6957b781a1b8bc" dependencies = [ "serde", "winnow", @@ -726,9 +649,9 @@ dependencies = [ [[package]] name = "alloy-sol-types" -version = "0.8.15" +version = "0.8.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1174cafd6c6d810711b4e00383037bdb458efc4fe3dbafafa16567e0320c54d8" +checksum = "e3b478bc9c0c4737a04cd976accde4df7eba0bdc0d90ad6ff43d58bc93cf79c1" dependencies = [ "alloy-json-abi", "alloy-primitives", @@ -749,9 +672,9 @@ dependencies = [ "futures-utils-wasm", "serde", "serde_json", - "thiserror 2.0.9", + "thiserror 2.0.11", "tokio", - "tower 0.5.2", + "tower", "tracing", "url", "wasmtimer", @@ -765,9 +688,9 @@ checksum = "2ed40eb1e1265b2911512f6aa1dcece9702d078f5a646730c45e39e2be00ac1c" dependencies = [ "alloy-json-rpc", "alloy-transport", - "reqwest 0.12.9", + "reqwest 0.12.12", "serde_json", - "tower 0.5.2", + "tower", "tracing", "url", ] @@ -782,7 +705,7 @@ dependencies = [ "alloy-transport", "futures", "http 1.2.0", - "rustls 0.23.20", + "rustls 0.23.21", "serde_json", "tokio", "tokio-tungstenite 0.24.0", @@ -792,9 +715,9 @@ dependencies = [ [[package]] name = "alloy-trie" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e428104b2445a4f929030891b3dbf8c94433a8349ba6480946bf6af7975c2f6" +checksum = "6917c79e837aa7b77b7a6dae9f89cbe15313ac161c4d3cfaf8909ef21f3d22d8" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -862,11 +785,12 @@ dependencies = [ [[package]] name = "anstyle-wincon" -version = "3.0.6" +version = "3.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" +checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" dependencies = [ "anstyle", + "once_cell", "windows-sys 0.59.0", ] @@ -1174,7 +1098,7 @@ version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" dependencies = [ - "event-listener 5.3.1", + "event-listener 5.4.0", "event-listener-strategy", "pin-project-lite", ] @@ -1198,18 +1122,18 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.96", ] [[package]] name = "async-trait" -version = "0.1.83" +version = "0.1.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" +checksum = "3f934833b4b7233644e5848f235df3f57ed8c80f1528a26c3dfa13d2147fa056" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.96", ] [[package]] @@ -1231,13 +1155,13 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "auto_impl" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" +checksum = "e12882f59de5360c748c4cbf569a042d5fb0eb515f7bea9c1f470b47f6ffbd73" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.96", ] [[package]] @@ -1248,9 +1172,9 @@ checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "aws-config" -version = "1.5.11" +version = "1.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5d1c2c88936a73c699225d0bc00684a534166b0cebc2659c3cdf08de8edc64c" +checksum = "c03a50b30228d3af8865ce83376b4e99e1ffa34728220fe2860e4df0bb5278d6" dependencies = [ "aws-credential-types", "aws-runtime", @@ -1290,9 +1214,9 @@ dependencies = [ [[package]] name = "aws-runtime" -version = "1.5.1" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "300a12520b4e6d08b73f77680f12c16e8ae43250d55100e0b2be46d78da16a48" +checksum = "b16d1aa50accc11a4b4d5c50f7fb81cc0cf60328259c587d0e6b0f11385bde46" dependencies = [ "aws-credential-types", "aws-sigv4", @@ -1311,14 +1235,14 @@ dependencies = [ "percent-encoding", "pin-project-lite", "tracing", - "uuid 1.11.0", + "uuid 1.12.0", ] [[package]] name = "aws-sdk-s3" -version = "1.66.0" +version = "1.68.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "154488d16ab0d627d15ab2832b57e68a16684c8c902f14cb8a75ec933fc94852" +checksum = "bc5ddf1dc70287dc9a2f953766a1fe15e3e74aef02fd1335f2afa475c9b4f4fc" dependencies = [ "aws-credential-types", "aws-runtime", @@ -1339,7 +1263,7 @@ dependencies = [ "hmac 0.12.1", "http 0.2.12", "http-body 0.4.6", - "lru 0.12.5", + "lru", "once_cell", "percent-encoding", "regex-lite", @@ -1350,9 +1274,9 @@ dependencies = [ [[package]] name = "aws-sdk-sso" -version = "1.51.0" +version = "1.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74995133da38f109a0eb8e8c886f9e80c713b6e9f2e6e5a6a1ba4450ce2ffc46" +checksum = "1605dc0bf9f0a4b05b451441a17fcb0bda229db384f23bf5cead3adbab0664ac" dependencies = [ "aws-credential-types", "aws-runtime", @@ -1372,9 +1296,9 @@ dependencies = [ [[package]] name = "aws-sdk-ssooidc" -version = "1.52.0" +version = "1.54.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7062a779685cbf3b2401eb36151e2c6589fd5f3569b8a6bc2d199e5aaa1d059" +checksum = "59f3f73466ff24f6ad109095e0f3f2c830bfb4cd6c8b12f744c8e61ebf4d3ba1" dependencies = [ "aws-credential-types", "aws-runtime", @@ -1394,9 +1318,9 @@ dependencies = [ [[package]] name = "aws-sdk-sts" -version = "1.52.0" +version = "1.54.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "299dae7b1dc0ee50434453fa5a229dc4b22bd3ee50409ff16becf1f7346e0193" +checksum = "861d324ef69247c6f3c6823755f408a68877ffb1a9afaff6dd8b0057c760de60" dependencies = [ "aws-credential-types", "aws-runtime", @@ -1446,9 +1370,9 @@ dependencies = [ [[package]] name = "aws-smithy-async" -version = "1.2.2" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8aa8ff1492fd9fb99ae28e8467af0dbbb7c31512b16fabf1a0f10d7bb6ef78bb" +checksum = "427cb637d15d63d6f9aae26358e1c9a9c09d5aa490d64b09354c8217cfef0f28" dependencies = [ "futures-util", "pin-project-lite", @@ -1529,9 +1453,9 @@ dependencies = [ [[package]] name = "aws-smithy-runtime" -version = "1.7.5" +version = "1.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "431a10d0e07e09091284ef04453dae4069283aa108d209974d67e77ae1caa658" +checksum = "a05dd41a70fc74051758ee75b5c4db2c0ca070ed9229c3df50e9475cda1cb985" dependencies = [ "aws-smithy-async", "aws-smithy-http", @@ -1573,9 +1497,9 @@ dependencies = [ [[package]] name = "aws-smithy-types" -version = "1.2.10" +version = "1.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecbf4d5dfb169812e2b240a4350f15ad3c6b03a54074e5712818801615f2dc5" +checksum = "38ddc9bd6c28aeb303477170ddd183760a956a03e083b3902a990238a7e3792d" dependencies = [ "base64-simd", "bytes", @@ -1594,7 +1518,7 @@ dependencies = [ "serde", "time", "tokio", - "tokio-util 0.7.13", + "tokio-util", ] [[package]] @@ -1626,11 +1550,11 @@ version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" dependencies = [ - "addr2line 0.24.2", + "addr2line", "cfg-if 1.0.0", "libc", "miniz_oxide", - "object 0.36.7", + "object", "rustc-demangle", "windows-targets 0.52.6", ] @@ -1723,22 +1647,6 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" -[[package]] -name = "bitcoin-io" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b47c4ab7a93edb0c7198c5535ed9b52b63095f4e9b45279c6736cec4b856baf" - -[[package]] -name = "bitcoin_hashes" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb18c03d0db0247e147a21a6faafd5a7eb851c743db062de72018b6b7e8e4d16" -dependencies = [ - "bitcoin-io", - "hex-conservative", -] - [[package]] name = "bitflags" version = "1.3.2" @@ -1747,9 +1655,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +checksum = "1be3f42a67d6d345ecd59f675f3f012d6974981560836e938c22b424b85ce1be" dependencies = [ "serde", ] @@ -1766,17 +1674,6 @@ dependencies = [ "wyz", ] -[[package]] -name = "blake2" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a4e37d16930f5459780f5621038b6382b9bb37c19016f39fb6b5808d831f174" -dependencies = [ - "crypto-mac", - "digest 0.9.0", - "opaque-debug", -] - [[package]] name = "blake2" version = "0.10.6" @@ -1806,7 +1703,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" dependencies = [ - "generic-array 0.14.7", + "generic-array", ] [[package]] @@ -1815,7 +1712,7 @@ version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ - "generic-array 0.14.7", + "generic-array", ] [[package]] @@ -1842,11 +1739,11 @@ dependencies = [ [[package]] name = "borsh" -version = "1.5.3" +version = "1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2506947f73ad44e344215ccd6403ac2ae18cd8e046e581a441bf8d199f257f03" +checksum = "9fb65153674e51d3a42c8f27b05b9508cea85edfaade8aa46bc8fc18cecdfef3" dependencies = [ - "borsh-derive 1.5.3", + "borsh-derive 1.5.4", "cfg_aliases", ] @@ -1865,15 +1762,15 @@ dependencies = [ [[package]] name = "borsh-derive" -version = "1.5.3" +version = "1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2593a3b8b938bd68373196c9832f516be11fa487ef4ae745eb282e6a56a7244" +checksum = "a396e17ad94059c650db3d253bb6e25927f1eb462eede7e7a153bb6e75dce0a7" dependencies = [ "once_cell", "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.96", ] [[package]] @@ -1901,14 +1798,14 @@ dependencies = [ [[package]] name = "bridge-connector-common" version = "0.1.0" -source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs?branch=refactor%2Fsolana-bridge-client#dc416510fc760d22fdf047ac42d68d75da63b0e6" +source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs#0742379055277a83856de23c7b1cba90a297c2b3" dependencies = [ "eth-proof", "ethers", "near-light-client-on-eth", "near-rpc-client", "serde_json", - "thiserror 2.0.9", + "thiserror 2.0.11", ] [[package]] @@ -1970,28 +1867,6 @@ version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" -[[package]] -name = "bytecheck" -version = "0.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" -dependencies = [ - "bytecheck_derive", - "ptr_meta", - "simdutf8", -] - -[[package]] -name = "bytecheck_derive" -version = "0.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "bytemuck" version = "1.21.0" @@ -2009,7 +1884,7 @@ checksum = "3fa76293b4f7bb636ab88fd78228235b5248b4d05cc589aed610f954af5d7c7a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.96", ] [[package]] @@ -2082,16 +1957,6 @@ dependencies = [ "serde", ] -[[package]] -name = "c2-chacha" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d27dae93fe7b1e0424dc57179ac396908c26b035a87234809f5c4dfd1b47dc80" -dependencies = [ - "cipher 0.2.5", - "ppv-lite86", -] - [[package]] name = "camino" version = "1.1.9" @@ -2136,9 +2001,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.5" +version = "1.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31a0499c1dc64f458ad13872de75c0eb7e3fdb0e67964610c914b034fc5956e" +checksum = "c8293772165d9345bdaaa39b45b2109591e63fe5e6fbc23c6ff930a048aa310b" dependencies = [ "jobserver", "libc", @@ -2177,7 +2042,7 @@ checksum = "45565fc9416b9896014f5732ac776f810ee53a66730c17e4020c3ec064a8f88f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.96", ] [[package]] @@ -2195,15 +2060,6 @@ dependencies = [ "windows-targets 0.52.6", ] -[[package]] -name = "cipher" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12f8e7987cbd042a63249497f41aed09f8e65add917ea6566effbc56578d6801" -dependencies = [ - "generic-array 0.14.7", -] - [[package]] name = "cipher" version = "0.4.4" @@ -2221,15 +2077,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f0bc31eabef0259183d03c3846ad6818eaa8e542c31dae751c9d22ea030fb7d" dependencies = [ "hasher", - "parking_lot 0.12.3", + "parking_lot", "rlp 0.5.2", ] [[package]] name = "clap" -version = "4.5.23" +version = "4.5.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3135e7ec2ef7b10c6ed8950f0f792ed96ee093fa088608f1c76e569722700c84" +checksum = "a8eb5e908ef3a6efbe1ed62520fb7287959888c88485abe072543190ecc66783" dependencies = [ "clap_builder", "clap_derive", @@ -2237,9 +2093,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.23" +version = "4.5.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30582fc632330df2bd26877bde0c1f4470d57c582bbc070376afcd04d8cb4838" +checksum = "96b01801b5fc6a0a232407abc821660c9c6d25a1cafc0d4f85f29fb8d9afc121" dependencies = [ "anstream", "anstyle", @@ -2249,14 +2105,14 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.18" +version = "4.5.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" +checksum = "54b755194d6389280185988721fffba69495eed5ee9feeee9a599b53db80318c" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.96", ] [[package]] @@ -2265,15 +2121,6 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" -[[package]] -name = "cloudabi" -version = "0.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" -dependencies = [ - "bitflags 1.3.2", -] - [[package]] name = "coins-bip32" version = "0.8.7" @@ -2316,7 +2163,7 @@ dependencies = [ "bech32", "bs58 0.5.1", "digest 0.10.7", - "generic-array 0.14.7", + "generic-array", "hex", "ripemd", "serde", @@ -2356,7 +2203,7 @@ dependencies = [ "memchr", "pin-project-lite", "tokio", - "tokio-util 0.7.13", + "tokio-util", ] [[package]] @@ -2454,15 +2301,6 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" -[[package]] -name = "cpp_demangle" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeaa953eaad386a53111e47172c2fedba671e5684c8dd601a5f474f4f118710f" -dependencies = [ - "cfg-if 1.0.0", -] - [[package]] name = "cpufeatures" version = "0.2.16" @@ -2472,115 +2310,6 @@ dependencies = [ "libc", ] -[[package]] -name = "cranelift-bforest" -version = "0.101.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b5bb9245ec7dcc04d03110e538d31f0969d301c9d673145f4b4d5c3478539a3" -dependencies = [ - "cranelift-entity", -] - -[[package]] -name = "cranelift-codegen" -version = "0.101.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebb18d10e5ddac43ba4ca8fd4e310938569c3e484cc01b6372b27dc5bb4dfd28" -dependencies = [ - "bumpalo", - "cranelift-bforest", - "cranelift-codegen-meta", - "cranelift-codegen-shared", - "cranelift-control", - "cranelift-entity", - "cranelift-isle", - "gimli 0.28.1", - "hashbrown 0.14.5", - "log", - "regalloc2", - "smallvec", - "target-lexicon 0.12.16", -] - -[[package]] -name = "cranelift-codegen-meta" -version = "0.101.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a3ce6d22982c1b9b6b012654258bab1a13947bb12703518bef06b1a4867c3d6" -dependencies = [ - "cranelift-codegen-shared", -] - -[[package]] -name = "cranelift-codegen-shared" -version = "0.101.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47220fd4f9a0ce23541652b6f16f83868d282602c600d14934b2a4c166b4bd80" - -[[package]] -name = "cranelift-control" -version = "0.101.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed5a4c42672aea9b6e820046b52e47a1c05d3394a6cdf4cb3c3c4b702f954bd2" -dependencies = [ - "arbitrary", -] - -[[package]] -name = "cranelift-entity" -version = "0.101.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b4e9a3296fc827f9d35135dc2c0c8dd8d8359eb1ef904bae2d55d5bcb0c9f94" -dependencies = [ - "serde", - "serde_derive", -] - -[[package]] -name = "cranelift-frontend" -version = "0.101.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ec537d0f0b8e084517f3e7bfa1d89af343d7c7df455573fca9f272d4e01267" -dependencies = [ - "cranelift-codegen", - "log", - "smallvec", - "target-lexicon 0.12.16", -] - -[[package]] -name = "cranelift-isle" -version = "0.101.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45bab6d69919d210a50331d35cc6ce111567bc040aebac63a8ae130d0400a075" - -[[package]] -name = "cranelift-native" -version = "0.101.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f32e81605f352cf37af5463f11cd7deec7b6572741931a8d372f7fdd4a744f5d" -dependencies = [ - "cranelift-codegen", - "libc", - "target-lexicon 0.12.16", -] - -[[package]] -name = "cranelift-wasm" -version = "0.101.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0edaa4cbec1bc787395c074233df2652dd62f3e29d3ee60329514a0a51e6b045" -dependencies = [ - "cranelift-codegen", - "cranelift-entity", - "cranelift-frontend", - "itertools 0.10.5", - "log", - "smallvec", - "wasmparser 0.115.0", - "wasmtime-types", -] - [[package]] name = "crc32c" version = "0.6.8" @@ -2645,7 +2374,7 @@ version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" dependencies = [ - "generic-array 0.14.7", + "generic-array", "rand_core 0.6.4", "subtle", "zeroize", @@ -2657,7 +2386,7 @@ version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ - "generic-array 0.14.7", + "generic-array", "rand_core 0.6.4", "subtle", "zeroize", @@ -2669,7 +2398,7 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ - "generic-array 0.14.7", + "generic-array", "rand_core 0.6.4", "typenum", ] @@ -2680,7 +2409,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" dependencies = [ - "generic-array 0.14.7", + "generic-array", "subtle", ] @@ -2690,7 +2419,7 @@ version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" dependencies = [ - "cipher 0.4.4", + "cipher", ] [[package]] @@ -2732,7 +2461,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.96", ] [[package]] @@ -2780,7 +2509,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.91", + "syn 2.0.96", ] [[package]] @@ -2802,7 +2531,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core 0.20.10", "quote", - "syn 2.0.91", + "syn 2.0.96", ] [[package]] @@ -2813,9 +2542,9 @@ checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" dependencies = [ "cfg-if 1.0.0", "hashbrown 0.14.5", - "lock_api 0.4.12", + "lock_api", "once_cell", - "parking_lot_core 0.9.10", + "parking_lot_core", ] [[package]] @@ -2827,9 +2556,9 @@ dependencies = [ "cfg-if 1.0.0", "crossbeam-utils", "hashbrown 0.14.5", - "lock_api 0.4.12", + "lock_api", "once_cell", - "parking_lot_core 0.9.10", + "parking_lot_core", ] [[package]] @@ -2838,15 +2567,6 @@ version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" -[[package]] -name = "debugid" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef552e6f588e446098f6ba40d89ac146c8c7b64aade83c051ee00bb5d2bc18d" -dependencies = [ - "uuid 1.11.0", -] - [[package]] name = "der" version = "0.6.1" @@ -2916,7 +2636,7 @@ checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.96", ] [[package]] @@ -2958,7 +2678,7 @@ dependencies = [ "darling 0.20.10", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.96", ] [[package]] @@ -2978,7 +2698,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core 0.20.2", - "syn 2.0.91", + "syn 2.0.96", ] [[package]] @@ -2991,7 +2711,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version 0.4.1", - "syn 2.0.91", + "syn 2.0.96", ] [[package]] @@ -3011,26 +2731,17 @@ checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.96", "unicode-xid", ] -[[package]] -name = "digest" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" -dependencies = [ - "generic-array 0.12.4", -] - [[package]] name = "digest" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" dependencies = [ - "generic-array 0.14.7", + "generic-array", ] [[package]] @@ -3095,15 +2806,9 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.96", ] -[[package]] -name = "dissimilar" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59f8e79d1fbf76bdfbde321e902714bf6c49df88a7dda6fc682fc2979226962d" - [[package]] name = "dlopen2" version = "0.5.0" @@ -3124,7 +2829,7 @@ checksum = "a6cbae11b3de8fce2a456e8ea3dada226b35fe791f0dc1d360c0941f0bb681f3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.96", ] [[package]] @@ -3139,59 +2844,6 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" -[[package]] -name = "dynasm" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "add9a102807b524ec050363f09e06f1504214b0e1c7797f64261c891022dce8b" -dependencies = [ - "bitflags 1.3.2", - "byteorder", - "lazy_static", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "dynasm" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33dc03612f42465a8ed7f5e354bc2b79ba54cedefa81d5bd3a064f1835adaba8" -dependencies = [ - "bitflags 1.3.2", - "byteorder", - "lazy_static", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "dynasmrt" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64fba5a42bd76a17cad4bfa00de168ee1cbfa06a5e8ce992ae880218c05641a9" -dependencies = [ - "byteorder", - "dynasm 1.2.3", - "memmap2", -] - -[[package]] -name = "dynasmrt" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7dccc31a678058996aef614f6bd418ced384da70f284e83e2b7bf29b27b6a28" -dependencies = [ - "byteorder", - "dynasm 2.0.0", - "fnv", - "memmap2", -] - [[package]] name = "eager" version = "0.1.0" @@ -3304,7 +2956,7 @@ dependencies = [ "der 0.6.1", "digest 0.10.7", "ff 0.12.1", - "generic-array 0.14.7", + "generic-array", "group 0.12.1", "pkcs8 0.9.0", "rand_core 0.6.4", @@ -3323,7 +2975,7 @@ dependencies = [ "crypto-bigint 0.5.5", "digest 0.10.7", "ff 0.13.0", - "generic-array 0.14.7", + "generic-array", "group 0.13.0", "pkcs8 0.10.2", "rand_core 0.6.4", @@ -3391,7 +3043,7 @@ checksum = "a1ab991c1362ac86c61ab6f556cff143daa22e5a15e4e189df818b2fd19fe65b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.96", ] [[package]] @@ -3411,60 +3063,28 @@ checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.96", ] [[package]] -name = "enumset" -version = "1.1.5" +name = "env_logger" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d07a4b049558765cef5f0c1a273c3fc57084d768b44d2f98127aef4cceb17293" +checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580" dependencies = [ - "enumset_derive", + "humantime", + "is-terminal", + "log", + "regex", + "termcolor", ] [[package]] -name = "enumset_derive" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59c3b24c345d8c314966bdc1832f6c2635bfcce8e7cf363bd115987bba2ee242" -dependencies = [ - "darling 0.20.10", - "proc-macro2", - "quote", - "syn 2.0.91", -] - -[[package]] -name = "env_logger" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580" -dependencies = [ - "humantime", - "is-terminal", - "log", - "regex", - "termcolor", -] - -[[package]] -name = "equivalent" -version = "1.0.1" +name = "equivalent" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" -[[package]] -name = "errno" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1" -dependencies = [ - "errno-dragonfly", - "libc", - "winapi", -] - [[package]] name = "errno" version = "0.3.10" @@ -3475,16 +3095,6 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "errno-dragonfly" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" -dependencies = [ - "cc", - "libc", -] - [[package]] name = "eth-keystore" version = "0.5.0" @@ -3510,19 +3120,19 @@ dependencies = [ [[package]] name = "eth-proof" version = "0.1.0" -source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs?branch=refactor%2Fsolana-bridge-client#dc416510fc760d22fdf047ac42d68d75da63b0e6" +source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs#0742379055277a83856de23c7b1cba90a297c2b3" dependencies = [ - "borsh 1.5.3", + "borsh 1.5.4", "cita_trie", "ethereum-types 0.14.1", "hasher", "hex", "omni-types", - "reqwest 0.11.27", + "reqwest 0.12.12", "rlp 0.5.2", "serde", "serde_json", - "thiserror 2.0.9", + "thiserror 2.0.11", "tokio", ] @@ -3667,7 +3277,7 @@ dependencies = [ "reqwest 0.11.27", "serde", "serde_json", - "syn 2.0.91", + "syn 2.0.96", "toml 0.8.19", "walkdir", ] @@ -3685,7 +3295,7 @@ dependencies = [ "proc-macro2", "quote", "serde_json", - "syn 2.0.91", + "syn 2.0.96", ] [[package]] @@ -3701,7 +3311,7 @@ dependencies = [ "const-hex", "elliptic-curve 0.13.8", "ethabi", - "generic-array 0.14.7", + "generic-array", "k256", "num_enum", "once_cell", @@ -3711,7 +3321,7 @@ dependencies = [ "serde", "serde_json", "strum 0.26.3", - "syn 2.0.91", + "syn 2.0.96", "tempfile", "thiserror 1.0.69", "tiny-keccak", @@ -3857,9 +3467,9 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] name = "event-listener" -version = "5.3.1" +version = "5.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" +checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" dependencies = [ "concurrent-queue", "parking", @@ -3872,26 +3482,24 @@ version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2" dependencies = [ - "event-listener 5.3.1", + "event-listener 5.4.0", "pin-project-lite", ] [[package]] name = "evm-bridge-client" version = "0.1.0" -source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs?branch=refactor%2Fsolana-bridge-client#dc416510fc760d22fdf047ac42d68d75da63b0e6" +source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs#0742379055277a83856de23c7b1cba90a297c2b3" dependencies = [ - "borsh 1.5.3", + "borsh 1.5.4", "bridge-connector-common", "derive_builder 0.20.2", "eth-proof", "ethers", "hex", - "near-bridge-client", - "near-contract-standards", - "near-crypto 0.21.2", - "near-jsonrpc-client 0.9.0", - "near-primitives 0.21.2", + "near-crypto 0.28.0", + "near-jsonrpc-client", + "near-primitives 0.28.0", "near-rpc-client", "near-token", "omni-types", @@ -3910,12 +3518,6 @@ dependencies = [ "once_cell", ] -[[package]] -name = "fallible-iterator" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" - [[package]] name = "fastrand" version = "2.3.0" @@ -3976,22 +3578,6 @@ version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" -[[package]] -name = "finite-wasm" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d81b511929c2669eaf64e36471cf27c2508133e62ade9d49e608e8d675e7854" -dependencies = [ - "bitvec", - "dissimilar", - "num-traits", - "prefix-sum-vec", - "thiserror 1.0.69", - "wasm-encoder 0.27.0", - "wasmparser 0.105.0", - "wasmprinter", -] - [[package]] name = "five8_const" version = "0.1.3" @@ -4162,7 +3748,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.96", ] [[package]] @@ -4220,28 +3806,6 @@ dependencies = [ "byteorder", ] -[[package]] -name = "fxprof-processed-profile" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27d12c0aed7f1e24276a241aadc4cb8ea9f83000f34bc062b7cc2d51e3b0fabd" -dependencies = [ - "bitflags 2.6.0", - "debugid", - "fxhash", - "serde", - "serde_json", -] - -[[package]] -name = "generic-array" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" -dependencies = [ - "typenum", -] - [[package]] name = "generic-array" version = "0.14.7" @@ -4290,17 +3854,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "gimli" -version = "0.28.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" -dependencies = [ - "fallible-iterator", - "indexmap 2.7.0", - "stable_deref_trait", -] - [[package]] name = "gimli" version = "0.31.1" @@ -4309,9 +3862,9 @@ checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "glob" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" [[package]] name = "gloo-timers" @@ -4337,7 +3890,7 @@ dependencies = [ "futures-timer", "no-std-compat", "nonzero_ext", - "parking_lot 0.12.3", + "parking_lot", "portable-atomic", "quanta", "rand 0.8.5", @@ -4382,7 +3935,7 @@ dependencies = [ "indexmap 2.7.0", "slab", "tokio", - "tokio-util 0.7.13", + "tokio-util", "tracing", ] @@ -4401,7 +3954,7 @@ dependencies = [ "indexmap 2.7.0", "slab", "tokio", - "tokio-util 0.7.13", + "tokio-util", "tracing", ] @@ -4419,9 +3972,6 @@ name = "hashbrown" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" -dependencies = [ - "ahash 0.7.8", -] [[package]] name = "hashbrown" @@ -4429,7 +3979,7 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" dependencies = [ - "ahash 0.8.11", + "ahash", ] [[package]] @@ -4437,9 +3987,6 @@ name = "hashbrown" version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" -dependencies = [ - "ahash 0.8.11", -] [[package]] name = "hashbrown" @@ -4471,15 +4018,6 @@ dependencies = [ "fxhash", ] -[[package]] -name = "heck" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" -dependencies = [ - "unicode-segmentation", -] - [[package]] name = "heck" version = "0.4.1" @@ -4513,21 +4051,6 @@ dependencies = [ "serde", ] -[[package]] -name = "hex-conservative" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5313b072ce3c597065a808dbf612c4c8e8590bdbf8b579508bf7a762c5eae6cd" -dependencies = [ - "arrayvec", -] - -[[package]] -name = "hex-literal" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" - [[package]] name = "histogram" version = "0.6.9" @@ -4560,7 +4083,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17ea0a1394df5b6574da6e0c1ade9e78868c9fb0a4e5ef4428e32da4676b85b1" dependencies = [ "digest 0.9.0", - "generic-array 0.14.7", + "generic-array", "hmac 0.8.1", ] @@ -4717,38 +4240,13 @@ dependencies = [ "http 1.2.0", "hyper 1.5.2", "hyper-util", - "rustls 0.23.20", + "rustls 0.23.21", "rustls-pki-types", "tokio", "tokio-rustls 0.26.1", "tower-service", ] -[[package]] -name = "hyper-timeout" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" -dependencies = [ - "hyper 0.14.32", - "pin-project-lite", - "tokio", - "tokio-io-timeout", -] - -[[package]] -name = "hyper-tls" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" -dependencies = [ - "bytes", - "hyper 0.14.32", - "native-tls", - "tokio", - "tokio-native-tls", -] - [[package]] name = "hyper-tls" version = "0.6.0" @@ -4922,7 +4420,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.96", ] [[package]] @@ -5005,7 +4503,7 @@ checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.96", ] [[package]] @@ -5055,7 +4553,7 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" dependencies = [ - "generic-array 0.14.7", + "generic-array", ] [[package]] @@ -5163,9 +4661,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.76" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" dependencies = [ "once_cell", "wasm-bindgen", @@ -5252,7 +4750,7 @@ dependencies = [ "lalrpop-util", "petgraph", "regex", - "regex-syntax 0.8.5", + "regex-syntax", "string_cache", "term", "tiny-keccak", @@ -5266,7 +4764,7 @@ version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "507460a910eb7b32ee961886ff48539633b788a36b65692b95f225b844c82553" dependencies = [ - "regex-automata 0.4.9", + "regex-automata", ] [[package]] @@ -5274,15 +4772,6 @@ name = "lazy_static" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" -dependencies = [ - "spin 0.9.8", -] - -[[package]] -name = "leb128" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" [[package]] name = "libc" @@ -5302,7 +4791,7 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.7.0", "libc", ] @@ -5356,9 +4845,9 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.4.14" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] name = "litemap" @@ -5366,15 +4855,6 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" -[[package]] -name = "lock_api" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4da24a77a3d8a6d4862d95f72e6fdb9c09a643ecdb402d754004a557f2bec75" -dependencies = [ - "scopeguard", -] - [[package]] name = "lock_api" version = "0.4.12" @@ -5387,38 +4867,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" - -[[package]] -name = "loupe" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b6a72dfa44fe15b5e76b94307eeb2ff995a8c5b283b55008940c02e0c5b634d" -dependencies = [ - "loupe-derive", - "rustversion", -] - -[[package]] -name = "loupe-derive" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fbfc88337168279f2e9ae06e157cfed4efd3316e14dc96ed074d4f2e6c5952" -dependencies = [ - "quote", - "syn 1.0.109", -] - -[[package]] -name = "lru" -version = "0.7.8" +version = "0.4.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999beba7b6e8345721bd280141ed958096a2e4abdf74f67ff4ce49b4b54e47a" -dependencies = [ - "hashbrown 0.12.3", -] +checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" [[package]] name = "lru" @@ -5429,33 +4880,6 @@ dependencies = [ "hashbrown 0.15.2", ] -[[package]] -name = "mach" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa" -dependencies = [ - "libc", -] - -[[package]] -name = "mach2" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" -dependencies = [ - "libc", -] - -[[package]] -name = "matchers" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" -dependencies = [ - "regex-automata 0.1.10", -] - [[package]] name = "md-5" version = "0.10.6" @@ -5472,25 +4896,6 @@ version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" -[[package]] -name = "memfd" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2cffa4ad52c6f791f4f8b15f0c05f9824b2ced1160e88cc393d64fff9a8ac64" -dependencies = [ - "rustix", -] - -[[package]] -name = "memmap" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b" -dependencies = [ - "libc", - "winapi", -] - [[package]] name = "memmap2" version = "0.5.10" @@ -5500,24 +4905,6 @@ dependencies = [ "libc", ] -[[package]] -name = "memoffset" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" -dependencies = [ - "autocfg", -] - -[[package]] -name = "memoffset" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" -dependencies = [ - "autocfg", -] - [[package]] name = "memoffset" version = "0.9.1" @@ -5569,9 +4956,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ffbe83022cedc1d264172192511ae958937694cd57ce297164951b8b3568394" +checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" dependencies = [ "adler2", ] @@ -5587,12 +4974,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "more-asserts" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7843ec2de400bcbc6a6328c958dc38e5359da6e93e72e37bc5246bf1ae776389" - [[package]] name = "mpl-token-metadata" version = "5.1.0" @@ -5606,12 +4987,6 @@ dependencies = [ "thiserror 1.0.69", ] -[[package]] -name = "multimap" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" - [[package]] name = "native-tls" version = "0.2.12" @@ -5635,22 +5010,22 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35cbb989542587b47205e608324ddd391f0cee1c22b4b64ae49f458334b95907" dependencies = [ - "borsh 1.5.3", + "borsh 1.5.4", "serde", ] [[package]] name = "near-bridge-client" version = "0.1.0" -source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs?branch=refactor%2Fsolana-bridge-client#dc416510fc760d22fdf047ac42d68d75da63b0e6" +source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs#0742379055277a83856de23c7b1cba90a297c2b3" dependencies = [ - "borsh 1.5.3", + "borsh 1.5.4", "bridge-connector-common", "derive_builder 0.20.2", "near-contract-standards", - "near-crypto 0.21.2", - "near-jsonrpc-client 0.9.0", - "near-primitives 0.21.2", + "near-crypto 0.28.0", + "near-jsonrpc-client", + "near-primitives 0.28.0", "near-rpc-client", "near-token", "omni-types", @@ -5659,55 +5034,22 @@ dependencies = [ "tracing", ] -[[package]] -name = "near-cache" -version = "0.21.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b222afeb8daa3849626f0ce713806ce8be2b33e4aac54913dc7ef1db1fa83d7" -dependencies = [ - "lru 0.7.8", -] - -[[package]] -name = "near-chain-configs" -version = "0.21.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ac5ca8d44a732193603e117f57d490b8c29b1e8e756abb3f12d4eb19443cd1d" -dependencies = [ - "anyhow", - "bytesize", - "chrono", - "derive_more 0.99.18", - "near-config-utils 0.21.2", - "near-crypto 0.21.2", - "near-parameters 0.21.2", - "near-primitives 0.21.2", - "num-rational 0.3.2", - "once_cell", - "serde", - "serde_json", - "sha2 0.10.8", - "smart-default", - "tracing", -] - [[package]] name = "near-chain-configs" -version = "0.26.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0784e55d9dee91ca830c6199d15ad18fc628f930a5d0946bb0949956026dd64f" +checksum = "4c1f312b5e1cdb6d6eb8a753de5798fe70fc2aa048b37d9a08a8d63f5623707d" dependencies = [ "anyhow", "bytesize", "chrono", "derive_more 0.99.18", - "near-config-utils 0.26.0", - "near-crypto 0.26.0", - "near-parameters 0.26.0", - "near-primitives 0.26.0", - "near-time 0.26.0", + "near-config-utils 0.28.0", + "near-crypto 0.28.0", + "near-parameters 0.28.0", + "near-primitives 0.28.0", + "near-time 0.28.0", "num-rational 0.3.2", - "once_cell", "serde", "serde_json", "sha2 0.10.8", @@ -5718,9 +5060,9 @@ dependencies = [ [[package]] name = "near-config-utils" -version = "0.21.2" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae1c9ff519efa8c778d341fa34971dee93e8adf4e8ae51feaefaa63bdf7e496a" +checksum = "4e7b41110a20f1d82bb06f06e4800068c5ade6d8ff844787f8753bc2ce7b16f7" dependencies = [ "anyhow", "json_comments", @@ -5730,58 +5072,44 @@ dependencies = [ [[package]] name = "near-config-utils" -version = "0.26.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d96c1682d13e9a8a62ea696395bf17afc4ed4b60535223251168217098c27a50" +checksum = "bedc768765dd8229a1d960c94f517317f40771a003e78916124784c7d6ea9d74" dependencies = [ "anyhow", "json_comments", - "thiserror 1.0.69", + "thiserror 2.0.11", "tracing", ] [[package]] -name = "near-config-utils" -version = "0.27.0" +name = "near-contract-standards" +version = "5.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7b41110a20f1d82bb06f06e4800068c5ade6d8ff844787f8753bc2ce7b16f7" -dependencies = [ - "anyhow", - "json_comments", - "thiserror 1.0.69", - "tracing", -] - -[[package]] -name = "near-contract-standards" -version = "5.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b8bc68a8c2bac5e44b38e322e41cadeefe33f766993bf067375b63cc860a73b" +checksum = "6b8bc68a8c2bac5e44b38e322e41cadeefe33f766993bf067375b63cc860a73b" dependencies = [ "near-sdk", ] [[package]] name = "near-crypto" -version = "0.21.2" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d927e95742aea981b9fd60996fbeba3b61e90acafd54c2c3c2a4ed40065ff03" +checksum = "43b17944c8d0f274c684227d79fcd46d583b1e36064b597c53a9ebec187a86f3" dependencies = [ - "blake2 0.9.2", - "borsh 1.5.3", + "blake2", + "borsh 1.5.4", "bs58 0.4.0", - "c2-chacha", "curve25519-dalek 4.1.3", "derive_more 0.99.18", "ed25519-dalek 2.1.1", "hex", "near-account-id", - "near-config-utils 0.21.2", - "near-stdx 0.21.2", - "once_cell", + "near-config-utils 0.27.0", + "near-schema-checker-lib 0.27.0", + "near-stdx 0.27.0", "primitive-types 0.10.1", - "rand 0.7.3", - "secp256k1 0.27.0", + "secp256k1", "serde", "serde_json", "subtle", @@ -5790,80 +5118,46 @@ dependencies = [ [[package]] name = "near-crypto" -version = "0.26.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "907fdcefa3a42976cd6a8bf626fe2a87eb0d3b3ff144adc67cf32d53c9494b32" +checksum = "4374804fdd45ac84c9e7cc3183312c98560c5518d81e6d8e2d92b77587e5a9f3" dependencies = [ - "blake2 0.10.6", - "borsh 1.5.3", + "blake2", + "borsh 1.5.4", "bs58 0.4.0", "curve25519-dalek 4.1.3", "derive_more 0.99.18", "ed25519-dalek 2.1.1", "hex", "near-account-id", - "near-config-utils 0.26.0", - "near-stdx 0.26.0", - "once_cell", + "near-config-utils 0.28.0", + "near-schema-checker-lib 0.28.0", + "near-stdx 0.28.0", "primitive-types 0.10.1", "rand 0.8.5", - "secp256k1 0.27.0", - "serde", - "serde_json", - "subtle", - "thiserror 1.0.69", -] - -[[package]] -name = "near-crypto" -version = "0.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43b17944c8d0f274c684227d79fcd46d583b1e36064b597c53a9ebec187a86f3" -dependencies = [ - "blake2 0.10.6", - "borsh 1.5.3", - "bs58 0.4.0", - "curve25519-dalek 4.1.3", - "derive_more 0.99.18", - "ed25519-dalek 2.1.1", - "hex", - "near-account-id", - "near-config-utils 0.27.0", - "near-schema-checker-lib", - "near-stdx 0.27.0", - "primitive-types 0.10.1", - "secp256k1 0.27.0", + "secp256k1", "serde", "serde_json", "subtle", - "thiserror 1.0.69", + "thiserror 2.0.11", ] [[package]] name = "near-fmt" -version = "0.21.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a9aa862014eeedb79df494b1b8080c5b51cd014f978183e08a7918a50350558" -dependencies = [ - "near-primitives-core 0.21.2", -] - -[[package]] -name = "near-fmt" -version = "0.26.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a36518bfcf2177096d4298d9158ba698ffd6944cb035ecc0938b098337b933c" +checksum = "b1eff0731995774d1498f017c968a3ebbfdadad84f556afea4b83679f6706ac9" dependencies = [ - "near-primitives-core 0.26.0", + "near-primitives-core 0.27.0", ] [[package]] name = "near-fmt" -version = "0.27.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1eff0731995774d1498f017c968a3ebbfdadad84f556afea4b83679f6706ac9" +checksum = "f14f36eee2dcb0ecd8febb9f198e0e1fa768c834db9e1982ad2acfcd04b45acf" dependencies = [ - "near-primitives-core 0.27.0", + "near-primitives-core 0.28.0", ] [[package]] @@ -5872,7 +5166,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "180edcc7dc2fac41f93570d0c7b759c1b6d492f6ad093d749d644a40b4310a97" dependencies = [ - "borsh 1.5.3", + "borsh 1.5.4", "serde", ] @@ -5889,72 +5183,37 @@ dependencies = [ [[package]] name = "near-jsonrpc-client" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5225c0f97a61fd4534dee3169959dd91bb812be7d0573c1130a3cf86fd16b3e" -dependencies = [ - "borsh 1.5.3", - "lazy_static", - "log", - "near-chain-configs 0.21.2", - "near-crypto 0.21.2", - "near-jsonrpc-primitives 0.21.2", - "near-primitives 0.21.2", - "reqwest 0.11.27", - "serde", - "serde_json", - "thiserror 1.0.69", -] - -[[package]] -name = "near-jsonrpc-client" -version = "0.13.0" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "161fdc8f73fd9e19a97e05acb10e985ba89bd06e88543cdfd0c8dad0dac266c5" +checksum = "e66a0c4c47f2fbbfa11ea8317fce2288d70d4aa8231e77fd213721ffcc1c334f" dependencies = [ - "borsh 1.5.3", + "borsh 1.5.4", "lazy_static", "log", - "near-chain-configs 0.26.0", - "near-crypto 0.26.0", - "near-jsonrpc-primitives 0.26.0", - "near-primitives 0.26.0", - "reqwest 0.12.9", - "serde", - "serde_json", - "thiserror 1.0.69", -] - -[[package]] -name = "near-jsonrpc-primitives" -version = "0.21.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63ba17af2bc4208fdc4f6a8088842ad1f0165ac46d8259db6a2719f15d039e06" -dependencies = [ - "arbitrary", - "near-chain-configs 0.21.2", - "near-crypto 0.21.2", - "near-primitives 0.21.2", - "near-rpc-error-macro 0.21.2", + "near-chain-configs", + "near-crypto 0.28.0", + "near-jsonrpc-primitives", + "near-primitives 0.28.0", + "reqwest 0.12.12", "serde", "serde_json", - "thiserror 1.0.69", + "thiserror 2.0.11", ] [[package]] name = "near-jsonrpc-primitives" -version = "0.26.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b24bfd0fedef42e07daa79e463a7908e9abee4f6de3532e0e1dde45f6951657" +checksum = "90f445f809d1f227f0f61f38c14271635c0bc9a28a8f74a803a4fb25292d5ea7" dependencies = [ "arbitrary", - "near-chain-configs 0.26.0", - "near-crypto 0.26.0", - "near-primitives 0.26.0", - "near-rpc-error-macro 0.26.0", + "near-chain-configs", + "near-crypto 0.28.0", + "near-primitives 0.28.0", + "near-schema-checker-lib 0.28.0", "serde", "serde_json", - "thiserror 1.0.69", + "thiserror 2.0.11", "time", ] @@ -5975,7 +5234,7 @@ dependencies = [ "derive_builder 0.13.1", "futures", "near-indexer-primitives", - "reqwest 0.12.9", + "reqwest 0.12.12", "serde", "serde_json", "thiserror 1.0.69", @@ -5987,77 +5246,12 @@ dependencies = [ [[package]] name = "near-light-client-on-eth" version = "0.1.0" -source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs?branch=refactor%2Fsolana-bridge-client#dc416510fc760d22fdf047ac42d68d75da63b0e6" +source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs#0742379055277a83856de23c7b1cba90a297c2b3" dependencies = [ "ethereum-types 0.14.1", "ethers", - "thiserror 2.0.9", - "tokio", -] - -[[package]] -name = "near-o11y" -version = "0.21.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b64d008979998e436ac5ad2e60326d1a7f2d30dcb5a22c1a4657159f7f284342" -dependencies = [ - "actix", - "base64 0.21.7", - "clap", - "near-crypto 0.21.2", - "near-fmt 0.21.2", - "near-primitives-core 0.21.2", - "once_cell", - "opentelemetry", - "opentelemetry-otlp", - "opentelemetry-semantic-conventions", - "prometheus", - "serde", - "serde_json", - "strum 0.24.1", - "thiserror 1.0.69", + "thiserror 2.0.11", "tokio", - "tracing", - "tracing-appender", - "tracing-opentelemetry", - "tracing-subscriber", -] - -[[package]] -name = "near-parameters" -version = "0.21.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a996c8654020f7eb3c11039cb39123fd4cd78654fde4c9e7c3fd6d092c84f342" -dependencies = [ - "assert_matches", - "borsh 1.5.3", - "enum-map", - "near-account-id", - "near-primitives-core 0.21.2", - "num-rational 0.3.2", - "serde", - "serde_repr", - "serde_yaml", - "strum 0.24.1", - "thiserror 1.0.69", -] - -[[package]] -name = "near-parameters" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e41afea5c5e84763586bafc5f5e1b63d90ef4e5454e18406cab8df120178db8d" -dependencies = [ - "borsh 1.5.3", - "enum-map", - "near-account-id", - "near-primitives-core 0.26.0", - "num-rational 0.3.2", - "serde", - "serde_repr", - "serde_yaml", - "strum 0.24.1", - "thiserror 1.0.69", ] [[package]] @@ -6066,11 +5260,11 @@ version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d4b4d014ac9f46baf0eeac7214567a08db97d5fd26157ea13edfbb8ffc5fd8c" dependencies = [ - "borsh 1.5.3", + "borsh 1.5.4", "enum-map", "near-account-id", "near-primitives-core 0.27.0", - "near-schema-checker-lib", + "near-schema-checker-lib 0.27.0", "num-rational 0.3.2", "serde", "serde_repr", @@ -6080,56 +5274,34 @@ dependencies = [ ] [[package]] -name = "near-primitives" -version = "0.21.2" +name = "near-parameters" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c880397c022d3b8f592cef18f85fd6e79181a2a04c31154afb1730f9fa21098" +checksum = "1279baa276725971d5e2b80c524d1aa42d5ad8bccf8901466fd579374cf58a14" dependencies = [ - "arbitrary", - "base64 0.21.7", - "borsh 1.5.3", - "bytesize", - "cfg-if 1.0.0", - "chrono", - "derive_more 0.99.18", - "easy-ext", + "borsh 1.5.4", "enum-map", - "hex", - "near-crypto 0.21.2", - "near-fmt 0.21.2", - "near-o11y", - "near-parameters 0.21.2", - "near-primitives-core 0.21.2", - "near-rpc-error-macro 0.21.2", - "near-stdx 0.21.2", - "near-vm-runner", + "near-account-id", + "near-primitives-core 0.28.0", + "near-schema-checker-lib 0.28.0", "num-rational 0.3.2", - "once_cell", - "primitive-types 0.10.1", - "rand 0.8.5", - "rand_chacha 0.3.1", - "reed-solomon-erasure", "serde", - "serde_json", - "serde_with", + "serde_repr", "serde_yaml", - "sha3", - "smart-default", "strum 0.24.1", - "thiserror 1.0.69", - "time", - "tracing", + "thiserror 2.0.11", ] [[package]] name = "near-primitives" -version = "0.26.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "165c2dc0fc20d839cfd7948d930ef5e8a4ed2b095abe83e0076ef5d4a5df58ed" +checksum = "b45b4742a1817ff7d80dcf51c6facb8134478f8c4a6d717825cca2e4b834b17f" dependencies = [ "arbitrary", "base64 0.21.7", - "borsh 1.5.3", + "bitvec", + "borsh 1.5.4", "bytes", "bytesize", "cfg-if 1.0.0", @@ -6138,21 +5310,16 @@ dependencies = [ "easy-ext", "enum-map", "hex", - "itertools 0.10.5", - "near-crypto 0.26.0", - "near-fmt 0.26.0", - "near-parameters 0.26.0", - "near-primitives-core 0.26.0", - "near-rpc-error-macro 0.26.0", - "near-stdx 0.26.0", - "near-structs-checker-lib", - "near-time 0.26.0", + "near-crypto 0.27.0", + "near-fmt 0.27.0", + "near-parameters 0.27.0", + "near-primitives-core 0.27.0", + "near-schema-checker-lib 0.27.0", + "near-stdx 0.27.0", + "near-time 0.27.0", "num-rational 0.3.2", - "once_cell", "ordered-float", "primitive-types 0.10.1", - "rand 0.8.5", - "rand_chacha 0.3.1", "serde", "serde_json", "serde_with", @@ -6166,14 +5333,14 @@ dependencies = [ [[package]] name = "near-primitives" -version = "0.27.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b45b4742a1817ff7d80dcf51c6facb8134478f8c4a6d717825cca2e4b834b17f" +checksum = "6ab6ecc354e61c40b044c8b553c187383a587a1679d2e594f0b98ca58dbfb6e3" dependencies = [ "arbitrary", "base64 0.21.7", "bitvec", - "borsh 1.5.3", + "borsh 1.5.4", "bytes", "bytesize", "cfg-if 1.0.0", @@ -6182,63 +5349,44 @@ dependencies = [ "easy-ext", "enum-map", "hex", - "near-crypto 0.27.0", - "near-fmt 0.27.0", - "near-parameters 0.27.0", - "near-primitives-core 0.27.0", - "near-schema-checker-lib", - "near-stdx 0.27.0", - "near-time 0.27.0", + "itertools 0.10.5", + "near-crypto 0.28.0", + "near-fmt 0.28.0", + "near-parameters 0.28.0", + "near-primitives-core 0.28.0", + "near-schema-checker-lib 0.28.0", + "near-stdx 0.28.0", + "near-time 0.28.0", "num-rational 0.3.2", "ordered-float", "primitive-types 0.10.1", + "rand 0.8.5", + "rand_chacha 0.3.1", "serde", "serde_json", "serde_with", "sha3", "smart-default", "strum 0.24.1", - "thiserror 1.0.69", + "thiserror 2.0.11", "tracing", "zstd 0.13.2", ] [[package]] name = "near-primitives-core" -version = "0.21.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "082b1d3f6c7e273ec5cd9588e00bdbfc51be6cc9a3a7ec31fc899b4b7d2d3f9d" -dependencies = [ - "arbitrary", - "base64 0.21.7", - "borsh 1.5.3", - "bs58 0.4.0", - "derive_more 0.99.18", - "enum-map", - "near-account-id", - "num-rational 0.3.2", - "serde", - "serde_repr", - "serde_with", - "sha2 0.10.8", - "strum 0.24.1", - "thiserror 1.0.69", -] - -[[package]] -name = "near-primitives-core" -version = "0.26.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51fd53f992168589c52022dd220c84a7f2ede92251631a06a3817e4b22af5836" +checksum = "0de2c9da5de096b5cd4786a270900ff32a49d267e442a2e7f271fb23eb925c87" dependencies = [ "arbitrary", "base64 0.21.7", - "borsh 1.5.3", + "borsh 1.5.4", "bs58 0.4.0", "derive_more 0.99.18", "enum-map", "near-account-id", - "near-structs-checker-lib", + "near-schema-checker-lib 0.27.0", "num-rational 0.3.2", "serde", "serde_repr", @@ -6248,108 +5396,85 @@ dependencies = [ [[package]] name = "near-primitives-core" -version = "0.27.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0de2c9da5de096b5cd4786a270900ff32a49d267e442a2e7f271fb23eb925c87" +checksum = "d597af103bb7881d1fb9031fb126cfe6c1acb9c9a6c8296dca45b5b3beb0893d" dependencies = [ "arbitrary", "base64 0.21.7", - "borsh 1.5.3", + "borsh 1.5.4", "bs58 0.4.0", "derive_more 0.99.18", "enum-map", "near-account-id", - "near-schema-checker-lib", + "near-schema-checker-lib 0.28.0", "num-rational 0.3.2", "serde", "serde_repr", "sha2 0.10.8", - "thiserror 1.0.69", + "thiserror 2.0.11", ] [[package]] name = "near-rpc-client" version = "0.1.0" -source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs?branch=refactor%2Fsolana-bridge-client#dc416510fc760d22fdf047ac42d68d75da63b0e6" +source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs#0742379055277a83856de23c7b1cba90a297c2b3" dependencies = [ - "borsh 1.5.3", + "borsh 1.5.4", "lazy_static", - "near-crypto 0.21.2", - "near-jsonrpc-client 0.9.0", - "near-jsonrpc-primitives 0.21.2", - "near-primitives 0.21.2", - "reqwest 0.11.27", + "near-crypto 0.28.0", + "near-jsonrpc-client", + "near-jsonrpc-primitives", + "near-primitives 0.28.0", + "reqwest 0.12.12", "serde_json", - "thiserror 2.0.9", + "thiserror 2.0.11", "tokio", ] [[package]] -name = "near-rpc-error-core" -version = "0.21.2" +name = "near-schema-checker-core" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3610517a56329b7cce0c8c4cf2686fc4bbe0b155181b118acf20d2a301bf29b6" -dependencies = [ - "quote", - "serde", - "syn 2.0.91", -] +checksum = "03541d1dadd0b5dd0a2e1ae1fbe5735fdab79332ed556af36cdcbe50d4b8cf04" [[package]] -name = "near-rpc-error-core" -version = "0.26.0" +name = "near-schema-checker-core" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df598b0785a3e36d7e4fb73afcdf20536988b13d07cead71dfa777db4783e552" -dependencies = [ - "quote", - "serde", - "syn 2.0.91", -] +checksum = "a48405425eca34de98e680416310df33fdb75768a78481cc75b43172b2748613" [[package]] -name = "near-rpc-error-macro" -version = "0.21.2" +name = "near-schema-checker-lib" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa8db2fd2a6dbab8c56908e983f41570341e391daddb0d4c430746c6971107e3" +checksum = "fa9050b0822d2c0dbd90d8c523fd74634f77c5be4ed3337e7010c0d986121982" dependencies = [ - "fs2", - "near-rpc-error-core 0.21.2", - "serde", - "syn 2.0.91", + "near-schema-checker-core 0.27.0", + "near-schema-checker-macro 0.27.0", ] [[package]] -name = "near-rpc-error-macro" -version = "0.26.0" +name = "near-schema-checker-lib" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "647ef261df99ad877c08c97af2f10368c8b8cde0968250d3482a5a249e9f3926" +checksum = "dfb720bf5cc256af687a9eb7a6e05baf3668dc75cfd43098e83ba1b3d3900f08" dependencies = [ - "near-rpc-error-core 0.26.0", - "serde", - "syn 2.0.91", + "near-schema-checker-core 0.28.0", + "near-schema-checker-macro 0.28.0", ] [[package]] -name = "near-schema-checker-core" -version = "0.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03541d1dadd0b5dd0a2e1ae1fbe5735fdab79332ed556af36cdcbe50d4b8cf04" - -[[package]] -name = "near-schema-checker-lib" +name = "near-schema-checker-macro" version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa9050b0822d2c0dbd90d8c523fd74634f77c5be4ed3337e7010c0d986121982" -dependencies = [ - "near-schema-checker-core", - "near-schema-checker-macro", -] +checksum = "a1bca8c93ff0ad17138c147323a07f036d11c9e1602e3bc2ac9d29c3cf78b89d" [[package]] name = "near-schema-checker-macro" -version = "0.27.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1bca8c93ff0ad17138c147323a07f036d11c9e1602e3bc2ac9d29c3cf78b89d" +checksum = "b41a159cbf732acc0279febdde046d9036330a32a951796bce42f9529bce799d" [[package]] name = "near-sdk" @@ -6358,7 +5483,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "befb9df6da1a6a0b6656388c0db76084867062a87f1cbc066c188a8e360b6463" dependencies = [ "base64 0.22.1", - "borsh 1.5.3", + "borsh 1.5.4", "bs58 0.5.1", "near-account-id", "near-gas", @@ -6385,21 +5510,9 @@ dependencies = [ "serde_json", "strum 0.26.3", "strum_macros 0.26.4", - "syn 2.0.91", + "syn 2.0.96", ] -[[package]] -name = "near-stdx" -version = "0.21.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73a697f311c110d0fabae6c8c49ab0a8eff0ec37df82cc860deba92156e77c43" - -[[package]] -name = "near-stdx" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d5c43f6181873287ddaa25edcc2943d0f2d5da9588231516f2ed0549db1fbac" - [[package]] name = "near-stdx" version = "0.27.0" @@ -6407,26 +5520,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "427b4e4af5e32f682064772da8b1a7558b3f090e6151c8804cff24ee6c5c4966" [[package]] -name = "near-structs-checker-core" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e53379bee876286de4ad31dc7f9fde8db12527c39d401d94f4d42cd021b8fce" - -[[package]] -name = "near-structs-checker-lib" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f984805f225c9b19681a124af7783078459e87ea63dde751b62e7cb404b1d6a" -dependencies = [ - "near-structs-checker-core", - "near-structs-checker-macro", -] - -[[package]] -name = "near-structs-checker-macro" -version = "0.26.0" +name = "near-stdx" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66319954983ae164fd0b714ae9d8b09edc26c74d9b3a1f51e564bb14720adb8e" +checksum = "7a91674768828a593f4bac4aeca9334c4b56fe19344a2ccf7bd795b2325f0b5e" [[package]] name = "near-sys" @@ -6436,21 +5533,19 @@ checksum = "dbf4ca5c805cb78700e10e43484902d8da05f25788db277999d209568aaf4c8e" [[package]] name = "near-time" -version = "0.26.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1d37b864f04d9aebbc3b88ac63ba989d94f221de694bcc8af639cc284a89f64" +checksum = "66ade805f0ca8211f0ca2e6ea130f8ddd03bf70c9c93ebeabdddf37314e3f30b" dependencies = [ - "once_cell", "serde", "time", - "tokio", ] [[package]] name = "near-time" -version = "0.27.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66ade805f0ca8211f0ca2e6ea130f8ddd03bf70c9c93ebeabdddf37314e3f30b" +checksum = "c92bf9dffb11126e8db9a6a51bcb330c8584d0bab0d6d14c20cf2ff1f16d684d" dependencies = [ "serde", "time", @@ -6462,192 +5557,27 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd3e60aa26a74dc514b1b6408fdd06cefe2eb0ff029020956c1c6517594048fd" dependencies = [ - "borsh 1.5.3", + "borsh 1.5.4", "serde", ] [[package]] -name = "near-vm-compiler" -version = "0.21.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d6c12977e11cbc33921c367a8ae949317d099025c96531702d3afed6e5f44ce" -dependencies = [ - "enumset", - "finite-wasm", - "near-vm-types", - "near-vm-vm", - "rkyv", - "smallvec", - "target-lexicon 0.12.16", - "thiserror 1.0.69", - "tracing", - "wasmparser 0.99.0", -] - -[[package]] -name = "near-vm-compiler-singlepass" -version = "0.21.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f883363f5d05502035f0f6c0416078fdf535557dbffc1b4177aaab87bd448528" -dependencies = [ - "dynasm 2.0.0", - "dynasmrt 2.0.0", - "enumset", - "finite-wasm", - "lazy_static", - "memoffset 0.8.0", - "more-asserts", - "near-vm-compiler", - "near-vm-types", - "near-vm-vm", - "rayon", - "smallvec", - "strum 0.24.1", - "tracing", -] - -[[package]] -name = "near-vm-engine" -version = "0.21.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c758c7ad8d551eafefd783aa286c2fa95f4ad6e89efedf1bd5f8629efd529ac" -dependencies = [ - "backtrace", - "cfg-if 1.0.0", - "enumset", - "finite-wasm", - "lazy_static", - "memmap2", - "more-asserts", - "near-vm-compiler", - "near-vm-types", - "near-vm-vm", - "region", - "rkyv", - "rustc-demangle", - "target-lexicon 0.12.16", - "thiserror 1.0.69", - "tracing", -] - -[[package]] -name = "near-vm-runner" -version = "0.21.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20569500ca56e161c6ed81da9a24c7bf7b974c4238b2f08b2582113b66fa0060" -dependencies = [ - "anyhow", - "base64 0.21.7", - "borsh 1.5.3", - "ed25519-dalek 2.1.1", - "enum-map", - "finite-wasm", - "loupe", - "memoffset 0.8.0", - "near-cache", - "near-crypto 0.21.2", - "near-parameters 0.21.2", - "near-primitives-core 0.21.2", - "near-stdx 0.21.2", - "near-vm-compiler", - "near-vm-compiler-singlepass", - "near-vm-engine", - "near-vm-types", - "near-vm-vm", - "num-rational 0.3.2", - "once_cell", - "parity-wasm 0.41.0", - "parity-wasm 0.42.2", - "prefix-sum-vec", - "pwasm-utils", - "ripemd", - "serde", - "serde_repr", - "serde_with", - "sha2 0.10.8", - "sha3", - "strum 0.24.1", - "thiserror 1.0.69", - "tracing", - "wasm-encoder 0.27.0", - "wasmer-compiler-near", - "wasmer-compiler-singlepass-near", - "wasmer-engine-near", - "wasmer-engine-universal-near", - "wasmer-runtime-core-near", - "wasmer-runtime-near", - "wasmer-types-near", - "wasmer-vm-near", - "wasmparser 0.78.2", - "wasmtime", - "zeropool-bn", -] - -[[package]] -name = "near-vm-types" -version = "0.21.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5e894a085d2a9ed4e8f10ae8766c95fa77b5aa47d3c0e85b89af22d5b253491" -dependencies = [ - "indexmap 1.9.3", - "num-traits", - "rkyv", - "thiserror 1.0.69", -] - -[[package]] -name = "near-vm-vm" -version = "0.21.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c98a68706832b567cafa03375d40512bba8d95ae6d3b760f340b22a4b97893" -dependencies = [ - "backtrace", - "cc", - "cfg-if 1.0.0", - "finite-wasm", - "indexmap 1.9.3", - "libc", - "memoffset 0.8.0", - "more-asserts", - "near-vm-types", - "region", - "rkyv", - "thiserror 1.0.69", - "tracing", - "wasmparser 0.99.0", - "winapi", -] - -[[package]] -name = "new_debug_unreachable" -version = "1.0.6" +name = "new_debug_unreachable" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" -[[package]] -name = "nix" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b2e0b4f3320ed72aaedb9a5ac838690a8047c7b275da22711fddff4f8a14229" -dependencies = [ - "bitflags 1.3.2", - "cc", - "cfg-if 0.1.10", - "libc", - "void", -] - [[package]] name = "nix" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.7.0", "cfg-if 1.0.0", "cfg_aliases", "libc", - "memoffset 0.9.1", + "memoffset", ] [[package]] @@ -6672,16 +5602,6 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38bf9645c8b145698bb0b18a4637dcacbc421ea49bef2317e4fd8065a387cf21" -[[package]] -name = "nu-ansi-term" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" -dependencies = [ - "overload", - "winapi", -] - [[package]] name = "num" version = "0.2.1" @@ -6763,7 +5683,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.96", ] [[package]] @@ -6849,7 +5769,7 @@ dependencies = [ "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.96", ] [[package]] @@ -6860,9 +5780,9 @@ checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" [[package]] name = "nybbles" -version = "0.3.0" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55a62e678a89501192cc5ebf47dcbc656b608ae5e1c61c9251fe35230f119fe3" +checksum = "8983bb634df7248924ee0c4c3a749609b5abcb082c28fffe3254b3eb3602b307" dependencies = [ "alloy-rlp", "const-hex", @@ -6871,18 +5791,6 @@ dependencies = [ "smallvec", ] -[[package]] -name = "object" -version = "0.32.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" -dependencies = [ - "crc32fast", - "hashbrown 0.14.5", - "indexmap 2.7.0", - "memchr", -] - [[package]] name = "object" version = "0.36.7" @@ -6904,9 +5812,9 @@ dependencies = [ [[package]] name = "omni-connector" version = "0.1.0" -source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs?branch=refactor%2Fsolana-bridge-client#dc416510fc760d22fdf047ac42d68d75da63b0e6" +source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs#0742379055277a83856de23c7b1cba90a297c2b3" dependencies = [ - "borsh 1.5.3", + "borsh 1.5.4", "bridge-connector-common", "derive_builder 0.20.2", "eth-proof", @@ -6915,9 +5823,9 @@ dependencies = [ "hex", "near-bridge-client", "near-contract-standards", - "near-crypto 0.21.2", - "near-jsonrpc-client 0.9.0", - "near-primitives 0.21.2", + "near-crypto 0.28.0", + "near-jsonrpc-client", + "near-primitives 0.28.0", "near-rpc-client", "near-token", "omni-types", @@ -6935,7 +5843,7 @@ version = "0.1.0" dependencies = [ "alloy", "anyhow", - "borsh 1.5.3", + "borsh 1.5.4", "chrono", "clap", "dotenv", @@ -6946,17 +5854,16 @@ dependencies = [ "hex", "log", "near-bridge-client", - "near-crypto 0.26.0", - "near-jsonrpc-client 0.13.0", - "near-jsonrpc-primitives 0.26.0", + "near-crypto 0.28.0", + "near-jsonrpc-client", + "near-jsonrpc-primitives", "near-lake-framework", - "near-primitives 0.26.0", + "near-primitives 0.28.0", "omni-connector", "omni-types", "pretty_env_logger", "redis", - "reqwest 0.12.9", - "secp256k1 0.30.0", + "reqwest 0.12.12", "serde", "serde_json", "solana-bridge-client", @@ -6978,7 +5885,7 @@ dependencies = [ "alloy-rlp", "alloy-sol-macro", "alloy-sol-types", - "borsh 1.5.3", + "borsh 1.5.4", "ethereum-types 0.15.1", "hex", "near-contract-standards", @@ -7032,7 +5939,7 @@ version = "0.10.68" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.7.0", "cfg-if 1.0.0", "foreign-types", "libc", @@ -7049,7 +5956,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.96", ] [[package]] @@ -7080,54 +5987,6 @@ dependencies = [ "vcpkg", ] -[[package]] -name = "opentelemetry" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6105e89802af13fdf48c49d7646d3b533a70e536d818aae7e78ba0433d01acb8" -dependencies = [ - "async-trait", - "crossbeam-channel", - "futures-channel", - "futures-executor", - "futures-util", - "js-sys", - "lazy_static", - "percent-encoding", - "pin-project", - "rand 0.8.5", - "thiserror 1.0.69", - "tokio", - "tokio-stream", -] - -[[package]] -name = "opentelemetry-otlp" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d1a6ca9de4c8b00aa7f1a153bd76cb263287155cec642680d79d98706f3d28a" -dependencies = [ - "async-trait", - "futures", - "futures-util", - "http 0.2.12", - "opentelemetry", - "prost", - "thiserror 1.0.69", - "tokio", - "tonic", - "tonic-build", -] - -[[package]] -name = "opentelemetry-semantic-conventions" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "985cc35d832d412224b2cffe2f9194b1b89b6aa5d0bef76d080dce09d90e62bd" -dependencies = [ - "opentelemetry", -] - [[package]] name = "option-ext" version = "0.2.0" @@ -7140,7 +5999,7 @@ version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7bb71e1b3fa6ca1c61f383464aaf2bb0e2f8e772a1f01d486832464de363b951" dependencies = [ - "borsh 1.5.3", + "borsh 1.5.4", "num-traits", "rand 0.8.5", "serde", @@ -7152,12 +6011,6 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4030760ffd992bef45b0ae3f10ce1aba99e33464c90d14dd7c039884963ddc7a" -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - [[package]] name = "p256" version = "0.11.1" @@ -7169,16 +6022,6 @@ dependencies = [ "sha2 0.10.8", ] -[[package]] -name = "page_size" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eebde548fbbf1ea81a99b128872779c437752fb99f217c45245e1a61dcd9edcd" -dependencies = [ - "libc", - "winapi", -] - [[package]] name = "parity-scale-codec" version = "3.6.12" @@ -7205,56 +6048,20 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "parity-wasm" -version = "0.41.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddfc878dac00da22f8f61e7af3157988424567ab01d9920b962ef7dcbd7cd865" - -[[package]] -name = "parity-wasm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be5e13c266502aadf83426d87d81a0f5d1ef45b8027f5a471c360abfe4bfae92" - [[package]] name = "parking" version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" -[[package]] -name = "parking_lot" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3a704eb390aafdc107b0e392f56a82b668e3a71366993b5340f5833fd62505e" -dependencies = [ - "lock_api 0.3.4", - "parking_lot_core 0.7.3", -] - [[package]] name = "parking_lot" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ - "lock_api 0.4.12", - "parking_lot_core 0.9.10", -] - -[[package]] -name = "parking_lot_core" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b93f386bb233083c799e6e642a9d73db98c24a5deeb95ffc85bf281255dffc98" -dependencies = [ - "cfg-if 0.1.10", - "cloudabi", - "libc", - "redox_syscall 0.1.57", - "smallvec", - "winapi", + "lock_api", + "parking_lot_core", ] [[package]] @@ -7265,7 +6072,7 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if 1.0.0", "libc", - "redox_syscall 0.5.8", + "redox_syscall", "smallvec", "windows-targets 0.52.6", ] @@ -7346,7 +6153,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b7cafe60d6cf8e62e1b9b2ea516a089c008945bb5a275416789e7db0bc199dc" dependencies = [ "memchr", - "thiserror 2.0.9", + "thiserror 2.0.11", "ucd-trie", ] @@ -7372,35 +6179,35 @@ dependencies = [ [[package]] name = "phf" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" dependencies = [ "phf_macros", - "phf_shared 0.11.2", + "phf_shared 0.11.3", ] [[package]] name = "phf_generator" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" dependencies = [ - "phf_shared 0.11.2", + "phf_shared 0.11.3", "rand 0.8.5", ] [[package]] name = "phf_macros" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" +checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" dependencies = [ "phf_generator", - "phf_shared 0.11.2", + "phf_shared 0.11.3", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.96", ] [[package]] @@ -7409,43 +6216,43 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" dependencies = [ - "siphasher", + "siphasher 0.3.11", ] [[package]] name = "phf_shared" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" dependencies = [ - "siphasher", + "siphasher 1.0.1", ] [[package]] name = "pin-project" -version = "1.1.7" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" +checksum = "1e2ec53ad785f4d35dac0adea7f7dc6f1bb277ad84a680c7afefeae05d1f5916" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.7" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" +checksum = "d56a66c0c55993aa927429d0f8a0abfd74f084e4d9c192cffed01e418d83eefb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.96", ] [[package]] name = "pin-project-lite" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pin-utils" @@ -7518,12 +6325,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" -[[package]] -name = "prefix-sum-vec" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa06bd51638b6e76ac9ba9b6afb4164fa647bd2916d722f2623fbb6d1ed8bdba" - [[package]] name = "pretty_env_logger" version = "0.5.0" @@ -7536,12 +6337,12 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.25" +version = "0.2.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" +checksum = "6924ced06e1f7dfe3fa48d57b9f74f55d8915f5036121bef647ef4b204895fac" dependencies = [ "proc-macro2", - "syn 2.0.91", + "syn 2.0.96", ] [[package]] @@ -7598,30 +6399,6 @@ dependencies = [ "toml_edit", ] -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn 1.0.109", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", -] - [[package]] name = "proc-macro-error-attr2" version = "2.0.0" @@ -7641,33 +6418,18 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.96", ] [[package]] name = "proc-macro2" -version = "1.0.92" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" dependencies = [ "unicode-ident", ] -[[package]] -name = "prometheus" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d33c28a30771f7f96db69893f78b857f7450d7e0237e9c8fc6427a81bae7ed1" -dependencies = [ - "cfg-if 1.0.0", - "fnv", - "lazy_static", - "memchr", - "parking_lot 0.12.3", - "protobuf", - "thiserror 1.0.69", -] - [[package]] name = "proptest" version = "1.5.0" @@ -7676,163 +6438,64 @@ checksum = "b4c2511913b88df1637da85cc8d96ec8e43a3f8bb8ccb71ee1ac240d6f3df58d" dependencies = [ "bit-set", "bit-vec", - "bitflags 2.6.0", + "bitflags 2.7.0", "lazy_static", "num-traits", "rand 0.8.5", "rand_chacha 0.3.1", "rand_xorshift", - "regex-syntax 0.8.5", + "regex-syntax", "rusty-fork", "tempfile", "unarray", ] [[package]] -name = "prost" -version = "0.9.0" +name = "qstring" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "444879275cb4fd84958b1a1d5420d15e6fcf7c235fe47f053c9c2a80aceb6001" +checksum = "d464fae65fff2680baf48019211ce37aaec0c78e9264c84a3e484717f965104e" dependencies = [ - "bytes", - "prost-derive", + "percent-encoding", ] [[package]] -name = "prost-build" -version = "0.9.0" +name = "quanta" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62941722fb675d463659e49c4f3fe1fe792ff24fe5bbaa9c08cd3b98a1c354f5" +checksum = "3bd1fe6824cea6538803de3ff1bc0cf3949024db3d43c9643024bfb33a807c0e" dependencies = [ - "bytes", - "heck 0.3.3", - "itertools 0.10.5", - "lazy_static", - "log", - "multimap", - "petgraph", - "prost", - "prost-types", - "regex", - "tempfile", - "which", + "crossbeam-utils", + "libc", + "once_cell", + "raw-cpuid", + "wasi 0.11.0+wasi-snapshot-preview1", + "web-sys", + "winapi", ] [[package]] -name = "prost-derive" -version = "0.9.0" +name = "quick-error" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9cc1a3263e07e0bf68e96268f37665207b49560d98739662cdfaae215c720fe" -dependencies = [ - "anyhow", - "itertools 0.10.5", - "proc-macro2", - "quote", - "syn 1.0.109", -] +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] -name = "prost-types" -version = "0.9.0" +name = "quinn" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534b7a0e836e3c482d2693070f982e39e7611da9695d4d1f5a4b186b51faef0a" +checksum = "62e96808277ec6f97351a2380e6c25114bc9e67037775464979f3037c92d05ef" dependencies = [ "bytes", - "prost", -] - -[[package]] -name = "protobuf" -version = "2.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "106dd99e98437432fed6519dedecfade6a06a73bb7b2a1e019fdd2bee5778d94" - -[[package]] -name = "psm" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "200b9ff220857e53e184257720a14553b2f4aa02577d2ed9842d45d4b9654810" -dependencies = [ - "cc", -] - -[[package]] -name = "ptr_meta" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" -dependencies = [ - "ptr_meta_derive", -] - -[[package]] -name = "ptr_meta_derive" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "pwasm-utils" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f7a12f176deee919f4ba55326ee17491c8b707d0987aed822682c821b660192" -dependencies = [ - "byteorder", - "log", - "parity-wasm 0.41.0", -] - -[[package]] -name = "qstring" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d464fae65fff2680baf48019211ce37aaec0c78e9264c84a3e484717f965104e" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "quanta" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773ce68d0bb9bc7ef20be3536ffe94e223e1f365bd374108b2659fac0c65cfe6" -dependencies = [ - "crossbeam-utils", - "libc", - "once_cell", - "raw-cpuid", - "wasi 0.11.0+wasi-snapshot-preview1", - "web-sys", - "winapi", -] - -[[package]] -name = "quick-error" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" - -[[package]] -name = "quinn" -version = "0.11.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62e96808277ec6f97351a2380e6c25114bc9e67037775464979f3037c92d05ef" -dependencies = [ - "bytes", - "pin-project-lite", - "quinn-proto", - "quinn-udp", - "rustc-hash 2.1.0", - "rustls 0.23.20", - "socket2", - "thiserror 2.0.9", - "tokio", - "tracing", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls 0.23.21", + "socket2", + "thiserror 2.0.11", + "tokio", + "tracing", ] [[package]] @@ -7845,12 +6508,12 @@ dependencies = [ "getrandom 0.2.15", "rand 0.8.5", "ring 0.17.8", - "rustc-hash 2.1.0", - "rustls 0.23.20", + "rustc-hash", + "rustls 0.23.21", "rustls-pki-types", "rustls-platform-verifier", "slab", - "thiserror 2.0.9", + "thiserror 2.0.11", "tinyvec", "tracing", "web-time", @@ -7872,9 +6535,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.37" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" dependencies = [ "proc-macro2", ] @@ -7969,11 +6632,11 @@ dependencies = [ [[package]] name = "raw-cpuid" -version = "11.2.0" +version = "11.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ab240315c661615f2ee9f0f2cd32d5a7343a84d5ebcccb99d46e6637565e7b0" +checksum = "c6928fa44c097620b706542d428957635951bade7143269085389d42c8a4927e" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.7.0", ] [[package]] @@ -7998,16 +6661,14 @@ dependencies = [ [[package]] name = "redis" -version = "0.27.6" +version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09d8f99a4090c89cc489a94833c901ead69bfbf3877b4867d5482e321ee875bc" +checksum = "9f89727cba9cec05cc579942321ff6dd09fe57a8b3217f52f952301efa010da5" dependencies = [ "arc-swap", - "async-trait", "bytes", "combine 4.6.7", "futures-util", - "itertools 0.13.0", "itoa", "num-bigint 0.4.6", "percent-encoding", @@ -8016,23 +6677,17 @@ dependencies = [ "sha1_smol", "socket2", "tokio", - "tokio-util 0.7.13", + "tokio-util", "url", ] -[[package]] -name = "redox_syscall" -version = "0.1.57" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" - [[package]] name = "redox_syscall" version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.7.0", ] [[package]] @@ -8046,28 +6701,6 @@ dependencies = [ "thiserror 1.0.69", ] -[[package]] -name = "reed-solomon-erasure" -version = "4.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a415a013dd7c5d4221382329a5a3482566da675737494935cbbbcdec04662f9d" -dependencies = [ - "smallvec", -] - -[[package]] -name = "regalloc2" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad156d539c879b7a24a363a2016d77961786e71f48f2e2fc8302a92abd2429a6" -dependencies = [ - "hashbrown 0.13.2", - "log", - "rustc-hash 1.1.0", - "slice-group-by", - "smallvec", -] - [[package]] name = "regex" version = "1.11.1" @@ -8076,17 +6709,8 @@ checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.9", - "regex-syntax 0.8.5", -] - -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -dependencies = [ - "regex-syntax 0.6.29", + "regex-automata", + "regex-syntax", ] [[package]] @@ -8097,7 +6721,7 @@ checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.5", + "regex-syntax", ] [[package]] @@ -8106,39 +6730,12 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a" -[[package]] -name = "regex-syntax" -version = "0.6.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - [[package]] name = "regex-syntax" version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" -[[package]] -name = "region" -version = "3.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6b6ebd13bc009aef9cd476c1310d49ac354d36e240cf1bd753290f3dc7199a7" -dependencies = [ - "bitflags 1.3.2", - "libc", - "mach2", - "windows-sys 0.52.0", -] - -[[package]] -name = "rend" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" -dependencies = [ - "bytecheck", -] - [[package]] name = "reqwest" version = "0.11.27" @@ -8156,13 +6753,11 @@ dependencies = [ "http-body 0.4.6", "hyper 0.14.32", "hyper-rustls 0.24.2", - "hyper-tls 0.5.0", "ipnet", "js-sys", "log", "mime", "mime_guess", - "native-tls", "once_cell", "percent-encoding", "pin-project-lite", @@ -8174,9 +6769,8 @@ dependencies = [ "sync_wrapper 0.1.2", "system-configuration 0.5.1", "tokio", - "tokio-native-tls", "tokio-rustls 0.24.1", - "tokio-util 0.7.13", + "tokio-util", "tower-service", "url", "wasm-bindgen", @@ -8188,9 +6782,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.9" +version = "0.12.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" +checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da" dependencies = [ "base64 0.22.1", "bytes", @@ -8203,7 +6797,7 @@ dependencies = [ "http-body-util", "hyper 1.5.2", "hyper-rustls 0.27.5", - "hyper-tls 0.6.0", + "hyper-tls", "hyper-util", "ipnet", "js-sys", @@ -8221,6 +6815,7 @@ dependencies = [ "system-configuration 0.6.1", "tokio", "tokio-native-tls", + "tower", "tower-service", "url", "wasm-bindgen", @@ -8304,35 +6899,6 @@ dependencies = [ "digest 0.10.7", ] -[[package]] -name = "rkyv" -version = "0.7.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9008cd6385b9e161d8229e1f6549dd23c3d022f132a2ea37ac3a10ac4935779b" -dependencies = [ - "bitvec", - "bytecheck", - "bytes", - "hashbrown 0.12.3", - "ptr_meta", - "rend", - "rkyv_derive", - "seahash", - "tinyvec", - "uuid 1.11.0", -] - -[[package]] -name = "rkyv_derive" -version = "0.7.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "503d1d27590a2b0a3a4ca4c94755aa2875657196ecbf401a42eff41d7de532c0" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "rlp" version = "0.5.2" @@ -8403,12 +6969,6 @@ version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - [[package]] name = "rustc-hash" version = "2.1.0" @@ -8421,15 +6981,6 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" -[[package]] -name = "rustc_version" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -dependencies = [ - "semver 0.9.0", -] - [[package]] name = "rustc_version" version = "0.3.3" @@ -8459,12 +7010,12 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.42" +version = "0.38.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85" +checksum = "a78891ee6bf2340288408954ac787aa063d8e8817e9f53abb37c695c6d834ef6" dependencies = [ - "bitflags 2.6.0", - "errno 0.3.10", + "bitflags 2.7.0", + "errno", "libc", "linux-raw-sys", "windows-sys 0.59.0", @@ -8484,9 +7035,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.20" +version = "0.23.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5065c3f250cbd332cd894be57c40fa52387247659b14a2d6041d121547903b1b" +checksum = "8f287924602bf649d949c63dc8ac8b235fa5387d394020705b80c4eb597ce5b8" dependencies = [ "once_cell", "ring 0.17.8", @@ -8559,7 +7110,7 @@ dependencies = [ "jni", "log", "once_cell", - "rustls 0.23.20", + "rustls 0.23.21", "rustls-native-certs 0.7.3", "rustls-platform-verifier-android", "rustls-webpki 0.102.8", @@ -8598,9 +7149,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.18" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" +checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" [[package]] name = "rusty-fork" @@ -8626,7 +7177,7 @@ version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" dependencies = [ - "cipher 0.4.4", + "cipher", ] [[package]] @@ -8659,7 +7210,7 @@ dependencies = [ "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.96", ] [[package]] @@ -8673,11 +7224,11 @@ dependencies = [ [[package]] name = "schnellru" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9a8ef13a93c54d20580de1e5c413e624e53121d42fc7e2c11d10ef7f8b02367" +checksum = "356285bbf17bea63d9e52e96bd18f039672ac92b55b8cb997d6162a2a37d1649" dependencies = [ - "ahash 0.8.11", + "ahash", "cfg-if 1.0.0", "hashbrown 0.13.2", ] @@ -8716,12 +7267,6 @@ dependencies = [ "untrusted 0.9.0", ] -[[package]] -name = "seahash" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" - [[package]] name = "sec1" version = "0.3.0" @@ -8730,7 +7275,7 @@ checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" dependencies = [ "base16ct 0.1.1", "der 0.6.1", - "generic-array 0.14.7", + "generic-array", "pkcs8 0.9.0", "subtle", "zeroize", @@ -8744,7 +7289,7 @@ checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ "base16ct 0.2.0", "der 0.7.9", - "generic-array 0.14.7", + "generic-array", "pkcs8 0.10.2", "subtle", "zeroize", @@ -8757,18 +7302,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25996b82292a7a57ed3508f052cfff8640d38d32018784acd714758b43da9c8f" dependencies = [ "rand 0.8.5", - "secp256k1-sys 0.8.1", -] - -[[package]] -name = "secp256k1" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b50c5943d326858130af85e049f2661ba3c78b26589b8ab98e65e80ae44a1252" -dependencies = [ - "bitcoin_hashes", - "rand 0.8.5", - "secp256k1-sys 0.10.1", + "secp256k1-sys", ] [[package]] @@ -8780,22 +7314,13 @@ dependencies = [ "cc", ] -[[package]] -name = "secp256k1-sys" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4387882333d3aa8cb20530a17c69a3752e97837832f34f6dccc760e715001d9" -dependencies = [ - "cc", -] - [[package]] name = "security-framework" version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.7.0", "core-foundation", "core-foundation-sys", "libc", @@ -8805,30 +7330,21 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.13.0" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1863fd3768cd83c56a7f60faa4dc0d403f1b6df0a38c3c25f44b7894e45370d5" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" dependencies = [ "core-foundation-sys", "libc", ] -[[package]] -name = "semver" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" -dependencies = [ - "semver-parser 0.7.0", -] - [[package]] name = "semver" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" dependencies = [ - "semver-parser 0.10.3", + "semver-parser", ] [[package]] @@ -8840,12 +7356,6 @@ dependencies = [ "serde", ] -[[package]] -name = "semver-parser" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" - [[package]] name = "semver-parser" version = "0.10.3" @@ -8869,23 +7379,13 @@ checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" [[package]] name = "serde" -version = "1.0.216" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b9781016e935a97e8beecf0c933758c97a5520d32930e460142b4cd80c6338e" +checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" dependencies = [ "serde_derive", ] -[[package]] -name = "serde-bench" -version = "0.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d733da87e79faaac25616e33d26299a41143fd4cd42746cbb0e91d8feea243fd" -dependencies = [ - "byteorder", - "serde", -] - [[package]] name = "serde_bytes" version = "0.11.15" @@ -8897,20 +7397,20 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.216" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e" +checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.96", ] [[package]] name = "serde_json" -version = "1.0.134" +version = "1.0.135" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d00f4175c42ee48b15416f6193a959ba3a0d67fc699a0db9ad12df9f83991c7d" +checksum = "2b0d7ba2887406110130a978386c4e1befb98c674b4fba677954e4db976630d9" dependencies = [ "itoa", "memchr", @@ -8926,7 +7426,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.96", ] [[package]] @@ -8952,9 +7452,9 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.11.0" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e28bdad6db2b8340e449f7108f020b3b092e8583a9e3fb82713e1d4e71fe817" +checksum = "d6b6f7f2fcb69f747921f79f3926bd1e203fce4fef62c268dd3abfb6d86029aa" dependencies = [ "base64 0.22.1", "chrono", @@ -8970,14 +7470,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.11.0" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d846214a9854ef724f3da161b426242d8de7c1fc7de2f89bb1efcb154dca79d" +checksum = "8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e" dependencies = [ "darling 0.20.10", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.96", ] [[package]] @@ -9054,15 +7554,6 @@ dependencies = [ "cfg-if 1.0.0", ] -[[package]] -name = "sharded-slab" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" -dependencies = [ - "lazy_static", -] - [[package]] name = "shlex" version = "1.3.0" @@ -9098,21 +7589,15 @@ dependencies = [ "rand_core 0.6.4", ] -[[package]] -name = "simdutf8" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" - [[package]] name = "simple_asn1" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085" +checksum = "297f631f50729c8c99b84667867963997ec0b50f32b2a7dbcab828ef0541e8bb" dependencies = [ "num-bigint 0.4.6", "num-traits", - "thiserror 1.0.69", + "thiserror 2.0.11", "time", ] @@ -9122,6 +7607,12 @@ version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" +[[package]] +name = "siphasher" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" + [[package]] name = "slab" version = "0.4.9" @@ -9131,12 +7622,6 @@ dependencies = [ "autocfg", ] -[[package]] -name = "slice-group-by" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "826167069c09b99d56f31e9ae5c99049e932a98c9dc2dac47645b08dbbf76ba7" - [[package]] name = "smallvec" version = "1.13.2" @@ -9169,9 +7654,9 @@ dependencies = [ [[package]] name = "solana-account" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5b4e43476f7e13b6a8f571008cc6aff6ff0cae6e9c71ca96e6feb787e3409fd" +checksum = "5fb7cd6b50247886f9ef190d14896c85a4337fe0e648a9aba162a0b2d283cae2" dependencies = [ "bincode", "serde", @@ -9183,9 +7668,9 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c195abdb9665bb390eda3972b750d04f87a5b023cfde6674a61b03452de15585" +checksum = "194e5681f7e3bf1793b5eef31a9fab168a1cbcb3804596621cd0bd1e4d7326c3" dependencies = [ "Inflector", "base64 0.22.1", @@ -9209,9 +7694,9 @@ dependencies = [ [[package]] name = "solana-account-decoder-client-types" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88b743d836d14dea475cc0a82a3f31316563888af97d06f5575a90f8ceb859f2" +checksum = "56d41a30d7036e425ccdc8db5263c16f3f04ea5cd6795a4aa4f509443335c0c4" dependencies = [ "base64 0.22.1", "bs58 0.5.1", @@ -9225,9 +7710,9 @@ dependencies = [ [[package]] name = "solana-account-info" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42051fa2def3a2d9123f0e33b62a983b25c13d153a30e707b14d3c3b79a91592" +checksum = "e053b991f91fd274df53e070c77a0a6a33681a5102c6421a0ca9ffaa0040368a" dependencies = [ "bincode", "serde", @@ -9238,18 +7723,18 @@ dependencies = [ [[package]] name = "solana-atomic-u64" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10dad9cf8527bbf74d3668505f563bd362e2e14d0fc77338d20973e881bbad0b" +checksum = "966dce88672728380c476d5d3e54c02025875100b8246db05669961806c9575e" dependencies = [ - "parking_lot 0.12.3", + "parking_lot", ] [[package]] name = "solana-bincode" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e3b178d3783809a2480c542cd7c57c06e1bab2c0f21562fcb8cd13eabd0138e" +checksum = "c117b9646b1e9e6c4b48f363ad4c5af25c4ab35754ff307714e5fec2c3c4bb6b" dependencies = [ "bincode", "serde", @@ -9258,9 +7743,9 @@ dependencies = [ [[package]] name = "solana-bn254" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8f9c849dac8e6ef87c3c8035886df648ef5ec4c6d9d45b96fc045477e23a9b0" +checksum = "12227c0e89785367be826b51452807c36f31c4f25cf8891da259b699e0de882d" dependencies = [ "ark-bn254", "ark-ec", @@ -9273,36 +7758,35 @@ dependencies = [ [[package]] name = "solana-borsh" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "870197ea4929500d8e6f624c3eb578912b5063bbd5c8bfbe87396cd5b4257465" +checksum = "7c55b83c305eac62095b6f24ea2ae729f17de47e5a4e866ee4ddd0dc501b351e" dependencies = [ "borsh 0.10.4", - "borsh 1.5.3", + "borsh 1.5.4", ] [[package]] name = "solana-bridge-client" version = "0.1.0" -source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs?branch=refactor%2Fsolana-bridge-client#dc416510fc760d22fdf047ac42d68d75da63b0e6" +source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs#0742379055277a83856de23c7b1cba90a297c2b3" dependencies = [ - "borsh 1.5.3", + "borsh 1.5.4", "derive_builder 0.20.2", "mpl-token-metadata", - "omni-types", "sha2 0.10.8", "solana-client", "solana-sdk", "spl-associated-token-account 6.0.0", "spl-token 7.0.0", - "thiserror 2.0.9", + "thiserror 2.0.11", ] [[package]] name = "solana-client" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1502052be06ff6bfc86363955c2bf06e5f9640689fdb5900e5aa7d5b22633a9d" +checksum = "09e1130dfef5823e3cfb17abb6c4fb64941a6b8290f332d36c5e0398b1bcfd84" dependencies = [ "async-trait", "bincode", @@ -9332,9 +7816,9 @@ dependencies = [ [[package]] name = "solana-clock" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b26a68f89972fddb370ba33a49340bd3419da529893d9ee851211588aee811fa" +checksum = "a2387b936492cab0649c2a3e3fcfb282077029b533fa8454c88c41dff3bc2552" dependencies = [ "serde", "serde_derive", @@ -9344,18 +7828,18 @@ dependencies = [ [[package]] name = "solana-compute-budget" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3366dd8be1d12ea197392cdc261ea1630d156b5685647ed7769959ef473f8aae" +checksum = "91c3a791445139e208e83fde5ddfcbde462f7b90bd21fe8888b8f7d7863af9af" dependencies = [ "solana-sdk", ] [[package]] name = "solana-config-program" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01b94dd5229242839bf71572d903a38f2ea40db5ad408eca57015bcaaf2a7607" +checksum = "f831b7be774ae578fc93e4cca57ec868f3a20af09de9990b0706abf836debc9b" dependencies = [ "bincode", "chrono", @@ -9369,9 +7853,9 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1445dd6a6d47b7a025af9f9c44ecb333716a5a6859f77f8da210d86bb89a7627" +checksum = "4d385fbc0d73ff51ab10c76d84ee0dd4607bedbeba3c4d9cf312d8d78abcf45e" dependencies = [ "async-trait", "bincode", @@ -9390,9 +7874,9 @@ dependencies = [ [[package]] name = "solana-cpi" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e3b62e1ca838f92b90c25ab68c297272cee8e2256dad18806a219b05cfcd247" +checksum = "00bae0591481827ac9cfce5573aad2918bb01f91289b811ea531df4fcb73d136" dependencies = [ "solana-account-info", "solana-define-syscall", @@ -9404,9 +7888,9 @@ dependencies = [ [[package]] name = "solana-curve25519" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2ce85c03e05856b4094891fbaedf9ea9b0334b19d8fba72bd4b106442b46e12" +checksum = "07ec1e9b0cf73334da62f82ac9c19985f18410c2e59f020c0e4a8cf18d1607ef" dependencies = [ "bytemuck", "bytemuck_derive", @@ -9417,24 +7901,24 @@ dependencies = [ [[package]] name = "solana-decode-error" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1323dbdb7c8ca717bcd7987a3f45619b5b6517dc3ee22a21342122a5516125c3" +checksum = "8880dc18fb97c6205214d1f3ce2f1152e997ecc6f6da4bb458fbf6e6207a0693" dependencies = [ "num-traits", ] [[package]] name = "solana-define-syscall" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a23cf0144176f94019a27ce46372661f67007232eea16cae96cb985fc25131d5" +checksum = "6452c4a8fc77cc60ad2934b19f2d75691067f17355b34462d52285395c1c99db" [[package]] name = "solana-derivation-path" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1ccae348499724f35dd03f395b415c54ab3929799c90df0d33e9878947e0987" +checksum = "a03d1149b531c0740a96f36445eec5a937f364729515c924808c40c3706b3b55" dependencies = [ "derivation-path", "qstring", @@ -9443,9 +7927,9 @@ dependencies = [ [[package]] name = "solana-epoch-schedule" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c60dde3613fcd1af91c2033e67ffe8c8d2bcd58085c53c842fa7903fa839ad38" +checksum = "6e783a735416c534228f24f18f18ade0b189c2c8a93be486c9a26bd314517d93" dependencies = [ "serde", "serde_derive", @@ -9455,9 +7939,9 @@ dependencies = [ [[package]] name = "solana-feature-set" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c225a8a8be02a514d4180e6a7c6ff68e193c8e722ac14cde565fe68b671a4a" +checksum = "cb12f174930110d90589281795fd17e03389e22170461a4d528212865e13c621" dependencies = [ "lazy_static", "solana-clock", @@ -9469,9 +7953,9 @@ dependencies = [ [[package]] name = "solana-fee-calculator" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c706f3d151d0abc197ca2fcecf877ace03d613be6fae766de12f5fb41c96b04" +checksum = "e1fa18582732d94369263c42eeee967ff919e99b9b15ba747fb7534aa24fbbc0" dependencies = [ "log", "serde", @@ -9480,11 +7964,11 @@ dependencies = [ [[package]] name = "solana-hash" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a86aabbd7ebf807689a0355f053d6dc31d2131c2d83613011a374a18cc5d61b7" +checksum = "58e35f984e3d60a58184743446250cf724afb34ed65f794da0dc4b462f9c1929" dependencies = [ - "borsh 1.5.3", + "borsh 1.5.4", "bs58 0.5.1", "bytemuck", "bytemuck_derive", @@ -9498,9 +7982,9 @@ dependencies = [ [[package]] name = "solana-inflation" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6954cd9fb4cd351e9e01d3fda020936f7cb44eb9efab3baecc3a5de1c9de8c1a" +checksum = "072f2f3562b4a77a1873250e9e6239389887114ed28846c1174e68979ce021a8" dependencies = [ "serde", "serde_derive", @@ -9508,9 +7992,9 @@ dependencies = [ [[package]] name = "solana-inline-spl" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f116f35b0b8ec99abf0e0cda7064eb3dfb6d16e8bc8767c116f91c256db9b859" +checksum = "38f98c8451cbc9df2646cc21840567119df50ff918255d8202805cc6e436d133" dependencies = [ "bytemuck", "solana-pubkey", @@ -9518,12 +8002,12 @@ dependencies = [ [[package]] name = "solana-instruction" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94ed5710c998efd09ffb596cf5e7266c11cd56e3a136c8a1f940e8525fd5be6e" +checksum = "35fc69f7f75df0b11e99c03393b24a7443aec0430518054de14715c59cfa716d" dependencies = [ "bincode", - "borsh 1.5.3", + "borsh 1.5.4", "getrandom 0.2.15", "js-sys", "num-traits", @@ -9536,9 +8020,9 @@ dependencies = [ [[package]] name = "solana-last-restart-slot" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd5647af0980c796c942e33f1f7dbffca29b7747630b720e6975abb1d7c531f6" +checksum = "fee98cc25000ee8bab1a4f63c7516d9521bc8a9747d8287ebb05e5d9b1d32ee1" dependencies = [ "serde", "serde_derive", @@ -9548,24 +8032,24 @@ dependencies = [ [[package]] name = "solana-log-collector" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "636132217fc00b32a72a3fff2dfdda5a377291edc788d3286a3fbf73caaf89cf" +checksum = "ff50f7d13f8e5ef4949066d5993a2f4a776a5d713dcd23c3af21c08383f6d3d5" dependencies = [ "log", ] [[package]] name = "solana-measure" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cc2470b663cde7fcd3dc644fdcb19181cf5d87ece8cab270e182ff33b48b357" +checksum = "a7ae355064c63c12ffadedc1c44d9410e0fd4f50923f0503a4367c1f64153d2c" [[package]] name = "solana-metrics" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc3248d11553718544485736382dd9a8b619f42f39fba41b9211638d35414bbc" +checksum = "18f4af2c5fdda62f1cc6a88a124f5387aa85cb046dd37a992afa85ae05d59d7d" dependencies = [ "crossbeam-channel", "gethostname", @@ -9578,29 +8062,29 @@ dependencies = [ [[package]] name = "solana-msg" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d6a46fcbbaa38193b5b6aeec531395da8dac8dcd183ac6d80d94e6513fc4ad8" +checksum = "fac7a109b0c7a0ed26c1fbf3b0fec8809b5d4c74b5d597f0252d45255fd0d309" dependencies = [ "solana-define-syscall", ] [[package]] name = "solana-native-token" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0aa3c5006bbea99b810ad8fc6ae168fc83891b607a13a9aa6be39db71a700f87" +checksum = "7246817ae265f5a67be25f32ee52267f1c2fe29767ab601ef03c5086bfc64992" [[package]] name = "solana-net-utils" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "521d93b4023bfce59bff12f7821ab6803ddfdf8d6ead19e8bbdeaee84a609a18" +checksum = "75c408cba4324b9182ac717aaf2ad1eb9cde4a7213d0f11774c4281acee550a2" dependencies = [ "bincode", "crossbeam-channel", "log", - "nix 0.29.0", + "nix", "rand 0.8.5", "serde", "serde_derive", @@ -9612,12 +8096,12 @@ dependencies = [ [[package]] name = "solana-packet" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05fd58e2633824294a4eb1159e3f2cd9fed8d8c4d25fb4e3388f872c314e5ffd" +checksum = "4153becc47f7367102710ae3ddbae46b5aa1b004da4cab8101eaf7d6d0b911b0" dependencies = [ "bincode", - "bitflags 2.6.0", + "bitflags 2.7.0", "cfg_eval", "serde", "serde_derive", @@ -9626,11 +8110,11 @@ dependencies = [ [[package]] name = "solana-perf" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adbb524303dd629a59dc08352da0d232f54172c5454948749966b370eac3ea2a" +checksum = "61f1d31a920f7b548d2fa33d97ed0d11752e5117f4d45e13719478b12a812744" dependencies = [ - "ahash 0.8.11", + "ahash", "bincode", "bv", "caps", @@ -9640,7 +8124,7 @@ dependencies = [ "lazy_static", "libc", "log", - "nix 0.29.0", + "nix", "rand 0.8.5", "rayon", "serde", @@ -9653,9 +8137,9 @@ dependencies = [ [[package]] name = "solana-precompile-error" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e289d47a9c60b9636d86458e050eca1a74f7c932abeee3bca2a0c256b8c9814e" +checksum = "9ed911c6c1ec277b55cf5f082a893023a8a7a58b520823d9ef65f36ace939f2b" dependencies = [ "num-traits", "solana-decode-error", @@ -9663,16 +8147,16 @@ dependencies = [ [[package]] name = "solana-program" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afc847b91b77c48113a55f7f492cc7e982e1778c6b954a05feb499f9b8c3cc4" +checksum = "fb05f5ffadb039285ee82efd9a593e0873220f840f0eac7069d962f9eb29a407" dependencies = [ "base64 0.22.1", "bincode", - "bitflags 2.6.0", + "bitflags 2.7.0", "blake3", "borsh 0.10.4", - "borsh 1.5.3", + "borsh 1.5.4", "bs58 0.5.1", "bv", "bytemuck", @@ -9685,11 +8169,11 @@ dependencies = [ "js-sys", "lazy_static", "log", - "memoffset 0.9.1", + "memoffset", "num-bigint 0.4.6", "num-derive 0.4.2", "num-traits", - "parking_lot 0.12.3", + "parking_lot", "rand 0.8.5", "serde", "serde_bytes", @@ -9736,9 +8220,9 @@ dependencies = [ [[package]] name = "solana-program-entrypoint" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "988a49fb8231e95861d11b40931f49e06f0dea5a29241acf7cbca644c52abd6b" +checksum = "c5f6148e740c6deed55fe343355f0cb3ec158d221e11aa8bb93a392fa62c4137" dependencies = [ "solana-account-info", "solana-msg", @@ -9748,11 +8232,11 @@ dependencies = [ [[package]] name = "solana-program-error" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2473773ee9cebf6ba3d7d1fe911938bc2a3a694e85bea33fd7a99d397cde1202" +checksum = "d87e99e4299728f450194b6adf946dde512d79d82275b1c73f6faea7e9075cef" dependencies = [ - "borsh 1.5.3", + "borsh 1.5.4", "num-traits", "serde", "serde_derive", @@ -9764,9 +8248,9 @@ dependencies = [ [[package]] name = "solana-program-memory" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d9e6ca90bbc3020b7b37091c05049f5de48e397545093ec303dc6eff3d4720c" +checksum = "3691cdd84c0a4753b484f468aac19e0943fab1e71705b21d00d561ac6eea6449" dependencies = [ "num-traits", "solana-define-syscall", @@ -9774,24 +8258,24 @@ dependencies = [ [[package]] name = "solana-program-option" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c2334c5f9adcc25c6390fbf87ac127adbfbd8943465726e5f389159677ceba2" +checksum = "e99a3e016363a95cdbe23aaa2a68578ffa2ce8e37c4a642962201af6376ffc37" [[package]] name = "solana-program-pack" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "305475eef9404539cce0c561ab9997b875cc5509f7c553859cd059fdf93b0ab2" +checksum = "4eba980dec9d5403ea299a3cdf27cd794e6b1a188acc8c5e3ae7d067b629eb24" dependencies = [ "solana-program-error", ] [[package]] name = "solana-program-runtime" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05abf5a66475f23769700597129cce9f76cfaacb45babf83ffec3157da8c7ce4" +checksum = "554db6e468732aa8b0a06a6d4f7b9aa87c9af3e230cec0de3d114d05ae562516" dependencies = [ "base64 0.22.1", "bincode", @@ -9819,12 +8303,12 @@ dependencies = [ [[package]] name = "solana-pubkey" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a954fba3af498201179981818b0ed61f95c32b4a3db5ea9cc042c971c84cdeae" +checksum = "6dba2b19db8b73ab96b309b6d2a9f26386e45e2af3618a27b92389da9a3df1f1" dependencies = [ "borsh 0.10.4", - "borsh 1.5.3", + "borsh 1.5.4", "bs58 0.5.1", "bytemuck", "bytemuck_derive", @@ -9846,9 +8330,9 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28f6f2c554cec02f87eca3e2461e1923db157d2d615e919fc2b93807465cbe6a" +checksum = "944b2f69e40b5eb3c592b2fb09cda394a25cdfda510b8d0990312344757effd8" dependencies = [ "crossbeam-channel", "futures-util", @@ -9871,9 +8355,9 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c707a5c4aba604c06c0eeced102355229a7696ed4dc6a26c71bba5d74d86fc5" +checksum = "8c736895f1ff5976625b34919a3746d76907f520e3115c42f3c58894505180b4" dependencies = [ "async-lock", "async-trait", @@ -9883,7 +8367,7 @@ dependencies = [ "log", "quinn", "quinn-proto", - "rustls 0.23.20", + "rustls 0.23.21", "solana-connection-cache", "solana-measure", "solana-metrics", @@ -9897,9 +8381,9 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eeb2db0e5055cc45bbb9b6f8e4bc879b49dadf5734397a749c4b7da9193e71e" +checksum = "a7adb94fcecc07de337e7553888f208559658113b2e299ec27e79b76926137ad" dependencies = [ "lazy_static", "num_cpus", @@ -9907,9 +8391,9 @@ dependencies = [ [[package]] name = "solana-rent" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ebcc59bff8b3c773214545d038b718a3e2e63c920b8172f85725463029f7f00" +checksum = "138b60a6683d14d63b4cee532d50afcb54999679b5c53013969fd51977455e14" dependencies = [ "serde", "serde_derive", @@ -9919,9 +8403,9 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c85883f214cff98a97432646ace94eea3cfe309b068841c0feae93d0a1e7b238" +checksum = "da0b794733bfdef79d26192c035076580c491b976436ed40663d6b3c54002681" dependencies = [ "async-trait", "base64 0.22.1", @@ -9946,9 +8430,9 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "791168d04387734755d3a7e81f5228cb305041c09bf4fbfc0823c8380acdf3e7" +checksum = "dab5e8d3650ca216bac0ca8ce5b480629dda1e093679fcab0a8a688a3b2349d9" dependencies = [ "anyhow", "base64 0.22.1", @@ -9970,9 +8454,9 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46e515480bef7a3476cee636a69aa237e2e8ba73f82ba95d6e307397144ce4fc" +checksum = "71ecde4c1ad74196acd8c957b60e4df7ff2c3e5787afc62bae17c9463fec40a9" dependencies = [ "solana-rpc-client", "solana-sdk", @@ -9981,19 +8465,19 @@ dependencies = [ [[package]] name = "solana-sanitize" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d05ecd7ec442abf0561cbf06984484d6368e71a4882213bfa68b658b0f8d6a0e" +checksum = "58f71b885b953e9157b66eaba9a34507f2f840712ef54f483725ba510ee1bd89" [[package]] name = "solana-sdk" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "216fa7d6ef4d741ec21e0054e78d86c5da0c2033f377b03de5eb65d264d8df13" +checksum = "74a9bcaaedaf805d5541307e22b48ba80a5b0e2922c2d35ca7f23732efa6bd07" dependencies = [ "bincode", - "bitflags 2.6.0", - "borsh 1.5.3", + "bitflags 2.7.0", + "borsh 1.5.4", "bs58 0.5.1", "bytemuck", "bytemuck_derive", @@ -10023,7 +8507,7 @@ dependencies = [ "serde_with", "sha2 0.10.8", "sha3", - "siphasher", + "siphasher 0.3.11", "solana-account", "solana-bn254", "solana-decode-error", @@ -10051,23 +8535,23 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85df4723291cfec8ffe9dadc59d565afcae12ea9a6460b7b28c4da21c2c4a887" +checksum = "62f0b358f336ceac3827881915e5293f121c023cbd2150115046356c66898cb8" dependencies = [ "bs58 0.5.1", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.96", ] [[package]] name = "solana-secp256k1-recover" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41c38fc7bc33f78af99c4848c9a924b2b6e5d33d96f269d108777d982de72f73" +checksum = "460c2e36586bcce843cdeaaf2364f3db7fbd9f266325e93d5e9af33f2605dd7d" dependencies = [ - "borsh 1.5.3", + "borsh 1.5.4", "libsecp256k1", "solana-define-syscall", "thiserror 1.0.69", @@ -10075,9 +8559,9 @@ dependencies = [ [[package]] name = "solana-secp256r1-program" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5bbc17379248923203317b337ce871bbf1ba6c59f01c49dc65895ffdc684f0a" +checksum = "a993ec6151c8f8ce77378a2506831c869b27ebdb0eaf65b375d38a4798c20d56" dependencies = [ "bytemuck", "openssl", @@ -10095,18 +8579,18 @@ checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" [[package]] name = "solana-serde-varint" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e2fc696c10a2b02356584cbd45d83d42b01b10256cb36b5d0c3768e5adf9283" +checksum = "a98449030e53dcc2c4f160acab99b2bdb3e24ea8bff8ca6e71a6e539a54bf3d7" dependencies = [ "serde", ] [[package]] name = "solana-serialize-utils" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b04c6fb71e4cdd10480bc8d306aca6d2a7494e6267e4f103085a89b2ec04e4c" +checksum = "d659aac218580fc3fb3e8350669db9bb01bc1bc849c90f0741cbfccb6663eb94" dependencies = [ "solana-instruction", "solana-pubkey", @@ -10115,9 +8599,9 @@ dependencies = [ [[package]] name = "solana-sha256-hasher" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb4c977c6c4d95c8b43a9f405844f29a73c9d8b0a7c561b91d4f6a44f290d35c" +checksum = "0db90ad6643d4d626f923159eaa876000c09f8c2e9aa7ff59b803e8328712582" dependencies = [ "sha2 0.10.8", "solana-define-syscall", @@ -10126,22 +8610,22 @@ dependencies = [ [[package]] name = "solana-short-vec" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ca5799b37642e4e273d7d848564739eab45df670edcc61b4696ef0d5ebe4a8c" +checksum = "11f7de721a6c50cb3a41e027a623496be39e45c452fbf897f657cd1f2f67dbbd" dependencies = [ "serde", ] [[package]] name = "solana-signature" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d28fe70f88bffb651a6ff8c37c236b935e97589865ca32e4a4544cdd10c7b268" +checksum = "3123b0fba3a798cbb2091788c92880644464e56359abc7defed993c6efa88ef3" dependencies = [ "bs58 0.5.1", "ed25519-dalek 1.0.1", - "generic-array 0.14.7", + "generic-array", "rand 0.8.5", "serde", "serde_derive", @@ -10150,9 +8634,9 @@ dependencies = [ [[package]] name = "solana-slot-hashes" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e596d3719b4c03987de87c8cc25b34b6afcf7464c82b4d9c9b114304d882c97" +checksum = "3840867aa6d0fac65d3a4c1f14fff650a8e148732a16c06ebd8a2389d79d4745" dependencies = [ "serde", "serde_derive", @@ -10162,9 +8646,9 @@ dependencies = [ [[package]] name = "solana-slot-history" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4022b0e8a7f043bd61504fff79176c02b52f69a69299023884b194a1405c0f05" +checksum = "101583a12fcce9b52f845b3c773f4ae6c3f4ca6a46177dadbd83e276baf82326" dependencies = [ "bv", "serde", @@ -10174,9 +8658,9 @@ dependencies = [ [[package]] name = "solana-stable-layout" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e82f0665dfcfcb4433708abff54db5ee105fe1bb8db7fd409074bd0275582105" +checksum = "9e1b923e1c9e42b6c98b1786ca003af6a0366932f08d63432e984fcc394b7b5e" dependencies = [ "solana-instruction", "solana-pubkey", @@ -10184,9 +8668,9 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3173f4634b4e0acc366dec277744af50ffbf661dfe41291adf1406841a1b9c96" +checksum = "233be81992e93db82775f4d94e503db88a5d69f83cd04ba5d448272b09177738" dependencies = [ "async-channel", "bytes", @@ -10200,13 +8684,13 @@ dependencies = [ "itertools 0.12.1", "libc", "log", - "nix 0.29.0", + "nix", "pem", "percentage", "quinn", "quinn-proto", "rand 0.8.5", - "rustls 0.23.20", + "rustls 0.23.21", "smallvec", "socket2", "solana-measure", @@ -10216,24 +8700,24 @@ dependencies = [ "solana-transaction-metrics-tracker", "thiserror 1.0.69", "tokio", - "tokio-util 0.7.13", + "tokio-util", "x509-parser", ] [[package]] name = "solana-sysvar-id" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bbed7acdd711e0d620c9b7f788d041d35731c2c675d1d687498745d73826ca4" +checksum = "59351de877a7cf0cea0e436424ecf4ea0c08c59ff01ef0575436972b920b818c" dependencies = [ "solana-pubkey", ] [[package]] name = "solana-thin-client" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9facb2fbf83b8a3acb1cb4523bffa3db7be838faf2cfda374f0d99120917d870" +checksum = "a196c7c691c8dcc38a9eb19c0c2ccc39b77cbf749bc5c80b741abba1718197bf" dependencies = [ "bincode", "log", @@ -10246,9 +8730,9 @@ dependencies = [ [[package]] name = "solana-timings" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6a83fbf8377e65d4c8e6a3c3c877c944a530ca9003f94389fd1528213c7c001" +checksum = "743bca35719b09d4d9abac84fce42a448d86eb62edc69404ce85077874469e46" dependencies = [ "eager", "enum-iterator", @@ -10257,9 +8741,9 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31cb5c39698855b236b6266025b2f31b1948ee370cd53a5cca6c7c62eea3104d" +checksum = "d7613f1bdeac19764c6d5580747458e10c59df741d10566886424bae19db5297" dependencies = [ "async-trait", "bincode", @@ -10280,9 +8764,9 @@ dependencies = [ [[package]] name = "solana-transaction-error" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae45f064c8e6006a426b31a1182123ec4daf8cca50bd7aea6e796e6205a7911e" +checksum = "1c3d2147cfaad2a5518b8e15621008699e28d32d6233cd7a6b27a506e01f1515" dependencies = [ "serde", "serde_derive", @@ -10292,9 +8776,9 @@ dependencies = [ [[package]] name = "solana-transaction-metrics-tracker" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb406ed0db097a5d2067c3c737bec3f515ea70a2cfa5abec8fc0606098049e42" +checksum = "930fd1cf0e5072e6af1cb9379ca0120036fb7ed753043550acfdd5477ab0d84a" dependencies = [ "base64 0.22.1", "bincode", @@ -10308,14 +8792,14 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "254b3f1295b8654604d1f1b2980a4ec81621c071cc7bcbb8b3e6eb44ce98e8b1" +checksum = "ee497beceaa3134706efff21893da15aa4e6a0ff8c130d408d13a0e9b3f6079b" dependencies = [ "Inflector", "base64 0.22.1", "bincode", - "borsh 1.5.3", + "borsh 1.5.4", "bs58 0.5.1", "lazy_static", "log", @@ -10336,9 +8820,9 @@ dependencies = [ [[package]] name = "solana-transaction-status-client-types" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a853cb1b1d5d1b521a51ae4666668f321505f0280839b00337d2620a9aba641" +checksum = "2780aea315220b859605bc63f2fac4c83580380f9c0779c9404e9d7fa43eb77d" dependencies = [ "base64 0.22.1", "bincode", @@ -10354,9 +8838,9 @@ dependencies = [ [[package]] name = "solana-type-overrides" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4347abe10a8290cb6b135b1e40115e4d390d29588fb5ba598be891a98d09e10d" +checksum = "b3cac7e7628c46bf5e243a4b0f11c0ad172a27cae2a5d97c7c6ca64fe9e6ece6" dependencies = [ "lazy_static", "rand 0.8.5", @@ -10364,9 +8848,9 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b3064f000984b1f1032b3686577e452c423cbe3f8208efc713c16408f3a4086" +checksum = "9000e6838be58040037f4461e25b067eb261fa87de7ce96cc3c3413c5847c83e" dependencies = [ "async-trait", "solana-connection-cache", @@ -10379,9 +8863,9 @@ dependencies = [ [[package]] name = "solana-version" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85b16c635fe2ccc3287bd5f84c6c86fbf316510df4229506d0bd9af50f2f1780" +checksum = "d27562a25de97d4c665c6700bad04eb12e29f09d77cad357570a26b010f93910" dependencies = [ "semver 1.0.24", "serde", @@ -10393,9 +8877,9 @@ dependencies = [ [[package]] name = "solana-vote" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "228c93777a3ad6dc60abe422c558e8476ed0de4fe2b8784dfacb07951ca38355" +checksum = "490e9e84d72423b90f1adcc232051a4e3719bf3498508ea9ba9d15e967f4d327" dependencies = [ "itertools 0.12.1", "log", @@ -10407,9 +8891,9 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94b556c4d1e742e8ab829bfa33b01cc22b823e7f42351e7ba24e4b2e26c3138f" +checksum = "61182f05723432933434ef7cf6297afb0eab47614ceb9077bf4f4c94261a6e5d" dependencies = [ "bincode", "log", @@ -10427,9 +8911,9 @@ dependencies = [ [[package]] name = "solana-zk-sdk" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bea58ce4bcac4c6f3577ffc753b8bff3d259169bde1827b4466acb5daae088d2" +checksum = "9c9cdb833c58083b7af34e3fa85b0081d833768e7b389fceb5ea73fd3a9de077" dependencies = [ "aes-gcm-siv", "base64 0.22.1", @@ -10459,9 +8943,9 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "2.1.6" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4340e5b7e4c3aa1d41ee638ab7d13eb1bcfc32d59c275a9f41838f059728aa6" +checksum = "ab41e96397a145a823dcdea451ae9d3ca41485ca30e000404d4b07883919d534" dependencies = [ "aes-gcm-siv", "base64 0.22.1", @@ -10539,7 +9023,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d96d2d1d716fb500937168cc09353ffdc7a012be8475ac7308e1bdf0e3923300" dependencies = [ - "lock_api 0.4.12", + "lock_api", ] [[package]] @@ -10569,7 +9053,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68034596cf4804880d265f834af1ff2f821ad5293e41fa0f8f59086c181fc38e" dependencies = [ "assert_matches", - "borsh 1.5.3", + "borsh 1.5.4", "num-derive 0.4.2", "num-traits", "solana-program", @@ -10584,7 +9068,7 @@ version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76fee7d65013667032d499adc3c895e286197a35a0d3a4643c80e7fd3e9969e3" dependencies = [ - "borsh 1.5.3", + "borsh 1.5.4", "num-derive 0.4.2", "num-traits", "solana-program", @@ -10635,7 +9119,7 @@ checksum = "d9e8418ea6269dcfb01c712f0444d2c75542c04448b480e87de59d2865edc750" dependencies = [ "quote", "spl-discriminator-syn", - "syn 2.0.91", + "syn 2.0.96", ] [[package]] @@ -10647,7 +9131,7 @@ dependencies = [ "proc-macro2", "quote", "sha2 0.10.8", - "syn 2.0.91", + "syn 2.0.96", "thiserror 1.0.69", ] @@ -10693,7 +9177,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c704c88fc457fa649ba3aabe195c79d885c3f26709efaddc453c8de352c90b87" dependencies = [ - "borsh 1.5.3", + "borsh 1.5.4", "bytemuck", "bytemuck_derive", "solana-program", @@ -10707,7 +9191,7 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41a7d5950993e1ff2680bd989df298eeb169367fb2f9deeef1f132de6e4e8016" dependencies = [ - "borsh 1.5.3", + "borsh 1.5.4", "bytemuck", "bytemuck_derive", "num-derive 0.4.2", @@ -10756,7 +9240,7 @@ dependencies = [ "proc-macro2", "quote", "sha2 0.10.8", - "syn 2.0.91", + "syn 2.0.96", ] [[package]] @@ -10952,7 +9436,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6c2318ddff97e006ed9b1291ebec0750a78547f870f62a69c56fe3b46a5d8fc" dependencies = [ - "borsh 1.5.3", + "borsh 1.5.4", "solana-program", "spl-discriminator 0.3.0", "spl-pod 0.3.1", @@ -10966,7 +9450,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfb9c89dbc877abd735f05547dcf9e6e12c00c11d6d74d8817506cab4c99fdbb" dependencies = [ - "borsh 1.5.3", + "borsh 1.5.4", "num-derive 0.4.2", "num-traits", "solana-borsh", @@ -11053,12 +9537,6 @@ dependencies = [ "thiserror 1.0.69", ] -[[package]] -name = "sptr" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b9b39299b249ad65f3b7e96443bad61c02ca5cd3589f46cb6d610a0fd6c0d6a" - [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -11079,7 +9557,7 @@ checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" dependencies = [ "new_debug_unreachable", "once_cell", - "parking_lot 0.12.3", + "parking_lot", "phf_shared 0.10.0", "precomputed-hash", ] @@ -11137,7 +9615,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.91", + "syn 2.0.96", ] [[package]] @@ -11179,9 +9657,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.91" +version = "2.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53cbcb5a243bd33b7858b1d7f4aca2153490815872d86d955d6ea29f743c035" +checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" dependencies = [ "proc-macro2", "quote", @@ -11190,14 +9668,14 @@ dependencies = [ [[package]] name = "syn-solidity" -version = "0.8.15" +version = "0.8.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "219389c1ebe89f8333df8bdfb871f6631c552ff399c23cac02480b6088aad8f0" +checksum = "31e89d8bf2768d277f40573c83a02a099e96d96dd3104e13ea676194e61ac4b0" dependencies = [ "paste", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.96", ] [[package]] @@ -11235,7 +9713,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.96", ] [[package]] @@ -11255,7 +9733,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.7.0", "core-foundation", "system-configuration-sys 0.6.0", ] @@ -11286,18 +9764,6 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" -[[package]] -name = "target-lexicon" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab0e7238dcc7b40a7be719a25365910f6807bd864f4cce6b2e6b873658e2b19d" - -[[package]] -name = "target-lexicon" -version = "0.12.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" - [[package]] name = "task-local-extensions" version = "0.1.4" @@ -11309,12 +9775,13 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.14.0" +version = "3.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" +checksum = "9a8a559c81686f576e8cd0290cd2a24a2a9ad80c98b3478856500fcbd7acd704" dependencies = [ "cfg-if 1.0.0", "fastrand", + "getrandom 0.2.15", "once_cell", "rustix", "windows-sys 0.59.0", @@ -11351,11 +9818,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.9" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f072643fd0190df67a8bab670c20ef5d8737177d6ac6b2e9a236cb096206b2cc" +checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" dependencies = [ - "thiserror-impl 2.0.9", + "thiserror-impl 2.0.11", ] [[package]] @@ -11366,28 +9833,18 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.96", ] [[package]] name = "thiserror-impl" -version = "2.0.9" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b50fa271071aae2e6ee85f842e2e28ba8cd2c5fb67f11fcb1fd70b276f9e7d4" +checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", -] - -[[package]] -name = "thread_local" -version = "1.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" -dependencies = [ - "cfg-if 1.0.0", - "once_cell", + "syn 2.0.96", ] [[package]] @@ -11466,15 +9923,15 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.42.0" +version = "1.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cec9b21b0450273377fc97bd4c33a8acffc8c996c987a7c5b319a0083707551" +checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" dependencies = [ "backtrace", "bytes", "libc", "mio", - "parking_lot 0.12.3", + "parking_lot", "pin-project-lite", "signal-hook-registry", "socket2", @@ -11482,25 +9939,15 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "tokio-io-timeout" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf" -dependencies = [ - "pin-project-lite", - "tokio", -] - [[package]] name = "tokio-macros" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.96", ] [[package]] @@ -11529,7 +9976,7 @@ version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" dependencies = [ - "rustls 0.23.20", + "rustls 0.23.21", "tokio", ] @@ -11542,7 +9989,7 @@ dependencies = [ "futures-core", "pin-project-lite", "tokio", - "tokio-util 0.7.13", + "tokio-util", ] [[package]] @@ -11568,7 +10015,7 @@ checksum = "edc5f74e248dc973e0dbb7b74c7e0d6fcc301c694ff50049504004ef4d0cdcd9" dependencies = [ "futures-util", "log", - "rustls 0.23.20", + "rustls 0.23.21", "rustls-pki-types", "tokio", "tokio-rustls 0.26.1", @@ -11578,36 +10025,22 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.6.10" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36943ee01a6d67977dd3f84a5a1d2efeb4ada3a1ae771cadfaa535d9d9fc6507" +checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" dependencies = [ "bytes", "futures-core", "futures-sink", - "log", "pin-project-lite", "tokio", ] [[package]] -name = "tokio-util" -version = "0.7.13" +name = "toml" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "toml" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" dependencies = [ "serde", ] @@ -11646,69 +10079,6 @@ dependencies = [ "winnow", ] -[[package]] -name = "tonic" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff08f4649d10a70ffa3522ca559031285d8e421d727ac85c60825761818f5d0a" -dependencies = [ - "async-stream", - "async-trait", - "base64 0.13.1", - "bytes", - "futures-core", - "futures-util", - "h2 0.3.26", - "http 0.2.12", - "http-body 0.4.6", - "hyper 0.14.32", - "hyper-timeout", - "percent-encoding", - "pin-project", - "prost", - "prost-derive", - "tokio", - "tokio-stream", - "tokio-util 0.6.10", - "tower 0.4.13", - "tower-layer", - "tower-service", - "tracing", - "tracing-futures", -] - -[[package]] -name = "tonic-build" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9403f1bafde247186684b230dc6f38b5cd514584e8bec1dd32514be4745fa757" -dependencies = [ - "proc-macro2", - "prost-build", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "futures-core", - "futures-util", - "indexmap 1.9.3", - "pin-project", - "pin-project-lite", - "rand 0.8.5", - "slab", - "tokio", - "tokio-util 0.7.13", - "tower-layer", - "tower-service", - "tracing", -] - [[package]] name = "tower" version = "0.5.2" @@ -11719,6 +10089,7 @@ dependencies = [ "futures-util", "pin-project-lite", "sync_wrapper 1.0.2", + "tokio", "tower-layer", "tower-service", ] @@ -11747,18 +10118,6 @@ dependencies = [ "tracing-core", ] -[[package]] -name = "tracing-appender" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3566e8ce28cc0a3fe42519fc80e6b4c943cc4c8cef275620eb8dac2d3d4e06cf" -dependencies = [ - "crossbeam-channel", - "thiserror 1.0.69", - "time", - "tracing-subscriber", -] - [[package]] name = "tracing-attributes" version = "0.1.28" @@ -11767,7 +10126,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.96", ] [[package]] @@ -11777,7 +10136,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" dependencies = [ "once_cell", - "valuable", ] [[package]] @@ -11790,60 +10148,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "tracing-log" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f751112709b4e791d8ce53e32c4ed2d353565a795ce84da2285393f41557bdf2" -dependencies = [ - "log", - "once_cell", - "tracing-core", -] - -[[package]] -name = "tracing-log" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" -dependencies = [ - "log", - "once_cell", - "tracing-core", -] - -[[package]] -name = "tracing-opentelemetry" -version = "0.17.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbbe89715c1dbbb790059e2565353978564924ee85017b5fff365c872ff6721f" -dependencies = [ - "once_cell", - "opentelemetry", - "tracing", - "tracing-core", - "tracing-log 0.1.4", - "tracing-subscriber", -] - -[[package]] -name = "tracing-subscriber" -version = "0.3.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" -dependencies = [ - "matchers", - "nu-ansi-term", - "once_cell", - "regex", - "sharded-slab", - "smallvec", - "thread_local", - "tracing", - "tracing-core", - "tracing-log 0.2.0", -] - [[package]] name = "try-lock" version = "0.2.5" @@ -11884,7 +10188,7 @@ dependencies = [ "httparse", "log", "rand 0.8.5", - "rustls 0.23.20", + "rustls 0.23.21", "rustls-pki-types", "sha1", "thiserror 1.0.69", @@ -11935,9 +10239,9 @@ checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" [[package]] name = "unicase" -version = "2.8.0" +version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df" +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" [[package]] name = "unicode-ident" @@ -11945,12 +10249,6 @@ version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" -[[package]] -name = "unicode-segmentation" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" - [[package]] name = "unicode-width" version = "0.2.0" @@ -11974,678 +10272,239 @@ dependencies = [ ] [[package]] -name = "unreachable" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" -dependencies = [ - "void", -] - -[[package]] -name = "unsafe-libyaml" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" - -[[package]] -name = "untrusted" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" - -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "uriparse" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0200d0fc04d809396c2ad43f3c95da3582a2556eba8d453c1087f4120ee352ff" -dependencies = [ - "fnv", - "lazy_static", -] - -[[package]] -name = "url" -version = "2.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", -] - -[[package]] -name = "urlencoding" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" - -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - -[[package]] -name = "utf16_iter" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" - -[[package]] -name = "utf8_iter" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" - -[[package]] -name = "utf8parse" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" - -[[package]] -name = "uuid" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" -dependencies = [ - "getrandom 0.2.15", - "serde", -] - -[[package]] -name = "uuid" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" - -[[package]] -name = "valuable" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "void" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" - -[[package]] -name = "vsimd" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64" - -[[package]] -name = "wait-timeout" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" -dependencies = [ - "libc", -] - -[[package]] -name = "walkdir" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasm-bindgen" -version = "0.2.99" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" -dependencies = [ - "cfg-if 1.0.0", - "once_cell", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.99" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn 2.0.91", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.49" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38176d9b44ea84e9184eff0bc34cc167ed044f816accfe5922e54d84cf48eca2" -dependencies = [ - "cfg-if 1.0.0", - "js-sys", - "once_cell", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.99" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.99" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.91", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.99" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" - -[[package]] -name = "wasm-encoder" -version = "0.27.0" +name = "unreachable" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e77053dc709db790691d3732cfc458adc5acc881dec524965c608effdcd9c581" +checksum = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" dependencies = [ - "leb128", + "void", ] [[package]] -name = "wasm-encoder" -version = "0.35.0" +name = "unsafe-libyaml" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ca90ba1b5b0a70d3d49473c5579951f3bddc78d47b59256d2f9d4922b150aca" -dependencies = [ - "leb128", -] +checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" [[package]] -name = "wasmer-compiler-near" -version = "2.4.1" +name = "untrusted" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46fdae7245128f284476e6db9653ef0a15b011975091bcd7f9d7303132409662" -dependencies = [ - "enumset", - "rkyv", - "smallvec", - "target-lexicon 0.12.16", - "thiserror 1.0.69", - "wasmer-types-near", - "wasmer-vm-near", - "wasmparser 0.78.2", -] +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" [[package]] -name = "wasmer-compiler-singlepass-near" -version = "2.4.1" +name = "untrusted" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac4af0e438015585eb27b2c6f6869c58c540bfe27408b686b1778470bf301050" -dependencies = [ - "byteorder", - "dynasm 1.2.3", - "dynasmrt 1.2.3", - "lazy_static", - "memoffset 0.6.5", - "more-asserts", - "rayon", - "smallvec", - "wasmer-compiler-near", - "wasmer-types-near", - "wasmer-vm-near", -] +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] -name = "wasmer-engine-near" -version = "2.4.1" +name = "uriparse" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4048411cabb2c94c7d8d11d9d0282cc6b15308b61ebc1e122c40e89865ebb5c5" +checksum = "0200d0fc04d809396c2ad43f3c95da3582a2556eba8d453c1087f4120ee352ff" dependencies = [ - "backtrace", - "enumset", + "fnv", "lazy_static", - "memmap2", - "more-asserts", - "rustc-demangle", - "target-lexicon 0.12.16", - "thiserror 1.0.69", - "wasmer-compiler-near", - "wasmer-types-near", - "wasmer-vm-near", ] [[package]] -name = "wasmer-engine-universal-near" -version = "2.4.1" +name = "url" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f31c3d2850ac7957406d3c9581d9435ea8126a26478709fa7e931b6f562b4d" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ - "cfg-if 1.0.0", - "enumset", - "leb128", - "region", - "rkyv", - "thiserror 1.0.69", - "wasmer-compiler-near", - "wasmer-engine-near", - "wasmer-types-near", - "wasmer-vm-near", - "winapi", + "form_urlencoded", + "idna", + "percent-encoding", ] [[package]] -name = "wasmer-runtime-core-near" -version = "0.18.5" +name = "urlencoding" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af9c54899b847f8bab6d47295487c9827f14cc411bd70b168e87a4ea017ccd7e" -dependencies = [ - "bincode", - "blake3", - "borsh 1.5.3", - "cc", - "digest 0.8.1", - "errno 0.2.8", - "hex", - "indexmap 2.7.0", - "lazy_static", - "libc", - "nix 0.15.0", - "page_size", - "parking_lot 0.10.2", - "rustc_version 0.2.3", - "serde", - "serde-bench", - "serde_bytes", - "serde_derive", - "smallvec", - "target-lexicon 0.10.0", - "wasmparser 0.51.4", - "winapi", -] +checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" [[package]] -name = "wasmer-runtime-near" -version = "0.18.0" +name = "utf-8" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "158e6fff11e5e1ef805af50637374d5bd43d92017beafa18992cdf7f3f7ae3e4" -dependencies = [ - "lazy_static", - "memmap", - "serde", - "serde_derive", - "wasmer-runtime-core-near", - "wasmer-singlepass-backend-near", -] +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" [[package]] -name = "wasmer-singlepass-backend-near" -version = "0.18.2" +name = "utf16_iter" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9358673d39c3b4a15374fba0536bfe5e50485e7c826de50d2dbef8c96df07674" -dependencies = [ - "bincode", - "borsh 1.5.3", - "byteorder", - "dynasm 1.2.3", - "dynasmrt 1.2.3", - "lazy_static", - "libc", - "nix 0.15.0", - "serde", - "serde_derive", - "smallvec", - "wasmer-runtime-core-near", -] +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" [[package]] -name = "wasmer-types-near" -version = "2.4.1" +name = "utf8_iter" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ba154adffb0fbd33f5dabd3788a1744d846b43e6e090d44269c7ee8fa5743e4" -dependencies = [ - "indexmap 1.9.3", - "rkyv", - "thiserror 1.0.69", -] +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] -name = "wasmer-vm-near" -version = "2.4.1" +name = "uuid" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70a5585596f6e9915d606de944aece51626736fb1191aefb5b2ef108c6f7604a" +checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" dependencies = [ - "backtrace", - "cc", - "cfg-if 1.0.0", - "indexmap 1.9.3", - "libc", - "memoffset 0.6.5", - "more-asserts", - "region", - "rkyv", - "thiserror 1.0.69", - "wasmer-types-near", - "winapi", + "getrandom 0.2.15", + "serde", ] [[package]] -name = "wasmparser" -version = "0.51.4" +name = "uuid" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aeb1956b19469d1c5e63e459d29e7b5aa0f558d9f16fcef09736f8a265e6c10a" +checksum = "744018581f9a3454a9e15beb8a33b017183f1e7c0cd170232a2d1453b23a51c4" [[package]] -name = "wasmparser" -version = "0.78.2" +name = "valuable" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52144d4c78e5cf8b055ceab8e5fa22814ce4315d6002ad32cfd914f37c12fd65" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" [[package]] -name = "wasmparser" -version = "0.99.0" +name = "vcpkg" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ef3b717afc67f848f412d4f02c127dd3e35a0eecd58c684580414df4fde01d3" -dependencies = [ - "indexmap 1.9.3", - "url", -] +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] -name = "wasmparser" -version = "0.105.0" +name = "version_check" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83be9e0b3f9570dc1979a33ae7b89d032c73211564232b99976553e5c155ec32" -dependencies = [ - "indexmap 1.9.3", - "url", -] +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] -name = "wasmparser" -version = "0.115.0" +name = "void" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e06c0641a4add879ba71ccb3a1e4278fd546f76f1eafb21d8f7b07733b547cd5" -dependencies = [ - "indexmap 2.7.0", - "semver 1.0.24", -] +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" [[package]] -name = "wasmprinter" -version = "0.2.57" +name = "vsimd" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50b0e5ed7a74a065637f0d7798ce5f29cadb064980d24b0c82af5200122fa0d8" -dependencies = [ - "anyhow", - "wasmparser 0.105.0", -] +checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64" [[package]] -name = "wasmtime" -version = "14.0.4" +name = "wait-timeout" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca54f6090ce46973f33a79f265924b204f248f91aec09229bce53d19d567c1a6" +checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" dependencies = [ - "anyhow", - "bincode", - "bumpalo", - "cfg-if 1.0.0", - "fxprof-processed-profile", - "indexmap 2.7.0", "libc", - "log", - "object 0.32.2", - "once_cell", - "paste", - "psm", - "serde", - "serde_derive", - "serde_json", - "target-lexicon 0.12.16", - "wasm-encoder 0.35.0", - "wasmparser 0.115.0", - "wasmtime-cranelift", - "wasmtime-environ", - "wasmtime-jit", - "wasmtime-runtime", - "windows-sys 0.48.0", ] [[package]] -name = "wasmtime-asm-macros" -version = "14.0.4" +name = "walkdir" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54984bc0b5689da87a43d7c181d23092b4d5cfcbb7ae3eb6b917dd55865d95e6" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" dependencies = [ - "cfg-if 1.0.0", + "same-file", + "winapi-util", ] [[package]] -name = "wasmtime-cranelift" -version = "14.0.4" +name = "want" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cf3cee8be02f5006d21b773ffd6802f96a0b7d661ff2ad8a01fb93df458b1aa" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" dependencies = [ - "anyhow", - "cfg-if 1.0.0", - "cranelift-codegen", - "cranelift-control", - "cranelift-entity", - "cranelift-frontend", - "cranelift-native", - "cranelift-wasm", - "gimli 0.28.1", - "log", - "object 0.32.2", - "target-lexicon 0.12.16", - "thiserror 1.0.69", - "wasmparser 0.115.0", - "wasmtime-cranelift-shared", - "wasmtime-environ", - "wasmtime-versioned-export-macros", + "try-lock", ] [[package]] -name = "wasmtime-cranelift-shared" -version = "14.0.4" +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "420fd2a69bc162957f4c94f21c7fa08ecf60d916f4e87b56332507c555da381d" -dependencies = [ - "anyhow", - "cranelift-codegen", - "cranelift-control", - "cranelift-native", - "gimli 0.28.1", - "object 0.32.2", - "target-lexicon 0.12.16", - "wasmtime-environ", -] +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] -name = "wasmtime-environ" -version = "14.0.4" +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb6a445ce2b2810127caee6c1b79b8da4ae57712b05556a674592c18b7500a14" -dependencies = [ - "anyhow", - "cranelift-entity", - "gimli 0.28.1", - "indexmap 2.7.0", - "log", - "object 0.32.2", - "serde", - "serde_derive", - "target-lexicon 0.12.16", - "thiserror 1.0.69", - "wasmparser 0.115.0", - "wasmtime-types", -] +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] -name = "wasmtime-jit" -version = "14.0.4" +name = "wasm-bindgen" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f0f6586c61125fbfc13c3108c3dd565d21f314dd5bac823b9a5b7ab576d21f1" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ - "addr2line 0.21.0", - "anyhow", - "bincode", "cfg-if 1.0.0", - "cpp_demangle", - "gimli 0.28.1", - "log", - "object 0.32.2", - "rustc-demangle", - "rustix", - "serde", - "serde_derive", - "target-lexicon 0.12.16", - "wasmtime-environ", - "wasmtime-jit-icache-coherence", - "wasmtime-runtime", - "windows-sys 0.48.0", -] - -[[package]] -name = "wasmtime-jit-debug" -version = "14.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "109a9e46afe33580b952b14a4207354355f19bcdf0b47485b397b68409eaf553" -dependencies = [ "once_cell", - "wasmtime-versioned-export-macros", + "rustversion", + "wasm-bindgen-macro", ] [[package]] -name = "wasmtime-jit-icache-coherence" -version = "14.0.4" +name = "wasm-bindgen-backend" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f67e6be36375c39cff57ed3b137ab691afbf2d9ba8ee1c01f77888413f218749" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" dependencies = [ - "cfg-if 1.0.0", - "libc", - "windows-sys 0.48.0", + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn 2.0.96", + "wasm-bindgen-shared", ] [[package]] -name = "wasmtime-runtime" -version = "14.0.4" +name = "wasm-bindgen-futures" +version = "0.4.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d07986b2327b5e7f535ed638fbde25990fc8f85400194fda0d26db71c7b685e" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" dependencies = [ - "anyhow", - "cc", "cfg-if 1.0.0", - "indexmap 2.7.0", - "libc", - "log", - "mach", - "memfd", - "memoffset 0.9.1", - "paste", - "rand 0.8.5", - "rustix", - "sptr", - "wasm-encoder 0.35.0", - "wasmtime-asm-macros", - "wasmtime-environ", - "wasmtime-jit-debug", - "wasmtime-versioned-export-macros", - "wasmtime-wmemcheck", - "windows-sys 0.48.0", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", ] [[package]] -name = "wasmtime-types" -version = "14.0.4" +name = "wasm-bindgen-macro" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e810a0d2e869abd1cb42bd232990f6bd211672b3d202d2ae7e70ffb97ed70ea3" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" dependencies = [ - "cranelift-entity", - "serde", - "serde_derive", - "thiserror 1.0.69", - "wasmparser 0.115.0", + "quote", + "wasm-bindgen-macro-support", ] [[package]] -name = "wasmtime-versioned-export-macros" -version = "14.0.4" +name = "wasm-bindgen-macro-support" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09b5575a75e711ca6c36bb9ad647c93541cdc8e34218031acba5da3f35919dd3" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.96", + "wasm-bindgen-backend", + "wasm-bindgen-shared", ] [[package]] -name = "wasmtime-wmemcheck" -version = "14.0.4" +name = "wasm-bindgen-shared" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dafab2db172a53e23940e0fa3078c202f567ee5f13f4b42f66b694fab43c658" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] [[package]] name = "wasmtimer" @@ -12655,7 +10514,7 @@ checksum = "0048ad49a55b9deb3953841fa1fc5858f0efbcb7a18868c899a360269fac1b23" dependencies = [ "futures", "js-sys", - "parking_lot 0.12.3", + "parking_lot", "pin-utils", "slab", "wasm-bindgen", @@ -12663,9 +10522,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.76" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04dd7223427d52553d3702c004d3b2fe07c148165faa56313cb00211e31c12bc" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" dependencies = [ "js-sys", "wasm-bindgen", @@ -12726,18 +10585,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "which" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" -dependencies = [ - "either", - "home", - "once_cell", - "rustix", -] - [[package]] name = "winapi" version = "0.3.9" @@ -12958,9 +10805,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.6.20" +version = "0.6.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" +checksum = "c8d71a593cc5c42ad7876e2c1fda56f314f3754c084128833e64f1345ff8a03a" dependencies = [ "memchr", ] @@ -12978,13 +10825,13 @@ dependencies = [ [[package]] name = "wormhole-bridge-client" version = "0.1.0" -source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs?branch=refactor%2Fsolana-bridge-client#dc416510fc760d22fdf047ac42d68d75da63b0e6" +source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs#0742379055277a83856de23c7b1cba90a297c2b3" dependencies = [ "bridge-connector-common", "derive_builder 0.20.2", "hex", - "near-primitives 0.21.2", - "reqwest 0.11.27", + "near-primitives 0.28.0", + "reqwest 0.12.12", "serde", "serde_json", ] @@ -13079,7 +10926,7 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.96", "synstructure 0.13.1", ] @@ -13101,7 +10948,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.96", ] [[package]] @@ -13121,7 +10968,7 @@ checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.96", "synstructure 0.13.1", ] @@ -13142,20 +10989,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", -] - -[[package]] -name = "zeropool-bn" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71e61de68ede9ffdd69c01664f65a178c5188b73f78faa21f0936016a888ff7c" -dependencies = [ - "byteorder", - "crunchy", - "lazy_static", - "rand 0.8.5", - "rustc-hex", + "syn 2.0.96", ] [[package]] @@ -13177,7 +11011,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.96", ] [[package]] diff --git a/omni-relayer/Cargo.toml b/omni-relayer/Cargo.toml index b5f2ca02..0f946d5d 100644 --- a/omni-relayer/Cargo.toml +++ b/omni-relayer/Cargo.toml @@ -12,7 +12,7 @@ chrono = "0.4" anyhow = "1" futures = "0.3.5" -clap = "4.5" +clap = { version = "4.5", features = ["derive"] } dotenv = "0.15" toml = "0.8.19" serde = { version = "1.0", features = ["derive"] } @@ -30,23 +30,25 @@ ethereum-types = "0.14.1" omni-types = { git = "https://github.com/near-one/omni-bridge", package = "omni-types", rev = "11ffdb63706ceba175f7581585bd837aad9f1559" } near-lake-framework = "0.7.9" -near-jsonrpc-client = "0.13.0" -near-jsonrpc-primitives = "0.26.0" -near-primitives = "0.26.0" -near-crypto = "0.26.0" +near-jsonrpc-client = "0.15.1" +near-jsonrpc-primitives = "0.28.0" +near-primitives = "0.28.0" +near-crypto = "0.28.0" hex = "0.4.3" -secp256k1 = "0.30.0" -alloy = { version = "0.8.3", features = ["node-bindings", "providers", "rpc-types", "sol-types", "provider-ws", "signers", "signer-local"] } +alloy = { version = "0.8", features = ["node-bindings", "providers", "rpc-types", "sol-types", "provider-ws", "signers", "signer-local"] } -redis = { version = "0.27.0", features = ["aio", "tokio-comp"] } +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", branch = "refactor/solana-bridge-client" } +eth-proof = { git = "https://github.com/Near-One/rainbow-bridge-sdk-rs", package = "eth-proof" } -near-bridge-client = { git = "https://github.com/Near-One/rainbow-bridge-sdk-rs", package = "near-bridge-client", branch = "refactor/solana-bridge-client" } -evm-bridge-client = { git = "https://github.com/Near-One/rainbow-bridge-sdk-rs", package = "evm-bridge-client", branch = "refactor/solana-bridge-client"} -solana-bridge-client = { git = "https://github.com/Near-One/rainbow-bridge-sdk-rs", package = "solana-bridge-client", branch = "refactor/solana-bridge-client" } -wormhole-bridge-client = { git = "https://github.com/Near-One/rainbow-bridge-sdk-rs", package = "wormhole-bridge-client", branch = "refactor/solana-bridge-client" } +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" } -omni-connector = { git = "https://github.com/Near-One/rainbow-bridge-sdk-rs", package = "omni-connector", branch = "refactor/solana-bridge-client" } +omni-connector = { git = "https://github.com/Near-One/rainbow-bridge-sdk-rs", package = "omni-connector" } + +[features] +disable_fee_check = [] diff --git a/omni-relayer/example-mainnet-config.toml b/omni-relayer/example-mainnet-config.toml new file mode 100644 index 00000000..0563b050 --- /dev/null +++ b/omni-relayer/example-mainnet-config.toml @@ -0,0 +1,64 @@ +[bridge_indexer] +api_url = "http://127.0.0.1:8080" + +[near] +network = "mainnet" +rpc_url = "https://rpc.mainnet.near.org/" +token_locker_id = "omni.bridge.near" + +[eth] +rpc_http_url = "https://mainnet.infura.io/v3/RPC_API_KEY" +rpc_ws_url = "wss://mainnet.infura.io/ws/v3/RPC_API_KEY" +chain_id = 11_155_111 +bridge_token_factory_address = "0x3701B9859Dbb9a4333A3dd933ab18e9011ddf2C8" +light_client = "client-eth2.sepolia.testnet" +block_processing_batch_size = 10_000 +# https://wormhole.com/docs/build/reference/consistency-levels/ +expected_finalization_time = 1095 + +[base] +rpc_http_url = "https://base-mainnet.infura.io/v3/RPC_API_KEY" +rpc_ws_url = "wss://base-mainnet.infura.io/ws/v3/RPC_API_KEY" +chain_id = 8453 +bridge_token_factory_address = "0xd025b38762B4A4E36F0Cde483b86CB13ea00D989" +block_processing_batch_size = 10_000 +# https://wormhole.com/docs/build/reference/consistency-levels/ +expected_finalization_time = 1026 + +[arb] +rpc_http_url = "https://arbitrum-mainnet.infura.io/v3/RPC_API_KEY" +rpc_ws_url = "wss://arbitrum-sepolia.infura.io/ws/v3/RPC_API_KEY" +chain_id = 42161 +bridge_token_factory_address = "0xd025b38762B4A4E36F0Cde483b86CB13ea00D989" +block_processing_batch_size = 10_000 +# https://wormhole.com/docs/build/reference/consistency-levels/ +expected_finalization_time = 1066 + +[solana] +rpc_http_url = "https://api.mainnet-beta.solana.com" +rpc_ws_url = "wss://api.mainnet-beta.solana.com" +# Program ID on Solana is an account ID whitch the bridge contract (basically bridge_token_factory_address on Solana) +program_id = "" +# This is the wormhole contract ID on Solana (can be found here https://wormhole.com/docs/build/reference/contract-addresses/#__tabbed_1_2) +wormhole_id = "" +# There's a list of account keys and they are store in a strict order. We need indexes to get the right key +init_transfer_sender_index = 0 +init_transfer_token_index = 6 +init_transfer_emitter_index = 15 +init_transfer_sol_sender_index = 0 +init_transfer_sol_emitter_index = 11 +# Discriminators are used to identify the type of the event (can be found during the building process of solana's contract) +init_transfer_discriminator = [174, 50, 134, 99, 122, 243, 243, 224] +init_transfer_sol_discriminator = [124, 167, 164, 191, 81, 140, 108, 30] +finalize_transfer_emitter_index = 9 +finalize_transfer_sol_emitter_index = 8 +finalize_transfer_discriminator = [124, 126, 103, 188, 144, 65, 135, 51] +finalize_transfer_sol_discriminator = [104, 27, 121, 69, 3, 70, 217, 66] + +[wormhole] +api_url = "https://api.wormholescan.io/" +solana_chain_id = 1 +near_chain_id = 15 +eth_chain_id = 2 +arb_chain_id = 23 +base_chain_id = 30 diff --git a/omni-relayer/example-config.toml b/omni-relayer/example-testnet-config.toml similarity index 84% rename from omni-relayer/example-config.toml rename to omni-relayer/example-testnet-config.toml index 4e500a8f..801f2b65 100644 --- a/omni-relayer/example-config.toml +++ b/omni-relayer/example-testnet-config.toml @@ -1,6 +1,9 @@ [redis] url = "redis://127.0.0.1/" +[bridge_indexer] +api_url = "http://127.0.0.1:8080" + [near] network = "testnet" rpc_url = "https://rpc.testnet.near.org/" @@ -13,6 +16,8 @@ chain_id = 11_155_111 bridge_token_factory_address = "0x3701B9859Dbb9a4333A3dd933ab18e9011ddf2C8" light_client = "client-eth2.sepolia.testnet" block_processing_batch_size = 10_000 +# https://wormhole.com/docs/build/reference/consistency-levels/ +expected_finalization_time = 1095 [base] rpc_http_url = "https://base-sepolia.infura.io/v3/API_KEY" @@ -20,6 +25,8 @@ rpc_ws_url = "wss://base-sepolia.infura.io/ws/v3/API_KEY" chain_id = 84_532 bridge_token_factory_address = "0x0C981337fFe39a555d3A40dbb32f21aD0eF33FFA" block_processing_batch_size = 10_000 +# https://wormhole.com/docs/build/reference/consistency-levels/ +expected_finalization_time = 1026 [arb] rpc_http_url = "https://arbitrum-sepolia.infura.io/v3/API_KEY" @@ -27,6 +34,8 @@ rpc_ws_url = "wss://arbitrum-sepolia.infura.io/ws/v3/API_KEY" chain_id = 421_614 bridge_token_factory_address = "0xd025b38762B4A4E36F0Cde483b86CB13ea00D989" block_processing_batch_size = 10_000 +# https://wormhole.com/docs/build/reference/consistency-levels/ +expected_finalization_time = 1066 [solana] rpc_http_url = "https://api.devnet.solana.com" @@ -36,8 +45,10 @@ program_id = "Gy1XPwYZURfBzHiGAxnw3SYC33SfqsEpGSS5zeBge28p" # This is the wormhole contract ID on Solana (can be found here https://wormhole.com/docs/build/reference/contract-addresses/#__tabbed_1_2) wormhole_id = "3u8hJUVTA4jH1wYAyUur7FFZVQ8H635K3tSHHF4ssjQ5" # There's a list of account keys and they are store in a strict order. We need indexes to get the right key +init_transfer_sender_index = 0 init_transfer_token_index = 6 init_transfer_emitter_index = 15 +init_transfer_sol_sender_index = 0 init_transfer_sol_emitter_index = 11 # Discriminators are used to identify the type of the event (can be found during the building process of solana's contract) init_transfer_discriminator = [174, 50, 134, 99, 122, 243, 243, 224] diff --git a/omni-relayer/src/config.rs b/omni-relayer/src/config.rs index 58f1e130..89624d3b 100644 --- a/omni-relayer/src/config.rs +++ b/omni-relayer/src/config.rs @@ -1,6 +1,7 @@ use alloy::primitives::Address; use near_primitives::types::AccountId; use omni_types::ChainKind; +use serde::Deserialize; pub fn get_private_key(chain_kind: ChainKind) -> String { let env_var = match chain_kind { @@ -14,9 +15,22 @@ pub fn get_private_key(chain_kind: ChainKind) -> String { std::env::var(env_var).unwrap_or_else(|_| panic!("Failed to get `{env_var}` env variable")) } -#[derive(Debug, Clone, serde::Deserialize)] +fn replace_rpc_api_key<'de, D>(deserializer: D) -> Result +where + D: serde::Deserializer<'de>, +{ + let url = String::deserialize(deserializer)?; + + let api_key = std::env::var("RPC_API_KEY").map_err(serde::de::Error::custom)?; + + Ok(url.replace("RPC_API_KEY", &api_key)) +} + +#[derive(Debug, Clone, Deserialize)] pub struct Config { pub redis: Redis, + #[cfg(not(feature = "disable_fee_check"))] + pub bridge_indexer: BridgeIndexer, pub near: Near, pub eth: Option, pub base: Option, @@ -25,19 +39,25 @@ pub struct Config { pub wormhole: Wormhole, } -#[derive(Debug, Clone, serde::Deserialize)] +#[derive(Debug, Clone, Deserialize)] pub struct Redis { pub url: String, } -#[derive(Debug, Clone, serde::Deserialize)] +#[cfg(not(feature = "disable_fee_check"))] +#[derive(Debug, Clone, Deserialize)] +pub struct BridgeIndexer { + pub api_url: String, +} + +#[derive(Debug, Clone, Deserialize)] #[serde(rename_all = "lowercase")] pub enum Network { Testnet, Mainnet, } -#[derive(Debug, Clone, serde::Deserialize)] +#[derive(Debug, Clone, Deserialize)] pub struct Near { pub network: Network, pub rpc_url: String, @@ -45,24 +65,31 @@ pub struct Near { pub credentials_path: Option, } -#[derive(Debug, Clone, serde::Deserialize)] +#[derive(Debug, Clone, Deserialize)] pub struct Evm { + #[serde(deserialize_with = "replace_rpc_api_key")] pub rpc_http_url: String, + #[serde(deserialize_with = "replace_rpc_api_key")] pub rpc_ws_url: String, pub chain_id: u64, pub bridge_token_factory_address: Address, pub light_client: Option, pub block_processing_batch_size: u64, + pub expected_finalization_time: i64, } -#[derive(Debug, Clone, serde::Deserialize)] +#[derive(Debug, Clone, Deserialize)] pub struct Solana { + #[serde(deserialize_with = "replace_rpc_api_key")] pub rpc_http_url: String, + #[serde(deserialize_with = "replace_rpc_api_key")] pub rpc_ws_url: String, pub program_id: String, pub wormhole_id: String, + pub init_transfer_sender_index: usize, pub init_transfer_token_index: usize, pub init_transfer_emitter_index: usize, + pub init_transfer_sol_sender_index: usize, pub init_transfer_sol_emitter_index: usize, pub init_transfer_discriminator: Vec, pub init_transfer_sol_discriminator: Vec, @@ -72,7 +99,7 @@ pub struct Solana { pub finalize_transfer_sol_discriminator: Vec, } -#[derive(Debug, Clone, serde::Deserialize)] +#[derive(Debug, Clone, Deserialize)] pub struct Wormhole { pub api_url: String, pub eth_chain_id: u64, diff --git a/omni-relayer/src/main.rs b/omni-relayer/src/main.rs index 7c75f365..b9e1950e 100644 --- a/omni-relayer/src/main.rs +++ b/omni-relayer/src/main.rs @@ -15,12 +15,27 @@ struct CliArgs { /// Path to the configuration file #[clap(short, long, default_value = "config.toml")] config: String, + /// Start block for Near indexer + #[clap(long)] + near_start_block: Option, + /// Start block for Ethereum indexer + #[clap(long)] + eth_start_block: Option, + /// Start block for Base indexer + #[clap(long)] + base_start_block: Option, + /// Start block for Arbitrum indexer + #[clap(long)] + arb_start_block: Option, + /// Start signature for Solana indexer + #[clap(long)] + solana_start_signature: Option, } #[tokio::main] async fn main() -> Result<()> { dotenv::dotenv().ok(); - pretty_env_logger::init(); + pretty_env_logger::init_timed(); let args = CliArgs::parse(); @@ -41,13 +56,30 @@ async fn main() -> Result<()> { let config = config.clone(); let redis_client = redis_client.clone(); let jsonrpc_client = jsonrpc_client.clone(); - async move { startup::near::start_indexer(config, redis_client, jsonrpc_client).await } + async move { + startup::near::start_indexer( + config, + redis_client, + jsonrpc_client, + args.near_start_block, + ) + .await + } })); handles.push(tokio::spawn({ + #[cfg(not(feature = "disable_fee_check"))] let config = config.clone(); let redis_client = redis_client.clone(); let connector = connector.clone(); - async move { workers::near::sign_transfer(config, redis_client, connector).await } + async move { + workers::near::sign_transfer( + #[cfg(not(feature = "disable_fee_check"))] + config, + redis_client, + connector, + ) + .await + } })); handles.push(tokio::spawn({ let redis_client = redis_client.clone(); @@ -59,28 +91,55 @@ async fn main() -> Result<()> { handles.push(tokio::spawn({ let config = config.clone(); let redis_client = redis_client.clone(); - async move { startup::evm::start_indexer(config, redis_client, ChainKind::Eth).await } + async move { + startup::evm::start_indexer( + config, + redis_client, + ChainKind::Eth, + args.eth_start_block, + ) + .await + } })); } if config.base.is_some() { handles.push(tokio::spawn({ let config = config.clone(); let redis_client = redis_client.clone(); - async move { startup::evm::start_indexer(config, redis_client, ChainKind::Base).await } + async move { + startup::evm::start_indexer( + config, + redis_client, + ChainKind::Base, + args.base_start_block, + ) + .await + } })); } if config.arb.is_some() { handles.push(tokio::spawn({ let config = config.clone(); let redis_client = redis_client.clone(); - async move { startup::evm::start_indexer(config, redis_client, ChainKind::Arb).await } + async move { + startup::evm::start_indexer( + config, + redis_client, + ChainKind::Arb, + args.arb_start_block, + ) + .await + } })); } if config.solana.is_some() { handles.push(tokio::spawn({ let config = config.clone(); let redis_client = redis_client.clone(); - async move { startup::solana::start_indexer(config, redis_client).await } + async move { + startup::solana::start_indexer(config, redis_client, args.solana_start_signature) + .await + } })); handles.push(tokio::spawn({ let config = config.clone(); diff --git a/omni-relayer/src/startup/evm.rs b/omni-relayer/src/startup/evm.rs index 220daaac..14fe83a8 100644 --- a/omni-relayer/src/startup/evm.rs +++ b/omni-relayer/src/startup/evm.rs @@ -18,46 +18,55 @@ pub async fn start_indexer( config: config::Config, redis_client: redis::Client, chain_kind: ChainKind, + start_block: Option, ) -> Result<()> { let mut redis_connection = redis_client.get_multiplexed_tokio_connection().await?; - let (rpc_http_url, rpc_ws_url, bridge_token_factory_address, block_processing_batch_size) = - match chain_kind { - ChainKind::Eth => { - let Some(ref eth) = config.eth else { - anyhow::bail!("Failed to get ETH config"); - }; - ( - eth.rpc_http_url.clone(), - eth.rpc_ws_url.clone(), - eth.bridge_token_factory_address, - eth.block_processing_batch_size, - ) - } - ChainKind::Base => { - let Some(ref base) = config.base else { - anyhow::bail!("Failed to get Base config"); - }; - ( - base.rpc_http_url.clone(), - base.rpc_ws_url.clone(), - base.bridge_token_factory_address, - base.block_processing_batch_size, - ) - } - ChainKind::Arb => { - let Some(ref arb) = config.arb else { - anyhow::bail!("Failed to get Arb config"); - }; - ( - arb.rpc_http_url.clone(), - arb.rpc_ws_url.clone(), - arb.bridge_token_factory_address, - arb.block_processing_batch_size, - ) - } - _ => anyhow::bail!("Unsupported chain kind: {:?}", chain_kind), - }; + let ( + rpc_http_url, + rpc_ws_url, + bridge_token_factory_address, + block_processing_batch_size, + expected_finalization_time, + ) = match chain_kind { + ChainKind::Eth => { + let Some(ref eth) = config.eth else { + anyhow::bail!("Failed to get ETH config"); + }; + ( + eth.rpc_http_url.clone(), + eth.rpc_ws_url.clone(), + eth.bridge_token_factory_address, + eth.block_processing_batch_size, + eth.expected_finalization_time, + ) + } + ChainKind::Base => { + let Some(ref base) = config.base else { + anyhow::bail!("Failed to get Base config"); + }; + ( + base.rpc_http_url.clone(), + base.rpc_ws_url.clone(), + base.bridge_token_factory_address, + base.block_processing_batch_size, + base.expected_finalization_time, + ) + } + ChainKind::Arb => { + let Some(ref arb) = config.arb else { + anyhow::bail!("Failed to get Arb config"); + }; + ( + arb.rpc_http_url.clone(), + arb.rpc_ws_url.clone(), + arb.bridge_token_factory_address, + arb.block_processing_batch_size, + arb.expected_finalization_time, + ) + } + _ => anyhow::bail!("Unsupported chain kind: {:?}", chain_kind), + }; let http_provider = ProviderBuilder::new().on_http(rpc_http_url.parse().context(format!( "Failed to parse {:?} rpc provider as url", @@ -71,11 +80,15 @@ pub async fn start_indexer( let last_processed_block_key = utils::redis::get_last_processed_key(chain_kind).await; let latest_block = http_provider.get_block_number().await?; - let from_block = - utils::redis::get_last_processed(&mut redis_connection, &last_processed_block_key) - .await - .unwrap_or(latest_block) - + 1; + let from_block = match start_block { + Some(block) => block, + None => { + utils::redis::get_last_processed(&mut redis_connection, &last_processed_block_key) + .await + .unwrap_or(latest_block) + + 1 + } + }; let filter = Filter::new() .address(bridge_token_factory_address) @@ -98,7 +111,14 @@ pub async fn start_indexer( .await?; for log in logs { - process_log(chain_kind, &mut redis_connection, &http_provider, log).await; + process_log( + chain_kind, + &mut redis_connection, + &http_provider, + log, + expected_finalization_time, + ) + .await; } } @@ -109,7 +129,14 @@ pub async fn start_indexer( let mut stream = ws_provider.subscribe_logs(&filter).await?.into_stream(); while let Some(log) = stream.next().await { - process_log(chain_kind, &mut redis_connection, &http_provider, log).await; + process_log( + chain_kind, + &mut redis_connection, + &http_provider, + log, + expected_finalization_time, + ) + .await; } Ok(()) @@ -120,6 +147,7 @@ async fn process_log( redis_connection: &mut redis::aio::MultiplexedConnection, http_provider: &RootProvider>, log: Log, + expected_finalization_time: i64, ) { let Some(tx_hash) = log.transaction_hash else { warn!("No transaction hash in log: {:?}", log); @@ -150,6 +178,7 @@ async fn process_log( tx_logs: tx_logs.map(Box::new), creation_timestamp: chrono::Utc::now().timestamp(), last_update_timestamp: None, + expected_finalization_time, }, ) .await; @@ -163,6 +192,8 @@ async fn process_log( block_number, log, tx_logs: tx_logs.map(Box::new), + creation_timestamp: chrono::Utc::now().timestamp(), + expected_finalization_time, }, ) .await; diff --git a/omni-relayer/src/startup/near.rs b/omni-relayer/src/startup/near.rs index 69a6279a..c9343d37 100644 --- a/omni-relayer/src/startup/near.rs +++ b/omni-relayer/src/startup/near.rs @@ -68,15 +68,17 @@ async fn create_lake_config( config: &config::Config, redis_connection: &mut redis::aio::MultiplexedConnection, jsonrpc_client: &JsonRpcClient, + start_block: Option, ) -> Result { - let start_block_height = match utils::redis::get_last_processed::<&str, u64>( - redis_connection, - &utils::redis::get_last_processed_key(ChainKind::Near).await, - ) - .await - { - Some(block_height) => block_height + 1, - None => utils::near::get_final_block(jsonrpc_client).await?, + let start_block_height = match start_block { + Some(block) => block, + None => utils::redis::get_last_processed::<&str, u64>( + redis_connection, + &utils::redis::get_last_processed_key(ChainKind::Near).await, + ) + .await + .map(|block_height| block_height + 1) + .unwrap_or(utils::near::get_final_block(jsonrpc_client).await?), }; info!("NEAR Lake will start from block: {}", start_block_height); @@ -99,12 +101,14 @@ pub async fn start_indexer( config: config::Config, redis_client: redis::Client, jsonrpc_client: JsonRpcClient, + start_block: Option, ) -> Result<()> { info!("Starting NEAR indexer"); let mut redis_connection = redis_client.get_multiplexed_tokio_connection().await?; - let lake_config = create_lake_config(&config, &mut redis_connection, &jsonrpc_client).await?; + let lake_config = + create_lake_config(&config, &mut redis_connection, &jsonrpc_client, start_block).await?; let (_, stream) = near_lake_framework::streamer(lake_config); let stream = tokio_stream::wrappers::ReceiverStream::new(stream); diff --git a/omni-relayer/src/startup/solana.rs b/omni-relayer/src/startup/solana.rs index d487f62c..bed619bf 100644 --- a/omni-relayer/src/startup/solana.rs +++ b/omni-relayer/src/startup/solana.rs @@ -14,7 +14,11 @@ use solana_sdk::{commitment_config::CommitmentConfig, pubkey::Pubkey}; use crate::{config, utils}; -pub async fn start_indexer(config: config::Config, redis_client: redis::Client) -> Result<()> { +pub async fn start_indexer( + config: config::Config, + redis_client: redis::Client, + start_signature: Option, +) -> Result<()> { let Some(solana_config) = config.solana else { anyhow::bail!("Failed to get Solana config"); }; @@ -27,8 +31,13 @@ pub async fn start_indexer(config: config::Config, redis_client: redis::Client) let http_client = RpcClient::new(rpc_http_url.to_string()); - if let Err(e) = - process_recent_signatures(&mut redis_connection, &http_client, &program_id).await + if let Err(e) = process_recent_signatures( + &mut redis_connection, + &http_client, + &program_id, + start_signature, + ) + .await { warn!("Failed to fetch recent logs: {}", e); } @@ -75,14 +84,33 @@ async fn process_recent_signatures( redis_connection: &mut redis::aio::MultiplexedConnection, http_client: &RpcClient, program_id: &Pubkey, + start_signature: Option, ) -> Result<()> { - let Some(last_signature) = utils::redis::get_last_processed::<&str, String>( - redis_connection, - &utils::redis::get_last_processed_key(ChainKind::Sol).await, - ) - .await - .map(|s| Signature::from_str(&s).ok()) else { - return Ok(()); + let from_signature = match start_signature { + Some(signature) => { + utils::redis::add_event( + redis_connection, + utils::redis::SOLANA_EVENTS, + signature.clone(), + // TODO: It's better to come up with a solution that wouldn't require storing `Null` value + serde_json::Value::Null, + ) + .await; + + Signature::from_str(&signature)? + } + None => { + let Some(signature) = utils::redis::get_last_processed::<&str, String>( + redis_connection, + &utils::redis::get_last_processed_key(ChainKind::Sol).await, + ) + .await + .and_then(|s| Signature::from_str(&s).ok()) else { + return Ok(()); + }; + + signature + } }; let signatures: Vec = http_client @@ -91,7 +119,7 @@ async fn process_recent_signatures( GetConfirmedSignaturesForAddress2Config { limit: None, before: None, - until: last_signature, + until: Some(from_signature), commitment: Some(CommitmentConfig::confirmed()), }, ) diff --git a/omni-relayer/src/utils/evm.rs b/omni-relayer/src/utils/evm.rs index 93c22657..d6597f87 100644 --- a/omni-relayer/src/utils/evm.rs +++ b/omni-relayer/src/utils/evm.rs @@ -1,12 +1,13 @@ -use std::sync::Arc; +use std::{str::FromStr, sync::Arc}; use log::warn; +use anyhow::Result; use omni_connector::OmniConnector; use omni_types::{ prover_args::{EvmVerifyProofArgs, WormholeVerifyProofArgs}, prover_result::ProofKind, - ChainKind, + ChainKind, OmniAddress, H160, }; use alloy::sol; @@ -141,3 +142,15 @@ pub async fn construct_prover_args( borsh::to_vec(&evm_proof_args).ok() } + +pub async fn string_to_evm_omniaddress( + chain_kind: ChainKind, + address: String, +) -> Result { + OmniAddress::new_from_evm_address( + chain_kind, + H160::from_str(&address) + .map_err(|err| anyhow::anyhow!("Failed to parse as H160 address: {:?}", err))?, + ) + .map_err(|err| anyhow::anyhow!("Failed to parse as EvmOmniAddress address: {:?}", err)) +} diff --git a/omni-relayer/src/utils/fee.rs b/omni-relayer/src/utils/fee.rs new file mode 100644 index 00000000..23f3edd3 --- /dev/null +++ b/omni-relayer/src/utils/fee.rs @@ -0,0 +1,41 @@ +use alloy::primitives::U256; +use anyhow::Result; +use omni_types::{Fee, OmniAddress}; + +use crate::config; + +#[derive(Debug, serde::Deserialize)] +struct TransferFeeResponse { + native_token_fee: Option, + transferred_token_fee: Option, +} + +pub async fn is_fee_sufficient( + config: &config::Config, + provided_fee: Fee, + sender: &OmniAddress, + recipient: &OmniAddress, + token: &OmniAddress, +) -> Result { + let url = format!( + "{}/api/v1/transfer-fee?sender={}&recipient={}&token={}", + config.bridge_indexer.api_url, sender, recipient, token + ); + + let response = reqwest::get(&url) + .await? + .json::() + .await?; + + let native_fee = response.native_token_fee.unwrap_or_default(); + let transferred_fee = response.transferred_token_fee.unwrap_or_default(); + + match (native_fee, transferred_fee) { + (0, 0) => anyhow::bail!("No fee information found"), + (0, fee) if fee > 0 => Ok(provided_fee.fee.0 >= fee), + (native_fee, 0) if native_fee > 0 => Ok(provided_fee.native_fee.0 >= native_fee), + (native_fee, fee) => Ok(U256::from(provided_fee.fee.0) * U256::from(native_fee) + + U256::from(provided_fee.native_fee.0) * U256::from(fee) + >= U256::from(fee) * U256::from(native_fee)), + } +} diff --git a/omni-relayer/src/utils/mod.rs b/omni-relayer/src/utils/mod.rs index 818f92ea..4dbf5190 100644 --- a/omni-relayer/src/utils/mod.rs +++ b/omni-relayer/src/utils/mod.rs @@ -1,4 +1,6 @@ pub mod evm; +#[cfg(not(feature = "disable_fee_check"))] +pub mod fee; pub mod near; pub mod redis; pub mod solana; diff --git a/omni-relayer/src/utils/solana.rs b/omni-relayer/src/utils/solana.rs index b8ccc19d..edfb3ba0 100644 --- a/omni-relayer/src/utils/solana.rs +++ b/omni-relayer/src/utils/solana.rs @@ -75,19 +75,25 @@ async fn decode_instruction( .context("Decoded data is too short")?; if let Ok(payload) = InitTransferPayload::deserialize(&mut payload_data) { - let (token, emitter) = if discriminator == &solana.init_transfer_discriminator { + let (sender, token, emitter) = if discriminator == &solana.init_transfer_discriminator { + let sender = account_keys + .get(solana.init_transfer_sender_index) + .context("Missing sender account key")?; let token = account_keys .get(solana.init_transfer_token_index) .context("Missing token account key")?; let emitter = account_keys .get(solana.init_transfer_emitter_index) .context("Missing emitter account key")?; - (token, emitter) + (sender, token, emitter) } else { + let sender = account_keys + .get(solana.init_transfer_sol_sender_index) + .context("Missing SOL sender account key")?; let emitter = account_keys .get(solana.init_transfer_sol_emitter_index) .context("Missing SOL emitter account key")?; - (&Pubkey::default().to_string(), emitter) + (sender, &Pubkey::default().to_string(), emitter) }; if let Some(OptionSerializer::Some(logs)) = @@ -116,6 +122,7 @@ async fn decode_instruction( InitTransferWithTimestamp { amount: payload.amount, token: token.clone(), + sender: sender.clone(), recipient: payload.recipient.clone(), fee: payload.fee, native_fee: payload.native_fee, diff --git a/omni-relayer/src/utils/storage.rs b/omni-relayer/src/utils/storage.rs index 4376cc14..56a95ad3 100644 --- a/omni-relayer/src/utils/storage.rs +++ b/omni-relayer/src/utils/storage.rs @@ -4,9 +4,11 @@ use anyhow::Result; use near_primitives::types::AccountId; use omni_connector::OmniConnector; -use omni_types::{locker_args::StorageDepositAction, ChainKind, OmniAddress, H160}; +use omni_types::{locker_args::StorageDepositAction, ChainKind, OmniAddress}; use solana_sdk::pubkey::Pubkey; +use crate::utils; + async fn get_token_id( connector: &OmniConnector, chain_kind: ChainKind, @@ -23,10 +25,9 @@ async fn get_token_id( Ok(OmniAddress::Near(token)) } ChainKind::Eth | ChainKind::Base | ChainKind::Arb => { - let token = H160::from_str(token_address).map_err(|_| { - format!("Failed to parse token address as H160: {:?}", token_address) - })?; - OmniAddress::new_from_evm_address(chain_kind, token) + utils::evm::string_to_evm_omniaddress(chain_kind, token_address.to_string()) + .await + .map_err(|err| err.to_string()) } ChainKind::Sol => { let token = Pubkey::from_str(token_address).map_err(|_| { diff --git a/omni-relayer/src/workers/evm.rs b/omni-relayer/src/workers/evm.rs index 2dac2986..56a0e507 100644 --- a/omni-relayer/src/workers/evm.rs +++ b/omni-relayer/src/workers/evm.rs @@ -2,11 +2,13 @@ use std::sync::Arc; use anyhow::Result; use futures::future::join_all; -use log::{error, info, warn}; +use log::{info, warn}; use alloy::rpc::types::{Log, TransactionReceipt}; 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 crate::{config, utils}; @@ -19,6 +21,7 @@ pub struct InitTransferWithTimestamp { pub tx_logs: Option>, pub creation_timestamp: i64, pub last_update_timestamp: Option, + pub expected_finalization_time: i64, } pub async fn finalize_transfer( @@ -85,6 +88,13 @@ async fn handle_init_transfer_event( ) { let current_timestamp = chrono::Utc::now().timestamp(); + if current_timestamp + < init_transfer_with_timestamp.creation_timestamp + + init_transfer_with_timestamp.expected_finalization_time + { + return; + } + if current_timestamp - init_transfer_with_timestamp .last_update_timestamp @@ -94,18 +104,15 @@ async fn handle_init_transfer_event( return; } - let init_log = match init_transfer_with_timestamp + let Ok(init_log) = init_transfer_with_timestamp .log .log_decode::() - { - Ok(init_log) => init_log, - Err(_) => { - warn!( - "Failed to decode log as InitTransfer: {:?}", - init_transfer_with_timestamp.log - ); - return; - } + else { + warn!( + "Failed to decode log as InitTransfer: {:?}", + init_transfer_with_timestamp.log + ); + return; }; info!( @@ -113,26 +120,73 @@ async fn handle_init_transfer_event( init_transfer_with_timestamp.chain_kind ); - let tx_hash = match init_transfer_with_timestamp.log.transaction_hash { - Some(tx_hash) => tx_hash, - None => { - warn!("No transaction hash in log: {:?}", init_log); - return; - } + let Some(tx_hash) = init_transfer_with_timestamp.log.transaction_hash else { + warn!("No transaction hash in log: {:?}", init_log); + return; }; - let recipient = match init_log.inner.recipient.parse::() { - Ok(recipient) => recipient, - Err(_) => { - warn!( - "Failed to parse recipient as OmniAddress: {:?}", - init_log.inner.recipient - ); - return; - } + let Ok(recipient) = init_log.inner.recipient.parse::() else { + warn!( + "Failed to parse recipient as OmniAddress: {:?}", + init_log.inner.recipient + ); + return; }; - // TODO: Use existing API to check if fee is sufficient here + #[cfg(not(feature = "disable_fee_check"))] + { + let sender = match utils::evm::string_to_evm_omniaddress( + init_transfer_with_timestamp.chain_kind, + init_log.inner.sender.to_string(), + ) + .await + { + Ok(sender) => sender, + Err(err) => { + warn!("{}", err); + return; + } + }; + + let token = match utils::evm::string_to_evm_omniaddress( + init_transfer_with_timestamp.chain_kind, + init_log.inner.tokenAddress.to_string(), + ) + .await + { + Ok(token) => token, + Err(err) => { + warn!("{}", err); + return; + } + }; + + match utils::fee::is_fee_sufficient( + &config, + Fee { + fee: init_log.inner.fee.into(), + native_fee: init_log.inner.nativeFee.into(), + }, + &sender, + &recipient, + &token, + ) + .await + { + Ok(true) => {} + Ok(false) => { + warn!( + "Insufficient fee for transfer: {:?}", + init_transfer_with_timestamp + ); + return; + } + Err(err) => { + warn!("Failed to check fee sufficiency: {}", err); + return; + } + } + } let vaa = utils::evm::get_vaa_from_evm_log( connector.clone(), @@ -156,6 +210,7 @@ async fn handle_init_transfer_event( }; if init_transfer_with_timestamp.block_number > light_client_latest_block_number { + warn!("ETH light client is not synced yet"); tokio::time::sleep(tokio::time::Duration::from_secs( utils::redis::SLEEP_TIME_AFTER_EVENTS_PROCESS_SECS, )) @@ -231,7 +286,7 @@ async fn handle_init_transfer_event( ) .await; } - Err(err) => error!("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 cc6bec61..bbc0a5ab 100644 --- a/omni-relayer/src/workers/near.rs +++ b/omni-relayer/src/workers/near.rs @@ -26,6 +26,7 @@ pub struct InitTransferWithTimestamp { } pub async fn sign_transfer( + #[cfg(not(feature = "disable_fee_check"))] config: config::Config, redis_client: redis::Client, connector: Arc, @@ -53,6 +54,7 @@ pub async fn sign_transfer( serde_json::from_str::(&event) { handlers.push(tokio::spawn({ + #[cfg(not(feature = "disable_fee_check"))] let config = config.clone(); let mut redis_connection = redis_connection.clone(); let connector = connector.clone(); @@ -90,13 +92,31 @@ pub async fn sign_transfer( "Received InitTransferEvent/FinTransferEvent/UpdateFeeEvent", ); + #[cfg(not(feature = "disable_fee_check"))] + match utils::fee::is_fee_sufficient( + &config, + transfer_message.fee.clone(), + &transfer_message.sender, + &transfer_message.recipient, + &transfer_message.token + ).await { + Ok(true) => {} + Ok(false) => { + warn!("Insufficient fee for transfer: {:?}", transfer_message); + return; + } + Err(err) => { + warn!("Failed to check fee sufficiency: {}", err); + return; + } + } - // TODO: Use existing API to check if fee is sufficient - - let fee_recipient = connector + let Ok(fee_recipient) = connector .near_bridge_client() - .and_then(|connector| connector.signer().map(|signer| signer.account_id)) - .unwrap_or(config.near.token_locker_id.clone()); + .and_then(|connector| connector.signer().map(|signer| signer.account_id)) else { + warn!("Failed to set signer account id as fee recipient"); + return; + }; match connector .near_sign_transfer( @@ -119,7 +139,7 @@ pub async fn sign_transfer( .await; } Err(err) => { - error!("Failed to sign transfer: {}", err); + warn!("Failed to sign transfer: {}", err); } } @@ -190,6 +210,23 @@ pub async fn finalize_transfer( info!("Received SignTransferEvent"); + let fee_recipient = connector + .near_bridge_client() + .and_then(|connector| connector.signer().map(|signer| signer.account_id)).ok(); + + if message_payload.fee_recipient != fee_recipient { + warn!( + "Fee recipient mismatch: expected {:?}, got {:?}", + fee_recipient, message_payload.fee_recipient + ); + utils::redis::remove_event( + &mut redis_connection, + utils::redis::NEAR_SIGN_TRANSFER_EVENTS, + &key, + ).await; + return; + } + let fin_transfer_args = match message_payload.recipient.get_chain() { ChainKind::Near => { warn!("Near to Near transfers are not supported yet"); @@ -229,7 +266,7 @@ pub async fn finalize_transfer( .await; } Err(err) => { - error!("Failed to finalize deposit: {}", err); + warn!("Failed to finalize deposit: {}", err); } } } @@ -253,6 +290,8 @@ pub enum FinTransfer { block_number: u64, log: Log, tx_logs: Option>, + creation_timestamp: i64, + expected_finalization_time: i64, }, Solana { emitter: String, @@ -292,10 +331,10 @@ pub async fn claim_fee( block_number, log, tx_logs, + creation_timestamp, + expected_finalization_time } = fin_transfer { - info!("Trying to process FinTransfer log on {:?}", chain_kind); - handlers.push(tokio::spawn({ let config = config.clone(); let mut redis_connection = redis_connection.clone(); @@ -303,7 +342,13 @@ pub async fn claim_fee( let jsonrpc_client = jsonrpc_client.clone(); async move { - info!("Received finalized transfer"); + let current_timestamp = chrono::Utc::now().timestamp(); + + if current_timestamp < creation_timestamp + expected_finalization_time { + return; + } + + info!("Trying to process FinTransfer log on {:?}", chain_kind); let vaa = utils::evm::get_vaa_from_evm_log( connector.clone(), diff --git a/omni-relayer/src/workers/solana.rs b/omni-relayer/src/workers/solana.rs index 8546a26c..84b8fa49 100644 --- a/omni-relayer/src/workers/solana.rs +++ b/omni-relayer/src/workers/solana.rs @@ -2,13 +2,17 @@ use std::{str::FromStr, sync::Arc}; use anyhow::Result; use futures::future::join_all; -use log::{error, info, warn}; +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 solana_client::nonblocking::rpc_client::RpcClient; +#[cfg(not(feature = "disable_fee_check"))] +use solana_sdk::pubkey::Pubkey; use solana_sdk::signature::Signature; use solana_transaction_status::{UiMessage, UiTransactionEncoding}; @@ -94,8 +98,8 @@ pub async fn process_signature(config: config::Config, redis_client: redis::Clie ) .await; } - Err(e) => { - warn!("Failed to fetch transaction (probably signature wasn't finalized yet): {}", e); + Err(err) => { + warn!("Failed to fetch transaction (probably signature wasn't finalized yet): {}", err); } }; } @@ -115,6 +119,7 @@ pub async fn process_signature(config: config::Config, redis_client: redis::Clie pub struct InitTransferWithTimestamp { pub amount: u128, pub token: String, + pub sender: String, pub recipient: String, pub fee: u128, pub native_fee: u64, @@ -210,7 +215,64 @@ async fn handle_init_transfer_event( } }; - // TODO: Use existing API to check if fee is sufficient here + #[cfg(not(feature = "disable_fee_check"))] + { + let Ok(sender) = Pubkey::from_str(&init_transfer_with_timestamp.sender) else { + warn!( + "Failed to parse sender address as Pubkey: {:?}", + init_transfer_with_timestamp.sender + ); + return; + }; + let Ok(sender) = OmniAddress::new_from_slice(ChainKind::Sol, &sender.to_bytes()) else { + warn!( + "Failed to convert sender address to OmniAddress: {:?}", + init_transfer_with_timestamp.sender + ); + return; + }; + + let Ok(token) = Pubkey::from_str(&init_transfer_with_timestamp.token) else { + warn!( + "Failed to parse token address as Pubkey: {:?}", + init_transfer_with_timestamp.token + ); + return; + }; + let Ok(token) = OmniAddress::new_from_slice(ChainKind::Sol, &token.to_bytes()) else { + warn!( + "Failed to convert token address to OmniAddress: {:?}", + init_transfer_with_timestamp.token + ); + return; + }; + + match utils::fee::is_fee_sufficient( + &config, + Fee { + fee: init_transfer_with_timestamp.fee.into(), + native_fee: (init_transfer_with_timestamp.native_fee as u128).into(), + }, + &sender, + &recipient, + &token, + ) + .await + { + Ok(true) => {} + Ok(false) => { + warn!( + "Insufficient fee for transfer: {:?}", + init_transfer_with_timestamp + ); + return; + } + Err(err) => { + warn!("Failed to check fee sufficiency: {}", err); + return; + } + } + } let Ok(vaa) = connector .wormhole_get_vaa( @@ -269,7 +331,7 @@ async fn handle_init_transfer_event( ) .await; } - Err(err) => error!("Failed to finalize InitTransfer: {}", err), + Err(err) => warn!("Failed to finalize InitTransfer: {}", err), } if current_timestamp - init_transfer_with_timestamp.creation_timestamp From 69ac95a53c5b153d9e8f07508c259cb8a15a9a53 Mon Sep 17 00:00:00 2001 From: Ivan Frolov Date: Tue, 14 Jan 2025 21:00:59 -0500 Subject: [PATCH 09/21] chore: synced changes with main --- .catalog-info.yaml | 17 + .github/workflows/build-contracts.yaml | 72 + .github/workflows/check-wasm.yaml | 25 + .github/workflows/evm.yaml | 46 + .github/workflows/rust.yaml | 78 + .github/workflows/security-analysis.yaml | 19 + .gitignore | 5 + Makefile | 30 + e2e-testing/.gitignore | 17 + e2e-testing/Makefile | 190 + e2e-testing/README.md | 63 + e2e-testing/bin/eNear_creation.template | 1 + e2e-testing/evm_scripts/.env.example | 2 + e2e-testing/evm_scripts/hardhat.config.ts | 164 + e2e-testing/evm_scripts/package.json | 47 + .../E2ETestToken/contracts/E2ETestToken.sol | 14 + e2e-testing/evm_scripts/tsconfig.json | 16 + e2e-testing/evm_scripts/yarn.lock | 3510 ++++ e2e-testing/scripts/deploy-near-contract.sh | 38 + evm/.env.example | 5 + evm/.gitignore | 8 + evm/.openzeppelin/arbitrum-one.json | 534 + evm/.openzeppelin/base.json | 534 + evm/README.md | 31 + evm/biome.json | 33 + evm/bridge-token-factory/.env | 7 - evm/bridge-token-factory/.eslintrc.json | 19 - evm/bridge-token-factory/.gitignore | 6 - evm/bridge-token-factory/.prettierrc.json | 0 evm/bridge-token-factory/build.sh | 15 - .../contracts/BridgeTokenFactory.sol | 412 - .../contracts/BridgeTokenFactoryWormhole.sol | 87 - evm/bridge-token-factory/hardhat.config.js | 180 - evm/bridge-token-factory/package.json | 53 - evm/bridge-token-factory/test/BridgeToken.js | 832 - .../test/BridgeTokenWormhole.js | 125 - evm/bridge-token-factory/test/helpers/kdf.js | 88 - .../test/helpers/signatures.js | 79 - evm/bridge-token-factory/yarn.lock | 14678 ---------------- evm/hardhat.config.ts | 311 + evm/package.json | 47 + .../contracts => src/common}/Borsh.sol | 20 +- evm/src/common/ICustomMinter.sol | 7 + evm/src/eNear/README.md | 27 + evm/src/eNear/contracts/ENearProxy.sol | 59 + evm/src/eNear/contracts/FakeProver.sol | 12 + evm/src/eNear/contracts/IENear.sol | 16 + evm/src/eNear/scripts.ts | 55 + evm/src/omni-bridge/.catalog-info.yaml | 21 + .../omni-bridge}/contracts/BridgeToken.sol | 0 evm/src/omni-bridge/contracts/BridgeTypes.sol | 71 + evm/src/omni-bridge/contracts/OmniBridge.sol | 333 + .../contracts/OmniBridgeWormhole.sol | 145 + .../contracts/SelectivePausableUpgradable.sol | 0 .../contracts/test/TestBridgeToken.sol | 0 .../contracts/test/TestWormhole.sol | 7 +- evm/tests/BridgeToken.ts | 497 + evm/tests/BridgeTokenWormhole.ts | 230 + evm/tests/eNearProxy.test.ts | 137 + evm/tests/helpers/signatures.ts | 144 + evm/tsconfig.json | 16 + evm/utils/kdf.ts | 70 + evm/yarn.lock | 3555 ++++ near/Cargo.lock | 155 +- near/Cargo.toml | 7 +- near/build.sh | 101 + near/mock/mock-prover/src/lib.rs | 13 +- near/mock/mock-token/src/lib.rs | 16 +- near/nep141-locker/src/lib.rs | 858 - near/omni-bridge/.catalog-info.yaml | 19 + .../{nep141-locker => omni-bridge}/Cargo.lock | 0 near/omni-bridge/Cargo.toml | 21 + .../src/errors.rs | 0 near/omni-bridge/src/lib.rs | 1299 ++ .../src/storage.rs | 77 +- near/omni-bridge/src/tests/lib_test.rs | 744 + near/omni-bridge/src/tests/mod.rs | 1 + .../omni-prover/evm-prover/.catalog-info.yaml | 21 + near/omni-prover/evm-prover/build.sh | 32 - near/omni-prover/evm-prover/src/lib.rs | 56 +- .../omni-prover/.catalog-info.yaml | 21 + near/omni-prover/omni-prover/build.sh | 32 - near/omni-prover/omni-prover/src/lib.rs | 1 + .../.catalog-info.yaml | 21 + .../wormhole-omni-prover-proxy/build.sh | 32 - .../wormhole-omni-prover-proxy/src/lib.rs | 23 +- .../src/parsed_vaa.rs | 168 +- near/omni-tests/Cargo.toml | 3 +- near/omni-tests/src/fin_transfer.rs | 257 + near/omni-tests/src/helpers.rs | 160 + near/omni-tests/src/init_transfer.rs | 754 + near/omni-tests/src/lib.rs | 260 +- near/omni-tests/src/omni_token.rs | 437 + near/omni-token/.catalog-info.yaml | 13 + near/omni-token/Cargo.toml | 14 + near/omni-token/src/lib.rs | 287 + near/omni-token/src/omni_ft.rs | 35 + near/omni-types/.catalog-info.yaml | 14 + near/omni-types/src/evm/events.rs | 109 +- near/omni-types/src/evm/header.rs | 2 +- near/omni-types/src/evm/mod.rs | 3 +- near/omni-types/src/lib.rs | 291 +- near/omni-types/src/locker_args.rs | 19 +- near/omni-types/src/mpc_types.rs | 12 +- near/omni-types/src/near_events.rs | 13 +- near/omni-types/src/prover_result.rs | 29 +- near/omni-types/src/sol_address.rs | 75 + near/omni-types/src/tests/lib_test.rs | 458 + near/omni-types/src/tests/mod.rs | 1 + near/omni-types/src/{evm => }/utils.rs | 0 near/res/evm_prover.wasm | Bin 0 -> 232531 bytes near/res/omni_bridge.wasm | Bin 0 -> 577334 bytes near/res/omni_prover.wasm | Bin 0 -> 329724 bytes near/res/omni_token.wasm | Bin 0 -> 256703 bytes near/res/token_deployer.wasm | Bin 0 -> 599002 bytes near/res/wormhole_omni_prover_proxy.wasm | Bin 0 -> 169593 bytes near/rust-toolchain | 2 +- .../Cargo.toml | 3 +- near/token-deployer/src/lib.rs | 85 + omni-relayer/.catalog-info.yaml | 14 + omni-relayer/src/startup/eth.rs | 316 + .../bridge_token_factory/.catalog-info.yaml | 13 + solana/bridge_token_factory/.gitignore | 8 + solana/bridge_token_factory/.prettierignore | 7 + solana/bridge_token_factory/Anchor.toml | 27 + solana/bridge_token_factory/Cargo.lock | 2850 +++ solana/bridge_token_factory/Cargo.toml | 14 + .../bridge_token_factory/migrations/deploy.ts | 12 + solana/bridge_token_factory/package.json | 14 + solana/bridge_token_factory/pnpm-lock.yaml | 5431 ++++++ .../bridge_token_factory/pnpm-workspace.yaml | 3 + .../programs/bridge_token_factory/Cargo.toml | 37 + .../programs/bridge_token_factory/Xargo.toml | 2 + .../programs/bridge_token_factory/build.rs | 12 + .../bridge_token_factory/src/constants.rs | 34 + .../bridge_token_factory/src/error.rs | 21 + .../src/instructions/admin/initialize.rs | 190 + .../src/instructions/admin/mod.rs | 3 + .../src/instructions/mod.rs | 6 + .../src/instructions/user/deploy_token.rs | 100 + .../instructions/user/finalize_transfer.rs | 144 + .../user/finalize_transfer_sol.rs | 98 + .../src/instructions/user/init_transfer.rs | 126 + .../instructions/user/init_transfer_sol.rs | 55 + .../src/instructions/user/log_metadata.rs | 138 + .../src/instructions/user/mod.rs | 13 + .../src/instructions/wormhole_cpi.rs | 112 + .../programs/bridge_token_factory/src/lib.rs | 114 + .../bridge_token_factory/src/state/config.rs | 26 + .../src/state/message/deploy_token.rs | 54 + .../src/state/message/finalize_transfer.rs | 75 + .../src/state/message/init_transfer.rs | 45 + .../src/state/message/log_metadata.rs | 36 + .../src/state/message/mod.rs | 74 + .../bridge_token_factory/src/state/mod.rs | 3 + .../src/state/used_nonces.rs | 111 + .../bridge_token_factory/ts/cli/.editorconfig | 8 + .../bridge_token_factory/ts/cli/.eslintignore | 1 + .../ts/cli/.eslintrc.json | 3 + .../ts/cli/.prettierrc.js | 3 + .../ts/cli/package-lock.json | 108 + .../bridge_token_factory/ts/cli/package.json | 33 + solana/bridge_token_factory/ts/cli/src/cli.ts | 39 + .../ts/cli/src/context.ts | 145 + .../ts/cli/src/createToken.ts | 228 + .../ts/cli/src/deployToken.ts | 39 + .../ts/cli/src/executor.ts | 228 + .../ts/cli/src/finalizeTransferBridged.ts | 44 + .../ts/cli/src/finalizeTransferNative.ts | 45 + .../bridge_token_factory/ts/cli/src/index.ts | 7 + .../ts/cli/src/initTransferBridged.ts | 36 + .../ts/cli/src/initTransferNative.ts | 38 + .../ts/cli/src/initialize.ts | 19 + .../ts/cli/src/keyParser.ts | 35 + .../ts/cli/src/registerMint.ts | 40 + .../bridge_token_factory/ts/cli/tsconfig.json | 12 + .../bridge_token_factory/ts/sdk/.editorconfig | 8 + .../bridge_token_factory/ts/sdk/.eslintignore | 1 + .../ts/sdk/.eslintrc.json | 3 + .../ts/sdk/.prettierrc.cjs | 3 + .../ts/sdk/package-lock.json | 111 + .../bridge_token_factory/ts/sdk/package.json | 42 + .../ts/sdk/src/bridge_token_factory.json | 2180 +++ .../ts/sdk/src/bridge_token_factory.ts | 2186 +++ .../bridge_token_factory/ts/sdk/src/index.ts | 633 + .../bridge_token_factory/ts/sdk/tsconfig.json | 16 + .../ts/sdk/vite.config.ts | 14 + solana/bridge_token_factory/tsconfig.json | 110 + 188 files changed, 33597 insertions(+), 18073 deletions(-) create mode 100644 .catalog-info.yaml create mode 100644 .github/workflows/build-contracts.yaml create mode 100644 .github/workflows/check-wasm.yaml create mode 100644 .github/workflows/evm.yaml create mode 100644 .github/workflows/rust.yaml create mode 100644 .github/workflows/security-analysis.yaml create mode 100644 Makefile create mode 100644 e2e-testing/.gitignore create mode 100644 e2e-testing/Makefile create mode 100644 e2e-testing/README.md create mode 100644 e2e-testing/bin/eNear_creation.template create mode 100644 e2e-testing/evm_scripts/.env.example create mode 100644 e2e-testing/evm_scripts/hardhat.config.ts create mode 100644 e2e-testing/evm_scripts/package.json create mode 100644 e2e-testing/evm_scripts/src/E2ETestToken/contracts/E2ETestToken.sol create mode 100644 e2e-testing/evm_scripts/tsconfig.json create mode 100644 e2e-testing/evm_scripts/yarn.lock create mode 100755 e2e-testing/scripts/deploy-near-contract.sh create mode 100644 evm/.env.example create mode 100644 evm/.gitignore create mode 100644 evm/.openzeppelin/arbitrum-one.json create mode 100644 evm/.openzeppelin/base.json create mode 100644 evm/README.md create mode 100644 evm/biome.json delete mode 100644 evm/bridge-token-factory/.env delete mode 100644 evm/bridge-token-factory/.eslintrc.json delete mode 100644 evm/bridge-token-factory/.gitignore delete mode 100644 evm/bridge-token-factory/.prettierrc.json delete mode 100755 evm/bridge-token-factory/build.sh delete mode 100644 evm/bridge-token-factory/contracts/BridgeTokenFactory.sol delete mode 100644 evm/bridge-token-factory/contracts/BridgeTokenFactoryWormhole.sol delete mode 100644 evm/bridge-token-factory/hardhat.config.js delete mode 100644 evm/bridge-token-factory/package.json delete mode 100644 evm/bridge-token-factory/test/BridgeToken.js delete mode 100644 evm/bridge-token-factory/test/BridgeTokenWormhole.js delete mode 100644 evm/bridge-token-factory/test/helpers/kdf.js delete mode 100644 evm/bridge-token-factory/test/helpers/signatures.js delete mode 100644 evm/bridge-token-factory/yarn.lock create mode 100644 evm/hardhat.config.ts create mode 100644 evm/package.json rename evm/{bridge-token-factory/contracts => src/common}/Borsh.sol (70%) create mode 100644 evm/src/common/ICustomMinter.sol create mode 100644 evm/src/eNear/README.md create mode 100644 evm/src/eNear/contracts/ENearProxy.sol create mode 100644 evm/src/eNear/contracts/FakeProver.sol create mode 100644 evm/src/eNear/contracts/IENear.sol create mode 100644 evm/src/eNear/scripts.ts create mode 100644 evm/src/omni-bridge/.catalog-info.yaml rename evm/{bridge-token-factory => src/omni-bridge}/contracts/BridgeToken.sol (100%) create mode 100644 evm/src/omni-bridge/contracts/BridgeTypes.sol create mode 100644 evm/src/omni-bridge/contracts/OmniBridge.sol create mode 100644 evm/src/omni-bridge/contracts/OmniBridgeWormhole.sol rename evm/{bridge-token-factory => src/omni-bridge}/contracts/SelectivePausableUpgradable.sol (100%) rename evm/{bridge-token-factory => src/omni-bridge}/contracts/test/TestBridgeToken.sol (100%) rename evm/{bridge-token-factory => src/omni-bridge}/contracts/test/TestWormhole.sol (73%) create mode 100644 evm/tests/BridgeToken.ts create mode 100644 evm/tests/BridgeTokenWormhole.ts create mode 100644 evm/tests/eNearProxy.test.ts create mode 100644 evm/tests/helpers/signatures.ts create mode 100644 evm/tsconfig.json create mode 100644 evm/utils/kdf.ts create mode 100644 evm/yarn.lock create mode 100755 near/build.sh delete mode 100644 near/nep141-locker/src/lib.rs create mode 100644 near/omni-bridge/.catalog-info.yaml rename near/{nep141-locker => omni-bridge}/Cargo.lock (100%) create mode 100644 near/omni-bridge/Cargo.toml rename near/{nep141-locker => omni-bridge}/src/errors.rs (100%) create mode 100644 near/omni-bridge/src/lib.rs rename near/{nep141-locker => omni-bridge}/src/storage.rs (65%) create mode 100644 near/omni-bridge/src/tests/lib_test.rs create mode 100644 near/omni-bridge/src/tests/mod.rs create mode 100644 near/omni-prover/evm-prover/.catalog-info.yaml delete mode 100755 near/omni-prover/evm-prover/build.sh create mode 100644 near/omni-prover/omni-prover/.catalog-info.yaml delete mode 100755 near/omni-prover/omni-prover/build.sh create mode 100644 near/omni-prover/wormhole-omni-prover-proxy/.catalog-info.yaml delete mode 100755 near/omni-prover/wormhole-omni-prover-proxy/build.sh create mode 100644 near/omni-tests/src/fin_transfer.rs create mode 100644 near/omni-tests/src/helpers.rs create mode 100644 near/omni-tests/src/init_transfer.rs create mode 100644 near/omni-tests/src/omni_token.rs create mode 100644 near/omni-token/.catalog-info.yaml create mode 100644 near/omni-token/Cargo.toml create mode 100644 near/omni-token/src/lib.rs create mode 100644 near/omni-token/src/omni_ft.rs create mode 100644 near/omni-types/.catalog-info.yaml create mode 100644 near/omni-types/src/sol_address.rs create mode 100644 near/omni-types/src/tests/lib_test.rs create mode 100644 near/omni-types/src/tests/mod.rs rename near/omni-types/src/{evm => }/utils.rs (100%) create mode 100755 near/res/evm_prover.wasm create mode 100755 near/res/omni_bridge.wasm create mode 100755 near/res/omni_prover.wasm create mode 100755 near/res/omni_token.wasm create mode 100755 near/res/token_deployer.wasm create mode 100755 near/res/wormhole_omni_prover_proxy.wasm rename near/{nep141-locker => token-deployer}/Cargo.toml (85%) create mode 100644 near/token-deployer/src/lib.rs create mode 100644 omni-relayer/.catalog-info.yaml create mode 100644 omni-relayer/src/startup/eth.rs create mode 100644 solana/bridge_token_factory/.catalog-info.yaml create mode 100644 solana/bridge_token_factory/.gitignore create mode 100644 solana/bridge_token_factory/.prettierignore create mode 100644 solana/bridge_token_factory/Anchor.toml create mode 100644 solana/bridge_token_factory/Cargo.lock create mode 100644 solana/bridge_token_factory/Cargo.toml create mode 100644 solana/bridge_token_factory/migrations/deploy.ts create mode 100644 solana/bridge_token_factory/package.json create mode 100644 solana/bridge_token_factory/pnpm-lock.yaml create mode 100644 solana/bridge_token_factory/pnpm-workspace.yaml create mode 100644 solana/bridge_token_factory/programs/bridge_token_factory/Cargo.toml create mode 100644 solana/bridge_token_factory/programs/bridge_token_factory/Xargo.toml create mode 100644 solana/bridge_token_factory/programs/bridge_token_factory/build.rs create mode 100644 solana/bridge_token_factory/programs/bridge_token_factory/src/constants.rs create mode 100644 solana/bridge_token_factory/programs/bridge_token_factory/src/error.rs create mode 100644 solana/bridge_token_factory/programs/bridge_token_factory/src/instructions/admin/initialize.rs create mode 100644 solana/bridge_token_factory/programs/bridge_token_factory/src/instructions/admin/mod.rs create mode 100644 solana/bridge_token_factory/programs/bridge_token_factory/src/instructions/mod.rs create mode 100644 solana/bridge_token_factory/programs/bridge_token_factory/src/instructions/user/deploy_token.rs create mode 100644 solana/bridge_token_factory/programs/bridge_token_factory/src/instructions/user/finalize_transfer.rs create mode 100644 solana/bridge_token_factory/programs/bridge_token_factory/src/instructions/user/finalize_transfer_sol.rs create mode 100644 solana/bridge_token_factory/programs/bridge_token_factory/src/instructions/user/init_transfer.rs create mode 100644 solana/bridge_token_factory/programs/bridge_token_factory/src/instructions/user/init_transfer_sol.rs create mode 100644 solana/bridge_token_factory/programs/bridge_token_factory/src/instructions/user/log_metadata.rs create mode 100644 solana/bridge_token_factory/programs/bridge_token_factory/src/instructions/user/mod.rs create mode 100644 solana/bridge_token_factory/programs/bridge_token_factory/src/instructions/wormhole_cpi.rs create mode 100644 solana/bridge_token_factory/programs/bridge_token_factory/src/lib.rs create mode 100644 solana/bridge_token_factory/programs/bridge_token_factory/src/state/config.rs create mode 100644 solana/bridge_token_factory/programs/bridge_token_factory/src/state/message/deploy_token.rs create mode 100644 solana/bridge_token_factory/programs/bridge_token_factory/src/state/message/finalize_transfer.rs create mode 100644 solana/bridge_token_factory/programs/bridge_token_factory/src/state/message/init_transfer.rs create mode 100644 solana/bridge_token_factory/programs/bridge_token_factory/src/state/message/log_metadata.rs create mode 100644 solana/bridge_token_factory/programs/bridge_token_factory/src/state/message/mod.rs create mode 100644 solana/bridge_token_factory/programs/bridge_token_factory/src/state/mod.rs create mode 100644 solana/bridge_token_factory/programs/bridge_token_factory/src/state/used_nonces.rs create mode 100644 solana/bridge_token_factory/ts/cli/.editorconfig create mode 100644 solana/bridge_token_factory/ts/cli/.eslintignore create mode 100644 solana/bridge_token_factory/ts/cli/.eslintrc.json create mode 100644 solana/bridge_token_factory/ts/cli/.prettierrc.js create mode 100644 solana/bridge_token_factory/ts/cli/package-lock.json create mode 100644 solana/bridge_token_factory/ts/cli/package.json create mode 100644 solana/bridge_token_factory/ts/cli/src/cli.ts create mode 100644 solana/bridge_token_factory/ts/cli/src/context.ts create mode 100644 solana/bridge_token_factory/ts/cli/src/createToken.ts create mode 100644 solana/bridge_token_factory/ts/cli/src/deployToken.ts create mode 100644 solana/bridge_token_factory/ts/cli/src/executor.ts create mode 100644 solana/bridge_token_factory/ts/cli/src/finalizeTransferBridged.ts create mode 100644 solana/bridge_token_factory/ts/cli/src/finalizeTransferNative.ts create mode 100644 solana/bridge_token_factory/ts/cli/src/index.ts create mode 100644 solana/bridge_token_factory/ts/cli/src/initTransferBridged.ts create mode 100644 solana/bridge_token_factory/ts/cli/src/initTransferNative.ts create mode 100644 solana/bridge_token_factory/ts/cli/src/initialize.ts create mode 100644 solana/bridge_token_factory/ts/cli/src/keyParser.ts create mode 100644 solana/bridge_token_factory/ts/cli/src/registerMint.ts create mode 100644 solana/bridge_token_factory/ts/cli/tsconfig.json create mode 100644 solana/bridge_token_factory/ts/sdk/.editorconfig create mode 100644 solana/bridge_token_factory/ts/sdk/.eslintignore create mode 100644 solana/bridge_token_factory/ts/sdk/.eslintrc.json create mode 100644 solana/bridge_token_factory/ts/sdk/.prettierrc.cjs create mode 100644 solana/bridge_token_factory/ts/sdk/package-lock.json create mode 100644 solana/bridge_token_factory/ts/sdk/package.json create mode 100644 solana/bridge_token_factory/ts/sdk/src/bridge_token_factory.json create mode 100644 solana/bridge_token_factory/ts/sdk/src/bridge_token_factory.ts create mode 100644 solana/bridge_token_factory/ts/sdk/src/index.ts create mode 100644 solana/bridge_token_factory/ts/sdk/tsconfig.json create mode 100644 solana/bridge_token_factory/ts/sdk/vite.config.ts create mode 100644 solana/bridge_token_factory/tsconfig.json diff --git a/.catalog-info.yaml b/.catalog-info.yaml new file mode 100644 index 00000000..9be2d1a5 --- /dev/null +++ b/.catalog-info.yaml @@ -0,0 +1,17 @@ +--- +apiVersion: backstage.io/v1alpha1 +kind: Location +metadata: + name: omni-bridge-public + description: Public Omni Bridge repository +spec: + targets: + - ./near/omni-prover/omni-prover/.catalog-info.yaml + - ./near/omni-prover/evm-prover/.catalog-info.yaml + - ./near/omni-prover/wormhole-omni-prover-proxy/.catalog-info.yaml + - ./near/omni-types/.catalog-info.yaml + - ./near/omni-bridge/.catalog-info.yaml + - ./near/omni-token/.catalog-info.yaml + - ./evm/bridge-token-factory/.catalog-info.yaml + - ./omni-relayer/.catalog-info.yaml + - ./solana/bridge_token_factory/.catalog-info.yaml diff --git a/.github/workflows/build-contracts.yaml b/.github/workflows/build-contracts.yaml new file mode 100644 index 00000000..31ae9307 --- /dev/null +++ b/.github/workflows/build-contracts.yaml @@ -0,0 +1,72 @@ +name: Build Contracts + +on: + pull_request: + types: [closed] + branches: [main] + + +jobs: + build: + name: Build Contracts + if: github.event.pull_request.merged == true + runs-on: ubuntu-latest + strategy: + matrix: + platform: [evm, near] + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Node.js + if: matrix.platform == 'evm' + uses: actions/setup-node@v4 + with: + node-version: '22' + cache: 'yarn' + cache-dependency-path: evm/yarn.lock + + - name: Setup Rust toolchain + if: matrix.platform == 'near' || matrix.platform == 'solana' + uses: dtolnay/rust-toolchain@stable + with: + toolchain: 1.80.0 + target: wasm32-unknown-unknown + + - name: Install NEAR CLI RS + if: matrix.platform == 'near' + run: | + curl --proto '=https' --tlsv1.2 -LsSf https://github.com/near/near-cli-rs/releases/download/v0.7.4/near-cli-rs-installer.sh | sh + + - name: Install Docker + if: matrix.platform == 'near' + uses: docker/setup-buildx-action@v2 + + - name: Install Solana CLI + if: matrix.platform == 'solana' + run: | + sh -c "$(curl -sSfL https://release.anza.xyz/stable/install)" + export PATH="/home/runner/.local/share/solana/install/active_release/bin:$PATH" + + - name: Install Anchor + if: matrix.platform == 'solana' + run: | + cargo install --git https://github.com/coral-xyz/anchor --tag v0.30.1 anchor-cli + + - name: Build Contracts + run: | + if [ "${{ matrix.platform }}" == "evm" ]; then + make -C ${{ github.workspace }}/e2e-testing/ evm-build + elif [ "${{ matrix.platform }}" == "near" ]; then + make -C ${{ github.workspace }}/e2e-testing/ near-build + elif [ "${{ matrix.platform }}" == "solana" ]; then + make -C ${{ github.workspace }}/e2e-testing/ solana-build + fi + + - name: Upload Artifacts + uses: actions/upload-artifact@v3 + with: + name: ${{ matrix.platform }}-artifacts + path: | + ${{ github.workspace }}/e2e-testing/${{ matrix.platform }}_artifacts diff --git a/.github/workflows/check-wasm.yaml b/.github/workflows/check-wasm.yaml new file mode 100644 index 00000000..d06fb8e7 --- /dev/null +++ b/.github/workflows/check-wasm.yaml @@ -0,0 +1,25 @@ +on: + push: + branches: [ main, develop ] + pull_request: + +name: Check WASM files +jobs: + test: + runs-on: ubuntu-latest + name: Check wasm files + steps: + - name: Clone the repository + uses: actions/checkout@v3 + + - name: Build NEAR contracts + run: | + cd near + ./build.sh + git status + changed_files=$(git status --porcelain --untracked-files=no | wc -l) + if [ $changed_files -gt 0 ]; then + echo 'contract changed, please rebuild contract' + exit 1 + fi + timeout-minutes: 40 diff --git a/.github/workflows/evm.yaml b/.github/workflows/evm.yaml new file mode 100644 index 00000000..b66c7c53 --- /dev/null +++ b/.github/workflows/evm.yaml @@ -0,0 +1,46 @@ +name: EVM Checks + +on: + push: + branches: + - main + paths: + - 'evm/**' + pull_request: + paths: + - 'evm/**' + +jobs: + check: + name: Type Check, Lint, and Test + runs-on: ubuntu-latest + + defaults: + run: + working-directory: evm + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '22' + cache: 'yarn' + cache-dependency-path: evm/yarn.lock + + - name: Install dependencies + run: yarn install --frozen-lockfile + + - name: Compile hardhat + run: yarn hardhat compile + + - name: Type check + run: yarn tsc + + - name: Lint and format check + run: yarn biome check + + - name: Run tests + run: yarn test \ No newline at end of file diff --git a/.github/workflows/rust.yaml b/.github/workflows/rust.yaml new file mode 100644 index 00000000..94533273 --- /dev/null +++ b/.github/workflows/rust.yaml @@ -0,0 +1,78 @@ +name: Rust CI + +on: + push: + branches: [ main, develop ] + paths: + - 'near/**' + - 'omni-relayer/**' + pull_request: + branches: [ main, develop ] + paths: + - 'near/**' + - 'omni-relayer/**' + +jobs: + lint: + runs-on: ubuntu-latest + strategy: + matrix: + component: [near] # Will be expanded with more components later + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Rust toolchain + uses: dtolnay/rust-toolchain@stable + with: + toolchain: 1.80.0 + components: clippy, rustfmt + target: wasm32-unknown-unknown + + - name: Cache Rust dependencies + uses: Swatinem/rust-cache@v2 + with: + cache-on-failure: true + cache-all-crates: true + shared-key: "lint-${{ matrix.component }}" + workspaces: ${{ matrix.component }} + + - name: Run clippy + run: make clippy-${{ matrix.component }} + + - name: Run fmt + run: make fmt-${{ matrix.component }} + + build-and-test: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Rust toolchain + uses: dtolnay/rust-toolchain@stable + with: + toolchain: 1.80.0 + target: wasm32-unknown-unknown + + - name: Cache Rust dependencies + uses: Swatinem/rust-cache@v2 + with: + cache-on-failure: true + cache-all-crates: true + shared-key: "build-test" + workspaces: near + + - name: Install nextest + uses: taiki-e/install-action@v2 + with: + tool: nextest + + - name: Build token contract + run: make rust-build-near + + - name: Build tests + run: cargo build --manifest-path ./near/Cargo.toml --tests --all-features + + - name: Run tests + run: cargo nextest run --manifest-path ./near/Cargo.toml diff --git a/.github/workflows/security-analysis.yaml b/.github/workflows/security-analysis.yaml new file mode 100644 index 00000000..48e5355b --- /dev/null +++ b/.github/workflows/security-analysis.yaml @@ -0,0 +1,19 @@ +--- +name: "Security Analysis" + +on: + push: + branches: + - main + - develop + pull_request: + workflow_dispatch: + schedule: + - cron: "0 0 * * *" + +jobs: + contract_analysis: + name: "Shared" + uses: aurora-is-near/.github/.github/workflows/security_analysis.yml@master + secrets: + DD_API_KEY: ${{secrets.DD_API_KEY}} diff --git a/.gitignore b/.gitignore index d4eb1003..8d9754a0 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,8 @@ **/target **/config.toml **/.env +.history +node_modules +near/res/mock_token.wasm +near/res/mock_prover.wasm +near/res/omni_tests.wasm diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..eb8e0e6a --- /dev/null +++ b/Makefile @@ -0,0 +1,30 @@ +.PHONY: rust-lint rust-lint-near rust-lint-omni-relayer + +LINT_OPTIONS = -D warnings -D clippy::pedantic -A clippy::missing_errors_doc -A clippy::must_use_candidate -A clippy::module_name_repetitions +RUSTFLAGS = -C link-arg=-s + +NEAR_MANIFEST = ./near/Cargo.toml +OMNI_RELAYER_MANIFEST = ./omni-relayer/Cargo.toml + +clippy: clippy-near #clippy-relayer + +clippy-near: rust-build-token + cargo clippy --manifest-path $(NEAR_MANIFEST) -- $(LINT_OPTIONS) + +fmt-near: + cargo fmt --all --check --manifest-path $(NEAR_MANIFEST) + +fmt-omni-relayer: + cargo fmt --all --check --manifest-path $(OMNI_RELAYER_MANIFEST) + +clippy-omni-relayer: + cargo clippy --manifest-path $(OMNI_RELAYER_MANIFEST) -- $(LINT_OPTIONS) + +rust-build-token: + RUSTFLAGS='$(RUSTFLAGS)' cargo build --target wasm32-unknown-unknown --release --manifest-path $(NEAR_MANIFEST) --package omni-token + +rust-build-near: rust-build-token + RUSTFLAGS='$(RUSTFLAGS)' cargo build --target wasm32-unknown-unknown --release --manifest-path $(NEAR_MANIFEST) + +test-near: rust-build-near + cargo nextest run --manifest-path $(NEAR_MANIFEST) diff --git a/e2e-testing/.gitignore b/e2e-testing/.gitignore new file mode 100644 index 00000000..2b245ce0 --- /dev/null +++ b/e2e-testing/.gitignore @@ -0,0 +1,17 @@ +evm_artifacts/ +near_artifacts/ +solana_artifacts/ +evm_deploy_results/ +near_deploy_results/ +solana_deploy_results/ + + +evm_scripts/build/ +evm_scripts/cache/ +evm_scripts/coverage/ +evm_scripts/coverage.json +evm_scripts/.openzeppelin/ +evm_scripts/node_modules/ +evm_scripts/.env +evm_scripts/typechain-types/ +evm_scripts/dist/ diff --git a/e2e-testing/Makefile b/e2e-testing/Makefile new file mode 100644 index 00000000..f808e61d --- /dev/null +++ b/e2e-testing/Makefile @@ -0,0 +1,190 @@ +.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 +########################################################## + +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)))) + diff --git a/e2e-testing/README.md b/e2e-testing/README.md new file mode 100644 index 00000000..b9b54414 --- /dev/null +++ b/e2e-testing/README.md @@ -0,0 +1,63 @@ +# End-to-end testing + +## 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` + +## Using the Makefile + +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. + +### Common Tasks + +- **Compile EVM Contracts**: To compile the EVM contracts, run: + ```bash + make evm-compile + ``` + +- **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`. + +- **Build NEAR Contracts**: To build the NEAR contracts, execute: + ```bash + make near-build + ``` + +- **Deploy NEAR Contracts**: To deploy NEAR contracts, run: + ```bash + make near-deploy + ``` + +These tasks automate the process of setting up the testing environment, ensuring that all necessary components are compiled and deployed correctly. + +### Additional Requirements + +- **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. + +- **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. + +### Deployment Results + +- **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. + +### General Working Principles + +- **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. + +- **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. + +- **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. + +- **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. + +- **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. + +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 diff --git a/e2e-testing/bin/eNear_creation.template b/e2e-testing/bin/eNear_creation.template new file mode 100644 index 00000000..d62b3687 --- /dev/null +++ b/e2e-testing/bin/eNear_creation.template @@ -0,0 +1 @@ +60806040523480156200001157600080fd5b5060405162002d2638038062002d26833981810160405260e08110156200003757600080fd5b81019080805160405193929190846401000000008211156200005857600080fd5b9083019060208201858111156200006e57600080fd5b82516401000000008111828201881017156200008957600080fd5b82525081516020918201929091019080838360005b83811015620000b85781810151838201526020016200009e565b50505050905090810190601f168015620000e65780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200010a57600080fd5b9083019060208201858111156200012057600080fd5b82516401000000008111828201881017156200013b57600080fd5b82525081516020918201929091019080838360005b838110156200016a57818101518382015260200162000150565b50505050905090810190601f168015620001985780820380516001836020036101000a031916815260200191505b5060405260200180516040519392919084640100000000821115620001bc57600080fd5b908301906020820185811115620001d257600080fd5b8251640100000000811182820188101715620001ed57600080fd5b82525081516020918201929091019080838360005b838110156200021c57818101518382015260200162000202565b50505050905090810190601f1680156200024a5780820380516001836020036101000a031916815260200191505b506040908152602082810151918301516060840151608090940151895193965090945091839183918791899188918d918d916200028d916003918501906200035a565b508051620002a39060049060208401906200035a565b505060058054601260ff1990911617610100600160a81b0319166101006001600160a01b03871602179055508151620002e49060069060208501906200035a565b50600780546001600160401b0319166001600160401b03929092169190911790555050600980546001600160a01b0319166001600160a01b039390931692909217909155600a5562000337601862000344565b50505050505050620003f6565b6005805460ff191660ff92909216919091179055565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200039d57805160ff1916838001178555620003cd565b82800160010185558215620003cd579182015b82811115620003cd578251825591602001919060010190620003b0565b50620003db929150620003df565b5090565b5b80821115620003db5760008155600101620003e0565b61292080620004066000396000f3fe60806040526004361061014b5760003560e01c80636bf43296116100b6578063be831a2e1161006f578063be831a2e14610614578063c30a0f2514610644578063dd62ed3e1461066e578063e3113e3b146106a9578063f48ab4e014610763578063f851a4401461076b5761014b565b80636bf432961461047357806370a08231146104a457806395d89b41146104d7578063a457c2d7146104ec578063a9059cbb14610525578063b8e9744c1461055e5761014b565b8063313ce56711610108578063313ce567146102d257806332a8f30f146102fd578063395093511461032e5780633a239bee14610367578063530208f2146104255780635c975abb1461045e5761014b565b806306fdde0314610150578063095ea7b3146101da57806318160ddd1461022757806323b872dd1461024e5780632692c59f146102915780632a8853cd146102bd575b600080fd5b34801561015c57600080fd5b50610165610780565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561019f578181015183820152602001610187565b50505050905090810190601f1680156101cc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156101e657600080fd5b50610213600480360360408110156101fd57600080fd5b506001600160a01b038135169060200135610816565b604080519115158252519081900360200190f35b34801561023357600080fd5b5061023c610833565b60408051918252519081900360200190f35b34801561025a57600080fd5b506102136004803603606081101561027157600080fd5b506001600160a01b03813581169160208101359091169060400135610839565b34801561029d57600080fd5b506102bb600480360360208110156102b457600080fd5b50356108c0565b005b3480156102c957600080fd5b506101656108dc565b3480156102de57600080fd5b506102e761096a565b6040805160ff9092168252519081900360200190f35b34801561030957600080fd5b50610312610973565b604080516001600160a01b039092168252519081900360200190f35b34801561033a57600080fd5b506102136004803603604081101561035157600080fd5b506001600160a01b038135169060200135610987565b34801561037357600080fd5b506102bb6004803603604081101561038a57600080fd5b8101906020810181356401000000008111156103a557600080fd5b8201836020820111156103b757600080fd5b803590602001918460018302840111640100000000831117156103d957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505090356001600160401b031691506109d59050565b34801561043157600080fd5b506102bb6004803603604081101561044857600080fd5b506001600160a01b038135169060200135610a9c565b34801561046a57600080fd5b5061023c610aee565b34801561047f57600080fd5b50610488610af4565b604080516001600160401b039092168252519081900360200190f35b3480156104b057600080fd5b5061023c600480360360208110156104c757600080fd5b50356001600160a01b0316610b03565b3480156104e357600080fd5b50610165610b22565b3480156104f857600080fd5b506102136004803603604081101561050f57600080fd5b506001600160a01b038135169060200135610b83565b34801561053157600080fd5b506102136004803603604081101561054857600080fd5b506001600160a01b038135169060200135610beb565b6101656004803603604081101561057457600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561059f57600080fd5b8201836020820111156105b157600080fd5b803590602001918460018302840111640100000000831117156105d357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610bff945050505050565b34801561062057600080fd5b506102bb6004803603604081101561063757600080fd5b5080359060200135610cd3565b34801561065057600080fd5b506102136004803603602081101561066757600080fd5b5035610cee565b34801561067a57600080fd5b5061023c6004803603604081101561069157600080fd5b506001600160a01b0381358116916020013516610d03565b3480156106b557600080fd5b506102bb600480360360408110156106cc57600080fd5b813591908101906040810160208201356401000000008111156106ee57600080fd5b82018360208201111561070057600080fd5b8035906020019184600183028401116401000000008311171561072257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610d2e945050505050565b6102bb610e10565b34801561077757600080fd5b50610312610e29565b60038054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561080c5780601f106107e15761010080835404028352916020019161080c565b820191906000526020600020905b8154815290600101906020018083116107ef57829003601f168201915b5050505050905090565b600061082a610823610e38565b8484610e3c565b50600192915050565b60025490565b6000610846848484610f28565b6108b684610852610e38565b6108b18560405180606001604052806028815260200161276a602891396001600160a01b038a16600090815260016020526040812090610890610e38565b6001600160a01b031681526020810191909152604001600020549190611083565b610e3c565b5060019392505050565b6009546001600160a01b031633146108d757600080fd5b600a55565b6006805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156109625780601f1061093757610100808354040283529160200191610962565b820191906000526020600020905b81548152906001019060200180831161094557829003601f168201915b505050505081565b60055460ff1690565b60055461010090046001600160a01b031681565b600061082a610994610e38565b846108b185600160006109a5610e38565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549061111a565b600180600a5416600014806109f457506009546001600160a01b031633145b6109fd57600080fd5b610a0561244b565b610a0f848461117b565b9050610a19612478565b610a2682606001516115b6565b9050610a43816020015182600001516001600160801b0316611664565b80602001516001600160a01b03167f3538c3349544a9ce6d1cfda849857b2b8fa919c15fe6d382e08573b9838d2aa8826000015160405180826001600160801b0316815260200191505060405180910390a25050505050565b6009546001600160a01b03163314610ab357600080fd5b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610ae9573d6000803e3d6000fd5b505050565b600a5481565b6007546001600160401b031681565b6001600160a01b0381166000908152602081905260409020545b919050565b60048054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561080c5780601f106107e15761010080835404028352916020019161080c565b600061082a610b90610e38565b846108b1856040518060600160405280602581526020016128c66025913960016000610bba610e38565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190611083565b600061082a610bf8610e38565b8484610f28565b6009546060906001600160a01b03163314610c1957600080fd5b60006060846001600160a01b0316846040518082805190602001908083835b60208310610c575780518252601f199092019160209182019101610c38565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114610cb7576040519150601f19603f3d011682016040523d82523d6000602084013e610cbc565b606091505b509150915081610ccb57600080fd5b949350505050565b6009546001600160a01b03163314610cea57600080fd5b9055565b60086020526000908152604090205460ff1681565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600280600a541660001480610d4d57506009546001600160a01b031633145b610d5657600080fd5b610d603384611754565b336001600160a01b03167fabeef16c62fe7504587dd9ef5d707aeb0932570da8eb1a4f099c6e80524b17c384846040518083815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610dd0578181015183820152602001610db8565b50505050905090810190601f168015610dfd5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a2505050565b6009546001600160a01b03163314610e2757600080fd5b565b6009546001600160a01b031681565b3390565b6001600160a01b038316610e815760405162461bcd60e51b81526004018080602001828103825260248152602001806128656024913960400191505060405180910390fd5b6001600160a01b038216610ec65760405162461bcd60e51b81526004018080602001828103825260228152602001806126b66022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b038316610f6d5760405162461bcd60e51b81526004018080602001828103825260258152602001806127ef6025913960400191505060405180910390fd5b6001600160a01b038216610fb25760405162461bcd60e51b81526004018080602001828103825260238152602001806126296023913960400191505060405180910390fd5b610fbd838383610ae9565b610ffa8160405180606001604052806026815260200161270f602691396001600160a01b0386166000908152602081905260409020549190611083565b6001600160a01b038085166000908152602081905260408082209390935590841681522054611029908261111a565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081848411156111125760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156110d75781810151838201526020016110bf565b50505050905090810190601f1680156111045780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082820183811015611174576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b61118361244b565b600554604080516392d68dfd60e01b81526001600160401b0385166024820152600481019182528551604482015285516101009093046001600160a01b0316926392d68dfd9287928792829160640190602086019080838360005b838110156111f65781810151838201526020016111de565b50505050905090810190601f1680156112235780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b15801561124157600080fd5b505afa158015611255573d6000803e3d6000fd5b505050506040513d602081101561126b57600080fd5b50516112b6576040805162461bcd60e51b8152602060048201526015602482015274141c9bdbd9881cda1bdd5b19081899481d985b1a59605a1b604482015290519081900360640190fd5b6112be61248f565b6112c784611850565b90506112d16124a9565b6112da82611872565b6007546040808301510151519192506001600160401b0390811691161015611349576040805162461bcd60e51b815260206004820152601f60248201527f50726f6f662069732066726f6d2074686520616e6369656e7420626c6f636b00604482015290519081900360640190fd5b611352826118b4565b61138d5760405162461bcd60e51b815260040180806020018281038252602c815260200180612814602c913960400191505060405180910390fd5b600081600001516040015160200151602001516000815181106113ac57fe5b6020908102919091018101516000818152600890925260409091205490915060ff161561140a5760405162461bcd60e51b81526004018080602001828103825260258152602001806128406025913960400191505060405180910390fd5b60008181526008602052604090819020805460ff19166001908117909155905160068054909282918491600260001991831615610100029190910190911604801561148c5780601f1061146a57610100808354040283529182019161148c565b820191906000526020600020905b815481529060010190602001808311611478575b50509150506040518091039020826000015160400151602001516080015180519060200120146114ed5760405162461bcd60e51b815260040180806020018281038252604881526020018061264c6048913960600191505060405180910390fd5b8160000151604001516020015160a0015193508360400151156115415760405162461bcd60e51b815260040180806020018281038252603c815260200180612792603c913960400191505060405180910390fd5b8360200151156115825760405162461bcd60e51b815260040180806020018281038252603d815260200180612889603d913960400191505060405180910390fd5b60405181907fb226e263cb7a3bde6afd6e46c543e956d49171b4fe4f0daf93cb1798f2315d1d90600090a250505092915050565b6115be612478565b6115c661248f565b6115cf83611850565b905060006115dc826118c0565b905060ff811615611634576040805162461bcd60e51b815260206004820152601760248201527f4552525f4e4f545f57495448445241575f524553554c54000000000000000000604482015290519081900360640190fd5b61163d82611942565b6001600160801b03168352600061165383611974565b60601c602085015250919392505050565b6001600160a01b0382166116bf576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6116cb60008383610ae9565b6002546116d8908261111a565b6002556001600160a01b0382166000908152602081905260409020546116fe908261111a565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b0382166117995760405162461bcd60e51b81526004018080602001828103825260218152602001806127ce6021913960400191505060405180910390fd5b6117a582600083610ae9565b6117e281604051806060016040528060228152602001612694602291396001600160a01b0385166000908152602081905260409020549190611083565b6001600160a01b03831660009081526020819052604090205560025461180890826119b0565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b61185861248f565b506040805180820190915260008152602081019190915290565b61187a6124a9565b61188382611a0d565b815261188e82611a41565b602082015261189c82611ae1565b60408201526118aa82611a41565b6060820152919050565b60208101515190511490565b600081600180826000015101826020015151101561191b576040805162461bcd60e51b8152602060048201526013602482015272426f7273683a204f7574206f662072616e676560681b604482015290519081900360640190fd5b602084015184518151811061192c57fe5b0160200151825190910190915260f81c92915050565b600061194d82611c86565b6001600160401b03169050604061196383611c86565b6001600160401b0316901b17919050565b6000805b60148110156119aa578060080261198e846118c0565b60f81b6001600160f81b031916901c9190911790600101611978565b50919050565b600082821115611a07576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b611a156124e8565b611a1e82611a41565b8152611a2982611cb2565b6020820152611a3782611d27565b6040820152919050565b611a4961250f565b611a5282611ea0565b63ffffffff166001600160401b0381118015611a6d57600080fd5b50604051908082528060200260200182016040528015611aa757816020015b611a94612478565b815260200190600190039081611a8c5790505b50815260005b8151518110156119aa57611ac083611ec8565b8251805183908110611ace57fe5b6020908102919091010152600101611aad565b611ae9612522565b611af282611cb2565b8152611afd82611cb2565b6020820152611b0b82611f2c565b816040018190525060028082604001516101000151836020015160405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b60208310611b7a5780518252601f199092019160209182019101611b5b565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa158015611bb9573d6000803e3d6000fd5b5050506040513d6020811015611bce57600080fd5b50518251604080516020818101949094528082019290925280518083038201815260609092019081905281519192909182918401908083835b60208310611c265780518252601f199092019160209182019101611c07565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa158015611c65573d6000803e3d6000fd5b5050506040513d6020811015611c7a57600080fd5b50516060820152919050565b6000611c9182611ea0565b63ffffffff1690506020611ca483611ea0565b63ffffffff16901b17919050565b6000816020808260000151018260200151511015611d0d576040805162461bcd60e51b8152602060048201526013602482015272426f7273683a204f7574206f662072616e676560681b604482015290519081900360640190fd5b602080850151945190940190930151815190930190525090565b611d2f61254e565b611d3882611cb2565b8152611d4382611fc9565b81602001819052506000816020015160c001515160010190506002600082901c60ff16600883901c60ff16601084901c60ff16601885901c60ff168660000151876020015160c00151604051602001808760ff1660f81b81526001018660ff1660f81b81526001018560ff1660f81b81526001018460ff1660f81b8152600101838152602001828051906020019060200280838360005b83811015611df2578181015183820152602001611dda565b5050505090500196505050505050506040516020818303038152906040526040518082805190602001908083835b60208310611e3f5780518252601f199092019160209182019101611e20565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa158015611e7e573d6000803e3d6000fd5b5050506040513d6020811015611e9357600080fd5b5051604083015250919050565b6000611eab82612297565b61ffff1690506010611ebc83612297565b61ffff16901b17919050565b611ed0612478565b611ed982611cb2565b8152611ee4826118c0565b60ff1660208201819052600211610b1d5760405162461bcd60e51b81526004018080602001828103825260378152602001806126d86037913960400191505060405180910390fd5b611f34612569565b611f3f8260d06122bd565b610100820152611f4e82611c86565b6001600160401b03168152611f6282611cb2565b6020820152611f7082611cb2565b6040820152611f7e82611cb2565b6060820152611f8c82611cb2565b6080820152611f9a82611c86565b6001600160401b031660a0820152611fb182611cb2565b60c0820152611fbf82611cb2565b60e0820152919050565b611fd16125b5565b611fda82611ea0565b63ffffffff166001600160401b0381118015611ff557600080fd5b5060405190808252806020026020018201604052801561202957816020015b60608152602001906001900390816120145790505b50815260005b81515181101561206357612042836122d2565b825180518390811061205057fe5b602090810291909101015260010161202f565b50815161206f83611ea0565b63ffffffff166001600160401b038111801561208a57600080fd5b506040519080825280602002602001820160405280156120b4578160200160208202803683370190505b50602083015260005b8260200151518110156120f6576120d384611cb2565b836020015182815181106120e357fe5b60209081029190910101526001016120bd565b5061210083611c86565b6001600160401b0316604083015261211783611942565b6001600160801b0316606083015261212e836122d2565b608083015261213c83612369565b60a083015282518251516001016001600160401b038111801561215e57600080fd5b50604051908082528060200260200182016040528015612188578160200160208202803683370190505b5060c084015281845261219d848383036122bd565b8360c001516000815181106121ae57fe5b602090810291909101015280845260005b83515181101561228f576002846000015182815181106121db57fe5b60200260200101516040518082805190602001908083835b602083106122125780518252601f1990920191602091820191016121f3565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa158015612251573d6000803e3d6000fd5b5050506040513d602081101561226657600080fd5b505160c085015180516001840190811061227c57fe5b60209081029190910101526001016121bf565b505050919050565b60006122a2826118c0565b60ff16905060086122b2836118c0565b60ff16901b17919050565b60006111748360200151846000015184612429565b60606122dd82611ea0565b63ffffffff166001600160401b03811180156122f857600080fd5b506040519080825280601f01601f191660200182016040528015612323576020820181803683370190505b50905060005b81518110156119aa5761233b836118c0565b60f81b82828151811061234a57fe5b60200101906001600160f81b031916908160001a905350600101612329565b61237161244b565b61237a826118c0565b60ff168082526123905760016020820152610b1d565b806000015160ff16600114156123ac5760016040820152610b1d565b806000015160ff16600214156123cf576123c5826122d2565b6060820152610b1d565b806000015160ff16600314156123f2576123e882611cb2565b6080820152610b1d565b60405162461bcd60e51b81526004018080602001828103825260358152602001806127356035913960400191505060405180910390fd5b600061243361260a565b6020818486602089010160025afa5051949350505050565b6040805160a081018252600080825260208201819052918101829052606080820152608081019190915290565b604080518082019091526000808252602082015290565b604051806040016040528060008152602001606081525090565b60405180608001604052806124bc6124e8565b81526020016124c961250f565b81526020016124d6612522565b81526020016124e361250f565b905290565b60405180606001604052806124fb61250f565b8152600060208201526040016124e361254e565b6040518060200160405280606081525090565b6040805160808101825260008082526020820152908101612541612569565b8152600060209091015290565b604080516060810190915260008152602081016125416125b5565b6040805161012081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081019190915290565b6040518060e00160405280606081526020016060815260200160006001600160401b0316815260200160006001600160801b03168152602001606081526020016125fd61244b565b8152602001606081525090565b6040518060200160405280600190602082028036833750919291505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737343616e206f6e6c7920756e6c6f636b20746f6b656e732066726f6d20746865206c696e6b65642070726f6f662070726f6475636572206f6e204e65617220626c6f636b636861696e45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737350726f6f664465636f6465723a204d65726b6c65506174684974656d20646972656374696f6e2073686f756c642062652030206f72203145524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654e6561724465636f6465723a206465636f6465457865637574696f6e53746174757320696e646578206f7574206f662072616e676545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636543616e6e6f7420757365206661696c656420657865637574696f6e206f7574636f6d6520666f7220756e6c6f636b696e672074686520746f6b656e7345524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f2061646472657373417267756d656e742073686f756c6420626520657861637420626f7273682073657269616c697a6174696f6e546865206275726e206576656e742070726f6f662063616e6e6f742062652072657573656445524332303a20617070726f76652066726f6d20746865207a65726f206164647265737343616e6e6f742075736520756e6b6e6f776e20657865637574696f6e206f7574636f6d6520666f7220756e6c6f636b696e672074686520746f6b656e7345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212201225bbd7f0a82122ab1cb419399486bffa69ce7288e9343b357e554f3a55808a64736f6c634300060c003300000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b8e11A1Ad588863379A3e523b37D8C78070C16D9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044e4541520000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044e45415200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b652d6e6561722e6e656172000000000000000000000000000000000000000000 \ No newline at end of file diff --git a/e2e-testing/evm_scripts/.env.example b/e2e-testing/evm_scripts/.env.example new file mode 100644 index 00000000..dc3b9383 --- /dev/null +++ b/e2e-testing/evm_scripts/.env.example @@ -0,0 +1,2 @@ +INFURA_API_KEY= +EVM_PRIVATE_KEY= diff --git a/e2e-testing/evm_scripts/hardhat.config.ts b/e2e-testing/evm_scripts/hardhat.config.ts new file mode 100644 index 00000000..c63937da --- /dev/null +++ b/e2e-testing/evm_scripts/hardhat.config.ts @@ -0,0 +1,164 @@ +import "@nomicfoundation/hardhat-chai-matchers" +import "@nomicfoundation/hardhat-ethers" +import "@nomicfoundation/hardhat-verify" +import "@openzeppelin/hardhat-upgrades" +import "@typechain/hardhat" +import * as dotenv from "dotenv" +import "hardhat-storage-layout" +import type { HardhatUserConfig } from "hardhat/config" +import "solidity-coverage" +import { task } from "hardhat/config" + +import "hardhat/types/config" +import * as fs from "node:fs" + +declare module "hardhat/types/config" { + interface HttpNetworkUserConfig { + omniChainId: number + wormholeAddress?: string + } +} + +dotenv.config() + +const INFURA_API_KEY = process.env.INFURA_API_KEY +const EVM_PRIVATE_KEY = process.env.EVM_PRIVATE_KEY || "11".repeat(32) +const ETHERSCAN_API_KEY = process.env.ETHERSCAN_API_KEY || "" +const ARBISCAN_API_KEY = process.env.ARBISCAN_API_KEY || "" +const BASESCAN_API_KEY = process.env.BASESCAN_API_KEY || "" + + +task("deploy-bytecode", "Deploys a contract with a given bytecode") + .addParam("bytecode", "The path to the file containing the bytecode of the contract") + .setAction(async (taskArgs, hre) => { + const { ethers } = hre + + const bytecode = fs.readFileSync(taskArgs.bytecode, "utf8") + const [signer] = await ethers.getSigners() + + const contractFactory = new ethers.ContractFactory([], bytecode, signer) + const contract = await contractFactory.deploy() + await contract.waitForDeployment() + + console.log( + JSON.stringify({ + contractAddress: await contract.getAddress(), + }), + ) + }) + +task("deploy-test-token", "Deploys the E2ETestToken contract") + .addParam("name", "Token name") + .addParam("symbol", "Token symbol") + .addOptionalParam("supply", "Initial supply of tokens (default: 1000000 tokens)", "1000000") + .setAction(async (taskArgs, hre) => { + const { ethers } = hre; + + // Convert supply to tokens with 18 decimals + const supply = ethers.parseEther(taskArgs.supply); + + const [deployer] = await ethers.getSigners(); + + const TestToken = await ethers.getContractFactory("E2ETestToken"); + const token = await TestToken.deploy(taskArgs.name, taskArgs.symbol, supply); + await token.waitForDeployment(); + + const tokenAddress = await token.getAddress(); + + console.log(JSON.stringify({ + contractAddress: tokenAddress, + name: taskArgs.name, + symbol: taskArgs.symbol, + supply: taskArgs.supply, + })); + }); + + +const config: HardhatUserConfig = { + paths: { + sources: "./src", + cache: "./cache", + artifacts: "./build", + tests: "./tests", + }, + solidity: { + compilers: [ + { + version: "0.8.24", + settings: { + optimizer: { + enabled: true, + runs: 200, + }, + metadata: { + // do not include the metadata hash, since this is machine dependent + // and we want all generated code to be deterministic + // https://docs.soliditylang.org/en/v0.8.24/metadata.html + bytecodeHash: "none", + }, + }, + }, + ], + }, + networks: { + hardhat: { + chainId: 1337, + mining: { + auto: true, + 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, + url: `https://sepolia.infura.io/v3/${INFURA_API_KEY}`, + accounts: [`${EVM_PRIVATE_KEY}`], + }, + arbitrumSepolia: { + wormholeAddress: "0x6b9C8671cdDC8dEab9c719bB87cBd3e782bA6a35", + omniChainId: 3, + chainId: 421614, + url: `https://arbitrum-sepolia.infura.io/v3/${INFURA_API_KEY}`, + accounts: [`${EVM_PRIVATE_KEY}`], + }, + baseSepolia: { + wormholeAddress: "0x79A1027a6A159502049F10906D333EC57E95F083", + omniChainId: 4, + chainId: 84532, + url: `https://base-sepolia.infura.io/v3/${INFURA_API_KEY}`, + accounts: [`${EVM_PRIVATE_KEY}`], + }, + }, + etherscan: { + apiKey: { + mainnet: ETHERSCAN_API_KEY, + arbitrumMainnet: ARBISCAN_API_KEY, + baseMainnet: BASESCAN_API_KEY, + sepolia: ETHERSCAN_API_KEY, + arbitrumSepolia: ARBISCAN_API_KEY, + baseSepolia: BASESCAN_API_KEY, + }, + }, +} + +export default config diff --git a/e2e-testing/evm_scripts/package.json b/e2e-testing/evm_scripts/package.json new file mode 100644 index 00000000..02c75821 --- /dev/null +++ b/e2e-testing/evm_scripts/package.json @@ -0,0 +1,47 @@ +{ + "name": "omni-bridge", + "version": "0.1.0", + "description": "OmniBridge contracts for the EVM", + "license": "MIT", + "dependencies": { + "@openzeppelin/contracts": "^5.1.0", + "@openzeppelin/contracts-upgradeable": "^5.1.0", + "prettier": "^3.3.3", + "prettier-plugin-solidity": "^1.4.1" + }, + "devDependencies": { + "@biomejs/biome": "^1.9.4", + "@nomicfoundation/hardhat-chai-matchers": "^2.0.8", + "@nomicfoundation/hardhat-ethers": "^3.0.6", + "@nomicfoundation/hardhat-network-helpers": "^1.0.12", + "@nomicfoundation/hardhat-verify": "^2.0.12", + "@openzeppelin/hardhat-upgrades": "^3.5.0", + "@typechain/ethers-v6": "^0.5.1", + "@typechain/hardhat": "^9.1.0", + "@types/chai": "4", + "@types/elliptic": "^6.4.18", + "@types/mocha": "^10.0.9", + "@types/node": "^22.9.0", + "borsh": "^2.0.0", + "chai": "4", + "dotenv": "^16.4.5", + "ethers": "^6.13.4", + "hardhat": "^2.22.16", + "hardhat-storage-layout": "^0.1.7", + "solidity-coverage": "^0.8.13", + "ts-node": "^10.9.2", + "typechain": "^8.3.2", + "typescript": "^5.7.2", + "bs58": "^6.0.0" + }, + "scripts": { + "build": "yarn hardhat compile", + "testrpc": "", + "test": "yarn hardhat test", + "coverage": "yarn hardhat coverage", + "lint:js": "biome check", + "lint:js:fix": "biome check --write", + "lint": "prettier --list-different --plugin=prettier-plugin-solidity '**/*.sol'", + "lint:fix": "prettier --write --plugin=prettier-plugin-solidity '**/*.sol'" + } +} \ No newline at end of file diff --git a/e2e-testing/evm_scripts/src/E2ETestToken/contracts/E2ETestToken.sol b/e2e-testing/evm_scripts/src/E2ETestToken/contracts/E2ETestToken.sol new file mode 100644 index 00000000..db78e445 --- /dev/null +++ b/e2e-testing/evm_scripts/src/E2ETestToken/contracts/E2ETestToken.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; + +contract E2ETestToken is ERC20 { + constructor( + string memory name, + string memory symbol, + uint256 initialSupply + ) ERC20(name, symbol) { + _mint(msg.sender, initialSupply); + } +} \ No newline at end of file diff --git a/e2e-testing/evm_scripts/tsconfig.json b/e2e-testing/evm_scripts/tsconfig.json new file mode 100644 index 00000000..0b1e1d4c --- /dev/null +++ b/e2e-testing/evm_scripts/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "target": "es2020", + "module": "commonjs", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "moduleResolution": "node", + "resolveJsonModule": true, + "outDir": "dist", + "declaration": true + }, + "include": ["./tests", "./scripts", "./typechain-types"], + "files": ["hardhat.config.ts"] +} diff --git a/e2e-testing/evm_scripts/yarn.lock b/e2e-testing/evm_scripts/yarn.lock new file mode 100644 index 00000000..e9adfa4f --- /dev/null +++ b/e2e-testing/evm_scripts/yarn.lock @@ -0,0 +1,3510 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@adraffy/ens-normalize@1.10.1": + version "1.10.1" + resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz#63430d04bd8c5e74f8d7d049338f1cd9d4f02069" + integrity sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw== + +"@aws-crypto/sha256-js@1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-js/-/sha256-js-1.2.2.tgz#02acd1a1fda92896fc5a28ec7c6e164644ea32fc" + integrity sha512-Nr1QJIbW/afYYGzYvrF70LtaHrIRtd4TNAglX8BvlfxJLZ45SAmueIKYl5tWoNBPzp65ymXGFK0Bb1vZUpuc9g== + dependencies: + "@aws-crypto/util" "^1.2.2" + "@aws-sdk/types" "^3.1.0" + tslib "^1.11.1" + +"@aws-crypto/util@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@aws-crypto/util/-/util-1.2.2.tgz#b28f7897730eb6538b21c18bd4de22d0ea09003c" + integrity sha512-H8PjG5WJ4wz0UXAFXeJjWCW1vkvIJ3qUUD+rGRwJ2/hj+xT58Qle2MTql/2MGzkU+1JLAFuR6aJpLAjHwhmwwg== + dependencies: + "@aws-sdk/types" "^3.1.0" + "@aws-sdk/util-utf8-browser" "^3.0.0" + tslib "^1.11.1" + +"@aws-sdk/types@^3.1.0": + version "3.714.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.714.0.tgz#de6afee1436d2d95364efa0663887f3bf0b1303a" + integrity sha512-ZjpP2gYbSFlxxaUDa1Il5AVvfggvUPbjzzB/l3q0gIE5Thd6xKW+yzEpt2mLZ5s5UaYSABZbF94g8NUOF4CVGA== + dependencies: + "@smithy/types" "^3.7.2" + tslib "^2.6.2" + +"@aws-sdk/util-utf8-browser@^3.0.0": + version "3.259.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz#3275a6f5eb334f96ca76635b961d3c50259fd9ff" + integrity sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw== + dependencies: + tslib "^2.3.1" + +"@biomejs/biome@^1.9.4": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@biomejs/biome/-/biome-1.9.4.tgz#89766281cbc3a0aae865a7ff13d6aaffea2842bf" + integrity sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog== + optionalDependencies: + "@biomejs/cli-darwin-arm64" "1.9.4" + "@biomejs/cli-darwin-x64" "1.9.4" + "@biomejs/cli-linux-arm64" "1.9.4" + "@biomejs/cli-linux-arm64-musl" "1.9.4" + "@biomejs/cli-linux-x64" "1.9.4" + "@biomejs/cli-linux-x64-musl" "1.9.4" + "@biomejs/cli-win32-arm64" "1.9.4" + "@biomejs/cli-win32-x64" "1.9.4" + +"@biomejs/cli-darwin-arm64@1.9.4": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.9.4.tgz#dfa376d23a54a2d8f17133c92f23c1bf2e62509f" + integrity sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw== + +"@biomejs/cli-darwin-x64@1.9.4": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.9.4.tgz#eafc2ce3849d385fc02238aad1ca4a73395a64d9" + integrity sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg== + +"@biomejs/cli-linux-arm64-musl@1.9.4": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.9.4.tgz#d780c3e01758fc90f3268357e3f19163d1f84fca" + integrity sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA== + +"@biomejs/cli-linux-arm64@1.9.4": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.9.4.tgz#8ed1dd0e89419a4b66a47f95aefb8c46ae6041c9" + integrity sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g== + +"@biomejs/cli-linux-x64-musl@1.9.4": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.9.4.tgz#f36982b966bd671a36671e1de4417963d7db15fb" + integrity sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg== + +"@biomejs/cli-linux-x64@1.9.4": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64/-/cli-linux-x64-1.9.4.tgz#a0a7f56680c76b8034ddc149dbf398bdd3a462e8" + integrity sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg== + +"@biomejs/cli-win32-arm64@1.9.4": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.9.4.tgz#e2ef4e0084e76b7e26f0fc887c5ef1265ea56200" + integrity sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg== + +"@biomejs/cli-win32-x64@1.9.4": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-x64/-/cli-win32-x64-1.9.4.tgz#4c7afa90e3970213599b4095e62f87e5972b2340" + integrity sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA== + +"@bytecodealliance/preview2-shim@0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@bytecodealliance/preview2-shim/-/preview2-shim-0.17.0.tgz#9bc1cadbb9f86c446c6f579d3431c08a06a6672e" + integrity sha512-JorcEwe4ud0x5BS/Ar2aQWOQoFzjq/7jcnxYXCvSMh0oRm0dQXzOA+hqLDBnOMks1LLBA7dmiLLsEBl09Yd6iQ== + +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + +"@ethereumjs/rlp@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@ethereumjs/rlp/-/rlp-4.0.1.tgz#626fabfd9081baab3d0a3074b0c7ecaf674aaa41" + integrity sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw== + +"@ethereumjs/util@^8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/util/-/util-8.1.0.tgz#299df97fb6b034e0577ce9f94c7d9d1004409ed4" + integrity sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA== + dependencies: + "@ethereumjs/rlp" "^4.0.1" + ethereum-cryptography "^2.0.0" + micro-ftch "^0.3.1" + +"@ethersproject/abi@^5.0.9", "@ethersproject/abi@^5.1.2": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" + integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== + dependencies: + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/abstract-provider@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef" + integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + +"@ethersproject/abstract-signer@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2" + integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + +"@ethersproject/address@^5.0.2", "@ethersproject/address@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" + integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + +"@ethersproject/base64@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c" + integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== + dependencies: + "@ethersproject/bytes" "^5.7.0" + +"@ethersproject/bignumber@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" + integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + bn.js "^5.2.1" + +"@ethersproject/bytes@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" + integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/constants@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e" + integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + +"@ethersproject/hash@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" + integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/keccak256@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" + integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== + dependencies: + "@ethersproject/bytes" "^5.7.0" + js-sha3 "0.8.0" + +"@ethersproject/logger@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" + integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== + +"@ethersproject/networks@^5.7.0": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" + integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/properties@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" + integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/rlp@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" + integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/signing-key@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3" + integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + bn.js "^5.2.1" + elliptic "6.5.4" + hash.js "1.1.7" + +"@ethersproject/strings@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" + integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/transactions@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" + integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== + dependencies: + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + +"@ethersproject/web@^5.7.0": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" + integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== + dependencies: + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@fastify/busboy@^2.0.0": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.1.tgz#b9da6a878a371829a0502c9b6c1c143ef6663f4d" + integrity sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA== + +"@jridgewell/resolve-uri@^3.0.3": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@metamask/eth-sig-util@^4.0.0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz#3ad61f6ea9ad73ba5b19db780d40d9aae5157088" + integrity sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ== + dependencies: + ethereumjs-abi "^0.6.8" + ethereumjs-util "^6.2.1" + ethjs-util "^0.1.6" + tweetnacl "^1.0.3" + tweetnacl-util "^0.15.1" + +"@noble/curves@1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.2.0.tgz#92d7e12e4e49b23105a2555c6984d41733d65c35" + integrity sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw== + dependencies: + "@noble/hashes" "1.3.2" + +"@noble/curves@1.4.2", "@noble/curves@~1.4.0": + version "1.4.2" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.4.2.tgz#40309198c76ed71bc6dbf7ba24e81ceb4d0d1fe9" + integrity sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw== + dependencies: + "@noble/hashes" "1.4.0" + +"@noble/hashes@1.2.0", "@noble/hashes@~1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.2.0.tgz#a3150eeb09cc7ab207ebf6d7b9ad311a9bdbed12" + integrity sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ== + +"@noble/hashes@1.3.2": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39" + integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== + +"@noble/hashes@1.4.0", "@noble/hashes@~1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" + integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== + +"@noble/hashes@^1.4.0": + version "1.6.1" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.6.1.tgz#df6e5943edcea504bac61395926d6fd67869a0d5" + integrity sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w== + +"@noble/secp256k1@1.7.1", "@noble/secp256k1@~1.7.0": + version "1.7.1" + resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c" + integrity sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@nomicfoundation/edr-darwin-arm64@0.6.5": + version "0.6.5" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.6.5.tgz#37a31565d7ef42bed9028ac44aed82144de30bd1" + integrity sha512-A9zCCbbNxBpLgjS1kEJSpqxIvGGAX4cYbpDYCU2f3jVqOwaZ/NU761y1SvuCRVpOwhoCXqByN9b7HPpHi0L4hw== + +"@nomicfoundation/edr-darwin-x64@0.6.5": + version "0.6.5" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.6.5.tgz#3252f6e86397af460b7a480bfe1b889464d75b89" + integrity sha512-x3zBY/v3R0modR5CzlL6qMfFMdgwd6oHrWpTkuuXnPFOX8SU31qq87/230f4szM+ukGK8Hi+mNq7Ro2VF4Fj+w== + +"@nomicfoundation/edr-linux-arm64-gnu@0.6.5": + version "0.6.5" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.6.5.tgz#e7dc2934920b6cfabeb5ee7a5e26c8fb0d4964ac" + integrity sha512-HGpB8f1h8ogqPHTyUpyPRKZxUk2lu061g97dOQ/W4CxevI0s/qiw5DB3U3smLvSnBHKOzYS1jkxlMeGN01ky7A== + +"@nomicfoundation/edr-linux-arm64-musl@0.6.5": + version "0.6.5" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.6.5.tgz#00459cd53e9fb7bd5b7e32128b508a6e89079d89" + integrity sha512-ESvJM5Y9XC03fZg9KaQg3Hl+mbx7dsSkTIAndoJS7X2SyakpL9KZpOSYrDk135o8s9P9lYJdPOyiq+Sh+XoCbQ== + +"@nomicfoundation/edr-linux-x64-gnu@0.6.5": + version "0.6.5" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.6.5.tgz#5c9e4e2655caba48e0196977cba395bbde6fe97d" + integrity sha512-HCM1usyAR1Ew6RYf5AkMYGvHBy64cPA5NMbaeY72r0mpKaH3txiMyydcHibByOGdQ8iFLWpyUdpl1egotw+Tgg== + +"@nomicfoundation/edr-linux-x64-musl@0.6.5": + version "0.6.5" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.6.5.tgz#9c220751b66452dc43a365f380e1e236a0a8c5a9" + integrity sha512-nB2uFRyczhAvWUH7NjCsIO6rHnQrof3xcCe6Mpmnzfl2PYcGyxN7iO4ZMmRcQS7R1Y670VH6+8ZBiRn8k43m7A== + +"@nomicfoundation/edr-win32-x64-msvc@0.6.5": + version "0.6.5" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.6.5.tgz#90d3ac2a6a8a687522bda5ff2e92dd97e68126ea" + integrity sha512-B9QD/4DSSCFtWicO8A3BrsnitO1FPv7axB62wq5Q+qeJ50yJlTmyeGY3cw62gWItdvy2mh3fRM6L1LpnHiB77A== + +"@nomicfoundation/edr@^0.6.5": + version "0.6.5" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr/-/edr-0.6.5.tgz#b3b1ebcdd0148cfe67cca128e7ebe8092e200359" + integrity sha512-tAqMslLP+/2b2sZP4qe9AuGxG3OkQ5gGgHE4isUuq6dUVjwCRPFhAOhpdFl+OjY5P3yEv3hmq9HjUGRa2VNjng== + dependencies: + "@nomicfoundation/edr-darwin-arm64" "0.6.5" + "@nomicfoundation/edr-darwin-x64" "0.6.5" + "@nomicfoundation/edr-linux-arm64-gnu" "0.6.5" + "@nomicfoundation/edr-linux-arm64-musl" "0.6.5" + "@nomicfoundation/edr-linux-x64-gnu" "0.6.5" + "@nomicfoundation/edr-linux-x64-musl" "0.6.5" + "@nomicfoundation/edr-win32-x64-msvc" "0.6.5" + +"@nomicfoundation/ethereumjs-common@4.0.4": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.4.tgz#9901f513af2d4802da87c66d6f255b510bef5acb" + integrity sha512-9Rgb658lcWsjiicr5GzNCjI1llow/7r0k50dLL95OJ+6iZJcVbi15r3Y0xh2cIO+zgX0WIHcbzIu6FeQf9KPrg== + dependencies: + "@nomicfoundation/ethereumjs-util" "9.0.4" + +"@nomicfoundation/ethereumjs-rlp@5.0.4": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.4.tgz#66c95256fc3c909f6fb18f6a586475fc9762fa30" + integrity sha512-8H1S3s8F6QueOc/X92SdrA4RDenpiAEqMg5vJH99kcQaCy/a3Q6fgseo75mgWlbanGJXSlAPtnCeG9jvfTYXlw== + +"@nomicfoundation/ethereumjs-tx@5.0.4": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.4.tgz#b0ceb58c98cc34367d40a30d255d6315b2f456da" + integrity sha512-Xjv8wAKJGMrP1f0n2PeyfFCCojHd7iS3s/Ab7qzF1S64kxZ8Z22LCMynArYsVqiFx6rzYy548HNVEyI+AYN/kw== + dependencies: + "@nomicfoundation/ethereumjs-common" "4.0.4" + "@nomicfoundation/ethereumjs-rlp" "5.0.4" + "@nomicfoundation/ethereumjs-util" "9.0.4" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/ethereumjs-util@9.0.4": + version "9.0.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.4.tgz#84c5274e82018b154244c877b76bc049a4ed7b38" + integrity sha512-sLOzjnSrlx9Bb9EFNtHzK/FJFsfg2re6bsGqinFinH1gCqVfz9YYlXiMWwDM4C/L4ywuHFCYwfKTVr/QHQcU0Q== + dependencies: + "@nomicfoundation/ethereumjs-rlp" "5.0.4" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/hardhat-chai-matchers@^2.0.8": + version "2.0.8" + resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-2.0.8.tgz#9c7cfc4ad0f0a5e9cf16aba8ab668c02f6e273aa" + integrity sha512-Z5PiCXH4xhNLASROlSUOADfhfpfhYO6D7Hn9xp8PddmHey0jq704cr6kfU8TRrQ4PUZbpfsZadPj+pCfZdjPIg== + dependencies: + "@types/chai-as-promised" "^7.1.3" + chai-as-promised "^7.1.1" + deep-eql "^4.0.1" + ordinal "^1.0.3" + +"@nomicfoundation/hardhat-ethers@^3.0.6": + version "3.0.8" + resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-ethers/-/hardhat-ethers-3.0.8.tgz#af078f566373abeb77e11cbe69fe3dd47f8bfc27" + integrity sha512-zhOZ4hdRORls31DTOqg+GmEZM0ujly8GGIuRY7t7szEk2zW/arY1qDug/py8AEktT00v5K+b6RvbVog+va51IA== + dependencies: + debug "^4.1.1" + lodash.isequal "^4.5.0" + +"@nomicfoundation/hardhat-network-helpers@^1.0.12": + version "1.0.12" + resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.12.tgz#2c0abec0c50b75f9d0d71776e49e3b5ef746d289" + integrity sha512-xTNQNI/9xkHvjmCJnJOTyqDSl8uq1rKb2WOVmixQxFtRd7Oa3ecO8zM0cyC2YmOK+jHB9WPZ+F/ijkHg1CoORA== + dependencies: + ethereumjs-util "^7.1.4" + +"@nomicfoundation/hardhat-verify@^2.0.12": + version "2.0.12" + resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-verify/-/hardhat-verify-2.0.12.tgz#480819a245a2db0b127e473c62079f7b4f16daa8" + integrity sha512-Lg3Nu7DCXASQRVI/YysjuAX2z8jwOCbS0w5tz2HalWGSTZThqA0v9N0v0psHbKNqzPJa8bNOeapIVSziyJTnAg== + dependencies: + "@ethersproject/abi" "^5.1.2" + "@ethersproject/address" "^5.0.2" + cbor "^8.1.0" + debug "^4.1.1" + lodash.clonedeep "^4.5.0" + picocolors "^1.1.0" + semver "^6.3.0" + table "^6.8.0" + undici "^5.14.0" + +"@nomicfoundation/slang@^0.18.3": + version "0.18.3" + resolved "https://registry.yarnpkg.com/@nomicfoundation/slang/-/slang-0.18.3.tgz#976b6c3820081cebf050afbea434038aac9313cc" + integrity sha512-YqAWgckqbHM0/CZxi9Nlf4hjk9wUNLC9ngWCWBiqMxPIZmzsVKYuChdlrfeBPQyvQQBoOhbx+7C1005kLVQDZQ== + dependencies: + "@bytecodealliance/preview2-shim" "0.17.0" + +"@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.2.tgz#3a9c3b20d51360b20affb8f753e756d553d49557" + integrity sha512-JaqcWPDZENCvm++lFFGjrDd8mxtf+CtLd2MiXvMNTBD33dContTZ9TWETwNFwg7JTJT5Q9HEecH7FA+HTSsIUw== + +"@nomicfoundation/solidity-analyzer-darwin-x64@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.2.tgz#74dcfabeb4ca373d95bd0d13692f44fcef133c28" + integrity sha512-fZNmVztrSXC03e9RONBT+CiksSeYcxI1wlzqyr0L7hsQlK1fzV+f04g2JtQ1c/Fe74ZwdV6aQBdd6Uwl1052sw== + +"@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.2.tgz#4af5849a89e5a8f511acc04f28eb5d4460ba2b6a" + integrity sha512-3d54oc+9ZVBuB6nbp8wHylk4xh0N0Gc+bk+/uJae+rUgbOBwQSfuGIbAZt1wBXs5REkSmynEGcqx6DutoK0tPA== + +"@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.2.tgz#54036808a9a327b2ff84446c130a6687ee702a8e" + integrity sha512-iDJfR2qf55vgsg7BtJa7iPiFAsYf2d0Tv/0B+vhtnI16+wfQeTbP7teookbGvAo0eJo7aLLm0xfS/GTkvHIucA== + +"@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.2.tgz#466cda0d6e43691986c944b909fc6dbb8cfc594e" + integrity sha512-9dlHMAt5/2cpWyuJ9fQNOUXFB/vgSFORg1jpjX1Mh9hJ/MfZXlDdHQ+DpFCs32Zk5pxRBb07yGvSHk9/fezL+g== + +"@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.2.tgz#2b35826987a6e94444140ac92310baa088ee7f94" + integrity sha512-GzzVeeJob3lfrSlDKQw2bRJ8rBf6mEYaWY+gW0JnTDHINA0s2gPR4km5RLIj1xeZZOYz4zRw+AEeYgLRqB2NXg== + +"@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.2.tgz#e6363d13b8709ca66f330562337dbc01ce8bbbd9" + integrity sha512-Fdjli4DCcFHb4Zgsz0uEJXZ2K7VEO+w5KVv7HmT7WO10iODdU9csC2az4jrhEsRtiR9Gfd74FlG0NYlw1BMdyA== + +"@nomicfoundation/solidity-analyzer@^0.1.0": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.2.tgz#8bcea7d300157bf3a770a851d9f5c5e2db34ac55" + integrity sha512-q4n32/FNKIhQ3zQGGw5CvPF6GTvDCpYwIf7bEY/dZTZbgfDsHyjJwURxUJf3VQuuJj+fDIFl4+KkBVbw4Ef6jA== + optionalDependencies: + "@nomicfoundation/solidity-analyzer-darwin-arm64" "0.1.2" + "@nomicfoundation/solidity-analyzer-darwin-x64" "0.1.2" + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu" "0.1.2" + "@nomicfoundation/solidity-analyzer-linux-arm64-musl" "0.1.2" + "@nomicfoundation/solidity-analyzer-linux-x64-gnu" "0.1.2" + "@nomicfoundation/solidity-analyzer-linux-x64-musl" "0.1.2" + "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.1.2" + +"@openzeppelin/contracts-upgradeable@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-5.1.0.tgz#4d37648b7402929c53e2ff6e45749ecff91eb2b6" + integrity sha512-AIElwP5Ck+cslNE+Hkemf5SxjJoF4wBvvjxc27Rp+9jaPs/CLIaUBMYe1FNzhdiN0cYuwGRmYaRHmmntuiju4Q== + +"@openzeppelin/contracts@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-5.1.0.tgz#4e61162f2a2bf414c4e10c45eca98ce5f1aadbd4" + integrity sha512-p1ULhl7BXzjjbha5aqst+QMLY+4/LCWADXOCsmLHRM77AqiPjnd9vvUN9sosUfhL9JGKpZ0TjEGxgvnizmWGSA== + +"@openzeppelin/defender-sdk-base-client@^1.14.4", "@openzeppelin/defender-sdk-base-client@^1.15.2": + version "1.15.2" + resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-base-client/-/defender-sdk-base-client-1.15.2.tgz#aae7ec001365968b81ccce087f39a6eb52fa13f9" + integrity sha512-N3ZTeH8TXyklL7yNPMLUv0dxQwT78DTkOEDhzMS2/QE2FxbXrclSseoeeXxl6UYI61RBtZKn+okbSsbwiB5QWQ== + dependencies: + amazon-cognito-identity-js "^6.3.6" + async-retry "^1.3.3" + +"@openzeppelin/defender-sdk-deploy-client@^1.14.4": + version "1.15.2" + resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-deploy-client/-/defender-sdk-deploy-client-1.15.2.tgz#3b1d953aa66b6cdee13e7e672a488af2e2acf974" + integrity sha512-zspzMqh+OC8arXAkgBqTUDVO+NfCkt54UrsmQHbA3UAjr5TiDXKycBKU5ORb01hE+2gAmoPwEpDW9uS2VLg33A== + dependencies: + "@openzeppelin/defender-sdk-base-client" "^1.15.2" + axios "^1.7.2" + lodash "^4.17.21" + +"@openzeppelin/defender-sdk-network-client@^1.14.4": + version "1.15.2" + resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-network-client/-/defender-sdk-network-client-1.15.2.tgz#7178836d9861272ad509d93dea8739a5c4bf86c1" + integrity sha512-9r9pegc1aR7xzP9fmj1zvkk0OXMRJE10JabxxiJzAQQgmNXDeTGI6W5bFgrNJfxzcImNGqddJ3K4weKdLyL21A== + dependencies: + "@openzeppelin/defender-sdk-base-client" "^1.15.2" + axios "^1.7.2" + lodash "^4.17.21" + +"@openzeppelin/hardhat-upgrades@^3.5.0": + version "3.8.0" + resolved "https://registry.yarnpkg.com/@openzeppelin/hardhat-upgrades/-/hardhat-upgrades-3.8.0.tgz#df865f208a8fd379e136b5f8454e1bcc5417dedb" + integrity sha512-NwRk14ykTVilQqB0Vzd0vOWvUE8gpyn+SSwdzyHECRc5fuSSPDt/cIdadG9Hd6AKMPXfY+CS6G7q0+nDLng2Zw== + dependencies: + "@openzeppelin/defender-sdk-base-client" "^1.14.4" + "@openzeppelin/defender-sdk-deploy-client" "^1.14.4" + "@openzeppelin/defender-sdk-network-client" "^1.14.4" + "@openzeppelin/upgrades-core" "^1.41.0" + chalk "^4.1.0" + debug "^4.1.1" + ethereumjs-util "^7.1.5" + proper-lockfile "^4.1.1" + undici "^6.11.1" + +"@openzeppelin/upgrades-core@^1.41.0": + version "1.41.0" + resolved "https://registry.yarnpkg.com/@openzeppelin/upgrades-core/-/upgrades-core-1.41.0.tgz#3a5e044cf53acd50c392f3297e7c37e4ff8f8355" + integrity sha512-+oryinqZnxkiZvg7bWqWX4Ki/CNwVUZEqC6Elpi5PQoahpL3/6Sq9xjIozD5AiI2O61h8JHQ+A//5NtczyavJw== + dependencies: + "@nomicfoundation/slang" "^0.18.3" + cbor "^9.0.0" + chalk "^4.1.0" + compare-versions "^6.0.0" + debug "^4.1.1" + ethereumjs-util "^7.0.3" + minimatch "^9.0.5" + minimist "^1.2.7" + proper-lockfile "^4.1.1" + solidity-ast "^0.4.51" + +"@scure/base@~1.1.0", "@scure/base@~1.1.6": + version "1.1.9" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.9.tgz#e5e142fbbfe251091f9c5f1dd4c834ac04c3dbd1" + integrity sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg== + +"@scure/bip32@1.1.5": + version "1.1.5" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.1.5.tgz#d2ccae16dcc2e75bc1d75f5ef3c66a338d1ba300" + integrity sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw== + dependencies: + "@noble/hashes" "~1.2.0" + "@noble/secp256k1" "~1.7.0" + "@scure/base" "~1.1.0" + +"@scure/bip32@1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.4.0.tgz#4e1f1e196abedcef395b33b9674a042524e20d67" + integrity sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg== + dependencies: + "@noble/curves" "~1.4.0" + "@noble/hashes" "~1.4.0" + "@scure/base" "~1.1.6" + +"@scure/bip39@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.1.1.tgz#b54557b2e86214319405db819c4b6a370cf340c5" + integrity sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg== + dependencies: + "@noble/hashes" "~1.2.0" + "@scure/base" "~1.1.0" + +"@scure/bip39@1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.3.0.tgz#0f258c16823ddd00739461ac31398b4e7d6a18c3" + integrity sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ== + dependencies: + "@noble/hashes" "~1.4.0" + "@scure/base" "~1.1.6" + +"@sentry/core@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3" + integrity sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg== + dependencies: + "@sentry/hub" "5.30.0" + "@sentry/minimal" "5.30.0" + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + tslib "^1.9.3" + +"@sentry/hub@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.30.0.tgz#2453be9b9cb903404366e198bd30c7ca74cdc100" + integrity sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ== + dependencies: + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + tslib "^1.9.3" + +"@sentry/minimal@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.30.0.tgz#ce3d3a6a273428e0084adcb800bc12e72d34637b" + integrity sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw== + dependencies: + "@sentry/hub" "5.30.0" + "@sentry/types" "5.30.0" + tslib "^1.9.3" + +"@sentry/node@^5.18.1": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.30.0.tgz#4ca479e799b1021285d7fe12ac0858951c11cd48" + integrity sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg== + dependencies: + "@sentry/core" "5.30.0" + "@sentry/hub" "5.30.0" + "@sentry/tracing" "5.30.0" + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + cookie "^0.4.1" + https-proxy-agent "^5.0.0" + lru_map "^0.3.3" + tslib "^1.9.3" + +"@sentry/tracing@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-5.30.0.tgz#501d21f00c3f3be7f7635d8710da70d9419d4e1f" + integrity sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw== + dependencies: + "@sentry/hub" "5.30.0" + "@sentry/minimal" "5.30.0" + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + tslib "^1.9.3" + +"@sentry/types@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.30.0.tgz#19709bbe12a1a0115bc790b8942917da5636f402" + integrity sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw== + +"@sentry/utils@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.30.0.tgz#9a5bd7ccff85ccfe7856d493bffa64cabc41e980" + integrity sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww== + dependencies: + "@sentry/types" "5.30.0" + tslib "^1.9.3" + +"@smithy/types@^3.7.2": + version "3.7.2" + resolved "https://registry.yarnpkg.com/@smithy/types/-/types-3.7.2.tgz#05cb14840ada6f966de1bf9a9c7dd86027343e10" + integrity sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg== + dependencies: + tslib "^2.6.2" + +"@solidity-parser/parser@^0.18.0": + version "0.18.0" + resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.18.0.tgz#8e77a02a09ecce957255a2f48c9a7178ec191908" + integrity sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA== + +"@solidity-parser/parser@^0.19.0": + version "0.19.0" + resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.19.0.tgz#37a8983b2725af9b14ff8c4a475fa0e98d773c3f" + integrity sha512-RV16k/qIxW/wWc+mLzV3ARyKUaMUTBy9tOLMzFhtNSKYeTAanQ3a5MudJKf/8arIFnA2L27SNjarQKmFg0w/jA== + +"@tsconfig/node10@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" + integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== + +"@typechain/ethers-v6@^0.5.1": + version "0.5.1" + resolved "https://registry.yarnpkg.com/@typechain/ethers-v6/-/ethers-v6-0.5.1.tgz#42fe214a19a8b687086c93189b301e2b878797ea" + integrity sha512-F+GklO8jBWlsaVV+9oHaPh5NJdd6rAKN4tklGfInX1Q7h0xPgVLP39Jl3eCulPB5qexI71ZFHwbljx4ZXNfouA== + dependencies: + lodash "^4.17.15" + ts-essentials "^7.0.1" + +"@typechain/hardhat@^9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@typechain/hardhat/-/hardhat-9.1.0.tgz#6985015f01dfb37ef2ca8a29c742d05890351ddc" + integrity sha512-mtaUlzLlkqTlfPwB3FORdejqBskSnh+Jl8AIJGjXNAQfRQ4ofHADPl1+oU7Z3pAJzmZbUXII8MhOLQltcHgKnA== + dependencies: + fs-extra "^9.1.0" + +"@types/bn.js@*", "@types/bn.js@^5.1.0": + version "5.1.6" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.6.tgz#9ba818eec0c85e4d3c679518428afdf611d03203" + integrity sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w== + dependencies: + "@types/node" "*" + +"@types/bn.js@^4.11.3": + version "4.11.6" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" + integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== + dependencies: + "@types/node" "*" + +"@types/chai-as-promised@^7.1.3": + version "7.1.8" + resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.8.tgz#f2b3d82d53c59626b5d6bbc087667ccb4b677fe9" + integrity sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw== + dependencies: + "@types/chai" "*" + +"@types/chai@*": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-5.0.1.tgz#2c3705555cf11f5f59c836a84c44afcfe4e5689d" + integrity sha512-5T8ajsg3M/FOncpLYW7sdOcD6yf4+722sze/tc4KQV0P8Z2rAr3SAuHCIkYmYpt8VbcQlnz8SxlOlPQYefe4cA== + dependencies: + "@types/deep-eql" "*" + +"@types/chai@4": + version "4.3.20" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.20.tgz#cb291577ed342ca92600430841a00329ba05cecc" + integrity sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ== + +"@types/deep-eql@*": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/deep-eql/-/deep-eql-4.0.2.tgz#334311971d3a07121e7eb91b684a605e7eea9cbd" + integrity sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw== + +"@types/elliptic@^6.4.18": + version "6.4.18" + resolved "https://registry.yarnpkg.com/@types/elliptic/-/elliptic-6.4.18.tgz#bc96e26e1ccccbabe8b6f0e409c85898635482e1" + integrity sha512-UseG6H5vjRiNpQvrhy4VF/JXdA3V/Fp5amvveaL+fs28BZ6xIKJBPnUPRlEaZpysD9MbpfaLi8lbl7PGUAkpWw== + dependencies: + "@types/bn.js" "*" + +"@types/glob@^7.1.1": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" + integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== + dependencies: + "@types/minimatch" "*" + "@types/node" "*" + +"@types/lru-cache@^5.1.0": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.1.tgz#c48c2e27b65d2a153b19bfc1a317e30872e01eef" + integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== + +"@types/minimatch@*": + version "5.1.2" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" + integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== + +"@types/mocha@^10.0.9": + version "10.0.10" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.10.tgz#91f62905e8d23cbd66225312f239454a23bebfa0" + integrity sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q== + +"@types/node@*", "@types/node@^22.9.0": + version "22.10.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.2.tgz#a485426e6d1fdafc7b0d4c7b24e2c78182ddabb9" + integrity sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ== + dependencies: + undici-types "~6.20.0" + +"@types/node@22.7.5": + version "22.7.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.5.tgz#cfde981727a7ab3611a481510b473ae54442b92b" + integrity sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ== + dependencies: + undici-types "~6.19.2" + +"@types/pbkdf2@^3.0.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.2.tgz#2dc43808e9985a2c69ff02e2d2027bd4fe33e8dc" + integrity sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew== + dependencies: + "@types/node" "*" + +"@types/prettier@^2.1.1": + version "2.7.3" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f" + integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== + +"@types/secp256k1@^4.0.1": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.6.tgz#d60ba2349a51c2cbc5e816dcd831a42029d376bf" + integrity sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ== + dependencies: + "@types/node" "*" + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +abbrev@1.0.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" + integrity sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q== + +acorn-walk@^8.1.1: + version "8.3.4" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.4.tgz#794dd169c3977edf4ba4ea47583587c5866236b7" + integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== + dependencies: + acorn "^8.11.0" + +acorn@^8.11.0, acorn@^8.4.1: + version "8.14.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0" + integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== + +adm-zip@^0.4.16: + version "0.4.16" + resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365" + integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg== + +aes-js@4.0.0-beta.5: + version "4.0.0-beta.5" + resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-4.0.0-beta.5.tgz#8d2452c52adedebc3a3e28465d858c11ca315873" + integrity sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q== + +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv@^8.0.1: + version "8.17.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" + integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== + dependencies: + fast-deep-equal "^3.1.3" + fast-uri "^3.0.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + +amazon-cognito-identity-js@^6.3.6: + version "6.3.12" + resolved "https://registry.yarnpkg.com/amazon-cognito-identity-js/-/amazon-cognito-identity-js-6.3.12.tgz#af73df033094ad4c679c19cf6122b90058021619" + integrity sha512-s7NKDZgx336cp+oDeUtB2ZzT8jWJp/v2LWuYl+LQtMEODe22RF1IJ4nRiDATp+rp1pTffCZcm44Quw4jx2bqNg== + dependencies: + "@aws-crypto/sha256-js" "1.2.2" + buffer "4.9.2" + fast-base64-decode "^1.0.0" + isomorphic-unfetch "^3.0.0" + js-cookie "^2.2.1" + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + integrity sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg== + +ansi-align@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" + integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== + dependencies: + string-width "^4.1.0" + +ansi-colors@^4.1.1, ansi-colors@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + +ansi-escapes@^4.3.0: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-back@^3.0.1, array-back@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/array-back/-/array-back-3.1.0.tgz#b8859d7a508871c9a7b2cf42f99428f65e96bfb0" + integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q== + +array-back@^4.0.1, array-back@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/array-back/-/array-back-4.0.2.tgz#8004e999a6274586beeb27342168652fdb89fa1e" + integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +assertion-error@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +async-retry@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.3.3.tgz#0e7f36c04d8478e7a58bdbed80cedf977785f280" + integrity sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw== + dependencies: + retry "0.13.1" + +async@1.x: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + integrity sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +axios@^1.7.2: + version "1.7.9" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.9.tgz#d7d071380c132a24accda1b2cfc1535b79ec650a" + integrity sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw== + dependencies: + follow-redirects "^1.15.6" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base-x@^3.0.2: + version "3.0.10" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.10.tgz#62de58653f8762b5d6f8d9fe30fa75f7b2585a75" + integrity sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ== + dependencies: + safe-buffer "^5.0.1" + +base-x@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-5.0.0.tgz#6d835ceae379130e1a4cb846a70ac4746f28ea9b" + integrity sha512-sMW3VGSX1QWVFA6l8U62MLKz29rRfpTlYdCqLdpLo1/Yd4zZwSbnUaDfciIAowAqvq7YFnWq9hrhdg1KYgc1lQ== + +base64-js@^1.0.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +binary-extensions@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== + +blakejs@^1.1.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" + integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== + +bn.js@4.11.6: + version "4.11.6" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" + integrity sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA== + +bn.js@^4.11.0, bn.js@^4.11.8, bn.js@^4.11.9: + version "4.12.1" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.1.tgz#215741fe3c9dba2d7e12c001d0cfdbae43975ba7" + integrity sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg== + +bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" + integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== + +borsh@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/borsh/-/borsh-2.0.0.tgz#042a9f109565caac3c6a21297cd8c0ae8db3149d" + integrity sha512-kc9+BgR3zz9+cjbwM8ODoUB4fs3X3I5A/HtX7LZKxCLaMrEeDFoBpnhZY//DTS1VZBSs6S5v46RZRbZjRFspEg== + +boxen@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" + integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== + dependencies: + ansi-align "^3.0.0" + camelcase "^6.2.0" + chalk "^4.1.0" + cli-boxes "^2.2.1" + string-width "^4.2.2" + type-fest "^0.20.2" + widest-line "^3.1.0" + wrap-ansi "^7.0.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.3, braces@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + +brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== + +browser-stdout@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +browserify-aes@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +bs58@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" + integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== + dependencies: + base-x "^3.0.2" + +bs58@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-6.0.0.tgz#a2cda0130558535dd281a2f8697df79caaf425d8" + integrity sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw== + dependencies: + base-x "^5.0.0" + +bs58check@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" + integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== + dependencies: + bs58 "^4.0.0" + create-hash "^1.1.0" + safe-buffer "^5.1.2" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== + +buffer@4.9.2: + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +camelcase@^6.0.0, camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +cbor@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/cbor/-/cbor-8.1.0.tgz#cfc56437e770b73417a2ecbfc9caf6b771af60d5" + integrity sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg== + dependencies: + nofilter "^3.1.0" + +cbor@^9.0.0: + version "9.0.2" + resolved "https://registry.yarnpkg.com/cbor/-/cbor-9.0.2.tgz#536b4f2d544411e70ec2b19a2453f10f83cd9fdb" + integrity sha512-JPypkxsB10s9QOWwa6zwPzqE1Md3vqpPc+cai4sAecuCsRyAtAl/pMyhPlMbT/xtPnm2dznJZYRLui57qiRhaQ== + dependencies: + nofilter "^3.1.0" + +chai-as-promised@^7.1.1: + version "7.1.2" + resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-7.1.2.tgz#70cd73b74afd519754161386421fb71832c6d041" + integrity sha512-aBDHZxRzYnUYuIAIPBH2s511DjlKPzXNlXSGFC8CwmroWQLfrW0LtE1nK3MAwwNhJPa9raEjNCmRoFpG0Hurdw== + dependencies: + check-error "^1.0.2" + +chai@4: + version "4.5.0" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.5.0.tgz#707e49923afdd9b13a8b0b47d33d732d13812fd8" + integrity sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw== + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.3" + deep-eql "^4.1.3" + get-func-name "^2.0.2" + loupe "^2.3.6" + pathval "^1.1.1" + type-detect "^4.1.0" + +chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +check-error@^1.0.2, check-error@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694" + integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== + dependencies: + get-func-name "^2.0.2" + +chokidar@^3.5.3: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chokidar@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.3.tgz#7be37a4c03c9aee1ecfe862a4a23b2c70c205d30" + integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA== + dependencies: + readdirp "^4.0.1" + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.6.tgz#8fe672437d01cd6c4561af5334e0cc50ff1955f7" + integrity sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw== + dependencies: + inherits "^2.0.4" + safe-buffer "^5.2.1" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-boxes@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" + integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +command-exists@^1.2.8: + version "1.2.9" + resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" + integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== + +command-line-args@^5.1.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-5.2.1.tgz#c44c32e437a57d7c51157696893c5909e9cec42e" + integrity sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg== + dependencies: + array-back "^3.1.0" + find-replace "^3.0.0" + lodash.camelcase "^4.3.0" + typical "^4.0.0" + +command-line-usage@^6.1.0: + version "6.1.3" + resolved "https://registry.yarnpkg.com/command-line-usage/-/command-line-usage-6.1.3.tgz#428fa5acde6a838779dfa30e44686f4b6761d957" + integrity sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw== + dependencies: + array-back "^4.0.2" + chalk "^2.4.2" + table-layout "^1.0.2" + typical "^5.2.0" + +commander@^8.1.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + +compare-versions@^6.0.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-6.1.1.tgz#7af3cc1099ba37d244b3145a9af5201b629148a9" + integrity sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +console-table-printer@^2.9.0: + version "2.12.1" + resolved "https://registry.yarnpkg.com/console-table-printer/-/console-table-printer-2.12.1.tgz#4a9646537a246a6d8de57075d4fae1e08abae267" + integrity sha512-wKGOQRRvdnd89pCeH96e2Fn4wkbenSP6LMHfjfyNLMbGuHEFbMqQNuxXqd0oXG9caIOQ1FTvc5Uijp9/4jujnQ== + dependencies: + simple-wcswidth "^1.0.1" + +cookie@^0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" + integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +death@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/death/-/death-1.1.0.tgz#01aa9c401edd92750514470b8266390c66c67318" + integrity sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w== + +debug@4, debug@^4.1.1, debug@^4.3.1, debug@^4.3.5: + version "4.4.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" + integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== + dependencies: + ms "^2.1.3" + +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + +deep-eql@^4.0.1, deep-eql@^4.1.3: + version "4.1.4" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.4.tgz#d0d3912865911bb8fac5afb4e3acfa6a28dc72b7" + integrity sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg== + dependencies: + type-detect "^4.0.0" + +deep-extend@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deep-is@~0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +diff@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531" + integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== + +difflib@^0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/difflib/-/difflib-0.2.4.tgz#b5e30361a6db023176d562892db85940a718f47e" + integrity sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w== + dependencies: + heap ">= 0.2.0" + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dotenv@^16.4.5: + version "16.4.7" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.7.tgz#0e20c5b82950140aa99be360a8a5f52335f53c26" + integrity sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ== + +elliptic@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +elliptic@^6.5.2, elliptic@^6.5.7: + version "6.6.1" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.6.1.tgz#3b8ffb02670bf69e382c7f65bf524c97c5405c06" + integrity sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +enquirer@^2.3.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" + integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== + dependencies: + ansi-colors "^4.1.1" + strip-ansi "^6.0.1" + +env-paths@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + +escalade@^3.1.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escodegen@1.8.x: + version "1.8.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" + integrity sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A== + dependencies: + esprima "^2.7.1" + estraverse "^1.9.1" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.2.0" + +esprima@2.7.x, esprima@^2.7.1: + version "2.7.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + integrity sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A== + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +estraverse@^1.9.1: + version "1.9.3" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" + integrity sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +ethereum-bloom-filters@^1.0.6: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.2.0.tgz#8294f074c1a6cbd32c39d2cc77ce86ff14797dab" + integrity sha512-28hyiE7HVsWubqhpVLVmZXFd4ITeHi+BUu05o9isf0GUpMtzBUi+8/gFrGaGYzvGAJQmJ3JKj77Mk9G98T84rA== + dependencies: + "@noble/hashes" "^1.4.0" + +ethereum-cryptography@0.1.3, ethereum-cryptography@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" + integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== + dependencies: + "@types/pbkdf2" "^3.0.0" + "@types/secp256k1" "^4.0.1" + blakejs "^1.1.0" + browserify-aes "^1.2.0" + bs58check "^2.1.2" + create-hash "^1.2.0" + create-hmac "^1.1.7" + hash.js "^1.1.7" + keccak "^3.0.0" + pbkdf2 "^3.0.17" + randombytes "^2.1.0" + safe-buffer "^5.1.2" + scrypt-js "^3.0.0" + secp256k1 "^4.0.1" + setimmediate "^1.0.5" + +ethereum-cryptography@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz#5ccfa183e85fdaf9f9b299a79430c044268c9b3a" + integrity sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw== + dependencies: + "@noble/hashes" "1.2.0" + "@noble/secp256k1" "1.7.1" + "@scure/bip32" "1.1.5" + "@scure/bip39" "1.1.1" + +ethereum-cryptography@^2.0.0, ethereum-cryptography@^2.1.2: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz#58f2810f8e020aecb97de8c8c76147600b0b8ccf" + integrity sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg== + dependencies: + "@noble/curves" "1.4.2" + "@noble/hashes" "1.4.0" + "@scure/bip32" "1.4.0" + "@scure/bip39" "1.3.0" + +ethereumjs-abi@^0.6.8: + version "0.6.8" + resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz#71bc152db099f70e62f108b7cdfca1b362c6fcae" + integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA== + dependencies: + bn.js "^4.11.8" + ethereumjs-util "^6.0.0" + +ethereumjs-util@^6.0.0, ethereumjs-util@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz#fcb4e4dd5ceacb9d2305426ab1a5cd93e3163b69" + integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw== + dependencies: + "@types/bn.js" "^4.11.3" + bn.js "^4.11.0" + create-hash "^1.1.2" + elliptic "^6.5.2" + ethereum-cryptography "^0.1.3" + ethjs-util "0.1.6" + rlp "^2.2.3" + +ethereumjs-util@^7.0.3, ethereumjs-util@^7.1.4, ethereumjs-util@^7.1.5: + version "7.1.5" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz#9ecf04861e4fbbeed7465ece5f23317ad1129181" + integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg== + dependencies: + "@types/bn.js" "^5.1.0" + bn.js "^5.1.2" + create-hash "^1.1.2" + ethereum-cryptography "^0.1.3" + rlp "^2.2.4" + +ethers@^6.13.4: + version "6.13.4" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.13.4.tgz#bd3e1c3dc1e7dc8ce10f9ffb4ee40967a651b53c" + integrity sha512-21YtnZVg4/zKkCQPjrDj38B1r4nQvTZLopUGMLQ1ePU2zV/joCfDC3t3iKQjWRzjjjbzR+mdAIoikeBRNkdllA== + dependencies: + "@adraffy/ens-normalize" "1.10.1" + "@noble/curves" "1.2.0" + "@noble/hashes" "1.3.2" + "@types/node" "22.7.5" + aes-js "4.0.0-beta.5" + tslib "2.7.0" + ws "8.17.1" + +ethjs-unit@0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" + integrity sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw== + dependencies: + bn.js "4.11.6" + number-to-bn "1.7.0" + +ethjs-util@0.1.6, ethjs-util@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536" + integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w== + dependencies: + is-hex-prefixed "1.0.0" + strip-hex-prefix "1.0.0" + +evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +fast-base64-decode@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fast-base64-decode/-/fast-base64-decode-1.0.0.tgz#b434a0dd7d92b12b43f26819300d2dafb83ee418" + integrity sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q== + +fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.0.3: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fast-uri@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.3.tgz#892a1c91802d5d7860de728f18608a0573142241" + integrity sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw== + +fastq@^1.6.0: + version "1.17.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" + integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== + dependencies: + reusify "^1.0.4" + +fdir@^6.4.2: + version "6.4.2" + resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.2.tgz#ddaa7ce1831b161bc3657bb99cb36e1622702689" + integrity sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ== + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + +find-replace@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-3.0.0.tgz#3e7e23d3b05167a76f770c9fbd5258b0def68c38" + integrity sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ== + dependencies: + array-back "^3.0.1" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +follow-redirects@^1.12.1, follow-redirects@^1.15.6: + version "1.15.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" + integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== + +form-data@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.1.tgz#ba1076daaaa5bfd7e99c1a6cb02aa0a5cff90d48" + integrity sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +fp-ts@1.19.3: + version "1.19.3" + resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.3.tgz#261a60d1088fbff01f91256f91d21d0caaaaa96f" + integrity sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg== + +fp-ts@^1.0.0: + version "1.19.5" + resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.5.tgz#3da865e585dfa1fdfd51785417357ac50afc520a" + integrity sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A== + +fs-extra@^7.0.0, fs-extra@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-func-name@^2.0.1, get-func-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" + integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== + +ghost-testrpc@^0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz#c4de9557b1d1ae7b2d20bbe474a91378ca90ce92" + integrity sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ== + dependencies: + chalk "^2.4.2" + node-emoji "^1.10.0" + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob@7.1.7: + version "7.1.7" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^5.0.15: + version "5.0.15" + resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" + integrity sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA== + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.0.0, glob@^7.1.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + +global-modules@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + +globby@^10.0.1: + version "10.0.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.2.tgz#277593e745acaa4646c3ab411289ec47a0392543" + integrity sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg== + dependencies: + "@types/glob" "^7.1.1" + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.0.3" + glob "^7.1.3" + ignore "^5.1.1" + merge2 "^1.2.3" + slash "^3.0.0" + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +handlebars@^4.0.1: + version "4.7.8" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9" + integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== + dependencies: + minimist "^1.2.5" + neo-async "^2.6.2" + source-map "^0.6.1" + wordwrap "^1.0.0" + optionalDependencies: + uglify-js "^3.1.4" + +hardhat-storage-layout@^0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/hardhat-storage-layout/-/hardhat-storage-layout-0.1.7.tgz#ad8a5afd8593ee51031eb1dd9476b4a2ed981785" + integrity sha512-q723g2iQnJpRdMC6Y8fbh/stG6MLHKNxa5jq/ohjtD5znOlOzQ6ojYuInY8V4o4WcPyG3ty4hzHYunLf66/1+A== + dependencies: + console-table-printer "^2.9.0" + +hardhat@^2.22.16: + version "2.22.17" + resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.22.17.tgz#96036bbe6bad8eb6a6b65c54dc5fbc1324541612" + integrity sha512-tDlI475ccz4d/dajnADUTRc1OJ3H8fpP9sWhXhBPpYsQOg8JHq5xrDimo53UhWPl7KJmAeDCm1bFG74xvpGRpg== + dependencies: + "@ethersproject/abi" "^5.1.2" + "@metamask/eth-sig-util" "^4.0.0" + "@nomicfoundation/edr" "^0.6.5" + "@nomicfoundation/ethereumjs-common" "4.0.4" + "@nomicfoundation/ethereumjs-tx" "5.0.4" + "@nomicfoundation/ethereumjs-util" "9.0.4" + "@nomicfoundation/solidity-analyzer" "^0.1.0" + "@sentry/node" "^5.18.1" + "@types/bn.js" "^5.1.0" + "@types/lru-cache" "^5.1.0" + adm-zip "^0.4.16" + aggregate-error "^3.0.0" + ansi-escapes "^4.3.0" + boxen "^5.1.2" + chokidar "^4.0.0" + ci-info "^2.0.0" + debug "^4.1.1" + enquirer "^2.3.0" + env-paths "^2.2.0" + ethereum-cryptography "^1.0.3" + ethereumjs-abi "^0.6.8" + find-up "^5.0.0" + fp-ts "1.19.3" + fs-extra "^7.0.1" + immutable "^4.0.0-rc.12" + io-ts "1.10.4" + json-stream-stringify "^3.1.4" + keccak "^3.0.2" + lodash "^4.17.11" + mnemonist "^0.38.0" + mocha "^10.0.0" + p-map "^4.0.0" + picocolors "^1.1.0" + raw-body "^2.4.1" + resolve "1.17.0" + semver "^6.3.0" + solc "0.8.26" + source-map-support "^0.5.13" + stacktrace-parser "^0.1.10" + tinyglobby "^0.2.6" + tsort "0.0.1" + undici "^5.14.0" + uuid "^8.3.2" + ws "^7.4.6" + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + integrity sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +he@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +"heap@>= 0.2.0": + version "0.2.7" + resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.7.tgz#1e6adf711d3f27ce35a81fe3b7bd576c2260a8fc" + integrity sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg== + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +https-proxy-agent@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ieee754@^1.1.4: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore@^5.1.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== + +immutable@^4.0.0-rc.12: + version "4.3.7" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.7.tgz#c70145fc90d89fb02021e65c84eb0226e4e5a381" + integrity sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@^1.3.5: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +interpret@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== + +io-ts@1.10.4: + version "1.10.4" + resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-1.10.4.tgz#cd5401b138de88e4f920adbcb7026e2d1967e6e2" + integrity sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g== + dependencies: + fp-ts "^1.0.0" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-core-module@^2.16.0: + version "2.16.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" + integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== + dependencies: + hasown "^2.0.2" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-hex-prefixed@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" + integrity sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA== + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +isarray@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isomorphic-unfetch@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz#87341d5f4f7b63843d468438128cb087b7c3e98f" + integrity sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q== + dependencies: + node-fetch "^2.6.1" + unfetch "^4.2.0" + +js-cookie@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-2.2.1.tgz#69e106dc5d5806894562902aa5baec3744e9b2b8" + integrity sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ== + +js-sha3@0.8.0, js-sha3@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" + integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== + +js-yaml@3.x: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-stream-stringify@^3.1.4: + version "3.1.6" + resolved "https://registry.yarnpkg.com/json-stream-stringify/-/json-stream-stringify-3.1.6.tgz#ebe32193876fb99d4ec9f612389a8d8e2b5d54d4" + integrity sha512-x7fpwxOkbhFCaJDJ8vb1fBY3DdSa4AlITaz+HHILQJzdPMnHEFjxPwVUi1ALIbcIxDE0PNe/0i7frnY8QnBQog== + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonschema@^1.2.4: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.1.tgz#cc4c3f0077fb4542982973d8a083b6b34f482dab" + integrity sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ== + +keccak@^3.0.0, keccak@^3.0.2: + version "3.0.4" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.4.tgz#edc09b89e633c0549da444432ecf062ffadee86d" + integrity sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q== + dependencies: + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + readable-stream "^3.6.0" + +kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== + +lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ== + +lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== + +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== + +lodash@^4.17.11, lodash@^4.17.15, lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +loupe@^2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697" + integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== + dependencies: + get-func-name "^2.0.1" + +lru_map@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" + integrity sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ== + +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +memorystream@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" + integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== + +merge2@^1.2.3, merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micro-ftch@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/micro-ftch/-/micro-ftch-0.3.1.tgz#6cb83388de4c1f279a034fb0cf96dfc050853c5f" + integrity sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg== + +micromatch@^4.0.4: + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== + +"minimatch@2 || 3", minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^5.0.1, minimatch@^5.1.6: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^9.0.5: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.5, minimist@^1.2.6, minimist@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +mkdirp@0.5.x: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +mnemonist@^0.38.0: + version "0.38.5" + resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.38.5.tgz#4adc7f4200491237fe0fa689ac0b86539685cade" + integrity sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg== + dependencies: + obliterator "^2.0.0" + +mocha@^10.0.0, mocha@^10.2.0: + version "10.8.2" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.8.2.tgz#8d8342d016ed411b12a429eb731b825f961afb96" + integrity sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg== + dependencies: + ansi-colors "^4.1.3" + browser-stdout "^1.3.1" + chokidar "^3.5.3" + debug "^4.3.5" + diff "^5.2.0" + escape-string-regexp "^4.0.0" + find-up "^5.0.0" + glob "^8.1.0" + he "^1.2.0" + js-yaml "^4.1.0" + log-symbols "^4.1.0" + minimatch "^5.1.6" + ms "^2.1.3" + serialize-javascript "^6.0.2" + strip-json-comments "^3.1.1" + supports-color "^8.1.1" + workerpool "^6.5.1" + yargs "^16.2.0" + yargs-parser "^20.2.9" + yargs-unparser "^2.0.0" + +ms@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +node-addon-api@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" + integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== + +node-addon-api@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.1.0.tgz#49da1ca055e109a23d537e9de43c09cca21eb762" + integrity sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA== + +node-emoji@^1.10.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c" + integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A== + dependencies: + lodash "^4.17.21" + +node-fetch@^2.6.1: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + +node-gyp-build@^4.2.0: + version "4.8.4" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.4.tgz#8a70ee85464ae52327772a90d66c6077a900cfc8" + integrity sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ== + +nofilter@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-3.1.0.tgz#c757ba68801d41ff930ba2ec55bab52ca184aa66" + integrity sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g== + +nopt@3.x: + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + integrity sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg== + dependencies: + abbrev "1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +number-to-bn@1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0" + integrity sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig== + dependencies: + bn.js "4.11.6" + strip-hex-prefix "1.0.0" + +obliterator@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-2.0.4.tgz#fa650e019b2d075d745e44f1effeb13a2adbe816" + integrity sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ== + +once@1.x, once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + +ordinal@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/ordinal/-/ordinal-1.0.3.tgz#1a3c7726a61728112f50944ad7c35c06ae3a0d4d" + integrity sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ== + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-parse@^1.0.6, path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pathval@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" + integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== + +pbkdf2@^3.0.17: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +picocolors@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +picomatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" + integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== + +prettier-plugin-solidity@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/prettier-plugin-solidity/-/prettier-plugin-solidity-1.4.1.tgz#8060baf18853a9e34d2e09e47e87b4f19e15afe9" + integrity sha512-Mq8EtfacVZ/0+uDKTtHZGW3Aa7vEbX/BNx63hmVg6YTiTXSiuKP0amj0G6pGwjmLaOfymWh3QgXEZkjQbU8QRg== + dependencies: + "@solidity-parser/parser" "^0.18.0" + semver "^7.5.4" + +prettier@^2.3.1: + version "2.8.8" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== + +prettier@^3.3.3: + version "3.4.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.4.2.tgz#a5ce1fb522a588bf2b78ca44c6e6fe5aa5a2b13f" + integrity sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ== + +proper-lockfile@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/proper-lockfile/-/proper-lockfile-4.1.2.tgz#c8b9de2af6b2f1601067f98e01ac66baa223141f" + integrity sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA== + dependencies: + graceful-fs "^4.2.4" + retry "^0.12.0" + signal-exit "^3.0.2" + +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +raw-body@^2.4.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.0.2.tgz#388fccb8b75665da3abffe2d8f8ed59fe74c230a" + integrity sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA== + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== + dependencies: + resolve "^1.1.6" + +recursive-readdir@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.3.tgz#e726f328c0d69153bcabd5c322d3195252379372" + integrity sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA== + dependencies: + minimatch "^3.0.5" + +reduce-flatten@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-2.0.0.tgz#734fd84e65f375d7ca4465c69798c25c9d10ae27" + integrity sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w== + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +resolve@1.1.x: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + integrity sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg== + +resolve@1.17.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== + dependencies: + path-parse "^1.0.6" + +resolve@^1.1.6: + version "1.22.10" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" + integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== + dependencies: + is-core-module "^2.16.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +retry@0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +rlp@^2.2.3, rlp@^2.2.4: + version "2.2.7" + resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf" + integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== + dependencies: + bn.js "^5.2.0" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sc-istanbul@^0.4.5: + version "0.4.6" + resolved "https://registry.yarnpkg.com/sc-istanbul/-/sc-istanbul-0.4.6.tgz#cf6784355ff2076f92d70d59047d71c13703e839" + integrity sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g== + dependencies: + abbrev "1.0.x" + async "1.x" + escodegen "1.8.x" + esprima "2.7.x" + glob "^5.0.15" + handlebars "^4.0.1" + js-yaml "3.x" + mkdirp "0.5.x" + nopt "3.x" + once "1.x" + resolve "1.1.x" + supports-color "^3.1.0" + which "^1.1.1" + wordwrap "^1.0.0" + +scrypt-js@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" + integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== + +secp256k1@^4.0.1: + version "4.0.4" + resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.4.tgz#58f0bfe1830fe777d9ca1ffc7574962a8189f8ab" + integrity sha512-6JfvwvjUOn8F/jUoBY2Q1v5WY5XS+rj8qSe0v8Y4ezH4InLgTEeOOPQsRll9OV429Pvo6BCHGavIyJfr3TAhsw== + dependencies: + elliptic "^6.5.7" + node-addon-api "^5.0.0" + node-gyp-build "^4.2.0" + +semver@^5.5.0: + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + +semver@^6.3.0: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.3.4, semver@^7.5.4: + version "7.6.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== + +serialize-javascript@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== + dependencies: + randombytes "^2.1.0" + +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shelljs@^0.8.3: + version "0.8.5" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" + integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + +signal-exit@^3.0.2: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +simple-wcswidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/simple-wcswidth/-/simple-wcswidth-1.0.1.tgz#8ab18ac0ae342f9d9b629604e54d2aa1ecb018b2" + integrity sha512-xMO/8eNREtaROt7tJvWJqHBDTMFN4eiQ5I4JRMuilwfnFcV5W9u7RUkueNkdw0jPqGMX36iCywelS5yilTuOxg== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +solc@0.8.26: + version "0.8.26" + resolved "https://registry.yarnpkg.com/solc/-/solc-0.8.26.tgz#afc78078953f6ab3e727c338a2fefcd80dd5b01a" + integrity sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g== + dependencies: + command-exists "^1.2.8" + commander "^8.1.0" + follow-redirects "^1.12.1" + js-sha3 "0.8.0" + memorystream "^0.3.1" + semver "^5.5.0" + tmp "0.0.33" + +solidity-ast@^0.4.51: + version "0.4.59" + resolved "https://registry.yarnpkg.com/solidity-ast/-/solidity-ast-0.4.59.tgz#290a2815aef70a61092591ab3e991da080ae5931" + integrity sha512-I+CX0wrYUN9jDfYtcgWSe+OAowaXy8/1YQy7NS4ni5IBDmIYBq7ZzaP/7QqouLjzZapmQtvGLqCaYgoUWqBo5g== + +solidity-coverage@^0.8.13: + version "0.8.14" + resolved "https://registry.yarnpkg.com/solidity-coverage/-/solidity-coverage-0.8.14.tgz#db9bfcc10e3bc369fc074b35b267d665bcc6ae2e" + integrity sha512-ItAAObe5GaEOp20kXC2BZRnph+9P7Rtoqg2mQc2SXGEHgSDF2wWd1Wxz3ntzQWXkbCtIIGdJT918HG00cObwbA== + dependencies: + "@ethersproject/abi" "^5.0.9" + "@solidity-parser/parser" "^0.19.0" + chalk "^2.4.2" + death "^1.1.0" + difflib "^0.2.4" + fs-extra "^8.1.0" + ghost-testrpc "^0.0.2" + global-modules "^2.0.0" + globby "^10.0.1" + jsonschema "^1.2.4" + lodash "^4.17.21" + mocha "^10.2.0" + node-emoji "^1.10.0" + pify "^4.0.1" + recursive-readdir "^2.2.2" + sc-istanbul "^0.4.5" + semver "^7.3.4" + shelljs "^0.8.3" + web3-utils "^1.3.6" + +source-map-support@^0.5.13: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0, source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" + integrity sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA== + dependencies: + amdefine ">=0.0.4" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +stacktrace-parser@^0.1.10: + version "0.1.10" + resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" + integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== + dependencies: + type-fest "^0.7.1" + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +string-format@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string-format/-/string-format-2.0.0.tgz#f2df2e7097440d3b65de31b6d40d54c96eaffb9b" + integrity sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA== + +string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-hex-prefix@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f" + integrity sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A== + dependencies: + is-hex-prefixed "1.0.0" + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +supports-color@^3.1.0: + version "3.2.3" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + integrity sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A== + dependencies: + has-flag "^1.0.0" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +table-layout@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-1.0.2.tgz#c4038a1853b0136d63365a734b6931cf4fad4a04" + integrity sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A== + dependencies: + array-back "^4.0.1" + deep-extend "~0.6.0" + typical "^5.2.0" + wordwrapjs "^4.0.0" + +table@^6.8.0: + version "6.9.0" + resolved "https://registry.yarnpkg.com/table/-/table-6.9.0.tgz#50040afa6264141c7566b3b81d4d82c47a8668f5" + integrity sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A== + dependencies: + ajv "^8.0.1" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + +tinyglobby@^0.2.6: + version "0.2.10" + resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.10.tgz#e712cf2dc9b95a1f5c5bbd159720e15833977a0f" + integrity sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew== + dependencies: + fdir "^6.4.2" + picomatch "^4.0.2" + +tmp@0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +ts-command-line-args@^2.2.0: + version "2.5.1" + resolved "https://registry.yarnpkg.com/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz#e64456b580d1d4f6d948824c274cf6fa5f45f7f0" + integrity sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw== + dependencies: + chalk "^4.1.0" + command-line-args "^5.1.1" + command-line-usage "^6.1.0" + string-format "^2.0.0" + +ts-essentials@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-7.0.3.tgz#686fd155a02133eedcc5362dc8b5056cde3e5a38" + integrity sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ== + +ts-node@^10.9.2: + version "10.9.2" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" + integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + +tslib@2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01" + integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== + +tslib@^1.11.1, tslib@^1.9.3: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.3.1, tslib@^2.6.2: + version "2.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== + +tsort@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786" + integrity sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw== + +tweetnacl-util@^0.15.1: + version "0.15.1" + resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz#b80fcdb5c97bcc508be18c44a4be50f022eea00b" + integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw== + +tweetnacl@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" + integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== + dependencies: + prelude-ls "~1.1.2" + +type-detect@^4.0.0, type-detect@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.1.0.tgz#deb2453e8f08dcae7ae98c626b13dddb0155906c" + integrity sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-fest@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" + integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== + +typechain@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/typechain/-/typechain-8.3.2.tgz#1090dd8d9c57b6ef2aed3640a516bdbf01b00d73" + integrity sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q== + dependencies: + "@types/prettier" "^2.1.1" + debug "^4.3.1" + fs-extra "^7.0.0" + glob "7.1.7" + js-sha3 "^0.8.0" + lodash "^4.17.15" + mkdirp "^1.0.4" + prettier "^2.3.1" + ts-command-line-args "^2.2.0" + ts-essentials "^7.0.1" + +typescript@^5.7.2: + version "5.7.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.2.tgz#3169cf8c4c8a828cde53ba9ecb3d2b1d5dd67be6" + integrity sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg== + +typical@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/typical/-/typical-4.0.0.tgz#cbeaff3b9d7ae1e2bbfaf5a4e6f11eccfde94fc4" + integrity sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw== + +typical@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/typical/-/typical-5.2.0.tgz#4daaac4f2b5315460804f0acf6cb69c52bb93066" + integrity sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg== + +uglify-js@^3.1.4: + version "3.19.3" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.19.3.tgz#82315e9bbc6f2b25888858acd1fff8441035b77f" + integrity sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ== + +undici-types@~6.19.2: + version "6.19.8" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" + integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== + +undici-types@~6.20.0: + version "6.20.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433" + integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== + +undici@^5.14.0: + version "5.28.4" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.4.tgz#6b280408edb6a1a604a9b20340f45b422e373068" + integrity sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g== + dependencies: + "@fastify/busboy" "^2.0.0" + +undici@^6.11.1: + version "6.21.0" + resolved "https://registry.yarnpkg.com/undici/-/undici-6.21.0.tgz#4b3d3afaef984e07b48e7620c34ed8a285ed4cd4" + integrity sha512-BUgJXc752Kou3oOIuU1i+yZZypyZRqNPW0vqoMPl8VaoalSfeR0D8/t4iAS3yirs79SSMTxTag+ZC86uswv+Cw== + +unfetch@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.2.0.tgz#7e21b0ef7d363d8d9af0fb929a5555f6ef97a3be" + integrity sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA== + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +universalify@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== + +unpipe@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +utf8@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" + integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== + +util-deprecate@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + +web3-utils@^1.3.6: + version "1.10.4" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.10.4.tgz#0daee7d6841641655d8b3726baf33b08eda1cbec" + integrity sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A== + dependencies: + "@ethereumjs/util" "^8.1.0" + bn.js "^5.2.1" + ethereum-bloom-filters "^1.0.6" + ethereum-cryptography "^2.1.2" + ethjs-unit "0.1.6" + number-to-bn "1.7.0" + randombytes "^2.1.0" + utf8 "3.0.0" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which@^1.1.1, which@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +widest-line@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" + integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== + dependencies: + string-width "^4.0.0" + +word-wrap@~1.2.3: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + +wordwrap@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== + +wordwrapjs@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/wordwrapjs/-/wordwrapjs-4.0.1.tgz#d9790bccfb110a0fc7836b5ebce0937b37a8b98f" + integrity sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA== + dependencies: + reduce-flatten "^2.0.0" + typical "^5.2.0" + +workerpool@^6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.5.1.tgz#060f73b39d0caf97c6db64da004cd01b4c099544" + integrity sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +ws@8.17.1: + version "8.17.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" + integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== + +ws@^7.4.6: + version "7.5.10" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" + integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yargs-parser@^20.2.2, yargs-parser@^20.2.9: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-unparser@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== diff --git a/e2e-testing/scripts/deploy-near-contract.sh b/e2e-testing/scripts/deploy-near-contract.sh new file mode 100755 index 00000000..dfc89423 --- /dev/null +++ b/e2e-testing/scripts/deploy-near-contract.sh @@ -0,0 +1,38 @@ +#!/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 + + +if [ "$#" -ne 3 ]; then + echo "Usage: $0 " + exit 1 +fi + +WASM_PATH="$1" +OUTPUT_JSON="$2" +CONTRACT_ID="$3" +BINARY_NAME=$(basename "$WASM_PATH" .wasm) + +echo "Deploying ${BINARY_NAME} to ${CONTRACT_ID}" + +# 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}" + exit 1 +fi + +# Delay to allow the account to be created +sleep 3 + +# Deploy 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}" + exit 1 +fi + +echo "{\"contract_id\": \"$CONTRACT_ID\"}" > "$OUTPUT_JSON" +echo "Deployment successful, saved to $OUTPUT_JSON" \ No newline at end of file diff --git a/evm/.env.example b/evm/.env.example new file mode 100644 index 00000000..b3cb4000 --- /dev/null +++ b/evm/.env.example @@ -0,0 +1,5 @@ +INFURA_API_KEY= +EVM_PRIVATE_KEY= +ETHERSCAN_API_KEY= +BASESCAN_API_KEY= +ARBISCAN_API_KEY= diff --git a/evm/.gitignore b/evm/.gitignore new file mode 100644 index 00000000..da89bbea --- /dev/null +++ b/evm/.gitignore @@ -0,0 +1,8 @@ +build/ +cache/ +coverage/ +coverage.json +node_modules +.env +typechain-types +dist/ \ No newline at end of file diff --git a/evm/.openzeppelin/arbitrum-one.json b/evm/.openzeppelin/arbitrum-one.json new file mode 100644 index 00000000..d7fdfc54 --- /dev/null +++ b/evm/.openzeppelin/arbitrum-one.json @@ -0,0 +1,534 @@ +{ + "manifestVersion": "3.2", + "proxies": [ + { + "address": "0xd025b38762B4A4E36F0Cde483b86CB13ea00D989", + "txHash": "0x60b473ba8ae68fe192be3c960a3762e46099a3f9e60f60f7eed47db7c73ab29d", + "kind": "uups" + } + ], + "impls": { + "298b9f36a9e024def1c6e6baa12524fe201ac1dd8b39bb4d529d2eb956d896e7": { + "address": "0xf353b40fC144d1c6c5BCdda712fa6De833016aF9", + "txHash": "0x3e7e1b4b6605e3594113dfc09994eead8c1f4f63469d80f7e28219092fd88a36", + "layout": { + "solcVersion": "0.8.24", + "storage": [ + { + "label": "ethToNearToken", + "offset": 0, + "slot": "0", + "type": "t_mapping(t_address,t_string_storage)", + "contract": "OmniBridge", + "src": "src/omni-bridge/contracts/OmniBridge.sol:24" + }, + { + "label": "nearToEthToken", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_string_memory_ptr,t_address)", + "contract": "OmniBridge", + "src": "src/omni-bridge/contracts/OmniBridge.sol:25" + }, + { + "label": "isBridgeToken", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_address,t_bool)", + "contract": "OmniBridge", + "src": "src/omni-bridge/contracts/OmniBridge.sol:26" + }, + { + "label": "tokenImplementationAddress", + "offset": 0, + "slot": "3", + "type": "t_address", + "contract": "OmniBridge", + "src": "src/omni-bridge/contracts/OmniBridge.sol:28" + }, + { + "label": "nearBridgeDerivedAddress", + "offset": 0, + "slot": "4", + "type": "t_address", + "contract": "OmniBridge", + "src": "src/omni-bridge/contracts/OmniBridge.sol:29" + }, + { + "label": "omniBridgeChainId", + "offset": 20, + "slot": "4", + "type": "t_uint8", + "contract": "OmniBridge", + "src": "src/omni-bridge/contracts/OmniBridge.sol:30" + }, + { + "label": "completedTransfers", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_uint64,t_bool)", + "contract": "OmniBridge", + "src": "src/omni-bridge/contracts/OmniBridge.sol:32" + }, + { + "label": "currentOriginNonce", + "offset": 0, + "slot": "6", + "type": "t_uint64", + "contract": "OmniBridge", + "src": "src/omni-bridge/contracts/OmniBridge.sol:33" + }, + { + "label": "customMinters", + "offset": 0, + "slot": "7", + "type": "t_mapping(t_address,t_address)", + "contract": "OmniBridge", + "src": "src/omni-bridge/contracts/OmniBridge.sol:35" + }, + { + "label": "__gap", + "offset": 0, + "slot": "8", + "type": "t_array(t_uint256)50_storage", + "contract": "OmniBridge", + "src": "src/omni-bridge/contracts/OmniBridge.sol:326" + }, + { + "label": "_wormhole", + "offset": 0, + "slot": "58", + "type": "t_contract(IWormhole)5912", + "contract": "OmniBridgeWormhole", + "src": "src/omni-bridge/contracts/OmniBridgeWormhole.sol:26" + }, + { + "label": "_consistencyLevel", + "offset": 20, + "slot": "58", + "type": "t_uint8", + "contract": "OmniBridgeWormhole", + "src": "src/omni-bridge/contracts/OmniBridgeWormhole.sol:28" + }, + { + "label": "wormholeNonce", + "offset": 21, + "slot": "58", + "type": "t_uint32", + "contract": "OmniBridgeWormhole", + "src": "src/omni-bridge/contracts/OmniBridgeWormhole.sol:29" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_bool)": { + "label": "mapping(address => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_struct(RoleData)24_storage)": { + "label": "mapping(bytes32 => struct AccessControlUpgradeable.RoleData)", + "numberOfBytes": "32" + }, + "t_struct(AccessControlStorage)34_storage": { + "label": "struct AccessControlUpgradeable.AccessControlStorage", + "members": [ + { + "label": "_roles", + "type": "t_mapping(t_bytes32,t_struct(RoleData)24_storage)", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(InitializableStorage)266_storage": { + "label": "struct Initializable.InitializableStorage", + "members": [ + { + "label": "_initialized", + "type": "t_uint64", + "offset": 0, + "slot": "0" + }, + { + "label": "_initializing", + "type": "t_bool", + "offset": 8, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(RoleData)24_storage": { + "label": "struct AccessControlUpgradeable.RoleData", + "members": [ + { + "label": "hasRole", + "type": "t_mapping(t_address,t_bool)", + "offset": 0, + "slot": "0" + }, + { + "label": "adminRole", + "type": "t_bytes32", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_uint64": { + "label": "uint64", + "numberOfBytes": "8" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_contract(IWormhole)5912": { + "label": "contract IWormhole", + "numberOfBytes": "20" + }, + "t_mapping(t_address,t_address)": { + "label": "mapping(address => address)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_string_storage)": { + "label": "mapping(address => string)", + "numberOfBytes": "32" + }, + "t_mapping(t_string_memory_ptr,t_address)": { + "label": "mapping(string => address)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint64,t_bool)": { + "label": "mapping(uint64 => bool)", + "numberOfBytes": "32" + }, + "t_string_memory_ptr": { + "label": "string", + "numberOfBytes": "32" + }, + "t_string_storage": { + "label": "string", + "numberOfBytes": "32" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint32": { + "label": "uint32", + "numberOfBytes": "4" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + }, + "namespaces": { + "erc7201:openzeppelin.storage.AccessControl": [ + { + "contract": "AccessControlUpgradeable", + "label": "_roles", + "type": "t_mapping(t_bytes32,t_struct(RoleData)24_storage)", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:61", + "offset": 0, + "slot": "0" + } + ], + "erc7201:openzeppelin.storage.Initializable": [ + { + "contract": "Initializable", + "label": "_initialized", + "type": "t_uint64", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:69", + "offset": 0, + "slot": "0" + }, + { + "contract": "Initializable", + "label": "_initializing", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:73", + "offset": 8, + "slot": "0" + } + ] + } + } + }, + "dceb9abdd23926ddaaafb079c9784a3a659e0f99f18efcd0a5b078f4305302ce": { + "address": "0xB9dE9F72e81d1609E940Fb2217f7286602064881", + "txHash": "0xb65ef7240a84e4d653f0eae261ab35503c8f0f0b618000150c9b7656657b7a2d", + "layout": { + "solcVersion": "0.8.24", + "storage": [ + { + "label": "ethToNearToken", + "offset": 0, + "slot": "0", + "type": "t_mapping(t_address,t_string_storage)", + "contract": "OmniBridge", + "src": "src/omni-bridge/contracts/OmniBridge.sol:24" + }, + { + "label": "nearToEthToken", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_string_memory_ptr,t_address)", + "contract": "OmniBridge", + "src": "src/omni-bridge/contracts/OmniBridge.sol:25" + }, + { + "label": "isBridgeToken", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_address,t_bool)", + "contract": "OmniBridge", + "src": "src/omni-bridge/contracts/OmniBridge.sol:26" + }, + { + "label": "tokenImplementationAddress", + "offset": 0, + "slot": "3", + "type": "t_address", + "contract": "OmniBridge", + "src": "src/omni-bridge/contracts/OmniBridge.sol:28" + }, + { + "label": "nearBridgeDerivedAddress", + "offset": 0, + "slot": "4", + "type": "t_address", + "contract": "OmniBridge", + "src": "src/omni-bridge/contracts/OmniBridge.sol:29" + }, + { + "label": "omniBridgeChainId", + "offset": 20, + "slot": "4", + "type": "t_uint8", + "contract": "OmniBridge", + "src": "src/omni-bridge/contracts/OmniBridge.sol:30" + }, + { + "label": "completedTransfers", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_uint64,t_bool)", + "contract": "OmniBridge", + "src": "src/omni-bridge/contracts/OmniBridge.sol:32" + }, + { + "label": "currentOriginNonce", + "offset": 0, + "slot": "6", + "type": "t_uint64", + "contract": "OmniBridge", + "src": "src/omni-bridge/contracts/OmniBridge.sol:33" + }, + { + "label": "customMinters", + "offset": 0, + "slot": "7", + "type": "t_mapping(t_address,t_address)", + "contract": "OmniBridge", + "src": "src/omni-bridge/contracts/OmniBridge.sol:35" + }, + { + "label": "__gap", + "offset": 0, + "slot": "8", + "type": "t_array(t_uint256)50_storage", + "contract": "OmniBridge", + "src": "src/omni-bridge/contracts/OmniBridge.sol:332" + }, + { + "label": "_wormhole", + "offset": 0, + "slot": "58", + "type": "t_contract(IWormhole)5925", + "contract": "OmniBridgeWormhole", + "src": "src/omni-bridge/contracts/OmniBridgeWormhole.sol:26" + }, + { + "label": "_consistencyLevel", + "offset": 20, + "slot": "58", + "type": "t_uint8", + "contract": "OmniBridgeWormhole", + "src": "src/omni-bridge/contracts/OmniBridgeWormhole.sol:28" + }, + { + "label": "wormholeNonce", + "offset": 21, + "slot": "58", + "type": "t_uint32", + "contract": "OmniBridgeWormhole", + "src": "src/omni-bridge/contracts/OmniBridgeWormhole.sol:29" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_bool)": { + "label": "mapping(address => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_struct(RoleData)24_storage)": { + "label": "mapping(bytes32 => struct AccessControlUpgradeable.RoleData)", + "numberOfBytes": "32" + }, + "t_struct(AccessControlStorage)34_storage": { + "label": "struct AccessControlUpgradeable.AccessControlStorage", + "members": [ + { + "label": "_roles", + "type": "t_mapping(t_bytes32,t_struct(RoleData)24_storage)", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(InitializableStorage)266_storage": { + "label": "struct Initializable.InitializableStorage", + "members": [ + { + "label": "_initialized", + "type": "t_uint64", + "offset": 0, + "slot": "0" + }, + { + "label": "_initializing", + "type": "t_bool", + "offset": 8, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(RoleData)24_storage": { + "label": "struct AccessControlUpgradeable.RoleData", + "members": [ + { + "label": "hasRole", + "type": "t_mapping(t_address,t_bool)", + "offset": 0, + "slot": "0" + }, + { + "label": "adminRole", + "type": "t_bytes32", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_uint64": { + "label": "uint64", + "numberOfBytes": "8" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_contract(IWormhole)5925": { + "label": "contract IWormhole", + "numberOfBytes": "20" + }, + "t_mapping(t_address,t_address)": { + "label": "mapping(address => address)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_string_storage)": { + "label": "mapping(address => string)", + "numberOfBytes": "32" + }, + "t_mapping(t_string_memory_ptr,t_address)": { + "label": "mapping(string => address)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint64,t_bool)": { + "label": "mapping(uint64 => bool)", + "numberOfBytes": "32" + }, + "t_string_memory_ptr": { + "label": "string", + "numberOfBytes": "32" + }, + "t_string_storage": { + "label": "string", + "numberOfBytes": "32" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint32": { + "label": "uint32", + "numberOfBytes": "4" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + }, + "namespaces": { + "erc7201:openzeppelin.storage.AccessControl": [ + { + "contract": "AccessControlUpgradeable", + "label": "_roles", + "type": "t_mapping(t_bytes32,t_struct(RoleData)24_storage)", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:61", + "offset": 0, + "slot": "0" + } + ], + "erc7201:openzeppelin.storage.Initializable": [ + { + "contract": "Initializable", + "label": "_initialized", + "type": "t_uint64", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:69", + "offset": 0, + "slot": "0" + }, + { + "contract": "Initializable", + "label": "_initializing", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:73", + "offset": 8, + "slot": "0" + } + ] + } + } + } + } +} diff --git a/evm/.openzeppelin/base.json b/evm/.openzeppelin/base.json new file mode 100644 index 00000000..b410ab45 --- /dev/null +++ b/evm/.openzeppelin/base.json @@ -0,0 +1,534 @@ +{ + "manifestVersion": "3.2", + "proxies": [ + { + "address": "0xd025b38762B4A4E36F0Cde483b86CB13ea00D989", + "txHash": "0x051dc38fd5fc186f76b9cc7021746c915cca0cb32f74e56ec4df624cf0d06259", + "kind": "uups" + } + ], + "impls": { + "298b9f36a9e024def1c6e6baa12524fe201ac1dd8b39bb4d529d2eb956d896e7": { + "address": "0xf353b40fC144d1c6c5BCdda712fa6De833016aF9", + "txHash": "0x8bed031882b22ee09d15dd8aaf257eefbb9b4000a8e603b1acc84063c7fe00af", + "layout": { + "solcVersion": "0.8.24", + "storage": [ + { + "label": "ethToNearToken", + "offset": 0, + "slot": "0", + "type": "t_mapping(t_address,t_string_storage)", + "contract": "OmniBridge", + "src": "src/omni-bridge/contracts/OmniBridge.sol:24" + }, + { + "label": "nearToEthToken", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_string_memory_ptr,t_address)", + "contract": "OmniBridge", + "src": "src/omni-bridge/contracts/OmniBridge.sol:25" + }, + { + "label": "isBridgeToken", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_address,t_bool)", + "contract": "OmniBridge", + "src": "src/omni-bridge/contracts/OmniBridge.sol:26" + }, + { + "label": "tokenImplementationAddress", + "offset": 0, + "slot": "3", + "type": "t_address", + "contract": "OmniBridge", + "src": "src/omni-bridge/contracts/OmniBridge.sol:28" + }, + { + "label": "nearBridgeDerivedAddress", + "offset": 0, + "slot": "4", + "type": "t_address", + "contract": "OmniBridge", + "src": "src/omni-bridge/contracts/OmniBridge.sol:29" + }, + { + "label": "omniBridgeChainId", + "offset": 20, + "slot": "4", + "type": "t_uint8", + "contract": "OmniBridge", + "src": "src/omni-bridge/contracts/OmniBridge.sol:30" + }, + { + "label": "completedTransfers", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_uint64,t_bool)", + "contract": "OmniBridge", + "src": "src/omni-bridge/contracts/OmniBridge.sol:32" + }, + { + "label": "currentOriginNonce", + "offset": 0, + "slot": "6", + "type": "t_uint64", + "contract": "OmniBridge", + "src": "src/omni-bridge/contracts/OmniBridge.sol:33" + }, + { + "label": "customMinters", + "offset": 0, + "slot": "7", + "type": "t_mapping(t_address,t_address)", + "contract": "OmniBridge", + "src": "src/omni-bridge/contracts/OmniBridge.sol:35" + }, + { + "label": "__gap", + "offset": 0, + "slot": "8", + "type": "t_array(t_uint256)50_storage", + "contract": "OmniBridge", + "src": "src/omni-bridge/contracts/OmniBridge.sol:326" + }, + { + "label": "_wormhole", + "offset": 0, + "slot": "58", + "type": "t_contract(IWormhole)5912", + "contract": "OmniBridgeWormhole", + "src": "src/omni-bridge/contracts/OmniBridgeWormhole.sol:26" + }, + { + "label": "_consistencyLevel", + "offset": 20, + "slot": "58", + "type": "t_uint8", + "contract": "OmniBridgeWormhole", + "src": "src/omni-bridge/contracts/OmniBridgeWormhole.sol:28" + }, + { + "label": "wormholeNonce", + "offset": 21, + "slot": "58", + "type": "t_uint32", + "contract": "OmniBridgeWormhole", + "src": "src/omni-bridge/contracts/OmniBridgeWormhole.sol:29" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_bool)": { + "label": "mapping(address => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_struct(RoleData)24_storage)": { + "label": "mapping(bytes32 => struct AccessControlUpgradeable.RoleData)", + "numberOfBytes": "32" + }, + "t_struct(AccessControlStorage)34_storage": { + "label": "struct AccessControlUpgradeable.AccessControlStorage", + "members": [ + { + "label": "_roles", + "type": "t_mapping(t_bytes32,t_struct(RoleData)24_storage)", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(InitializableStorage)266_storage": { + "label": "struct Initializable.InitializableStorage", + "members": [ + { + "label": "_initialized", + "type": "t_uint64", + "offset": 0, + "slot": "0" + }, + { + "label": "_initializing", + "type": "t_bool", + "offset": 8, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(RoleData)24_storage": { + "label": "struct AccessControlUpgradeable.RoleData", + "members": [ + { + "label": "hasRole", + "type": "t_mapping(t_address,t_bool)", + "offset": 0, + "slot": "0" + }, + { + "label": "adminRole", + "type": "t_bytes32", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_uint64": { + "label": "uint64", + "numberOfBytes": "8" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_contract(IWormhole)5912": { + "label": "contract IWormhole", + "numberOfBytes": "20" + }, + "t_mapping(t_address,t_address)": { + "label": "mapping(address => address)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_string_storage)": { + "label": "mapping(address => string)", + "numberOfBytes": "32" + }, + "t_mapping(t_string_memory_ptr,t_address)": { + "label": "mapping(string => address)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint64,t_bool)": { + "label": "mapping(uint64 => bool)", + "numberOfBytes": "32" + }, + "t_string_memory_ptr": { + "label": "string", + "numberOfBytes": "32" + }, + "t_string_storage": { + "label": "string", + "numberOfBytes": "32" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint32": { + "label": "uint32", + "numberOfBytes": "4" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + }, + "namespaces": { + "erc7201:openzeppelin.storage.AccessControl": [ + { + "contract": "AccessControlUpgradeable", + "label": "_roles", + "type": "t_mapping(t_bytes32,t_struct(RoleData)24_storage)", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:61", + "offset": 0, + "slot": "0" + } + ], + "erc7201:openzeppelin.storage.Initializable": [ + { + "contract": "Initializable", + "label": "_initialized", + "type": "t_uint64", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:69", + "offset": 0, + "slot": "0" + }, + { + "contract": "Initializable", + "label": "_initializing", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:73", + "offset": 8, + "slot": "0" + } + ] + } + } + }, + "dceb9abdd23926ddaaafb079c9784a3a659e0f99f18efcd0a5b078f4305302ce": { + "address": "0xEC81aFc3485a425347Ac03316675e58a680b283A", + "txHash": "0x86fdb8388cfb93962ef728558688e370ec90c529b42f831a1d31195883a88247", + "layout": { + "solcVersion": "0.8.24", + "storage": [ + { + "label": "ethToNearToken", + "offset": 0, + "slot": "0", + "type": "t_mapping(t_address,t_string_storage)", + "contract": "OmniBridge", + "src": "src/omni-bridge/contracts/OmniBridge.sol:24" + }, + { + "label": "nearToEthToken", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_string_memory_ptr,t_address)", + "contract": "OmniBridge", + "src": "src/omni-bridge/contracts/OmniBridge.sol:25" + }, + { + "label": "isBridgeToken", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_address,t_bool)", + "contract": "OmniBridge", + "src": "src/omni-bridge/contracts/OmniBridge.sol:26" + }, + { + "label": "tokenImplementationAddress", + "offset": 0, + "slot": "3", + "type": "t_address", + "contract": "OmniBridge", + "src": "src/omni-bridge/contracts/OmniBridge.sol:28" + }, + { + "label": "nearBridgeDerivedAddress", + "offset": 0, + "slot": "4", + "type": "t_address", + "contract": "OmniBridge", + "src": "src/omni-bridge/contracts/OmniBridge.sol:29" + }, + { + "label": "omniBridgeChainId", + "offset": 20, + "slot": "4", + "type": "t_uint8", + "contract": "OmniBridge", + "src": "src/omni-bridge/contracts/OmniBridge.sol:30" + }, + { + "label": "completedTransfers", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_uint64,t_bool)", + "contract": "OmniBridge", + "src": "src/omni-bridge/contracts/OmniBridge.sol:32" + }, + { + "label": "currentOriginNonce", + "offset": 0, + "slot": "6", + "type": "t_uint64", + "contract": "OmniBridge", + "src": "src/omni-bridge/contracts/OmniBridge.sol:33" + }, + { + "label": "customMinters", + "offset": 0, + "slot": "7", + "type": "t_mapping(t_address,t_address)", + "contract": "OmniBridge", + "src": "src/omni-bridge/contracts/OmniBridge.sol:35" + }, + { + "label": "__gap", + "offset": 0, + "slot": "8", + "type": "t_array(t_uint256)50_storage", + "contract": "OmniBridge", + "src": "src/omni-bridge/contracts/OmniBridge.sol:332" + }, + { + "label": "_wormhole", + "offset": 0, + "slot": "58", + "type": "t_contract(IWormhole)5925", + "contract": "OmniBridgeWormhole", + "src": "src/omni-bridge/contracts/OmniBridgeWormhole.sol:26" + }, + { + "label": "_consistencyLevel", + "offset": 20, + "slot": "58", + "type": "t_uint8", + "contract": "OmniBridgeWormhole", + "src": "src/omni-bridge/contracts/OmniBridgeWormhole.sol:28" + }, + { + "label": "wormholeNonce", + "offset": 21, + "slot": "58", + "type": "t_uint32", + "contract": "OmniBridgeWormhole", + "src": "src/omni-bridge/contracts/OmniBridgeWormhole.sol:29" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_bool)": { + "label": "mapping(address => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_struct(RoleData)24_storage)": { + "label": "mapping(bytes32 => struct AccessControlUpgradeable.RoleData)", + "numberOfBytes": "32" + }, + "t_struct(AccessControlStorage)34_storage": { + "label": "struct AccessControlUpgradeable.AccessControlStorage", + "members": [ + { + "label": "_roles", + "type": "t_mapping(t_bytes32,t_struct(RoleData)24_storage)", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(InitializableStorage)266_storage": { + "label": "struct Initializable.InitializableStorage", + "members": [ + { + "label": "_initialized", + "type": "t_uint64", + "offset": 0, + "slot": "0" + }, + { + "label": "_initializing", + "type": "t_bool", + "offset": 8, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(RoleData)24_storage": { + "label": "struct AccessControlUpgradeable.RoleData", + "members": [ + { + "label": "hasRole", + "type": "t_mapping(t_address,t_bool)", + "offset": 0, + "slot": "0" + }, + { + "label": "adminRole", + "type": "t_bytes32", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_uint64": { + "label": "uint64", + "numberOfBytes": "8" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_contract(IWormhole)5925": { + "label": "contract IWormhole", + "numberOfBytes": "20" + }, + "t_mapping(t_address,t_address)": { + "label": "mapping(address => address)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_string_storage)": { + "label": "mapping(address => string)", + "numberOfBytes": "32" + }, + "t_mapping(t_string_memory_ptr,t_address)": { + "label": "mapping(string => address)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint64,t_bool)": { + "label": "mapping(uint64 => bool)", + "numberOfBytes": "32" + }, + "t_string_memory_ptr": { + "label": "string", + "numberOfBytes": "32" + }, + "t_string_storage": { + "label": "string", + "numberOfBytes": "32" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint32": { + "label": "uint32", + "numberOfBytes": "4" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + }, + "namespaces": { + "erc7201:openzeppelin.storage.AccessControl": [ + { + "contract": "AccessControlUpgradeable", + "label": "_roles", + "type": "t_mapping(t_bytes32,t_struct(RoleData)24_storage)", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:61", + "offset": 0, + "slot": "0" + } + ], + "erc7201:openzeppelin.storage.Initializable": [ + { + "contract": "Initializable", + "label": "_initialized", + "type": "t_uint64", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:69", + "offset": 0, + "slot": "0" + }, + { + "contract": "Initializable", + "label": "_initializing", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:73", + "offset": 8, + "slot": "0" + } + ] + } + } + } + } +} diff --git a/evm/README.md b/evm/README.md new file mode 100644 index 00000000..c33c7629 --- /dev/null +++ b/evm/README.md @@ -0,0 +1,31 @@ + +**Run tests:** +```shell +$ yarn +$ yarn hardhat test +``` + +**Get storage layout** +```shell +yarn hardhat check +``` + +**Deploy eNearProxy** +```shell +yarn hardhat deploy-e-near-proxy --enear "" --network=sepolia +``` + +**Deploy ERC20 token implementation** +```shell +yarn hardhat deploy-token-impl --network sepolia +``` + +**Deploy OmniBridge contract** +```shell +yarn hardhat deploy-bridge-token-factory --bridge-token-impl
--near-bridge-account-id --network sepolia +``` + +**Verify deployed contract** +```shell +yarn hardhat verify
--network sepolia +``` \ No newline at end of file diff --git a/evm/biome.json b/evm/biome.json new file mode 100644 index 00000000..0464b8c9 --- /dev/null +++ b/evm/biome.json @@ -0,0 +1,33 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json", + "vcs": { + "enabled": false, + "clientKind": "git", + "useIgnoreFile": true + }, + "files": { + "ignoreUnknown": false, + "ignore": ["build", "dist", "cache", "typechain-types", "coverage"] + }, + "formatter": { + "enabled": true, + "indentStyle": "space", + "lineWidth": 100 + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true, + "correctness": { + "noUnusedImports": "error", + "noUnusedVariables": "error" + } + } + }, + "javascript": { + "formatter": { + "quoteStyle": "double", + "semicolons": "asNeeded" + } + } +} diff --git a/evm/bridge-token-factory/.env b/evm/bridge-token-factory/.env deleted file mode 100644 index 95023729..00000000 --- a/evm/bridge-token-factory/.env +++ /dev/null @@ -1,7 +0,0 @@ -NEAR_TOKEN_LOCKER=example.near -PROVER_ADDRESS= -MIN_BLOCK_ACCEPTANCE_HEIGHT=0 -BRIDGE_TOKEN_IMPL_ADDRESS= -PROOF_CONSUMER_ADDRESS= -ALCHEMY_API_KEY= -ETH_PRIVATE_KEY= \ No newline at end of file diff --git a/evm/bridge-token-factory/.eslintrc.json b/evm/bridge-token-factory/.eslintrc.json deleted file mode 100644 index af115ce3..00000000 --- a/evm/bridge-token-factory/.eslintrc.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "env": { - "node": true, - "commonjs": true, - "es6": true, - "mocha": true - }, - "ignorePatterns":["coverage/**"], - "extends": "eslint:recommended", - "globals": { - "Atomics": "readonly", - "SharedArrayBuffer": "readonly" - }, - "parserOptions": { - "ecmaVersion": 2018 - }, - "rules": { - } -} \ No newline at end of file diff --git a/evm/bridge-token-factory/.gitignore b/evm/bridge-token-factory/.gitignore deleted file mode 100644 index 2da2816a..00000000 --- a/evm/bridge-token-factory/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -build/ -cache/ -coverage/ -coverage.json -.openzeppelin/ -node_modules/ \ No newline at end of file diff --git a/evm/bridge-token-factory/.prettierrc.json b/evm/bridge-token-factory/.prettierrc.json deleted file mode 100644 index e69de29b..00000000 diff --git a/evm/bridge-token-factory/build.sh b/evm/bridge-token-factory/build.sh deleted file mode 100755 index 423f6a62..00000000 --- a/evm/bridge-token-factory/build.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env bash - -# Exit script as soon as a command fails. -set -e - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" - -docker run \ - --rm \ - --mount type=bind,source=$DIR/..,target=/host \ - --cap-add=SYS_PTRACE --security-opt seccomp=unconfined \ - -w /host/erc20-bridge-token \ - -e RUSTFLAGS='-C link-arg=-s' \ - node:18-buster \ - ./dist.sh diff --git a/evm/bridge-token-factory/contracts/BridgeTokenFactory.sol b/evm/bridge-token-factory/contracts/BridgeTokenFactory.sol deleted file mode 100644 index 999b4248..00000000 --- a/evm/bridge-token-factory/contracts/BridgeTokenFactory.sol +++ /dev/null @@ -1,412 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-or-later -pragma solidity ^0.8.24; - -import {AccessControlUpgradeable} from "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; -import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; -import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; -import {ECDSA} from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; - -import "./BridgeToken.sol"; -import "./SelectivePausableUpgradable.sol"; -import "./Borsh.sol"; - -contract BridgeTokenFactory is - UUPSUpgradeable, - AccessControlUpgradeable, - SelectivePausableUpgradable -{ - enum WhitelistMode { - NotInitialized, - Blocked, - CheckToken, - CheckAccountAndToken - } - - // We removed ProofConsumer from the list of parent contracts and added this gap - // to preserve storage layout when upgrading to the new contract version. - uint256[54] private __gap; - - mapping(address => string) private _ethToNearToken; - mapping(string => address) private _nearToEthToken; - mapping(address => bool) private _isBridgeToken; - - mapping(string => WhitelistMode) private _whitelistedTokens; - mapping(bytes => bool) private _whitelistedAccounts; - bool private _isWhitelistModeEnabled; - - address public tokenImplementationAddress; - address public nearBridgeDerivedAddress; - uint8 public omniBridgeChainId; - - mapping(uint128 => bool) public completedTransfers; - mapping(uint128 => bool) public claimedFee; - uint128 public initTransferNonce; - - bytes32 public constant PAUSABLE_ADMIN_ROLE = keccak256("PAUSABLE_ADMIN_ROLE"); - uint constant UNPAUSED_ALL = 0; - uint constant PAUSED_INIT_TRANSFER = 1 << 0; - uint constant PAUSED_FIN_TRANSFER = 1 << 1; - - struct FinTransferPayload { - uint128 nonce; - string token; - uint128 amount; - address recipient; - string feeRecipient; - } - - struct MetadataPayload { - string token; - string name; - string symbol; - uint8 decimals; - } - - struct ClaimFeePayload { - uint128[] nonces; - uint128 amount; - address recipient; - } - - event InitTransfer( - address indexed sender, - address indexed tokenAddress, - uint128 indexed nonce, - string token, - uint128 amount, - uint128 fee, - uint128 nativeFee, - string recipient - ); - - - event FinTransfer( - uint128 indexed nonce, - string token, - uint128 amount, - address recipient, - string feeRecipient - ); - - event DeployToken( - address indexed tokenAddress, - string token, - string name, - string symbol, - uint8 decimals - ); - - event SetMetadata( - address indexed tokenAddress, - string token, - string name, - string symbol, - uint8 decimals - ); - - error InvalidSignature(); - error NonceAlreadyUsed(uint256 nonce); - error InvalidFee(); - - function initialize( - address tokenImplementationAddress_, - address nearBridgeDerivedAddress_, - uint8 omniBridgeChainId_ - ) public initializer { - tokenImplementationAddress = tokenImplementationAddress_; - nearBridgeDerivedAddress = nearBridgeDerivedAddress_; - omniBridgeChainId = omniBridgeChainId_; - - __UUPSUpgradeable_init(); - __AccessControl_init(); - __Pausable_init_unchained(); - _grantRole(DEFAULT_ADMIN_ROLE, _msgSender()); - _grantRole(PAUSABLE_ADMIN_ROLE, _msgSender()); - } - - function isBridgeToken(address token) external view returns (bool) { - return _isBridgeToken[token]; - } - - function ethToNearToken(address token) external view returns (string memory) { - require(_isBridgeToken[token], "ERR_NOT_BRIDGE_TOKEN"); - return _ethToNearToken[token]; - } - - function nearToEthToken(string calldata nearTokenId) external view returns (address) { - require(_isBridgeToken[_nearToEthToken[nearTokenId]], "ERR_NOT_BRIDGE_TOKEN"); - return _nearToEthToken[nearTokenId]; - } - - function deployToken(bytes calldata signatureData, MetadataPayload calldata metadata) payable external returns (address) { - bytes memory borshEncoded = bytes.concat( - Borsh.encodeString(metadata.token), - Borsh.encodeString(metadata.name), - Borsh.encodeString(metadata.symbol), - bytes1(metadata.decimals) - ); - bytes32 hashed = keccak256(borshEncoded); - - if (ECDSA.recover(hashed, signatureData) != nearBridgeDerivedAddress) { - revert InvalidSignature(); - } - - require(!_isBridgeToken[_nearToEthToken[metadata.token]], "ERR_TOKEN_EXIST"); - - address bridgeTokenProxy = address( - new ERC1967Proxy( - tokenImplementationAddress, - abi.encodeWithSelector( - BridgeToken.initialize.selector, - metadata.name, - metadata.symbol, - metadata.decimals - ) - ) - ); - - deployTokenExtension(metadata.token, bridgeTokenProxy); - - emit DeployToken( - bridgeTokenProxy, - metadata.token, - metadata.name, - metadata.symbol, - metadata.decimals - ); - - _isBridgeToken[address(bridgeTokenProxy)] = true; - _ethToNearToken[address(bridgeTokenProxy)] = metadata.token; - _nearToEthToken[metadata.token] = address(bridgeTokenProxy); - - return bridgeTokenProxy; - } - - function deployTokenExtension(string memory token, address tokenAddress) internal virtual {} - - function setMetadata( - string calldata token, - string calldata name, - string calldata symbol - ) external onlyRole(DEFAULT_ADMIN_ROLE) { - require(_isBridgeToken[_nearToEthToken[token]], "ERR_NOT_BRIDGE_TOKEN"); - - BridgeToken bridgeToken = BridgeToken(_nearToEthToken[token]); - - bridgeToken.setMetadata(name, symbol, bridgeToken.decimals()); - - emit SetMetadata( - address(bridgeToken), - token, - name, - symbol, - bridgeToken.decimals() - ); - } - - function finTransfer(bytes calldata signatureData, FinTransferPayload calldata payload) payable external whenNotPaused(PAUSED_FIN_TRANSFER) { - if (completedTransfers[payload.nonce]) { - revert NonceAlreadyUsed(payload.nonce); - } - - bytes memory borshEncoded = bytes.concat( - Borsh.encodeUint128(payload.nonce), - Borsh.encodeString(payload.token), - Borsh.encodeUint128(payload.amount), - bytes1(omniBridgeChainId), - Borsh.encodeAddress(payload.recipient), - bytes(payload.feeRecipient).length == 0 // None or Some(String) in rust - ? bytes("\x00") - : bytes.concat(bytes("\x01"), Borsh.encodeString(payload.feeRecipient)) - ); - bytes32 hashed = keccak256(borshEncoded); - - if (ECDSA.recover(hashed, signatureData) != nearBridgeDerivedAddress) { - revert InvalidSignature(); - } - - require(_isBridgeToken[_nearToEthToken[payload.token]], "ERR_NOT_BRIDGE_TOKEN"); - BridgeToken(_nearToEthToken[payload.token]).mint(payload.recipient, payload.amount); - - completedTransfers[payload.nonce] = true; - - finTransferExtension(payload); - - emit FinTransfer( - payload.nonce, - payload.token, - payload.amount, - payload.recipient, - payload.feeRecipient - ); - } - - function finTransferExtension(FinTransferPayload memory payload) internal virtual {} - - function initTransfer( - string calldata token, - uint128 amount, - uint128 fee, - uint128 nativeFee, - string calldata recipient - ) payable external whenNotPaused(PAUSED_INIT_TRANSFER) { - initTransferNonce += 1; - _checkWhitelistedToken(token, msg.sender); - require(_isBridgeToken[_nearToEthToken[token]], "ERR_NOT_BRIDGE_TOKEN"); - if (fee >= amount) { - revert InvalidFee(); - } - - address tokenAddress = _nearToEthToken[token]; - - BridgeToken(tokenAddress).burn(msg.sender, amount); - - uint256 extensionValue = msg.value - nativeFee; - initTransferExtension(initTransferNonce, token, amount, fee, nativeFee, recipient, msg.sender, extensionValue); - - emit InitTransfer(msg.sender, tokenAddress, initTransferNonce, token , amount, fee, nativeFee, recipient); - } - - function claimNativeFee(bytes calldata signatureData, ClaimFeePayload memory payload) external { - bytes memory borshEncodedNonces = Borsh.encodeUint32(uint32(payload.nonces.length)); - - for (uint i = 0; i < payload.nonces.length; ++i) { - uint128 nonce = payload.nonces[i]; - if (claimedFee[nonce]) { - revert NonceAlreadyUsed(nonce); - } - - claimedFee[nonce] = true; - borshEncodedNonces = bytes.concat( - borshEncodedNonces, - Borsh.encodeUint128(nonce) - ); - } - - bytes memory borshEncoded = bytes.concat( - borshEncodedNonces, - Borsh.encodeUint128(payload.amount), - bytes1(omniBridgeChainId), - Borsh.encodeAddress(payload.recipient) - ); - bytes32 hashed = keccak256(borshEncoded); - - if (ECDSA.recover(hashed, signatureData) != nearBridgeDerivedAddress) { - revert InvalidSignature(); - } - - (bool success,) = payload.recipient.call{value: payload.amount}(""); - require(success, "Failed to send Ether."); - } - - function initTransferExtension( - uint128 nonce, - string calldata token, - uint128 amount, - uint128 fee, - uint128 nativeFee, - string calldata recipient, - address sender, - uint256 value - ) internal virtual {} - - function pause(uint flags) external onlyRole(DEFAULT_ADMIN_ROLE) { - _pause(flags); - } - - function pauseFinTransfer() external onlyRole(PAUSABLE_ADMIN_ROLE) { - _pause(pausedFlags() | PAUSED_FIN_TRANSFER); - } - - function pauseInitTransfer() external onlyRole(PAUSABLE_ADMIN_ROLE) { - _pause(pausedFlags() | PAUSED_INIT_TRANSFER); - } - - function pauseAll() external onlyRole(PAUSABLE_ADMIN_ROLE) { - uint flags = PAUSED_FIN_TRANSFER | PAUSED_INIT_TRANSFER; - _pause(flags); - } - - function isWhitelistModeEnabled() external view returns (bool) { - return _isWhitelistModeEnabled; - } - - function getTokenWhitelistMode( - string calldata token - ) external view returns (WhitelistMode) { - return _whitelistedTokens[token]; - } - - function isAccountWhitelistedForToken( - string calldata token, - address account - ) external view returns (bool) { - return _whitelistedAccounts[abi.encodePacked(token, account)]; - } - - function upgradeToken( - string calldata nearTokenId, - address implementation - ) external onlyRole(DEFAULT_ADMIN_ROLE) { - require(_isBridgeToken[_nearToEthToken[nearTokenId]], "ERR_NOT_BRIDGE_TOKEN"); - BridgeToken proxy = BridgeToken(payable(_nearToEthToken[nearTokenId])); - proxy.upgradeToAndCall(implementation, bytes("")); - } - - function enableWhitelistMode() external onlyRole(DEFAULT_ADMIN_ROLE) { - _isWhitelistModeEnabled = true; - } - - function disableWhitelistMode() external onlyRole(DEFAULT_ADMIN_ROLE) { - _isWhitelistModeEnabled = false; - } - - function setTokenWhitelistMode( - string calldata token, - WhitelistMode mode - ) external onlyRole(DEFAULT_ADMIN_ROLE) { - _whitelistedTokens[token] = mode; - } - - function addAccountToWhitelist( - string calldata token, - address account - ) external onlyRole(DEFAULT_ADMIN_ROLE) { - require( - _whitelistedTokens[token] != WhitelistMode.NotInitialized, - "ERR_NOT_INITIALIZED_WHITELIST_TOKEN" - ); - _whitelistedAccounts[abi.encodePacked(token, account)] = true; - } - - function removeAccountFromWhitelist( - string calldata token, - address account - ) external onlyRole(DEFAULT_ADMIN_ROLE) { - delete _whitelistedAccounts[abi.encodePacked(token, account)]; - } - - function _checkWhitelistedToken(string memory token, address account) internal view { - if (!_isWhitelistModeEnabled) { - return; - } - - WhitelistMode tokenMode = _whitelistedTokens[token]; - require( - tokenMode != WhitelistMode.NotInitialized, - "ERR_NOT_INITIALIZED_WHITELIST_TOKEN" - ); - require(tokenMode != WhitelistMode.Blocked, "ERR_WHITELIST_TOKEN_BLOCKED"); - - if (tokenMode == WhitelistMode.CheckAccountAndToken) { - require( - _whitelistedAccounts[abi.encodePacked(token, account)], - "ERR_ACCOUNT_NOT_IN_WHITELIST" - ); - } - } - - function _authorizeUpgrade( - address newImplementation - ) internal override onlyRole(DEFAULT_ADMIN_ROLE) {} -} diff --git a/evm/bridge-token-factory/contracts/BridgeTokenFactoryWormhole.sol b/evm/bridge-token-factory/contracts/BridgeTokenFactoryWormhole.sol deleted file mode 100644 index ab7fa502..00000000 --- a/evm/bridge-token-factory/contracts/BridgeTokenFactoryWormhole.sol +++ /dev/null @@ -1,87 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-or-later -pragma solidity ^0.8.24; - -import {BridgeTokenFactory} from "./BridgeTokenFactory.sol"; -import "./Borsh.sol"; - -interface IWormhole { - function publishMessage( - uint32 nonce, - bytes memory payload, - uint8 consistencyLevel - ) external payable returns (uint64 sequence); -} - -enum MessageType { - InitTransfer, - FinTransfer, - DeployToken -} - -contract BridgeTokenFactoryWormhole is BridgeTokenFactory { - IWormhole private _wormhole; - // https://wormhole.com/docs/build/reference/consistency-levels - uint8 private _consistencyLevel; - uint32 public wormholeNonce; - - function initializeWormhole( - address tokenImplementationAddress, - address nearBridgeDerivedAddress, - uint8 omniBridgeChainId, - address wormholeAddress, - uint8 consistencyLevel - ) external initializer { - initialize(tokenImplementationAddress, nearBridgeDerivedAddress, omniBridgeChainId); - _wormhole = IWormhole(wormholeAddress); - _consistencyLevel = consistencyLevel; - } - - function deployTokenExtension(string memory token, address tokenAddress) internal override { - _wormhole.publishMessage{value: msg.value}( - wormholeNonce, - abi.encode(MessageType.DeployToken, token, tokenAddress), - _consistencyLevel - ); - - wormholeNonce++; - } - - function finTransferExtension(FinTransferPayload memory payload) internal override { - _wormhole.publishMessage{value: msg.value}( - wormholeNonce, - abi.encode(MessageType.FinTransfer, payload.token, payload.amount, payload.feeRecipient, payload.nonce), - _consistencyLevel - ); - - wormholeNonce++; - - } - - function initTransferExtension( - uint128 nonce, - string calldata token, - uint128 amount, - uint128 fee, - uint128 nativeFee, - string calldata recipient, - address sender, - uint256 value - ) internal override { - _wormhole.publishMessage{value: value}( - wormholeNonce, - abi.encode( - MessageType.InitTransfer, - nonce, - token, - amount, - fee, - nativeFee, - recipient, - sender - ), - _consistencyLevel - ); - - wormholeNonce++; - } -} \ No newline at end of file diff --git a/evm/bridge-token-factory/hardhat.config.js b/evm/bridge-token-factory/hardhat.config.js deleted file mode 100644 index 24156662..00000000 --- a/evm/bridge-token-factory/hardhat.config.js +++ /dev/null @@ -1,180 +0,0 @@ -require("dotenv").config(); -require("@openzeppelin/hardhat-upgrades"); -require("@nomicfoundation/hardhat-verify"); -require("@nomicfoundation/hardhat-chai-matchers"); - -const ALCHEMY_API_KEY = process.env.ALCHEMY_API_KEY; -const INFURA_API_KEY = process.env.INFURA_API_KEY; -const ETH_PRIVATE_KEY = process.env.ETH_PRIVATE_KEY || '11'.repeat(32); -const ETHERSCAN_API_KEY = process.env.ETHERSCAN_API_KEY; - -task('set-metadata-ft', 'Set metadata for NEP-141 tokens on the Ethereum side') - .addParam('nearTokenAccount', 'Near account id of the token') - .addParam('name', 'The new name of the token') - .addParam('symbol', 'The new symbol of the token') - .addParam('factory', 'The address of the factory contract on Ethereum') - .setAction(async (taskArgs) => { - const BridgeTokenFactoryContract = await ethers.getContractFactory("BridgeTokenFactory"); - const BridgeTokenFactory = BridgeTokenFactoryContract.attach(taskArgs.factory); - await BridgeTokenFactory.setMetadata(taskArgs.nearTokenAccount, taskArgs.name, taskArgs.symbol); - }); - -task('add-token-to-whitelist-eth', 'Add a token to whitelist') - .addParam('nearTokenAccount', 'Near account id of the token') - .addParam('factory', 'The address of the eth factory contract') - .addParam('mode', 'Whitelist mode: [ NotInitialized, Blocked, CheckToken, CheckAccountAndToken ]') - .setAction(async (taskArgs) => { - const WhitelistMode = { - NotInitialized: 0, - Blocked: 1, - CheckToken: 2, - CheckAccountAndToken: 3 - } - const BridgeTokenFactoryContract = await ethers.getContractFactory("BridgeTokenFactory"); - const BridgeTokenFactory = BridgeTokenFactoryContract.attach(taskArgs.factory); - const tx = await BridgeTokenFactory.setTokenWhitelistMode(taskArgs.nearTokenAccount, WhitelistMode[taskArgs.mode]); - const receipt = await tx.wait(); - console.log("Tx hash", receipt.transactionHash); - }); - -task('add-account-to-whitelist-eth', 'Add an account to whitelist') - .addParam('nearTokenAccount', 'Near account id of the token') - .addParam('ethAccount', 'Ethereum account address to add to whitelist') - .addParam('factory', 'The address of the factory contract on Ethereum') - .setAction(async (taskArgs) => { - const BridgeTokenFactoryContract = await ethers.getContractFactory("BridgeTokenFactory"); - const BridgeTokenFactory = BridgeTokenFactoryContract.attach(taskArgs.factory); - const tx = await BridgeTokenFactory.addAccountToWhitelist(taskArgs.nearTokenAccount, taskArgs.ethAccount); - const receipt = await tx.wait(); - console.log("Tx hash", receipt.transactionHash); - }); - -task("deploy-bridge-token-factory", "Deploys the BridgeTokenFactory contract") - .addParam("bridgeTokenImpl", "The address of the bridge token implementation") - .addParam("nearBridgeDerivedAddress", "The derived EVM address of the Near's OmniBridge") - .addParam("omniBridgeChainId", "Chain Id of the network in the OmniBridge") - .setAction(async (taskArgs, hre) => { - const { ethers, upgrades } = hre; - - const BridgeTokenFactoryContract = - await ethers.getContractFactory("BridgeTokenFactory"); - const BridgeTokenFactory = await upgrades.deployProxy( - BridgeTokenFactoryContract, - [ - taskArgs.bridgeTokenImpl, - taskArgs.nearBridgeDerivedAddress, - taskArgs.omniBridgeChainId - ], - { - initializer: "initialize", - timeout: 0, - }, - ); - - await BridgeTokenFactory.waitForDeployment(); - console.log(`BridgeTokenFactory deployed at ${await BridgeTokenFactory.getAddress()}`); - console.log( - "Implementation address:", - await upgrades.erc1967.getImplementationAddress( - await BridgeTokenFactory.getAddress(), - ), - ); - }); - -task("deploy-token-impl", "Deploys the BridgeToken implementation") - .setAction(async () => { - const { ethers } = hre; - - const BridgeTokenContractFactory = await ethers.getContractFactory("BridgeToken"); - const BridgeTokenContract = await BridgeTokenContractFactory.deploy(); - await BridgeTokenContract.waitForDeployment(); - console.log(`BridgeTokenContract deployed at ${await BridgeTokenContract.getAddress()}`); - }); - -task("upgrade-bridge-token", "Upgrades a BridgeToken to a new implementation") - .addParam("factory", "The address of the BridgeTokenFactory contract") - .addParam("nearTokenAccount", "The NEAR token ID") - .setAction(async (taskArgs, hre) => { - const { ethers } = hre; - - const BridgeTokenFactoryContract = await ethers.getContractFactory("BridgeTokenFactory"); - const BridgeTokenFactory = BridgeTokenFactoryContract.attach(taskArgs.factory); - - console.log(`Upgrading token ${taskArgs.nearTokenAccount}`); - console.log(`Token proxy address:`, await BridgeTokenFactory.nearToEthToken(taskArgs.nearTokenAccount)); - - const BridgeTokenV2Instance = await ethers.getContractFactory("BridgeTokenV2"); - const BridgeTokenV2 = await BridgeTokenV2Instance.deploy(); - await BridgeTokenV2.waitForDeployment(); - - console.log(`BridgeTokenV2 deployed at ${await BridgeTokenV2.getAddress()}`); - - const tx = await BridgeTokenFactory.upgradeToken(taskArgs.nearTokenAccount, await BridgeTokenV2.getAddress()); - const receipt = await tx.wait(); - - console.log("Token upgraded at tx hash:", receipt.transactionHash); - }); - -task("upgrade-factory", "Upgrades the BridgeTokenFactory contract") - .addParam("factory", "The address of the BridgeTokenFactory contract") - .setAction(async (taskArgs, hre) => { - const { ethers, upgrades } = hre; - - const BridgeTokenFactoryContract = await ethers.getContractFactory("BridgeTokenFactory"); - console.log("Current implementation address:", await upgrades.erc1967.getImplementationAddress(taskArgs.factory)); - console.log("Upgrade factory, proxy address", taskArgs.factory); - await upgrades.upgradeProxy(taskArgs.factory, BridgeTokenFactoryContract); - }); - -task('etherscan-verify', 'Verify contract on etherscan') - .addParam('address', 'Contract address') - .addParam('args', 'Constructor arguments in JSON array') - .setAction(async (taskArgs, hre) => { - await hre.run("verify:verify", { - address: taskArgs.address, - constructorArguments: JSON.parse(taskArgs.args), - }); - }); - -module.exports = { - paths: { - sources: './contracts', - artifacts: './build' - }, - solidity: { - compilers: [ - { - version: '0.8.24', - settings: { - optimizer: { - enabled: true, - runs: 200 - }, - metadata: { - // do not include the metadata hash, since this is machine dependent - // and we want all generated code to be deterministic - // https://docs.soliditylang.org/en/v0.8.24/metadata.html - bytecodeHash: "none" - } - } - } - ] - }, - networks: { - sepolia: { - url: INFURA_API_KEY - ? `https://sepolia.infura.io/v3/${INFURA_API_KEY}` - : `https://eth-sepolia.g.alchemy.com/v2/${ALCHEMY_API_KEY}`, - accounts: [`${ETH_PRIVATE_KEY}`] - }, - mainnet: { - url: INFURA_API_KEY - ? `https://mainnet.infura.io/v3/${INFURA_API_KEY}` - : `https://eth-mainnet.alchemyapi.io/v2/${ALCHEMY_API_KEY}`, - accounts: [`${ETH_PRIVATE_KEY}`] - }, - }, - etherscan: { - apiKey: ETHERSCAN_API_KEY - }, -} diff --git a/evm/bridge-token-factory/package.json b/evm/bridge-token-factory/package.json deleted file mode 100644 index f24b4394..00000000 --- a/evm/bridge-token-factory/package.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "name": "bridge-token-factory", - "version": "0.1.0", - "description": "ERC20 bridge token factory for the OmniBridge", - "license": "MIT", - "dependencies": { - "@openzeppelin/cli": "^2.8.1", - "@openzeppelin/contracts": "^5.0.2", - "@openzeppelin/contracts-upgradeable": "^5.0.2", - "bs58check": "^4.0.0", - "dotenv": "^16.0.1", - "near-api-js": "^5.0.0", - "rainbow-bridge-eth2near-block-relay": "https://gitpkg.now.sh/aurora-is-near/rainbow-bridge/eth2near/eth2near-block-relay?327ff937bda3e3a99386fe488994f3c8e35f8aa0", - "rainbow-bridge-lib": "https://gitpkg.now.sh/aurora-is-near/rainbow-bridge/utils?327ff937bda3e3a99386fe488994f3c8e35f8aa0", - "rainbow-bridge-sol": "https://gitpkg.now.sh/aurora-is-near/rainbow-bridge/contracts/eth?327ff937bda3e3a99386fe488994f3c8e35f8aa0", - "rainbow-bridge-utils": "https://gitpkg.now.sh/aurora-is-near/rainbow-bridge/utils?327ff937bda3e3a99386fe488994f3c8e35f8aa0" - }, - "devDependencies": { - "@nomicfoundation/hardhat-chai-matchers": "^2.0.6", - "@nomicfoundation/hardhat-ethers": "^3.0.6", - "@nomicfoundation/hardhat-verify": "^2.0.7", - "@nomiclabs/hardhat-etherscan": "^3.1.0", - "@openzeppelin/hardhat-upgrades": "^3.1.0", - "@openzeppelin/test-helpers": "^0.5.5", - "chai": "^4.3.6", - "coveralls": "^3.1.0", - "eslint": "^6.8.0", - "eslint-config-standard": "^14.1.1", - "eslint-plugin-import": "^2.20.2", - "eslint-plugin-node": "^11.1.0", - "eslint-plugin-promise": "^4.0.1", - "eslint-plugin-standard": "^4.0.0", - "eth-gas-reporter": "^0.2.17", - "ethereum-waffle": "^3.4.4", - "ethers": "^6.12.1", - "hardhat": "^2.22.10", - "prettier": "^3.2.5", - "prettier-plugin-solidity": "^1.3.1", - "solc": "^0.6", - "solidity-coverage": "^0.8.12", - "solium": "^1.2.5" - }, - "scripts": { - "build": "yarn hardhat compile", - "testrpc": "", - "test": "yarn hardhat test", - "coverage": "yarn hardhat coverage", - "lint:js": "eslint .", - "lint:js:fix": "eslint . --fix", - "lint": "prettier --list-different --plugin=prettier-plugin-solidity 'contracts/**/*.sol'", - "lint:fix": "prettier --write --plugin=prettier-plugin-solidity 'contracts/**/*.sol'" - } -} diff --git a/evm/bridge-token-factory/test/BridgeToken.js b/evm/bridge-token-factory/test/BridgeToken.js deleted file mode 100644 index 0214f06a..00000000 --- a/evm/bridge-token-factory/test/BridgeToken.js +++ /dev/null @@ -1,832 +0,0 @@ -const { expect } = require('chai') -const { ethers, upgrades } = require('hardhat') -const { metadataSignature, depositSignature } = require('./helpers/signatures') -const { deriveEthereumAddress } = require('./helpers/kdf') - -const WhitelistMode = { - NotInitialized: 0, - Blocked: 1, - CheckToken: 2, - CheckAccountAndToken: 3 -} - -const PauseMode = { - UnpausedAll: 0, - PausedInitTransfer: 1, - PausedFinTransfer: 2, -} - -describe('BridgeToken', () => { - const wrappedNearId = 'wrap.testnet' - - let BridgeTokenInstance - let BridgeTokenFactory - let adminAccount - let user1 - let user2 - - beforeEach(async function () { - [adminAccount] = await ethers.getSigners() - user1 = await ethers.getImpersonatedSigner('0x3A445243376C32fAba679F63586e236F77EA601e') - user2 = await ethers.getImpersonatedSigner('0x5a08feed678c056650b3eb4a5cb1b9bb6f0fe265'); - - await fundAddress(user1.address, "1"); - await fundAddress(user2.address, "1"); - - BridgeTokenInstance = await ethers.getContractFactory('BridgeToken') - const bridgeToken = await BridgeTokenInstance.deploy() - await bridgeToken.waitForDeployment() - - const nearBridgeDeriveAddress = await deriveEthereumAddress('omni-locker.test1-dev.testnet', 'bridge-1'); - const omniBridgeChainId = 0; - - BridgeTokenFactory = await ethers.getContractFactory('BridgeTokenFactory') - BridgeTokenFactory = await upgrades.deployProxy(BridgeTokenFactory, [ - await bridgeToken.getAddress(), - nearBridgeDeriveAddress, - omniBridgeChainId, - ], { initializer: 'initialize' }); - await BridgeTokenFactory.waitForDeployment(); - }) - - async function fundAddress(address, amount) { - const tx = await adminAccount.sendTransaction({ - to: address, - value: ethers.parseEther(amount) - }); - await tx.wait(); - } - - async function createToken(tokenId) { - const { signature, payload } = metadataSignature(tokenId); - - await BridgeTokenFactory.deployToken(signature, payload); - const tokenProxyAddress = await BridgeTokenFactory.nearToEthToken(tokenId) - const token = BridgeTokenInstance.attach(tokenProxyAddress) - return { tokenProxyAddress, token } - } - - it('can create a token', async function () { - await createToken(wrappedNearId); - const tokenProxyAddress = await BridgeTokenFactory.nearToEthToken(wrappedNearId) - const token = BridgeTokenInstance.attach(tokenProxyAddress) - expect(await token.name()).to.be.equal('Wrapped NEAR fungible token') - expect(await token.symbol()).to.be.equal('wNEAR') - expect((await token.decimals()).toString()).to.be.equal('24') - }) - - it('can\'t create token if token already exists', async function () { - await createToken(wrappedNearId); - await expect(createToken(wrappedNearId)) - .to.be.revertedWith('ERR_TOKEN_EXIST') - }) - - it("can update token's metadata", async function() { - const { token } = await createToken(wrappedNearId); - - await BridgeTokenFactory.setMetadata(wrappedNearId, 'Circle USDC Bridged', 'USDC.E'); - expect(await token.name()).to.equal('Circle USDC Bridged'); - expect(await token.symbol()).to.equal('USDC.E'); - }); - - it('can\'t update metadata of non-existent token', async function () { - await createToken(wrappedNearId); - - await expect( - BridgeTokenFactory.setMetadata('non-existing', 'Circle USDC', 'USDC') - ).to.be.revertedWith('ERR_NOT_BRIDGE_TOKEN'); - }) - - it('can\'t update metadata as a normal user', async function () { - await createToken(wrappedNearId); - - await expect( - BridgeTokenFactory.connect(user1).setMetadata(wrappedNearId, 'Circle USDC', 'USDC') - ).to.be.revertedWithCustomError(BridgeTokenFactory, 'AccessControlUnauthorizedAccount'); - }) - - it('deposit token', async function () { - const { token } = await createToken(wrappedNearId); - - const { signature, payload } = depositSignature(wrappedNearId, user1.address); - - await expect( - BridgeTokenFactory - .finTransfer(signature, payload) - ) - .to - .emit(BridgeTokenFactory, 'FinTransfer') - .withArgs(payload.nonce, wrappedNearId, 1, payload.recipient, payload.feeRecipient); - - expect( - (await token.balanceOf(payload.recipient)) - .toString() - ) - .to - .be - .equal(payload.amount.toString()) - }) - - it('can\'t deposit if the contract is paused', async function () { - await createToken(wrappedNearId); - - await expect ( - BridgeTokenFactory.pauseFinTransfer() - ) - .to - .emit(BridgeTokenFactory, 'Paused') - .withArgs(adminAccount.address, PauseMode.PausedFinTransfer); - - const { signature, payload } = depositSignature(wrappedNearId, user1.address); - - await expect( - BridgeTokenFactory - .finTransfer(signature, payload) - ) - .to - .be - .revertedWith('Pausable: paused'); - }) - - it('can\'t deposit twice with the same signature', async function () { - await createToken(wrappedNearId); - - const { signature, payload } = depositSignature(wrappedNearId, user1.address); - await BridgeTokenFactory.finTransfer(signature, payload); - - await expect( - BridgeTokenFactory.finTransfer(signature, payload) - ) - .to.be.revertedWithCustomError(BridgeTokenFactory, 'NonceAlreadyUsed'); - }) - - it('can\'t deposit with invalid amount', async function () { - await createToken(wrappedNearId); - - const { signature, payload } = depositSignature(wrappedNearId, user1.address); - payload.amount = 100000; - - await expect( - BridgeTokenFactory.finTransfer(signature, payload) - ) - .to.be.revertedWithCustomError(BridgeTokenFactory, 'InvalidSignature'); - }) - - it('can\'t deposit with invalid nonce', async function () { - await createToken(wrappedNearId); - - const { signature, payload } = depositSignature(wrappedNearId, user1.address); - payload.nonce = 99; - - await expect( - BridgeTokenFactory.finTransfer(signature, payload) - ) - .to.be.revertedWithCustomError(BridgeTokenFactory, 'InvalidSignature'); - }) - - it('can\'t deposit with invalid token', async function () { - await createToken(wrappedNearId); - - const { signature, payload } = depositSignature(wrappedNearId, user1.address); - payload.token = 'test-token.testnet'; - - await expect( - BridgeTokenFactory.finTransfer(signature, payload) - ) - .to.be.revertedWithCustomError(BridgeTokenFactory, 'InvalidSignature'); - }) - - it('can\'t deposit with invalid recipient', async function () { - await createToken(wrappedNearId); - - const { signature, payload } = depositSignature(wrappedNearId, user1.address); - payload.recipient = user2.address; - - await expect( - BridgeTokenFactory.finTransfer(signature, payload) - ) - .to.be.revertedWithCustomError(BridgeTokenFactory, 'InvalidSignature'); - }) - - it('can\'t deposit with invalid relayer', async function () { - await createToken(wrappedNearId); - - const { signature, payload } = depositSignature(wrappedNearId, user1.address); - payload.feeRecipient = "testrecipient.near"; - - await expect( - BridgeTokenFactory.finTransfer(signature, payload) - ) - .to.be.revertedWithCustomError(BridgeTokenFactory, 'InvalidSignature'); - }) - - it('withdraw token', async function () { - const { token } = await createToken(wrappedNearId); - - await BridgeTokenFactory.setTokenWhitelistMode(wrappedNearId, WhitelistMode.CheckToken); - expect( - await BridgeTokenFactory.getTokenWhitelistMode(wrappedNearId) - ).to.be.equal(WhitelistMode.CheckToken); - - const { signature, payload } = depositSignature(wrappedNearId, user1.address); - await BridgeTokenFactory.finTransfer(signature, payload); - - const recipient = 'testrecipient.near'; - const fee = 0; - - await expect( - BridgeTokenFactory.connect(user1).initTransfer( - wrappedNearId, - payload.amount, - fee, - recipient - ) - ) - .to - .emit(BridgeTokenFactory, "InitTransfer") - .withArgs( - user1.address, - await BridgeTokenFactory.nearToEthToken(wrappedNearId), - 1, - wrappedNearId, - payload.amount, - fee, - recipient, - ); - - expect((await token.balanceOf(user1.address)).toString()).to.be.equal('0') - }) - - it('cant withdraw token when paused', async function () { - await createToken(wrappedNearId); - - await BridgeTokenFactory.setTokenWhitelistMode(wrappedNearId, WhitelistMode.CheckToken); - expect( - await BridgeTokenFactory.getTokenWhitelistMode(wrappedNearId) - ).to.be.equal(WhitelistMode.CheckToken); - - const { signature, payload } = depositSignature(wrappedNearId, user1.address); - await BridgeTokenFactory.finTransfer(signature, payload); - - const fee = 0; - await expect( - BridgeTokenFactory.pauseInitTransfer() - ) - .to - .emit(BridgeTokenFactory, 'Paused') - .withArgs(adminAccount.address, PauseMode.PausedInitTransfer); - await expect( - BridgeTokenFactory.initTransfer(wrappedNearId, payload.amount, fee, 'testrecipient.near') - ) - .to - .be - .revertedWith('Pausable: paused'); - }) - - it('can deposit and withdraw after unpausing', async function () { - const { token } = await createToken(wrappedNearId); - - await BridgeTokenFactory.setTokenWhitelistMode(wrappedNearId, WhitelistMode.CheckToken); - expect( - await BridgeTokenFactory.getTokenWhitelistMode(wrappedNearId) - ).to.be.equal(WhitelistMode.CheckToken); - - const { signature, payload } = depositSignature(wrappedNearId, user1.address); - await BridgeTokenFactory.finTransfer(signature, payload); - - await expect( - BridgeTokenFactory.pauseInitTransfer() - ) - .to - .emit(BridgeTokenFactory, 'Paused') - .withArgs(adminAccount.address, PauseMode.PausedInitTransfer); - - await expect( - BridgeTokenFactory.pause(PauseMode.UnpausedAll) - ) - .to - .emit(BridgeTokenFactory, 'Paused') - .withArgs(adminAccount.address, PauseMode.UnpausedAll); - - const recipient = 'testrecipient.near'; - const fee = 0; - await BridgeTokenFactory.connect(user1).initTransfer( - wrappedNearId, - payload.amount, - fee, - recipient - ); - - expect((await token.balanceOf(user1.address)).toString()).to.be.equal('0') - }) - - it('upgrade token contract', async function () { - const { tokenProxyAddress } = await createToken(wrappedNearId); - - const BridgeTokenV2Instance = await ethers.getContractFactory("TestBridgeToken"); - const BridgeTokenV2 = await BridgeTokenV2Instance.deploy(); - await BridgeTokenV2.waitForDeployment(); - - await BridgeTokenFactory.upgradeToken(wrappedNearId, await BridgeTokenV2.getAddress()) - const BridgeTokenV2Proxied = BridgeTokenV2Instance.attach(tokenProxyAddress) - expect(await BridgeTokenV2Proxied.returnTestString()).to.equal('test') - expect(await BridgeTokenV2Proxied.name()).to.equal('Wrapped NEAR fungible token') - expect(await BridgeTokenV2Proxied.symbol()).to.equal('wNEAR') - expect((await BridgeTokenV2Proxied.decimals()).toString()).to.equal('24') - }) - - it('user cant upgrade token contract', async function () { - await createToken(wrappedNearId); - - const BridgeTokenV2Instance = await ethers.getContractFactory("TestBridgeToken"); - const BridgeTokenV2 = await BridgeTokenV2Instance.deploy(); - await BridgeTokenV2.waitForDeployment(); - - await expect(BridgeTokenFactory.connect(user1).upgradeToken(wrappedNearId, await BridgeTokenV2.getAddress())) - .to.be.revertedWithCustomError(BridgeTokenFactory, 'AccessControlUnauthorizedAccount'); - }) - - it('Test selective pause', async function () { - // Pause withdraw - await expect( - BridgeTokenFactory.pauseInitTransfer() - ) - .to - .emit(BridgeTokenFactory, 'Paused') - .withArgs(adminAccount.address, PauseMode.PausedInitTransfer); - expect(await BridgeTokenFactory.pausedFlags()).to.be.equal(PauseMode.PausedInitTransfer); - - // Pause withdraw again - await expect( - BridgeTokenFactory.pauseInitTransfer() - ) - .to - .emit(BridgeTokenFactory, 'Paused') - .withArgs(adminAccount.address, PauseMode.PausedInitTransfer); - expect(await BridgeTokenFactory.pausedFlags()).to.be.equal(PauseMode.PausedInitTransfer); - expect(await BridgeTokenFactory.paused(PauseMode.PausedFinTransfer)).to.be.equal(false); - expect(await BridgeTokenFactory.paused(PauseMode.PausedInitTransfer)).to.be.equal(true); - - // Pause deposit - await expect( - BridgeTokenFactory.pauseFinTransfer() - ) - .to - .emit(BridgeTokenFactory, 'Paused') - .withArgs(adminAccount.address, PauseMode.PausedFinTransfer | PauseMode.PausedInitTransfer); - expect(await BridgeTokenFactory.pausedFlags()).to.be.equal(PauseMode.PausedFinTransfer | PauseMode.PausedInitTransfer); - - // Pause deposit again - await expect( - BridgeTokenFactory.pauseFinTransfer() - ) - .to - .emit(BridgeTokenFactory, 'Paused') - .withArgs(adminAccount.address, PauseMode.PausedFinTransfer | PauseMode.PausedInitTransfer); - expect(await BridgeTokenFactory.pausedFlags()) - .to - .be - .equal(PauseMode.PausedFinTransfer | PauseMode.PausedInitTransfer); - - // Pause deposit and withdraw - await expect( - BridgeTokenFactory.pause(PauseMode.PausedFinTransfer | PauseMode.PausedInitTransfer) - ) - .to - .emit(BridgeTokenFactory, 'Paused') - .withArgs(adminAccount.address, PauseMode.PausedFinTransfer | PauseMode.PausedInitTransfer); - expect(await BridgeTokenFactory.pausedFlags()) - .to - .be - .equal(PauseMode.PausedFinTransfer | PauseMode.PausedInitTransfer); - expect(await BridgeTokenFactory.paused(PauseMode.PausedFinTransfer)).to.be.equal(true); - expect(await BridgeTokenFactory.paused(PauseMode.PausedInitTransfer)).to.be.equal(true); - - // Unpause all - await expect( - BridgeTokenFactory.pause(PauseMode.UnpausedAll) - ) - .to - .emit(BridgeTokenFactory, 'Paused') - .withArgs(adminAccount.address, PauseMode.UnpausedAll); - expect(await BridgeTokenFactory.pausedFlags()).to.be.equal(PauseMode.UnpausedAll); - - // Pause all - await expect( - BridgeTokenFactory.pauseAll() - ) - .to - .emit(BridgeTokenFactory, 'Paused') - .withArgs(adminAccount.address, PauseMode.PausedFinTransfer | PauseMode.PausedInitTransfer); - expect(await BridgeTokenFactory.pausedFlags()) - .to - .be - .equal(PauseMode.PausedFinTransfer | PauseMode.PausedInitTransfer); - expect(await BridgeTokenFactory.paused(PauseMode.PausedFinTransfer)).to.be.equal(true); - expect(await BridgeTokenFactory.paused(PauseMode.PausedInitTransfer)).to.be.equal(true); - }) - - it("Test grant admin role", async function() { - await BridgeTokenFactory.connect(adminAccount).disableWhitelistMode(); - expect(await BridgeTokenFactory.isWhitelistModeEnabled()).to.be.false; - - await BridgeTokenFactory.connect(adminAccount).enableWhitelistMode(); - expect(await BridgeTokenFactory.isWhitelistModeEnabled()).to.be.true; - - const signers = await ethers.getSigners(); - const newAdminAccount = signers[2]; - const DEFAULT_ADMIN_ROLE = "0x0000000000000000000000000000000000000000000000000000000000000000"; - await expect( - BridgeTokenFactory.connect(newAdminAccount).disableWhitelistMode() - ).to.be.revertedWithCustomError(BridgeTokenFactory, 'AccessControlUnauthorizedAccount'); - expect(await BridgeTokenFactory.isWhitelistModeEnabled()).to.be.true; - - await expect( - BridgeTokenFactory.connect(newAdminAccount).enableWhitelistMode() - ).to.be.revertedWithCustomError(BridgeTokenFactory, 'AccessControlUnauthorizedAccount'); - expect(await BridgeTokenFactory.isWhitelistModeEnabled()).to.be.true; - - // Grant DEFAULT_ADMIN_ROLE to newAdminAccount - await expect( - BridgeTokenFactory.grantRole(DEFAULT_ADMIN_ROLE, newAdminAccount.address) - ) - .to - .emit(BridgeTokenFactory, "RoleGranted") - .withArgs( - DEFAULT_ADMIN_ROLE, - newAdminAccount.address, - adminAccount.address - ); - await BridgeTokenFactory.connect(newAdminAccount).disableWhitelistMode(); - expect(await BridgeTokenFactory.isWhitelistModeEnabled()).to.be.false; - - await BridgeTokenFactory.connect(newAdminAccount).enableWhitelistMode(); - expect(await BridgeTokenFactory.isWhitelistModeEnabled()).to.be.true; - - // Revoke DEFAULT_ADMIN_ROLE from adminAccount - await expect( - BridgeTokenFactory - .connect(newAdminAccount) - .revokeRole( - DEFAULT_ADMIN_ROLE, - adminAccount.address - ) - ) - .to - .emit(BridgeTokenFactory, "RoleRevoked") - .withArgs( - DEFAULT_ADMIN_ROLE, - adminAccount.address, - newAdminAccount.address - ); - - // Check tx reverted on call from revoked adminAccount - await expect( - BridgeTokenFactory.connect(adminAccount).disableWhitelistMode() - ).to.be.revertedWithCustomError(BridgeTokenFactory, 'AccessControlUnauthorizedAccount'); - expect(await BridgeTokenFactory.isWhitelistModeEnabled()).to.be.true; - - await expect( - BridgeTokenFactory.connect(adminAccount).enableWhitelistMode() - ).to.be.revertedWithCustomError(BridgeTokenFactory, 'AccessControlUnauthorizedAccount'); - expect(await BridgeTokenFactory.isWhitelistModeEnabled()).to.be.true; - - // Check newAdminAccount can perform admin calls - await BridgeTokenFactory.connect(newAdminAccount).disableWhitelistMode(); - expect(await BridgeTokenFactory.isWhitelistModeEnabled()).to.be.false; - await BridgeTokenFactory.connect(newAdminAccount).enableWhitelistMode(); - expect(await BridgeTokenFactory.isWhitelistModeEnabled()).to.be.true; - - // Check newAdminAccount can grant DEFAULT_ADMIN_ROLE to adminAccount - await expect( - BridgeTokenFactory - .connect(newAdminAccount) - .grantRole(DEFAULT_ADMIN_ROLE, adminAccount.address) - ) - .to - .emit(BridgeTokenFactory, "RoleGranted") - .withArgs( - DEFAULT_ADMIN_ROLE, - adminAccount.address, - newAdminAccount.address - ); - - // Check that adminAccount can perform admin calls again - await BridgeTokenFactory.connect(adminAccount).disableWhitelistMode(); - expect(await BridgeTokenFactory.isWhitelistModeEnabled()).to.be.false; - await BridgeTokenFactory.connect(adminAccount).enableWhitelistMode(); - expect(await BridgeTokenFactory.isWhitelistModeEnabled()).to.be.true; - }); - - describe("Whitelist", function() { - beforeEach(async function() { - await BridgeTokenFactory.enableWhitelistMode() - }); - - it("Test account in whitelist", async function() { - const tokenInfo = await createToken(wrappedNearId); - - const { signature, payload } = depositSignature(wrappedNearId, user1.address); - await BridgeTokenFactory.finTransfer(signature, payload); - - const recipient = payload.recipient; - const amountToTransfer = payload.amount; - - await BridgeTokenFactory.setTokenWhitelistMode(wrappedNearId, WhitelistMode.CheckAccountAndToken); - expect( - await BridgeTokenFactory.getTokenWhitelistMode(wrappedNearId) - ).to.be.equal(WhitelistMode.CheckAccountAndToken); - - await BridgeTokenFactory.addAccountToWhitelist( - wrappedNearId, - user1.address - ); - expect( - await BridgeTokenFactory.isAccountWhitelistedForToken( - wrappedNearId, - user1.address - ) - ).to.be.true; - - const fee = 0; - await BridgeTokenFactory.connect(user1).initTransfer(wrappedNearId, amountToTransfer, fee, recipient); - expect( - (await tokenInfo.token.balanceOf(user1.address)).toString() - ).to.be.equal("0"); - }); - - it("Test token in whitelist", async function() { - const tokenInfo = await createToken(wrappedNearId); - - const { signature, payload } = depositSignature(wrappedNearId, user1.address); - await BridgeTokenFactory.finTransfer(signature, payload); - - const recipient = payload.recipient; - const amountToTransfer = payload.amount; - const fee = 0; - - await BridgeTokenFactory.setTokenWhitelistMode(wrappedNearId, WhitelistMode.CheckToken); - expect( - await BridgeTokenFactory.getTokenWhitelistMode(wrappedNearId) - ).to.be.equal(WhitelistMode.CheckToken); - - await BridgeTokenFactory.connect(user1).initTransfer(wrappedNearId, amountToTransfer, fee, recipient); - expect( - (await tokenInfo.token.balanceOf(user1.address)).toString() - ).to.be.equal("0"); - }); - - it("Test multiple tokens", async function() { - const whitelistTokens = [ - "wrap.testnet", - "token-bridge-test.testnet", - ]; - const blacklistTokens = [ - "blacklisted1.testnet", - "blacklisted2.testnet", - ]; - - for (token of whitelistTokens) { - await createToken(token); - - const { signature, payload } = depositSignature(token, user1.address); - await BridgeTokenFactory.finTransfer(signature, payload); - - await BridgeTokenFactory.setTokenWhitelistMode(token, WhitelistMode.CheckToken); - expect( - await BridgeTokenFactory.getTokenWhitelistMode(token) - ).to.be.equal(WhitelistMode.CheckToken); - } - - const amountToWithdraw = 1; - const recipient = "testrecipient.near"; - const fee = 0; - for (token of blacklistTokens) { - await expect( - BridgeTokenFactory.connect(user1).initTransfer( - token, - amountToWithdraw, - fee, - recipient - ) - ).to.be.revertedWith("ERR_NOT_INITIALIZED_WHITELIST_TOKEN"); - } - - let nonce = 0; - for (token of whitelistTokens) { - nonce++; - await expect( - BridgeTokenFactory.connect(user1).initTransfer( - token, - amountToWithdraw, - fee, - recipient - ) - ) - .to - .emit(BridgeTokenFactory, "InitTransfer") - .withArgs( - user1.address, - await BridgeTokenFactory.nearToEthToken(token), - nonce, - token, - amountToWithdraw, - fee, - recipient, - - ); - } - }); - - it("Test multiple accounts", async function() { - const whitelistTokens = [ - "wrap.testnet", - "token-bridge-test.testnet", - ]; - - const whitelistAccounts = [ - user1, - user2 - ]; - - const signers = await ethers.getSigners(); - const blacklistAccounts = signers.slice(0, 2); - - const tokensInfo = []; - for (token of whitelistTokens) { - tokensInfo.push(createToken(token)); - await BridgeTokenFactory.setTokenWhitelistMode(token, WhitelistMode.CheckAccountAndToken); - expect( - await BridgeTokenFactory.getTokenWhitelistMode(token) - ).to.be.equal(WhitelistMode.CheckAccountAndToken); - - for (const account of whitelistAccounts) { - const { signature, payload } = depositSignature(token, account.address); - await BridgeTokenFactory.finTransfer(signature, payload); - - await BridgeTokenFactory.addAccountToWhitelist( - token, - account.address - ); - expect( - await BridgeTokenFactory.isAccountWhitelistedForToken( - token, - account.address - ) - ).to.be.true; - } - } - - const amountToWithdraw = 1; - const recipient = "testrecipient.near"; - const fee = 0; - let nonce = 0; - for (token of whitelistTokens) { - for (const account of whitelistAccounts) { - nonce++; - await expect( - BridgeTokenFactory.connect(account).initTransfer( - token, - amountToWithdraw, - fee, - recipient - ) - ) - .to - .emit(BridgeTokenFactory, "InitTransfer") - .withArgs( - account.address, - await BridgeTokenFactory.nearToEthToken(token), - nonce, - token, - amountToWithdraw, - fee, - recipient, - ); - } - - for (const account of blacklistAccounts) { - await expect( - BridgeTokenFactory.connect(account).initTransfer( - token, - amountToWithdraw, - fee, - recipient - ) - ).revertedWith("ERR_ACCOUNT_NOT_IN_WHITELIST"); - } - } - }); - - it("Test remove account from whitelist", async function() { - const tokenInfo = await createToken(wrappedNearId); - - const { signature, payload } = depositSignature(wrappedNearId, user2.address); - await BridgeTokenFactory.finTransfer(signature, payload); - - await BridgeTokenFactory.setTokenWhitelistMode(wrappedNearId, WhitelistMode.CheckAccountAndToken); - expect( - await BridgeTokenFactory.getTokenWhitelistMode(wrappedNearId) - ).to.be.equal(WhitelistMode.CheckAccountAndToken); - - await BridgeTokenFactory.addAccountToWhitelist( - wrappedNearId, - user2.address - ); - expect( - await BridgeTokenFactory.isAccountWhitelistedForToken( - wrappedNearId, - user2.address - ) - ).to.be.true; - - const amountToWithdraw = 10; - const recipient = "testrecipient.near"; - const fee = 0; - - await BridgeTokenFactory.connect(user2).initTransfer(wrappedNearId, amountToWithdraw, fee, recipient); - - await BridgeTokenFactory.removeAccountFromWhitelist(wrappedNearId, user2.address); - expect( - await BridgeTokenFactory.isAccountWhitelistedForToken( - wrappedNearId, - user2.address - ) - ).to.be.false; - - await expect( - BridgeTokenFactory.connect(user2).initTransfer(wrappedNearId, amountToWithdraw, fee, recipient) - ).to.be.revertedWith("ERR_ACCOUNT_NOT_IN_WHITELIST"); - - expect( - (await tokenInfo.token.balanceOf(user2.address)).toString() - ).to.be.equal((payload.amount - amountToWithdraw).toString()); - }); - - it("Test token or account not in whitelist", async function() { - const tokenId = "token-bridge-test.testnet"; - const tokenInfo = await createToken(tokenId); - - const { signature, payload } = depositSignature(tokenId, user2.address); - await BridgeTokenFactory.finTransfer(signature, payload); - - const amountToWithdraw = payload.amount / 2; - const recipient = "testrecipient.near"; - const fee = 0; - - await expect( - BridgeTokenFactory.initTransfer(tokenId, amountToWithdraw, fee, recipient) - ).to.be.revertedWith("ERR_NOT_INITIALIZED_WHITELIST_TOKEN"); - - await BridgeTokenFactory.setTokenWhitelistMode(tokenId, WhitelistMode.Blocked); - expect( - await BridgeTokenFactory.getTokenWhitelistMode(tokenId) - ).to.be.equal(WhitelistMode.Blocked); - - await expect( - BridgeTokenFactory.initTransfer(tokenId, amountToWithdraw, fee, recipient) - ).to.be.revertedWith("ERR_WHITELIST_TOKEN_BLOCKED"); - - await BridgeTokenFactory.setTokenWhitelistMode(tokenId, WhitelistMode.CheckAccountAndToken); - expect( - await BridgeTokenFactory.getTokenWhitelistMode(tokenId) - ).to.be.equal(WhitelistMode.CheckAccountAndToken); - - await expect( - BridgeTokenFactory.initTransfer(tokenId, amountToWithdraw, fee, recipient) - ).to.be.revertedWith("ERR_ACCOUNT_NOT_IN_WHITELIST"); - - // Disable whitelist mode - await BridgeTokenFactory.disableWhitelistMode(); - expect(await BridgeTokenFactory.isWhitelistModeEnabled()).to.be.false; - await BridgeTokenFactory.connect(user2).initTransfer(tokenId, amountToWithdraw, fee, recipient); - expect( - (await tokenInfo.token.balanceOf(user2.address)).toString() - ).to.be.equal(amountToWithdraw.toString()); - - // Enable whitelist mode - await BridgeTokenFactory.enableWhitelistMode(); - expect(await BridgeTokenFactory.isWhitelistModeEnabled()).to.be.true; - await expect( - BridgeTokenFactory.initTransfer(tokenId, amountToWithdraw, fee, recipient) - ).to.be.revertedWith("ERR_ACCOUNT_NOT_IN_WHITELIST"); - - await BridgeTokenFactory.addAccountToWhitelist( - tokenId, - user2.address - ); - expect( - await BridgeTokenFactory.isAccountWhitelistedForToken( - tokenId, - user2.address - ) - ).to.be.true; - - await BridgeTokenFactory.connect(user2).initTransfer(tokenId, amountToWithdraw, fee, recipient); - - expect( - (await tokenInfo.token.balanceOf(user2.address)).toString() - ).to.be.equal("0"); - }); - }); -}) diff --git a/evm/bridge-token-factory/test/BridgeTokenWormhole.js b/evm/bridge-token-factory/test/BridgeTokenWormhole.js deleted file mode 100644 index c9f8e6fc..00000000 --- a/evm/bridge-token-factory/test/BridgeTokenWormhole.js +++ /dev/null @@ -1,125 +0,0 @@ -const { expect } = require('chai') -const { ethers, upgrades } = require('hardhat') -const { metadataSignature, depositSignature } = require('./helpers/signatures') -const { anyValue } = require("@nomicfoundation/hardhat-chai-matchers/withArgs") -const { deriveEthereumAddress } = require('./helpers/kdf') - -describe('BridgeTokenWormhole', () => { - const wrappedNearId = 'wrap.testnet'; - const consistencyLevel = 3; - - let user1, adminAccount; - let BridgeTokenInstance; - let BridgeTokenFactory; - let TestWormhole; - - beforeEach(async function () { - [adminAccount] = await ethers.getSigners(); - user1 = await ethers.getImpersonatedSigner('0x3A445243376C32fAba679F63586e236F77EA601e'); - await fundAddress(user1.address, "1"); - - BridgeTokenInstance = await ethers.getContractFactory('BridgeToken'); - const bridgeToken = await BridgeTokenInstance.deploy(); - await bridgeToken.waitForDeployment(); - - TestWormhole = await ethers.getContractFactory('TestWormhole'); - TestWormhole = await TestWormhole.deploy(); - await TestWormhole.waitForDeployment(); - - const nearBridgeDeriveAddress = await deriveEthereumAddress('omni-locker.test1-dev.testnet', 'bridge-1'); - const omniBridgeChainId = 0; - - BridgeTokenFactory = await ethers.getContractFactory('BridgeTokenFactoryWormhole'); - BridgeTokenFactory = await upgrades.deployProxy(BridgeTokenFactory, [ - await bridgeToken.getAddress(), - nearBridgeDeriveAddress, - omniBridgeChainId, - await TestWormhole.getAddress(), - consistencyLevel - ], { initializer: 'initializeWormhole' }); - await BridgeTokenFactory.waitForDeployment(); - }); - - async function fundAddress(address, amount) { - const tx = await adminAccount.sendTransaction({ - to: address, - value: ethers.parseEther(amount) - }); - await tx.wait(); - } - - async function createToken(tokenId) { - const { signature, payload } = metadataSignature(tokenId); - - await BridgeTokenFactory.deployToken(signature, payload); - const tokenProxyAddress = await BridgeTokenFactory.nearToEthToken(tokenId) - const token = BridgeTokenInstance.attach(tokenProxyAddress) - return { tokenProxyAddress, token } - } - - it('deploy token', async function () { - const { signature, payload } = metadataSignature(wrappedNearId); - - await expect( - await BridgeTokenFactory.deployToken(signature, payload) - ) - .to - .emit(TestWormhole, 'MessagePublished') - .withArgs(0, anyValue, consistencyLevel); - }); - - it('deposit token', async function () { - const { token } = await createToken(wrappedNearId); - const { signature, payload } = depositSignature(wrappedNearId, user1.address); - - const expectedPayload = ethers.AbiCoder.defaultAbiCoder().encode( - ["uint8", "string", "uint256", "string", "uint128"], - [1, wrappedNearId, payload.amount, payload.feeRecipient, payload.nonce] - ); - - await expect( - BridgeTokenFactory - .finTransfer(signature, payload) - ) - .to - .emit(TestWormhole, 'MessagePublished') - .withArgs(1, expectedPayload, consistencyLevel); - - expect( - (await token.balanceOf(payload.recipient)) - .toString() - ) - .to - .be - .equal(payload.amount.toString()) - }); - - it('withdraw token', async function () { - const { token } = await createToken(wrappedNearId); - const { signature, payload } = depositSignature(wrappedNearId, user1.address); - await BridgeTokenFactory - .finTransfer(signature, payload); - - const recipient = 'testrecipient.near'; - const fee = 0; - const nonce = 1; - const expectedPayload = ethers.AbiCoder.defaultAbiCoder().encode( - ["uint8", "uint128", "string", "uint128", "uint128", "string", "address"], - [0, nonce, wrappedNearId, payload.amount, fee, recipient, user1.address] - ); - - await expect( - BridgeTokenFactory.connect(user1).initTransfer( - wrappedNearId, - payload.amount, - fee, - recipient - ) - ) - .to - .emit(TestWormhole, "MessagePublished") - .withArgs(2, expectedPayload, consistencyLevel); - - expect((await token.balanceOf(user1.address)).toString()).to.be.equal('0') - }); -}); \ No newline at end of file diff --git a/evm/bridge-token-factory/test/helpers/kdf.js b/evm/bridge-token-factory/test/helpers/kdf.js deleted file mode 100644 index db64e95b..00000000 --- a/evm/bridge-token-factory/test/helpers/kdf.js +++ /dev/null @@ -1,88 +0,0 @@ -const { base_decode } = require('near-api-js/lib/utils/serialize'); -const { ec: EC } = require('elliptic'); -const { ethers } = require('hardhat') -const hash = require('hash.js'); -const bs58check = require('bs58check'); -const { sha3_256 } = require('js-sha3'); - -const rootPublicKey = 'secp256k1:4NfTiv3UsGahebgTaHyD9vF8KYKMBnfd6kh94mK6xv8fGBiJB8TBtFMP5WWXz6B89Ac1fbpzPwAvoyQebemHFwx3'; - -function najPublicKeyStrToUncompressedHexPoint() { - const res = '04' + Buffer.from(base_decode(rootPublicKey.split(':')[1])).toString('hex'); - return res; -} - -async function deriveChildPublicKey( - parentUncompressedPublicKeyHex, - signerId, - path = '' -) { - const ec = new EC("secp256k1"); - const scalarHex = sha3_256( - `near-mpc-recovery v0.1.0 epsilon derivation:${signerId},${path}` - ); - - const x = parentUncompressedPublicKeyHex.substring(2, 66); - const y = parentUncompressedPublicKeyHex.substring(66); - - // Create a point object from X and Y coordinates - const oldPublicKeyPoint = ec.curve.point(x, y); - - // Multiply the scalar by the generator point G - const scalarTimesG = ec.g.mul(scalarHex); - - // Add the result to the old public key point - const newPublicKeyPoint = oldPublicKeyPoint.add(scalarTimesG); - const newX = newPublicKeyPoint.getX().toString("hex").padStart(64, "0"); - const newY = newPublicKeyPoint.getY().toString("hex").padStart(64, "0"); - return "04" + newX + newY; -} - -function uncompressedHexPointToEvmAddress(uncompressedHexPoint) { - const addressHash = ethers.keccak256(`0x${uncompressedHexPoint.slice(2)}`); - - // Ethereum address is last 20 bytes of hash (40 characters), prefixed with 0x - return ("0x" + addressHash.substring(addressHash.length - 40)); -} - -async function uncompressedHexPointToBtcAddress(publicKeyHex, network) { - // Step 1: SHA-256 hashing of the public key - const publicKeyBytes = Uint8Array.from(Buffer.from(publicKeyHex, 'hex')); - - const sha256HashOutput = await crypto.subtle.digest( - 'SHA-256', - publicKeyBytes - ); - - // Step 2: RIPEMD-160 hashing on the result of SHA-256 - const ripemd160 = hash - .ripemd160() - .update(Buffer.from(sha256HashOutput)) - .digest(); - - // Step 3: Adding network byte (0x00 for Bitcoin Mainnet) - const network_byte = network === 'bitcoin' ? 0x00 : 0x6f; - const networkByte = Buffer.from([network_byte]); - const networkByteAndRipemd160 = Buffer.concat([ - networkByte, - Buffer.from(ripemd160) - ]); - - // Step 4: Base58Check encoding - const address = bs58check.encode(networkByteAndRipemd160); - - return address; -} - -async function deriveEthereumAddress(accountId, derivation_path) { - const publicKey = await deriveChildPublicKey(najPublicKeyStrToUncompressedHexPoint(), accountId, derivation_path); - return await uncompressedHexPointToEvmAddress(publicKey); -} - -module.exports = { - deriveChildPublicKey, - najPublicKeyStrToUncompressedHexPoint, - uncompressedHexPointToEvmAddress, - uncompressedHexPointToBtcAddress, - deriveEthereumAddress -}; \ No newline at end of file diff --git a/evm/bridge-token-factory/test/helpers/signatures.js b/evm/bridge-token-factory/test/helpers/signatures.js deleted file mode 100644 index b7da3837..00000000 --- a/evm/bridge-token-factory/test/helpers/signatures.js +++ /dev/null @@ -1,79 +0,0 @@ -function metadataSignature(tokenId) { - const signatures = [ - { - payload: { - token: "wrap.testnet", - name: "Wrapped NEAR fungible token", - symbol: "wNEAR", - decimals: 24 - }, - signature: "0x43D447B8FF105D740FA7B68D506163D33D8AB2831250DB66A074E45FCF218E0C2EC50105AB9AEDD43556D75C22E790CAEF7F6DC486953D5B266859E23D36C3AB1C" - }, - { - payload: { - token: "token-bridge-test.testnet", - name: "Bridge Token", - symbol: "TBT", - decimals: 8 - }, - signature: "0x1D665C94803E5508D7EB34C43F54CB7503B6C14573B8A39F46EFEAF10CF2F68724F18F44F53C8AE3729470B7DDC256D0169F7BBF82CE39F48A95351DAA076C861C" - } - ]; - - const data = signatures.find(s => s.payload.token === tokenId); - if (data === undefined) throw new Error(`Metadata not found for token ${tokenId}`); - - return data; -} - -function depositSignature(tokenId, recipient) { - const signatures = [ - { - payload: { - nonce: 2, - token: "wrap.testnet", - amount: 1, - recipient: "0x3A445243376C32fAba679F63586e236F77EA601e", - feeRecipient: "", - }, - signature: "0x4B7305FD501E44EEF53E876DE0F8F4F848C00179FD27B0E4942EC2C94816C5CA33C583D7D386B77BF7AD121ED4FE0DB5AF8C730CC7B2D505987616B532F492AF1B" - }, - { - payload: { - nonce: 10, - token: "token-bridge-test.testnet", - amount: 200, - recipient: "0x5a08feed678c056650b3eb4a5cb1b9bb6f0fe265", - feeRecipient: "", - }, - signature: "0xE5C500D3D21289C620BF7CA0E9049B24B7D4D9864C5E3F09477BCCB7E6524E5810DDCDFE5988F08C36B6AC70D81E443D91CBA0E43935ECEDB8F14BD4222464FA1C" - }, - { - payload: { - nonce: 11, - token: "wrap.testnet", - amount: 25, - recipient: "0x5a08feed678c056650b3eb4a5cb1b9bb6f0fe265", - feeRecipient: "", - }, - signature: "0x316AFD2FFC056DD266296B023E2509222FC6ED9FAE44583414BE6E478BF62C5238E413341093B0E8C1A6192EFF1C0C4FFFB0D405C48993555E99B11A987891C61C" - }, - { - payload: { - nonce: 12, - token: "token-bridge-test.testnet", - amount: 10, - recipient: "0x3a445243376c32faba679f63586e236f77ea601e", - feeRecipient: "", - }, - signature: "0x15E146799FF4D5FC190A72633A0FAC14C399D2D9CFCEA1DAC8C1D0913C6698832C2AEF2C5CA6AA731089EA31559A57AE2586744DDDE7A196A3BDA26A38B8387A1C" - } - ]; - - const data = signatures.find(s => s.payload.token === tokenId && s.payload.recipient.toLowerCase() === recipient.toLowerCase()); - if (data === undefined) throw new Error(`Deposit not found for token ${tokenId} and recipient ${recipient}`); - - return data; -} - -module.exports = { metadataSignature, depositSignature }; \ No newline at end of file diff --git a/evm/bridge-token-factory/yarn.lock b/evm/bridge-token-factory/yarn.lock deleted file mode 100644 index f4ad6fba..00000000 --- a/evm/bridge-token-factory/yarn.lock +++ /dev/null @@ -1,14678 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@adraffy/ens-normalize@1.10.1": - version "1.10.1" - resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz#63430d04bd8c5e74f8d7d049338f1cd9d4f02069" - integrity sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw== - -"@aws-crypto/sha256-js@1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-js/-/sha256-js-1.2.2.tgz#02acd1a1fda92896fc5a28ec7c6e164644ea32fc" - integrity sha512-Nr1QJIbW/afYYGzYvrF70LtaHrIRtd4TNAglX8BvlfxJLZ45SAmueIKYl5tWoNBPzp65ymXGFK0Bb1vZUpuc9g== - dependencies: - "@aws-crypto/util" "^1.2.2" - "@aws-sdk/types" "^3.1.0" - tslib "^1.11.1" - -"@aws-crypto/util@^1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@aws-crypto/util/-/util-1.2.2.tgz#b28f7897730eb6538b21c18bd4de22d0ea09003c" - integrity sha512-H8PjG5WJ4wz0UXAFXeJjWCW1vkvIJ3qUUD+rGRwJ2/hj+xT58Qle2MTql/2MGzkU+1JLAFuR6aJpLAjHwhmwwg== - dependencies: - "@aws-sdk/types" "^3.1.0" - "@aws-sdk/util-utf8-browser" "^3.0.0" - tslib "^1.11.1" - -"@aws-sdk/types@^3.1.0": - version "3.609.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.609.0.tgz#06b39d799c9f197a7b43670243e8e78a3bf7d6a5" - integrity sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q== - dependencies: - "@smithy/types" "^3.3.0" - tslib "^2.6.2" - -"@aws-sdk/util-utf8-browser@^3.0.0": - version "3.259.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz#3275a6f5eb334f96ca76635b961d3c50259fd9ff" - integrity sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw== - dependencies: - tslib "^2.3.1" - -"@babel/code-frame@^7.0.0": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" - integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== - dependencies: - "@babel/highlight" "^7.24.7" - picocolors "^1.0.0" - -"@babel/helper-validator-identifier@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" - integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== - -"@babel/highlight@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" - integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== - dependencies: - "@babel/helper-validator-identifier" "^7.24.7" - chalk "^2.4.2" - js-tokens "^4.0.0" - picocolors "^1.0.0" - -"@babel/runtime@^7.4.4": - version "7.25.6" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.6.tgz#9afc3289f7184d8d7f98b099884c26317b9264d2" - integrity sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ== - dependencies: - regenerator-runtime "^0.14.0" - -"@ensdomains/address-encoder@^0.1.7": - version "0.1.9" - resolved "https://registry.yarnpkg.com/@ensdomains/address-encoder/-/address-encoder-0.1.9.tgz#f948c485443d9ef7ed2c0c4790e931c33334d02d" - integrity sha512-E2d2gP4uxJQnDu2Kfg1tHNspefzbLT8Tyjrm5sEuim32UkU2sm5xL4VXtgc2X33fmPEw9+jUMpGs4veMbf+PYg== - dependencies: - bech32 "^1.1.3" - blakejs "^1.1.0" - bn.js "^4.11.8" - bs58 "^4.0.1" - crypto-addr-codec "^0.1.7" - nano-base32 "^1.0.1" - ripemd160 "^2.0.2" - -"@ensdomains/ens@0.4.5", "@ensdomains/ens@^0.4.4": - version "0.4.5" - resolved "https://registry.yarnpkg.com/@ensdomains/ens/-/ens-0.4.5.tgz#e0aebc005afdc066447c6e22feb4eda89a5edbfc" - integrity sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw== - dependencies: - bluebird "^3.5.2" - eth-ens-namehash "^2.0.8" - solc "^0.4.20" - testrpc "0.0.1" - web3-utils "^1.0.0-beta.31" - -"@ensdomains/ensjs@^2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@ensdomains/ensjs/-/ensjs-2.1.0.tgz#0a7296c1f3d735ef019320d863a7846a0760c460" - integrity sha512-GRbGPT8Z/OJMDuxs75U/jUNEC0tbL0aj7/L/QQznGYKm/tiasp+ndLOaoULy9kKJFC0TBByqfFliEHDgoLhyog== - dependencies: - "@babel/runtime" "^7.4.4" - "@ensdomains/address-encoder" "^0.1.7" - "@ensdomains/ens" "0.4.5" - "@ensdomains/resolver" "0.2.4" - content-hash "^2.5.2" - eth-ens-namehash "^2.0.8" - ethers "^5.0.13" - js-sha3 "^0.8.0" - -"@ensdomains/resolver@0.2.4", "@ensdomains/resolver@^0.2.4": - version "0.2.4" - resolved "https://registry.yarnpkg.com/@ensdomains/resolver/-/resolver-0.2.4.tgz#c10fe28bf5efbf49bff4666d909aed0265efbc89" - integrity sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA== - -"@ethereum-waffle/chai@^3.4.4": - version "3.4.4" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/chai/-/chai-3.4.4.tgz#16c4cc877df31b035d6d92486dfdf983df9138ff" - integrity sha512-/K8czydBtXXkcM9X6q29EqEkc5dN3oYenyH2a9hF7rGAApAJUpH8QBtojxOY/xQ2up5W332jqgxwp0yPiYug1g== - dependencies: - "@ethereum-waffle/provider" "^3.4.4" - ethers "^5.5.2" - -"@ethereum-waffle/compiler@^3.4.4": - version "3.4.4" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/compiler/-/compiler-3.4.4.tgz#d568ee0f6029e68b5c645506079fbf67d0dfcf19" - integrity sha512-RUK3axJ8IkD5xpWjWoJgyHclOeEzDLQFga6gKpeGxiS/zBu+HB0W2FvsrrLalTFIaPw/CGYACRBSIxqiCqwqTQ== - dependencies: - "@resolver-engine/imports" "^0.3.3" - "@resolver-engine/imports-fs" "^0.3.3" - "@typechain/ethers-v5" "^2.0.0" - "@types/mkdirp" "^0.5.2" - "@types/node-fetch" "^2.5.5" - ethers "^5.0.1" - mkdirp "^0.5.1" - node-fetch "^2.6.1" - solc "^0.6.3" - ts-generator "^0.1.1" - typechain "^3.0.0" - -"@ethereum-waffle/ens@^3.4.4": - version "3.4.4" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/ens/-/ens-3.4.4.tgz#db97ea2c9decbb70b9205d53de2ccbd6f3182ba1" - integrity sha512-0m4NdwWxliy3heBYva1Wr4WbJKLnwXizmy5FfSSr5PMbjI7SIGCdCB59U7/ZzY773/hY3bLnzLwvG5mggVjJWg== - dependencies: - "@ensdomains/ens" "^0.4.4" - "@ensdomains/resolver" "^0.2.4" - ethers "^5.5.2" - -"@ethereum-waffle/mock-contract@^3.4.4": - version "3.4.4" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/mock-contract/-/mock-contract-3.4.4.tgz#fc6ffa18813546f4950a69f5892d4dd54b2c685a" - integrity sha512-Mp0iB2YNWYGUV+VMl5tjPsaXKbKo8MDH9wSJ702l9EBjdxFf/vBvnMBAC1Fub1lLtmD0JHtp1pq+mWzg/xlLnA== - dependencies: - "@ethersproject/abi" "^5.5.0" - ethers "^5.5.2" - -"@ethereum-waffle/provider@^3.4.4": - version "3.4.4" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/provider/-/provider-3.4.4.tgz#398fc1f7eb91cc2df7d011272eacba8af0c7fffb" - integrity sha512-GK8oKJAM8+PKy2nK08yDgl4A80mFuI8zBkE0C9GqTRYQqvuxIyXoLmJ5NZU9lIwyWVv5/KsoA11BgAv2jXE82g== - dependencies: - "@ethereum-waffle/ens" "^3.4.4" - ethers "^5.5.2" - ganache-core "^2.13.2" - patch-package "^6.2.2" - postinstall-postinstall "^2.1.0" - -"@ethereumjs/block@^3.4.0": - version "3.6.3" - resolved "https://registry.yarnpkg.com/@ethereumjs/block/-/block-3.6.3.tgz#d96cbd7af38b92ebb3424223dbf773f5ccd27f84" - integrity sha512-CegDeryc2DVKnDkg5COQrE0bJfw/p0v3GBk2W5/Dj5dOVfEmb50Ux0GLnSPypooLnfqjwFaorGuT9FokWB3GRg== - dependencies: - "@ethereumjs/common" "^2.6.5" - "@ethereumjs/tx" "^3.5.2" - ethereumjs-util "^7.1.5" - merkle-patricia-tree "^4.2.4" - -"@ethereumjs/common@2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.5.0.tgz#ec61551b31bef7a69d1dc634d8932468866a4268" - integrity sha512-DEHjW6e38o+JmB/NO3GZBpW4lpaiBpkFgXF6jLcJ6gETBYpEyaA5nTimsWBUJR3Vmtm/didUEbNjajskugZORg== - dependencies: - crc-32 "^1.2.0" - ethereumjs-util "^7.1.1" - -"@ethereumjs/common@2.6.5", "@ethereumjs/common@^2.5.0", "@ethereumjs/common@^2.6.4", "@ethereumjs/common@^2.6.5": - version "2.6.5" - resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.5.tgz#0a75a22a046272579d91919cb12d84f2756e8d30" - integrity sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA== - dependencies: - crc-32 "^1.2.0" - ethereumjs-util "^7.1.5" - -"@ethereumjs/rlp@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@ethereumjs/rlp/-/rlp-4.0.1.tgz#626fabfd9081baab3d0a3074b0c7ecaf674aaa41" - integrity sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw== - -"@ethereumjs/tx@3.3.2": - version "3.3.2" - resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.3.2.tgz#348d4624bf248aaab6c44fec2ae67265efe3db00" - integrity sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog== - dependencies: - "@ethereumjs/common" "^2.5.0" - ethereumjs-util "^7.1.2" - -"@ethereumjs/tx@3.5.2", "@ethereumjs/tx@^3.5.2": - version "3.5.2" - resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.5.2.tgz#197b9b6299582ad84f9527ca961466fce2296c1c" - integrity sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw== - dependencies: - "@ethereumjs/common" "^2.6.4" - ethereumjs-util "^7.1.5" - -"@ethereumjs/util@^8.1.0": - version "8.1.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/util/-/util-8.1.0.tgz#299df97fb6b034e0577ce9f94c7d9d1004409ed4" - integrity sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA== - dependencies: - "@ethereumjs/rlp" "^4.0.1" - ethereum-cryptography "^2.0.0" - micro-ftch "^0.3.1" - -"@ethersproject/abi@5.0.0-beta.153": - version "5.0.0-beta.153" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.0.0-beta.153.tgz#43a37172b33794e4562999f6e2d555b7599a8eee" - integrity sha512-aXweZ1Z7vMNzJdLpR1CZUAIgnwjrZeUSvN9syCwlBaEBUFJmFY+HHnfuTI5vIhVs/mRkfJVrbEyl51JZQqyjAg== - dependencies: - "@ethersproject/address" ">=5.0.0-beta.128" - "@ethersproject/bignumber" ">=5.0.0-beta.130" - "@ethersproject/bytes" ">=5.0.0-beta.129" - "@ethersproject/constants" ">=5.0.0-beta.128" - "@ethersproject/hash" ">=5.0.0-beta.128" - "@ethersproject/keccak256" ">=5.0.0-beta.127" - "@ethersproject/logger" ">=5.0.0-beta.129" - "@ethersproject/properties" ">=5.0.0-beta.131" - "@ethersproject/strings" ">=5.0.0-beta.130" - -"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.0.9", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.5.0", "@ethersproject/abi@^5.6.3", "@ethersproject/abi@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" - integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== - dependencies: - "@ethersproject/address" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/hash" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - -"@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef" - integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/networks" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - "@ethersproject/web" "^5.7.0" - -"@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2" - integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== - dependencies: - "@ethersproject/abstract-provider" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - -"@ethersproject/address@5.7.0", "@ethersproject/address@>=5.0.0-beta.128", "@ethersproject/address@^5.0.2", "@ethersproject/address@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" - integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/rlp" "^5.7.0" - -"@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c" - integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== - dependencies: - "@ethersproject/bytes" "^5.7.0" - -"@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.7.0.tgz#97034dc7e8938a8ca943ab20f8a5e492ece4020b" - integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - -"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@>=5.0.0-beta.130", "@ethersproject/bignumber@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" - integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - bn.js "^5.2.1" - -"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@>=5.0.0-beta.129", "@ethersproject/bytes@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" - integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== - dependencies: - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/constants@5.7.0", "@ethersproject/constants@>=5.0.0-beta.128", "@ethersproject/constants@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e" - integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - -"@ethersproject/contracts@5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e" - integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg== - dependencies: - "@ethersproject/abi" "^5.7.0" - "@ethersproject/abstract-provider" "^5.7.0" - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - -"@ethersproject/hash@5.7.0", "@ethersproject/hash@>=5.0.0-beta.128", "@ethersproject/hash@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" - integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== - dependencies: - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/base64" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - -"@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.7.0.tgz#e627ddc6b466bc77aebf1a6b9e47405ca5aef9cf" - integrity sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg== - dependencies: - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/basex" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/pbkdf2" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/sha2" "^5.7.0" - "@ethersproject/signing-key" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - "@ethersproject/wordlists" "^5.7.0" - -"@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz#5e3355287b548c32b368d91014919ebebddd5360" - integrity sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g== - dependencies: - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/hdnode" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/pbkdf2" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/random" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - aes-js "3.0.0" - scrypt-js "3.0.1" - -"@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@>=5.0.0-beta.127", "@ethersproject/keccak256@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" - integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== - dependencies: - "@ethersproject/bytes" "^5.7.0" - js-sha3 "0.8.0" - -"@ethersproject/logger@5.7.0", "@ethersproject/logger@>=5.0.0-beta.129", "@ethersproject/logger@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" - integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== - -"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0": - version "5.7.1" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" - integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== - dependencies: - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz#d2267d0a1f6e123f3771007338c47cccd83d3102" - integrity sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/sha2" "^5.7.0" - -"@ethersproject/properties@5.7.0", "@ethersproject/properties@>=5.0.0-beta.131", "@ethersproject/properties@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" - integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== - dependencies: - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/providers@5.7.2": - version "5.7.2" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" - integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== - dependencies: - "@ethersproject/abstract-provider" "^5.7.0" - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/base64" "^5.7.0" - "@ethersproject/basex" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/hash" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/networks" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/random" "^5.7.0" - "@ethersproject/rlp" "^5.7.0" - "@ethersproject/sha2" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - "@ethersproject/web" "^5.7.0" - bech32 "1.1.4" - ws "7.4.6" - -"@ethersproject/random@5.7.0", "@ethersproject/random@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.7.0.tgz#af19dcbc2484aae078bb03656ec05df66253280c" - integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" - integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.7.0.tgz#9a5f7a7824ef784f7f7680984e593a800480c9fb" - integrity sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - hash.js "1.1.7" - -"@ethersproject/signing-key@5.7.0", "@ethersproject/signing-key@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3" - integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - bn.js "^5.2.1" - elliptic "6.5.4" - hash.js "1.1.7" - -"@ethersproject/solidity@5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.7.0.tgz#5e9c911d8a2acce2a5ebb48a5e2e0af20b631cb8" - integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/sha2" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - -"@ethersproject/strings@5.7.0", "@ethersproject/strings@>=5.0.0-beta.130", "@ethersproject/strings@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" - integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.0.0-beta.135", "@ethersproject/transactions@^5.6.2", "@ethersproject/transactions@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" - integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== - dependencies: - "@ethersproject/address" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/rlp" "^5.7.0" - "@ethersproject/signing-key" "^5.7.0" - -"@ethersproject/units@5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.7.0.tgz#637b563d7e14f42deeee39245275d477aae1d8b1" - integrity sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/wallet@5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.7.0.tgz#4e5d0790d96fe21d61d38fb40324e6c7ef350b2d" - integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA== - dependencies: - "@ethersproject/abstract-provider" "^5.7.0" - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/hash" "^5.7.0" - "@ethersproject/hdnode" "^5.7.0" - "@ethersproject/json-wallets" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/random" "^5.7.0" - "@ethersproject/signing-key" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - "@ethersproject/wordlists" "^5.7.0" - -"@ethersproject/web@5.7.1", "@ethersproject/web@^5.7.0": - version "5.7.1" - resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" - integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== - dependencies: - "@ethersproject/base64" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - -"@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.7.0.tgz#8fb2c07185d68c3e09eb3bfd6e779ba2774627f5" - integrity sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/hash" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - -"@fastify/busboy@^2.0.0": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.1.tgz#b9da6a878a371829a0502c9b6c1c143ef6663f4d" - integrity sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA== - -"@firebase/analytics-types@0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@firebase/analytics-types/-/analytics-types-0.4.0.tgz#d6716f9fa36a6e340bc0ecfe68af325aa6f60508" - integrity sha512-Jj2xW+8+8XPfWGkv9HPv/uR+Qrmq37NPYT352wf7MvE9LrstpLVmFg3LqG6MCRr5miLAom5sen2gZ+iOhVDeRA== - -"@firebase/analytics@0.6.0": - version "0.6.0" - resolved "https://registry.yarnpkg.com/@firebase/analytics/-/analytics-0.6.0.tgz#49f508d3f9f419f08c503f1171ef5fa1c3ba52eb" - integrity sha512-6qYEOPUVYrMhqvJ46Z5Uf1S4uULd6d7vGpMP5Qz+u8kIWuOQGcPdJKQap+Hla6Rq164or9gC2HRXuYXKlgWfpw== - dependencies: - "@firebase/analytics-types" "0.4.0" - "@firebase/component" "0.1.19" - "@firebase/installations" "0.4.17" - "@firebase/logger" "0.2.6" - "@firebase/util" "0.3.2" - tslib "^1.11.1" - -"@firebase/app-types@0.6.1": - version "0.6.1" - resolved "https://registry.yarnpkg.com/@firebase/app-types/-/app-types-0.6.1.tgz#dcbd23030a71c0c74fc95d4a3f75ba81653850e9" - integrity sha512-L/ZnJRAq7F++utfuoTKX4CLBG5YR7tFO3PLzG1/oXXKEezJ0kRL3CMRoueBEmTCzVb/6SIs2Qlaw++uDgi5Xyg== - -"@firebase/app@0.6.11": - version "0.6.11" - resolved "https://registry.yarnpkg.com/@firebase/app/-/app-0.6.11.tgz#f73f9e4571ba62f4029d8f9c9880a97e5a94eb1d" - integrity sha512-FH++PaoyTzfTAVuJ0gITNYEIcjT5G+D0671La27MU8Vvr6MTko+5YUZ4xS9QItyotSeRF4rMJ1KR7G8LSyySiA== - dependencies: - "@firebase/app-types" "0.6.1" - "@firebase/component" "0.1.19" - "@firebase/logger" "0.2.6" - "@firebase/util" "0.3.2" - dom-storage "2.1.0" - tslib "^1.11.1" - xmlhttprequest "1.8.0" - -"@firebase/auth-interop-types@0.1.5": - version "0.1.5" - resolved "https://registry.yarnpkg.com/@firebase/auth-interop-types/-/auth-interop-types-0.1.5.tgz#9fc9bd7c879f16b8d1bb08373a0f48c3a8b74557" - integrity sha512-88h74TMQ6wXChPA6h9Q3E1Jg6TkTHep2+k63OWg3s0ozyGVMeY+TTOti7PFPzq5RhszQPQOoCi59es4MaRvgCw== - -"@firebase/auth-types@0.10.1": - version "0.10.1" - resolved "https://registry.yarnpkg.com/@firebase/auth-types/-/auth-types-0.10.1.tgz#7815e71c9c6f072034415524b29ca8f1d1770660" - integrity sha512-/+gBHb1O9x/YlG7inXfxff/6X3BPZt4zgBv4kql6HEmdzNQCodIRlEYnI+/da+lN+dha7PjaFH7C7ewMmfV7rw== - -"@firebase/auth@0.15.0": - version "0.15.0" - resolved "https://registry.yarnpkg.com/@firebase/auth/-/auth-0.15.0.tgz#45d6def6d6d9444432c005710df442991828275f" - integrity sha512-IFuzhxS+HtOQl7+SZ/Mhaghy/zTU7CENsJFWbC16tv2wfLZbayKF5jYGdAU3VFLehgC8KjlcIWd10akc3XivfQ== - dependencies: - "@firebase/auth-types" "0.10.1" - -"@firebase/component@0.1.19": - version "0.1.19" - resolved "https://registry.yarnpkg.com/@firebase/component/-/component-0.1.19.tgz#bd2ac601652c22576b574c08c40da245933dbac7" - integrity sha512-L0S3g8eqaerg8y0zox3oOHSTwn/FE8RbcRHiurnbESvDViZtP5S5WnhuAPd7FnFxa8ElWK0z1Tr3ikzWDv1xdQ== - dependencies: - "@firebase/util" "0.3.2" - tslib "^1.11.1" - -"@firebase/database-types@0.5.2": - version "0.5.2" - resolved "https://registry.yarnpkg.com/@firebase/database-types/-/database-types-0.5.2.tgz#23bec8477f84f519727f165c687761e29958b63c" - integrity sha512-ap2WQOS3LKmGuVFKUghFft7RxXTyZTDr0Xd8y2aqmWsbJVjgozi0huL/EUMgTjGFrATAjcf2A7aNs8AKKZ2a8g== - dependencies: - "@firebase/app-types" "0.6.1" - -"@firebase/database@0.6.13": - version "0.6.13" - resolved "https://registry.yarnpkg.com/@firebase/database/-/database-0.6.13.tgz#b96fe0c53757dd6404ee085fdcb45c0f9f525c17" - integrity sha512-NommVkAPzU7CKd1gyehmi3lz0K78q0KOfiex7Nfy7MBMwknLm7oNqKovXSgQV1PCLvKXvvAplDSFhDhzIf9obA== - dependencies: - "@firebase/auth-interop-types" "0.1.5" - "@firebase/component" "0.1.19" - "@firebase/database-types" "0.5.2" - "@firebase/logger" "0.2.6" - "@firebase/util" "0.3.2" - faye-websocket "0.11.3" - tslib "^1.11.1" - -"@firebase/firestore-types@1.14.0": - version "1.14.0" - resolved "https://registry.yarnpkg.com/@firebase/firestore-types/-/firestore-types-1.14.0.tgz#4516249d3c181849fd3c856831944dbd5c8c55fc" - integrity sha512-WF8IBwHzZDhwyOgQnmB0pheVrLNP78A8PGxk1nxb/Nrgh1amo4/zYvFMGgSsTeaQK37xMYS/g7eS948te/dJxw== - -"@firebase/firestore@1.18.0": - version "1.18.0" - resolved "https://registry.yarnpkg.com/@firebase/firestore/-/firestore-1.18.0.tgz#3430e8c60d3e6be1d174b3a258838b1944c93a4d" - integrity sha512-maMq4ltkrwjDRusR2nt0qS4wldHQMp+0IDSfXIjC+SNmjnWY/t/+Skn9U3Po+dB38xpz3i7nsKbs+8utpDnPSw== - dependencies: - "@firebase/component" "0.1.19" - "@firebase/firestore-types" "1.14.0" - "@firebase/logger" "0.2.6" - "@firebase/util" "0.3.2" - "@firebase/webchannel-wrapper" "0.4.0" - "@grpc/grpc-js" "^1.0.0" - "@grpc/proto-loader" "^0.5.0" - node-fetch "2.6.1" - tslib "^1.11.1" - -"@firebase/functions-types@0.3.17": - version "0.3.17" - resolved "https://registry.yarnpkg.com/@firebase/functions-types/-/functions-types-0.3.17.tgz#348bf5528b238eeeeeae1d52e8ca547b21d33a94" - integrity sha512-DGR4i3VI55KnYk4IxrIw7+VG7Q3gA65azHnZxo98Il8IvYLr2UTBlSh72dTLlDf25NW51HqvJgYJDKvSaAeyHQ== - -"@firebase/functions@0.5.1": - version "0.5.1" - resolved "https://registry.yarnpkg.com/@firebase/functions/-/functions-0.5.1.tgz#fa0568bdcdf7dfa7e5f4f66c1e06e376dc7e25b6" - integrity sha512-yyjPZXXvzFPjkGRSqFVS5Hc2Y7Y48GyyMH+M3i7hLGe69r/59w6wzgXKqTiSYmyE1pxfjxU4a1YqBDHNkQkrYQ== - dependencies: - "@firebase/component" "0.1.19" - "@firebase/functions-types" "0.3.17" - "@firebase/messaging-types" "0.5.0" - node-fetch "2.6.1" - tslib "^1.11.1" - -"@firebase/installations-types@0.3.4": - version "0.3.4" - resolved "https://registry.yarnpkg.com/@firebase/installations-types/-/installations-types-0.3.4.tgz#589a941d713f4f64bf9f4feb7f463505bab1afa2" - integrity sha512-RfePJFovmdIXb6rYwtngyxuEcWnOrzdZd9m7xAW0gRxDIjBT20n3BOhjpmgRWXo/DAxRmS7bRjWAyTHY9cqN7Q== - -"@firebase/installations@0.4.17": - version "0.4.17" - resolved "https://registry.yarnpkg.com/@firebase/installations/-/installations-0.4.17.tgz#1367b721e2c6c4880646bbc4f257e8616986a004" - integrity sha512-AE/TyzIpwkC4UayRJD419xTqZkKzxwk0FLht3Dci8WI2OEKHSwoZG9xv4hOBZebe+fDzoV2EzfatQY8c/6Avig== - dependencies: - "@firebase/component" "0.1.19" - "@firebase/installations-types" "0.3.4" - "@firebase/util" "0.3.2" - idb "3.0.2" - tslib "^1.11.1" - -"@firebase/logger@0.2.6": - version "0.2.6" - resolved "https://registry.yarnpkg.com/@firebase/logger/-/logger-0.2.6.tgz#3aa2ca4fe10327cabf7808bd3994e88db26d7989" - integrity sha512-KIxcUvW/cRGWlzK9Vd2KB864HlUnCfdTH0taHE0sXW5Xl7+W68suaeau1oKNEqmc3l45azkd4NzXTCWZRZdXrw== - -"@firebase/messaging-types@0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@firebase/messaging-types/-/messaging-types-0.5.0.tgz#c5d0ef309ced1758fda93ef3ac70a786de2e73c4" - integrity sha512-QaaBswrU6umJYb/ZYvjR5JDSslCGOH6D9P136PhabFAHLTR4TWjsaACvbBXuvwrfCXu10DtcjMxqfhdNIB1Xfg== - -"@firebase/messaging@0.7.1": - version "0.7.1" - resolved "https://registry.yarnpkg.com/@firebase/messaging/-/messaging-0.7.1.tgz#debbe7eb17c5b789231da6c166c506e19ecf1ed4" - integrity sha512-iev/ST9v0xd/8YpGYrZtDcqdD9J6ZWzSuceRn8EKy5vIgQvW/rk2eTQc8axzvDpQ36ZfphMYuhW6XuNrR3Pd2Q== - dependencies: - "@firebase/component" "0.1.19" - "@firebase/installations" "0.4.17" - "@firebase/messaging-types" "0.5.0" - "@firebase/util" "0.3.2" - idb "3.0.2" - tslib "^1.11.1" - -"@firebase/performance-types@0.0.13": - version "0.0.13" - resolved "https://registry.yarnpkg.com/@firebase/performance-types/-/performance-types-0.0.13.tgz#58ce5453f57e34b18186f74ef11550dfc558ede6" - integrity sha512-6fZfIGjQpwo9S5OzMpPyqgYAUZcFzZxHFqOyNtorDIgNXq33nlldTL/vtaUZA8iT9TT5cJlCrF/jthKU7X21EA== - -"@firebase/performance@0.4.2": - version "0.4.2" - resolved "https://registry.yarnpkg.com/@firebase/performance/-/performance-0.4.2.tgz#d5f134674b429d095ce0edfb50fcb4ab279c3cbe" - integrity sha512-irHTCVWJ/sxJo0QHg+yQifBeVu8ZJPihiTqYzBUz/0AGc51YSt49FZwqSfknvCN2+OfHaazz/ARVBn87g7Ex8g== - dependencies: - "@firebase/component" "0.1.19" - "@firebase/installations" "0.4.17" - "@firebase/logger" "0.2.6" - "@firebase/performance-types" "0.0.13" - "@firebase/util" "0.3.2" - tslib "^1.11.1" - -"@firebase/polyfill@0.3.36": - version "0.3.36" - resolved "https://registry.yarnpkg.com/@firebase/polyfill/-/polyfill-0.3.36.tgz#c057cce6748170f36966b555749472b25efdb145" - integrity sha512-zMM9oSJgY6cT2jx3Ce9LYqb0eIpDE52meIzd/oe/y70F+v9u1LDqk5kUF5mf16zovGBWMNFmgzlsh6Wj0OsFtg== - dependencies: - core-js "3.6.5" - promise-polyfill "8.1.3" - whatwg-fetch "2.0.4" - -"@firebase/remote-config-types@0.1.9": - version "0.1.9" - resolved "https://registry.yarnpkg.com/@firebase/remote-config-types/-/remote-config-types-0.1.9.tgz#fe6bbe4d08f3b6e92fce30e4b7a9f4d6a96d6965" - integrity sha512-G96qnF3RYGbZsTRut7NBX0sxyczxt1uyCgXQuH/eAfUCngxjEGcZQnBdy6mvSdqdJh5mC31rWPO4v9/s7HwtzA== - -"@firebase/remote-config@0.1.28": - version "0.1.28" - resolved "https://registry.yarnpkg.com/@firebase/remote-config/-/remote-config-0.1.28.tgz#1c39916446f1ed82b4c07e556455bd232fcfd8e1" - integrity sha512-4zSdyxpt94jAnFhO8toNjG8oMKBD+xTuBIcK+Nw8BdQWeJhEamgXlupdBARUk1uf3AvYICngHH32+Si/dMVTbw== - dependencies: - "@firebase/component" "0.1.19" - "@firebase/installations" "0.4.17" - "@firebase/logger" "0.2.6" - "@firebase/remote-config-types" "0.1.9" - "@firebase/util" "0.3.2" - tslib "^1.11.1" - -"@firebase/storage-types@0.3.13": - version "0.3.13" - resolved "https://registry.yarnpkg.com/@firebase/storage-types/-/storage-types-0.3.13.tgz#cd43e939a2ab5742e109eb639a313673a48b5458" - integrity sha512-pL7b8d5kMNCCL0w9hF7pr16POyKkb3imOW7w0qYrhBnbyJTdVxMWZhb0HxCFyQWC0w3EiIFFmxoz8NTFZDEFog== - -"@firebase/storage@0.3.43": - version "0.3.43" - resolved "https://registry.yarnpkg.com/@firebase/storage/-/storage-0.3.43.tgz#107fb5db2eff2561b5c4e35ee4cbff48f28c7e77" - integrity sha512-Jp54jcuyimLxPhZHFVAhNbQmgTu3Sda7vXjXrNpPEhlvvMSq4yuZBR6RrZxe/OrNVprLHh/6lTCjwjOVSo3bWA== - dependencies: - "@firebase/component" "0.1.19" - "@firebase/storage-types" "0.3.13" - "@firebase/util" "0.3.2" - tslib "^1.11.1" - -"@firebase/util@0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@firebase/util/-/util-0.3.2.tgz#87de27f9cffc2324651cabf6ec133d0a9eb21b52" - integrity sha512-Dqs00++c8rwKky6KCKLLY2T1qYO4Q+X5t+lF7DInXDNF4ae1Oau35bkD+OpJ9u7l1pEv7KHowP6CUKuySCOc8g== - dependencies: - tslib "^1.11.1" - -"@firebase/webchannel-wrapper@0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.4.0.tgz#becce788818d3f47f0ac1a74c3c061ac1dcf4f6d" - integrity sha512-8cUA/mg0S+BxIZ72TdZRsXKBP5n5uRcE3k29TZhZw6oIiHBt9JA7CTb/4pE1uKtE/q5NeTY2tBDcagoZ+1zjXQ== - -"@grpc/grpc-js@^1.0.0": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.11.1.tgz#a92f33e98f1959feffcd1b25a33b113d2c977b70" - integrity sha512-gyt/WayZrVPH2w/UTLansS7F9Nwld472JxxaETamrM8HNlsa+jSLNyKAZmhxI2Me4c3mQHFiS1wWHDY1g1Kthw== - dependencies: - "@grpc/proto-loader" "^0.7.13" - "@js-sdsl/ordered-map" "^4.4.2" - -"@grpc/proto-loader@^0.5.0": - version "0.5.6" - resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.5.6.tgz#1dea4b8a6412b05e2d58514d507137b63a52a98d" - integrity sha512-DT14xgw3PSzPxwS13auTEwxhMMOoz33DPUKNtmYK/QYbBSpLXJy78FGGs5yVoxVobEqPm4iW9MOIoz0A3bLTRQ== - dependencies: - lodash.camelcase "^4.3.0" - protobufjs "^6.8.6" - -"@grpc/proto-loader@^0.7.13": - version "0.7.13" - resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.13.tgz#f6a44b2b7c9f7b609f5748c6eac2d420e37670cf" - integrity sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw== - dependencies: - lodash.camelcase "^4.3.0" - long "^5.0.0" - protobufjs "^7.2.5" - yargs "^17.7.2" - -"@js-sdsl/ordered-map@^4.4.2": - version "4.4.2" - resolved "https://registry.yarnpkg.com/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz#9299f82874bab9e4c7f9c48d865becbfe8d6907c" - integrity sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw== - -"@ljharb/resumer@~0.0.1": - version "0.0.1" - resolved "https://registry.yarnpkg.com/@ljharb/resumer/-/resumer-0.0.1.tgz#8a940a9192dd31f6a1df17564bbd26dc6ad3e68d" - integrity sha512-skQiAOrCfO7vRTq53cxznMpks7wS1va95UCidALlOVWqvBAzwPVErwizDwoMqNVMEn1mDq0utxZd02eIrvF1lw== - dependencies: - "@ljharb/through" "^2.3.9" - -"@ljharb/through@^2.3.9", "@ljharb/through@~2.3.9": - version "2.3.13" - resolved "https://registry.yarnpkg.com/@ljharb/through/-/through-2.3.13.tgz#b7e4766e0b65aa82e529be945ab078de79874edc" - integrity sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ== - dependencies: - call-bind "^1.0.7" - -"@metamask/eth-sig-util@^4.0.0": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz#3ad61f6ea9ad73ba5b19db780d40d9aae5157088" - integrity sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ== - dependencies: - ethereumjs-abi "^0.6.8" - ethereumjs-util "^6.2.1" - ethjs-util "^0.1.6" - tweetnacl "^1.0.3" - tweetnacl-util "^0.15.1" - -"@near-js/accounts@1.3.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@near-js/accounts/-/accounts-1.3.0.tgz#388761d164c64b03d3e42315d2e5346ee22fbf97" - integrity sha512-syUgc7EanfN2sX2UJsmJIcZ6OuQ5Ilr/GoVSD8MVOV7B5dT1HZSkMuIBdu+pKfmBbG3EGUOoT8Txxs8Nx96gGA== - dependencies: - "@near-js/crypto" "1.4.0" - "@near-js/providers" "1.0.0" - "@near-js/signers" "0.2.0" - "@near-js/transactions" "1.3.0" - "@near-js/types" "0.3.0" - "@near-js/utils" "1.0.0" - "@noble/hashes" "1.3.3" - borsh "1.0.0" - depd "2.0.0" - is-my-json-valid "^2.20.6" - isomorphic-unfetch "^3.1.0" - lru_map "0.4.1" - near-abi "0.1.1" - -"@near-js/crypto@1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@near-js/crypto/-/crypto-1.4.0.tgz#52717d7aa0baf5429b0d5a1971a3c9a6e0aeedd9" - integrity sha512-2SYS7LyFz2/y8idqAyyS4jf3pn6zFg4tLbOq9OlB+MTZhvsnUcWW+HLznyBytp6dW8lAQ03E+Ew0bYfJSCIJJw== - dependencies: - "@near-js/types" "0.3.0" - "@near-js/utils" "1.0.0" - "@noble/curves" "1.2.0" - borsh "1.0.0" - randombytes "2.1.0" - secp256k1 "5.0.0" - -"@near-js/keystores-browser@0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@near-js/keystores-browser/-/keystores-browser-0.2.0.tgz#d6cab4b52615e49fea5a1c9fa537d428a30cf0e5" - integrity sha512-vR6XY5ztAzXwNqEipfkwfG6M8PiNNgdDAdogTQBm0FKQUegMsxbMN6x4UyTd1v0oQAzuRmYGwTLmTxQyzH1FQA== - dependencies: - "@near-js/crypto" "1.4.0" - "@near-js/keystores" "0.2.0" - -"@near-js/keystores-node@0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@near-js/keystores-node/-/keystores-node-0.1.0.tgz#19baea9d2e492e786be68b8c8b9e0b8c5a4d1b69" - integrity sha512-SOtwrXWwGRbYqqu6TOO3jcCDkzSw+UG+SWVh5VbeTgHIzqR1CI4r4qhyXuTWZPyewJPDogO1ggepQi9NhfkJmA== - dependencies: - "@near-js/crypto" "1.4.0" - "@near-js/keystores" "0.2.0" - -"@near-js/keystores@0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@near-js/keystores/-/keystores-0.2.0.tgz#f309716381d3acf402951a96cb6fa551fe1950d2" - integrity sha512-vZiyx9whLlA7/EDdkZGf//0AL2FWAUyGpVhWIHcbJZwQ7DNcjpkb0tRydFp8Yk4bb7kcYnoyksSeRx9kQUMyjA== - dependencies: - "@near-js/crypto" "1.4.0" - "@near-js/types" "0.3.0" - -"@near-js/providers@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@near-js/providers/-/providers-1.0.0.tgz#72faaf6e335ee515abee941b09bd1a19b0c7857f" - integrity sha512-1++g0tVuHQWewkdmom3Iz5BSVT+KHgG7TX5YHywecg4uGLGhaf5oX1EPCXf/CYnTV61FjaNGIrIMNgwbGzacpw== - dependencies: - "@near-js/transactions" "1.3.0" - "@near-js/types" "0.3.0" - "@near-js/utils" "1.0.0" - borsh "1.0.0" - exponential-backoff "^3.1.1" - isomorphic-unfetch "^3.1.0" - optionalDependencies: - node-fetch "2.6.7" - -"@near-js/signers@0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@near-js/signers/-/signers-0.2.0.tgz#acedfb7366fc54d049e1a5b95a8b6a1b71840b09" - integrity sha512-plzTnjI7IodTtMwGe2m1bg1ZwGeHeKanJqVoXFypZj7gOuuqVOi+9vcHdSu7T2McnzRujPQbj31PmfDQ3O3YCw== - dependencies: - "@near-js/crypto" "1.4.0" - "@near-js/keystores" "0.2.0" - "@noble/hashes" "1.3.3" - -"@near-js/transactions@1.3.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@near-js/transactions/-/transactions-1.3.0.tgz#d8801c449c3609d2bb4e7a7b93c1d28d272f160d" - integrity sha512-M9DuFX009E5twEbPV9Fs67nNu8T8segE7yG57q02MmPMOQ7RDanHA2fKqARsltTZ26EEXb92x3lAKt7qFdCfCw== - dependencies: - "@near-js/crypto" "1.4.0" - "@near-js/signers" "0.2.0" - "@near-js/types" "0.3.0" - "@near-js/utils" "1.0.0" - "@noble/hashes" "1.3.3" - borsh "1.0.0" - -"@near-js/types@0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@near-js/types/-/types-0.3.0.tgz#aa5fa1097c338166c5401bfb16de26385c3ddc74" - integrity sha512-IwayA5Wa4+hryo22AuAYIu5a/nOAheF/Bmz9kpuouX9L4he+Tc8xAt5NfE60zXG7tsukAw1QAaHE1kBzhmwtKw== - -"@near-js/utils@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@near-js/utils/-/utils-1.0.0.tgz#10d94a2b4c307ee7e44775a723a0005eb293735a" - integrity sha512-4dd6fDgWZnG+0VSKPBA3czEQdi9UotepdwcEKLTbXepIL1FX2ZlQV6HVi7KYmrAVwv1ims11vGnWzJWKy46ULw== - dependencies: - "@near-js/types" "0.3.0" - bs58 "4.0.0" - depd "2.0.0" - mustache "4.0.0" - -"@near-js/wallet-account@1.3.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@near-js/wallet-account/-/wallet-account-1.3.0.tgz#9b3e3aee5f2afbaaa2da6f58daad3cd5f8ecb6e8" - integrity sha512-5gqwLXZsGkDMnEIZU7HnJEFol7ICno7wCnwGXHl7VhjBzve5OfaRt/IQpQitogoAUlonpQYmOi2r5qu76nj1lw== - dependencies: - "@near-js/accounts" "1.3.0" - "@near-js/crypto" "1.4.0" - "@near-js/keystores" "0.2.0" - "@near-js/providers" "1.0.0" - "@near-js/signers" "0.2.0" - "@near-js/transactions" "1.3.0" - "@near-js/types" "0.3.0" - "@near-js/utils" "1.0.0" - borsh "1.0.0" - -"@noble/curves@1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.2.0.tgz#92d7e12e4e49b23105a2555c6984d41733d65c35" - integrity sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw== - dependencies: - "@noble/hashes" "1.3.2" - -"@noble/curves@1.4.2", "@noble/curves@~1.4.0": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.4.2.tgz#40309198c76ed71bc6dbf7ba24e81ceb4d0d1fe9" - integrity sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw== - dependencies: - "@noble/hashes" "1.4.0" - -"@noble/hashes@1.2.0", "@noble/hashes@~1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.2.0.tgz#a3150eeb09cc7ab207ebf6d7b9ad311a9bdbed12" - integrity sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ== - -"@noble/hashes@1.3.2": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39" - integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== - -"@noble/hashes@1.3.3": - version "1.3.3" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.3.tgz#39908da56a4adc270147bb07968bf3b16cfe1699" - integrity sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA== - -"@noble/hashes@1.4.0", "@noble/hashes@~1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" - integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== - -"@noble/hashes@^1.2.0", "@noble/hashes@^1.4.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.5.0.tgz#abadc5ca20332db2b1b2aa3e496e9af1213570b0" - integrity sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA== - -"@noble/secp256k1@1.7.1", "@noble/secp256k1@~1.7.0": - version "1.7.1" - resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c" - integrity sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw== - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@nomicfoundation/edr-darwin-arm64@0.5.2": - version "0.5.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.5.2.tgz#72f7a826c9f0f2c91308edca562de3b9484ac079" - integrity sha512-Gm4wOPKhbDjGTIRyFA2QUAPfCXA1AHxYOKt3yLSGJkQkdy9a5WW+qtqKeEKHc/+4wpJSLtsGQfpzyIzggFfo/A== - -"@nomicfoundation/edr-darwin-x64@0.5.2": - version "0.5.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.5.2.tgz#6d0fedb219d664631c6feddc596ab8c3bbc36fa8" - integrity sha512-ClyABq2dFCsrYEED3/UIO0c7p4H1/4vvlswFlqUyBpOkJccr75qIYvahOSJRM62WgUFRhbSS0OJXFRwc/PwmVg== - -"@nomicfoundation/edr-linux-arm64-gnu@0.5.2": - version "0.5.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.5.2.tgz#60e4d52d963141bc2bb4a02639dc590a7fbdda2f" - integrity sha512-HWMTVk1iOabfvU2RvrKLDgtFjJZTC42CpHiw2h6rfpsgRqMahvIlx2jdjWYzFNy1jZKPTN1AStQ/91MRrg5KnA== - -"@nomicfoundation/edr-linux-arm64-musl@0.5.2": - version "0.5.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.5.2.tgz#6676a09eab57c435a16ffc144658c896acca9baa" - integrity sha512-CwsQ10xFx/QAD5y3/g5alm9+jFVuhc7uYMhrZAu9UVF+KtVjeCvafj0PaVsZ8qyijjqVuVsJ8hD1x5ob7SMcGg== - -"@nomicfoundation/edr-linux-x64-gnu@0.5.2": - version "0.5.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.5.2.tgz#f558d9697ce961410e7a7468f9ab8c8a601b9df6" - integrity sha512-CWVCEdhWJ3fmUpzWHCRnC0/VLBDbqtqTGTR6yyY1Ep3S3BOrHEAvt7h5gx85r2vLcztisu2vlDq51auie4IU1A== - -"@nomicfoundation/edr-linux-x64-musl@0.5.2": - version "0.5.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.5.2.tgz#c9c9cbb2997499f75c1d022be724b0551d44569f" - integrity sha512-+aJDfwhkddy2pP5u1ISg3IZVAm0dO836tRlDTFWtvvSMQ5hRGqPcWwlsbobhDQsIxhPJyT7phL0orCg5W3WMeA== - -"@nomicfoundation/edr-win32-x64-msvc@0.5.2": - version "0.5.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.5.2.tgz#f16db88bf4fe09a996af0a25096e09deecb72bfa" - integrity sha512-CcvvuA3sAv7liFNPsIR/68YlH6rrybKzYttLlMr80d4GKJjwJ5OKb3YgE6FdZZnOfP19HEHhsLcE0DPLtY3r0w== - -"@nomicfoundation/edr@^0.5.2": - version "0.5.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr/-/edr-0.5.2.tgz#e8c7b3d3dd4a312432ab3930dec60f76dc5c4926" - integrity sha512-hW/iLvUQZNTVjFyX/I40rtKvvDOqUEyIi96T28YaLfmPL+3LW2lxmYLUXEJ6MI14HzqxDqrLyhf6IbjAa2r3Dw== - dependencies: - "@nomicfoundation/edr-darwin-arm64" "0.5.2" - "@nomicfoundation/edr-darwin-x64" "0.5.2" - "@nomicfoundation/edr-linux-arm64-gnu" "0.5.2" - "@nomicfoundation/edr-linux-arm64-musl" "0.5.2" - "@nomicfoundation/edr-linux-x64-gnu" "0.5.2" - "@nomicfoundation/edr-linux-x64-musl" "0.5.2" - "@nomicfoundation/edr-win32-x64-msvc" "0.5.2" - -"@nomicfoundation/ethereumjs-common@4.0.4": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.4.tgz#9901f513af2d4802da87c66d6f255b510bef5acb" - integrity sha512-9Rgb658lcWsjiicr5GzNCjI1llow/7r0k50dLL95OJ+6iZJcVbi15r3Y0xh2cIO+zgX0WIHcbzIu6FeQf9KPrg== - dependencies: - "@nomicfoundation/ethereumjs-util" "9.0.4" - -"@nomicfoundation/ethereumjs-rlp@5.0.4": - version "5.0.4" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.4.tgz#66c95256fc3c909f6fb18f6a586475fc9762fa30" - integrity sha512-8H1S3s8F6QueOc/X92SdrA4RDenpiAEqMg5vJH99kcQaCy/a3Q6fgseo75mgWlbanGJXSlAPtnCeG9jvfTYXlw== - -"@nomicfoundation/ethereumjs-tx@5.0.4": - version "5.0.4" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.4.tgz#b0ceb58c98cc34367d40a30d255d6315b2f456da" - integrity sha512-Xjv8wAKJGMrP1f0n2PeyfFCCojHd7iS3s/Ab7qzF1S64kxZ8Z22LCMynArYsVqiFx6rzYy548HNVEyI+AYN/kw== - dependencies: - "@nomicfoundation/ethereumjs-common" "4.0.4" - "@nomicfoundation/ethereumjs-rlp" "5.0.4" - "@nomicfoundation/ethereumjs-util" "9.0.4" - ethereum-cryptography "0.1.3" - -"@nomicfoundation/ethereumjs-util@9.0.4": - version "9.0.4" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.4.tgz#84c5274e82018b154244c877b76bc049a4ed7b38" - integrity sha512-sLOzjnSrlx9Bb9EFNtHzK/FJFsfg2re6bsGqinFinH1gCqVfz9YYlXiMWwDM4C/L4ywuHFCYwfKTVr/QHQcU0Q== - dependencies: - "@nomicfoundation/ethereumjs-rlp" "5.0.4" - ethereum-cryptography "0.1.3" - -"@nomicfoundation/hardhat-chai-matchers@^2.0.6": - version "2.0.7" - resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-2.0.7.tgz#89d90b2d77a00f6fd8fe42eabe40a82b5e065075" - integrity sha512-RQfsiTwdf0SP+DtuNYvm4921X6VirCQq0Xyh+mnuGlTwEFSPZ/o27oQC+l+3Y/l48DDU7+ZcYBR+Fp+Rp94LfQ== - dependencies: - "@types/chai-as-promised" "^7.1.3" - chai-as-promised "^7.1.1" - deep-eql "^4.0.1" - ordinal "^1.0.3" - -"@nomicfoundation/hardhat-ethers@^3.0.6": - version "3.0.8" - resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-ethers/-/hardhat-ethers-3.0.8.tgz#af078f566373abeb77e11cbe69fe3dd47f8bfc27" - integrity sha512-zhOZ4hdRORls31DTOqg+GmEZM0ujly8GGIuRY7t7szEk2zW/arY1qDug/py8AEktT00v5K+b6RvbVog+va51IA== - dependencies: - debug "^4.1.1" - lodash.isequal "^4.5.0" - -"@nomicfoundation/hardhat-verify@^2.0.7": - version "2.0.10" - resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-verify/-/hardhat-verify-2.0.10.tgz#e9bae0949c17d5cc77bb5f97c273263048c69550" - integrity sha512-3zoTZGQhpeOm6piJDdsGb6euzZAd7N5Tk0zPQvGnfKQ0+AoxKz/7i4if12goi8IDTuUGElAUuZyQB8PMQoXA5g== - dependencies: - "@ethersproject/abi" "^5.1.2" - "@ethersproject/address" "^5.0.2" - cbor "^8.1.0" - chalk "^2.4.2" - debug "^4.1.1" - lodash.clonedeep "^4.5.0" - semver "^6.3.0" - table "^6.8.0" - undici "^5.14.0" - -"@nomicfoundation/slang-darwin-arm64@0.17.0": - version "0.17.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/slang-darwin-arm64/-/slang-darwin-arm64-0.17.0.tgz#8cded3c24322624e3b6618760caba8e840bd1c1d" - integrity sha512-O0q94EUtoWy9A5kOTOa9/khtxXDYnLqmuda9pQELurSiwbQEVCPQL8kb34VbOW+ifdre66JM/05Xw9JWhIZ9sA== - -"@nomicfoundation/slang-darwin-x64@0.17.0": - version "0.17.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/slang-darwin-x64/-/slang-darwin-x64-0.17.0.tgz#6ebeb33a2ced89fc6023f6cda4af96403486038a" - integrity sha512-IaDbHzvT08sBK2HyGzonWhq1uu8IxdjmTqAWHr25Oh/PYnamdi8u4qchZXXYKz/DHLoYN3vIpBXoqLQIomhD/g== - -"@nomicfoundation/slang-linux-arm64-gnu@0.17.0": - version "0.17.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/slang-linux-arm64-gnu/-/slang-linux-arm64-gnu-0.17.0.tgz#41c7e57a9b1a3aee6911f0cab22e683c149fb470" - integrity sha512-Lj4anvOsQZxs1SycG8VyT2Rl2oqIhyLSUCgGepTt3CiJ/bM+8r8bLJIgh8vKkki4BWz49YsYIgaJB2IPv8FFTw== - -"@nomicfoundation/slang-linux-arm64-musl@0.17.0": - version "0.17.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/slang-linux-arm64-musl/-/slang-linux-arm64-musl-0.17.0.tgz#9c4b51689274ae75c2c8a4cddd2e1cc0a79c191d" - integrity sha512-/xkTCa9d5SIWUBQE3BmLqDFfJRr4yUBwbl4ynPiGUpRXrD69cs6pWKkwjwz/FdBpXqVo36I+zY95qzoTj/YhOA== - -"@nomicfoundation/slang-linux-x64-gnu@0.17.0": - version "0.17.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/slang-linux-x64-gnu/-/slang-linux-x64-gnu-0.17.0.tgz#c3a3b6a7b775fc617832958d10e6664bf86d39d0" - integrity sha512-oe5IO5vntOqYvTd67deCHPIWuSuWm6aYtT2/0Kqz2/VLtGz4ClEulBSRwfnNzBVtw2nksWipE1w8BzhImI7Syg== - -"@nomicfoundation/slang-linux-x64-musl@0.17.0": - version "0.17.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/slang-linux-x64-musl/-/slang-linux-x64-musl-0.17.0.tgz#725118ff99a7217b9f1d1bd84411d9442084077d" - integrity sha512-PpYCI5K/kgLAMXaPY0V4VST5gCDprEOh7z/47tbI8kJQumI5odjsj/Cs8MpTo7/uRH6flKYbVNgUzcocWVYrAQ== - -"@nomicfoundation/slang-win32-arm64-msvc@0.17.0": - version "0.17.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/slang-win32-arm64-msvc/-/slang-win32-arm64-msvc-0.17.0.tgz#9c8bc4ccf21eaaac0cfcb6d3954ede4e2dea4c02" - integrity sha512-u/Mkf7OjokdBilP7QOJj6QYJU4/mjkbKnTX21wLyCIzeVWS7yafRPYpBycKIBj2pRRZ6ceAY5EqRpb0aiCq+0Q== - -"@nomicfoundation/slang-win32-ia32-msvc@0.17.0": - version "0.17.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/slang-win32-ia32-msvc/-/slang-win32-ia32-msvc-0.17.0.tgz#3fc5d00a3f8c1d85a5e94146af78a5526a4f3d27" - integrity sha512-XJBVQfNnZQUv0tP2JSJ573S+pmgrLWgqSZOGaMllnB/TL1gRci4Z7dYRJUF2s82GlRJE+FHSI2Ro6JISKmlXCg== - -"@nomicfoundation/slang-win32-x64-msvc@0.17.0": - version "0.17.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/slang-win32-x64-msvc/-/slang-win32-x64-msvc-0.17.0.tgz#f6a5e3250fa07cbda49151edeb80f09090e5b71a" - integrity sha512-zPGsAeiTfqfPNYHD8BfrahQmYzA78ZraoHKTGraq/1xwJwzBK4bu/NtvVA4pJjBV+B4L6DCxVhSbpn40q26JQA== - -"@nomicfoundation/slang@^0.17.0": - version "0.17.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/slang/-/slang-0.17.0.tgz#d9c25cd711ebf3490c9d0c99e9b4ca2481341a6b" - integrity sha512-1GlkGRcGpVnjFw9Z1vvDKOKo2mzparFt7qrl2pDxWp+jrVtlvej98yCMX52pVyrYE7ZeOSZFnx/DtsSgoukStQ== - dependencies: - "@nomicfoundation/slang-darwin-arm64" "0.17.0" - "@nomicfoundation/slang-darwin-x64" "0.17.0" - "@nomicfoundation/slang-linux-arm64-gnu" "0.17.0" - "@nomicfoundation/slang-linux-arm64-musl" "0.17.0" - "@nomicfoundation/slang-linux-x64-gnu" "0.17.0" - "@nomicfoundation/slang-linux-x64-musl" "0.17.0" - "@nomicfoundation/slang-win32-arm64-msvc" "0.17.0" - "@nomicfoundation/slang-win32-ia32-msvc" "0.17.0" - "@nomicfoundation/slang-win32-x64-msvc" "0.17.0" - -"@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.2.tgz#3a9c3b20d51360b20affb8f753e756d553d49557" - integrity sha512-JaqcWPDZENCvm++lFFGjrDd8mxtf+CtLd2MiXvMNTBD33dContTZ9TWETwNFwg7JTJT5Q9HEecH7FA+HTSsIUw== - -"@nomicfoundation/solidity-analyzer-darwin-x64@0.1.2": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.2.tgz#74dcfabeb4ca373d95bd0d13692f44fcef133c28" - integrity sha512-fZNmVztrSXC03e9RONBT+CiksSeYcxI1wlzqyr0L7hsQlK1fzV+f04g2JtQ1c/Fe74ZwdV6aQBdd6Uwl1052sw== - -"@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.2": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.2.tgz#4af5849a89e5a8f511acc04f28eb5d4460ba2b6a" - integrity sha512-3d54oc+9ZVBuB6nbp8wHylk4xh0N0Gc+bk+/uJae+rUgbOBwQSfuGIbAZt1wBXs5REkSmynEGcqx6DutoK0tPA== - -"@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.2": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.2.tgz#54036808a9a327b2ff84446c130a6687ee702a8e" - integrity sha512-iDJfR2qf55vgsg7BtJa7iPiFAsYf2d0Tv/0B+vhtnI16+wfQeTbP7teookbGvAo0eJo7aLLm0xfS/GTkvHIucA== - -"@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.2": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.2.tgz#466cda0d6e43691986c944b909fc6dbb8cfc594e" - integrity sha512-9dlHMAt5/2cpWyuJ9fQNOUXFB/vgSFORg1jpjX1Mh9hJ/MfZXlDdHQ+DpFCs32Zk5pxRBb07yGvSHk9/fezL+g== - -"@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.2": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.2.tgz#2b35826987a6e94444140ac92310baa088ee7f94" - integrity sha512-GzzVeeJob3lfrSlDKQw2bRJ8rBf6mEYaWY+gW0JnTDHINA0s2gPR4km5RLIj1xeZZOYz4zRw+AEeYgLRqB2NXg== - -"@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.2": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.2.tgz#e6363d13b8709ca66f330562337dbc01ce8bbbd9" - integrity sha512-Fdjli4DCcFHb4Zgsz0uEJXZ2K7VEO+w5KVv7HmT7WO10iODdU9csC2az4jrhEsRtiR9Gfd74FlG0NYlw1BMdyA== - -"@nomicfoundation/solidity-analyzer@^0.1.0": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.2.tgz#8bcea7d300157bf3a770a851d9f5c5e2db34ac55" - integrity sha512-q4n32/FNKIhQ3zQGGw5CvPF6GTvDCpYwIf7bEY/dZTZbgfDsHyjJwURxUJf3VQuuJj+fDIFl4+KkBVbw4Ef6jA== - optionalDependencies: - "@nomicfoundation/solidity-analyzer-darwin-arm64" "0.1.2" - "@nomicfoundation/solidity-analyzer-darwin-x64" "0.1.2" - "@nomicfoundation/solidity-analyzer-linux-arm64-gnu" "0.1.2" - "@nomicfoundation/solidity-analyzer-linux-arm64-musl" "0.1.2" - "@nomicfoundation/solidity-analyzer-linux-x64-gnu" "0.1.2" - "@nomicfoundation/solidity-analyzer-linux-x64-musl" "0.1.2" - "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.1.2" - -"@nomiclabs/hardhat-etherscan@^3.1.0": - version "3.1.8" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.8.tgz#3c12ee90b3733e0775e05111146ef9418d4f5a38" - integrity sha512-v5F6IzQhrsjHh6kQz4uNrym49brK9K5bYCq2zQZ729RYRaifI9hHbtmK+KkIVevfhut7huQFEQ77JLRMAzWYjQ== - dependencies: - "@ethersproject/abi" "^5.1.2" - "@ethersproject/address" "^5.0.2" - cbor "^8.1.0" - chalk "^2.4.2" - debug "^4.1.1" - fs-extra "^7.0.1" - lodash "^4.17.11" - semver "^6.3.0" - table "^6.8.0" - undici "^5.14.0" - -"@openzeppelin/cli@^2.8.1": - version "2.8.2" - resolved "https://registry.yarnpkg.com/@openzeppelin/cli/-/cli-2.8.2.tgz#b569c55f8c291ac4c7a16ca1b584ee2b4063a7f2" - integrity sha512-K0m1UAywnweAwzbwwmqI+JSezDRnqDRWkKQMI2VV6T03LOXcG/L9oqO9KRORI8md+KbxBW9v5rmNV63wGQIRlA== - dependencies: - "@openzeppelin/fuzzy-solidity-import-parser" "^0.1.2" - "@openzeppelin/upgrades" "2.8.0" - "@types/fs-extra" "^7.0.0" - "@types/npm" "^2.0.29" - "@types/semver" "^5.5.0" - ajv "^6.10.0" - axios "^0.18.0" - bignumber.js "^8.0.2" - chalk "^2.4.1" - cheerio "^1.0.0-rc.2" - commander "^2.15.1" - env-paths "^2.2.0" - ethereumjs-util "^6.1.0" - find-up "^3.0.0" - firebase "^7.8.0" - fs-extra "^7.0.1" - glob "^7.1.6" - inquirer "^6.4.1" - is-url "^1.2.4" - lockfile "^1.0.4" - npm-programmatic "0.0.12" - rlp "^2.2.3" - semver "^5.5.0" - simple-git "^1.110.0" - solc-wrapper "^0.6.3" - spinnies "^0.3.0" - toposort "^2.0.2" - truffle-config "1.1.16" - ts-generator "^0.0.8" - typechain "^1.0.3" - typechain-target-truffle "^1.0.1" - typechain-target-web3-v1 "^1.0.1" - underscore "^1.9.1" - uuid "^3.3.3" - web3 "1.2.2" - web3-eth "1.2.2" - web3-eth-contract "1.2.2" - web3-utils "1.2.2" - -"@openzeppelin/contract-loader@^0.6.2": - version "0.6.3" - resolved "https://registry.yarnpkg.com/@openzeppelin/contract-loader/-/contract-loader-0.6.3.tgz#61a7b44de327e40b7d53f39e0fb59bbf847335c3" - integrity sha512-cOFIjBjwbGgZhDZsitNgJl0Ye1rd5yu/Yx5LMgeq3u0ZYzldm4uObzHDFq4gjDdoypvyORjjJa3BlFA7eAnVIg== - dependencies: - find-up "^4.1.0" - fs-extra "^8.1.0" - -"@openzeppelin/contracts-upgradeable@^5.0.2": - version "5.0.2" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-5.0.2.tgz#3e5321a2ecdd0b206064356798c21225b6ec7105" - integrity sha512-0MmkHSHiW2NRFiT9/r5Lu4eJq5UJ4/tzlOgYXNAIj/ONkQTVnz22pLxDvp4C4uZ9he7ZFvGn3Driptn1/iU7tQ== - -"@openzeppelin/contracts@^5.0.2": - version "5.0.2" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-5.0.2.tgz#b1d03075e49290d06570b2fd42154d76c2a5d210" - integrity sha512-ytPc6eLGcHHnapAZ9S+5qsdomhjo6QBHTDRRBFfTxXIpsicMhVPouPgmUPebZZZGX7vt9USA+Z+0M0dSVtSUEA== - -"@openzeppelin/defender-sdk-base-client@1.14.3", "@openzeppelin/defender-sdk-base-client@^1.10.0": - version "1.14.3" - resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-base-client/-/defender-sdk-base-client-1.14.3.tgz#f44d6cdf709c1cfd44f5f5120679eb7c81678e71" - integrity sha512-4yG9E8N1c/ZP2jNR+Ah19wi7SBKpauAV/VcYcm7rg1dltDbzbH/oZnnXJlymT7IfjTPXkKHW8TPsaqz3EjS7tA== - dependencies: - amazon-cognito-identity-js "^6.3.6" - async-retry "^1.3.3" - -"@openzeppelin/defender-sdk-deploy-client@^1.10.0": - version "1.14.3" - resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-deploy-client/-/defender-sdk-deploy-client-1.14.3.tgz#4676f454ba333664174edcf8c419a1fc0d04e780" - integrity sha512-51WIZJz251lndK7uQU4gBE0gBX+2ZNTgf+hemtJUEPCpHtkooBRFFMID3EPGMKXVqf872pU8K3Huu9PyYQu6bw== - dependencies: - "@openzeppelin/defender-sdk-base-client" "1.14.3" - axios "^1.7.2" - lodash "^4.17.21" - -"@openzeppelin/defender-sdk-network-client@^1.10.0": - version "1.14.3" - resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-network-client/-/defender-sdk-network-client-1.14.3.tgz#7b8ab18b5f7a62d2fd41d4b9f13581be91861f4d" - integrity sha512-qrJLs2ubKSwrhP0x4V2QOPhlc1q8TYnkAcvjvk34VXMS8lhY1cpXSGoxnTw3Mi+eCSE1xOzKWISLi1UAOQOJIw== - dependencies: - "@openzeppelin/defender-sdk-base-client" "1.14.3" - axios "^1.7.2" - lodash "^4.17.21" - -"@openzeppelin/fuzzy-solidity-import-parser@^0.1.2": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@openzeppelin/fuzzy-solidity-import-parser/-/fuzzy-solidity-import-parser-0.1.2.tgz#3b9f524d6028ca73df60474a313e0295e5610c51" - integrity sha512-leqEwfs8GlrPDrVcVc8Hv6LJ62ZzR0RgjwQNCkpT6H5jW9RB8YdR0a3inHoricSvw+sKI1b1hOqsCtPPZNnhng== - -"@openzeppelin/hardhat-upgrades@^3.1.0": - version "3.2.1" - resolved "https://registry.yarnpkg.com/@openzeppelin/hardhat-upgrades/-/hardhat-upgrades-3.2.1.tgz#f531784810050b1b3d7a227d6812a0d31ed0cf65" - integrity sha512-Zy5M3QhkzwGdpzQmk+xbWdYOGJWjoTvwbBKYLhctu9B91DoprlhDRaZUwCtunwTdynkTDGdVfGr0kIkvycyKjw== - dependencies: - "@openzeppelin/defender-sdk-base-client" "^1.10.0" - "@openzeppelin/defender-sdk-deploy-client" "^1.10.0" - "@openzeppelin/defender-sdk-network-client" "^1.10.0" - "@openzeppelin/upgrades-core" "^1.35.0" - chalk "^4.1.0" - debug "^4.1.1" - ethereumjs-util "^7.1.5" - proper-lockfile "^4.1.1" - undici "^6.11.1" - -"@openzeppelin/test-helpers@^0.5.5": - version "0.5.16" - resolved "https://registry.yarnpkg.com/@openzeppelin/test-helpers/-/test-helpers-0.5.16.tgz#2c9054f85069dfbfb5e8cef3ed781e8caf241fb3" - integrity sha512-T1EvspSfH1qQO/sgGlskLfYVBbqzJR23SZzYl/6B2JnT4EhThcI85UpvDk0BkLWKaDScQTabGHt4GzHW+3SfZg== - dependencies: - "@openzeppelin/contract-loader" "^0.6.2" - "@truffle/contract" "^4.0.35" - ansi-colors "^3.2.3" - chai "^4.2.0" - chai-bn "^0.2.1" - ethjs-abi "^0.2.1" - lodash.flatten "^4.4.0" - semver "^5.6.0" - web3 "^1.2.5" - web3-utils "^1.2.5" - -"@openzeppelin/upgrades-core@^1.35.0": - version "1.37.0" - resolved "https://registry.yarnpkg.com/@openzeppelin/upgrades-core/-/upgrades-core-1.37.0.tgz#088a5b4c3d30eaf800a40133bffc7f61712c7510" - integrity sha512-vpxe60KrbFubY09vlGZqBJdBXs0IqvZmH7+UueFiM0xK/V12lMwxyiNXkFv8+HZ7K8abRevYphVtEzrUWelQhQ== - dependencies: - "@nomicfoundation/slang" "^0.17.0" - cbor "^9.0.0" - chalk "^4.1.0" - compare-versions "^6.0.0" - debug "^4.1.1" - ethereumjs-util "^7.0.3" - minimatch "^9.0.5" - minimist "^1.2.7" - proper-lockfile "^4.1.1" - solidity-ast "^0.4.51" - -"@openzeppelin/upgrades@2.8.0": - version "2.8.0" - resolved "https://registry.yarnpkg.com/@openzeppelin/upgrades/-/upgrades-2.8.0.tgz#8086ab9c99d9f8dac7205030b0f9e7e4a280c4a3" - integrity sha512-LzjTQPeljPsgHDPdZyH9cMCbIHZILgd2cpNcYEkdsC2IylBYRHShlbEDXJV9snnqg9JWfzPiKIqyj3XVliwtqQ== - dependencies: - "@types/cbor" "^2.0.0" - axios "^0.18.0" - bignumber.js "^7.2.0" - cbor "^4.1.5" - chalk "^2.4.1" - ethers "^4.0.20" - glob "^7.1.3" - lodash "^4.17.15" - semver "^5.5.1" - spinnies "^0.4.2" - truffle-flattener "^1.4.0" - web3 "1.2.2" - web3-eth "1.2.2" - web3-eth-contract "1.2.2" - web3-utils "1.2.2" - -"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" - integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== - -"@protobufjs/base64@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" - integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== - -"@protobufjs/codegen@^2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" - integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== - -"@protobufjs/eventemitter@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" - integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== - -"@protobufjs/fetch@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" - integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== - dependencies: - "@protobufjs/aspromise" "^1.1.1" - "@protobufjs/inquire" "^1.1.0" - -"@protobufjs/float@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" - integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== - -"@protobufjs/inquire@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" - integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== - -"@protobufjs/path@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" - integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== - -"@protobufjs/pool@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" - integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== - -"@protobufjs/utf8@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" - integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== - -"@resolver-engine/core@^0.2.1": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@resolver-engine/core/-/core-0.2.1.tgz#0d71803f6d3b8cb2e9ed481a1bf0ca5f5256d0c0" - integrity sha512-nsLQHmPJ77QuifqsIvqjaF5B9aHnDzJjp73Q1z6apY3e9nqYrx4Dtowhpsf7Jwftg/XzVDEMQC+OzUBNTS+S1A== - dependencies: - debug "^3.1.0" - request "^2.85.0" - -"@resolver-engine/core@^0.3.3": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@resolver-engine/core/-/core-0.3.3.tgz#590f77d85d45bc7ecc4e06c654f41345db6ca967" - integrity sha512-eB8nEbKDJJBi5p5SrvrvILn4a0h42bKtbCTri3ZxCGt6UvoQyp7HnGOfki944bUjBSHKK3RvgfViHn+kqdXtnQ== - dependencies: - debug "^3.1.0" - is-url "^1.2.4" - request "^2.85.0" - -"@resolver-engine/fs@^0.2.1": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@resolver-engine/fs/-/fs-0.2.1.tgz#f98a308d77568cc02651d03636f46536b941b241" - integrity sha512-7kJInM1Qo2LJcKyDhuYzh9ZWd+mal/fynfL9BNjWOiTcOpX+jNfqb/UmGUqros5pceBITlWGqS4lU709yHFUbg== - dependencies: - "@resolver-engine/core" "^0.2.1" - debug "^3.1.0" - -"@resolver-engine/fs@^0.3.3": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@resolver-engine/fs/-/fs-0.3.3.tgz#fbf83fa0c4f60154a82c817d2fe3f3b0c049a973" - integrity sha512-wQ9RhPUcny02Wm0IuJwYMyAG8fXVeKdmhm8xizNByD4ryZlx6PP6kRen+t/haF43cMfmaV7T3Cx6ChOdHEhFUQ== - dependencies: - "@resolver-engine/core" "^0.3.3" - debug "^3.1.0" - -"@resolver-engine/imports-fs@^0.2.2": - version "0.2.2" - resolved "https://registry.yarnpkg.com/@resolver-engine/imports-fs/-/imports-fs-0.2.2.tgz#5a81ef3285dbf0411ab3b15205080a1ad7622d9e" - integrity sha512-gFCgMvCwyppjwq0UzIjde/WI+yDs3oatJhozG9xdjJdewwtd7LiF0T5i9lrHAUtqrQbqoFE4E+ZMRVHWpWHpKQ== - dependencies: - "@resolver-engine/fs" "^0.2.1" - "@resolver-engine/imports" "^0.2.2" - debug "^3.1.0" - -"@resolver-engine/imports-fs@^0.3.3": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@resolver-engine/imports-fs/-/imports-fs-0.3.3.tgz#4085db4b8d3c03feb7a425fbfcf5325c0d1e6c1b" - integrity sha512-7Pjg/ZAZtxpeyCFlZR5zqYkz+Wdo84ugB5LApwriT8XFeQoLwGUj4tZFFvvCuxaNCcqZzCYbonJgmGObYBzyCA== - dependencies: - "@resolver-engine/fs" "^0.3.3" - "@resolver-engine/imports" "^0.3.3" - debug "^3.1.0" - -"@resolver-engine/imports@^0.2.2": - version "0.2.2" - resolved "https://registry.yarnpkg.com/@resolver-engine/imports/-/imports-0.2.2.tgz#d3de55a1bb5f3beb7703fdde743298f321175843" - integrity sha512-u5/HUkvo8q34AA+hnxxqqXGfby5swnH0Myw91o3Sm2TETJlNKXibFGSKBavAH+wvWdBi4Z5gS2Odu0PowgVOUg== - dependencies: - "@resolver-engine/core" "^0.2.1" - debug "^3.1.0" - hosted-git-info "^2.6.0" - -"@resolver-engine/imports@^0.3.3": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@resolver-engine/imports/-/imports-0.3.3.tgz#badfb513bb3ff3c1ee9fd56073e3144245588bcc" - integrity sha512-anHpS4wN4sRMwsAbMXhMfOD/y4a4Oo0Cw/5+rue7hSwGWsDOQaAU1ClK1OxjUC35/peazxEl8JaSRRS+Xb8t3Q== - dependencies: - "@resolver-engine/core" "^0.3.3" - debug "^3.1.0" - hosted-git-info "^2.6.0" - path-browserify "^1.0.0" - url "^0.11.0" - -"@rtsao/scc@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" - integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== - -"@scure/base@~1.1.0", "@scure/base@~1.1.6": - version "1.1.8" - resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.8.tgz#8f23646c352f020c83bca750a82789e246d42b50" - integrity sha512-6CyAclxj3Nb0XT7GHK6K4zK6k2xJm6E4Ft0Ohjt4WgegiFUHEtFb2CGzmPmGBwoIhrLsqNLYfLr04Y1GePrzZg== - -"@scure/bip32@1.1.5": - version "1.1.5" - resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.1.5.tgz#d2ccae16dcc2e75bc1d75f5ef3c66a338d1ba300" - integrity sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw== - dependencies: - "@noble/hashes" "~1.2.0" - "@noble/secp256k1" "~1.7.0" - "@scure/base" "~1.1.0" - -"@scure/bip32@1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.4.0.tgz#4e1f1e196abedcef395b33b9674a042524e20d67" - integrity sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg== - dependencies: - "@noble/curves" "~1.4.0" - "@noble/hashes" "~1.4.0" - "@scure/base" "~1.1.6" - -"@scure/bip39@1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.1.1.tgz#b54557b2e86214319405db819c4b6a370cf340c5" - integrity sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg== - dependencies: - "@noble/hashes" "~1.2.0" - "@scure/base" "~1.1.0" - -"@scure/bip39@1.3.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.3.0.tgz#0f258c16823ddd00739461ac31398b4e7d6a18c3" - integrity sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ== - dependencies: - "@noble/hashes" "~1.4.0" - "@scure/base" "~1.1.6" - -"@sentry/core@5.30.0": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3" - integrity sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg== - dependencies: - "@sentry/hub" "5.30.0" - "@sentry/minimal" "5.30.0" - "@sentry/types" "5.30.0" - "@sentry/utils" "5.30.0" - tslib "^1.9.3" - -"@sentry/hub@5.30.0": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.30.0.tgz#2453be9b9cb903404366e198bd30c7ca74cdc100" - integrity sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ== - dependencies: - "@sentry/types" "5.30.0" - "@sentry/utils" "5.30.0" - tslib "^1.9.3" - -"@sentry/minimal@5.30.0": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.30.0.tgz#ce3d3a6a273428e0084adcb800bc12e72d34637b" - integrity sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw== - dependencies: - "@sentry/hub" "5.30.0" - "@sentry/types" "5.30.0" - tslib "^1.9.3" - -"@sentry/node@^5.18.1": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.30.0.tgz#4ca479e799b1021285d7fe12ac0858951c11cd48" - integrity sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg== - dependencies: - "@sentry/core" "5.30.0" - "@sentry/hub" "5.30.0" - "@sentry/tracing" "5.30.0" - "@sentry/types" "5.30.0" - "@sentry/utils" "5.30.0" - cookie "^0.4.1" - https-proxy-agent "^5.0.0" - lru_map "^0.3.3" - tslib "^1.9.3" - -"@sentry/tracing@5.30.0": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-5.30.0.tgz#501d21f00c3f3be7f7635d8710da70d9419d4e1f" - integrity sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw== - dependencies: - "@sentry/hub" "5.30.0" - "@sentry/minimal" "5.30.0" - "@sentry/types" "5.30.0" - "@sentry/utils" "5.30.0" - tslib "^1.9.3" - -"@sentry/types@5.30.0": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.30.0.tgz#19709bbe12a1a0115bc790b8942917da5636f402" - integrity sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw== - -"@sentry/utils@5.30.0": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.30.0.tgz#9a5bd7ccff85ccfe7856d493bffa64cabc41e980" - integrity sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww== - dependencies: - "@sentry/types" "5.30.0" - tslib "^1.9.3" - -"@sindresorhus/is@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" - integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== - -"@sindresorhus/is@^4.0.0", "@sindresorhus/is@^4.6.0": - version "4.6.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" - integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== - -"@smithy/types@^3.3.0": - version "3.3.0" - resolved "https://registry.yarnpkg.com/@smithy/types/-/types-3.3.0.tgz#fae037c733d09bc758946a01a3de0ef6e210b16b" - integrity sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA== - dependencies: - tslib "^2.6.2" - -"@solidity-parser/parser@^0.14.0", "@solidity-parser/parser@^0.14.1": - version "0.14.5" - resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.14.5.tgz#87bc3cc7b068e08195c219c91cd8ddff5ef1a804" - integrity sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg== - dependencies: - antlr4ts "^0.5.0-alpha.4" - -"@solidity-parser/parser@^0.18.0": - version "0.18.0" - resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.18.0.tgz#8e77a02a09ecce957255a2f48c9a7178ec191908" - integrity sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA== - -"@szmarczak/http-timer@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" - integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== - dependencies: - defer-to-connect "^1.0.1" - -"@szmarczak/http-timer@^4.0.5": - version "4.0.6" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807" - integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w== - dependencies: - defer-to-connect "^2.0.0" - -"@szmarczak/http-timer@^5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-5.0.1.tgz#c7c1bf1141cdd4751b0399c8fc7b8b664cd5be3a" - integrity sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw== - dependencies: - defer-to-connect "^2.0.1" - -"@truffle/abi-utils@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@truffle/abi-utils/-/abi-utils-1.0.3.tgz#9f0df7a8aaf5e815bee47e0ad26bd4c91e4045f2" - integrity sha512-AWhs01HCShaVKjml7Z4AbVREr/u4oiWxCcoR7Cktm0mEvtT04pvnxW5xB/cI4znRkrbPdFQlFt67kgrAjesYkw== - dependencies: - change-case "3.0.2" - fast-check "3.1.1" - web3-utils "1.10.0" - -"@truffle/blockchain-utils@^0.1.9": - version "0.1.9" - resolved "https://registry.yarnpkg.com/@truffle/blockchain-utils/-/blockchain-utils-0.1.9.tgz#d9b55bd23a134578e4217bae55a6dfbbb038d6dc" - integrity sha512-RHfumgbIVo68Rv9ofDYfynjnYZIfP/f1vZy4RoqkfYAO+fqfc58PDRzB1WAGq2U6GPuOnipOJxQhnqNnffORZg== - -"@truffle/codec@^0.17.3": - version "0.17.3" - resolved "https://registry.yarnpkg.com/@truffle/codec/-/codec-0.17.3.tgz#94057e56e1a947594b35eba498d96915df3861d2" - integrity sha512-Ko/+dsnntNyrJa57jUD9u4qx9nQby+H4GsUO6yjiCPSX0TQnEHK08XWqBSg0WdmCH2+h0y1nr2CXSx8gbZapxg== - dependencies: - "@truffle/abi-utils" "^1.0.3" - "@truffle/compile-common" "^0.9.8" - big.js "^6.0.3" - bn.js "^5.1.3" - cbor "^5.2.0" - debug "^4.3.1" - lodash "^4.17.21" - semver "^7.5.4" - utf8 "^3.0.0" - web3-utils "1.10.0" - -"@truffle/compile-common@^0.9.8": - version "0.9.8" - resolved "https://registry.yarnpkg.com/@truffle/compile-common/-/compile-common-0.9.8.tgz#f91507c895852289a17bf401eefebc293c4c69f0" - integrity sha512-DTpiyo32t/YhLI1spn84D3MHYHrnoVqO+Gp7ZHrYNwDs86mAxtNiH5lsVzSb8cPgiqlvNsRCU9nm9R0YmKMTBQ== - dependencies: - "@truffle/error" "^0.2.2" - colors "1.4.0" - -"@truffle/contract-schema@^3.4.16": - version "3.4.16" - resolved "https://registry.yarnpkg.com/@truffle/contract-schema/-/contract-schema-3.4.16.tgz#c529c3f230db407b2f03290373b20b7366f2d37e" - integrity sha512-g0WNYR/J327DqtJPI70ubS19K1Fth/1wxt2jFqLsPmz5cGZVjCwuhiie+LfBde4/Mc9QR8G+L3wtmT5cyoBxAg== - dependencies: - ajv "^6.10.0" - debug "^4.3.1" - -"@truffle/contract@^4.0.35": - version "4.6.31" - resolved "https://registry.yarnpkg.com/@truffle/contract/-/contract-4.6.31.tgz#75cb059689ce73b365675d9650718908c01b6b58" - integrity sha512-s+oHDpXASnZosiCdzu+X1Tx5mUJUs1L1CYXIcgRmzMghzqJkaUFmR6NpNo7nJYliYbO+O9/aW8oCKqQ7rCHfmQ== - dependencies: - "@ensdomains/ensjs" "^2.1.0" - "@truffle/blockchain-utils" "^0.1.9" - "@truffle/contract-schema" "^3.4.16" - "@truffle/debug-utils" "^6.0.57" - "@truffle/error" "^0.2.2" - "@truffle/interface-adapter" "^0.5.37" - bignumber.js "^7.2.1" - debug "^4.3.1" - ethers "^4.0.32" - web3 "1.10.0" - web3-core-helpers "1.10.0" - web3-core-promievent "1.10.0" - web3-eth-abi "1.10.0" - web3-utils "1.10.0" - -"@truffle/debug-utils@^6.0.57": - version "6.0.57" - resolved "https://registry.yarnpkg.com/@truffle/debug-utils/-/debug-utils-6.0.57.tgz#4e9a1051221c5f467daa398b0ca638d8b6408a82" - integrity sha512-Q6oI7zLaeNLB69ixjwZk2UZEWBY6b2OD1sjLMGDKBGR7GaHYiw96GLR2PFgPH1uwEeLmV4N78LYaQCrDsHbNeA== - dependencies: - "@truffle/codec" "^0.17.3" - "@trufflesuite/chromafi" "^3.0.0" - bn.js "^5.1.3" - chalk "^2.4.2" - debug "^4.3.1" - highlightjs-solidity "^2.0.6" - -"@truffle/error@^0.0.6": - version "0.0.6" - resolved "https://registry.yarnpkg.com/@truffle/error/-/error-0.0.6.tgz#75d499845b4b3a40537889e7d04c663afcaee85d" - integrity sha512-QUM9ZWiwlXGixFGpV18g5I6vua6/r+ZV9W/5DQA5go9A3eZUNPHPaTKMIQPJLYn6+ZV5jg5H28zCHq56LHF3yA== - -"@truffle/error@^0.2.2": - version "0.2.2" - resolved "https://registry.yarnpkg.com/@truffle/error/-/error-0.2.2.tgz#1b4c4237c14dda792f20bd4f19ff4e4585b47796" - integrity sha512-TqbzJ0O8DHh34cu8gDujnYl4dUl6o2DE4PR6iokbybvnIm/L2xl6+Gv1VC+YJS45xfH83Yo3/Zyg/9Oq8/xZWg== - -"@truffle/interface-adapter@^0.5.37": - version "0.5.37" - resolved "https://registry.yarnpkg.com/@truffle/interface-adapter/-/interface-adapter-0.5.37.tgz#95d249c1912d2baaa63c54e8a138d3f476a1181a" - integrity sha512-lPH9MDgU+7sNDlJSClwyOwPCfuOimqsCx0HfGkznL3mcFRymc1pukAR1k17zn7ErHqBwJjiKAZ6Ri72KkS+IWw== - dependencies: - bn.js "^5.1.3" - ethers "^4.0.32" - web3 "1.10.0" - -"@trufflesuite/chromafi@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@trufflesuite/chromafi/-/chromafi-3.0.0.tgz#f6956408c1af6a38a6ed1657783ce59504a1eb8b" - integrity sha512-oqWcOqn8nT1bwlPPfidfzS55vqcIDdpfzo3HbU9EnUmcSTX+I8z0UyUFI3tZQjByVJulbzxHxUGS3ZJPwK/GPQ== - dependencies: - camelcase "^4.1.0" - chalk "^2.3.2" - cheerio "^1.0.0-rc.2" - detect-indent "^5.0.0" - highlight.js "^10.4.1" - lodash.merge "^4.6.2" - strip-ansi "^4.0.0" - strip-indent "^2.0.0" - -"@typechain/ethers-v5@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@typechain/ethers-v5/-/ethers-v5-2.0.0.tgz#cd3ca1590240d587ca301f4c029b67bfccd08810" - integrity sha512-0xdCkyGOzdqh4h5JSf+zoWx85IusEjDcPIwNEHP8mrWSnCae4rvrqB+/gtpdNfX7zjlFlZiMeePn2r63EI3Lrw== - dependencies: - ethers "^5.0.2" - -"@types/abstract-leveldown@*": - version "7.2.5" - resolved "https://registry.yarnpkg.com/@types/abstract-leveldown/-/abstract-leveldown-7.2.5.tgz#db2cf364c159fb1f12be6cd3549f56387eaf8d73" - integrity sha512-/2B0nQF4UdupuxeKTJA2+Rj1D+uDemo6P4kMwKCpbfpnzeVaWSELTsAw4Lxn3VJD6APtRrZOCuYo+4nHUQfTfg== - -"@types/bn.js@^4.11.3", "@types/bn.js@^4.11.4", "@types/bn.js@^4.11.5": - version "4.11.6" - resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" - integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== - dependencies: - "@types/node" "*" - -"@types/bn.js@^5.1.0", "@types/bn.js@^5.1.1": - version "5.1.5" - resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.5.tgz#2e0dacdcce2c0f16b905d20ff87aedbc6f7b4bf0" - integrity sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A== - dependencies: - "@types/node" "*" - -"@types/cacheable-request@^6.0.1", "@types/cacheable-request@^6.0.2": - version "6.0.3" - resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.3.tgz#a430b3260466ca7b5ca5bfd735693b36e7a9d183" - integrity sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw== - dependencies: - "@types/http-cache-semantics" "*" - "@types/keyv" "^3.1.4" - "@types/node" "*" - "@types/responselike" "^1.0.0" - -"@types/cbor@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@types/cbor/-/cbor-2.0.0.tgz#c627afc2ee22f23f2337fecb34628a4f97c6afbb" - integrity sha512-yQH0JLcrHrH/GBIFFFq6DAsj9M4rmYsmSpGGGs67JrLGWPepYr2c1YugGjMd2Ib5pebluRAfNPJ4O1p80qX9HQ== - dependencies: - "@types/node" "*" - -"@types/chai-as-promised@^7.1.3": - version "7.1.8" - resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.8.tgz#f2b3d82d53c59626b5d6bbc087667ccb4b677fe9" - integrity sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw== - dependencies: - "@types/chai" "*" - -"@types/chai@*": - version "4.3.19" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.19.tgz#14519f437361d41e84102ed3fbc922ddace3e228" - integrity sha512-2hHHvQBVE2FiSK4eN0Br6snX9MtolHaTo/batnLjlGRhoQzlCL61iVpxoqO7SfFyOw+P/pwv+0zNHzKoGWz9Cw== - -"@types/concat-stream@^1.6.0": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@types/concat-stream/-/concat-stream-1.6.1.tgz#24bcfc101ecf68e886aaedce60dfd74b632a1b74" - integrity sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA== - dependencies: - "@types/node" "*" - -"@types/form-data@0.0.33": - version "0.0.33" - resolved "https://registry.yarnpkg.com/@types/form-data/-/form-data-0.0.33.tgz#c9ac85b2a5fd18435b8c85d9ecb50e6d6c893ff8" - integrity sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw== - dependencies: - "@types/node" "*" - -"@types/fs-extra@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-7.0.0.tgz#9c4ad9e1339e7448a76698829def1f159c1b636c" - integrity sha512-ndoMMbGyuToTy4qB6Lex/inR98nPiNHacsgMPvy+zqMLgSxbt8VtWpDArpGp69h1fEDQHn1KB+9DWD++wgbwYA== - dependencies: - "@types/node" "*" - -"@types/glob@^7.1.1": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" - integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== - dependencies: - "@types/minimatch" "*" - "@types/node" "*" - -"@types/http-cache-semantics@*": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz#b979ebad3919799c979b17c72621c0bc0a31c6c4" - integrity sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA== - -"@types/json-schema@^7.0.11": - version "7.0.15" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" - integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== - -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== - -"@types/keyv@^3.1.4": - version "3.1.4" - resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.4.tgz#3ccdb1c6751b0c7e52300bcdacd5bcbf8faa75b6" - integrity sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg== - dependencies: - "@types/node" "*" - -"@types/level-errors@*": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/level-errors/-/level-errors-3.0.2.tgz#f33ec813c50780b547463da9ad8acac89ee457d9" - integrity sha512-gyZHbcQ2X5hNXf/9KS2qGEmgDe9EN2WDM3rJ5Ele467C0nA1sLhtmv1bZiPMDYfAYCfPWft0uQIaTvXbASSTRA== - -"@types/levelup@^4.3.0": - version "4.3.3" - resolved "https://registry.yarnpkg.com/@types/levelup/-/levelup-4.3.3.tgz#4dc2b77db079b1cf855562ad52321aa4241b8ef4" - integrity sha512-K+OTIjJcZHVlZQN1HmU64VtrC0jC3dXWQozuEIR9zVvltIk90zaGPM2AgT+fIkChpzHhFE3YnvFLCbLtzAmexA== - dependencies: - "@types/abstract-leveldown" "*" - "@types/level-errors" "*" - "@types/node" "*" - -"@types/long@^4.0.1": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a" - integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== - -"@types/lru-cache@^5.1.0": - version "5.1.1" - resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.1.tgz#c48c2e27b65d2a153b19bfc1a317e30872e01eef" - integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== - -"@types/minimatch@*": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" - integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== - -"@types/mkdirp@^0.5.2": - version "0.5.2" - resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-0.5.2.tgz#503aacfe5cc2703d5484326b1b27efa67a339c1f" - integrity sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg== - dependencies: - "@types/node" "*" - -"@types/node-fetch@^2.5.5": - version "2.6.11" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.11.tgz#9b39b78665dae0e82a08f02f4967d62c66f95d24" - integrity sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g== - dependencies: - "@types/node" "*" - form-data "^4.0.0" - -"@types/node@*", "@types/node@>=13.7.0": - version "22.5.4" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.5.4.tgz#83f7d1f65bc2ed223bdbf57c7884f1d5a4fa84e8" - integrity sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg== - dependencies: - undici-types "~6.19.2" - -"@types/node@18.15.13": - version "18.15.13" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.13.tgz#f64277c341150c979e42b00e4ac289290c9df469" - integrity sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q== - -"@types/node@^10.0.3", "@types/node@^10.12.18", "@types/node@^10.3.2": - version "10.17.60" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b" - integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw== - -"@types/node@^12.12.6", "@types/node@^12.6.1": - version "12.20.55" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" - integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== - -"@types/node@^8.0.0": - version "8.10.66" - resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.66.tgz#dd035d409df322acc83dff62a602f12a5783bbb3" - integrity sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw== - -"@types/npm@^2.0.29": - version "2.0.32" - resolved "https://registry.yarnpkg.com/@types/npm/-/npm-2.0.32.tgz#036682075b9c2116b510fe24b52a5b932e3a99d5" - integrity sha512-9Lg4woNVzJCtac0lET91H65lbO+8YXfk0nmlmoPGhHXMdaVEDloH6zOPIYMy2n39z/aCXXQR0nax66EDekAyIQ== - dependencies: - "@types/node" "*" - -"@types/pbkdf2@^3.0.0": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.2.tgz#2dc43808e9985a2c69ff02e2d2027bd4fe33e8dc" - integrity sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew== - dependencies: - "@types/node" "*" - -"@types/prettier@^1.13.2": - version "1.19.1" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-1.19.1.tgz#33509849f8e679e4add158959fdb086440e9553f" - integrity sha512-5qOlnZscTn4xxM5MeGXAMOsIOIKIbh9e85zJWfBRVPlRMEVawzoPhINYbRGkBZCI8LxvBe7tJCdWiarA99OZfQ== - -"@types/prettier@^2.1.1": - version "2.7.3" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f" - integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== - -"@types/qs@^6.2.31": - version "6.9.15" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.15.tgz#adde8a060ec9c305a82de1babc1056e73bd64dce" - integrity sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg== - -"@types/resolve@^0.0.8": - version "0.0.8" - resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-0.0.8.tgz#f26074d238e02659e323ce1a13d041eee280e194" - integrity sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ== - dependencies: - "@types/node" "*" - -"@types/responselike@^1.0.0": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.3.tgz#cc29706f0a397cfe6df89debfe4bf5cea159db50" - integrity sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw== - dependencies: - "@types/node" "*" - -"@types/secp256k1@^4.0.1": - version "4.0.6" - resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.6.tgz#d60ba2349a51c2cbc5e816dcd831a42029d376bf" - integrity sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ== - dependencies: - "@types/node" "*" - -"@types/semver@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-5.5.0.tgz#146c2a29ee7d3bae4bf2fcb274636e264c813c45" - integrity sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ== - -"@web3-js/scrypt-shim@^0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@web3-js/scrypt-shim/-/scrypt-shim-0.1.0.tgz#0bf7529ab6788311d3e07586f7d89107c3bea2cc" - integrity sha512-ZtZeWCc/s0nMcdx/+rZwY1EcuRdemOK9ag21ty9UsHkFxsNb/AaoucUz0iPuyGe0Ku+PFuRmWZG7Z7462p9xPw== - dependencies: - scryptsy "^2.1.0" - semver "^6.3.0" - -"@web3-js/websocket@^1.0.29": - version "1.0.30" - resolved "https://registry.yarnpkg.com/@web3-js/websocket/-/websocket-1.0.30.tgz#9ea15b7b582cf3bf3e8bc1f4d3d54c0731a87f87" - integrity sha512-fDwrD47MiDrzcJdSeTLF75aCcxVVt8B1N74rA+vh2XCAvFy4tEWJjtnUtj2QG7/zlQ6g9cQ88bZFBxwd9/FmtA== - dependencies: - debug "^2.2.0" - es5-ext "^0.10.50" - nan "^2.14.0" - typedarray-to-buffer "^3.1.5" - yaeti "^0.0.6" - -"@yarnpkg/lockfile@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" - integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== - -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - -abbrev@1.0.x: - version "1.0.9" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" - integrity sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q== - -abortcontroller-polyfill@^1.7.3, abortcontroller-polyfill@^1.7.5: - version "1.7.5" - resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz#6738495f4e901fbb57b6c0611d0c75f76c485bed" - integrity sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ== - -abstract-leveldown@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-3.0.0.tgz#5cb89f958a44f526779d740d1440e743e0c30a57" - integrity sha512-KUWx9UWGQD12zsmLNj64/pndaz4iJh/Pj7nopgkfDG6RlCcbMZvT6+9l7dchK4idog2Is8VdC/PvNbFuFmalIQ== - dependencies: - xtend "~4.0.0" - -abstract-leveldown@^2.4.1, abstract-leveldown@~2.7.1: - version "2.7.2" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz#87a44d7ebebc341d59665204834c8b7e0932cc93" - integrity sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w== - dependencies: - xtend "~4.0.0" - -abstract-leveldown@^5.0.0, abstract-leveldown@~5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-5.0.0.tgz#f7128e1f86ccabf7d2893077ce5d06d798e386c6" - integrity sha512-5mU5P1gXtsMIXg65/rsYGsi93+MlogXZ9FA8JnwKurHQg64bfXwGYVdVdijNTVNOlAsuIiOwHdvFFD5JqCJQ7A== - dependencies: - xtend "~4.0.0" - -abstract-leveldown@^6.2.1: - version "6.3.0" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz#d25221d1e6612f820c35963ba4bd739928f6026a" - integrity sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ== - dependencies: - buffer "^5.5.0" - immediate "^3.2.3" - level-concat-iterator "~2.0.0" - level-supports "~1.0.0" - xtend "~4.0.0" - -abstract-leveldown@~2.6.0: - version "2.6.3" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz#1c5e8c6a5ef965ae8c35dfb3a8770c476b82c4b8" - integrity sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA== - dependencies: - xtend "~4.0.0" - -abstract-leveldown@~6.2.1: - version "6.2.3" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz#036543d87e3710f2528e47040bc3261b77a9a8eb" - integrity sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ== - dependencies: - buffer "^5.5.0" - immediate "^3.2.3" - level-concat-iterator "~2.0.0" - level-supports "~1.0.0" - xtend "~4.0.0" - -accepts@~1.3.8: - version "1.3.8" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" - integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== - dependencies: - mime-types "~2.1.34" - negotiator "0.6.3" - -acorn-jsx@^5.2.0: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn@^7.1.1: - version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - -adm-zip@^0.4.16: - version "0.4.16" - resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365" - integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg== - -aes-js@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" - integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== - -aes-js@4.0.0-beta.5: - version "4.0.0-beta.5" - resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-4.0.0-beta.5.tgz#8d2452c52adedebc3a3e28465d858c11ca315873" - integrity sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q== - -aes-js@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.1.2.tgz#db9aabde85d5caabbfc0d4f2a4446960f627146a" - integrity sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ== - -agent-base@6: - version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - -ajv@^5.2.2: - version "5.5.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" - integrity sha512-Ajr4IcMXq/2QmMkEmSvxqfLN5zGmJ92gHXAeOXq1OekoH2rfDNsgdDoL2f7QaRCy7G/E6TpxBVdRuNraMztGHw== - dependencies: - co "^4.6.0" - fast-deep-equal "^1.0.0" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.3.0" - -ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ajv@^8.0.1: - version "8.17.1" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" - integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== - dependencies: - fast-deep-equal "^3.1.3" - fast-uri "^3.0.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - -amazon-cognito-identity-js@^6.3.6: - version "6.3.12" - resolved "https://registry.yarnpkg.com/amazon-cognito-identity-js/-/amazon-cognito-identity-js-6.3.12.tgz#af73df033094ad4c679c19cf6122b90058021619" - integrity sha512-s7NKDZgx336cp+oDeUtB2ZzT8jWJp/v2LWuYl+LQtMEODe22RF1IJ4nRiDATp+rp1pTffCZcm44Quw4jx2bqNg== - dependencies: - "@aws-crypto/sha256-js" "1.2.2" - buffer "4.9.2" - fast-base64-decode "^1.0.0" - isomorphic-unfetch "^3.0.0" - js-cookie "^2.2.1" - -amdefine@>=0.0.4: - version "1.0.1" - resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" - integrity sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg== - -ansi-align@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" - integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== - dependencies: - string-width "^4.1.0" - -ansi-colors@^3.2.3: - version "3.2.4" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" - integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== - -ansi-colors@^4.1.1, ansi-colors@^4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" - integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== - -ansi-escapes@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" - integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== - -ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== - -ansi-regex@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" - integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== - -ansi-regex@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" - integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - integrity sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA== - -ansi-styles@^3.2.0, ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -antlr4ts@^0.5.0-alpha.4: - version "0.5.0-alpha.4" - resolved "https://registry.yarnpkg.com/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz#71702865a87478ed0b40c0709f422cf14d51652a" - integrity sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ== - -any-promise@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" - integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== - -anymatch@^1.3.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" - integrity sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA== - dependencies: - micromatch "^2.1.5" - normalize-path "^2.0.0" - -anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -arr-diff@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" - integrity sha512-dtXTVMkh6VkEEA7OhXnN1Ecb8aAGFdZ1LFxtOCoqj4qkyOJMt7+qs6Ahdy6p/NQCPYsRSXXivhSB/J5E9jmYKA== - dependencies: - arr-flatten "^1.0.1" - -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA== - -arr-flatten@^1.0.1, arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== - -array-back@^1.0.3, array-back@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/array-back/-/array-back-1.0.4.tgz#644ba7f095f7ffcf7c43b5f0dc39d3c1f03c063b" - integrity sha512-1WxbZvrmyhkNoeYcizokbmh5oiOCIfyvGtcqbK3Ls1v1fKcquzxnQSceOx6tzq7jmai2kFLWIpGND2cLhH6TPw== - dependencies: - typical "^2.6.0" - -array-back@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/array-back/-/array-back-2.0.0.tgz#6877471d51ecc9c9bfa6136fb6c7d5fe69748022" - integrity sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw== - dependencies: - typical "^2.6.1" - -array-buffer-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" - integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== - dependencies: - call-bind "^1.0.5" - is-array-buffer "^3.0.4" - -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== - -array-includes@^3.1.8: - version "3.1.8" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" - integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - get-intrinsic "^1.2.4" - is-string "^1.0.7" - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -array-unique@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" - integrity sha512-G2n5bG5fSUCpnsXz4+8FUkYsGPkNfLn9YvS66U5qbTIXI2Ynnlo4Bi42bWv+omKUCqz+ejzfClwne0alJWJPhg== - -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== - -array.prototype.findlastindex@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" - integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - es-shim-unscopables "^1.0.2" - -array.prototype.flat@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" - integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - -array.prototype.flatmap@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" - integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - -array.prototype.reduce@^1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.7.tgz#6aadc2f995af29cb887eb866d981dc85ab6f7dc7" - integrity sha512-mzmiUCVwtiD4lgxYP8g7IYy8El8p2CSMePvIbTS7gchKir/L1fgJrk0yDKmAX6mnRQFKNADYIk8nNlTris5H1Q== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-array-method-boxes-properly "^1.0.0" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - is-string "^1.0.7" - -arraybuffer.prototype.slice@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" - integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== - dependencies: - array-buffer-byte-length "^1.0.1" - call-bind "^1.0.5" - define-properties "^1.2.1" - es-abstract "^1.22.3" - es-errors "^1.2.1" - get-intrinsic "^1.2.3" - is-array-buffer "^3.0.4" - is-shared-array-buffer "^1.0.2" - -asap@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== - -asn1.js@^4.10.1: - version "4.10.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" - integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -asn1@~0.2.3: - version "0.2.6" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" - integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== - dependencies: - safer-buffer "~2.1.0" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== - -assertion-error@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" - integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== - -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== - -astral-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" - integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== - -astral-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" - integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== - -async-each@^1.0.0: - version "1.0.6" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.6.tgz#52f1d9403818c179b7561e11a5d1b77eb2160e77" - integrity sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg== - -async-eventemitter@^0.2.2: - version "0.2.4" - resolved "https://registry.yarnpkg.com/async-eventemitter/-/async-eventemitter-0.2.4.tgz#f5e7c8ca7d3e46aab9ec40a292baf686a0bafaca" - integrity sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw== - dependencies: - async "^2.4.0" - -async-limiter@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" - integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== - -async-retry@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.3.3.tgz#0e7f36c04d8478e7a58bdbed80cedf977785f280" - integrity sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw== - dependencies: - retry "0.13.1" - -async@1.x, async@^1.4.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" - integrity sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w== - -async@2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381" - integrity sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg== - dependencies: - lodash "^4.17.11" - -async@^2.0.1, async@^2.1.2, async@^2.4.0, async@^2.5.0, async@^2.6.1: - version "2.6.4" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" - integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== - dependencies: - lodash "^4.17.14" - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - -at-least-node@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" - integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== - -atob@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== - -available-typed-arrays@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" - integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== - dependencies: - possible-typed-array-names "^1.0.0" - -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== - -aws4@^1.8.0: - version "1.13.2" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.13.2.tgz#0aa167216965ac9474ccfa83892cfb6b3e1e52ef" - integrity sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw== - -axios@^0.18.0: - version "0.18.1" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.18.1.tgz#ff3f0de2e7b5d180e757ad98000f1081b87bcea3" - integrity sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g== - dependencies: - follow-redirects "1.5.10" - is-buffer "^2.0.2" - -axios@^1.5.1, axios@^1.7.2: - version "1.7.7" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.7.tgz#2f554296f9892a72ac8d8e4c5b79c14a91d0a47f" - integrity sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q== - dependencies: - follow-redirects "^1.15.6" - form-data "^4.0.0" - proxy-from-env "^1.1.0" - -babel-code-frame@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" - integrity sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g== - dependencies: - chalk "^1.1.3" - esutils "^2.0.2" - js-tokens "^3.0.2" - -babel-core@^6.0.14, babel-core@^6.26.0: - version "6.26.3" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" - integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== - dependencies: - babel-code-frame "^6.26.0" - babel-generator "^6.26.0" - babel-helpers "^6.24.1" - babel-messages "^6.23.0" - babel-register "^6.26.0" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - convert-source-map "^1.5.1" - debug "^2.6.9" - json5 "^0.5.1" - lodash "^4.17.4" - minimatch "^3.0.4" - path-is-absolute "^1.0.1" - private "^0.1.8" - slash "^1.0.0" - source-map "^0.5.7" - -babel-generator@^6.26.0: - version "6.26.1" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" - integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== - dependencies: - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - detect-indent "^4.0.0" - jsesc "^1.3.0" - lodash "^4.17.4" - source-map "^0.5.7" - trim-right "^1.0.1" - -babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" - integrity sha512-gCtfYORSG1fUMX4kKraymq607FWgMWg+j42IFPc18kFQEsmtaibP4UrqsXt8FlEJle25HUd4tsoDR7H2wDhe9Q== - dependencies: - babel-helper-explode-assignable-expression "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-call-delegate@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" - integrity sha512-RL8n2NiEj+kKztlrVJM9JT1cXzzAdvWFh76xh/H1I4nKwunzE4INBXn8ieCZ+wh4zWszZk7NBS1s/8HR5jDkzQ== - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-define-map@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" - integrity sha512-bHkmjcC9lM1kmZcVpA5t2om2nzT/xiZpo6TJq7UlZ3wqKfzia4veeXbIhKvJXAMzhhEBd3cR1IElL5AenWEUpA== - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-explode-assignable-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" - integrity sha512-qe5csbhbvq6ccry9G7tkXbzNtcDiH4r51rrPUbwwoTzZ18AqxWYRZT6AOmxrpxKnQBW0pYlBI/8vh73Z//78nQ== - dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-function-name@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" - integrity sha512-Oo6+e2iX+o9eVvJ9Y5eKL5iryeRdsIkwRYheCuhYdVHsdEQysbc2z2QkqCLIYnNxkT5Ss3ggrHdXiDI7Dhrn4Q== - dependencies: - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-get-function-arity@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" - integrity sha512-WfgKFX6swFB1jS2vo+DwivRN4NB8XUdM3ij0Y1gnC21y1tdBoe6xjVnd7NSI6alv+gZXCtJqvrTeMW3fR/c0ng== - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-hoist-variables@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" - integrity sha512-zAYl3tqerLItvG5cKYw7f1SpvIxS9zi7ohyGHaI9cgDUjAT6YcY9jIEH5CstetP5wHIVSceXwNS7Z5BpJg+rOw== - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-optimise-call-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" - integrity sha512-Op9IhEaxhbRT8MDXx2iNuMgciu2V8lDvYCNQbDGjdBNCjaMvyLf4wl4A3b8IgndCyQF8TwfgsQ8T3VD8aX1/pA== - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-regex@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" - integrity sha512-VlPiWmqmGJp0x0oK27Out1D+71nVVCTSdlbhIVoaBAj2lUgrNjBCRR9+llO4lTSb2O4r7PJg+RobRkhBrf6ofg== - dependencies: - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-remap-async-to-generator@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" - integrity sha512-RYqaPD0mQyQIFRu7Ho5wE2yvA/5jxqCIj/Lv4BXNq23mHYu/vxikOy2JueLiBxQknwapwrJeNCesvY0ZcfnlHg== - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-replace-supers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" - integrity sha512-sLI+u7sXJh6+ToqDr57Bv973kCepItDhMou0xCP2YPVmR1jkHSCY+p1no8xErbV1Siz5QE8qKT1WIwybSWlqjw== - dependencies: - babel-helper-optimise-call-expression "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helpers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" - integrity sha512-n7pFrqQm44TCYvrCDb0MqabAF+JUBq+ijBvNMUxpkLjJaAu32faIexewMumrH5KLLJ1HDyT0PTEqRyAe/GwwuQ== - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-messages@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" - integrity sha512-Bl3ZiA+LjqaMtNYopA9TYE9HP1tQ+E5dLxE0XrAzcIJeK2UqF0/EaqXwBn9esd4UmTfEab+P+UYQ1GnioFIb/w== - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-check-es2015-constants@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" - integrity sha512-B1M5KBP29248dViEo1owyY32lk1ZSH2DaNNrXLGt8lyjjHm7pBqAdQ7VKUPR6EEDO323+OvT3MQXbCin8ooWdA== - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-syntax-async-functions@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" - integrity sha512-4Zp4unmHgw30A1eWI5EpACji2qMocisdXhAftfhXoSV9j0Tvj6nRFE3tOmRY912E0FMRm/L5xWE7MGVT2FoLnw== - -babel-plugin-syntax-exponentiation-operator@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" - integrity sha512-Z/flU+T9ta0aIEKl1tGEmN/pZiI1uXmCiGFRegKacQfEJzp7iNsKloZmyJlQr+75FCJtiFfGIK03SiCvCt9cPQ== - -babel-plugin-syntax-trailing-function-commas@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" - integrity sha512-Gx9CH3Q/3GKbhs07Bszw5fPTlU+ygrOGfAhEt7W2JICwufpC4SuO0mG0+4NykPBSYPMJhqvVlDBU17qB1D+hMQ== - -babel-plugin-transform-async-to-generator@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" - integrity sha512-7BgYJujNCg0Ti3x0c/DL3tStvnKS6ktIYOmo9wginv/dfZOrbSZ+qG4IRRHMBOzZ5Awb1skTiAsQXg/+IWkZYw== - dependencies: - babel-helper-remap-async-to-generator "^6.24.1" - babel-plugin-syntax-async-functions "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-arrow-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" - integrity sha512-PCqwwzODXW7JMrzu+yZIaYbPQSKjDTAsNNlK2l5Gg9g4rz2VzLnZsStvp/3c46GfXpwkyufb3NCyG9+50FF1Vg== - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" - integrity sha512-2+ujAT2UMBzYFm7tidUsYh+ZoIutxJ3pN9IYrF1/H6dCKtECfhmB8UkHVpyxDwkj0CYbQG35ykoz925TUnBc3A== - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoping@^6.23.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" - integrity sha512-YiN6sFAQ5lML8JjCmr7uerS5Yc/EMbgg9G8ZNmk2E3nYX4ckHR01wrkeeMijEf5WHNK5TW0Sl0Uu3pv3EdOJWw== - dependencies: - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-plugin-transform-es2015-classes@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" - integrity sha512-5Dy7ZbRinGrNtmWpquZKZ3EGY8sDgIVB4CU8Om8q8tnMLrD/m94cKglVcHps0BCTdZ0TJeeAWOq2TK9MIY6cag== - dependencies: - babel-helper-define-map "^6.24.1" - babel-helper-function-name "^6.24.1" - babel-helper-optimise-call-expression "^6.24.1" - babel-helper-replace-supers "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-computed-properties@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" - integrity sha512-C/uAv4ktFP/Hmh01gMTvYvICrKze0XVX9f2PdIXuriCSvUmV9j+u+BB9f5fJK3+878yMK6dkdcq+Ymr9mrcLzw== - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-destructuring@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" - integrity sha512-aNv/GDAW0j/f4Uy1OEPZn1mqD+Nfy9viFGBfQ5bZyT35YqOiqx7/tXdyfZkJ1sC21NyEsBdfDY6PYmLHF4r5iA== - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-duplicate-keys@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" - integrity sha512-ossocTuPOssfxO2h+Z3/Ea1Vo1wWx31Uqy9vIiJusOP4TbF7tPs9U0sJ9pX9OJPf4lXRGj5+6Gkl/HHKiAP5ug== - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-for-of@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" - integrity sha512-DLuRwoygCoXx+YfxHLkVx5/NpeSbVwfoTeBykpJK7JhYWlL/O8hgAK/reforUnZDlxasOrVPPJVI/guE3dCwkw== - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-function-name@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" - integrity sha512-iFp5KIcorf11iBqu/y/a7DK3MN5di3pNCzto61FqCNnUX4qeBwcV1SLqe10oXNnCaxBUImX3SckX2/o1nsrTcg== - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" - integrity sha512-tjFl0cwMPpDYyoqYA9li1/7mGFit39XiNX5DKC/uCNjBctMxyL1/PT/l4rSlbvBG1pOKI88STRdUsWXB3/Q9hQ== - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" - integrity sha512-LnIIdGWIKdw7zwckqx+eGjcS8/cl8D74A3BpJbGjKTFFNJSMrjN4bIh22HY1AlkUbeLG6X6OZj56BDvWD+OeFA== - dependencies: - babel-plugin-transform-es2015-modules-commonjs "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: - version "6.26.2" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" - integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q== - dependencies: - babel-plugin-transform-strict-mode "^6.24.1" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-types "^6.26.0" - -babel-plugin-transform-es2015-modules-systemjs@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" - integrity sha512-ONFIPsq8y4bls5PPsAWYXH/21Hqv64TBxdje0FvU3MhIV6QM2j5YS7KvAzg/nTIVLot2D2fmFQrFWCbgHlFEjg== - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-umd@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" - integrity sha512-LpVbiT9CLsuAIp3IG0tfbVo81QIhn6pE8xBJ7XSeCtFlMltuar5VuBV6y6Q45tpui9QWcy5i0vLQfCfrnF7Kiw== - dependencies: - babel-plugin-transform-es2015-modules-amd "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-object-super@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" - integrity sha512-8G5hpZMecb53vpD3mjs64NhI1au24TAmokQ4B+TBFBjN9cVoGoOvotdrMMRmHvVZUEvqGUPWL514woru1ChZMA== - dependencies: - babel-helper-replace-supers "^6.24.1" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-parameters@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" - integrity sha512-8HxlW+BB5HqniD+nLkQ4xSAVq3bR/pcYW9IigY+2y0dI+Y7INFeTbfAQr+63T3E4UDsZGjyb+l9txUnABWxlOQ== - dependencies: - babel-helper-call-delegate "^6.24.1" - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-shorthand-properties@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" - integrity sha512-mDdocSfUVm1/7Jw/FIRNw9vPrBQNePy6wZJlR8HAUBLybNp1w/6lr6zZ2pjMShee65t/ybR5pT8ulkLzD1xwiw== - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-spread@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" - integrity sha512-3Ghhi26r4l3d0Js933E5+IhHwk0A1yiutj9gwvzmFbVV0sPMYk2lekhOufHBswX7NCoSeF4Xrl3sCIuSIa+zOg== - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-sticky-regex@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" - integrity sha512-CYP359ADryTo3pCsH0oxRo/0yn6UsEZLqYohHmvLQdfS9xkf+MbCzE3/Kolw9OYIY4ZMilH25z/5CbQbwDD+lQ== - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-template-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" - integrity sha512-x8b9W0ngnKzDMHimVtTfn5ryimars1ByTqsfBDwAqLibmuuQY6pgBQi5z1ErIsUOWBdw1bW9FSz5RZUojM4apg== - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-typeof-symbol@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" - integrity sha512-fz6J2Sf4gYN6gWgRZaoFXmq93X+Li/8vf+fb0sGDVtdeWvxC9y5/bTD7bvfWMEq6zetGEHpWjtzRGSugt5kNqw== - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-unicode-regex@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" - integrity sha512-v61Dbbihf5XxnYjtBN04B/JBvsScY37R1cZT5r9permN1cp+b70DY3Ib3fIkgn1DI9U3tGgBJZVD8p/mE/4JbQ== - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - regexpu-core "^2.0.0" - -babel-plugin-transform-exponentiation-operator@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" - integrity sha512-LzXDmbMkklvNhprr20//RStKVcT8Cu+SQtX18eMHLhjHf2yFzwtQ0S2f0jQ+89rokoNdmwoSqYzAhq86FxlLSQ== - dependencies: - babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" - babel-plugin-syntax-exponentiation-operator "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-regenerator@^6.22.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" - integrity sha512-LS+dBkUGlNR15/5WHKe/8Neawx663qttS6AGqoOUhICc9d1KciBvtrQSuc0PI+CxQ2Q/S1aKuJ+u64GtLdcEZg== - dependencies: - regenerator-transform "^0.10.0" - -babel-plugin-transform-strict-mode@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" - integrity sha512-j3KtSpjyLSJxNoCDrhwiJad8kw0gJ9REGj8/CqL0HeRyLnvUNYV9zcqluL6QJSXh3nfsLEmSLvwRfGzrgR96Pw== - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-preset-env@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" - integrity sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg== - dependencies: - babel-plugin-check-es2015-constants "^6.22.0" - babel-plugin-syntax-trailing-function-commas "^6.22.0" - babel-plugin-transform-async-to-generator "^6.22.0" - babel-plugin-transform-es2015-arrow-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoping "^6.23.0" - babel-plugin-transform-es2015-classes "^6.23.0" - babel-plugin-transform-es2015-computed-properties "^6.22.0" - babel-plugin-transform-es2015-destructuring "^6.23.0" - babel-plugin-transform-es2015-duplicate-keys "^6.22.0" - babel-plugin-transform-es2015-for-of "^6.23.0" - babel-plugin-transform-es2015-function-name "^6.22.0" - babel-plugin-transform-es2015-literals "^6.22.0" - babel-plugin-transform-es2015-modules-amd "^6.22.0" - babel-plugin-transform-es2015-modules-commonjs "^6.23.0" - babel-plugin-transform-es2015-modules-systemjs "^6.23.0" - babel-plugin-transform-es2015-modules-umd "^6.23.0" - babel-plugin-transform-es2015-object-super "^6.22.0" - babel-plugin-transform-es2015-parameters "^6.23.0" - babel-plugin-transform-es2015-shorthand-properties "^6.22.0" - babel-plugin-transform-es2015-spread "^6.22.0" - babel-plugin-transform-es2015-sticky-regex "^6.22.0" - babel-plugin-transform-es2015-template-literals "^6.22.0" - babel-plugin-transform-es2015-typeof-symbol "^6.23.0" - babel-plugin-transform-es2015-unicode-regex "^6.22.0" - babel-plugin-transform-exponentiation-operator "^6.22.0" - babel-plugin-transform-regenerator "^6.22.0" - browserslist "^3.2.6" - invariant "^2.2.2" - semver "^5.3.0" - -babel-register@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" - integrity sha512-veliHlHX06wjaeY8xNITbveXSiI+ASFnOqvne/LaIJIqOWi2Ogmj91KOugEz/hoh/fwMhXNBJPCv8Xaz5CyM4A== - dependencies: - babel-core "^6.26.0" - babel-runtime "^6.26.0" - core-js "^2.5.0" - home-or-tmp "^2.0.0" - lodash "^4.17.4" - mkdirp "^0.5.1" - source-map-support "^0.4.15" - -babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - integrity sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g== - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" - -babel-template@^6.24.1, babel-template@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" - integrity sha512-PCOcLFW7/eazGUKIoqH97sO9A2UYMahsn/yRQ7uOk37iutwjq7ODtcTNF+iFDSHNfkctqsLRjLP7URnOx0T1fg== - dependencies: - babel-runtime "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - lodash "^4.17.4" - -babel-traverse@^6.24.1, babel-traverse@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" - integrity sha512-iSxeXx7apsjCHe9c7n8VtRXGzI2Bk1rBSOJgCCjfyXb6v1aCqE1KSEpq/8SXuVN8Ka/Rh1WDTF0MDzkvTA4MIA== - dependencies: - babel-code-frame "^6.26.0" - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - debug "^2.6.8" - globals "^9.18.0" - invariant "^2.2.2" - lodash "^4.17.4" - -babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" - integrity sha512-zhe3V/26rCWsEZK8kZN+HaQj5yQ1CilTObixFzKW1UWjqG7618Twz6YEsCnjfg5gBcJh02DrpCkS9h98ZqDY+g== - dependencies: - babel-runtime "^6.26.0" - esutils "^2.0.2" - lodash "^4.17.4" - to-fast-properties "^1.0.3" - -babelify@^7.3.0: - version "7.3.0" - resolved "https://registry.yarnpkg.com/babelify/-/babelify-7.3.0.tgz#aa56aede7067fd7bd549666ee16dc285087e88e5" - integrity sha512-vID8Fz6pPN5pJMdlUnNFSfrlcx5MUule4k9aKs/zbZPyXxMTcRrB0M4Tarw22L8afr8eYSWxDPYCob3TdrqtlA== - dependencies: - babel-core "^6.0.14" - object-assign "^4.0.0" - -babylon@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" - integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== - -backoff@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/backoff/-/backoff-2.5.0.tgz#f616eda9d3e4b66b8ca7fca79f695722c5f8e26f" - integrity sha512-wC5ihrnUXmR2douXmXLCe5O3zg3GKIyvRi/hi58a/XyRxVI+3/yM0PYueQOZXPXQ9pxBislYkw+sF9b7C/RuMA== - dependencies: - precond "0.2" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base-x@^2.0.1: - version "2.0.6" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-2.0.6.tgz#4582a91ebcec99ee06f4e4032030b0cf1c2941d8" - integrity sha512-UAmjxz9KbK+YIi66xej+pZVo/vxUOh49ubEvZW5egCbxhur05pBb+hwuireQwKO4nDpsNm64/jEei17LEpsr5g== - dependencies: - safe-buffer "^5.0.1" - -base-x@^3.0.2, base-x@^3.0.8: - version "3.0.10" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.10.tgz#62de58653f8762b5d6f8d9fe30fa75f7b2585a75" - integrity sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ== - dependencies: - safe-buffer "^5.0.1" - -base-x@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-5.0.0.tgz#6d835ceae379130e1a4cb846a70ac4746f28ea9b" - integrity sha512-sMW3VGSX1QWVFA6l8U62MLKz29rRfpTlYdCqLdpLo1/Yd4zZwSbnUaDfciIAowAqvq7YFnWq9hrhdg1KYgc1lQ== - -base64-js@^1.0.2, base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== - dependencies: - tweetnacl "^0.14.3" - -bech32@1.1.4, bech32@^1.1.3: - version "1.1.4" - resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" - integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== - -big-integer@1.6.36: - version "1.6.36" - resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.36.tgz#78631076265d4ae3555c04f85e7d9d2f3a071a36" - integrity sha512-t70bfa7HYEA1D9idDbmuv7YbsbVkQ+Hp+8KFSul4aE5e/i1bjCNIRYJZlA8Q8p0r9T8cF/RVvwUgRA//FydEyg== - -big.js@^6.0.3: - version "6.2.1" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-6.2.1.tgz#7205ce763efb17c2e41f26f121c420c6a7c2744f" - integrity sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ== - -bignumber.js@^7.2.0, bignumber.js@^7.2.1: - version "7.2.1" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-7.2.1.tgz#80c048759d826800807c4bfd521e50edbba57a5f" - integrity sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ== - -bignumber.js@^8.0.2: - version "8.1.1" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-8.1.1.tgz#4b072ae5aea9c20f6730e4e5d529df1271c4d885" - integrity sha512-QD46ppGintwPGuL1KqmwhR0O+N2cZUg8JG/VzwI2e28sM9TqHjQB10lI4QAaMHVbLzwVLLAwEglpKPViWX+5NQ== - -bignumber.js@^9.0.0, bignumber.js@^9.0.1: - version "9.1.2" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.2.tgz#b7c4242259c008903b13707983b5f4bbd31eda0c" - integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== - -binary-extensions@^1.0.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" - integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== - -binary-extensions@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" - integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== - -bindings@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" - integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== - dependencies: - file-uri-to-path "1.0.0" - -bintrees@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bintrees/-/bintrees-1.0.2.tgz#49f896d6e858a4a499df85c38fb399b9aff840f8" - integrity sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw== - -bip39@2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/bip39/-/bip39-2.5.0.tgz#51cbd5179460504a63ea3c000db3f787ca051235" - integrity sha512-xwIx/8JKoT2+IPJpFEfXoWdYwP7UVAoUxxLNfGCfVowaJE7yg1Y5B1BVPqlUNsBq5/nGwmFkwRJ8xDW4sX8OdA== - dependencies: - create-hash "^1.1.0" - pbkdf2 "^3.0.9" - randombytes "^2.0.1" - safe-buffer "^5.0.1" - unorm "^1.3.3" - -bl@^1.0.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.3.tgz#1e8dd80142eac80d7158c9dccc047fb620e035e7" - integrity sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww== - dependencies: - readable-stream "^2.3.5" - safe-buffer "^5.1.1" - -blakejs@^1.1.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" - integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== - -bluebird@^3.4.1, bluebird@^3.5.0, bluebird@^3.5.2: - version "3.7.2" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" - integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== - -bn.js@4.11.6: - version "4.11.6" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" - integrity sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA== - -bn.js@4.11.8: - version "4.11.8" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" - integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== - -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.10.0, bn.js@^4.11.0, bn.js@^4.11.6, bn.js@^4.11.8, bn.js@^4.11.9, bn.js@^4.4.0, bn.js@^4.8.0: - version "4.12.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== - -bn.js@^5.0.0, bn.js@^5.1.2, bn.js@^5.1.3, bn.js@^5.2.0, bn.js@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" - integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== - -body-parser@1.20.2, body-parser@^1.16.0: - version "1.20.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" - integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== - dependencies: - bytes "3.1.2" - content-type "~1.0.5" - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - http-errors "2.0.0" - iconv-lite "0.4.24" - on-finished "2.4.1" - qs "6.11.0" - raw-body "2.5.2" - type-is "~1.6.18" - unpipe "1.0.0" - -boolbase@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" - integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== - -borsh@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/borsh/-/borsh-1.0.0.tgz#b564c8cc8f7a91e3772b9aef9e07f62b84213c1f" - integrity sha512-fSVWzzemnyfF89EPwlUNsrS5swF5CrtiN4e+h0/lLf4dz2he4L3ndM20PS9wj7ICSkXJe/TQUHdaPTq15b1mNQ== - -boxen@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" - integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== - dependencies: - ansi-align "^3.0.0" - camelcase "^6.2.0" - chalk "^4.1.0" - cli-boxes "^2.2.1" - string-width "^4.2.2" - type-fest "^0.20.2" - widest-line "^3.1.0" - wrap-ansi "^7.0.0" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -braces@^1.8.2: - version "1.8.5" - resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" - integrity sha512-xU7bpz2ytJl1bH9cgIurjpg/n8Gohy9GTw81heDYLJQ4RU60dlyJsa+atVF2pI0yMMvKxI9HkKwjePCj5XI1hw== - dependencies: - expand-range "^1.8.1" - preserve "^0.2.0" - repeat-element "^1.1.2" - -braces@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - -braces@^3.0.3, braces@~3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" - integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== - dependencies: - fill-range "^7.1.1" - -brorand@^1.0.1, brorand@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== - -browser-stdout@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" - integrity sha512-7Rfk377tpSM9TWBEeHs0FlDZGoAIei2V/4MdZJoFMBFAK6BqLpxAIUepGRHGdPFgGsLb02PXovC4qddyHvQqTg== - -browser-stdout@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" - integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== - -browserify-aes@^1.0.4, browserify-aes@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" - integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== - dependencies: - buffer-xor "^1.0.3" - cipher-base "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.3" - inherits "^2.0.1" - safe-buffer "^5.0.1" - -browserify-cipher@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" - integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== - dependencies: - browserify-aes "^1.0.4" - browserify-des "^1.0.0" - evp_bytestokey "^1.0.0" - -browserify-des@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" - integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== - dependencies: - cipher-base "^1.0.1" - des.js "^1.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -browserify-rsa@^4.0.0, browserify-rsa@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" - integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== - dependencies: - bn.js "^5.0.0" - randombytes "^2.0.1" - -browserify-sign@^4.0.0: - version "4.2.3" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.3.tgz#7afe4c01ec7ee59a89a558a4b75bd85ae62d4208" - integrity sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw== - dependencies: - bn.js "^5.2.1" - browserify-rsa "^4.1.0" - create-hash "^1.2.0" - create-hmac "^1.1.7" - elliptic "^6.5.5" - hash-base "~3.0" - inherits "^2.0.4" - parse-asn1 "^5.1.7" - readable-stream "^2.3.8" - safe-buffer "^5.2.1" - -browserslist@^3.2.6: - version "3.2.8" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" - integrity sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ== - dependencies: - caniuse-lite "^1.0.30000844" - electron-to-chromium "^1.3.47" - -bs58@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.0.tgz#65f5deaf6d74e6135a99f763ca6209ab424b9172" - integrity sha512-/jcGuUuSebyxwLLfKrbKnCJttxRf9PM51EnHTwmFKBxl4z1SGkoAhrfd6uZKE0dcjQTfm6XzTP8DPr1tzE4KIw== - dependencies: - base-x "^2.0.1" - -bs58@^4.0.0, bs58@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" - integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== - dependencies: - base-x "^3.0.2" - -bs58@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/bs58/-/bs58-6.0.0.tgz#a2cda0130558535dd281a2f8697df79caaf425d8" - integrity sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw== - dependencies: - base-x "^5.0.0" - -bs58check@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" - integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== - dependencies: - bs58 "^4.0.0" - create-hash "^1.1.0" - safe-buffer "^5.1.2" - -bs58check@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-4.0.0.tgz#46cda52a5713b7542dcb78ec2efdf78f5bf1d23c" - integrity sha512-FsGDOnFg9aVI9erdriULkd/JjEWONV/lQE5aYziB5PoBsXRind56lh8doIZIc9X4HoxT5x4bLjMWN1/NB8Zp5g== - dependencies: - "@noble/hashes" "^1.2.0" - bs58 "^6.0.0" - -bsert@^0.0.10: - version "0.0.10" - resolved "https://registry.yarnpkg.com/bsert/-/bsert-0.0.10.tgz#231ac82873a1418c6ade301ab5cd9ae385895597" - integrity sha512-NHNwlac+WPy4t2LoNh8pXk8uaIGH3NSaIUbTTRXGpE2WEbq0te/tDykYHkFK57YKLPjv/aGHmbqvnGeVWDz57Q== - -buffer-alloc-unsafe@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" - integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== - -buffer-alloc@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" - integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== - dependencies: - buffer-alloc-unsafe "^1.1.0" - buffer-fill "^1.0.0" - -buffer-crc32@~0.2.3: - version "0.2.13" - resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" - integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== - -buffer-fill@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" - integrity sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ== - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -buffer-to-arraybuffer@^0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz#6064a40fa76eb43c723aba9ef8f6e1216d10511a" - integrity sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ== - -buffer-xor@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== - -buffer-xor@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-2.0.2.tgz#34f7c64f04c777a1f8aac5e661273bb9dd320289" - integrity sha512-eHslX0bin3GB+Lx2p7lEYRShRewuNZL3fUl4qlVJGGiwoPGftmt8JQgk2Y9Ji5/01TnVDo33E5b5O3vUB1HdqQ== - dependencies: - safe-buffer "^5.1.1" - -buffer@4.9.2: - version "4.9.2" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" - integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - isarray "^1.0.0" - -buffer@6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" - integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.2.1" - -buffer@^5.0.5, buffer@^5.2.1, buffer@^5.5.0, buffer@^5.6.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -bufferutil@^4.0.1: - version "4.0.8" - resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.8.tgz#1de6a71092d65d7766c4d8a522b261a6e787e8ea" - integrity sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw== - dependencies: - node-gyp-build "^4.3.0" - -bytes@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== - -bytewise-core@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/bytewise-core/-/bytewise-core-1.2.3.tgz#3fb410c7e91558eb1ab22a82834577aa6bd61d42" - integrity sha512-nZD//kc78OOxeYtRlVk8/zXqTB4gf/nlguL1ggWA8FuchMyOxcyHR4QPQZMUmA7czC+YnaBrPUCubqAWe50DaA== - dependencies: - typewise-core "^1.2" - -bytewise@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/bytewise/-/bytewise-1.1.0.tgz#1d13cbff717ae7158094aa881b35d081b387253e" - integrity sha512-rHuuseJ9iQ0na6UDhnrRVDh8YnWVlU6xM3VH6q/+yHDeUH2zIhUzP+2/h3LIrhLDBtTqzWpE3p3tP/boefskKQ== - dependencies: - bytewise-core "^1.2.2" - typewise "^1.0.3" - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - -cacheable-lookup@^5.0.3: - version "5.0.4" - resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" - integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== - -cacheable-lookup@^6.0.4: - version "6.1.0" - resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz#0330a543471c61faa4e9035db583aad753b36385" - integrity sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww== - -cacheable-request@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" - integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== - dependencies: - clone-response "^1.0.2" - get-stream "^5.1.0" - http-cache-semantics "^4.0.0" - keyv "^3.0.0" - lowercase-keys "^2.0.0" - normalize-url "^4.1.0" - responselike "^1.0.2" - -cacheable-request@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.4.tgz#7a33ebf08613178b403635be7b899d3e69bbe817" - integrity sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg== - dependencies: - clone-response "^1.0.2" - get-stream "^5.1.0" - http-cache-semantics "^4.0.0" - keyv "^4.0.0" - lowercase-keys "^2.0.0" - normalize-url "^6.0.1" - responselike "^2.0.0" - -cachedown@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/cachedown/-/cachedown-1.0.0.tgz#d43f036e4510696b31246d7db31ebf0f7ac32d15" - integrity sha512-t+yVk82vQWCJF3PsWHMld+jhhjkkWjcAzz8NbFx1iULOXWl8Tm/FdM4smZNVw3MRr0X+lVTx9PKzvEn4Ng19RQ== - dependencies: - abstract-leveldown "^2.4.1" - lru-cache "^3.2.0" - -call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7, call-bind@~1.0.2: - version "1.0.7" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" - integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - set-function-length "^1.2.1" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camel-case@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" - integrity sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w== - dependencies: - no-case "^2.2.0" - upper-case "^1.1.1" - -camel-case@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" - integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== - dependencies: - pascal-case "^3.1.2" - tslib "^2.0.3" - -camelcase@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" - integrity sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg== - -camelcase@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" - integrity sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw== - -camelcase@^6.0.0, camelcase@^6.2.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -caniuse-lite@^1.0.30000844: - version "1.0.30001657" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001657.tgz#29fd504bffca719d1c6b63a1f6f840be1973a660" - integrity sha512-DPbJAlP8/BAXy3IgiWmZKItubb3TYGP0WscQQlVGIfT4s/YlFYVuJgyOsQNP7rJRChx/qdMeLJQJP0Sgg2yjNA== - -capability@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/capability/-/capability-0.2.5.tgz#51ad87353f1936ffd77f2f21c74633a4dea88801" - integrity sha512-rsJZYVCgXd08sPqwmaIqjAd5SUTfonV0z/gDJ8D6cN8wQphky1kkAYEqQ+hmDxTw7UihvBfjUVUSY+DBEe44jg== - -capital-case@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/capital-case/-/capital-case-1.0.4.tgz#9d130292353c9249f6b00fa5852bee38a717e669" - integrity sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - upper-case-first "^2.0.2" - -caseless@^0.12.0, caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== - -cbor@^4.1.5: - version "4.3.0" - resolved "https://registry.yarnpkg.com/cbor/-/cbor-4.3.0.tgz#0217c1cadd067d9112f44336dca07e72020bb804" - integrity sha512-CvzaxQlaJVa88sdtTWvLJ++MbdtPHtZOBBNjm7h3YKUHILMs9nQyD4AC6hvFZy7GBVB3I6bRibJcxeHydyT2IQ== - dependencies: - bignumber.js "^9.0.0" - commander "^3.0.0" - json-text-sequence "^0.1" - nofilter "^1.0.3" - -cbor@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/cbor/-/cbor-5.2.0.tgz#4cca67783ccd6de7b50ab4ed62636712f287a67c" - integrity sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A== - dependencies: - bignumber.js "^9.0.1" - nofilter "^1.0.4" - -cbor@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/cbor/-/cbor-8.1.0.tgz#cfc56437e770b73417a2ecbfc9caf6b771af60d5" - integrity sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg== - dependencies: - nofilter "^3.1.0" - -cbor@^9.0.0: - version "9.0.2" - resolved "https://registry.yarnpkg.com/cbor/-/cbor-9.0.2.tgz#536b4f2d544411e70ec2b19a2453f10f83cd9fdb" - integrity sha512-JPypkxsB10s9QOWwa6zwPzqE1Md3vqpPc+cai4sAecuCsRyAtAl/pMyhPlMbT/xtPnm2dznJZYRLui57qiRhaQ== - dependencies: - nofilter "^3.1.0" - -chai-as-promised@^7.1.1: - version "7.1.2" - resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-7.1.2.tgz#70cd73b74afd519754161386421fb71832c6d041" - integrity sha512-aBDHZxRzYnUYuIAIPBH2s511DjlKPzXNlXSGFC8CwmroWQLfrW0LtE1nK3MAwwNhJPa9raEjNCmRoFpG0Hurdw== - dependencies: - check-error "^1.0.2" - -chai-bn@^0.2.1: - version "0.2.2" - resolved "https://registry.yarnpkg.com/chai-bn/-/chai-bn-0.2.2.tgz#4dcf30dbc79db2378a00781693bc749c972bf34f" - integrity sha512-MzjelH0p8vWn65QKmEq/DLBG1Hle4WeyqT79ANhXZhn/UxRWO0OogkAxi5oGGtfzwU9bZR8mvbvYdoqNVWQwFg== - -chai@^4.2.0, chai@^4.3.6: - version "4.5.0" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.5.0.tgz#707e49923afdd9b13a8b0b47d33d732d13812fd8" - integrity sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw== - dependencies: - assertion-error "^1.1.0" - check-error "^1.0.3" - deep-eql "^4.1.3" - get-func-name "^2.0.2" - loupe "^2.3.6" - pathval "^1.1.1" - type-detect "^4.1.0" - -chalk@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A== - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - -chalk@^2.1.0, chalk@^2.3.2, chalk@^2.4.1, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.1.0, chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -change-case@3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/change-case/-/change-case-3.0.2.tgz#fd48746cce02f03f0a672577d1d3a8dc2eceb037" - integrity sha512-Mww+SLF6MZ0U6kdg11algyKd5BARbyM4TbFBepwowYSR5ClfQGCGtxNXgykpN0uF/bstWeaGDT4JWaDh8zWAHA== - dependencies: - camel-case "^3.0.0" - constant-case "^2.0.0" - dot-case "^2.1.0" - header-case "^1.0.0" - is-lower-case "^1.1.0" - is-upper-case "^1.1.0" - lower-case "^1.1.1" - lower-case-first "^1.0.0" - no-case "^2.3.2" - param-case "^2.1.0" - pascal-case "^2.0.0" - path-case "^2.1.0" - sentence-case "^2.1.0" - snake-case "^2.1.0" - swap-case "^1.1.0" - title-case "^2.1.0" - upper-case "^1.1.1" - upper-case-first "^1.1.0" - -change-case@^4.1.1: - version "4.1.2" - resolved "https://registry.yarnpkg.com/change-case/-/change-case-4.1.2.tgz#fedfc5f136045e2398c0410ee441f95704641e12" - integrity sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A== - dependencies: - camel-case "^4.1.2" - capital-case "^1.0.4" - constant-case "^3.0.4" - dot-case "^3.0.4" - header-case "^2.0.4" - no-case "^3.0.4" - param-case "^3.0.4" - pascal-case "^3.1.2" - path-case "^3.0.4" - sentence-case "^3.0.4" - snake-case "^3.0.4" - tslib "^2.0.3" - -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - -"charenc@>= 0.0.1": - version "0.0.2" - resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" - integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== - -check-error@^1.0.2, check-error@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694" - integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== - dependencies: - get-func-name "^2.0.2" - -checkpoint-store@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/checkpoint-store/-/checkpoint-store-1.1.0.tgz#04e4cb516b91433893581e6d4601a78e9552ea06" - integrity sha512-J/NdY2WvIx654cc6LWSq/IYFFCUf75fFTgwzFnmbqyORH4MwgiQCgswLLKBGzmsyTI5V7i5bp/So6sMbDWhedg== - dependencies: - functional-red-black-tree "^1.0.1" - -cheerio-select@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-2.1.0.tgz#4d8673286b8126ca2a8e42740d5e3c4884ae21b4" - integrity sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g== - dependencies: - boolbase "^1.0.0" - css-select "^5.1.0" - css-what "^6.1.0" - domelementtype "^2.3.0" - domhandler "^5.0.3" - domutils "^3.0.1" - -cheerio@^1.0.0-rc.2: - version "1.0.0" - resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0.tgz#1ede4895a82f26e8af71009f961a9b8cb60d6a81" - integrity sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww== - dependencies: - cheerio-select "^2.1.0" - dom-serializer "^2.0.0" - domhandler "^5.0.3" - domutils "^3.1.0" - encoding-sniffer "^0.2.0" - htmlparser2 "^9.1.0" - parse5 "^7.1.2" - parse5-htmlparser2-tree-adapter "^7.0.0" - parse5-parser-stream "^7.1.2" - undici "^6.19.5" - whatwg-mimetype "^4.0.0" - -chokidar@^1.6.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" - integrity sha512-mk8fAWcRUOxY7btlLtitj3A45jOwSAxH4tOFOoEGbVsl6cL6pPMWUy7dwZ/canfj3QEdP6FHSnf/l1c6/WkzVg== - dependencies: - anymatch "^1.3.0" - async-each "^1.0.0" - glob-parent "^2.0.0" - inherits "^2.0.1" - is-binary-path "^1.0.0" - is-glob "^2.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.0.0" - optionalDependencies: - fsevents "^1.0.0" - -chokidar@^3.4.0, chokidar@^3.5.3: - version "3.6.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" - integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -chownr@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" - integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== - -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== - -cids@^0.7.1: - version "0.7.5" - resolved "https://registry.yarnpkg.com/cids/-/cids-0.7.5.tgz#60a08138a99bfb69b6be4ceb63bfef7a396b28b2" - integrity sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA== - dependencies: - buffer "^5.5.0" - class-is "^1.1.0" - multibase "~0.6.0" - multicodec "^1.0.0" - multihashes "~0.4.15" - -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" - integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -class-is@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/class-is/-/class-is-1.1.0.tgz#9d3c0fba0440d211d843cec3dedfa48055005825" - integrity sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw== - -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -cli-boxes@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" - integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== - -cli-cursor@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - integrity sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw== - dependencies: - restore-cursor "^2.0.0" - -cli-cursor@^3.0.0, cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - -cli-table3@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202" - integrity sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw== - dependencies: - object-assign "^4.1.0" - string-width "^2.1.1" - optionalDependencies: - colors "^1.1.2" - -cli-width@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" - integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== - -cli-width@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" - integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== - -cliui@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" - integrity sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w== - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - wrap-ansi "^2.0.0" - -cliui@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" - integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== - dependencies: - string-width "^2.1.1" - strip-ansi "^4.0.0" - wrap-ansi "^2.0.0" - -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - -clone-response@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3" - integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== - dependencies: - mimic-response "^1.0.0" - -clone@2.1.2, clone@^2.0.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" - integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w== - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== - -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== - -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw== - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -colors@1.4.0, colors@^1.1.2: - version "1.4.0" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" - integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== - -combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -command-exists@^1.2.8: - version "1.2.9" - resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" - integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== - -command-line-args@^4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-4.0.7.tgz#f8d1916ecb90e9e121eda6428e41300bfb64cc46" - integrity sha512-aUdPvQRAyBvQd2n7jXcsMDz68ckBJELXNzBybCHOibUWEg0mWTnaYCSRU8h9R+aNRSvDihJtssSRCiDRpLaezA== - dependencies: - array-back "^2.0.0" - find-replace "^1.0.3" - typical "^2.6.1" - -commander@2.11.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" - integrity sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ== - -commander@3.0.2, commander@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" - integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== - -commander@^2.15.1, commander@^2.8.1, commander@^2.9.0: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -commander@^8.1.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" - integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== - -compare-versions@^6.0.0: - version "6.1.1" - resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-6.1.1.tgz#7af3cc1099ba37d244b3145a9af5201b629148a9" - integrity sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg== - -component-emitter@^1.2.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.1.tgz#ef1d5796f7d93f135ee6fb684340b26403c97d17" - integrity sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -concat-stream@^1.5.1, concat-stream@^1.6.0, concat-stream@^1.6.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -configstore@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-4.0.0.tgz#5933311e95d3687efb592c528b922d9262d227e7" - integrity sha512-CmquAXFBocrzaSM8mtGPMM/HiWmyIpr4CcJl/rgY2uCObZ/S7cKU0silxslqJejl+t/T9HS8E0PUNQD81JGUEQ== - dependencies: - dot-prop "^4.1.0" - graceful-fs "^4.1.2" - make-dir "^1.0.0" - unique-string "^1.0.0" - write-file-atomic "^2.0.0" - xdg-basedir "^3.0.0" - -configstore@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" - integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== - dependencies: - dot-prop "^5.2.0" - graceful-fs "^4.1.2" - make-dir "^3.0.0" - unique-string "^2.0.0" - write-file-atomic "^3.0.0" - xdg-basedir "^4.0.0" - -constant-case@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/constant-case/-/constant-case-2.0.0.tgz#4175764d389d3fa9c8ecd29186ed6005243b6a46" - integrity sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ== - dependencies: - snake-case "^2.1.0" - upper-case "^1.1.1" - -constant-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/constant-case/-/constant-case-3.0.4.tgz#3b84a9aeaf4cf31ec45e6bf5de91bdfb0589faf1" - integrity sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - upper-case "^2.0.2" - -content-disposition@0.5.4: - version "0.5.4" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" - integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== - dependencies: - safe-buffer "5.2.1" - -content-hash@^2.5.2: - version "2.5.2" - resolved "https://registry.yarnpkg.com/content-hash/-/content-hash-2.5.2.tgz#bbc2655e7c21f14fd3bfc7b7d4bfe6e454c9e211" - integrity sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw== - dependencies: - cids "^0.7.1" - multicodec "^0.5.5" - multihashes "^0.4.15" - -content-type@~1.0.4, content-type@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" - integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== - -convert-source-map@^1.5.1: - version "1.9.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" - integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== - -cookie@0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" - integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== - -cookie@^0.4.1: - version "0.4.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" - integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== - -cookiejar@^2.1.1: - version "2.1.4" - resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.4.tgz#ee669c1fea2cf42dc31585469d193fef0d65771b" - integrity sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw== - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== - -core-js-pure@^3.0.1: - version "3.38.1" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.38.1.tgz#e8534062a54b7221344884ba9b52474be495ada3" - integrity sha512-BY8Etc1FZqdw1glX0XNOq2FDwfrg/VGqoZOZCdaL+UmdaqDwQwYXkMJT4t6In+zfEfOJDcM9T0KdbBeJg8KKCQ== - -core-js@3.6.5: - version "3.6.5" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.5.tgz#7395dc273af37fb2e50e9bd3d9fe841285231d1a" - integrity sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA== - -core-js@^2.4.0, core-js@^2.5.0: - version "2.6.12" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" - integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== - -core-util-is@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -cors@^2.8.1: - version "2.8.5" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" - integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== - dependencies: - object-assign "^4" - vary "^1" - -coveralls@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/coveralls/-/coveralls-3.1.1.tgz#f5d4431d8b5ae69c5079c8f8ca00d64ac77cf081" - integrity sha512-+dxnG2NHncSD1NrqbSM3dn/lE57O6Qf/koe9+I7c+wzkqRmEvcp0kgJdxKInzYzkICKkFMZsX3Vct3++tsF9ww== - dependencies: - js-yaml "^3.13.1" - lcov-parse "^1.0.0" - log-driver "^1.2.7" - minimist "^1.2.5" - request "^2.88.2" - -crc-32@^1.2.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" - integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== - -create-ecdh@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" - integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== - dependencies: - bn.js "^4.1.0" - elliptic "^6.5.3" - -create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" - integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - md5.js "^1.3.4" - ripemd160 "^2.0.1" - sha.js "^2.4.0" - -create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" - integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== - dependencies: - cipher-base "^1.0.3" - create-hash "^1.1.0" - inherits "^2.0.1" - ripemd160 "^2.0.0" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -cross-fetch@^2.1.0, cross-fetch@^2.1.1: - version "2.2.6" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-2.2.6.tgz#2ef0bb39a24ac034787965c457368a28730e220a" - integrity sha512-9JZz+vXCmfKUZ68zAptS7k4Nu8e2qcibe7WVZYps7sAgk5R8GYTc+T1WR0v1rlP9HxgARmOX1UTIJZFytajpNA== - dependencies: - node-fetch "^2.6.7" - whatwg-fetch "^2.0.4" - -cross-fetch@^3.1.4: - version "3.1.8" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82" - integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg== - dependencies: - node-fetch "^2.6.12" - -cross-fetch@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-4.0.0.tgz#f037aef1580bb3a1a35164ea2a848ba81b445983" - integrity sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g== - dependencies: - node-fetch "^2.6.12" - -cross-spawn@^5.0.1: - version "5.1.0" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" - integrity sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A== - dependencies: - lru-cache "^4.0.1" - shebang-command "^1.2.0" - which "^1.2.9" - -cross-spawn@^6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -"crypt@>= 0.0.1": - version "0.0.2" - resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" - integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== - -crypto-addr-codec@^0.1.7: - version "0.1.8" - resolved "https://registry.yarnpkg.com/crypto-addr-codec/-/crypto-addr-codec-0.1.8.tgz#45c4b24e2ebce8e24a54536ee0ca25b65787b016" - integrity sha512-GqAK90iLLgP3FvhNmHbpT3wR6dEdaM8hZyZtLX29SPardh3OA13RFLHDR6sntGCgRWOfiHqW6sIyohpNqOtV/g== - dependencies: - base-x "^3.0.8" - big-integer "1.6.36" - blakejs "^1.1.0" - bs58 "^4.0.1" - ripemd160-min "0.0.6" - safe-buffer "^5.2.0" - sha3 "^2.1.1" - -crypto-browserify@3.12.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" - integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== - dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - randomfill "^1.0.3" - -crypto-random-string@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" - integrity sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg== - -crypto-random-string@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" - integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== - -css-select@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" - integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== - dependencies: - boolbase "^1.0.0" - css-what "^6.1.0" - domhandler "^5.0.2" - domutils "^3.0.1" - nth-check "^2.0.1" - -css-what@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" - integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== - -d@1, d@^1.0.1, d@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.2.tgz#2aefd554b81981e7dccf72d6842ae725cb17e5de" - integrity sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw== - dependencies: - es5-ext "^0.10.64" - type "^2.7.2" - -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== - dependencies: - assert-plus "^1.0.0" - -data-view-buffer@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" - integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -data-view-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" - integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -data-view-byte-offset@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" - integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -death@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/death/-/death-1.1.0.tgz#01aa9c401edd92750514470b8266390c66c67318" - integrity sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w== - -debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@3.1.0, debug@=3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== - dependencies: - ms "2.0.0" - -debug@3.2.6: - version "3.2.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== - dependencies: - ms "^2.1.1" - -debug@4, debug@^4.0.1, debug@^4.1.1, debug@^4.3.1, debug@^4.3.5: - version "4.3.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b" - integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== - dependencies: - ms "2.1.2" - -debug@^3.0.1, debug@^3.1.0, debug@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -decamelize@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== - -decamelize@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" - integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== - -decode-uri-component@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" - integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== - -decompress-response@^3.2.0, decompress-response@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" - integrity sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA== - dependencies: - mimic-response "^1.0.0" - -decompress-response@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" - integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== - dependencies: - mimic-response "^3.1.0" - -decompress-tar@^4.0.0, decompress-tar@^4.1.0, decompress-tar@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-4.1.1.tgz#718cbd3fcb16209716e70a26b84e7ba4592e5af1" - integrity sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ== - dependencies: - file-type "^5.2.0" - is-stream "^1.1.0" - tar-stream "^1.5.2" - -decompress-tarbz2@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz#3082a5b880ea4043816349f378b56c516be1a39b" - integrity sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A== - dependencies: - decompress-tar "^4.1.0" - file-type "^6.1.0" - is-stream "^1.1.0" - seek-bzip "^1.0.5" - unbzip2-stream "^1.0.9" - -decompress-targz@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/decompress-targz/-/decompress-targz-4.1.1.tgz#c09bc35c4d11f3de09f2d2da53e9de23e7ce1eee" - integrity sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w== - dependencies: - decompress-tar "^4.1.1" - file-type "^5.2.0" - is-stream "^1.1.0" - -decompress-unzip@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/decompress-unzip/-/decompress-unzip-4.0.1.tgz#deaaccdfd14aeaf85578f733ae8210f9b4848f69" - integrity sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw== - dependencies: - file-type "^3.8.0" - get-stream "^2.2.0" - pify "^2.3.0" - yauzl "^2.4.2" - -decompress@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/decompress/-/decompress-4.2.1.tgz#007f55cc6a62c055afa37c07eb6a4ee1b773f118" - integrity sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ== - dependencies: - decompress-tar "^4.0.0" - decompress-tarbz2 "^4.0.0" - decompress-targz "^4.0.0" - decompress-unzip "^4.0.1" - graceful-fs "^4.1.10" - make-dir "^1.0.0" - pify "^2.3.0" - strip-dirs "^2.0.0" - -deep-eql@^4.0.1, deep-eql@^4.1.3: - version "4.1.4" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.4.tgz#d0d3912865911bb8fac5afb4e3acfa6a28dc72b7" - integrity sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg== - dependencies: - type-detect "^4.0.0" - -deep-equal@~1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.2.tgz#78a561b7830eef3134c7f6f3a3d6af272a678761" - integrity sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg== - dependencies: - is-arguments "^1.1.1" - is-date-object "^1.0.5" - is-regex "^1.1.4" - object-is "^1.1.5" - object-keys "^1.1.1" - regexp.prototype.flags "^1.5.1" - -deep-is@~0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -defer-to-connect@^1.0.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" - integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== - -defer-to-connect@^2.0.0, defer-to-connect@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" - integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== - -deferred-leveldown@~1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz#3acd2e0b75d1669924bc0a4b642851131173e1eb" - integrity sha512-uukrWD2bguRtXilKt6cAWKyoXrTSMo5m7crUdLfWQmu8kIm88w3QZoUL+6nhpfKVmhHANER6Re3sKoNoZ3IKMA== - dependencies: - abstract-leveldown "~2.6.0" - -deferred-leveldown@~4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-4.0.2.tgz#0b0570087827bf480a23494b398f04c128c19a20" - integrity sha512-5fMC8ek8alH16QiV0lTCis610D1Zt1+LA4MS4d63JgS32lrCjTFDUFz2ao09/j2I4Bqb5jL4FZYwu7Jz0XO1ww== - dependencies: - abstract-leveldown "~5.0.0" - inherits "^2.0.3" - -deferred-leveldown@~5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz#27a997ad95408b61161aa69bd489b86c71b78058" - integrity sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw== - dependencies: - abstract-leveldown "~6.2.1" - inherits "^2.0.3" - -define-data-property@^1.0.1, define-data-property@^1.1.1, define-data-property@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" - integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - gopd "^1.0.1" - -define-properties@^1.2.0, define-properties@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" - integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== - dependencies: - define-data-property "^1.0.1" - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA== - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA== - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - -defined@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.1.tgz#c0b9db27bfaffd95d6f61399419b893df0f91ebf" - integrity sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q== - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - -delimit-stream@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/delimit-stream/-/delimit-stream-0.1.0.tgz#9b8319477c0e5f8aeb3ce357ae305fc25ea1cd2b" - integrity sha512-a02fiQ7poS5CnjiJBAsjGLPp5EwVoGHNeu9sziBd9huppRfsAFIpv5zNLv0V1gbop53ilngAf5Kf331AwcoRBQ== - -depd@2.0.0, depd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== - -des.js@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.1.0.tgz#1d37f5766f3bbff4ee9638e871a8768c173b81da" - integrity sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg== - dependencies: - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -destroy@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" - integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== - -detect-indent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" - integrity sha512-BDKtmHlOzwI7iRuEkhzsnPoi5ypEhWAJB5RvHWe1kMr06js3uK5B3734i3ui5Yd+wOJV1cpE4JnivPD283GU/A== - dependencies: - repeating "^2.0.0" - -detect-indent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" - integrity sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g== - -diff@3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.3.1.tgz#aa8567a6eed03c531fc89d3f711cd0e5259dec75" - integrity sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww== - -diff@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" - integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== - -diff@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531" - integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== - -diffie-hellman@^5.0.0: - version "5.0.3" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" - integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== - dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" - -difflib@^0.2.4: - version "0.2.4" - resolved "https://registry.yarnpkg.com/difflib/-/difflib-0.2.4.tgz#b5e30361a6db023176d562892db85940a718f47e" - integrity sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w== - dependencies: - heap ">= 0.2.0" - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== - dependencies: - esutils "^2.0.2" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -dom-serializer@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" - integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== - dependencies: - domelementtype "^2.3.0" - domhandler "^5.0.2" - entities "^4.2.0" - -dom-storage@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/dom-storage/-/dom-storage-2.1.0.tgz#00fb868bc9201357ea243c7bcfd3304c1e34ea39" - integrity sha512-g6RpyWXzl0RR6OTElHKBl7nwnK87GUyZMYC7JWsB/IA73vpqK2K6LT39x4VepLxlSsWBFrPVLnsSR5Jyty0+2Q== - -dom-walk@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" - integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== - -domelementtype@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" - integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== - -domhandler@^5.0.2, domhandler@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" - integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== - dependencies: - domelementtype "^2.3.0" - -domutils@^3.0.1, domutils@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e" - integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== - dependencies: - dom-serializer "^2.0.0" - domelementtype "^2.3.0" - domhandler "^5.0.3" - -dot-case@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-2.1.1.tgz#34dcf37f50a8e93c2b3bca8bb7fb9155c7da3bee" - integrity sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug== - dependencies: - no-case "^2.2.0" - -dot-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" - integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -dot-prop@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.1.tgz#45884194a71fc2cda71cbb4bceb3a4dd2f433ba4" - integrity sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ== - dependencies: - is-obj "^1.0.0" - -dot-prop@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" - integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== - dependencies: - is-obj "^2.0.0" - -dotenv@^16.0.1: - version "16.4.5" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" - integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== - -dotignore@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/dotignore/-/dotignore-0.1.2.tgz#f942f2200d28c3a76fbdd6f0ee9f3257c8a2e905" - integrity sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw== - dependencies: - minimatch "^3.0.4" - -duplexer3@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.5.tgz#0b5e4d7bad5de8901ea4440624c8e1d20099217e" - integrity sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA== - -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== - -electron-to-chromium@^1.3.47: - version "1.5.15" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.15.tgz#3c969a29b03682db7a3032283ec8be6e75effe50" - integrity sha512-Z4rIDoImwEJW+YYKnPul4DzqsWVqYetYVN3XqDmRpgV0mjz0hYTaeeh+8/9CL1bk3AHYmF4freW/NTiVoXA2gA== - -elliptic@6.3.3: - version "6.3.3" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.3.3.tgz#5482d9646d54bcb89fd7d994fc9e2e9568876e3f" - integrity sha512-cIky9SO2H8W2eU1NOLySnhOYJnuEWCq9ZJeHvHd/lXzEL9vyraIMfilZSn57X3aVX+wkfYmqkch2LvmTzkjFpA== - dependencies: - bn.js "^4.4.0" - brorand "^1.0.1" - hash.js "^1.0.0" - inherits "^2.0.1" - -elliptic@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" - integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== - dependencies: - bn.js "^4.11.9" - brorand "^1.1.0" - hash.js "^1.0.0" - hmac-drbg "^1.0.1" - inherits "^2.0.4" - minimalistic-assert "^1.0.1" - minimalistic-crypto-utils "^1.0.1" - -elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.3, elliptic@^6.5.4, elliptic@^6.5.5: - version "6.5.7" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.7.tgz#8ec4da2cb2939926a1b9a73619d768207e647c8b" - integrity sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q== - dependencies: - bn.js "^4.11.9" - brorand "^1.1.0" - hash.js "^1.0.0" - hmac-drbg "^1.0.1" - inherits "^2.0.4" - minimalistic-assert "^1.0.1" - minimalistic-crypto-utils "^1.0.1" - -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== - -encoding-down@5.0.4, encoding-down@~5.0.0: - version "5.0.4" - resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-5.0.4.tgz#1e477da8e9e9d0f7c8293d320044f8b2cd8e9614" - integrity sha512-8CIZLDcSKxgzT+zX8ZVfgNbu8Md2wq/iqa1Y7zyVR18QBEAc0Nmzuvj/N5ykSKpfGzjM8qxbaFntLPwnVoUhZw== - dependencies: - abstract-leveldown "^5.0.0" - inherits "^2.0.3" - level-codec "^9.0.0" - level-errors "^2.0.0" - xtend "^4.0.1" - -encoding-down@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-6.3.0.tgz#b1c4eb0e1728c146ecaef8e32963c549e76d082b" - integrity sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw== - dependencies: - abstract-leveldown "^6.2.1" - inherits "^2.0.3" - level-codec "^9.0.0" - level-errors "^2.0.0" - -encoding-sniffer@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/encoding-sniffer/-/encoding-sniffer-0.2.0.tgz#799569d66d443babe82af18c9f403498365ef1d5" - integrity sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg== - dependencies: - iconv-lite "^0.6.3" - whatwg-encoding "^3.1.1" - -encoding@^0.1.11: - version "0.1.13" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" - integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== - dependencies: - iconv-lite "^0.6.2" - -end-of-stream@^1.0.0, end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -enquirer@^2.3.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" - integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== - dependencies: - ansi-colors "^4.1.1" - strip-ansi "^6.0.1" - -entities@^4.2.0, entities@^4.4.0, entities@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" - integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== - -env-paths@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" - integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== - -eol@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/eol/-/eol-0.9.1.tgz#f701912f504074be35c6117a5c4ade49cd547acd" - integrity sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg== - -errno@~0.1.1: - version "0.1.8" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" - integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== - dependencies: - prr "~1.0.1" - -error-ex@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -error-polyfill@^0.1.2: - version "0.1.3" - resolved "https://registry.yarnpkg.com/error-polyfill/-/error-polyfill-0.1.3.tgz#df848b61ad8834f7a5db69a70b9913df86721d15" - integrity sha512-XHJk60ufE+TG/ydwp4lilOog549iiQF2OAPhkk9DdiYWMrltz5yhDz/xnKuenNwP7gy3dsibssO5QpVhkrSzzg== - dependencies: - capability "^0.2.5" - o3 "^1.0.3" - u3 "^0.1.1" - -es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.2: - version "1.23.3" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" - integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== - dependencies: - array-buffer-byte-length "^1.0.1" - arraybuffer.prototype.slice "^1.0.3" - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - data-view-buffer "^1.0.1" - data-view-byte-length "^1.0.1" - data-view-byte-offset "^1.0.0" - es-define-property "^1.0.0" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - es-set-tostringtag "^2.0.3" - es-to-primitive "^1.2.1" - function.prototype.name "^1.1.6" - get-intrinsic "^1.2.4" - get-symbol-description "^1.0.2" - globalthis "^1.0.3" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - has-proto "^1.0.3" - has-symbols "^1.0.3" - hasown "^2.0.2" - internal-slot "^1.0.7" - is-array-buffer "^3.0.4" - is-callable "^1.2.7" - is-data-view "^1.0.1" - is-negative-zero "^2.0.3" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.3" - is-string "^1.0.7" - is-typed-array "^1.1.13" - is-weakref "^1.0.2" - object-inspect "^1.13.1" - object-keys "^1.1.1" - object.assign "^4.1.5" - regexp.prototype.flags "^1.5.2" - safe-array-concat "^1.1.2" - safe-regex-test "^1.0.3" - string.prototype.trim "^1.2.9" - string.prototype.trimend "^1.0.8" - string.prototype.trimstart "^1.0.8" - typed-array-buffer "^1.0.2" - typed-array-byte-length "^1.0.1" - typed-array-byte-offset "^1.0.2" - typed-array-length "^1.0.6" - unbox-primitive "^1.0.2" - which-typed-array "^1.1.15" - -es-array-method-boxes-properly@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" - integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== - -es-define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" - integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== - dependencies: - get-intrinsic "^1.2.4" - -es-errors@^1.2.1, es-errors@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" - integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== - -es-object-atoms@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" - integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== - dependencies: - es-errors "^1.3.0" - -es-set-tostringtag@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" - integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== - dependencies: - get-intrinsic "^1.2.4" - has-tostringtag "^1.0.2" - hasown "^2.0.1" - -es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" - integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== - dependencies: - hasown "^2.0.0" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -es5-ext@^0.10.35, es5-ext@^0.10.50, es5-ext@^0.10.62, es5-ext@^0.10.63, es5-ext@^0.10.64, es5-ext@~0.10.14: - version "0.10.64" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.64.tgz#12e4ffb48f1ba2ea777f1fcdd1918ef73ea21714" - integrity sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg== - dependencies: - es6-iterator "^2.0.3" - es6-symbol "^3.1.3" - esniff "^2.0.1" - next-tick "^1.1.0" - -es6-iterator@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" - integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g== - dependencies: - d "1" - es5-ext "^0.10.35" - es6-symbol "^3.1.1" - -es6-promise@^4.2.8: - version "4.2.8" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" - integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== - -es6-symbol@^3.1.1, es6-symbol@^3.1.3: - version "3.1.4" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.4.tgz#f4e7d28013770b4208ecbf3e0bf14d3bcb557b8c" - integrity sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg== - dependencies: - d "^1.0.2" - ext "^1.7.0" - -escalade@^3.1.1: - version "3.2.0" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" - integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== - -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== - -escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -escodegen@1.8.x: - version "1.8.1" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" - integrity sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A== - dependencies: - esprima "^2.7.1" - estraverse "^1.9.1" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.2.0" - -eslint-config-standard@^14.1.1: - version "14.1.1" - resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-14.1.1.tgz#830a8e44e7aef7de67464979ad06b406026c56ea" - integrity sha512-Z9B+VR+JIXRxz21udPTL9HpFMyoMUEeX1G251EQ6e05WD9aPVtVBn09XUmZ259wCMlCDmYDSZG62Hhm+ZTJcUg== - -eslint-import-resolver-node@^0.3.9: - version "0.3.9" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" - integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== - dependencies: - debug "^3.2.7" - is-core-module "^2.13.0" - resolve "^1.22.4" - -eslint-module-utils@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.9.0.tgz#95d4ac038a68cd3f63482659dffe0883900eb342" - integrity sha512-McVbYmwA3NEKwRQY5g4aWMdcZE5xZxV8i8l7CqJSrameuGSQJtSWaL/LxTEzSKKaCcOhlpDR8XEfYXWPrdo/ZQ== - dependencies: - debug "^3.2.7" - -eslint-plugin-es@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz#75a7cdfdccddc0589934aeeb384175f221c57893" - integrity sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ== - dependencies: - eslint-utils "^2.0.0" - regexpp "^3.0.0" - -eslint-plugin-import@^2.20.2: - version "2.30.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.30.0.tgz#21ceea0fc462657195989dd780e50c92fe95f449" - integrity sha512-/mHNE9jINJfiD2EKkg1BKyPyUk4zdnT54YgbOgfjSakWT5oyX/qQLVNTkehyfpcMxZXMy1zyonZ2v7hZTX43Yw== - dependencies: - "@rtsao/scc" "^1.1.0" - array-includes "^3.1.8" - array.prototype.findlastindex "^1.2.5" - array.prototype.flat "^1.3.2" - array.prototype.flatmap "^1.3.2" - debug "^3.2.7" - doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.9" - eslint-module-utils "^2.9.0" - hasown "^2.0.2" - is-core-module "^2.15.1" - is-glob "^4.0.3" - minimatch "^3.1.2" - object.fromentries "^2.0.8" - object.groupby "^1.0.3" - object.values "^1.2.0" - semver "^6.3.1" - tsconfig-paths "^3.15.0" - -eslint-plugin-node@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz#c95544416ee4ada26740a30474eefc5402dc671d" - integrity sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g== - dependencies: - eslint-plugin-es "^3.0.0" - eslint-utils "^2.0.0" - ignore "^5.1.1" - minimatch "^3.0.4" - resolve "^1.10.1" - semver "^6.1.0" - -eslint-plugin-promise@^4.0.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.3.1.tgz#61485df2a359e03149fdafc0a68b0e030ad2ac45" - integrity sha512-bY2sGqyptzFBDLh/GMbAxfdJC+b0f23ME63FOE4+Jao0oZ3E1LEwFtWJX/1pGMJLiTtrSSern2CRM/g+dfc0eQ== - -eslint-plugin-standard@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-4.1.0.tgz#0c3bf3a67e853f8bbbc580fb4945fbf16f41b7c5" - integrity sha512-ZL7+QRixjTR6/528YNGyDotyffm5OQst/sGxKDwGb9Uqs4In5Egi4+jbobhqJoyoCM6/7v/1A5fhQ7ScMtDjaQ== - -eslint-scope@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -eslint-utils@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" - integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== - dependencies: - eslint-visitor-keys "^1.1.0" - -eslint-utils@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" - integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== - dependencies: - eslint-visitor-keys "^1.1.0" - -eslint-visitor-keys@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" - integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== - -eslint@^6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" - integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== - dependencies: - "@babel/code-frame" "^7.0.0" - ajv "^6.10.0" - chalk "^2.1.0" - cross-spawn "^6.0.5" - debug "^4.0.1" - doctrine "^3.0.0" - eslint-scope "^5.0.0" - eslint-utils "^1.4.3" - eslint-visitor-keys "^1.1.0" - espree "^6.1.2" - esquery "^1.0.1" - esutils "^2.0.2" - file-entry-cache "^5.0.1" - functional-red-black-tree "^1.0.1" - glob-parent "^5.0.0" - globals "^12.1.0" - ignore "^4.0.6" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - inquirer "^7.0.0" - is-glob "^4.0.0" - js-yaml "^3.13.1" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.14" - minimatch "^3.0.4" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - optionator "^0.8.3" - progress "^2.0.0" - regexpp "^2.0.1" - semver "^6.1.2" - strip-ansi "^5.2.0" - strip-json-comments "^3.0.1" - table "^5.2.3" - text-table "^0.2.0" - v8-compile-cache "^2.0.3" - -esniff@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/esniff/-/esniff-2.0.1.tgz#a4d4b43a5c71c7ec51c51098c1d8a29081f9b308" - integrity sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg== - dependencies: - d "^1.0.1" - es5-ext "^0.10.62" - event-emitter "^0.3.5" - type "^2.7.2" - -espree@^6.1.2: - version "6.2.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" - integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw== - dependencies: - acorn "^7.1.1" - acorn-jsx "^5.2.0" - eslint-visitor-keys "^1.1.0" - -esprima@2.7.x, esprima@^2.7.1: - version "2.7.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" - integrity sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A== - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esquery@^1.0.1: - version "1.6.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" - integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^1.9.1: - version "1.9.3" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" - integrity sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA== - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.1.0, estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== - -eth-block-tracker@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/eth-block-tracker/-/eth-block-tracker-3.0.1.tgz#95cd5e763c7293e0b1b2790a2a39ac2ac188a5e1" - integrity sha512-WUVxWLuhMmsfenfZvFO5sbl1qFY2IqUlw/FPVmjjdElpqLsZtSG+wPe9Dz7W/sB6e80HgFKknOmKk2eNlznHug== - dependencies: - eth-query "^2.1.0" - ethereumjs-tx "^1.3.3" - ethereumjs-util "^5.1.3" - ethjs-util "^0.1.3" - json-rpc-engine "^3.6.0" - pify "^2.3.0" - tape "^4.6.3" - -eth-ens-namehash@2.0.8, eth-ens-namehash@^2.0.8: - version "2.0.8" - resolved "https://registry.yarnpkg.com/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz#229ac46eca86d52e0c991e7cb2aef83ff0f68bcf" - integrity sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw== - dependencies: - idna-uts46-hx "^2.3.1" - js-sha3 "^0.5.7" - -eth-gas-reporter@^0.2.17: - version "0.2.27" - resolved "https://registry.yarnpkg.com/eth-gas-reporter/-/eth-gas-reporter-0.2.27.tgz#928de8548a674ed64c7ba0bf5795e63079150d4e" - integrity sha512-femhvoAM7wL0GcI8ozTdxfuBtBFJ9qsyIAsmKVjlWAHUbdnnXHt+lKzz/kmldM5lA9jLuNHGwuIxorNpLbR1Zw== - dependencies: - "@solidity-parser/parser" "^0.14.0" - axios "^1.5.1" - cli-table3 "^0.5.0" - colors "1.4.0" - ethereum-cryptography "^1.0.3" - ethers "^5.7.2" - fs-readdir-recursive "^1.1.0" - lodash "^4.17.14" - markdown-table "^1.1.3" - mocha "^10.2.0" - req-cwd "^2.0.0" - sha1 "^1.1.1" - sync-request "^6.0.0" - -eth-json-rpc-infura@^3.1.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/eth-json-rpc-infura/-/eth-json-rpc-infura-3.2.1.tgz#26702a821067862b72d979c016fd611502c6057f" - integrity sha512-W7zR4DZvyTn23Bxc0EWsq4XGDdD63+XPUCEhV2zQvQGavDVC4ZpFDK4k99qN7bd7/fjj37+rxmuBOBeIqCA5Mw== - dependencies: - cross-fetch "^2.1.1" - eth-json-rpc-middleware "^1.5.0" - json-rpc-engine "^3.4.0" - json-rpc-error "^2.0.0" - -eth-json-rpc-middleware@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/eth-json-rpc-middleware/-/eth-json-rpc-middleware-1.6.0.tgz#5c9d4c28f745ccb01630f0300ba945f4bef9593f" - integrity sha512-tDVCTlrUvdqHKqivYMjtFZsdD7TtpNLBCfKAcOpaVs7orBMS/A8HWro6dIzNtTZIR05FAbJ3bioFOnZpuCew9Q== - dependencies: - async "^2.5.0" - eth-query "^2.1.2" - eth-tx-summary "^3.1.2" - ethereumjs-block "^1.6.0" - ethereumjs-tx "^1.3.3" - ethereumjs-util "^5.1.2" - ethereumjs-vm "^2.1.0" - fetch-ponyfill "^4.0.0" - json-rpc-engine "^3.6.0" - json-rpc-error "^2.0.0" - json-stable-stringify "^1.0.1" - promise-to-callback "^1.0.0" - tape "^4.6.3" - -eth-lib@0.2.7: - version "0.2.7" - resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.2.7.tgz#2f93f17b1e23aec3759cd4a3fe20c1286a3fc1ca" - integrity sha512-VqEBQKH92jNsaE8lG9CTq8M/bc12gdAfb5MY8Ro1hVyXkh7rOtY3m5tRHK3Hus5HqIAAwU2ivcUjTLVwsvf/kw== - dependencies: - bn.js "^4.11.6" - elliptic "^6.4.0" - xhr-request-promise "^0.1.2" - -eth-lib@0.2.8, eth-lib@^0.2.8: - version "0.2.8" - resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.2.8.tgz#b194058bef4b220ad12ea497431d6cb6aa0623c8" - integrity sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw== - dependencies: - bn.js "^4.11.6" - elliptic "^6.4.0" - xhr-request-promise "^0.1.2" - -eth-lib@^0.1.26: - version "0.1.29" - resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.1.29.tgz#0c11f5060d42da9f931eab6199084734f4dbd1d9" - integrity sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ== - dependencies: - bn.js "^4.11.6" - elliptic "^6.4.0" - nano-json-stream-parser "^0.1.2" - servify "^0.1.12" - ws "^3.0.0" - xhr-request-promise "^0.1.2" - -"eth-object@https://github.com/near/eth-object#383b6ea68c7050bea4cab6950c1d5a7fa553e72b": - version "1.0.3" - resolved "https://github.com/near/eth-object#383b6ea68c7050bea4cab6950c1d5a7fa553e72b" - dependencies: - eth-util-lite near/eth-util-lite#master - ethereumjs-util "^7.0.3" - web3 "^1.2.9" - -eth-object@near/eth-object#54e03b8aac8208cf724e206d49ffb8bdd30451d7: - version "1.0.3" - resolved "https://codeload.github.com/near/eth-object/tar.gz/54e03b8aac8208cf724e206d49ffb8bdd30451d7" - dependencies: - eth-util-lite near/eth-util-lite#master - ethereumjs-util "^7.0.3" - web3 "^1.2.9" - -eth-query@^2.0.2, eth-query@^2.1.0, eth-query@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/eth-query/-/eth-query-2.1.2.tgz#d6741d9000106b51510c72db92d6365456a6da5e" - integrity sha512-srES0ZcvwkR/wd5OQBRA1bIJMww1skfGS0s8wlwK3/oNP4+wnds60krvu5R1QbpRQjMmpG5OMIWro5s7gvDPsA== - dependencies: - json-rpc-random-id "^1.0.0" - xtend "^4.0.1" - -eth-sig-util@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-3.0.0.tgz#75133b3d7c20a5731af0690c385e184ab942b97e" - integrity sha512-4eFkMOhpGbTxBQ3AMzVf0haUX2uTur7DpWiHzWyTURa28BVJJtOkcb9Ok5TV0YvEPG61DODPW7ZUATbJTslioQ== - dependencies: - buffer "^5.2.1" - elliptic "^6.4.0" - ethereumjs-abi "0.6.5" - ethereumjs-util "^5.1.1" - tweetnacl "^1.0.0" - tweetnacl-util "^0.15.0" - -eth-sig-util@^1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-1.4.2.tgz#8d958202c7edbaae839707fba6f09ff327606210" - integrity sha512-iNZ576iTOGcfllftB73cPB5AN+XUQAT/T8xzsILsghXC1o8gJUqe3RHlcDqagu+biFpYQ61KQrZZJza8eRSYqw== - dependencies: - ethereumjs-abi "git+https://github.com/ethereumjs/ethereumjs-abi.git" - ethereumjs-util "^5.1.1" - -eth-tx-summary@^3.1.2: - version "3.2.4" - resolved "https://registry.yarnpkg.com/eth-tx-summary/-/eth-tx-summary-3.2.4.tgz#e10eb95eb57cdfe549bf29f97f1e4f1db679035c" - integrity sha512-NtlDnaVZah146Rm8HMRUNMgIwG/ED4jiqk0TME9zFheMl1jOp6jL1m0NKGjJwehXQ6ZKCPr16MTr+qspKpEXNg== - dependencies: - async "^2.1.2" - clone "^2.0.0" - concat-stream "^1.5.1" - end-of-stream "^1.1.0" - eth-query "^2.0.2" - ethereumjs-block "^1.4.1" - ethereumjs-tx "^1.1.1" - ethereumjs-util "^5.0.1" - ethereumjs-vm "^2.6.0" - through2 "^2.0.3" - -eth-util-lite@near/eth-util-lite#master: - version "1.0.1" - resolved "https://codeload.github.com/near/eth-util-lite/tar.gz/427b7634a123d171432f3b38c6542913a3897ac7" - dependencies: - bn.js "^4.11.8" - js-sha3 "^0.8.0" - rlp "^2.2.3" - safe-buffer "^5.1.2" - -ethashjs@~0.0.7: - version "0.0.8" - resolved "https://registry.yarnpkg.com/ethashjs/-/ethashjs-0.0.8.tgz#227442f1bdee409a548fb04136e24c874f3aa6f9" - integrity sha512-/MSbf/r2/Ld8o0l15AymjOTlPqpN8Cr4ByUEA9GtR4x0yAh3TdtDzEg29zMjXCNPI7u6E5fOQdj/Cf9Tc7oVNw== - dependencies: - async "^2.1.2" - buffer-xor "^2.0.1" - ethereumjs-util "^7.0.2" - miller-rabin "^4.0.0" - -ethereum-bloom-filters@^1.0.6: - version "1.2.0" - resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.2.0.tgz#8294f074c1a6cbd32c39d2cc77ce86ff14797dab" - integrity sha512-28hyiE7HVsWubqhpVLVmZXFd4ITeHi+BUu05o9isf0GUpMtzBUi+8/gFrGaGYzvGAJQmJ3JKj77Mk9G98T84rA== - dependencies: - "@noble/hashes" "^1.4.0" - -ethereum-common@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.2.0.tgz#13bf966131cce1eeade62a1b434249bb4cb120ca" - integrity sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA== - -ethereum-common@^0.0.18: - version "0.0.18" - resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.0.18.tgz#2fdc3576f232903358976eb39da783213ff9523f" - integrity sha512-EoltVQTRNg2Uy4o84qpa2aXymXDJhxm7eos/ACOg0DG4baAbMjhbdAEsx9GeE8sC3XCxnYvrrzZDH8D8MtA2iQ== - -ethereum-cryptography@0.1.3, ethereum-cryptography@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" - integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== - dependencies: - "@types/pbkdf2" "^3.0.0" - "@types/secp256k1" "^4.0.1" - blakejs "^1.1.0" - browserify-aes "^1.2.0" - bs58check "^2.1.2" - create-hash "^1.2.0" - create-hmac "^1.1.7" - hash.js "^1.1.7" - keccak "^3.0.0" - pbkdf2 "^3.0.17" - randombytes "^2.1.0" - safe-buffer "^5.1.2" - scrypt-js "^3.0.0" - secp256k1 "^4.0.1" - setimmediate "^1.0.5" - -ethereum-cryptography@^1.0.3: - version "1.2.0" - resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz#5ccfa183e85fdaf9f9b299a79430c044268c9b3a" - integrity sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw== - dependencies: - "@noble/hashes" "1.2.0" - "@noble/secp256k1" "1.7.1" - "@scure/bip32" "1.1.5" - "@scure/bip39" "1.1.1" - -ethereum-cryptography@^2.0.0, ethereum-cryptography@^2.1.2: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz#58f2810f8e020aecb97de8c8c76147600b0b8ccf" - integrity sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg== - dependencies: - "@noble/curves" "1.4.2" - "@noble/hashes" "1.4.0" - "@scure/bip32" "1.4.0" - "@scure/bip39" "1.3.0" - -ethereum-waffle@^3.4.4: - version "3.4.4" - resolved "https://registry.yarnpkg.com/ethereum-waffle/-/ethereum-waffle-3.4.4.tgz#1378b72040697857b7f5e8f473ca8f97a37b5840" - integrity sha512-PA9+jCjw4WC3Oc5ocSMBj5sXvueWQeAbvCA+hUlb6oFgwwKyq5ka3bWQ7QZcjzIX+TdFkxP4IbFmoY2D8Dkj9Q== - dependencies: - "@ethereum-waffle/chai" "^3.4.4" - "@ethereum-waffle/compiler" "^3.4.4" - "@ethereum-waffle/mock-contract" "^3.4.4" - "@ethereum-waffle/provider" "^3.4.4" - ethers "^5.0.1" - -ethereumjs-abi@0.6.5: - version "0.6.5" - resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.5.tgz#5a637ef16ab43473fa72a29ad90871405b3f5241" - integrity sha512-rCjJZ/AE96c/AAZc6O3kaog4FhOsAViaysBxqJNy2+LHP0ttH0zkZ7nXdVHOAyt6lFwLO0nlCwWszysG/ao1+g== - dependencies: - bn.js "^4.10.0" - ethereumjs-util "^4.3.0" - -ethereumjs-abi@0.6.8, ethereumjs-abi@^0.6.8: - version "0.6.8" - resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz#71bc152db099f70e62f108b7cdfca1b362c6fcae" - integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA== - dependencies: - bn.js "^4.11.8" - ethereumjs-util "^6.0.0" - -"ethereumjs-abi@git+https://github.com/ethereumjs/ethereumjs-abi.git": - version "0.6.8" - resolved "git+https://github.com/ethereumjs/ethereumjs-abi.git#ee3994657fa7a427238e6ba92a84d0b529bbcde0" - dependencies: - bn.js "^4.11.8" - ethereumjs-util "^6.0.0" - -ethereumjs-account@3.0.0, ethereumjs-account@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ethereumjs-account/-/ethereumjs-account-3.0.0.tgz#728f060c8e0c6e87f1e987f751d3da25422570a9" - integrity sha512-WP6BdscjiiPkQfF9PVfMcwx/rDvfZTjFKY0Uwc09zSQr9JfIVH87dYIJu0gNhBhpmovV4yq295fdllS925fnBA== - dependencies: - ethereumjs-util "^6.0.0" - rlp "^2.2.1" - safe-buffer "^5.1.1" - -ethereumjs-account@^2.0.3: - version "2.0.5" - resolved "https://registry.yarnpkg.com/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz#eeafc62de544cb07b0ee44b10f572c9c49e00a84" - integrity sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA== - dependencies: - ethereumjs-util "^5.0.0" - rlp "^2.0.0" - safe-buffer "^5.1.1" - -ethereumjs-block@2.2.2, ethereumjs-block@^2.2.2, ethereumjs-block@~2.2.0, ethereumjs-block@~2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-2.2.2.tgz#c7654be7e22df489fda206139ecd63e2e9c04965" - integrity sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg== - dependencies: - async "^2.0.1" - ethereumjs-common "^1.5.0" - ethereumjs-tx "^2.1.1" - ethereumjs-util "^5.0.0" - merkle-patricia-tree "^2.1.2" - -ethereumjs-block@^1.2.2, ethereumjs-block@^1.4.1, ethereumjs-block@^1.6.0: - version "1.7.1" - resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz#78b88e6cc56de29a6b4884ee75379b6860333c3f" - integrity sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg== - dependencies: - async "^2.0.1" - ethereum-common "0.2.0" - ethereumjs-tx "^1.2.2" - ethereumjs-util "^5.0.0" - merkle-patricia-tree "^2.1.2" - -ethereumjs-blockchain@^4.0.3: - version "4.0.4" - resolved "https://registry.yarnpkg.com/ethereumjs-blockchain/-/ethereumjs-blockchain-4.0.4.tgz#30f2228dc35f6dcf94423692a6902604ae34960f" - integrity sha512-zCxaRMUOzzjvX78DTGiKjA+4h2/sF0OYL1QuPux0DHpyq8XiNoF5GYHtb++GUxVlMsMfZV7AVyzbtgcRdIcEPQ== - dependencies: - async "^2.6.1" - ethashjs "~0.0.7" - ethereumjs-block "~2.2.2" - ethereumjs-common "^1.5.0" - ethereumjs-util "^6.1.0" - flow-stoplight "^1.0.0" - level-mem "^3.0.1" - lru-cache "^5.1.1" - rlp "^2.2.2" - semaphore "^1.1.0" - -ethereumjs-common@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/ethereumjs-common/-/ethereumjs-common-1.5.0.tgz#d3e82fc7c47c0cef95047f431a99485abc9bb1cd" - integrity sha512-SZOjgK1356hIY7MRj3/ma5qtfr/4B5BL+G4rP/XSMYr2z1H5el4RX5GReYCKmQmYI/nSBmRnwrZ17IfHuG0viQ== - -ethereumjs-common@^1.1.0, ethereumjs-common@^1.3.2, ethereumjs-common@^1.5.0: - version "1.5.2" - resolved "https://registry.yarnpkg.com/ethereumjs-common/-/ethereumjs-common-1.5.2.tgz#2065dbe9214e850f2e955a80e650cb6999066979" - integrity sha512-hTfZjwGX52GS2jcVO6E2sx4YuFnf0Fhp5ylo4pEPhEffNln7vS59Hr5sLnp3/QCazFLluuBZ+FZ6J5HTp0EqCA== - -ethereumjs-tx@2.1.2, ethereumjs-tx@^2.1.1, ethereumjs-tx@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz#5dfe7688bf177b45c9a23f86cf9104d47ea35fed" - integrity sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw== - dependencies: - ethereumjs-common "^1.5.0" - ethereumjs-util "^6.0.0" - -ethereumjs-tx@^1.1.1, ethereumjs-tx@^1.2.0, ethereumjs-tx@^1.2.2, ethereumjs-tx@^1.3.3: - version "1.3.7" - resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz#88323a2d875b10549b8347e09f4862b546f3d89a" - integrity sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA== - dependencies: - ethereum-common "^0.0.18" - ethereumjs-util "^5.0.0" - -ethereumjs-util@6.2.1, ethereumjs-util@^6.0.0, ethereumjs-util@^6.1.0, ethereumjs-util@^6.2.0, ethereumjs-util@^6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz#fcb4e4dd5ceacb9d2305426ab1a5cd93e3163b69" - integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw== - dependencies: - "@types/bn.js" "^4.11.3" - bn.js "^4.11.0" - create-hash "^1.1.2" - elliptic "^6.5.2" - ethereum-cryptography "^0.1.3" - ethjs-util "0.1.6" - rlp "^2.2.3" - -ethereumjs-util@^4.3.0: - version "4.5.1" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-4.5.1.tgz#f4bf9b3b515a484e3cc8781d61d9d980f7c83bd0" - integrity sha512-WrckOZ7uBnei4+AKimpuF1B3Fv25OmoRgmYCpGsP7u8PFxXAmAgiJSYT2kRWnt6fVIlKaQlZvuwXp7PIrmn3/w== - dependencies: - bn.js "^4.8.0" - create-hash "^1.1.2" - elliptic "^6.5.2" - ethereum-cryptography "^0.1.3" - rlp "^2.0.0" - -ethereumjs-util@^5.0.0, ethereumjs-util@^5.0.1, ethereumjs-util@^5.1.1, ethereumjs-util@^5.1.2, ethereumjs-util@^5.1.3, ethereumjs-util@^5.1.5, ethereumjs-util@^5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz#a833f0e5fca7e5b361384dc76301a721f537bf65" - integrity sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ== - dependencies: - bn.js "^4.11.0" - create-hash "^1.1.2" - elliptic "^6.5.2" - ethereum-cryptography "^0.1.3" - ethjs-util "^0.1.3" - rlp "^2.0.0" - safe-buffer "^5.1.1" - -ethereumjs-util@^7.0.2, ethereumjs-util@^7.0.3, ethereumjs-util@^7.1.0, ethereumjs-util@^7.1.1, ethereumjs-util@^7.1.2, ethereumjs-util@^7.1.4, ethereumjs-util@^7.1.5: - version "7.1.5" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz#9ecf04861e4fbbeed7465ece5f23317ad1129181" - integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg== - dependencies: - "@types/bn.js" "^5.1.0" - bn.js "^5.1.2" - create-hash "^1.1.2" - ethereum-cryptography "^0.1.3" - rlp "^2.2.4" - -ethereumjs-vm@4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-4.2.0.tgz#e885e861424e373dbc556278f7259ff3fca5edab" - integrity sha512-X6qqZbsY33p5FTuZqCnQ4+lo957iUJMM6Mpa6bL4UW0dxM6WmDSHuI4j/zOp1E2TDKImBGCJA9QPfc08PaNubA== - dependencies: - async "^2.1.2" - async-eventemitter "^0.2.2" - core-js-pure "^3.0.1" - ethereumjs-account "^3.0.0" - ethereumjs-block "^2.2.2" - ethereumjs-blockchain "^4.0.3" - ethereumjs-common "^1.5.0" - ethereumjs-tx "^2.1.2" - ethereumjs-util "^6.2.0" - fake-merkle-patricia-tree "^1.0.1" - functional-red-black-tree "^1.0.1" - merkle-patricia-tree "^2.3.2" - rustbn.js "~0.2.0" - safe-buffer "^5.1.1" - util.promisify "^1.0.0" - -ethereumjs-vm@^2.1.0, ethereumjs-vm@^2.3.4, ethereumjs-vm@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz#76243ed8de031b408793ac33907fb3407fe400c6" - integrity sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw== - dependencies: - async "^2.1.2" - async-eventemitter "^0.2.2" - ethereumjs-account "^2.0.3" - ethereumjs-block "~2.2.0" - ethereumjs-common "^1.1.0" - ethereumjs-util "^6.0.0" - fake-merkle-patricia-tree "^1.0.1" - functional-red-black-tree "^1.0.1" - merkle-patricia-tree "^2.3.2" - rustbn.js "~0.2.0" - safe-buffer "^5.1.1" - -ethereumjs-wallet@0.6.5: - version "0.6.5" - resolved "https://registry.yarnpkg.com/ethereumjs-wallet/-/ethereumjs-wallet-0.6.5.tgz#685e9091645cee230ad125c007658833991ed474" - integrity sha512-MDwjwB9VQVnpp/Dc1XzA6J1a3wgHQ4hSvA1uWNatdpOrtCbPVuQSKSyRnjLvS0a+KKMw2pvQ9Ybqpb3+eW8oNA== - dependencies: - aes-js "^3.1.1" - bs58check "^2.1.2" - ethereum-cryptography "^0.1.3" - ethereumjs-util "^6.0.0" - randombytes "^2.0.6" - safe-buffer "^5.1.2" - scryptsy "^1.2.1" - utf8 "^3.0.0" - uuid "^3.3.2" - -ethers@4.0.0-beta.3: - version "4.0.0-beta.3" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-4.0.0-beta.3.tgz#15bef14e57e94ecbeb7f9b39dd0a4bd435bc9066" - integrity sha512-YYPogooSknTwvHg3+Mv71gM/3Wcrx+ZpCzarBj3mqs9njjRkrOo2/eufzhHloOCo3JSoNI4TQJJ6yU5ABm3Uog== - dependencies: - "@types/node" "^10.3.2" - aes-js "3.0.0" - bn.js "^4.4.0" - elliptic "6.3.3" - hash.js "1.1.3" - js-sha3 "0.5.7" - scrypt-js "2.0.3" - setimmediate "1.0.4" - uuid "2.0.1" - xmlhttprequest "1.8.0" - -ethers@^4.0.20, ethers@^4.0.32: - version "4.0.49" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-4.0.49.tgz#0eb0e9161a0c8b4761be547396bbe2fb121a8894" - integrity sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg== - dependencies: - aes-js "3.0.0" - bn.js "^4.11.9" - elliptic "6.5.4" - hash.js "1.1.3" - js-sha3 "0.5.7" - scrypt-js "2.0.4" - setimmediate "1.0.4" - uuid "2.0.1" - xmlhttprequest "1.8.0" - -ethers@^5.0.1, ethers@^5.0.13, ethers@^5.0.2, ethers@^5.5.2, ethers@^5.7.2: - version "5.7.2" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" - integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== - dependencies: - "@ethersproject/abi" "5.7.0" - "@ethersproject/abstract-provider" "5.7.0" - "@ethersproject/abstract-signer" "5.7.0" - "@ethersproject/address" "5.7.0" - "@ethersproject/base64" "5.7.0" - "@ethersproject/basex" "5.7.0" - "@ethersproject/bignumber" "5.7.0" - "@ethersproject/bytes" "5.7.0" - "@ethersproject/constants" "5.7.0" - "@ethersproject/contracts" "5.7.0" - "@ethersproject/hash" "5.7.0" - "@ethersproject/hdnode" "5.7.0" - "@ethersproject/json-wallets" "5.7.0" - "@ethersproject/keccak256" "5.7.0" - "@ethersproject/logger" "5.7.0" - "@ethersproject/networks" "5.7.1" - "@ethersproject/pbkdf2" "5.7.0" - "@ethersproject/properties" "5.7.0" - "@ethersproject/providers" "5.7.2" - "@ethersproject/random" "5.7.0" - "@ethersproject/rlp" "5.7.0" - "@ethersproject/sha2" "5.7.0" - "@ethersproject/signing-key" "5.7.0" - "@ethersproject/solidity" "5.7.0" - "@ethersproject/strings" "5.7.0" - "@ethersproject/transactions" "5.7.0" - "@ethersproject/units" "5.7.0" - "@ethersproject/wallet" "5.7.0" - "@ethersproject/web" "5.7.1" - "@ethersproject/wordlists" "5.7.0" - -ethers@^6.12.1: - version "6.13.2" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.13.2.tgz#4b67d4b49e69b59893931a032560999e5e4419fe" - integrity sha512-9VkriTTed+/27BGuY1s0hf441kqwHJ1wtN2edksEtiRvXx+soxRX3iSXTfFqq2+YwrOqbDoTHjIhQnjJRlzKmg== - dependencies: - "@adraffy/ens-normalize" "1.10.1" - "@noble/curves" "1.2.0" - "@noble/hashes" "1.3.2" - "@types/node" "18.15.13" - aes-js "4.0.0-beta.5" - tslib "2.4.0" - ws "8.17.1" - -ethjs-abi@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/ethjs-abi/-/ethjs-abi-0.2.1.tgz#e0a7a93a7e81163a94477bad56ede524ab6de533" - integrity sha512-g2AULSDYI6nEJyJaEVEXtTimRY2aPC2fi7ddSy0W+LXvEVL8Fe1y76o43ecbgdUKwZD+xsmEgX1yJr1Ia3r1IA== - dependencies: - bn.js "4.11.6" - js-sha3 "0.5.5" - number-to-bn "1.7.0" - -ethjs-unit@0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" - integrity sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw== - dependencies: - bn.js "4.11.6" - number-to-bn "1.7.0" - -ethjs-util@0.1.6, ethjs-util@^0.1.3, ethjs-util@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536" - integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w== - dependencies: - is-hex-prefixed "1.0.0" - strip-hex-prefix "1.0.0" - -event-emitter@^0.3.5: - version "0.3.5" - resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" - integrity sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA== - dependencies: - d "1" - es5-ext "~0.10.14" - -eventemitter3@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" - integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== - -eventemitter3@4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384" - integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ== - -events@^3.0.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - -evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" - integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== - dependencies: - md5.js "^1.3.4" - safe-buffer "^5.1.1" - -execa@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" - integrity sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw== - dependencies: - cross-spawn "^5.0.1" - get-stream "^3.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -expand-brackets@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" - integrity sha512-hxx03P2dJxss6ceIeri9cmYOT4SRs3Zk3afZwWpOsRqLqprhTR8u++SlC+sFGsQr7WGFPdMF7Gjc1njDLDK6UA== - dependencies: - is-posix-bracket "^0.1.0" - -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA== - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -expand-range@^1.8.1: - version "1.8.2" - resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" - integrity sha512-AFASGfIlnIbkKPQwX1yHaDjFvh/1gyKJODme52V6IORh69uEYgZp0o9C+qsIGNVEiuuhQU0CSSl++Rlegg1qvA== - dependencies: - fill-range "^2.1.0" - -exponential-backoff@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.1.tgz#64ac7526fe341ab18a39016cd22c787d01e00bf6" - integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw== - -express@^4.14.0: - version "4.19.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465" - integrity sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q== - dependencies: - accepts "~1.3.8" - array-flatten "1.1.1" - body-parser "1.20.2" - content-disposition "0.5.4" - content-type "~1.0.4" - cookie "0.6.0" - cookie-signature "1.0.6" - debug "2.6.9" - depd "2.0.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "1.2.0" - fresh "0.5.2" - http-errors "2.0.0" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "2.4.1" - parseurl "~1.3.3" - path-to-regexp "0.1.7" - proxy-addr "~2.0.7" - qs "6.11.0" - range-parser "~1.2.1" - safe-buffer "5.2.1" - send "0.18.0" - serve-static "1.15.0" - setprototypeof "1.2.0" - statuses "2.0.1" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - -ext@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f" - integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw== - dependencies: - type "^2.7.2" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -extend@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -external-editor@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - -extglob@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" - integrity sha512-1FOj1LOwn42TMrruOHGt18HemVnbwAmAak7krWk+wa93KXxGbK+2jpezm+ytJYDaBX0/SPLZFHKM7m+tKobWGg== - dependencies: - is-extglob "^1.0.0" - -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== - -extsprintf@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" - integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== - -fake-merkle-patricia-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/fake-merkle-patricia-tree/-/fake-merkle-patricia-tree-1.0.1.tgz#4b8c3acfb520afadf9860b1f14cd8ce3402cddd3" - integrity sha512-Tgq37lkc9pUIgIKw5uitNUKcgcYL3R6JvXtKQbOf/ZSavXbidsksgp/pAY6p//uhw0I4yoMsvTSovvVIsk/qxA== - dependencies: - checkpoint-store "^1.1.0" - -fast-base64-decode@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fast-base64-decode/-/fast-base64-decode-1.0.0.tgz#b434a0dd7d92b12b43f26819300d2dafb83ee418" - integrity sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q== - -fast-check@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/fast-check/-/fast-check-3.1.1.tgz#72c5ae7022a4e86504762e773adfb8a5b0b01252" - integrity sha512-3vtXinVyuUKCKFKYcwXhGE6NtGWkqF8Yh3rvMZNzmwz8EPrgoc/v4pDdLHyLnCyCI5MZpZZkDEwFyXyEONOxpA== - dependencies: - pure-rand "^5.0.1" - -fast-deep-equal@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" - integrity sha512-fueX787WZKCV0Is4/T2cyAdM4+x1S3MXXOAhavE1ys/W42SHAPacLTQhucja22QBYrfGw50M2sRiXPtTGv9Ymw== - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-glob@^3.0.3: - version "3.3.2" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" - integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fast-uri@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.1.tgz#cddd2eecfc83a71c1be2cc2ef2061331be8a7134" - integrity sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw== - -fastq@^1.6.0: - version "1.17.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" - integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== - dependencies: - reusify "^1.0.4" - -faye-websocket@0.11.3: - version "0.11.3" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.3.tgz#5c0e9a8968e8912c286639fde977a8b209f2508e" - integrity sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA== - dependencies: - websocket-driver ">=0.5.1" - -fd-slicer@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" - integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== - dependencies: - pend "~1.2.0" - -fetch-ponyfill@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/fetch-ponyfill/-/fetch-ponyfill-4.1.0.tgz#ae3ce5f732c645eab87e4ae8793414709b239893" - integrity sha512-knK9sGskIg2T7OnYLdZ2hZXn0CtDrAIBxYQLpmEf0BqfdWnwmM1weccUl5+4EdA44tzNSFAuxITPbXtPehUB3g== - dependencies: - node-fetch "~1.7.1" - -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - integrity sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA== - dependencies: - escape-string-regexp "^1.0.5" - -figures@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== - dependencies: - escape-string-regexp "^1.0.5" - -file-entry-cache@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" - integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== - dependencies: - flat-cache "^2.0.1" - -file-type@^3.8.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9" - integrity sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA== - -file-type@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-5.2.0.tgz#2ddbea7c73ffe36368dfae49dc338c058c2b8ad6" - integrity sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ== - -file-type@^6.1.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-6.2.0.tgz#e50cd75d356ffed4e306dc4f5bcf52a79903a919" - integrity sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg== - -file-uri-to-path@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" - integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== - -filename-regex@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" - integrity sha512-BTCqyBaWBTsauvnHiE8i562+EdJj+oUpkqWp2R1iCoR8f6oo8STRu3of7WJJ0TqWtxN50a5YFpzYK4Jj9esYfQ== - -fill-range@^2.1.0: - version "2.2.4" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" - integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== - dependencies: - is-number "^2.1.0" - isobject "^2.0.0" - randomatic "^3.0.0" - repeat-element "^1.1.2" - repeat-string "^1.5.2" - -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ== - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - -fill-range@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" - integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== - dependencies: - to-regex-range "^5.0.1" - -finalhandler@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" - integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "2.4.1" - parseurl "~1.3.3" - statuses "2.0.1" - unpipe "~1.0.0" - -find-replace@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-1.0.3.tgz#b88e7364d2d9c959559f388c66670d6130441fa0" - integrity sha512-KrUnjzDCD9426YnCP56zGYy/eieTnhtK6Vn++j+JJzmlsWWwEkDnsyVF575spT6HJ6Ow9tlbT3TQTDsa+O4UWA== - dependencies: - array-back "^1.0.4" - test-value "^2.1.0" - -find-up@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - integrity sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA== - dependencies: - path-exists "^2.0.0" - pinkie-promise "^2.0.0" - -find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== - dependencies: - locate-path "^2.0.0" - -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - -find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -find-yarn-workspace-root@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-1.2.1.tgz#40eb8e6e7c2502ddfaa2577c176f221422f860db" - integrity sha512-dVtfb0WuQG+8Ag2uWkbG79hOUzEsRrhBzgfn86g2sJPkzmcpGdghbNTfUKGTxymFrY/tLIodDzLoW9nOJ4FY8Q== - dependencies: - fs-extra "^4.0.3" - micromatch "^3.1.4" - -find-yarn-workspace-root@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz#f47fb8d239c900eb78179aa81b66673eac88f7bd" - integrity sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ== - dependencies: - micromatch "^4.0.2" - -firebase@^7.8.0: - version "7.24.0" - resolved "https://registry.yarnpkg.com/firebase/-/firebase-7.24.0.tgz#dab53b9c0f1c9538d2d6f4f51769897b0b6d60d8" - integrity sha512-j6jIyGFFBlwWAmrlUg9HyQ/x+YpsPkc/TTkbTyeLwwAJrpAmmEHNPT6O9xtAnMV4g7d3RqLL/u9//aZlbY4rQA== - dependencies: - "@firebase/analytics" "0.6.0" - "@firebase/app" "0.6.11" - "@firebase/app-types" "0.6.1" - "@firebase/auth" "0.15.0" - "@firebase/database" "0.6.13" - "@firebase/firestore" "1.18.0" - "@firebase/functions" "0.5.1" - "@firebase/installations" "0.4.17" - "@firebase/messaging" "0.7.1" - "@firebase/performance" "0.4.2" - "@firebase/polyfill" "0.3.36" - "@firebase/remote-config" "0.1.28" - "@firebase/storage" "0.3.43" - "@firebase/util" "0.3.2" - -flat-cache@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" - integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== - dependencies: - flatted "^2.0.0" - rimraf "2.6.3" - write "1.0.3" - -flat@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" - integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== - -flatted@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" - integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== - -flow-stoplight@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/flow-stoplight/-/flow-stoplight-1.0.0.tgz#4a292c5bcff8b39fa6cc0cb1a853d86f27eeff7b" - integrity sha512-rDjbZUKpN8OYhB0IE/vY/I8UWO/602IIJEU/76Tv4LvYnwHCk0BCsvz4eRr9n+FQcri7L5cyaXOo0+/Kh4HisA== - -follow-redirects@1.5.10: - version "1.5.10" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" - integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ== - dependencies: - debug "=3.1.0" - -follow-redirects@^1.12.1, follow-redirects@^1.15.6: - version "1.15.8" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.8.tgz#ae67b97ae32e0a7b36066a5448938374ec18d13d" - integrity sha512-xgrmBhBToVKay1q2Tao5LI26B83UhrB/vM1avwVSDzt8rx3rO6AizBAaF46EgksTVr+rFTQaqZZ9MVBfUe4nig== - -for-each@^0.3.3, for-each@~0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== - dependencies: - is-callable "^1.1.3" - -for-in@^1.0.1, for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== - -for-own@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" - integrity sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw== - dependencies: - for-in "^1.0.1" - -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== - -form-data-encoder@1.7.1: - version "1.7.1" - resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-1.7.1.tgz#ac80660e4f87ee0d3d3c3638b7da8278ddb8ec96" - integrity sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg== - -form-data@^2.2.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4" - integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - -form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - -fp-ts@1.19.3: - version "1.19.3" - resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.3.tgz#261a60d1088fbff01f91256f91d21d0caaaaa96f" - integrity sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg== - -fp-ts@^1.0.0: - version "1.19.5" - resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.5.tgz#3da865e585dfa1fdfd51785417357ac50afc520a" - integrity sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A== - -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA== - dependencies: - map-cache "^0.2.2" - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== - -fs-constants@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" - integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== - -fs-extra@^0.30.0: - version "0.30.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" - integrity sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^2.1.0" - klaw "^1.0.0" - path-is-absolute "^1.0.0" - rimraf "^2.2.8" - -fs-extra@^4.0.2, fs-extra@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" - integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-extra@^7.0.0, fs-extra@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" - integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-extra@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" - integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-extra@^9.0.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-minipass@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" - integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== - dependencies: - minipass "^2.6.0" - -fs-readdir-recursive@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" - integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@^1.0.0: - version "1.2.13" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" - integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== - dependencies: - bindings "^1.5.0" - nan "^2.12.1" - -fsevents@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -function.prototype.name@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" - integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - functions-have-names "^1.2.3" - -functional-red-black-tree@^1.0.1, functional-red-black-tree@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== - -functions-have-names@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -ganache-core@^2.13.2: - version "2.13.2" - resolved "https://registry.yarnpkg.com/ganache-core/-/ganache-core-2.13.2.tgz#27e6fc5417c10e6e76e2e646671869d7665814a3" - integrity sha512-tIF5cR+ANQz0+3pHWxHjIwHqFXcVo0Mb+kcsNhglNFALcYo49aQpnS9dqHartqPfMFjiHh/qFoD3mYK0d/qGgw== - dependencies: - abstract-leveldown "3.0.0" - async "2.6.2" - bip39 "2.5.0" - cachedown "1.0.0" - clone "2.1.2" - debug "3.2.6" - encoding-down "5.0.4" - eth-sig-util "3.0.0" - ethereumjs-abi "0.6.8" - ethereumjs-account "3.0.0" - ethereumjs-block "2.2.2" - ethereumjs-common "1.5.0" - ethereumjs-tx "2.1.2" - ethereumjs-util "6.2.1" - ethereumjs-vm "4.2.0" - heap "0.2.6" - keccak "3.0.1" - level-sublevel "6.6.4" - levelup "3.1.1" - lodash "4.17.20" - lru-cache "5.1.1" - merkle-patricia-tree "3.0.0" - patch-package "6.2.2" - seedrandom "3.0.1" - source-map-support "0.5.12" - tmp "0.1.0" - web3-provider-engine "14.2.1" - websocket "1.0.32" - optionalDependencies: - ethereumjs-wallet "0.6.5" - web3 "1.2.11" - -generate-function@^2.0.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.3.1.tgz#f069617690c10c868e73b8465746764f97c3479f" - integrity sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ== - dependencies: - is-property "^1.0.2" - -generate-object-property@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" - integrity sha512-TuOwZWgJ2VAMEGJvAyPWvpqxSANF0LDpmyHauMjFYzaACvn+QTT/AZomvPCzVBV7yDN3OmwHQ5OvHaeLKre3JQ== - dependencies: - is-property "^1.0.0" - -get-caller-file@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" - integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-func-name@^2.0.1, get-func-name@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" - integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== - -get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" - integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== - dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" - -get-port@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.2.0.tgz#dd7ce7de187c06c8bf353796ac71e099f0980ebc" - integrity sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg== - -get-stream@^2.2.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de" - integrity sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA== - dependencies: - object-assign "^4.0.1" - pinkie-promise "^2.0.0" - -get-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - integrity sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ== - -get-stream@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - -get-stream@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" - integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== - dependencies: - pump "^3.0.0" - -get-stream@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -get-symbol-description@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" - integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== - dependencies: - call-bind "^1.0.5" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== - -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== - dependencies: - assert-plus "^1.0.0" - -ghost-testrpc@^0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz#c4de9557b1d1ae7b2d20bbe474a91378ca90ce92" - integrity sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ== - dependencies: - chalk "^2.4.2" - node-emoji "^1.10.0" - -glob-base@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" - integrity sha512-ab1S1g1EbO7YzauaJLkgLp7DZVAqj9M/dvKlTt8DkXA2tiOIcSMrlVI2J1RZyB5iJVccEscjGn+kpOG9788MHA== - dependencies: - glob-parent "^2.0.0" - is-glob "^2.0.0" - -glob-parent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" - integrity sha512-JDYOvfxio/t42HKdxkAYaCiBN7oYiuxykOxKxdaUW5Qn0zaYN3gRQWolrwdnf0shM9/EP0ebuuTmyoXNr1cC5w== - dependencies: - is-glob "^2.0.0" - -glob-parent@^5.0.0, glob-parent@^5.1.2, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob@7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" - integrity sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" - integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^5.0.15: - version "5.0.15" - resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" - integrity sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA== - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "2 || 3" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.0.0, glob@^7.1.2, glob@^7.1.3, glob@^7.1.6, glob@~7.2.3: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" - integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^5.0.1" - once "^1.3.0" - -global-modules@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" - integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== - dependencies: - global-prefix "^3.0.0" - -global-prefix@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" - integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== - dependencies: - ini "^1.3.5" - kind-of "^6.0.2" - which "^1.3.1" - -global@~4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" - integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== - dependencies: - min-document "^2.19.0" - process "^0.11.10" - -globals@^12.1.0: - version "12.4.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" - integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== - dependencies: - type-fest "^0.8.1" - -globals@^9.18.0: - version "9.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" - integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== - -globalthis@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" - integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== - dependencies: - define-properties "^1.2.1" - gopd "^1.0.1" - -globby@^10.0.1: - version "10.0.2" - resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.2.tgz#277593e745acaa4646c3ab411289ec47a0392543" - integrity sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg== - dependencies: - "@types/glob" "^7.1.1" - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.0.3" - glob "^7.1.3" - ignore "^5.1.1" - merge2 "^1.2.3" - slash "^3.0.0" - -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" - -got@12.1.0: - version "12.1.0" - resolved "https://registry.yarnpkg.com/got/-/got-12.1.0.tgz#099f3815305c682be4fd6b0ee0726d8e4c6b0af4" - integrity sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig== - dependencies: - "@sindresorhus/is" "^4.6.0" - "@szmarczak/http-timer" "^5.0.1" - "@types/cacheable-request" "^6.0.2" - "@types/responselike" "^1.0.0" - cacheable-lookup "^6.0.4" - cacheable-request "^7.0.2" - decompress-response "^6.0.0" - form-data-encoder "1.7.1" - get-stream "^6.0.1" - http2-wrapper "^2.1.10" - lowercase-keys "^3.0.0" - p-cancelable "^3.0.0" - responselike "^2.0.0" - -got@9.6.0: - version "9.6.0" - resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" - integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== - dependencies: - "@sindresorhus/is" "^0.14.0" - "@szmarczak/http-timer" "^1.1.2" - cacheable-request "^6.0.0" - decompress-response "^3.3.0" - duplexer3 "^0.1.4" - get-stream "^4.1.0" - lowercase-keys "^1.0.1" - mimic-response "^1.0.1" - p-cancelable "^1.0.0" - to-readable-stream "^1.0.0" - url-parse-lax "^3.0.0" - -got@^11.8.5: - version "11.8.6" - resolved "https://registry.yarnpkg.com/got/-/got-11.8.6.tgz#276e827ead8772eddbcfc97170590b841823233a" - integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g== - dependencies: - "@sindresorhus/is" "^4.0.0" - "@szmarczak/http-timer" "^4.0.5" - "@types/cacheable-request" "^6.0.1" - "@types/responselike" "^1.0.0" - cacheable-lookup "^5.0.3" - cacheable-request "^7.0.2" - decompress-response "^6.0.0" - http2-wrapper "^1.0.0-beta.5.2" - lowercase-keys "^2.0.0" - p-cancelable "^2.0.0" - responselike "^2.0.0" - -got@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a" - integrity sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw== - dependencies: - decompress-response "^3.2.0" - duplexer3 "^0.1.4" - get-stream "^3.0.0" - is-plain-obj "^1.1.0" - is-retry-allowed "^1.0.0" - is-stream "^1.0.0" - isurl "^1.0.0-alpha5" - lowercase-keys "^1.0.0" - p-cancelable "^0.3.0" - p-timeout "^1.1.1" - safe-buffer "^5.0.1" - timed-out "^4.0.0" - url-parse-lax "^1.0.0" - url-to-options "^1.0.1" - -graceful-fs@^4.1.10, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.4: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -growl@1.10.3: - version "1.10.3" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.3.tgz#1926ba90cf3edfe2adb4927f5880bc22c66c790f" - integrity sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q== - -handlebars@^4.0.1: - version "4.7.8" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9" - integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== - dependencies: - minimist "^1.2.5" - neo-async "^2.6.2" - source-map "^0.6.1" - wordwrap "^1.0.0" - optionalDependencies: - uglify-js "^3.1.4" - -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q== - -har-validator@~5.1.3: - version "5.1.5" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" - integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== - dependencies: - ajv "^6.12.3" - har-schema "^2.0.0" - -hardhat@^2.22.10: - version "2.22.10" - resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.22.10.tgz#826ab56e47af98406e6dd105ba6d2dbb148013d9" - integrity sha512-JRUDdiystjniAvBGFmJRsiIZSOP2/6s++8xRDe3TzLeQXlWWHsXBrd9wd3JWFyKXvgMqMeLL5Sz/oNxXKYw9vg== - dependencies: - "@ethersproject/abi" "^5.1.2" - "@metamask/eth-sig-util" "^4.0.0" - "@nomicfoundation/edr" "^0.5.2" - "@nomicfoundation/ethereumjs-common" "4.0.4" - "@nomicfoundation/ethereumjs-tx" "5.0.4" - "@nomicfoundation/ethereumjs-util" "9.0.4" - "@nomicfoundation/solidity-analyzer" "^0.1.0" - "@sentry/node" "^5.18.1" - "@types/bn.js" "^5.1.0" - "@types/lru-cache" "^5.1.0" - adm-zip "^0.4.16" - aggregate-error "^3.0.0" - ansi-escapes "^4.3.0" - boxen "^5.1.2" - chalk "^2.4.2" - chokidar "^3.4.0" - ci-info "^2.0.0" - debug "^4.1.1" - enquirer "^2.3.0" - env-paths "^2.2.0" - ethereum-cryptography "^1.0.3" - ethereumjs-abi "^0.6.8" - find-up "^2.1.0" - fp-ts "1.19.3" - fs-extra "^7.0.1" - glob "7.2.0" - immutable "^4.0.0-rc.12" - io-ts "1.10.4" - keccak "^3.0.2" - lodash "^4.17.11" - mnemonist "^0.38.0" - mocha "^10.0.0" - p-map "^4.0.0" - raw-body "^2.4.1" - resolve "1.17.0" - semver "^6.3.0" - solc "0.8.26" - source-map-support "^0.5.13" - stacktrace-parser "^0.1.10" - tsort "0.0.1" - undici "^5.14.0" - uuid "^8.3.2" - ws "^7.4.6" - -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - integrity sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg== - dependencies: - ansi-regex "^2.0.0" - -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== - -has-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" - integrity sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA== - -has-flag@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" - integrity sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" - integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== - dependencies: - es-define-property "^1.0.0" - -has-proto@^1.0.1, has-proto@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" - integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== - -has-symbol-support-x@^1.4.1: - version "1.4.2" - resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" - integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw== - -has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-to-string-tag-x@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d" - integrity sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw== - dependencies: - has-symbol-support-x "^1.4.1" - -has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" - integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== - dependencies: - has-symbols "^1.0.3" - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q== - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw== - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ== - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ== - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -has@~1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.4.tgz#2eb2860e000011dae4f1406a86fe80e530fb2ec6" - integrity sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ== - -hash-base@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" - integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== - dependencies: - inherits "^2.0.4" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -hash-base@~3.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" - integrity sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -hash.js@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846" - integrity sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.0" - -hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - -hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== - dependencies: - function-bind "^1.1.2" - -he@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" - integrity sha512-z/GDPjlRMNOa2XJiB4em8wJpuuBfrFOlYKTZxtpkdr1uPdibHI8rYA3MY0KDObpVyaes0e/aunid/t88ZI2EKA== - -he@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -header-case@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/header-case/-/header-case-1.0.1.tgz#9535973197c144b09613cd65d317ef19963bd02d" - integrity sha512-i0q9mkOeSuhXw6bGgiQCCBgY/jlZuV/7dZXyZ9c6LcBrqwvT8eT719E9uxE5LiZftdl+z81Ugbg/VvXV4OJOeQ== - dependencies: - no-case "^2.2.0" - upper-case "^1.1.3" - -header-case@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/header-case/-/header-case-2.0.4.tgz#5a42e63b55177349cf405beb8d775acabb92c063" - integrity sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q== - dependencies: - capital-case "^1.0.4" - tslib "^2.0.3" - -heap@0.2.6: - version "0.2.6" - resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.6.tgz#087e1f10b046932fc8594dd9e6d378afc9d1e5ac" - integrity sha512-MzzWcnfB1e4EG2vHi3dXHoBupmuXNZzx6pY6HldVS55JKKBoq3xOyzfSaZRkJp37HIhEYC78knabHff3zc4dQQ== - -"heap@>= 0.2.0": - version "0.2.7" - resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.7.tgz#1e6adf711d3f27ce35a81fe3b7bd576c2260a8fc" - integrity sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg== - -highlight.js@^10.4.1: - version "10.7.3" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" - integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== - -highlightjs-solidity@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/highlightjs-solidity/-/highlightjs-solidity-2.0.6.tgz#e7a702a2b05e0a97f185e6ba39fd4846ad23a990" - integrity sha512-DySXWfQghjm2l6a/flF+cteroJqD4gI8GSdL4PtvxZSsAHie8m3yVe2JFoRg03ROKT6hp2Lc/BxXkqerNmtQYg== - -hmac-drbg@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -home-or-tmp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" - integrity sha512-ycURW7oUxE2sNiPVw1HVEFsW+ecOpJ5zaj7eC0RlwhibhRBod20muUN8qu/gzx956YrLolVvs1MTXwKgC2rVEg== - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.1" - -hosted-git-info@^2.1.4, hosted-git-info@^2.6.0: - version "2.8.9" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" - integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== - -htmlparser2@^9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-9.1.0.tgz#cdb498d8a75a51f739b61d3f718136c369bc8c23" - integrity sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ== - dependencies: - domelementtype "^2.3.0" - domhandler "^5.0.3" - domutils "^3.1.0" - entities "^4.5.0" - -http-basic@^8.1.1: - version "8.1.3" - resolved "https://registry.yarnpkg.com/http-basic/-/http-basic-8.1.3.tgz#a7cabee7526869b9b710136970805b1004261bbf" - integrity sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw== - dependencies: - caseless "^0.12.0" - concat-stream "^1.6.2" - http-response-object "^3.0.1" - parse-cache-control "^1.0.1" - -http-cache-semantics@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" - integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== - -http-errors@1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" - integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== - dependencies: - depd "2.0.0" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses "2.0.1" - toidentifier "1.0.1" - -http-errors@^1.7.2: - version "1.8.1" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" - integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.1" - -http-https@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/http-https/-/http-https-1.0.0.tgz#2f908dd5f1db4068c058cd6e6d4ce392c913389b" - integrity sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg== - -http-parser-js@>=0.5.1: - version "0.5.8" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3" - integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== - -http-response-object@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/http-response-object/-/http-response-object-3.0.2.tgz#7f435bb210454e4360d074ef1f989d5ea8aa9810" - integrity sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA== - dependencies: - "@types/node" "^10.0.3" - -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ== - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - -http2-wrapper@^1.0.0-beta.5.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d" - integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg== - dependencies: - quick-lru "^5.1.1" - resolve-alpn "^1.0.0" - -http2-wrapper@^2.1.10: - version "2.2.1" - resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-2.2.1.tgz#310968153dcdedb160d8b72114363ef5fce1f64a" - integrity sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ== - dependencies: - quick-lru "^5.1.1" - resolve-alpn "^1.2.0" - -https-proxy-agent@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" - integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== - dependencies: - agent-base "6" - debug "4" - -iconv-lite@0.4.24, iconv-lite@^0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -iconv-lite@0.6.3, iconv-lite@^0.6.2, iconv-lite@^0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -idb@3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/idb/-/idb-3.0.2.tgz#c8e9122d5ddd40f13b60ae665e4862f8b13fa384" - integrity sha512-+FLa/0sTXqyux0o6C+i2lOR0VoS60LU/jzUo5xjfY6+7sEEgy4Gz1O7yFBXvjd7N0NyIGWIRg8DcQSLEG+VSPw== - -idna-uts46-hx@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz#a1dc5c4df37eee522bf66d969cc980e00e8711f9" - integrity sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA== - dependencies: - punycode "2.1.0" - -ieee754@^1.1.13, ieee754@^1.1.4, ieee754@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -ignore@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== - -ignore@^5.1.1: - version "5.3.2" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" - integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== - -immediate@^3.2.3: - version "3.3.0" - resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.3.0.tgz#1aef225517836bcdf7f2a2de2600c79ff0269266" - integrity sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q== - -immediate@~3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.2.3.tgz#d140fa8f614659bd6541233097ddaac25cdd991c" - integrity sha512-RrGCXRm/fRVqMIhqXrGEX9rRADavPiDFSoMb/k64i9XMk8uH4r/Omi5Ctierj6XzNecwDbO4WuFbDD1zmpl3Tg== - -immutable@^4.0.0-rc.12: - version "4.3.7" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.7.tgz#c70145fc90d89fb02021e65c84eb0226e4e5a381" - integrity sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw== - -import-fresh@^3.0.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inherits@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== - -ini@^1.3.5: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -inquirer@^6.4.1: - version "6.5.2" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" - integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== - dependencies: - ansi-escapes "^3.2.0" - chalk "^2.4.2" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^3.0.3" - figures "^2.0.0" - lodash "^4.17.12" - mute-stream "0.0.7" - run-async "^2.2.0" - rxjs "^6.4.0" - string-width "^2.1.0" - strip-ansi "^5.1.0" - through "^2.3.6" - -inquirer@^7.0.0: - version "7.3.3" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" - integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== - dependencies: - ansi-escapes "^4.2.1" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-width "^3.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.19" - mute-stream "0.0.8" - run-async "^2.4.0" - rxjs "^6.6.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - through "^2.3.6" - -internal-slot@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" - integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== - dependencies: - es-errors "^1.3.0" - hasown "^2.0.0" - side-channel "^1.0.4" - -interpret@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" - integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== - -invariant@^2.2.2: - version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== - dependencies: - loose-envify "^1.0.0" - -invert-kv@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" - integrity sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ== - -io-ts@1.10.4: - version "1.10.4" - resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-1.10.4.tgz#cd5401b138de88e4f920adbcb7026e2d1967e6e2" - integrity sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g== - dependencies: - fp-ts "^1.0.0" - -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - -is-accessor-descriptor@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz#3223b10628354644b86260db29b3e693f5ceedd4" - integrity sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA== - dependencies: - hasown "^2.0.0" - -is-arguments@^1.0.4, is-arguments@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-array-buffer@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" - integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - -is-binary-path@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - integrity sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q== - dependencies: - binary-extensions "^1.0.0" - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - -is-buffer@^2.0.2: - version "2.0.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" - integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== - -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== - -is-ci@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" - integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== - dependencies: - ci-info "^2.0.0" - -is-core-module@^2.13.0, is-core-module@^2.15.1: - version "2.15.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37" - integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ== - dependencies: - hasown "^2.0.2" - -is-data-descriptor@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz#2109164426166d32ea38c405c1e0945d9e6a4eeb" - integrity sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw== - dependencies: - hasown "^2.0.0" - -is-data-view@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" - integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== - dependencies: - is-typed-array "^1.1.13" - -is-date-object@^1.0.1, is-date-object@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - -is-descriptor@^0.1.0: - version "0.1.7" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.7.tgz#2727eb61fd789dcd5bdf0ed4569f551d2fe3be33" - integrity sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg== - dependencies: - is-accessor-descriptor "^1.0.1" - is-data-descriptor "^1.0.1" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.3.tgz#92d27cb3cd311c4977a4db47df457234a13cb306" - integrity sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw== - dependencies: - is-accessor-descriptor "^1.0.1" - is-data-descriptor "^1.0.1" - -is-docker@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" - integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== - -is-dotfile@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" - integrity sha512-9YclgOGtN/f8zx0Pr4FQYMdibBiTaH3sn52vjYip4ZSf6C4/6RfTEZ+MR4GvKhCxdPh21Bg42/WL55f6KSnKpg== - -is-equal-shallow@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" - integrity sha512-0EygVC5qPvIyb+gSz7zdD5/AAoS6Qrx1e//6N4yv4oNm30kqvdmG66oZFWVlQHUWe5OjP08FuTw2IdT0EOTcYA== - dependencies: - is-primitive "^2.0.0" - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - -is-extglob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" - integrity sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww== - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-finite@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" - integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== - -is-fn@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fn/-/is-fn-1.0.0.tgz#9543d5de7bcf5b08a22ec8a20bae6e286d510d8c" - integrity sha512-XoFPJQmsAShb3jEQRfzf2rqXavq7fIqF/jOekp308JlThqrODnMpweVSGilKTCXELfLhltGP2AGgbQGVP8F1dg== - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw== - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-function@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08" - integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== - -is-generator-function@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" - integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== - dependencies: - has-tostringtag "^1.0.0" - -is-glob@^2.0.0, is-glob@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" - integrity sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg== - dependencies: - is-extglob "^1.0.0" - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-hex-prefixed@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" - integrity sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA== - -is-lower-case@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/is-lower-case/-/is-lower-case-1.1.3.tgz#7e147be4768dc466db3bfb21cc60b31e6ad69393" - integrity sha512-+5A1e/WJpLLXZEDlgz4G//WYSHyQBD32qa4Jd3Lw06qQlv3fJHnp3YIHjTQSGzHMgzmVKz2ZP3rBxTHkPw/lxA== - dependencies: - lower-case "^1.1.0" - -is-my-ip-valid@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-my-ip-valid/-/is-my-ip-valid-1.0.1.tgz#f7220d1146257c98672e6fba097a9f3f2d348442" - integrity sha512-jxc8cBcOWbNK2i2aTkCZP6i7wkHF1bqKFrwEHuN5Jtg5BSaZHUZQ/JTOJwoV41YvHnOaRyWWh72T/KvfNz9DJg== - -is-my-json-valid@^2.20.6: - version "2.20.6" - resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.20.6.tgz#a9d89e56a36493c77bda1440d69ae0dc46a08387" - integrity sha512-1JQwulVNjx8UqkPE/bqDaxtH4PXCe/2VRh/y3p99heOV87HG4Id5/VfDswd+YiAfHcRTfDlWgISycnHuhZq1aw== - dependencies: - generate-function "^2.0.0" - generate-object-property "^1.1.0" - is-my-ip-valid "^1.0.0" - jsonpointer "^5.0.0" - xtend "^4.0.0" - -is-natural-number@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-4.0.1.tgz#ab9d76e1db4ced51e35de0c72ebecf09f734cde8" - integrity sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ== - -is-negative-zero@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" - integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== - -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== - dependencies: - has-tostringtag "^1.0.0" - -is-number@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" - integrity sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg== - dependencies: - kind-of "^3.0.2" - -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg== - dependencies: - kind-of "^3.0.2" - -is-number@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" - integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-obj@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== - -is-obj@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" - integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== - -is-object@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.2.tgz#a56552e1c665c9e950b4a025461da87e72f86fcf" - integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA== - -is-plain-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== - -is-plain-obj@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - -is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-posix-bracket@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" - integrity sha512-Yu68oeXJ7LeWNmZ3Zov/xg/oDBnBK2RNxwYY1ilNJX+tKKZqgPK+qOn/Gs9jEu66KDY9Netf5XLKNGzas/vPfQ== - -is-primitive@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" - integrity sha512-N3w1tFaRfk3UrPfqeRyD+GYDASU3W5VinKhlORy8EWVf/sIdDL9GAcew85XmktCfH+ngG7SRXEVDoO18WMdB/Q== - -is-property@^1.0.0, is-property@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" - integrity sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g== - -is-regex@^1.1.4, is-regex@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-retry-allowed@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" - integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== - -is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" - integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== - dependencies: - call-bind "^1.0.7" - -is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== - -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - -is-typed-array@^1.1.13, is-typed-array@^1.1.3: - version "1.1.13" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" - integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== - dependencies: - which-typed-array "^1.1.14" - -is-typedarray@^1.0.0, is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== - -is-unicode-supported@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" - integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== - -is-upper-case@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-upper-case/-/is-upper-case-1.1.2.tgz#8d0b1fa7e7933a1e58483600ec7d9661cbaf756f" - integrity sha512-GQYSJMgfeAmVwh9ixyk888l7OIhNAGKtY6QA+IrWlu9MDTCaXmeozOZ2S9Knj7bQwBO/H6J2kb+pbyTUiMNbsw== - dependencies: - upper-case "^1.1.0" - -is-url@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" - integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== - -is-utf8@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - integrity sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q== - -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== - dependencies: - call-bind "^1.0.2" - -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -is-wsl@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== - -isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== - -isomorphic-unfetch@^3.0.0, isomorphic-unfetch@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz#87341d5f4f7b63843d468438128cb087b7c3e98f" - integrity sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q== - dependencies: - node-fetch "^2.6.1" - unfetch "^4.2.0" - -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== - -isurl@^1.0.0-alpha5: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67" - integrity sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w== - dependencies: - has-to-string-tag-x "^1.2.0" - is-object "^1.0.1" - -js-cookie@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-2.2.1.tgz#69e106dc5d5806894562902aa5baec3744e9b2b8" - integrity sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ== - -js-sha256@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/js-sha256/-/js-sha256-0.9.0.tgz#0b89ac166583e91ef9123644bd3c5334ce9d0966" - integrity sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA== - -js-sha3@0.5.5: - version "0.5.5" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.5.tgz#baf0c0e8c54ad5903447df96ade7a4a1bca79a4a" - integrity sha512-yLLwn44IVeunwjpDVTDZmQeVbB0h+dZpY2eO68B/Zik8hu6dH+rKeLxwua79GGIvW6xr8NBAcrtiUbYrTjEFTA== - -js-sha3@0.5.7, js-sha3@^0.5.7: - version "0.5.7" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7" - integrity sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g== - -js-sha3@0.8.0, js-sha3@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" - integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== - -js-string-escape@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef" - integrity sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg== - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-tokens@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" - integrity sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg== - -js-yaml@3.x, js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== - -jsesc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" - integrity sha512-Mke0DA0QjUWuJlhsE0ZPPhYiJkRap642SmI/4ztCFaUs6V2AiH1sfecc+57NgaryfAA2VR3v6O+CSjC1jZJKOA== - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== - -json-buffer@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" - integrity sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ== - -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - -json-rpc-engine@^3.4.0, json-rpc-engine@^3.6.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-3.8.0.tgz#9d4ff447241792e1d0a232f6ef927302bb0c62a9" - integrity sha512-6QNcvm2gFuuK4TKU1uwfH0Qd/cOSb9c1lls0gbnIhciktIUQJwz6NQNAW4B1KiGPenv7IKu97V222Yo1bNhGuA== - dependencies: - async "^2.0.1" - babel-preset-env "^1.7.0" - babelify "^7.3.0" - json-rpc-error "^2.0.0" - promise-to-callback "^1.0.0" - safe-event-emitter "^1.0.1" - -json-rpc-error@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/json-rpc-error/-/json-rpc-error-2.0.0.tgz#a7af9c202838b5e905c7250e547f1aff77258a02" - integrity sha512-EwUeWP+KgAZ/xqFpaP6YDAXMtCJi+o/QQpCQFIYyxr01AdADi2y413eM8hSqJcoQym9WMePAJWoaODEJufC4Ug== - dependencies: - inherits "^2.0.1" - -json-rpc-random-id@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz#ba49d96aded1444dbb8da3d203748acbbcdec8c8" - integrity sha512-RJ9YYNCkhVDBuP4zN5BBtYAzEl03yq/jIIsyif0JY9qyJuQQZNeDK7anAPKKlyEtLSj2s8h6hNh2F8zO5q7ScA== - -json-schema-traverse@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" - integrity sha512-4JD/Ivzg7PoW8NzdrBSr3UFwC9mHgvI7Z6z3QGBsSHgKaRTUDmyZAAKJo2UbG1kUVfS9WS8bi36N49U1xw43DA== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -json-schema@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" - integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -json-stable-stringify@^1.0.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.1.1.tgz#52d4361b47d49168bcc4e564189a42e5a7439454" - integrity sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg== - dependencies: - call-bind "^1.0.5" - isarray "^2.0.5" - jsonify "^0.0.1" - object-keys "^1.1.1" - -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== - -json-text-sequence@^0.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/json-text-sequence/-/json-text-sequence-0.1.1.tgz#a72f217dc4afc4629fff5feb304dc1bd51a2f3d2" - integrity sha512-L3mEegEWHRekSHjc7+sc8eJhba9Clq1PZ8kMkzf8OxElhXc8O4TS5MwcVlj9aEbm5dr81N90WHC5nAz3UO971w== - dependencies: - delimit-stream "0.1.0" - -json5@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" - integrity sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw== - -json5@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" - integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== - dependencies: - minimist "^1.2.0" - -jsonfile@^2.1.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" - integrity sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw== - optionalDependencies: - graceful-fs "^4.1.6" - -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== - optionalDependencies: - graceful-fs "^4.1.6" - -jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -jsonify@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.1.tgz#2aa3111dae3d34a0f151c63f3a45d995d9420978" - integrity sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg== - -jsonpointer@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559" - integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ== - -jsonschema@^1.2.4: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.1.tgz#cc4c3f0077fb4542982973d8a083b6b34f482dab" - integrity sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ== - -jsprim@^1.2.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" - integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.4.0" - verror "1.10.0" - -keccak@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.1.tgz#ae30a0e94dbe43414f741375cff6d64c8bea0bff" - integrity sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA== - dependencies: - node-addon-api "^2.0.0" - node-gyp-build "^4.2.0" - -keccak@^3.0.0, keccak@^3.0.2: - version "3.0.4" - resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.4.tgz#edc09b89e633c0549da444432ecf062ffadee86d" - integrity sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q== - dependencies: - node-addon-api "^2.0.0" - node-gyp-build "^4.2.0" - readable-stream "^3.6.0" - -keyv@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" - integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== - dependencies: - json-buffer "3.0.0" - -keyv@^4.0.0: - version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" - integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== - dependencies: - json-buffer "3.0.1" - -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw== - dependencies: - is-buffer "^1.1.5" - -kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -klaw-sync@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c" - integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ== - dependencies: - graceful-fs "^4.1.11" - -klaw@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" - integrity sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw== - optionalDependencies: - graceful-fs "^4.1.9" - -lcid@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" - integrity sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw== - dependencies: - invert-kv "^1.0.0" - -lcov-parse@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lcov-parse/-/lcov-parse-1.0.0.tgz#eb0d46b54111ebc561acb4c408ef9363bdc8f7e0" - integrity sha512-aprLII/vPzuQvYZnDRU78Fns9I2Ag3gi4Ipga/hxnVMCZC8DnR2nI7XBqrPoywGfxqIx/DgarGvDJZAD3YBTgQ== - -level-codec@^9.0.0: - version "9.0.2" - resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-9.0.2.tgz#fd60df8c64786a80d44e63423096ffead63d8cbc" - integrity sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ== - dependencies: - buffer "^5.6.0" - -level-codec@~7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-7.0.1.tgz#341f22f907ce0f16763f24bddd681e395a0fb8a7" - integrity sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ== - -level-concat-iterator@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz#1d1009cf108340252cb38c51f9727311193e6263" - integrity sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw== - -level-errors@^1.0.3: - version "1.1.2" - resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-1.1.2.tgz#4399c2f3d3ab87d0625f7e3676e2d807deff404d" - integrity sha512-Sw/IJwWbPKF5Ai4Wz60B52yj0zYeqzObLh8k1Tk88jVmD51cJSKWSYpRyhVIvFzZdvsPqlH5wfhp/yxdsaQH4w== - dependencies: - errno "~0.1.1" - -level-errors@^2.0.0, level-errors@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-2.0.1.tgz#2132a677bf4e679ce029f517c2f17432800c05c8" - integrity sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw== - dependencies: - errno "~0.1.1" - -level-errors@~1.0.3: - version "1.0.5" - resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-1.0.5.tgz#83dbfb12f0b8a2516bdc9a31c4876038e227b859" - integrity sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig== - dependencies: - errno "~0.1.1" - -level-iterator-stream@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-2.0.3.tgz#ccfff7c046dcf47955ae9a86f46dfa06a31688b4" - integrity sha512-I6Heg70nfF+e5Y3/qfthJFexhRw/Gi3bIymCoXAlijZdAcLaPuWSJs3KXyTYf23ID6g0o2QF62Yh+grOXY3Rig== - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.5" - xtend "^4.0.0" - -level-iterator-stream@~1.3.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz#e43b78b1a8143e6fa97a4f485eb8ea530352f2ed" - integrity sha512-1qua0RHNtr4nrZBgYlpV0qHHeHpcRRWTxEZJ8xsemoHAXNL5tbooh4tPEEqIqsbWCAJBmUmkwYK/sW5OrFjWWw== - dependencies: - inherits "^2.0.1" - level-errors "^1.0.3" - readable-stream "^1.0.33" - xtend "^4.0.0" - -level-iterator-stream@~3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-3.0.1.tgz#2c98a4f8820d87cdacab3132506815419077c730" - integrity sha512-nEIQvxEED9yRThxvOrq8Aqziy4EGzrxSZK+QzEFAVuJvQ8glfyZ96GB6BoI4sBbLfjMXm2w4vu3Tkcm9obcY0g== - dependencies: - inherits "^2.0.1" - readable-stream "^2.3.6" - xtend "^4.0.0" - -level-iterator-stream@~4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz#7ceba69b713b0d7e22fcc0d1f128ccdc8a24f79c" - integrity sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q== - dependencies: - inherits "^2.0.4" - readable-stream "^3.4.0" - xtend "^4.0.2" - -level-mem@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/level-mem/-/level-mem-3.0.1.tgz#7ce8cf256eac40f716eb6489654726247f5a89e5" - integrity sha512-LbtfK9+3Ug1UmvvhR2DqLqXiPW1OJ5jEh0a3m9ZgAipiwpSxGj/qaVVy54RG5vAQN1nCuXqjvprCuKSCxcJHBg== - dependencies: - level-packager "~4.0.0" - memdown "~3.0.0" - -level-mem@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/level-mem/-/level-mem-5.0.1.tgz#c345126b74f5b8aa376dc77d36813a177ef8251d" - integrity sha512-qd+qUJHXsGSFoHTziptAKXoLX87QjR7v2KMbqncDXPxQuCdsQlzmyX+gwrEHhlzn08vkf8TyipYyMmiC6Gobzg== - dependencies: - level-packager "^5.0.3" - memdown "^5.0.0" - -level-packager@^5.0.3: - version "5.1.1" - resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-5.1.1.tgz#323ec842d6babe7336f70299c14df2e329c18939" - integrity sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ== - dependencies: - encoding-down "^6.3.0" - levelup "^4.3.2" - -level-packager@~4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-4.0.1.tgz#7e7d3016af005be0869bc5fa8de93d2a7f56ffe6" - integrity sha512-svCRKfYLn9/4CoFfi+d8krOtrp6RoX8+xm0Na5cgXMqSyRru0AnDYdLl+YI8u1FyS6gGZ94ILLZDE5dh2but3Q== - dependencies: - encoding-down "~5.0.0" - levelup "^3.0.0" - -level-post@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/level-post/-/level-post-1.0.7.tgz#19ccca9441a7cc527879a0635000f06d5e8f27d0" - integrity sha512-PWYqG4Q00asOrLhX7BejSajByB4EmG2GaKHfj3h5UmmZ2duciXLPGYWIjBzLECFWUGOZWlm5B20h/n3Gs3HKew== - dependencies: - ltgt "^2.1.2" - -level-sublevel@6.6.4: - version "6.6.4" - resolved "https://registry.yarnpkg.com/level-sublevel/-/level-sublevel-6.6.4.tgz#f7844ae893919cd9d69ae19d7159499afd5352ba" - integrity sha512-pcCrTUOiO48+Kp6F1+UAzF/OtWqLcQVTVF39HLdZ3RO8XBoXt+XVPKZO1vVr1aUoxHZA9OtD2e1v7G+3S5KFDA== - dependencies: - bytewise "~1.1.0" - level-codec "^9.0.0" - level-errors "^2.0.0" - level-iterator-stream "^2.0.3" - ltgt "~2.1.1" - pull-defer "^0.2.2" - pull-level "^2.0.3" - pull-stream "^3.6.8" - typewiselite "~1.0.0" - xtend "~4.0.0" - -level-supports@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-1.0.1.tgz#2f530a596834c7301622521988e2c36bb77d122d" - integrity sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg== - dependencies: - xtend "^4.0.2" - -level-ws@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-0.0.0.tgz#372e512177924a00424b0b43aef2bb42496d228b" - integrity sha512-XUTaO/+Db51Uiyp/t7fCMGVFOTdtLS/NIACxE/GHsij15mKzxksZifKVjlXDF41JMUP/oM1Oc4YNGdKnc3dVLw== - dependencies: - readable-stream "~1.0.15" - xtend "~2.1.1" - -level-ws@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-1.0.0.tgz#19a22d2d4ac57b18cc7c6ecc4bd23d899d8f603b" - integrity sha512-RXEfCmkd6WWFlArh3X8ONvQPm8jNpfA0s/36M4QzLqrLEIt1iJE9WBHLZ5vZJK6haMjJPJGJCQWfjMNnRcq/9Q== - dependencies: - inherits "^2.0.3" - readable-stream "^2.2.8" - xtend "^4.0.1" - -level-ws@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-2.0.0.tgz#207a07bcd0164a0ec5d62c304b4615c54436d339" - integrity sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA== - dependencies: - inherits "^2.0.3" - readable-stream "^3.1.0" - xtend "^4.0.1" - -levelup@3.1.1, levelup@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/levelup/-/levelup-3.1.1.tgz#c2c0b3be2b4dc316647c53b42e2f559e232d2189" - integrity sha512-9N10xRkUU4dShSRRFTBdNaBxofz+PGaIZO962ckboJZiNmLuhVT6FZ6ZKAsICKfUBO76ySaYU6fJWX/jnj3Lcg== - dependencies: - deferred-leveldown "~4.0.0" - level-errors "~2.0.0" - level-iterator-stream "~3.0.0" - xtend "~4.0.0" - -levelup@^1.2.1: - version "1.3.9" - resolved "https://registry.yarnpkg.com/levelup/-/levelup-1.3.9.tgz#2dbcae845b2bb2b6bea84df334c475533bbd82ab" - integrity sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ== - dependencies: - deferred-leveldown "~1.2.1" - level-codec "~7.0.0" - level-errors "~1.0.3" - level-iterator-stream "~1.3.0" - prr "~1.0.1" - semver "~5.4.1" - xtend "~4.0.0" - -levelup@^4.3.2: - version "4.4.0" - resolved "https://registry.yarnpkg.com/levelup/-/levelup-4.4.0.tgz#f89da3a228c38deb49c48f88a70fb71f01cafed6" - integrity sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ== - dependencies: - deferred-leveldown "~5.3.0" - level-errors "~2.0.0" - level-iterator-stream "~4.0.0" - level-supports "~1.0.0" - xtend "~4.0.0" - -levn@^0.3.0, levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -load-json-file@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - integrity sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A== - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - pinkie-promise "^2.0.0" - strip-bom "^2.0.0" - -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lockfile@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/lockfile/-/lockfile-1.0.4.tgz#07f819d25ae48f87e538e6578b6964a4981a5609" - integrity sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA== - dependencies: - signal-exit "^3.0.2" - -lodash.assign@^4.0.3, lodash.assign@^4.0.6: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" - integrity sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw== - -lodash.camelcase@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" - integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== - -lodash.clonedeep@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" - integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ== - -lodash.flatten@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" - integrity sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g== - -lodash.isequal@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" - integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lodash.truncate@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" - integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== - -lodash@4.17.20: - version "4.17.20" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" - integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== - -lodash@^4.14.2, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -log-driver@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/log-driver/-/log-driver-1.2.7.tgz#63b95021f0702fedfa2c9bb0a24e7797d71871d8" - integrity sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg== - -log-symbols@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - -long@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" - integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== - -long@^5.0.0: - version "5.2.3" - resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1" - integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== - -looper@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/looper/-/looper-2.0.0.tgz#66cd0c774af3d4fedac53794f742db56da8f09ec" - integrity sha512-6DzMHJcjbQX/UPHc1rRCBfKlLwDkvuGZ715cIR36wSdYqWXFT35uLXq5P/2orl3tz+t+VOVPxw4yPinQlUDGDQ== - -looper@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/looper/-/looper-3.0.0.tgz#2efa54c3b1cbaba9b94aee2e5914b0be57fbb749" - integrity sha512-LJ9wplN/uSn72oJRsXTx+snxPet5c8XiZmOKCm906NVYu+ag6SB6vUcnJcWxgnl2NfbIyeobAn7Bwv6xRj2XJg== - -loose-envify@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -loupe@^2.3.6: - version "2.3.7" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697" - integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== - dependencies: - get-func-name "^2.0.1" - -lower-case-first@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/lower-case-first/-/lower-case-first-1.0.2.tgz#e5da7c26f29a7073be02d52bac9980e5922adfa1" - integrity sha512-UuxaYakO7XeONbKrZf5FEgkantPf5DUqDayzP5VXZrtRPdH86s4kN47I8B3TW10S4QKiE3ziHNf3kRN//okHjA== - dependencies: - lower-case "^1.1.2" - -lower-case@^1.1.0, lower-case@^1.1.1, lower-case@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" - integrity sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA== - -lower-case@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" - integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== - dependencies: - tslib "^2.0.3" - -lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" - integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== - -lowercase-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" - integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== - -lowercase-keys@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-3.0.0.tgz#c5e7d442e37ead247ae9db117a9d0a467c89d4f2" - integrity sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ== - -lru-cache@5.1.1, lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -lru-cache@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-3.2.0.tgz#71789b3b7f5399bec8565dda38aa30d2a097efee" - integrity sha512-91gyOKTc2k66UG6kHiH4h3S2eltcPwE1STVfMYC/NG+nZwf8IIuiamfmpGZjpbbxzSyEJaLC0tNSmhjlQUTJow== - dependencies: - pseudomap "^1.0.1" - -lru-cache@^4.0.1: - version "4.1.5" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" - integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - -lru_map@0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.4.1.tgz#f7b4046283c79fb7370c36f8fca6aee4324b0a98" - integrity sha512-I+lBvqMMFfqaV8CJCISjI3wbjmwVu/VyOoU7+qtu9d7ioW5klMgsTTiUOUp+DJvfTTzKXoPbyC6YfgkNcyPSOg== - -lru_map@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" - integrity sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ== - -ltgt@^2.1.2, ltgt@~2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5" - integrity sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA== - -ltgt@~2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.1.3.tgz#10851a06d9964b971178441c23c9e52698eece34" - integrity sha512-5VjHC5GsENtIi5rbJd+feEpDKhfr7j0odoUR2Uh978g+2p93nd5o34cTjQWohXsPsCZeqoDnIqEf88mPCe0Pfw== - -make-dir@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" - integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== - dependencies: - pify "^3.0.0" - -make-dir@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w== - dependencies: - object-visit "^1.0.0" - -markdown-table@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-1.1.3.tgz#9fcb69bcfdb8717bfd0398c6ec2d93036ef8de60" - integrity sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q== - -math-random@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" - integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A== - -md5.js@^1.3.4: - version "1.3.5" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" - integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== - -mem@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" - integrity sha512-nOBDrc/wgpkd3X/JOhMqYR+/eLqlfLP4oQfoBA6QExIxEl+GU01oyEkwWyueyO8110pUKijtiHGhEmYoOn88oQ== - dependencies: - mimic-fn "^1.0.0" - -memdown@^1.0.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/memdown/-/memdown-1.4.1.tgz#b4e4e192174664ffbae41361aa500f3119efe215" - integrity sha512-iVrGHZB8i4OQfM155xx8akvG9FIj+ht14DX5CQkCTG4EHzZ3d3sgckIf/Lm9ivZalEsFuEVnWv2B2WZvbrro2w== - dependencies: - abstract-leveldown "~2.7.1" - functional-red-black-tree "^1.0.1" - immediate "^3.2.3" - inherits "~2.0.1" - ltgt "~2.2.0" - safe-buffer "~5.1.1" - -memdown@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/memdown/-/memdown-5.1.0.tgz#608e91a9f10f37f5b5fe767667a8674129a833cb" - integrity sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw== - dependencies: - abstract-leveldown "~6.2.1" - functional-red-black-tree "~1.0.1" - immediate "~3.2.3" - inherits "~2.0.1" - ltgt "~2.2.0" - safe-buffer "~5.2.0" - -memdown@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/memdown/-/memdown-3.0.0.tgz#93aca055d743b20efc37492e9e399784f2958309" - integrity sha512-tbV02LfZMWLcHcq4tw++NuqMO+FZX8tNJEiD2aNRm48ZZusVg5N8NART+dmBkepJVye986oixErf7jfXboMGMA== - dependencies: - abstract-leveldown "~5.0.0" - functional-red-black-tree "~1.0.1" - immediate "~3.2.3" - inherits "~2.0.1" - ltgt "~2.2.0" - safe-buffer "~5.1.1" - -memorystream@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" - integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== - -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== - -merge2@^1.2.3, merge2@^1.3.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -merkle-patricia-tree@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-3.0.0.tgz#448d85415565df72febc33ca362b8b614f5a58f8" - integrity sha512-soRaMuNf/ILmw3KWbybaCjhx86EYeBbD8ph0edQCTed0JN/rxDt1EBN52Ajre3VyGo+91f8+/rfPIRQnnGMqmQ== - dependencies: - async "^2.6.1" - ethereumjs-util "^5.2.0" - level-mem "^3.0.1" - level-ws "^1.0.0" - readable-stream "^3.0.6" - rlp "^2.0.0" - semaphore ">=1.0.1" - -merkle-patricia-tree@^2.1.2, merkle-patricia-tree@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz#982ca1b5a0fde00eed2f6aeed1f9152860b8208a" - integrity sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g== - dependencies: - async "^1.4.2" - ethereumjs-util "^5.0.0" - level-ws "0.0.0" - levelup "^1.2.1" - memdown "^1.0.0" - readable-stream "^2.0.0" - rlp "^2.0.0" - semaphore ">=1.0.1" - -merkle-patricia-tree@^4.2.4: - version "4.2.4" - resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-4.2.4.tgz#ff988d045e2bf3dfa2239f7fabe2d59618d57413" - integrity sha512-eHbf/BG6eGNsqqfbLED9rIqbsF4+sykEaBn6OLNs71tjclbMcMOk1tEPmJKcNcNCLkvbpY/lwyOlizWsqPNo8w== - dependencies: - "@types/levelup" "^4.3.0" - ethereumjs-util "^7.1.4" - level-mem "^5.0.1" - level-ws "^2.0.0" - readable-stream "^3.6.0" - semaphore-async-await "^1.5.1" - -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== - -micro-ftch@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/micro-ftch/-/micro-ftch-0.3.1.tgz#6cb83388de4c1f279a034fb0cf96dfc050853c5f" - integrity sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg== - -micromatch@^2.1.5: - version "2.3.11" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" - integrity sha512-LnU2XFEk9xxSJ6rfgAry/ty5qwUTyHYOBU0g4R6tIw5ljwgGIBmiKhRWLw5NpMOnrgUNcDJ4WMp8rl3sYVHLNA== - dependencies: - arr-diff "^2.0.0" - array-unique "^0.2.1" - braces "^1.8.2" - expand-brackets "^0.1.4" - extglob "^0.3.1" - filename-regex "^2.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.1" - kind-of "^3.0.2" - normalize-path "^2.0.1" - object.omit "^2.0.0" - parse-glob "^3.0.4" - regex-cache "^0.4.2" - -micromatch@^3.1.10, micromatch@^3.1.4: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - -micromatch@^4.0.2, micromatch@^4.0.4: - version "4.0.8" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" - integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== - dependencies: - braces "^3.0.3" - picomatch "^2.3.1" - -miller-rabin@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" - integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== - dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.12, mime-types@^2.1.16, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mime@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -mimic-response@^1.0.0, mimic-response@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" - integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== - -mimic-response@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" - integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== - -min-document@^2.19.0: - version "2.19.0" - resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" - integrity sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ== - dependencies: - dom-walk "^0.1.0" - -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== - -"minimatch@2 || 3", minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^5.0.1, minimatch@^5.1.6: - version "5.1.6" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" - integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^9.0.5: - version "9.0.5" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" - integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== - dependencies: - brace-expansion "^2.0.1" - -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - integrity sha512-miQKw5Hv4NS1Psg2517mV4e4dYNaO3++hjAvLOAzKqZ61rH8NS1SK+vbfBWZ5PY/Me/bEWhUwqMghEW5Fb9T7Q== - -minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6, minimist@^1.2.7, minimist@~1.2.8: - version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -minipass@^2.6.0, minipass@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" - integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== - dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" - -minizlib@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" - integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== - dependencies: - minipass "^2.9.0" - -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mkdirp-promise@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz#e9b8f68e552c68a9c1713b84883f7a1dd039b8a1" - integrity sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w== - dependencies: - mkdirp "*" - -mkdirp@*: - version "3.0.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-3.0.1.tgz#e44e4c5607fb279c168241713cc6e0fea9adcb50" - integrity sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg== - -mkdirp@0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - integrity sha512-SknJC52obPfGQPnjIkXbmA6+5H15E+fR+E4iR2oQ3zzCLbd7/ONua69R/Gw7AgkTLsRG+r5fzksYwWe1AgTyWA== - dependencies: - minimist "0.0.8" - -mkdirp@0.5.x, mkdirp@^0.5.1, mkdirp@^0.5.5: - version "0.5.6" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" - integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== - dependencies: - minimist "^1.2.6" - -mkdirp@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -mnemonist@^0.38.0: - version "0.38.5" - resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.38.5.tgz#4adc7f4200491237fe0fa689ac0b86539685cade" - integrity sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg== - dependencies: - obliterator "^2.0.0" - -mocha@^10.0.0, mocha@^10.2.0: - version "10.7.3" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.7.3.tgz#ae32003cabbd52b59aece17846056a68eb4b0752" - integrity sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A== - dependencies: - ansi-colors "^4.1.3" - browser-stdout "^1.3.1" - chokidar "^3.5.3" - debug "^4.3.5" - diff "^5.2.0" - escape-string-regexp "^4.0.0" - find-up "^5.0.0" - glob "^8.1.0" - he "^1.2.0" - js-yaml "^4.1.0" - log-symbols "^4.1.0" - minimatch "^5.1.6" - ms "^2.1.3" - serialize-javascript "^6.0.2" - strip-json-comments "^3.1.1" - supports-color "^8.1.1" - workerpool "^6.5.1" - yargs "^16.2.0" - yargs-parser "^20.2.9" - yargs-unparser "^2.0.0" - -mocha@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-4.1.0.tgz#7d86cfbcf35cb829e2754c32e17355ec05338794" - integrity sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA== - dependencies: - browser-stdout "1.3.0" - commander "2.11.0" - debug "3.1.0" - diff "3.3.1" - escape-string-regexp "1.0.5" - glob "7.1.2" - growl "1.10.3" - he "1.1.1" - mkdirp "0.5.1" - supports-color "4.4.0" - -mock-fs@^4.1.0: - version "4.14.0" - resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.14.0.tgz#ce5124d2c601421255985e6e94da80a7357b1b18" - integrity sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw== - -mock-property@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/mock-property/-/mock-property-1.0.3.tgz#3e37c50a56609d548cabd56559fde3dd8767b10c" - integrity sha512-2emPTb1reeLLYwHxyVx993iYyCHEiRRO+y8NFXFPL5kl5q14sgTK76cXyEKkeKCHeRw35SfdkUJ10Q1KfHuiIQ== - dependencies: - define-data-property "^1.1.1" - functions-have-names "^1.2.3" - gopd "^1.0.1" - has-property-descriptors "^1.0.0" - hasown "^2.0.0" - isarray "^2.0.5" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@2.1.3, ms@^2.1.1, ms@^2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -multibase@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.7.0.tgz#1adfc1c50abe05eefeb5091ac0c2728d6b84581b" - integrity sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg== - dependencies: - base-x "^3.0.8" - buffer "^5.5.0" - -multibase@~0.6.0: - version "0.6.1" - resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.6.1.tgz#b76df6298536cc17b9f6a6db53ec88f85f8cc12b" - integrity sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw== - dependencies: - base-x "^3.0.8" - buffer "^5.5.0" - -multicodec@^0.5.5: - version "0.5.7" - resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-0.5.7.tgz#1fb3f9dd866a10a55d226e194abba2dcc1ee9ffd" - integrity sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA== - dependencies: - varint "^5.0.0" - -multicodec@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-1.0.4.tgz#46ac064657c40380c28367c90304d8ed175a714f" - integrity sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg== - dependencies: - buffer "^5.6.0" - varint "^5.0.0" - -multihashes@^0.4.15, multihashes@~0.4.15: - version "0.4.21" - resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-0.4.21.tgz#dc02d525579f334a7909ade8a122dabb58ccfcb5" - integrity sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw== - dependencies: - buffer "^5.5.0" - multibase "^0.7.0" - varint "^5.0.0" - -mustache@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.0.0.tgz#7f02465dbb5b435859d154831c032acdfbbefb31" - integrity sha512-FJgjyX/IVkbXBXYUwH+OYwQKqWpFPLaLVESd70yHjSDunwzV2hZOoTBvPf4KLoxesUzzyfTH6F784Uqd7Wm5yA== - -mustache@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.2.0.tgz#e5892324d60a12ec9c2a73359edca52972bf6f64" - integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ== - -mute-stream@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - integrity sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ== - -mute-stream@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== - -nan@^2.12.1, nan@^2.14.0: - version "2.20.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.20.0.tgz#08c5ea813dd54ed16e5bd6505bf42af4f7838ca3" - integrity sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw== - -nano-base32@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/nano-base32/-/nano-base32-1.0.1.tgz#ba548c879efcfb90da1c4d9e097db4a46c9255ef" - integrity sha512-sxEtoTqAPdjWVGv71Q17koMFGsOMSiHsIFEvzOM7cNp8BXB4AnEwmDabm5dorusJf/v1z7QxaZYxUorU9RKaAw== - -nano-json-stream-parser@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz#0cc8f6d0e2b622b479c40d499c46d64b755c6f5f" - integrity sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew== - -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -near-abi@0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/near-abi/-/near-abi-0.1.1.tgz#b7ead408ca4ad11de4fe3e595d30a7a8bc5307e0" - integrity sha512-RVDI8O+KVxRpC3KycJ1bpfVj9Zv+xvq9PlW1yIFl46GhrnLw83/72HqHGjGDjQ8DtltkcpSjY9X3YIGZ+1QyzQ== - dependencies: - "@types/json-schema" "^7.0.11" - -near-api-js@^0.26.0: - version "0.26.0" - resolved "https://registry.yarnpkg.com/near-api-js/-/near-api-js-0.26.0.tgz#1d13571e0ec107aaf61b908466c38110ba5bf97b" - integrity sha512-aeRU2oWo6qKJF2oM7IcZ10vEqohxk6palTTx7LBUBsaKjF8561gBNIPhnkndhSrpsVSA9NBibX80WfOmK1tqrw== - dependencies: - "@types/bn.js" "^4.11.5" - bn.js "^5.0.0" - bs58 "^4.0.0" - depd "^2.0.0" - error-polyfill "^0.1.2" - http-errors "^1.7.2" - js-sha256 "^0.9.0" - mustache "^4.0.0" - node-fetch "^2.3.0" - text-encoding-utf-8 "^1.0.2" - tweetnacl "^1.0.1" - -near-api-js@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/near-api-js/-/near-api-js-5.0.0.tgz#1eb9c6f3611870e64fa63c65f45253e3350b81d0" - integrity sha512-JQBWG2TGSNx4EJKFtsz2lhadFYtZofyJjwigIqlKjBXQluG5DepM5ZdPJSTZ3R526OoqOcGq7MeZMYlW+hn2nw== - dependencies: - "@near-js/accounts" "1.3.0" - "@near-js/crypto" "1.4.0" - "@near-js/keystores" "0.2.0" - "@near-js/keystores-browser" "0.2.0" - "@near-js/keystores-node" "0.1.0" - "@near-js/providers" "1.0.0" - "@near-js/signers" "0.2.0" - "@near-js/transactions" "1.3.0" - "@near-js/types" "0.3.0" - "@near-js/utils" "1.0.0" - "@near-js/wallet-account" "1.3.0" - "@noble/curves" "1.2.0" - borsh "1.0.0" - depd "2.0.0" - http-errors "1.7.2" - near-abi "0.1.1" - node-fetch "2.6.7" - -negotiator@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - -neo-async@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - -next-tick@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" - integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - -no-case@^2.2.0, no-case@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" - integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ== - dependencies: - lower-case "^1.1.1" - -no-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" - integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== - dependencies: - lower-case "^2.0.2" - tslib "^2.0.3" - -node-addon-api@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" - integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== - -node-addon-api@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.1.0.tgz#49da1ca055e109a23d537e9de43c09cca21eb762" - integrity sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA== - -node-emoji@^1.10.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c" - integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A== - dependencies: - lodash "^4.17.21" - -node-fetch@2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" - integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== - -node-fetch@2.6.7: - version "2.6.7" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" - integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== - dependencies: - whatwg-url "^5.0.0" - -node-fetch@^2.3.0, node-fetch@^2.6.1, node-fetch@^2.6.12, node-fetch@^2.6.7: - version "2.7.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" - integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== - dependencies: - whatwg-url "^5.0.0" - -node-fetch@~1.7.1: - version "1.7.3" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" - integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== - dependencies: - encoding "^0.1.11" - is-stream "^1.0.1" - -node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: - version "4.8.2" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.2.tgz#4f802b71c1ab2ca16af830e6c1ea7dd1ad9496fa" - integrity sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw== - -nofilter@^1.0.3, nofilter@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-1.0.4.tgz#78d6f4b6a613e7ced8b015cec534625f7667006e" - integrity sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA== - -nofilter@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-3.1.0.tgz#c757ba68801d41ff930ba2ec55bab52ca184aa66" - integrity sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g== - -nopt@3.x: - version "3.0.6" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" - integrity sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg== - dependencies: - abbrev "1" - -normalize-package-data@^2.3.2: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-path@^2.0.0, normalize-path@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w== - dependencies: - remove-trailing-separator "^1.0.1" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -normalize-url@^4.1.0: - version "4.5.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" - integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== - -normalize-url@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" - integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== - -npm-programmatic@0.0.12: - version "0.0.12" - resolved "https://registry.yarnpkg.com/npm-programmatic/-/npm-programmatic-0.0.12.tgz#566ba2452c886c7fd3a41586bd559cdc872fa77e" - integrity sha512-fvZdiJS038ZH31z59cEiIywOcgX1u23aLc0wAKF4btyhbYQxE93wTQjzs/URERK+GhS/QghDILQmEvgxu77/zQ== - dependencies: - bluebird "^3.4.1" - -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== - dependencies: - path-key "^2.0.0" - -nth-check@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" - integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== - dependencies: - boolbase "^1.0.0" - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== - -number-to-bn@1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0" - integrity sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig== - dependencies: - bn.js "4.11.6" - strip-hex-prefix "1.0.0" - -o3@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/o3/-/o3-1.0.3.tgz#192ce877a882dfa6751f0412a865fafb2da1dac0" - integrity sha512-f+4n+vC6s4ysy7YO7O2gslWZBUu8Qj2i2OUJOvjRxQva7jVjYjB29jrr9NCjmxZQR0gzrOcv1RnqoYOeMs5VRQ== - dependencies: - capability "^0.2.5" - -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== - -object-assign@^4, object-assign@^4.0.0, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ== - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-inspect@^1.13.1: - version "1.13.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" - integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== - -object-inspect@~1.12.3: - version "1.12.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" - integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== - -object-is@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.6.tgz#1a6a53aed2dd8f7e6775ff870bea58545956ab07" - integrity sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object-keys@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" - integrity sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw== - -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA== - dependencies: - isobject "^3.0.0" - -object.assign@^4.1.5: - version "4.1.5" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" - integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== - dependencies: - call-bind "^1.0.5" - define-properties "^1.2.1" - has-symbols "^1.0.3" - object-keys "^1.1.1" - -object.fromentries@^2.0.8: - version "2.0.8" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" - integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - -object.getownpropertydescriptors@^2.1.6: - version "2.1.8" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.8.tgz#2f1fe0606ec1a7658154ccd4f728504f69667923" - integrity sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A== - dependencies: - array.prototype.reduce "^1.0.6" - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - gopd "^1.0.1" - safe-array-concat "^1.1.2" - -object.groupby@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" - integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - -object.omit@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" - integrity sha512-UiAM5mhmIuKLsOvrL+B0U2d1hXHF3bFYWIuH1LMpuV2EJEHG1Ntz06PgLEHjm6VFd87NpH8rastvPoyv6UW2fA== - dependencies: - for-own "^0.1.4" - is-extendable "^0.1.1" - -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ== - dependencies: - isobject "^3.0.1" - -object.values@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" - integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -obliterator@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-2.0.4.tgz#fa650e019b2d075d745e44f1effeb13a2adbe816" - integrity sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ== - -oboe@2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.4.tgz#20c88cdb0c15371bb04119257d4fdd34b0aa49f6" - integrity sha512-ymBJ4xSC6GBXLT9Y7lirj+xbqBLa+jADGJldGEYG7u8sZbS9GyG+u1Xk9c5cbriKwSpCg41qUhPjvU5xOpvIyQ== - dependencies: - http-https "^1.0.0" - -oboe@2.1.5: - version "2.1.5" - resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.5.tgz#5554284c543a2266d7a38f17e073821fbde393cd" - integrity sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA== - dependencies: - http-https "^1.0.0" - -on-finished@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== - dependencies: - ee-first "1.1.1" - -once@1.x, once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -onetime@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - integrity sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ== - dependencies: - mimic-fn "^1.0.0" - -onetime@^5.1.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -open@^7.4.2: - version "7.4.2" - resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" - integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== - dependencies: - is-docker "^2.0.0" - is-wsl "^2.1.1" - -optionator@^0.8.1, optionator@^0.8.3: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" - -ordinal@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/ordinal/-/ordinal-1.0.3.tgz#1a3c7726a61728112f50944ad7c35c06ae3a0d4d" - integrity sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ== - -original-require@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/original-require/-/original-require-1.0.1.tgz#0f130471584cd33511c5ec38c8d59213f9ac5e20" - integrity sha512-5vdKMbE58WaE61uVD+PKyh8xdM398UnjPBLotW2sjG5MzHARwta/+NtMBCBA0t2WQblGYBvq5vsiZpWokwno+A== - -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ== - -os-locale@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" - integrity sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g== - dependencies: - lcid "^1.0.0" - -os-locale@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" - integrity sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA== - dependencies: - execa "^0.7.0" - lcid "^1.0.0" - mem "^1.1.0" - -os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== - -p-cancelable@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa" - integrity sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw== - -p-cancelable@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" - integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== - -p-cancelable@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" - integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== - -p-cancelable@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-3.0.0.tgz#63826694b54d61ca1c20ebcb6d3ecf5e14cd8050" - integrity sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw== - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== - -p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== - dependencies: - p-try "^1.0.0" - -p-limit@^2.0.0, p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== - dependencies: - p-limit "^1.1.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-map@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" - integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== - dependencies: - aggregate-error "^3.0.0" - -p-timeout@^1.1.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.1.tgz#5eb3b353b7fce99f101a1038880bb054ebbea386" - integrity sha512-gb0ryzr+K2qFqFv6qi3khoeqMZF/+ajxQipEF6NteZVnvz9tzdsfAVj3lYtn1gAXvH5lfLwfxEII799gt/mRIA== - dependencies: - p-finally "^1.0.0" - -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -param-case@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247" - integrity sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w== - dependencies: - no-case "^2.2.0" - -param-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" - integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== - dependencies: - dot-case "^3.0.4" - tslib "^2.0.3" - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-asn1@^5.0.0, parse-asn1@^5.1.7: - version "5.1.7" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.7.tgz#73cdaaa822125f9647165625eb45f8a051d2df06" - integrity sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg== - dependencies: - asn1.js "^4.10.1" - browserify-aes "^1.2.0" - evp_bytestokey "^1.0.3" - hash-base "~3.0" - pbkdf2 "^3.1.2" - safe-buffer "^5.2.1" - -parse-cache-control@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parse-cache-control/-/parse-cache-control-1.0.1.tgz#8eeab3e54fa56920fe16ba38f77fa21aacc2d74e" - integrity sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg== - -parse-glob@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" - integrity sha512-FC5TeK0AwXzq3tUBFtH74naWkPQCEWs4K+xMxWZBlKDWu0bVHXGZa+KKqxKidd7xwhdZ19ZNuF2uO1M/r196HA== - dependencies: - glob-base "^0.3.0" - is-dotfile "^1.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.0" - -parse-headers@^2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.5.tgz#069793f9356a54008571eb7f9761153e6c770da9" - integrity sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA== - -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - integrity sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ== - dependencies: - error-ex "^1.2.0" - -parse5-htmlparser2-tree-adapter@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz#23c2cc233bcf09bb7beba8b8a69d46b08c62c2f1" - integrity sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g== - dependencies: - domhandler "^5.0.2" - parse5 "^7.0.0" - -parse5-parser-stream@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz#d7c20eadc37968d272e2c02660fff92dd27e60e1" - integrity sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow== - dependencies: - parse5 "^7.0.0" - -parse5@^7.0.0, parse5@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" - integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== - dependencies: - entities "^4.4.0" - -parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -pascal-case@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-2.0.1.tgz#2d578d3455f660da65eca18ef95b4e0de912761e" - integrity sha512-qjS4s8rBOJa2Xm0jmxXiyh1+OFf6ekCWOvUaRgAQSktzlTbMotS0nmG9gyYAybCWBcuP4fsBeRCKNwGBnMe2OQ== - dependencies: - camel-case "^3.0.0" - upper-case-first "^1.1.0" - -pascal-case@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" - integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== - -patch-package@6.2.2: - version "6.2.2" - resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.2.2.tgz#71d170d650c65c26556f0d0fbbb48d92b6cc5f39" - integrity sha512-YqScVYkVcClUY0v8fF0kWOjDYopzIM8e3bj/RU1DPeEF14+dCGm6UeOYm4jvCyxqIEQ5/eJzmbWfDWnUleFNMg== - dependencies: - "@yarnpkg/lockfile" "^1.1.0" - chalk "^2.4.2" - cross-spawn "^6.0.5" - find-yarn-workspace-root "^1.2.1" - fs-extra "^7.0.1" - is-ci "^2.0.0" - klaw-sync "^6.0.0" - minimist "^1.2.0" - rimraf "^2.6.3" - semver "^5.6.0" - slash "^2.0.0" - tmp "^0.0.33" - -patch-package@^6.2.2: - version "6.5.1" - resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.5.1.tgz#3e5d00c16997e6160291fee06a521c42ac99b621" - integrity sha512-I/4Zsalfhc6bphmJTlrLoOcAF87jcxko4q0qsv4bGcurbr8IskEOtdnt9iCmsQVGL1B+iUhSQqweyTLJfCF9rA== - dependencies: - "@yarnpkg/lockfile" "^1.1.0" - chalk "^4.1.2" - cross-spawn "^6.0.5" - find-yarn-workspace-root "^2.0.0" - fs-extra "^9.0.0" - is-ci "^2.0.0" - klaw-sync "^6.0.0" - minimist "^1.2.6" - open "^7.4.2" - rimraf "^2.6.3" - semver "^5.6.0" - slash "^2.0.0" - tmp "^0.0.33" - yaml "^1.10.2" - -path-browserify@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" - integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== - -path-case@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/path-case/-/path-case-2.1.1.tgz#94b8037c372d3fe2906e465bb45e25d226e8eea5" - integrity sha512-Ou0N05MioItesaLr9q8TtHVWmJ6fxWdqKB2RohFmNWVyJ+2zeKIeDNWAN6B/Pe7wpzWChhZX6nONYmOnMeJQ/Q== - dependencies: - no-case "^2.2.0" - -path-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/path-case/-/path-case-3.0.4.tgz#9168645334eb942658375c56f80b4c0cb5f82c6f" - integrity sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg== - dependencies: - dot-case "^3.0.4" - tslib "^2.0.3" - -path-exists@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - integrity sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ== - dependencies: - pinkie-promise "^2.0.0" - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^2.0.0, path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== - -path-parse@^1.0.6, path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== - -path-type@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - integrity sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg== - dependencies: - graceful-fs "^4.1.2" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -pathval@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" - integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== - -pbkdf2@^3.0.17, pbkdf2@^3.0.3, pbkdf2@^3.0.9, pbkdf2@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" - integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== - dependencies: - create-hash "^1.1.2" - create-hmac "^1.1.4" - ripemd160 "^2.0.1" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -pegjs@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/pegjs/-/pegjs-0.10.0.tgz#cf8bafae6eddff4b5a7efb185269eaaf4610ddbd" - integrity sha512-qI5+oFNEGi3L5HAxDwN2LA4Gg7irF70Zs25edhjld9QemOgp0CbvMtbFcMvFtEo1OityPrcCzkQFB8JP/hxgow== - -pend@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" - integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== - -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== - -picocolors@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.0.tgz#5358b76a78cde483ba5cef6a9dc9671440b27d59" - integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pify@^2.0.0, pify@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== - -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== - -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== - -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - integrity sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw== - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg== - -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== - -possible-typed-array-names@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" - integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== - -postinstall-postinstall@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/postinstall-postinstall/-/postinstall-postinstall-2.1.0.tgz#4f7f77441ef539d1512c40bd04c71b06a4704ca3" - integrity sha512-7hQX6ZlZXIoRiWNrbMQaLzUUfH+sSx39u8EJ9HYuDc1kLo9IXKWjM5RSquZN1ad5GnH8CGFM78fsAAQi3OKEEQ== - -precond@0.2: - version "0.2.3" - resolved "https://registry.yarnpkg.com/precond/-/precond-0.2.3.tgz#aa9591bcaa24923f1e0f4849d240f47efc1075ac" - integrity sha512-QCYG84SgGyGzqJ/vlMsxeXd/pgL/I94ixdNFyh1PusWmTCyVfPJjZ1K1jvHtsbfnXQs2TSkEP2fR7QiMZAnKFQ== - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== - -prepend-http@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - integrity sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg== - -prepend-http@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" - integrity sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA== - -preserve@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" - integrity sha512-s/46sYeylUfHNjI+sA/78FAHlmIuKqI9wNnzEOGehAlUUYeObv5C2mOinXBjyUyWmJ2SfcS2/ydApH4hTF4WXQ== - -prettier-plugin-solidity@^1.3.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/prettier-plugin-solidity/-/prettier-plugin-solidity-1.4.1.tgz#8060baf18853a9e34d2e09e47e87b4f19e15afe9" - integrity sha512-Mq8EtfacVZ/0+uDKTtHZGW3Aa7vEbX/BNx63hmVg6YTiTXSiuKP0amj0G6pGwjmLaOfymWh3QgXEZkjQbU8QRg== - dependencies: - "@solidity-parser/parser" "^0.18.0" - semver "^7.5.4" - -prettier@^1.14.2: - version "1.19.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" - integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== - -prettier@^2.1.2: - version "2.8.8" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" - integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== - -prettier@^3.2.5: - version "3.3.3" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.3.tgz#30c54fe0be0d8d12e6ae61dbb10109ea00d53105" - integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew== - -private@^0.1.6, private@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" - integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -process@^0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== - -progress@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - -prom-client@^12.0.0: - version "12.0.0" - resolved "https://registry.yarnpkg.com/prom-client/-/prom-client-12.0.0.tgz#9689379b19bd3f6ab88a9866124db9da3d76c6ed" - integrity sha512-JbzzHnw0VDwCvoqf8y1WDtq4wSBAbthMB1pcVI/0lzdqHGJI3KBJDXle70XK+c7Iv93Gihqo0a5LlOn+g8+DrQ== - dependencies: - tdigest "^0.1.1" - -promise-polyfill@8.1.3: - version "8.1.3" - resolved "https://registry.yarnpkg.com/promise-polyfill/-/promise-polyfill-8.1.3.tgz#8c99b3cf53f3a91c68226ffde7bde81d7f904116" - integrity sha512-MG5r82wBzh7pSKDRa9y+vllNHz3e3d4CNj1PQE4BQYxLme0gKYYBm9YENq+UkEikyZ0XbiGWxYlVw3Rl9O/U8g== - -promise-to-callback@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/promise-to-callback/-/promise-to-callback-1.0.0.tgz#5d2a749010bfb67d963598fcd3960746a68feef7" - integrity sha512-uhMIZmKM5ZteDMfLgJnoSq9GCwsNKrYau73Awf1jIy6/eUcuuZ3P+CD9zUv0kJsIUbU+x6uLNIhXhLHDs1pNPA== - dependencies: - is-fn "^1.0.0" - set-immediate-shim "^1.0.1" - -promise@^8.0.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/promise/-/promise-8.3.0.tgz#8cb333d1edeb61ef23869fbb8a4ea0279ab60e0a" - integrity sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg== - dependencies: - asap "~2.0.6" - -promisfy@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/promisfy/-/promisfy-1.2.0.tgz#d34cfec196bddd6a2cfa0bf64eaca53dbc9250a8" - integrity sha512-9S6NY6pVlmrvQX/KIZn4V8EPcKNAC0l5nEKXTa5K1/uzqnMOn4ivWtQY+IbSE/f9uLUa1T/kbDsASSzi05X3dA== - -proper-lockfile@^4.1.1: - version "4.1.2" - resolved "https://registry.yarnpkg.com/proper-lockfile/-/proper-lockfile-4.1.2.tgz#c8b9de2af6b2f1601067f98e01ac66baa223141f" - integrity sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA== - dependencies: - graceful-fs "^4.2.4" - retry "^0.12.0" - signal-exit "^3.0.2" - -protobufjs@^6.8.6: - version "6.11.4" - resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.4.tgz#29a412c38bf70d89e537b6d02d904a6f448173aa" - integrity sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw== - dependencies: - "@protobufjs/aspromise" "^1.1.2" - "@protobufjs/base64" "^1.1.2" - "@protobufjs/codegen" "^2.0.4" - "@protobufjs/eventemitter" "^1.1.0" - "@protobufjs/fetch" "^1.1.0" - "@protobufjs/float" "^1.0.2" - "@protobufjs/inquire" "^1.1.0" - "@protobufjs/path" "^1.1.2" - "@protobufjs/pool" "^1.1.0" - "@protobufjs/utf8" "^1.1.0" - "@types/long" "^4.0.1" - "@types/node" ">=13.7.0" - long "^4.0.0" - -protobufjs@^7.2.5: - version "7.4.0" - resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.4.0.tgz#7efe324ce9b3b61c82aae5de810d287bc08a248a" - integrity sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw== - dependencies: - "@protobufjs/aspromise" "^1.1.2" - "@protobufjs/base64" "^1.1.2" - "@protobufjs/codegen" "^2.0.4" - "@protobufjs/eventemitter" "^1.1.0" - "@protobufjs/fetch" "^1.1.0" - "@protobufjs/float" "^1.0.2" - "@protobufjs/inquire" "^1.1.0" - "@protobufjs/path" "^1.1.2" - "@protobufjs/pool" "^1.1.0" - "@protobufjs/utf8" "^1.1.0" - "@types/node" ">=13.7.0" - long "^5.0.0" - -proxy-addr@~2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" - -proxy-from-env@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" - integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== - -prr@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== - -pseudomap@^1.0.1, pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== - -psl@^1.1.28: - version "1.9.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" - integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== - -public-encrypt@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" - integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== - dependencies: - bn.js "^4.1.0" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - parse-asn1 "^5.0.0" - randombytes "^2.0.1" - safe-buffer "^5.1.2" - -pull-cat@^1.1.9: - version "1.1.11" - resolved "https://registry.yarnpkg.com/pull-cat/-/pull-cat-1.1.11.tgz#b642dd1255da376a706b6db4fa962f5fdb74c31b" - integrity sha512-i3w+xZ3DCtTVz8S62hBOuNLRHqVDsHMNZmgrZsjPnsxXUgbWtXEee84lo1XswE7W2a3WHyqsNuDJTjVLAQR8xg== - -pull-defer@^0.2.2: - version "0.2.3" - resolved "https://registry.yarnpkg.com/pull-defer/-/pull-defer-0.2.3.tgz#4ee09c6d9e227bede9938db80391c3dac489d113" - integrity sha512-/An3KE7mVjZCqNhZsr22k1Tx8MACnUnHZZNPSJ0S62td8JtYr/AiRG42Vz7Syu31SoTLUzVIe61jtT/pNdjVYA== - -pull-level@^2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pull-level/-/pull-level-2.0.4.tgz#4822e61757c10bdcc7cf4a03af04c92734c9afac" - integrity sha512-fW6pljDeUThpq5KXwKbRG3X7Ogk3vc75d5OQU/TvXXui65ykm+Bn+fiktg+MOx2jJ85cd+sheufPL+rw9QSVZg== - dependencies: - level-post "^1.0.7" - pull-cat "^1.1.9" - pull-live "^1.0.1" - pull-pushable "^2.0.0" - pull-stream "^3.4.0" - pull-window "^2.1.4" - stream-to-pull-stream "^1.7.1" - -pull-live@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/pull-live/-/pull-live-1.0.1.tgz#a4ecee01e330155e9124bbbcf4761f21b38f51f5" - integrity sha512-tkNz1QT5gId8aPhV5+dmwoIiA1nmfDOzJDlOOUpU5DNusj6neNd3EePybJ5+sITr2FwyCs/FVpx74YMCfc8YeA== - dependencies: - pull-cat "^1.1.9" - pull-stream "^3.4.0" - -pull-pushable@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/pull-pushable/-/pull-pushable-2.2.0.tgz#5f2f3aed47ad86919f01b12a2e99d6f1bd776581" - integrity sha512-M7dp95enQ2kaHvfCt2+DJfyzgCSpWVR2h2kWYnVsW6ZpxQBx5wOu0QWOvQPVoPnBLUZYitYP2y7HyHkLQNeGXg== - -pull-stream@^3.2.3, pull-stream@^3.4.0, pull-stream@^3.6.8: - version "3.7.0" - resolved "https://registry.yarnpkg.com/pull-stream/-/pull-stream-3.7.0.tgz#85de0e44ff38a4d2ad08cc43fc458e1922f9bf0b" - integrity sha512-Eco+/R004UaCK2qEDE8vGklcTG2OeZSVm1kTUQNrykEjDwcFXDZhygFDsW49DbXyJMEhHeRL3z5cRVqPAhXlIw== - -pull-window@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/pull-window/-/pull-window-2.1.4.tgz#fc3b86feebd1920c7ae297691e23f705f88552f0" - integrity sha512-cbDzN76BMlcGG46OImrgpkMf/VkCnupj8JhsrpBw3aWBM9ye345aYnqitmZCgauBkc0HbbRRn9hCnsa3k2FNUg== - dependencies: - looper "^2.0.0" - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -punycode@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d" - integrity sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA== - -punycode@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== - -punycode@^2.1.0, punycode@^2.1.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== - -pure-rand@^5.0.1: - version "5.0.5" - resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-5.0.5.tgz#bda2a7f6a1fc0f284d78d78ca5902f26f2ad35cf" - integrity sha512-BwQpbqxSCBJVpamI6ydzcKqyFmnd5msMWUGvzXLm1aXvusbbgkbOto/EUPM00hjveJEaJtdbhUjKSzWRhQVkaw== - -qs@6.11.0: - version "6.11.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" - integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== - dependencies: - side-channel "^1.0.4" - -qs@^6.12.3, qs@^6.4.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" - integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== - dependencies: - side-channel "^1.0.6" - -qs@~6.5.2: - version "6.5.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" - integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== - -query-string@^5.0.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" - integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw== - dependencies: - decode-uri-component "^0.2.0" - object-assign "^4.1.0" - strict-uri-encode "^1.0.0" - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -quick-lru@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" - integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== - -"rainbow-bridge-eth2near-block-relay@https://gitpkg.now.sh/aurora-is-near/rainbow-bridge/eth2near/eth2near-block-relay?327ff937bda3e3a99386fe488994f3c8e35f8aa0": - version "1.0.0" - resolved "https://gitpkg.now.sh/aurora-is-near/rainbow-bridge/eth2near/eth2near-block-relay?327ff937bda3e3a99386fe488994f3c8e35f8aa0#2891527a37e7c2f660a3a286ad8a7fda4d4e71f9" - dependencies: - "@ethereumjs/block" "^3.4.0" - bn.js "^5.1.3" - eth-object "https://github.com/near/eth-object#383b6ea68c7050bea4cab6950c1d5a7fa553e72b" - eth-util-lite near/eth-util-lite#master - got "^11.8.5" - merkle-patricia-tree "^2.1.2" - prom-client "^12.0.0" - promisfy "^1.2.0" - rainbow-bridge-utils "1.0.0" - -"rainbow-bridge-lib@https://gitpkg.now.sh/aurora-is-near/rainbow-bridge/utils?327ff937bda3e3a99386fe488994f3c8e35f8aa0": - version "1.0.0" - resolved "https://gitpkg.now.sh/aurora-is-near/rainbow-bridge/utils?327ff937bda3e3a99386fe488994f3c8e35f8aa0#00e2f147d7658491501017f3b2e5f9babcc66614" - dependencies: - bn.js "^5.1.3" - bs58 "^4.0.1" - bsert "^0.0.10" - change-case "^4.1.1" - configstore "^5.0.1" - eth-object "https://github.com/near/eth-object#383b6ea68c7050bea4cab6950c1d5a7fa553e72b" - eth-util-lite near/eth-util-lite#master - lodash "^4.17.20" - near-api-js "^0.26.0" - web3 "^1.6.0" - -"rainbow-bridge-sol@https://gitpkg.now.sh/aurora-is-near/rainbow-bridge/contracts/eth?327ff937bda3e3a99386fe488994f3c8e35f8aa0": - version "2.0.1" - resolved "https://gitpkg.now.sh/aurora-is-near/rainbow-bridge/contracts/eth?327ff937bda3e3a99386fe488994f3c8e35f8aa0#0db31a6ce300a215c49ef5a95f0d6a8f45abf766" - -rainbow-bridge-utils@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/rainbow-bridge-utils/-/rainbow-bridge-utils-1.0.0.tgz#ea0e14ed51f905412362b0ccf053a3ca87ac5da0" - integrity sha512-psjUrqjAGcktxzm8PcL8eRplRXtu89hA/oOm47iU3L78OBO8wV0nrFmNckk4huq42vjUfwpO8L6urILJSqTKNQ== - dependencies: - bn.js "^5.1.3" - bs58 "^4.0.1" - bsert "^0.0.10" - change-case "^4.1.1" - configstore "^5.0.1" - eth-object near/eth-object#54e03b8aac8208cf724e206d49ffb8bdd30451d7 - eth-util-lite near/eth-util-lite#master - lodash "^4.17.20" - near-api-js "^0.26.0" - web3 "=1.2.6" - -"rainbow-bridge-utils@https://gitpkg.now.sh/aurora-is-near/rainbow-bridge/utils?327ff937bda3e3a99386fe488994f3c8e35f8aa0": - version "1.0.0" - resolved "https://gitpkg.now.sh/aurora-is-near/rainbow-bridge/utils?327ff937bda3e3a99386fe488994f3c8e35f8aa0#00e2f147d7658491501017f3b2e5f9babcc66614" - dependencies: - bn.js "^5.1.3" - bs58 "^4.0.1" - bsert "^0.0.10" - change-case "^4.1.1" - configstore "^5.0.1" - eth-object "https://github.com/near/eth-object#383b6ea68c7050bea4cab6950c1d5a7fa553e72b" - eth-util-lite near/eth-util-lite#master - lodash "^4.17.20" - near-api-js "^0.26.0" - web3 "^1.6.0" - -randomatic@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" - integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw== - dependencies: - is-number "^4.0.0" - kind-of "^6.0.0" - math-random "^1.0.1" - -randombytes@2.1.0, randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.0.6, randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -randomfill@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" - integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== - dependencies: - randombytes "^2.0.5" - safe-buffer "^5.1.0" - -randomhex@0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/randomhex/-/randomhex-0.1.5.tgz#baceef982329091400f2a2912c6cd02f1094f585" - integrity sha512-2+Kkw7UiZGQWOz7rw8hPW44utkBYMEciQfziaZ71RcyDu+refQWzS/0DgfUSa5MwclrOD3sf3vI5vmrTYjwpjQ== - -range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@2.5.2, raw-body@^2.4.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" - integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== - dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" - -read-pkg-up@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" - integrity sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A== - dependencies: - find-up "^1.0.0" - read-pkg "^1.0.0" - -read-pkg@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" - integrity sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ== - dependencies: - load-json-file "^1.0.0" - normalize-package-data "^2.3.2" - path-type "^1.0.0" - -readable-stream@^1.0.33: - version "1.1.14" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" - integrity sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.2.2, readable-stream@^2.2.8, readable-stream@^2.2.9, readable-stream@^2.3.0, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@^2.3.8, readable-stream@~2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" - integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@^3.0.6, readable-stream@^3.1.0, readable-stream@^3.4.0, readable-stream@^3.6.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readable-stream@~1.0.15: - version "1.0.34" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - integrity sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readdirp@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" - integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== - dependencies: - graceful-fs "^4.1.11" - micromatch "^3.1.10" - readable-stream "^2.0.2" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== - dependencies: - resolve "^1.1.6" - -recursive-readdir@^2.2.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.3.tgz#e726f328c0d69153bcabd5c322d3195252379372" - integrity sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA== - dependencies: - minimatch "^3.0.5" - -regenerate@^1.2.1: - version "1.4.2" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" - integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== - -regenerator-runtime@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" - integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== - -regenerator-runtime@^0.14.0: - version "0.14.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" - integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== - -regenerator-transform@^0.10.0: - version "0.10.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" - integrity sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q== - dependencies: - babel-runtime "^6.18.0" - babel-types "^6.19.0" - private "^0.1.6" - -regex-cache@^0.4.2: - version "0.4.4" - resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" - integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== - dependencies: - is-equal-shallow "^0.1.3" - -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -regexp.prototype.flags@^1.5.1, regexp.prototype.flags@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" - integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== - dependencies: - call-bind "^1.0.6" - define-properties "^1.2.1" - es-errors "^1.3.0" - set-function-name "^2.0.1" - -regexpp@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" - integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== - -regexpp@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" - integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== - -regexpu-core@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" - integrity sha512-tJ9+S4oKjxY8IZ9jmjnp/mtytu1u3iyIQAfmI51IKWH6bFf7XR1ybtaO6j7INhZKXOTYADk7V5qxaqLkmNxiZQ== - dependencies: - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" - -regjsgen@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" - integrity sha512-x+Y3yA24uF68m5GA+tBjbGYo64xXVJpbToBaWCoSNSc1hdk6dfctaRWrNFTVJZIIhL5GxW8zwjoixbnifnK59g== - -regjsparser@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" - integrity sha512-jlQ9gYLfk2p3V5Ag5fYhA7fv7OHzd1KUH0PRP46xc3TgwjwgROIW572AfYg/X9kaNq/LJnu6oJcFRXlIrGoTRw== - dependencies: - jsesc "~0.5.0" - -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw== - -repeat-element@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" - integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== - -repeat-string@^1.5.2, repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== - -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - integrity sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A== - dependencies: - is-finite "^1.0.0" - -req-cwd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/req-cwd/-/req-cwd-2.0.0.tgz#d4082b4d44598036640fb73ddea01ed53db49ebc" - integrity sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ== - dependencies: - req-from "^2.0.0" - -req-from@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/req-from/-/req-from-2.0.0.tgz#d74188e47f93796f4aa71df6ee35ae689f3e0e70" - integrity sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA== - dependencies: - resolve-from "^3.0.0" - -request@^2.79.0, request@^2.85.0, request@^2.88.2: - version "2.88.2" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" - integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.5.0" - tunnel-agent "^0.6.0" - uuid "^3.3.2" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -require-from-string@^1.1.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418" - integrity sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q== - -require-from-string@^2.0.0, require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -require-main-filename@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" - integrity sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug== - -resolve-alpn@^1.0.0, resolve-alpn@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" - integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== - -resolve-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - integrity sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw== - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== - -resolve@1.1.x: - version "1.1.7" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" - integrity sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg== - -resolve@1.17.0: - version "1.17.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" - integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== - dependencies: - path-parse "^1.0.6" - -resolve@^1.1.6, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.22.4, resolve@^1.8.1, resolve@~1.22.6: - version "1.22.8" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" - integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -responselike@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" - integrity sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ== - dependencies: - lowercase-keys "^1.0.0" - -responselike@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.1.tgz#9a0bc8fdc252f3fb1cca68b016591059ba1422bc" - integrity sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw== - dependencies: - lowercase-keys "^2.0.0" - -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - integrity sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q== - dependencies: - onetime "^2.0.0" - signal-exit "^3.0.2" - -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== - -retry@0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" - integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== - -retry@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" - integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rimraf@2.6.3: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== - dependencies: - glob "^7.1.3" - -rimraf@^2.2.8, rimraf@^2.6.3: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - -ripemd160-min@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/ripemd160-min/-/ripemd160-min-0.0.6.tgz#a904b77658114474d02503e819dcc55853b67e62" - integrity sha512-+GcJgQivhs6S9qvLogusiTcS9kQUfgR75whKuy5jIhuiOfQuJ8fjqxV6EGD5duH1Y/FawFUMtMhyeq3Fbnib8A== - -ripemd160@^2.0.0, ripemd160@^2.0.1, ripemd160@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" - integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - -rlp@^2.0.0, rlp@^2.2.1, rlp@^2.2.2, rlp@^2.2.3, rlp@^2.2.4: - version "2.2.7" - resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf" - integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== - dependencies: - bn.js "^5.2.0" - -run-async@^2.2.0, run-async@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" - integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -rustbn.js@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca" - integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== - -rxjs@^6.4.0, rxjs@^6.6.0: - version "6.6.7" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" - integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== - dependencies: - tslib "^1.9.0" - -safe-array-concat@^1.0.0, safe-array-concat@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" - integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== - dependencies: - call-bind "^1.0.7" - get-intrinsic "^1.2.4" - has-symbols "^1.0.3" - isarray "^2.0.5" - -safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-event-emitter@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/safe-event-emitter/-/safe-event-emitter-1.0.1.tgz#5b692ef22329ed8f69fdce607e50ca734f6f20af" - integrity sha512-e1wFe99A91XYYxoQbcq2ZJUWurxEyP8vfz7A7vuUe1s95q8r5ebraVaA1BukYJcpM6V16ugWoD9vngi8Ccu5fg== - dependencies: - events "^3.0.0" - -safe-regex-test@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" - integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-regex "^1.1.4" - -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg== - dependencies: - ret "~0.1.10" - -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sc-istanbul@^0.4.5: - version "0.4.6" - resolved "https://registry.yarnpkg.com/sc-istanbul/-/sc-istanbul-0.4.6.tgz#cf6784355ff2076f92d70d59047d71c13703e839" - integrity sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g== - dependencies: - abbrev "1.0.x" - async "1.x" - escodegen "1.8.x" - esprima "2.7.x" - glob "^5.0.15" - handlebars "^4.0.1" - js-yaml "3.x" - mkdirp "0.5.x" - nopt "3.x" - once "1.x" - resolve "1.1.x" - supports-color "^3.1.0" - which "^1.1.1" - wordwrap "^1.0.0" - -scrypt-js@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-2.0.3.tgz#bb0040be03043da9a012a2cea9fc9f852cfc87d4" - integrity sha512-d8DzQxNivoNDogyYmb/9RD5mEQE/Q7vG2dLDUgvfPmKL9xCVzgqUntOdS0me9Cq9Sh9VxIZuoNEFcsfyXRnyUw== - -scrypt-js@2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-2.0.4.tgz#32f8c5149f0797672e551c07e230f834b6af5f16" - integrity sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw== - -scrypt-js@3.0.1, scrypt-js@^3.0.0, scrypt-js@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" - integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== - -"scrypt-shim@github:web3-js/scrypt-shim": - version "0.1.0" - resolved "https://codeload.github.com/web3-js/scrypt-shim/tar.gz/aafdadda13e660e25e1c525d1f5b2443f5eb1ebb" - dependencies: - scryptsy "^2.1.0" - semver "^6.3.0" - -scryptsy@2.1.0, scryptsy@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/scryptsy/-/scryptsy-2.1.0.tgz#8d1e8d0c025b58fdd25b6fa9a0dc905ee8faa790" - integrity sha512-1CdSqHQowJBnMAFyPEBRfqag/YP9OF394FV+4YREIJX4ljD7OxvQRDayyoyyCk+senRjSkP6VnUNQmVQqB6g7w== - -scryptsy@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/scryptsy/-/scryptsy-1.2.1.tgz#a3225fa4b2524f802700761e2855bdf3b2d92163" - integrity sha512-aldIRgMozSJ/Gl6K6qmJZysRP82lz83Wb42vl4PWN8SaLFHIaOzLPc9nUUW2jQN88CuGm5q5HefJ9jZ3nWSmTw== - dependencies: - pbkdf2 "^3.0.3" - -secp256k1@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-5.0.0.tgz#be6f0c8c7722e2481e9773336d351de8cddd12f7" - integrity sha512-TKWX8xvoGHrxVdqbYeZM9w+izTF4b9z3NhSaDkdn81btvuh+ivbIMGT/zQvDtTFWhRlThpoz6LEYTr7n8A5GcA== - dependencies: - elliptic "^6.5.4" - node-addon-api "^5.0.0" - node-gyp-build "^4.2.0" - -secp256k1@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" - integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== - dependencies: - elliptic "^6.5.4" - node-addon-api "^2.0.0" - node-gyp-build "^4.2.0" - -seedrandom@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.1.tgz#eb3dde015bcf55df05a233514e5df44ef9dce083" - integrity sha512-1/02Y/rUeU1CJBAGLebiC5Lbo5FnB22gQbIFFYTLkwvp1xdABZJH1sn4ZT1MzXmPpzv+Rf/Lu2NcsLJiK4rcDg== - -seek-bzip@^1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.6.tgz#35c4171f55a680916b52a07859ecf3b5857f21c4" - integrity sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ== - dependencies: - commander "^2.8.1" - -semaphore-async-await@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz#857bef5e3644601ca4b9570b87e9df5ca12974fa" - integrity sha512-b/ptP11hETwYWpeilHXXQiV5UJNJl7ZWWooKRE5eBIYWoom6dZ0SluCIdCtKycsMtZgKWE01/qAw6jblw1YVhg== - -semaphore@>=1.0.1, semaphore@^1.0.3, semaphore@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/semaphore/-/semaphore-1.1.0.tgz#aaad8b86b20fe8e9b32b16dc2ee682a8cd26a8aa" - integrity sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA== - -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: - version "5.7.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" - integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== - -semver@6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.2.0.tgz#4d813d9590aaf8a9192693d6c85b9344de5901db" - integrity sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A== - -semver@^6.0.0, semver@^6.1.0, semver@^6.1.2, semver@^6.3.0, semver@^6.3.1: - version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^7.3.4, semver@^7.5.4: - version "7.6.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" - integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== - -semver@~5.4.1: - version "5.4.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" - integrity sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg== - -send@0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" - integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== - dependencies: - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "2.0.0" - mime "1.6.0" - ms "2.1.3" - on-finished "2.4.1" - range-parser "~1.2.1" - statuses "2.0.1" - -sentence-case@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/sentence-case/-/sentence-case-2.1.1.tgz#1f6e2dda39c168bf92d13f86d4a918933f667ed4" - integrity sha512-ENl7cYHaK/Ktwk5OTD+aDbQ3uC8IByu/6Bkg+HDv8Mm+XnBnppVNalcfJTNsp1ibstKh030/JKQQWglDvtKwEQ== - dependencies: - no-case "^2.2.0" - upper-case-first "^1.1.2" - -sentence-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/sentence-case/-/sentence-case-3.0.4.tgz#3645a7b8c117c787fde8702056225bb62a45131f" - integrity sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - upper-case-first "^2.0.2" - -serialize-javascript@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" - integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== - dependencies: - randombytes "^2.1.0" - -serve-static@1.15.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" - integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.18.0" - -servify@^0.1.12: - version "0.1.12" - resolved "https://registry.yarnpkg.com/servify/-/servify-0.1.12.tgz#142ab7bee1f1d033b66d0707086085b17c06db95" - integrity sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw== - dependencies: - body-parser "^1.16.0" - cors "^2.8.1" - express "^4.14.0" - request "^2.79.0" - xhr "^2.3.3" - -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== - -set-function-length@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" - integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - -set-function-name@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" - integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - functions-have-names "^1.2.3" - has-property-descriptors "^1.0.2" - -set-immediate-shim@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" - integrity sha512-Li5AOqrZWCVA2n5kryzEmqai6bKSIvpz5oUJHPVj6+dsbD3X1ixtsY5tEnsaNpH3pFAHmG8eIHUrtEtohrg+UQ== - -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - -setimmediate@1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.4.tgz#20e81de622d4a02588ce0c8da8973cbcf1d3138f" - integrity sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog== - -setimmediate@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== - -setprototypeof@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" - integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== - -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - -sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -sha1@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/sha1/-/sha1-1.1.1.tgz#addaa7a93168f393f19eb2b15091618e2700f848" - integrity sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA== - dependencies: - charenc ">= 0.0.1" - crypt ">= 0.0.1" - -sha3@^2.1.1: - version "2.1.4" - resolved "https://registry.yarnpkg.com/sha3/-/sha3-2.1.4.tgz#000fac0fe7c2feac1f48a25e7a31b52a6492cc8f" - integrity sha512-S8cNxbyb0UGUM2VhRD4Poe5N58gJnJsLJ5vC7FYWGUmGhcsj4++WaIOBFVDxlG0W3To6xBuiRh+i0Qp2oNCOtg== - dependencies: - buffer "6.0.3" - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== - dependencies: - shebang-regex "^1.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== - -shelljs@^0.8.3: - version "0.8.5" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" - integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== - dependencies: - glob "^7.0.0" - interpret "^1.0.0" - rechoir "^0.6.2" - -side-channel@^1.0.4, side-channel@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" - integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - object-inspect "^1.13.1" - -signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -simple-concat@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" - integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== - -simple-get@^2.7.0: - version "2.8.2" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.2.tgz#5708fb0919d440657326cd5fe7d2599d07705019" - integrity sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw== - dependencies: - decompress-response "^3.3.0" - once "^1.3.1" - simple-concat "^1.0.0" - -simple-git@^1.110.0: - version "1.132.0" - resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-1.132.0.tgz#53ac4c5ec9e74e37c2fd461e23309f22fcdf09b1" - integrity sha512-xauHm1YqCTom1sC9eOjfq3/9RKiUA9iPnxBbrY2DdL8l4ADMu0jjM5l5lphQP5YWNqAL2aXC/OeuQ76vHtW5fg== - dependencies: - debug "^4.0.1" - -slash@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - integrity sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg== - -slash@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" - integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -slice-ansi@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" - integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== - dependencies: - ansi-styles "^3.2.0" - astral-regex "^1.0.0" - is-fullwidth-code-point "^2.0.0" - -slice-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" - integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -snake-case@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-2.1.0.tgz#41bdb1b73f30ec66a04d4e2cad1b76387d4d6d9f" - integrity sha512-FMR5YoPFwOLuh4rRz92dywJjyKYZNLpMn1R5ujVpIYkbA9p01fq8RMg0FkO4M+Yobt4MjHeLTJVm5xFFBHSV2Q== - dependencies: - no-case "^2.2.0" - -snake-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" - integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== - dependencies: - dot-case "^3.0.4" - tslib "^2.0.3" - -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -sol-digger@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/sol-digger/-/sol-digger-0.0.2.tgz#406c4a9d31e269e7f88eb1c2ea101318e5e09025" - integrity sha512-oqrw1E/X2WWYUYCzKDM5INDDH2nWOWos4p2Cw2OF52qoZcTDzlKMJQ5pJFXKOCADCg6KggBO5WYE/vNb+kJ0Hg== - -sol-explore@1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/sol-explore/-/sol-explore-1.6.1.tgz#b59f073c69fe332560d5a10c32ba8ca7f2986cfb" - integrity sha512-cmwg7l+QLj2LE3Qvwrdo4aPYcNYY425+bN5VPkgCjkO0CiSz33G5vM5BmMZNrfd/6yNGwcm0KtwDJmh5lUElEQ== - -solc-wrapper@^0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/solc-wrapper/-/solc-wrapper-0.6.3.tgz#3230f9665bf8dce9fbe5a1517bd81b96c605e3a3" - integrity sha512-FWBnuQfU537SVSsBxuE4XkOKcK88a/bpLMVde2gc3BZcj0VmPc38wYO0Hkqqxsek7ZLK2lmXuEDLmgXhXl8Kyw== - dependencies: - command-exists "^1.2.8" - fs-extra "^0.30.0" - js-sha3 "0.8.0" - memorystream "^0.3.1" - require-from-string "^2.0.0" - semver "^5.5.0" - tmp "0.0.33" - -solc@0.8.26: - version "0.8.26" - resolved "https://registry.yarnpkg.com/solc/-/solc-0.8.26.tgz#afc78078953f6ab3e727c338a2fefcd80dd5b01a" - integrity sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g== - dependencies: - command-exists "^1.2.8" - commander "^8.1.0" - follow-redirects "^1.12.1" - js-sha3 "0.8.0" - memorystream "^0.3.1" - semver "^5.5.0" - tmp "0.0.33" - -solc@^0.4.20: - version "0.4.26" - resolved "https://registry.yarnpkg.com/solc/-/solc-0.4.26.tgz#5390a62a99f40806b86258c737c1cf653cc35cb5" - integrity sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA== - dependencies: - fs-extra "^0.30.0" - memorystream "^0.3.1" - require-from-string "^1.1.0" - semver "^5.3.0" - yargs "^4.7.1" - -solc@^0.6, solc@^0.6.3: - version "0.6.12" - resolved "https://registry.yarnpkg.com/solc/-/solc-0.6.12.tgz#48ac854e0c729361b22a7483645077f58cba080e" - integrity sha512-Lm0Ql2G9Qc7yPP2Ba+WNmzw2jwsrd3u4PobHYlSOxaut3TtUbj9+5ZrT6f4DUpNPEoBaFUOEg9Op9C0mk7ge9g== - dependencies: - command-exists "^1.2.8" - commander "3.0.2" - fs-extra "^0.30.0" - js-sha3 "0.8.0" - memorystream "^0.3.1" - require-from-string "^2.0.0" - semver "^5.5.0" - tmp "0.0.33" - -solidity-ast@^0.4.51: - version "0.4.58" - resolved "https://registry.yarnpkg.com/solidity-ast/-/solidity-ast-0.4.58.tgz#60cc88c21740a9ccb8fb117d6a92eff3e65a2f5e" - integrity sha512-fiAEDlMEc+xziMn0IpZf2vUbqxyXYZK4BqBiTaz2ZUqOP0p1fdJzUc9xpv74Jdxb5BLAiCUFv5UenkXIpHn3cA== - -solidity-coverage@^0.8.12: - version "0.8.13" - resolved "https://registry.yarnpkg.com/solidity-coverage/-/solidity-coverage-0.8.13.tgz#8eeada2e82ae19d25568368aa782a2baad0e0ce7" - integrity sha512-RiBoI+kF94V3Rv0+iwOj3HQVSqNzA9qm/qDP1ZDXK5IX0Cvho1qiz8hAXTsAo6KOIUeP73jfscq0KlLqVxzGWA== - dependencies: - "@ethersproject/abi" "^5.0.9" - "@solidity-parser/parser" "^0.18.0" - chalk "^2.4.2" - death "^1.1.0" - difflib "^0.2.4" - fs-extra "^8.1.0" - ghost-testrpc "^0.0.2" - global-modules "^2.0.0" - globby "^10.0.1" - jsonschema "^1.2.4" - lodash "^4.17.21" - mocha "^10.2.0" - node-emoji "^1.10.0" - pify "^4.0.1" - recursive-readdir "^2.2.2" - sc-istanbul "^0.4.5" - semver "^7.3.4" - shelljs "^0.8.3" - web3-utils "^1.3.6" - -solium-plugin-security@0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/solium-plugin-security/-/solium-plugin-security-0.1.1.tgz#2a87bcf8f8c3abf7d198e292e4ac080284e3f3f6" - integrity sha512-kpLirBwIq4mhxk0Y/nn5cQ6qdJTI+U1LO3gpoNIcqNaW+sI058moXBe2UiHs+9wvF9IzYD49jcKhFTxcR9u9SQ== - -solium@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/solium/-/solium-1.2.5.tgz#d036c30e2901e22137bbf342f106b17529ff22a8" - integrity sha512-NuNrm7fp8JcDN/P+SAdM5TVa4wYDtwVtLY/rG4eBOZrC5qItsUhmQKR/YhjszaEW4c8tNUYhkhQcwOsS25znpw== - dependencies: - ajv "^5.2.2" - chokidar "^1.6.0" - colors "^1.1.2" - commander "^2.9.0" - diff "^3.5.0" - eol "^0.9.1" - js-string-escape "^1.0.1" - lodash "^4.14.2" - sol-digger "0.0.2" - sol-explore "1.6.1" - solium-plugin-security "0.1.1" - solparse "2.2.8" - text-table "^0.2.0" - -solparse@2.2.8: - version "2.2.8" - resolved "https://registry.yarnpkg.com/solparse/-/solparse-2.2.8.tgz#d13e42dbed95ce32f43894f5ec53f00d14cf9f11" - integrity sha512-Tm6hdfG72DOxD40SD+T5ddbekWglNWjzDRSNq7ZDIOHVsyaJSeeunUuWNj4DE7uDrJK3tGQuX0ZTDZWNYsGPMA== - dependencies: - mocha "^4.0.1" - pegjs "^0.10.0" - yargs "^10.0.3" - -source-map-resolve@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" - integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== - dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - -source-map-support@0.5.12: - version "0.5.12" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.12.tgz#b4f3b10d51857a5af0138d3ce8003b201613d599" - integrity sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-support@^0.4.15: - version "0.4.18" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" - integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== - dependencies: - source-map "^0.5.6" - -source-map-support@^0.5.13: - version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-url@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" - integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== - -source-map@^0.5.6, source-map@^0.5.7: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== - -source-map@^0.6.0, source-map@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -source-map@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" - integrity sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA== - dependencies: - amdefine ">=0.0.4" - -spdx-correct@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" - integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz#5d607d27fc806f66d7b64a766650fa890f04ed66" - integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.20" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz#e44ed19ed318dd1e5888f93325cee800f0f51b89" - integrity sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw== - -spinnies@^0.3.0: - version "0.3.2" - resolved "https://registry.yarnpkg.com/spinnies/-/spinnies-0.3.2.tgz#693d85cdaa095e253b13a8dc0dc8808cef23d678" - integrity sha512-WOvGI8X3h2XbAu/VBzIG99qJTeWCZ5RjyZtuLc4Q6qwAIv1/OPA2aL9j5wYEhwNsWLbBDHH5bLk/bOJTpexljw== - dependencies: - chalk "^2.4.2" - cli-cursor "^3.0.0" - -spinnies@^0.4.2: - version "0.4.3" - resolved "https://registry.yarnpkg.com/spinnies/-/spinnies-0.4.3.tgz#2ea0ad148e78353ddf621dec3951a6f4c3cbf66e" - integrity sha512-TTA2vWXrXJpfThWAl2t2hchBnCMI1JM5Wmb2uyI7Zkefdw/xO98LDy6/SBYwQPiYXL3swx3Eb44ZxgoS8X5wpA== - dependencies: - chalk "^2.4.2" - cli-cursor "^3.0.0" - strip-ansi "^5.2.0" - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -sshpk@^1.7.0: - version "1.18.0" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.18.0.tgz#1663e55cddf4d688b86a46b77f0d5fe363aba028" - integrity sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ== - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" - dashdash "^1.12.0" - ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" - tweetnacl "~0.14.0" - -stacktrace-parser@^0.1.10: - version "0.1.10" - resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" - integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== - dependencies: - type-fest "^0.7.1" - -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g== - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - -"statuses@>= 1.5.0 < 2": - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== - -stream-to-pull-stream@^1.7.1: - version "1.7.3" - resolved "https://registry.yarnpkg.com/stream-to-pull-stream/-/stream-to-pull-stream-1.7.3.tgz#4161aa2d2eb9964de60bfa1af7feaf917e874ece" - integrity sha512-6sNyqJpr5dIOQdgNy/xcDWwDuzAsAwVzhzrWlAPAQ7Lkjx/rv0wgvxEyKwTq6FmNd5rjTrELt/CLmaSw7crMGg== - dependencies: - looper "^3.0.0" - pull-stream "^3.2.3" - -strict-uri-encode@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" - integrity sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ== - -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw== - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string-width@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - -string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string.prototype.trim@^1.2.9, string.prototype.trim@~1.2.8: - version "1.2.9" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" - integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.0" - es-object-atoms "^1.0.0" - -string.prototype.trimend@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" - integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -string.prototype.trimstart@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" - integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ== - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow== - dependencies: - ansi-regex "^3.0.0" - -strip-ansi@^5.1.0, strip-ansi@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - dependencies: - ansi-regex "^4.1.0" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-bom@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - integrity sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g== - dependencies: - is-utf8 "^0.2.0" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - -strip-dirs@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/strip-dirs/-/strip-dirs-2.1.0.tgz#4987736264fc344cf20f6c34aca9d13d1d4ed6c5" - integrity sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g== - dependencies: - is-natural-number "^4.0.1" - -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== - -strip-hex-prefix@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f" - integrity sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A== - dependencies: - is-hex-prefixed "1.0.0" - -strip-indent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" - integrity sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA== - -strip-json-comments@^3.0.1, strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -supports-color@4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.4.0.tgz#883f7ddabc165142b2a61427f3352ded195d1a3e" - integrity sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ== - dependencies: - has-flag "^2.0.0" - -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - integrity sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g== - -supports-color@^3.1.0: - version "3.2.3" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" - integrity sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A== - dependencies: - has-flag "^1.0.0" - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -swap-case@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/swap-case/-/swap-case-1.1.2.tgz#c39203a4587385fad3c850a0bd1bcafa081974e3" - integrity sha512-BAmWG6/bx8syfc6qXPprof3Mn5vQgf5dwdUNJhsNqU9WdPt5P+ES/wQ5bxfijy8zwZgZZHslC3iAsxsuQMCzJQ== - dependencies: - lower-case "^1.1.1" - upper-case "^1.1.1" - -swarm-js@0.1.39: - version "0.1.39" - resolved "https://registry.yarnpkg.com/swarm-js/-/swarm-js-0.1.39.tgz#79becb07f291d4b2a178c50fee7aa6e10342c0e8" - integrity sha512-QLMqL2rzF6n5s50BptyD6Oi0R1aWlJC5Y17SRIVXRj6OR1DRIPM7nepvrxxkjA1zNzFz6mUOMjfeqeDaWB7OOg== - dependencies: - bluebird "^3.5.0" - buffer "^5.0.5" - decompress "^4.0.0" - eth-lib "^0.1.26" - fs-extra "^4.0.2" - got "^7.1.0" - mime-types "^2.1.16" - mkdirp-promise "^5.0.1" - mock-fs "^4.1.0" - setimmediate "^1.0.5" - tar "^4.0.2" - xhr-request-promise "^0.1.2" - -swarm-js@^0.1.40: - version "0.1.42" - resolved "https://registry.yarnpkg.com/swarm-js/-/swarm-js-0.1.42.tgz#497995c62df6696f6e22372f457120e43e727979" - integrity sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ== - dependencies: - bluebird "^3.5.0" - buffer "^5.0.5" - eth-lib "^0.1.26" - fs-extra "^4.0.2" - got "^11.8.5" - mime-types "^2.1.16" - mkdirp-promise "^5.0.1" - mock-fs "^4.1.0" - setimmediate "^1.0.5" - tar "^4.0.2" - xhr-request "^1.0.1" - -sync-request@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/sync-request/-/sync-request-6.1.0.tgz#e96217565b5e50bbffe179868ba75532fb597e68" - integrity sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw== - dependencies: - http-response-object "^3.0.1" - sync-rpc "^1.2.1" - then-request "^6.0.0" - -sync-rpc@^1.2.1: - version "1.3.6" - resolved "https://registry.yarnpkg.com/sync-rpc/-/sync-rpc-1.3.6.tgz#b2e8b2550a12ccbc71df8644810529deb68665a7" - integrity sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw== - dependencies: - get-port "^3.1.0" - -table@^5.2.3: - version "5.4.6" - resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" - integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== - dependencies: - ajv "^6.10.2" - lodash "^4.17.14" - slice-ansi "^2.1.0" - string-width "^3.0.0" - -table@^6.8.0: - version "6.8.2" - resolved "https://registry.yarnpkg.com/table/-/table-6.8.2.tgz#c5504ccf201213fa227248bdc8c5569716ac6c58" - integrity sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA== - dependencies: - ajv "^8.0.1" - lodash.truncate "^4.4.2" - slice-ansi "^4.0.0" - string-width "^4.2.3" - strip-ansi "^6.0.1" - -tape@^4.6.3: - version "4.17.0" - resolved "https://registry.yarnpkg.com/tape/-/tape-4.17.0.tgz#de89f3671ddc5dad178d04c28dc6b0183f42268e" - integrity sha512-KCuXjYxCZ3ru40dmND+oCLsXyuA8hoseu2SS404Px5ouyS0A99v8X/mdiLqsR5MTAyamMBN7PRwt2Dv3+xGIxw== - dependencies: - "@ljharb/resumer" "~0.0.1" - "@ljharb/through" "~2.3.9" - call-bind "~1.0.2" - deep-equal "~1.1.1" - defined "~1.0.1" - dotignore "~0.1.2" - for-each "~0.3.3" - glob "~7.2.3" - has "~1.0.3" - inherits "~2.0.4" - is-regex "~1.1.4" - minimist "~1.2.8" - mock-property "~1.0.0" - object-inspect "~1.12.3" - resolve "~1.22.6" - string.prototype.trim "~1.2.8" - -tar-stream@^1.5.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555" - integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A== - dependencies: - bl "^1.0.0" - buffer-alloc "^1.2.0" - end-of-stream "^1.0.0" - fs-constants "^1.0.0" - readable-stream "^2.3.0" - to-buffer "^1.1.1" - xtend "^4.0.0" - -tar@^4.0.2: - version "4.4.19" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3" - integrity sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA== - dependencies: - chownr "^1.1.4" - fs-minipass "^1.2.7" - minipass "^2.9.0" - minizlib "^1.3.3" - mkdirp "^0.5.5" - safe-buffer "^5.2.1" - yallist "^3.1.1" - -tdigest@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/tdigest/-/tdigest-0.1.2.tgz#96c64bac4ff10746b910b0e23b515794e12faced" - integrity sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA== - dependencies: - bintrees "1.0.2" - -test-value@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/test-value/-/test-value-2.1.0.tgz#11da6ff670f3471a73b625ca4f3fdcf7bb748291" - integrity sha512-+1epbAxtKeXttkGFMTX9H42oqzOTufR1ceCF+GYA5aOmvaPq9wd4PUS8329fn2RRLGNeUkgRLnVpycjx8DsO2w== - dependencies: - array-back "^1.0.3" - typical "^2.6.0" - -testrpc@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/testrpc/-/testrpc-0.0.1.tgz#83e2195b1f5873aec7be1af8cbe6dcf39edb7aed" - integrity sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA== - -text-encoding-utf-8@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz#585b62197b0ae437e3c7b5d0af27ac1021e10d13" - integrity sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg== - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -then-request@^6.0.0: - version "6.0.2" - resolved "https://registry.yarnpkg.com/then-request/-/then-request-6.0.2.tgz#ec18dd8b5ca43aaee5cb92f7e4c1630e950d4f0c" - integrity sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA== - dependencies: - "@types/concat-stream" "^1.6.0" - "@types/form-data" "0.0.33" - "@types/node" "^8.0.0" - "@types/qs" "^6.2.31" - caseless "~0.12.0" - concat-stream "^1.6.0" - form-data "^2.2.0" - http-basic "^8.1.1" - http-response-object "^3.0.1" - promise "^8.0.0" - qs "^6.4.0" - -through2@^2.0.3: - version "2.0.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" - integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== - dependencies: - readable-stream "~2.3.6" - xtend "~4.0.1" - -through@^2.3.6, through@^2.3.8: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== - -timed-out@^4.0.0, timed-out@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" - integrity sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA== - -title-case@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/title-case/-/title-case-2.1.1.tgz#3e127216da58d2bc5becf137ab91dae3a7cd8faa" - integrity sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q== - dependencies: - no-case "^2.2.0" - upper-case "^1.0.3" - -tmp@0.0.33, tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - -tmp@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.1.0.tgz#ee434a4e22543082e294ba6201dcc6eafefa2877" - integrity sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw== - dependencies: - rimraf "^2.6.3" - -to-buffer@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80" - integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg== - -to-fast-properties@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" - integrity sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og== - -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg== - dependencies: - kind-of "^3.0.2" - -to-readable-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" - integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg== - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - -toidentifier@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" - integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== - -toidentifier@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== - -toposort@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/toposort/-/toposort-2.0.2.tgz#ae21768175d1559d48bef35420b2f4962f09c330" - integrity sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg== - -tough-cookie@~2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== - dependencies: - psl "^1.1.28" - punycode "^2.1.1" - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -trim-right@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" - integrity sha512-WZGXGstmCWgeevgTL54hrCuw1dyMQIzWy7ZfqRJfSmJZBwklI15egmQytFP6bPidmw3M8d5yEowl1niq4vmqZw== - -truffle-config@1.1.16: - version "1.1.16" - resolved "https://registry.yarnpkg.com/truffle-config/-/truffle-config-1.1.16.tgz#366ec223165953c77852437e00f01ed8921a77a2" - integrity sha512-of9wKDjXAKIA4kpdQbxnSxRl4EOPi6ipkoOn01J3yC1UJ942jeyLm7hUrTRdxcL8Nz3G47xO+xTMX5T7UYbdTA== - dependencies: - configstore "^4.0.0" - find-up "^2.1.0" - lodash "^4.17.13" - original-require "1.0.1" - truffle-error "^0.0.5" - truffle-provider "^0.1.12" - -truffle-error@^0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/truffle-error/-/truffle-error-0.0.5.tgz#6b5740c9f3aac74f47b85d654fff7fe2c1fc5e0e" - integrity sha512-JpzPLMPSCE0vaZ3vH5NO5u42GpMj/Y1SRBkQ6b69PSw3xMSH1umApN32cEcg1nnh8q5FNYc5FnKu0m4tiBffyQ== - -truffle-flattener@^1.4.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/truffle-flattener/-/truffle-flattener-1.6.0.tgz#abb64488b711e6cca0a9d3e449f6a85e35964c5d" - integrity sha512-scS5Bsi4CZyvlrmD4iQcLHTiG2RQFUXVheTgWeH6PuafmI+Lk5U87Es98loM3w3ImqC9/fPHq+3QIXbcPuoJ1Q== - dependencies: - "@resolver-engine/imports-fs" "^0.2.2" - "@solidity-parser/parser" "^0.14.1" - find-up "^2.1.0" - mkdirp "^1.0.4" - tsort "0.0.1" - -truffle-interface-adapter@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/truffle-interface-adapter/-/truffle-interface-adapter-0.2.5.tgz#aa0bee635517b4a8e06adcdc99eacb993e68c243" - integrity sha512-EL39OpP8FcZ99ne1Rno3jImfb92Nectd4iVsZzoEUCBfbwHe7sr0k+i45guoruSoP8nMUE81Mov2s8I5pi6d9Q== - dependencies: - bn.js "^4.11.8" - ethers "^4.0.32" - lodash "^4.17.13" - web3 "1.2.1" - -truffle-provider@^0.1.12: - version "0.1.16" - resolved "https://registry.yarnpkg.com/truffle-provider/-/truffle-provider-0.1.16.tgz#05db46a4bda9b7e6503f8701f2b03ccb1e6c78ba" - integrity sha512-3d5WqSKIzZcpgW44mdfF97s+Tgh2a/3Ly6vHJirBV9OZDUtiAzP6WVnlRNvmlDJXFCDqt6Yb9qQWoXFHbYoR6w== - dependencies: - "@truffle/error" "^0.0.6" - truffle-interface-adapter "^0.2.5" - web3 "1.2.1" - -ts-essentials@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-1.0.4.tgz#ce3b5dade5f5d97cf69889c11bf7d2da8555b15a" - integrity sha512-q3N1xS4vZpRouhYHDPwO0bDW3EZ6SK9CrrDHxi/D6BPReSjpVgWIOpLS2o0gSBZm+7q/wyKp6RVM1AeeW7uyfQ== - -ts-essentials@^6.0.3: - version "6.0.7" - resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-6.0.7.tgz#5f4880911b7581a873783740ce8b94da163d18a6" - integrity sha512-2E4HIIj4tQJlIHuATRHayv0EfMGK3ris/GRk1E3CFnsZzeNV+hUmelbaTZHLtXaZppM5oLhHRtO04gINC4Jusw== - -ts-generator@^0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/ts-generator/-/ts-generator-0.0.8.tgz#7bd48ca064db026d9520bcb682b69efc20971d6a" - integrity sha512-Gi+aZCELpVL7Mqb+GuMgM+n8JZ/arZZib1iD/R9Ok8JDjOCOCrqS9b1lr72ku7J45WeDCFZxyJoRsiQvhokCnw== - dependencies: - "@types/mkdirp" "^0.5.2" - "@types/prettier" "^1.13.2" - "@types/resolve" "^0.0.8" - chalk "^2.4.1" - glob "^7.1.2" - mkdirp "^0.5.1" - prettier "^1.14.2" - resolve "^1.8.1" - ts-essentials "^1.0.0" - -ts-generator@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ts-generator/-/ts-generator-0.1.1.tgz#af46f2fb88a6db1f9785977e9590e7bcd79220ab" - integrity sha512-N+ahhZxTLYu1HNTQetwWcx3so8hcYbkKBHTr4b4/YgObFTIKkOSSsaa+nal12w8mfrJAyzJfETXawbNjSfP2gQ== - dependencies: - "@types/mkdirp" "^0.5.2" - "@types/prettier" "^2.1.1" - "@types/resolve" "^0.0.8" - chalk "^2.4.1" - glob "^7.1.2" - mkdirp "^0.5.1" - prettier "^2.1.2" - resolve "^1.8.1" - ts-essentials "^1.0.0" - -tsconfig-paths@^3.15.0: - version "3.15.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" - integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.2" - minimist "^1.2.6" - strip-bom "^3.0.0" - -tslib@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" - integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== - -tslib@^1.11.1, tslib@^1.9.0, tslib@^1.9.3: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslib@^2.0.3, tslib@^2.3.1, tslib@^2.6.2: - version "2.7.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01" - integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== - -tsort@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786" - integrity sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw== - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== - dependencies: - safe-buffer "^5.0.1" - -tweetnacl-util@^0.15.0, tweetnacl-util@^0.15.1: - version "0.15.1" - resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz#b80fcdb5c97bcc508be18c44a4be50f022eea00b" - integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw== - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== - -tweetnacl@^1.0.0, tweetnacl@^1.0.1, tweetnacl@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" - integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== - dependencies: - prelude-ls "~1.1.2" - -type-detect@^4.0.0, type-detect@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.1.0.tgz#deb2453e8f08dcae7ae98c626b13dddb0155906c" - integrity sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw== - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -type-fest@^0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" - integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== - -type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== - -type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -type@^2.7.2: - version "2.7.3" - resolved "https://registry.yarnpkg.com/type/-/type-2.7.3.tgz#436981652129285cc3ba94f392886c2637ea0486" - integrity sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ== - -typechain-target-truffle@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/typechain-target-truffle/-/typechain-target-truffle-1.0.2.tgz#52ecbd8b7a854960567ad223660d60fcb42eaa17" - integrity sha512-XF3Iq2IzR+Pqvx6fcKIKGXNEk3lEcY24vYv9VqoVPfPB6vUM09PRLJCeLm1/ag6Pr2PICKUA0f4Es+YTR3ESKA== - dependencies: - lodash "^4.17.15" - -typechain-target-web3-v1@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/typechain-target-web3-v1/-/typechain-target-web3-v1-1.0.4.tgz#0157359e534737c07fc62529d5d8570a2047a2da" - integrity sha512-jQ6eCfY7QorBq6kQDjSy5LMuImZGkp6IXR6FXZp7/ulITIxAfb6Dxh+yvh0NN/zboLnMPvvSJi6tHWCqlwfSDA== - dependencies: - lodash "^4.17.15" - web3 "^1.2.4" - -typechain@^1.0.3: - version "1.0.5" - resolved "https://registry.yarnpkg.com/typechain/-/typechain-1.0.5.tgz#797899d9dbce54a83b3aef04ce1727ddf07d2138" - integrity sha512-gbQmJXPKuYQ0p3tK+dMhpdQql/UPtSnkPQXw2QM/aqwCengI86z2vEM2e5rVQpmk/blFx1PYNdApSDxE12rR1Q== - dependencies: - command-line-args "^4.0.7" - debug "^3.0.1" - fs-extra "^7.0.0" - js-sha3 "^0.8.0" - lodash "^4.17.15" - ts-generator "^0.0.8" - -typechain@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/typechain/-/typechain-3.0.0.tgz#d5a47700831f238e43f7429b987b4bb54849b92e" - integrity sha512-ft4KVmiN3zH4JUFu2WJBrwfHeDf772Tt2d8bssDTo/YcckKW2D+OwFrHXRC6hJvO3mHjFQTihoMV6fJOi0Hngg== - dependencies: - command-line-args "^4.0.7" - debug "^4.1.1" - fs-extra "^7.0.0" - js-sha3 "^0.8.0" - lodash "^4.17.15" - ts-essentials "^6.0.3" - ts-generator "^0.1.1" - -typed-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" - integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - is-typed-array "^1.1.13" - -typed-array-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" - integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== - dependencies: - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - -typed-array-byte-offset@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" - integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - -typed-array-length@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" - integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== - dependencies: - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - possible-typed-array-names "^1.0.0" - -typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== - dependencies: - is-typedarray "^1.0.0" - -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== - -typewise-core@^1.2, typewise-core@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/typewise-core/-/typewise-core-1.2.0.tgz#97eb91805c7f55d2f941748fa50d315d991ef195" - integrity sha512-2SCC/WLzj2SbUwzFOzqMCkz5amXLlxtJqDKTICqg30x+2DZxcfZN2MvQZmGfXWKNWaKK9pBPsvkcwv8bF/gxKg== - -typewise@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/typewise/-/typewise-1.0.3.tgz#1067936540af97937cc5dcf9922486e9fa284651" - integrity sha512-aXofE06xGhaQSPzt8hlTY+/YWQhm9P0jYUp1f2XtmW/3Bk0qzXcyFWAtPoo2uTGQj1ZwbDuSyuxicq+aDo8lCQ== - dependencies: - typewise-core "^1.2.0" - -typewiselite@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typewiselite/-/typewiselite-1.0.0.tgz#c8882fa1bb1092c06005a97f34ef5c8508e3664e" - integrity sha512-J9alhjVHupW3Wfz6qFRGgQw0N3gr8hOkw6zm7FZ6UR1Cse/oD9/JVok7DNE9TT9IbciDHX2Ex9+ksE6cRmtymw== - -typical@^2.6.0, typical@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/typical/-/typical-2.6.1.tgz#5c080e5d661cbbe38259d2e70a3c7253e873881d" - integrity sha512-ofhi8kjIje6npGozTip9Fr8iecmYfEbS06i0JnIg+rh51KakryWF4+jX8lLKZVhy6N+ID45WYSFCxPOdTWCzNg== - -u3@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/u3/-/u3-0.1.1.tgz#5f52044f42ee76cd8de33148829e14528494b73b" - integrity sha512-+J5D5ir763y+Am/QY6hXNRlwljIeRMZMGs0cT6qqZVVzzT3X3nFPXVyPOFRMOR4kupB0T8JnCdpWdp6Q/iXn3w== - -uglify-js@^3.1.4: - version "3.19.3" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.19.3.tgz#82315e9bbc6f2b25888858acd1fff8441035b77f" - integrity sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ== - -ultron@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" - integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== - -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== - dependencies: - call-bind "^1.0.2" - has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" - -unbzip2-stream@^1.0.9: - version "1.4.3" - resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7" - integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg== - dependencies: - buffer "^5.2.1" - through "^2.3.8" - -underscore@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" - integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg== - -underscore@^1.9.1: - version "1.13.7" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.7.tgz#970e33963af9a7dda228f17ebe8399e5fbe63a10" - integrity sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g== - -undici-types@~6.19.2: - version "6.19.8" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" - integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== - -undici@^5.14.0: - version "5.28.4" - resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.4.tgz#6b280408edb6a1a604a9b20340f45b422e373068" - integrity sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g== - dependencies: - "@fastify/busboy" "^2.0.0" - -undici@^6.11.1, undici@^6.19.5: - version "6.19.8" - resolved "https://registry.yarnpkg.com/undici/-/undici-6.19.8.tgz#002d7c8a28f8cc3a44ff33c3d4be4d85e15d40e1" - integrity sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g== - -unfetch@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.2.0.tgz#7e21b0ef7d363d8d9af0fb929a5555f6ef97a3be" - integrity sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA== - -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" - -unique-string@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" - integrity sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg== - dependencies: - crypto-random-string "^1.0.0" - -unique-string@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" - integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== - dependencies: - crypto-random-string "^2.0.0" - -universalify@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - -universalify@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" - integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== - -unorm@^1.3.3: - version "1.6.0" - resolved "https://registry.yarnpkg.com/unorm/-/unorm-1.6.0.tgz#029b289661fba714f1a9af439eb51d9b16c205af" - integrity sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA== - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== - -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ== - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -upper-case-first@^1.1.0, upper-case-first@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/upper-case-first/-/upper-case-first-1.1.2.tgz#5d79bedcff14419518fd2edb0a0507c9b6859115" - integrity sha512-wINKYvI3Db8dtjikdAqoBbZoP6Q+PZUyfMR7pmwHzjC2quzSkUq5DmPrTtPEqHaz8AGtmsB4TqwapMTM1QAQOQ== - dependencies: - upper-case "^1.1.1" - -upper-case-first@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/upper-case-first/-/upper-case-first-2.0.2.tgz#992c3273f882abd19d1e02894cc147117f844324" - integrity sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg== - dependencies: - tslib "^2.0.3" - -upper-case@^1.0.3, upper-case@^1.1.0, upper-case@^1.1.1, upper-case@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" - integrity sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA== - -upper-case@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-2.0.2.tgz#d89810823faab1df1549b7d97a76f8662bae6f7a" - integrity sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg== - dependencies: - tslib "^2.0.3" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== - -url-parse-lax@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" - integrity sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA== - dependencies: - prepend-http "^1.0.1" - -url-parse-lax@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" - integrity sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ== - dependencies: - prepend-http "^2.0.0" - -url-set-query@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/url-set-query/-/url-set-query-1.0.0.tgz#016e8cfd7c20ee05cafe7795e892bd0702faa339" - integrity sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg== - -url-to-options@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" - integrity sha512-0kQLIzG4fdk/G5NONku64rSH/x32NOA39LVQqlK8Le6lvTF6GGRJpqaQFGgU+CLwySIqBSMdwYM0sYcW9f6P4A== - -url@^0.11.0: - version "0.11.4" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.4.tgz#adca77b3562d56b72746e76b330b7f27b6721f3c" - integrity sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg== - dependencies: - punycode "^1.4.1" - qs "^6.12.3" - -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== - -utf-8-validate@^5.0.2: - version "5.0.10" - resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.10.tgz#d7d10ea39318171ca982718b6b96a8d2442571a2" - integrity sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ== - dependencies: - node-gyp-build "^4.3.0" - -utf8@3.0.0, utf8@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" - integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== - -util-deprecate@^1.0.1, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -util.promisify@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.1.2.tgz#02b3dbadbb80071eee4c43aed58747afdfc516db" - integrity sha512-PBdZ03m1kBnQ5cjjO0ZvJMJS+QsbyIcFwi4hY4U76OQsCO9JrOYjbCFgIF76ccFg9xnJo7ZHPkqyj1GqmdS7MA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - for-each "^0.3.3" - has-proto "^1.0.1" - has-symbols "^1.0.3" - object.getownpropertydescriptors "^2.1.6" - safe-array-concat "^1.0.0" - -util@^0.12.5: - version "0.12.5" - resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" - integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== - dependencies: - inherits "^2.0.3" - is-arguments "^1.0.4" - is-generator-function "^1.0.7" - is-typed-array "^1.1.3" - which-typed-array "^1.1.2" - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== - -uuid@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.1.tgz#c2a30dedb3e535d72ccf82e343941a50ba8533ac" - integrity sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg== - -uuid@3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" - integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== - -uuid@^3.3.2, uuid@^3.3.3: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -uuid@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" - integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== - -v8-compile-cache@^2.0.3: - version "2.4.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz#cdada8bec61e15865f05d097c5f4fd30e94dc128" - integrity sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw== - -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -varint@^5.0.0: - version "5.0.2" - resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.2.tgz#5b47f8a947eb668b848e034dcfa87d0ff8a7f7a4" - integrity sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow== - -vary@^1, vary@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== - -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - -web3-bzz@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.10.0.tgz#ac74bc71cdf294c7080a79091079192f05c5baed" - integrity sha512-o9IR59io3pDUsXTsps5pO5hW1D5zBmg46iNc2t4j2DkaYHNdDLwk2IP9ukoM2wg47QILfPEJYzhTfkS/CcX0KA== - dependencies: - "@types/node" "^12.12.6" - got "12.1.0" - swarm-js "^0.1.40" - -web3-bzz@1.10.4: - version "1.10.4" - resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.10.4.tgz#dcc787970767d9004c73d11d0eeef774ce16b880" - integrity sha512-ZZ/X4sJ0Uh2teU9lAGNS8EjveEppoHNQiKlOXAjedsrdWuaMErBPdLQjXfcrYvN6WM6Su9PMsAxf3FXXZ+HwQw== - dependencies: - "@types/node" "^12.12.6" - got "12.1.0" - swarm-js "^0.1.40" - -web3-bzz@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.2.1.tgz#c3bd1e8f0c02a13cd6d4e3c3e9e1713f144f6f0d" - integrity sha512-LdOO44TuYbGIPfL4ilkuS89GQovxUpmLz6C1UC7VYVVRILeZS740FVB3j9V4P4FHUk1RenaDfKhcntqgVCHtjw== - dependencies: - got "9.6.0" - swarm-js "0.1.39" - underscore "1.9.1" - -web3-bzz@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.2.11.tgz#41bc19a77444bd5365744596d778b811880f707f" - integrity sha512-XGpWUEElGypBjeFyUhTkiPXFbDVD6Nr/S5jznE3t8cWUA0FxRf1n3n/NuIZeb0H9RkN2Ctd/jNma/k8XGa3YKg== - dependencies: - "@types/node" "^12.12.6" - got "9.6.0" - swarm-js "^0.1.40" - underscore "1.9.1" - -web3-bzz@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.2.2.tgz#a3b9f613c49fd3e120e0997088a73557d5adb724" - integrity sha512-b1O2ObsqUN1lJxmFSjvnEC4TsaCbmh7Owj3IAIWTKqL9qhVgx7Qsu5O9cD13pBiSPNZJ68uJPaKq380QB4NWeA== - dependencies: - "@types/node" "^10.12.18" - got "9.6.0" - swarm-js "0.1.39" - underscore "1.9.1" - -web3-bzz@1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.2.6.tgz#0b88c0b96029eaf01b10cb47c4d5f79db4668883" - integrity sha512-9NiHLlxdI1XeFtbPJAmi2jnnIHVF+GNy517wvOS72P7ZfuJTPwZaSNXfT01vWgPPE9R96/uAHDWHOg+T4WaDQQ== - dependencies: - "@types/node" "^10.12.18" - got "9.6.0" - swarm-js "0.1.39" - underscore "1.9.1" - -web3-core-helpers@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.10.0.tgz#1016534c51a5df77ed4f94d1fcce31de4af37fad" - integrity sha512-pIxAzFDS5vnbXvfvLSpaA1tfRykAe9adw43YCKsEYQwH0gCLL0kMLkaCX3q+Q8EVmAh+e1jWL/nl9U0de1+++g== - dependencies: - web3-eth-iban "1.10.0" - web3-utils "1.10.0" - -web3-core-helpers@1.10.4: - version "1.10.4" - resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.10.4.tgz#bd2b4140df2016d5dd3bb2b925fc29ad8678677c" - integrity sha512-r+L5ylA17JlD1vwS8rjhWr0qg7zVoVMDvWhajWA5r5+USdh91jRUYosp19Kd1m2vE034v7Dfqe1xYRoH2zvG0g== - dependencies: - web3-eth-iban "1.10.4" - web3-utils "1.10.4" - -web3-core-helpers@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.2.1.tgz#f5f32d71c60a4a3bd14786118e633ce7ca6d5d0d" - integrity sha512-Gx3sTEajD5r96bJgfuW377PZVFmXIH4TdqDhgGwd2lZQCcMi+DA4TgxJNJGxn0R3aUVzyyE76j4LBrh412mXrw== - dependencies: - underscore "1.9.1" - web3-eth-iban "1.2.1" - web3-utils "1.2.1" - -web3-core-helpers@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.2.11.tgz#84c681ed0b942c0203f3b324a245a127e8c67a99" - integrity sha512-PEPoAoZd5ME7UfbnCZBdzIerpe74GEvlwT4AjOmHeCVZoIFk7EqvOZDejJHt+feJA6kMVTdd0xzRNN295UhC1A== - dependencies: - underscore "1.9.1" - web3-eth-iban "1.2.11" - web3-utils "1.2.11" - -web3-core-helpers@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.2.2.tgz#484974f4bd4a487217b85b0d7cfe841af0907619" - integrity sha512-HJrRsIGgZa1jGUIhvGz4S5Yh6wtOIo/TMIsSLe+Xay+KVnbseJpPprDI5W3s7H2ODhMQTbogmmUFquZweW2ImQ== - dependencies: - underscore "1.9.1" - web3-eth-iban "1.2.2" - web3-utils "1.2.2" - -web3-core-helpers@1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.2.6.tgz#7aacd25bf8015adcdfc0f3243d0dcfdff0373f7d" - integrity sha512-gYKWmC2HmO7RcDzpo4L1K8EIoy5L8iubNDuTC6q69UxczwqKF/Io0kbK/1Z10Av++NlzOSiuyGp2gc4t4UOsDw== - dependencies: - underscore "1.9.1" - web3-eth-iban "1.2.6" - web3-utils "1.2.6" - -web3-core-method@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.10.0.tgz#82668197fa086e8cc8066742e35a9d72535e3412" - integrity sha512-4R700jTLAMKDMhQ+nsVfIXvH6IGJlJzGisIfMKWAIswH31h5AZz7uDUW2YctI+HrYd+5uOAlS4OJeeT9bIpvkA== - dependencies: - "@ethersproject/transactions" "^5.6.2" - web3-core-helpers "1.10.0" - web3-core-promievent "1.10.0" - web3-core-subscriptions "1.10.0" - web3-utils "1.10.0" - -web3-core-method@1.10.4: - version "1.10.4" - resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.10.4.tgz#566b52f006d3cbb13b21b72b8d2108999bf5d6bf" - integrity sha512-uZTb7flr+Xl6LaDsyTeE2L1TylokCJwTDrIVfIfnrGmnwLc6bmTWCCrm71sSrQ0hqs6vp/MKbQYIYqUN0J8WyA== - dependencies: - "@ethersproject/transactions" "^5.6.2" - web3-core-helpers "1.10.4" - web3-core-promievent "1.10.4" - web3-core-subscriptions "1.10.4" - web3-utils "1.10.4" - -web3-core-method@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.2.1.tgz#9df1bafa2cd8be9d9937e01c6a47fc768d15d90a" - integrity sha512-Ghg2WS23qi6Xj8Od3VCzaImLHseEA7/usvnOItluiIc5cKs00WYWsNy2YRStzU9a2+z8lwQywPYp0nTzR/QXdQ== - dependencies: - underscore "1.9.1" - web3-core-helpers "1.2.1" - web3-core-promievent "1.2.1" - web3-core-subscriptions "1.2.1" - web3-utils "1.2.1" - -web3-core-method@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.2.11.tgz#f880137d1507a0124912bf052534f168b8d8fbb6" - integrity sha512-ff0q76Cde94HAxLDZ6DbdmKniYCQVtvuaYh+rtOUMB6kssa5FX0q3vPmixi7NPooFnbKmmZCM6NvXg4IreTPIw== - dependencies: - "@ethersproject/transactions" "^5.0.0-beta.135" - underscore "1.9.1" - web3-core-helpers "1.2.11" - web3-core-promievent "1.2.11" - web3-core-subscriptions "1.2.11" - web3-utils "1.2.11" - -web3-core-method@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.2.2.tgz#d4fe2bb1945b7152e5f08e4ea568b171132a1e56" - integrity sha512-szR4fDSBxNHaF1DFqE+j6sFR/afv9Aa36OW93saHZnrh+iXSrYeUUDfugeNcRlugEKeUCkd4CZylfgbK2SKYJA== - dependencies: - underscore "1.9.1" - web3-core-helpers "1.2.2" - web3-core-promievent "1.2.2" - web3-core-subscriptions "1.2.2" - web3-utils "1.2.2" - -web3-core-method@1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.2.6.tgz#f5a3e4d304abaf382923c8ab88ec8eeef45c1b3b" - integrity sha512-r2dzyPEonqkBg7Mugq5dknhV5PGaZTHBZlS/C+aMxNyQs3T3eaAsCTqlQDitwNUh/sUcYPEGF0Vo7ahYK4k91g== - dependencies: - underscore "1.9.1" - web3-core-helpers "1.2.6" - web3-core-promievent "1.2.6" - web3-core-subscriptions "1.2.6" - web3-utils "1.2.6" - -web3-core-promievent@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.10.0.tgz#cbb5b3a76b888df45ed3a8d4d8d4f54ccb66a37b" - integrity sha512-68N7k5LWL5R38xRaKFrTFT2pm2jBNFaM4GioS00YjAKXRQ3KjmhijOMG3TICz6Aa5+6GDWYelDNx21YAeZ4YTg== - dependencies: - eventemitter3 "4.0.4" - -web3-core-promievent@1.10.4: - version "1.10.4" - resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.10.4.tgz#629b970b7934430b03c5033c79f3bb3893027e22" - integrity sha512-2de5WnJQ72YcIhYwV/jHLc4/cWJnznuoGTJGD29ncFQHAfwW/MItHFSVKPPA5v8AhJe+r6y4Y12EKvZKjQVBvQ== - dependencies: - eventemitter3 "4.0.4" - -web3-core-promievent@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.2.1.tgz#003e8a3eb82fb27b6164a6d5b9cad04acf733838" - integrity sha512-IVUqgpIKoeOYblwpex4Hye6npM0aMR+kU49VP06secPeN0rHMyhGF0ZGveWBrGvf8WDPI7jhqPBFIC6Jf3Q3zw== - dependencies: - any-promise "1.3.0" - eventemitter3 "3.1.2" - -web3-core-promievent@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.2.11.tgz#51fe97ca0ddec2f99bf8c3306a7a8e4b094ea3cf" - integrity sha512-il4McoDa/Ox9Agh4kyfQ8Ak/9ABYpnF8poBLL33R/EnxLsJOGQG2nZhkJa3I067hocrPSjEdlPt/0bHXsln4qA== - dependencies: - eventemitter3 "4.0.4" - -web3-core-promievent@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.2.2.tgz#3b60e3f2a0c96db8a891c927899d29d39e66ab1c" - integrity sha512-tKvYeT8bkUfKABcQswK6/X79blKTKYGk949urZKcLvLDEaWrM3uuzDwdQT3BNKzQ3vIvTggFPX9BwYh0F1WwqQ== - dependencies: - any-promise "1.3.0" - eventemitter3 "3.1.2" - -web3-core-promievent@1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.2.6.tgz#b1550a3a4163e48b8b704c1fe4b0084fc2dad8f5" - integrity sha512-km72kJef/qtQNiSjDJJVHIZvoVOm6ytW3FCYnOcCs7RIkviAb5JYlPiye0o4pJOLzCXYID7DK7Q9bhY8qWb1lw== - dependencies: - any-promise "1.3.0" - eventemitter3 "3.1.2" - -web3-core-requestmanager@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.10.0.tgz#4b34f6e05837e67c70ff6f6993652afc0d54c340" - integrity sha512-3z/JKE++Os62APml4dvBM+GAuId4h3L9ckUrj7ebEtS2AR0ixyQPbrBodgL91Sv7j7cQ3Y+hllaluqjguxvSaQ== - dependencies: - util "^0.12.5" - web3-core-helpers "1.10.0" - web3-providers-http "1.10.0" - web3-providers-ipc "1.10.0" - web3-providers-ws "1.10.0" - -web3-core-requestmanager@1.10.4: - version "1.10.4" - resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.10.4.tgz#eb1f147e6b9df84e3a37e602162f8925bdb4bb9a" - integrity sha512-vqP6pKH8RrhT/2MoaU+DY/OsYK9h7HmEBNCdoMj+4ZwujQtw/Mq2JifjwsJ7gits7Q+HWJwx8q6WmQoVZAWugg== - dependencies: - util "^0.12.5" - web3-core-helpers "1.10.4" - web3-providers-http "1.10.4" - web3-providers-ipc "1.10.4" - web3-providers-ws "1.10.4" - -web3-core-requestmanager@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.2.1.tgz#fa2e2206c3d738db38db7c8fe9c107006f5c6e3d" - integrity sha512-xfknTC69RfYmLKC+83Jz73IC3/sS2ZLhGtX33D4Q5nQ8yc39ElyAolxr9sJQS8kihOcM6u4J+8gyGMqsLcpIBg== - dependencies: - underscore "1.9.1" - web3-core-helpers "1.2.1" - web3-providers-http "1.2.1" - web3-providers-ipc "1.2.1" - web3-providers-ws "1.2.1" - -web3-core-requestmanager@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.2.11.tgz#fe6eb603fbaee18530293a91f8cf26d8ae28c45a" - integrity sha512-oFhBtLfOiIbmfl6T6gYjjj9igOvtyxJ+fjS+byRxiwFJyJ5BQOz4/9/17gWR1Cq74paTlI7vDGxYfuvfE/mKvA== - dependencies: - underscore "1.9.1" - web3-core-helpers "1.2.11" - web3-providers-http "1.2.11" - web3-providers-ipc "1.2.11" - web3-providers-ws "1.2.11" - -web3-core-requestmanager@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.2.2.tgz#667ba9ac724c9c76fa8965ae8a3c61f66e68d8d6" - integrity sha512-a+gSbiBRHtHvkp78U2bsntMGYGF2eCb6219aMufuZWeAZGXJ63Wc2321PCbA8hF9cQrZI4EoZ4kVLRI4OF15Hw== - dependencies: - underscore "1.9.1" - web3-core-helpers "1.2.2" - web3-providers-http "1.2.2" - web3-providers-ipc "1.2.2" - web3-providers-ws "1.2.2" - -web3-core-requestmanager@1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.2.6.tgz#5808c0edc0d6e2991a87b65508b3a1ab065b68ec" - integrity sha512-QU2cbsj9Dm0r6om40oSwk8Oqbp3wTa08tXuMpSmeOTkGZ3EMHJ1/4LiJ8shwg1AvPMrKVU0Nri6+uBNCdReZ+g== - dependencies: - underscore "1.9.1" - web3-core-helpers "1.2.6" - web3-providers-http "1.2.6" - web3-providers-ipc "1.2.6" - web3-providers-ws "1.2.6" - -web3-core-subscriptions@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.10.0.tgz#b534592ee1611788fc0cb0b95963b9b9b6eacb7c" - integrity sha512-HGm1PbDqsxejI075gxBc5OSkwymilRWZufIy9zEpnWKNmfbuv5FfHgW1/chtJP6aP3Uq2vHkvTDl3smQBb8l+g== - dependencies: - eventemitter3 "4.0.4" - web3-core-helpers "1.10.0" - -web3-core-subscriptions@1.10.4: - version "1.10.4" - resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.10.4.tgz#2f4dcb404237e92802a563265d11a33934dc38e6" - integrity sha512-o0lSQo/N/f7/L76C0HV63+S54loXiE9fUPfHFcTtpJRQNDBVsSDdWRdePbWwR206XlsBqD5VHApck1//jEafTw== - dependencies: - eventemitter3 "4.0.4" - web3-core-helpers "1.10.4" - -web3-core-subscriptions@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.2.1.tgz#8c2368a839d4eec1c01a4b5650bbeb82d0e4a099" - integrity sha512-nmOwe3NsB8V8UFsY1r+sW6KjdOS68h8nuh7NzlWxBQT/19QSUGiERRTaZXWu5BYvo1EoZRMxCKyCQpSSXLc08g== - dependencies: - eventemitter3 "3.1.2" - underscore "1.9.1" - web3-core-helpers "1.2.1" - -web3-core-subscriptions@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.2.11.tgz#beca908fbfcb050c16f45f3f0f4c205e8505accd" - integrity sha512-qEF/OVqkCvQ7MPs1JylIZCZkin0aKK9lDxpAtQ1F8niEDGFqn7DT8E/vzbIa0GsOjL2fZjDhWJsaW+BSoAW1gg== - dependencies: - eventemitter3 "4.0.4" - underscore "1.9.1" - web3-core-helpers "1.2.11" - -web3-core-subscriptions@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.2.2.tgz#bf4ba23a653a003bdc3551649958cc0b080b068e" - integrity sha512-QbTgigNuT4eicAWWr7ahVpJyM8GbICsR1Ys9mJqzBEwpqS+RXTRVSkwZ2IsxO+iqv6liMNwGregbJLq4urMFcQ== - dependencies: - eventemitter3 "3.1.2" - underscore "1.9.1" - web3-core-helpers "1.2.2" - -web3-core-subscriptions@1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.2.6.tgz#9d44189e2321f8f1abc31f6c09103b5283461b57" - integrity sha512-M0PzRrP2Ct13x3wPulFtc5kENH4UtnPxO9YxkfQlX2WRKENWjt4Rfq+BCVGYEk3rTutDfWrjfzjmqMRvXqEY5Q== - dependencies: - eventemitter3 "3.1.2" - underscore "1.9.1" - web3-core-helpers "1.2.6" - -web3-core@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.10.0.tgz#9aa07c5deb478cf356c5d3b5b35afafa5fa8e633" - integrity sha512-fWySwqy2hn3TL89w5TM8wXF1Z2Q6frQTKHWmP0ppRQorEK8NcHJRfeMiv/mQlSKoTS1F6n/nv2uyZsixFycjYQ== - dependencies: - "@types/bn.js" "^5.1.1" - "@types/node" "^12.12.6" - bignumber.js "^9.0.0" - web3-core-helpers "1.10.0" - web3-core-method "1.10.0" - web3-core-requestmanager "1.10.0" - web3-utils "1.10.0" - -web3-core@1.10.4: - version "1.10.4" - resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.10.4.tgz#639de68b8b9871d2dc8892e0dd4e380cb1361a98" - integrity sha512-B6elffYm81MYZDTrat7aEhnhdtVE3lDBUZft16Z8awYMZYJDbnykEbJVS+l3mnA7AQTnSDr/1MjWofGDLBJPww== - dependencies: - "@types/bn.js" "^5.1.1" - "@types/node" "^12.12.6" - bignumber.js "^9.0.0" - web3-core-helpers "1.10.4" - web3-core-method "1.10.4" - web3-core-requestmanager "1.10.4" - web3-utils "1.10.4" - -web3-core@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.2.1.tgz#7278b58fb6495065e73a77efbbce781a7fddf1a9" - integrity sha512-5ODwIqgl8oIg/0+Ai4jsLxkKFWJYE0uLuE1yUKHNVCL4zL6n3rFjRMpKPokd6id6nJCNgeA64KdWQ4XfpnjdMg== - dependencies: - web3-core-helpers "1.2.1" - web3-core-method "1.2.1" - web3-core-requestmanager "1.2.1" - web3-utils "1.2.1" - -web3-core@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.2.11.tgz#1043cacc1becb80638453cc5b2a14be9050288a7" - integrity sha512-CN7MEYOY5ryo5iVleIWRE3a3cZqVaLlIbIzDPsvQRUfzYnvzZQRZBm9Mq+ttDi2STOOzc1MKylspz/o3yq/LjQ== - dependencies: - "@types/bn.js" "^4.11.5" - "@types/node" "^12.12.6" - bignumber.js "^9.0.0" - web3-core-helpers "1.2.11" - web3-core-method "1.2.11" - web3-core-requestmanager "1.2.11" - web3-utils "1.2.11" - -web3-core@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.2.2.tgz#334b99c8222ef9cfd0339e27352f0b58ea789a2f" - integrity sha512-miHAX3qUgxV+KYfaOY93Hlc3kLW2j5fH8FJy6kSxAv+d4d5aH0wwrU2IIoJylQdT+FeenQ38sgsCnFu9iZ1hCQ== - dependencies: - "@types/bn.js" "^4.11.4" - "@types/node" "^12.6.1" - web3-core-helpers "1.2.2" - web3-core-method "1.2.2" - web3-core-requestmanager "1.2.2" - web3-utils "1.2.2" - -web3-core@1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.2.6.tgz#bb42a1d7ae49a7258460f0d95ddb00906f59ef92" - integrity sha512-y/QNBFtr5cIR8vxebnotbjWJpOnO8LDYEAzZjeRRUJh2ijmhjoYk7dSNx9ExgC0UCfNFRoNCa9dGRu/GAxwRlw== - dependencies: - "@types/bn.js" "^4.11.4" - "@types/node" "^12.6.1" - web3-core-helpers "1.2.6" - web3-core-method "1.2.6" - web3-core-requestmanager "1.2.6" - web3-utils "1.2.6" - -web3-eth-abi@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.10.0.tgz#53a7a2c95a571e205e27fd9e664df4919483cce1" - integrity sha512-cwS+qRBWpJ43aI9L3JS88QYPfFcSJJ3XapxOQ4j40v6mk7ATpA8CVK1vGTzpihNlOfMVRBkR95oAj7oL6aiDOg== - dependencies: - "@ethersproject/abi" "^5.6.3" - web3-utils "1.10.0" - -web3-eth-abi@1.10.4: - version "1.10.4" - resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.10.4.tgz#16c19d0bde0aaf8c1a56cb7743a83156d148d798" - integrity sha512-cZ0q65eJIkd/jyOlQPDjr8X4fU6CRL1eWgdLwbWEpo++MPU/2P4PFk5ZLAdye9T5Sdp+MomePPJ/gHjLMj2VfQ== - dependencies: - "@ethersproject/abi" "^5.6.3" - web3-utils "1.10.4" - -web3-eth-abi@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.2.1.tgz#9b915b1c9ebf82f70cca631147035d5419064689" - integrity sha512-jI/KhU2a/DQPZXHjo2GW0myEljzfiKOn+h1qxK1+Y9OQfTcBMxrQJyH5AP89O6l6NZ1QvNdq99ThAxBFoy5L+g== - dependencies: - ethers "4.0.0-beta.3" - underscore "1.9.1" - web3-utils "1.2.1" - -web3-eth-abi@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.2.11.tgz#a887494e5d447c2926d557a3834edd66e17af9b0" - integrity sha512-PkRYc0+MjuLSgg03QVWqWlQivJqRwKItKtEpRUaxUAeLE7i/uU39gmzm2keHGcQXo3POXAbOnMqkDvOep89Crg== - dependencies: - "@ethersproject/abi" "5.0.0-beta.153" - underscore "1.9.1" - web3-utils "1.2.11" - -web3-eth-abi@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.2.2.tgz#d5616d88a90020f894763423a9769f2da11fe37a" - integrity sha512-Yn/ZMgoOLxhTVxIYtPJ0eS6pnAnkTAaJgUJh1JhZS4ekzgswMfEYXOwpMaD5eiqPJLpuxmZFnXnBZlnQ1JMXsw== - dependencies: - ethers "4.0.0-beta.3" - underscore "1.9.1" - web3-utils "1.2.2" - -web3-eth-abi@1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.2.6.tgz#b495383cc5c0d8e2857b26e7fe25606685983b25" - integrity sha512-w9GAyyikn8nSifSDZxAvU9fxtQSX+W2xQWMmrtTXmBGCaE4/ywKOSPAO78gq8AoU4Wq5yqVGKZLLbfpt7/sHlA== - dependencies: - ethers "4.0.0-beta.3" - underscore "1.9.1" - web3-utils "1.2.6" - -web3-eth-accounts@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.10.0.tgz#2942beca0a4291455f32cf09de10457a19a48117" - integrity sha512-wiq39Uc3mOI8rw24wE2n15hboLE0E9BsQLdlmsL4Zua9diDS6B5abXG0XhFcoNsXIGMWXVZz4TOq3u4EdpXF/Q== - dependencies: - "@ethereumjs/common" "2.5.0" - "@ethereumjs/tx" "3.3.2" - eth-lib "0.2.8" - ethereumjs-util "^7.1.5" - scrypt-js "^3.0.1" - uuid "^9.0.0" - web3-core "1.10.0" - web3-core-helpers "1.10.0" - web3-core-method "1.10.0" - web3-utils "1.10.0" - -web3-eth-accounts@1.10.4: - version "1.10.4" - resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.10.4.tgz#df30e85a7cd70e475f8cf52361befba408829e34" - integrity sha512-ysy5sVTg9snYS7tJjxVoQAH6DTOTkRGR8emEVCWNGLGiB9txj+qDvSeT0izjurS/g7D5xlMAgrEHLK1Vi6I3yg== - dependencies: - "@ethereumjs/common" "2.6.5" - "@ethereumjs/tx" "3.5.2" - "@ethereumjs/util" "^8.1.0" - eth-lib "0.2.8" - scrypt-js "^3.0.1" - uuid "^9.0.0" - web3-core "1.10.4" - web3-core-helpers "1.10.4" - web3-core-method "1.10.4" - web3-utils "1.10.4" - -web3-eth-accounts@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.2.1.tgz#2741a8ef337a7219d57959ac8bd118b9d68d63cf" - integrity sha512-26I4qq42STQ8IeKUyur3MdQ1NzrzCqPsmzqpux0j6X/XBD7EjZ+Cs0lhGNkSKH5dI3V8CJasnQ5T1mNKeWB7nQ== - dependencies: - any-promise "1.3.0" - crypto-browserify "3.12.0" - eth-lib "0.2.7" - scryptsy "2.1.0" - semver "6.2.0" - underscore "1.9.1" - uuid "3.3.2" - web3-core "1.2.1" - web3-core-helpers "1.2.1" - web3-core-method "1.2.1" - web3-utils "1.2.1" - -web3-eth-accounts@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.2.11.tgz#a9e3044da442d31903a7ce035a86d8fa33f90520" - integrity sha512-6FwPqEpCfKIh3nSSGeo3uBm2iFSnFJDfwL3oS9pyegRBXNsGRVpgiW63yhNzL0796StsvjHWwQnQHsZNxWAkGw== - dependencies: - crypto-browserify "3.12.0" - eth-lib "0.2.8" - ethereumjs-common "^1.3.2" - ethereumjs-tx "^2.1.1" - scrypt-js "^3.0.1" - underscore "1.9.1" - uuid "3.3.2" - web3-core "1.2.11" - web3-core-helpers "1.2.11" - web3-core-method "1.2.11" - web3-utils "1.2.11" - -web3-eth-accounts@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.2.2.tgz#c187e14bff6baa698ac352220290222dbfd332e5" - integrity sha512-KzHOEyXOEZ13ZOkWN3skZKqSo5f4Z1ogPFNn9uZbKCz+kSp+gCAEKxyfbOsB/JMAp5h7o7pb6eYsPCUBJmFFiA== - dependencies: - any-promise "1.3.0" - crypto-browserify "3.12.0" - eth-lib "0.2.7" - ethereumjs-common "^1.3.2" - ethereumjs-tx "^2.1.1" - scrypt-shim "github:web3-js/scrypt-shim" - underscore "1.9.1" - uuid "3.3.2" - web3-core "1.2.2" - web3-core-helpers "1.2.2" - web3-core-method "1.2.2" - web3-utils "1.2.2" - -web3-eth-accounts@1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.2.6.tgz#a1ba4bf75fa8102a3ec6cddd0eccd72462262720" - integrity sha512-cDVtonHRgzqi/ZHOOf8kfCQWFEipcfQNAMzXIaKZwc0UUD9mgSI5oJrN45a89Ze+E6Lz9m77cDG5Ax9zscSkcw== - dependencies: - "@web3-js/scrypt-shim" "^0.1.0" - any-promise "1.3.0" - crypto-browserify "3.12.0" - eth-lib "^0.2.8" - ethereumjs-common "^1.3.2" - ethereumjs-tx "^2.1.1" - underscore "1.9.1" - uuid "3.3.2" - web3-core "1.2.6" - web3-core-helpers "1.2.6" - web3-core-method "1.2.6" - web3-utils "1.2.6" - -web3-eth-contract@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.10.0.tgz#8e68c7654576773ec3c91903f08e49d0242c503a" - integrity sha512-MIC5FOzP/+2evDksQQ/dpcXhSqa/2hFNytdl/x61IeWxhh6vlFeSjq0YVTAyIzdjwnL7nEmZpjfI6y6/Ufhy7w== - dependencies: - "@types/bn.js" "^5.1.1" - web3-core "1.10.0" - web3-core-helpers "1.10.0" - web3-core-method "1.10.0" - web3-core-promievent "1.10.0" - web3-core-subscriptions "1.10.0" - web3-eth-abi "1.10.0" - web3-utils "1.10.0" - -web3-eth-contract@1.10.4: - version "1.10.4" - resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.10.4.tgz#22d39f04e11d9ff4e726e8025a56d78e843a2c3d" - integrity sha512-Q8PfolOJ4eV9TvnTj1TGdZ4RarpSLmHnUnzVxZ/6/NiTfe4maJz99R0ISgwZkntLhLRtw0C7LRJuklzGYCNN3A== - dependencies: - "@types/bn.js" "^5.1.1" - web3-core "1.10.4" - web3-core-helpers "1.10.4" - web3-core-method "1.10.4" - web3-core-promievent "1.10.4" - web3-core-subscriptions "1.10.4" - web3-eth-abi "1.10.4" - web3-utils "1.10.4" - -web3-eth-contract@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.2.1.tgz#3542424f3d341386fd9ff65e78060b85ac0ea8c4" - integrity sha512-kYFESbQ3boC9bl2rYVghj7O8UKMiuKaiMkxvRH5cEDHil8V7MGEGZNH0slSdoyeftZVlaWSMqkRP/chfnKND0g== - dependencies: - underscore "1.9.1" - web3-core "1.2.1" - web3-core-helpers "1.2.1" - web3-core-method "1.2.1" - web3-core-promievent "1.2.1" - web3-core-subscriptions "1.2.1" - web3-eth-abi "1.2.1" - web3-utils "1.2.1" - -web3-eth-contract@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.2.11.tgz#917065902bc27ce89da9a1da26e62ef663663b90" - integrity sha512-MzYuI/Rq2o6gn7vCGcnQgco63isPNK5lMAan2E51AJLknjSLnOxwNY3gM8BcKoy4Z+v5Dv00a03Xuk78JowFow== - dependencies: - "@types/bn.js" "^4.11.5" - underscore "1.9.1" - web3-core "1.2.11" - web3-core-helpers "1.2.11" - web3-core-method "1.2.11" - web3-core-promievent "1.2.11" - web3-core-subscriptions "1.2.11" - web3-eth-abi "1.2.11" - web3-utils "1.2.11" - -web3-eth-contract@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.2.2.tgz#84e92714918a29e1028ee7718f0712536e14e9a1" - integrity sha512-EKT2yVFws3FEdotDQoNsXTYL798+ogJqR2//CaGwx3p0/RvQIgfzEwp8nbgA6dMxCsn9KOQi7OtklzpnJMkjtA== - dependencies: - "@types/bn.js" "^4.11.4" - underscore "1.9.1" - web3-core "1.2.2" - web3-core-helpers "1.2.2" - web3-core-method "1.2.2" - web3-core-promievent "1.2.2" - web3-core-subscriptions "1.2.2" - web3-eth-abi "1.2.2" - web3-utils "1.2.2" - -web3-eth-contract@1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.2.6.tgz#39111543960035ed94c597a239cf5aa1da796741" - integrity sha512-ak4xbHIhWgsbdPCkSN+HnQc1SH4c856y7Ly+S57J/DQVzhFZemK5HvWdpwadJrQTcHET3ZeId1vq3kmW7UYodw== - dependencies: - "@types/bn.js" "^4.11.4" - underscore "1.9.1" - web3-core "1.2.6" - web3-core-helpers "1.2.6" - web3-core-method "1.2.6" - web3-core-promievent "1.2.6" - web3-core-subscriptions "1.2.6" - web3-eth-abi "1.2.6" - web3-utils "1.2.6" - -web3-eth-ens@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.10.0.tgz#96a676524e0b580c87913f557a13ed810cf91cd9" - integrity sha512-3hpGgzX3qjgxNAmqdrC2YUQMTfnZbs4GeLEmy8aCWziVwogbuqQZ+Gzdfrym45eOZodk+lmXyLuAdqkNlvkc1g== - dependencies: - content-hash "^2.5.2" - eth-ens-namehash "2.0.8" - web3-core "1.10.0" - web3-core-helpers "1.10.0" - web3-core-promievent "1.10.0" - web3-eth-abi "1.10.0" - web3-eth-contract "1.10.0" - web3-utils "1.10.0" - -web3-eth-ens@1.10.4: - version "1.10.4" - resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.10.4.tgz#3d991adac52bc8e598f1f1b8528337fa6291004c" - integrity sha512-LLrvxuFeVooRVZ9e5T6OWKVflHPFgrVjJ/jtisRWcmI7KN/b64+D/wJzXqgmp6CNsMQcE7rpmf4CQmJCrTdsgg== - dependencies: - content-hash "^2.5.2" - eth-ens-namehash "2.0.8" - web3-core "1.10.4" - web3-core-helpers "1.10.4" - web3-core-promievent "1.10.4" - web3-eth-abi "1.10.4" - web3-eth-contract "1.10.4" - web3-utils "1.10.4" - -web3-eth-ens@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.2.1.tgz#a0e52eee68c42a8b9865ceb04e5fb022c2d971d5" - integrity sha512-lhP1kFhqZr2nnbu3CGIFFrAnNxk2veXpOXBY48Tub37RtobDyHijHgrj+xTh+mFiPokyrapVjpFsbGa+Xzye4Q== - dependencies: - eth-ens-namehash "2.0.8" - underscore "1.9.1" - web3-core "1.2.1" - web3-core-helpers "1.2.1" - web3-core-promievent "1.2.1" - web3-eth-abi "1.2.1" - web3-eth-contract "1.2.1" - web3-utils "1.2.1" - -web3-eth-ens@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.2.11.tgz#26d4d7f16d6cbcfff918e39832b939edc3162532" - integrity sha512-dbW7dXP6HqT1EAPvnniZVnmw6TmQEKF6/1KgAxbo8iBBYrVTMDGFQUUnZ+C4VETGrwwaqtX4L9d/FrQhZ6SUiA== - dependencies: - content-hash "^2.5.2" - eth-ens-namehash "2.0.8" - underscore "1.9.1" - web3-core "1.2.11" - web3-core-helpers "1.2.11" - web3-core-promievent "1.2.11" - web3-eth-abi "1.2.11" - web3-eth-contract "1.2.11" - web3-utils "1.2.11" - -web3-eth-ens@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.2.2.tgz#0a4abed1d4cbdacbf5e1ab06e502d806d1192bc6" - integrity sha512-CFjkr2HnuyMoMFBoNUWojyguD4Ef+NkyovcnUc/iAb9GP4LHohKrODG4pl76R5u61TkJGobC2ij6TyibtsyVYg== - dependencies: - eth-ens-namehash "2.0.8" - underscore "1.9.1" - web3-core "1.2.2" - web3-core-helpers "1.2.2" - web3-core-promievent "1.2.2" - web3-eth-abi "1.2.2" - web3-eth-contract "1.2.2" - web3-utils "1.2.2" - -web3-eth-ens@1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.2.6.tgz#bf86a624c4c72bc59913c2345180d3ea947e110d" - integrity sha512-8UEqt6fqR/dji/jBGPFAyBs16OJjwi0t2dPWXPyGXmty/fH+osnXwWXE4HRUyj4xuafiM5P1YkXMsPhKEadjiw== - dependencies: - eth-ens-namehash "2.0.8" - underscore "1.9.1" - web3-core "1.2.6" - web3-core-helpers "1.2.6" - web3-core-promievent "1.2.6" - web3-eth-abi "1.2.6" - web3-eth-contract "1.2.6" - web3-utils "1.2.6" - -web3-eth-iban@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.10.0.tgz#5a46646401965b0f09a4f58e7248c8a8cd22538a" - integrity sha512-0l+SP3IGhInw7Q20LY3IVafYEuufo4Dn75jAHT7c2aDJsIolvf2Lc6ugHkBajlwUneGfbRQs/ccYPQ9JeMUbrg== - dependencies: - bn.js "^5.2.1" - web3-utils "1.10.0" - -web3-eth-iban@1.10.4: - version "1.10.4" - resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.10.4.tgz#bc61b4a1930d19b1df8762c606d669902558e54d" - integrity sha512-0gE5iNmOkmtBmbKH2aTodeompnNE8jEyvwFJ6s/AF6jkw9ky9Op9cqfzS56AYAbrqEFuClsqB/AoRves7LDELw== - dependencies: - bn.js "^5.2.1" - web3-utils "1.10.4" - -web3-eth-iban@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.2.1.tgz#2c3801718946bea24e9296993a975c80b5acf880" - integrity sha512-9gkr4QPl1jCU+wkgmZ8EwODVO3ovVj6d6JKMos52ggdT2YCmlfvFVF6wlGLwi0VvNa/p+0BjJzaqxnnG/JewjQ== - dependencies: - bn.js "4.11.8" - web3-utils "1.2.1" - -web3-eth-iban@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.2.11.tgz#f5f73298305bc7392e2f188bf38a7362b42144ef" - integrity sha512-ozuVlZ5jwFC2hJY4+fH9pIcuH1xP0HEFhtWsR69u9uDIANHLPQQtWYmdj7xQ3p2YT4bQLq/axKhZi7EZVetmxQ== - dependencies: - bn.js "^4.11.9" - web3-utils "1.2.11" - -web3-eth-iban@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.2.2.tgz#76bec73bad214df7c4192388979a59fc98b96c5a" - integrity sha512-gxKXBoUhaTFHr0vJB/5sd4i8ejF/7gIsbM/VvemHT3tF5smnmY6hcwSMmn7sl5Gs+83XVb/BngnnGkf+I/rsrQ== - dependencies: - bn.js "4.11.8" - web3-utils "1.2.2" - -web3-eth-iban@1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.2.6.tgz#0b22191fd1aa6e27f7ef0820df75820bfb4ed46b" - integrity sha512-TPMc3BW9Iso7H+9w+ytbqHK9wgOmtocyCD3PaAe5Eie50KQ/j7ThA60dGJnxItVo6yyRv5pZAYxPVob9x/fJlg== - dependencies: - bn.js "4.11.8" - web3-utils "1.2.6" - -web3-eth-personal@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.10.0.tgz#94d525f7a29050a0c2a12032df150ac5ea633071" - integrity sha512-anseKn98w/d703eWq52uNuZi7GhQeVjTC5/svrBWEKob0WZ5kPdo+EZoFN0sp5a5ubbrk/E0xSl1/M5yORMtpg== - dependencies: - "@types/node" "^12.12.6" - web3-core "1.10.0" - web3-core-helpers "1.10.0" - web3-core-method "1.10.0" - web3-net "1.10.0" - web3-utils "1.10.0" - -web3-eth-personal@1.10.4: - version "1.10.4" - resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.10.4.tgz#e2ee920f47e84848288e03442659cdbb2c4deea2" - integrity sha512-BRa/hs6jU1hKHz+AC/YkM71RP3f0Yci1dPk4paOic53R4ZZG4MgwKRkJhgt3/GPuPliwS46f/i5A7fEGBT4F9w== - dependencies: - "@types/node" "^12.12.6" - web3-core "1.10.4" - web3-core-helpers "1.10.4" - web3-core-method "1.10.4" - web3-net "1.10.4" - web3-utils "1.10.4" - -web3-eth-personal@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.2.1.tgz#244e9911b7b482dc17c02f23a061a627c6e47faf" - integrity sha512-RNDVSiaSoY4aIp8+Hc7z+X72H7lMb3fmAChuSBADoEc7DsJrY/d0R5qQDK9g9t2BO8oxgLrLNyBP/9ub2Hc6Bg== - dependencies: - web3-core "1.2.1" - web3-core-helpers "1.2.1" - web3-core-method "1.2.1" - web3-net "1.2.1" - web3-utils "1.2.1" - -web3-eth-personal@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.2.11.tgz#a38b3942a1d87a62070ce0622a941553c3d5aa70" - integrity sha512-42IzUtKq9iHZ8K9VN0vAI50iSU9tOA1V7XU2BhF/tb7We2iKBVdkley2fg26TxlOcKNEHm7o6HRtiiFsVK4Ifw== - dependencies: - "@types/node" "^12.12.6" - web3-core "1.2.11" - web3-core-helpers "1.2.11" - web3-core-method "1.2.11" - web3-net "1.2.11" - web3-utils "1.2.11" - -web3-eth-personal@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.2.2.tgz#eee1c86a8132fa16b5e34c6d421ca92e684f0be6" - integrity sha512-4w+GLvTlFqW3+q4xDUXvCEMU7kRZ+xm/iJC8gm1Li1nXxwwFbs+Y+KBK6ZYtoN1qqAnHR+plYpIoVo27ixI5Rg== - dependencies: - "@types/node" "^12.6.1" - web3-core "1.2.2" - web3-core-helpers "1.2.2" - web3-core-method "1.2.2" - web3-net "1.2.2" - web3-utils "1.2.2" - -web3-eth-personal@1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.2.6.tgz#47a0a0657ec04dd77f95451a6869d4751d324b6b" - integrity sha512-T2NUkh1plY8d7wePXSoHnaiKOd8dLNFaQfgBl9JHU6S7IJrG9jnYD9bVxLEgRUfHs9gKf9tQpDf7AcPFdq/A8g== - dependencies: - "@types/node" "^12.6.1" - web3-core "1.2.6" - web3-core-helpers "1.2.6" - web3-core-method "1.2.6" - web3-net "1.2.6" - web3-utils "1.2.6" - -web3-eth@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.10.0.tgz#38b905e2759697c9624ab080cfcf4e6c60b3a6cf" - integrity sha512-Z5vT6slNMLPKuwRyKGbqeGYC87OAy8bOblaqRTgg94CXcn/mmqU7iPIlG4506YdcdK3x6cfEDG7B6w+jRxypKA== - dependencies: - web3-core "1.10.0" - web3-core-helpers "1.10.0" - web3-core-method "1.10.0" - web3-core-subscriptions "1.10.0" - web3-eth-abi "1.10.0" - web3-eth-accounts "1.10.0" - web3-eth-contract "1.10.0" - web3-eth-ens "1.10.0" - web3-eth-iban "1.10.0" - web3-eth-personal "1.10.0" - web3-net "1.10.0" - web3-utils "1.10.0" - -web3-eth@1.10.4: - version "1.10.4" - resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.10.4.tgz#3a908c635cb5d935bd30473e452f3bd7f2ee66a5" - integrity sha512-Sql2kYKmgt+T/cgvg7b9ce24uLS7xbFrxE4kuuor1zSCGrjhTJ5rRNG8gTJUkAJGKJc7KgnWmgW+cOfMBPUDSA== - dependencies: - web3-core "1.10.4" - web3-core-helpers "1.10.4" - web3-core-method "1.10.4" - web3-core-subscriptions "1.10.4" - web3-eth-abi "1.10.4" - web3-eth-accounts "1.10.4" - web3-eth-contract "1.10.4" - web3-eth-ens "1.10.4" - web3-eth-iban "1.10.4" - web3-eth-personal "1.10.4" - web3-net "1.10.4" - web3-utils "1.10.4" - -web3-eth@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.2.1.tgz#b9989e2557c73a9e8ffdc107c6dafbe72c79c1b0" - integrity sha512-/2xly4Yry5FW1i+uygPjhfvgUP/MS/Dk+PDqmzp5M88tS86A+j8BzKc23GrlA8sgGs0645cpZK/999LpEF5UdA== - dependencies: - underscore "1.9.1" - web3-core "1.2.1" - web3-core-helpers "1.2.1" - web3-core-method "1.2.1" - web3-core-subscriptions "1.2.1" - web3-eth-abi "1.2.1" - web3-eth-accounts "1.2.1" - web3-eth-contract "1.2.1" - web3-eth-ens "1.2.1" - web3-eth-iban "1.2.1" - web3-eth-personal "1.2.1" - web3-net "1.2.1" - web3-utils "1.2.1" - -web3-eth@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.2.11.tgz#4c81fcb6285b8caf544058fba3ae802968fdc793" - integrity sha512-REvxW1wJ58AgHPcXPJOL49d1K/dPmuw4LjPLBPStOVkQjzDTVmJEIsiLwn2YeuNDd4pfakBwT8L3bz1G1/wVsQ== - dependencies: - underscore "1.9.1" - web3-core "1.2.11" - web3-core-helpers "1.2.11" - web3-core-method "1.2.11" - web3-core-subscriptions "1.2.11" - web3-eth-abi "1.2.11" - web3-eth-accounts "1.2.11" - web3-eth-contract "1.2.11" - web3-eth-ens "1.2.11" - web3-eth-iban "1.2.11" - web3-eth-personal "1.2.11" - web3-net "1.2.11" - web3-utils "1.2.11" - -web3-eth@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.2.2.tgz#65a1564634a23b990efd1655bf94ad513904286c" - integrity sha512-UXpC74mBQvZzd4b+baD4Ocp7g+BlwxhBHumy9seyE/LMIcMlePXwCKzxve9yReNpjaU16Mmyya6ZYlyiKKV8UA== - dependencies: - underscore "1.9.1" - web3-core "1.2.2" - web3-core-helpers "1.2.2" - web3-core-method "1.2.2" - web3-core-subscriptions "1.2.2" - web3-eth-abi "1.2.2" - web3-eth-accounts "1.2.2" - web3-eth-contract "1.2.2" - web3-eth-ens "1.2.2" - web3-eth-iban "1.2.2" - web3-eth-personal "1.2.2" - web3-net "1.2.2" - web3-utils "1.2.2" - -web3-eth@1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.2.6.tgz#15a8c65fdde0727872848cae506758d302d8d046" - integrity sha512-ROWlDPzh4QX6tlGGGlAK6X4kA2n0/cNj/4kb0nNVWkRouGmYO0R8k6s47YxYHvGiXt0s0++FUUv5vAbWovtUQw== - dependencies: - underscore "1.9.1" - web3-core "1.2.6" - web3-core-helpers "1.2.6" - web3-core-method "1.2.6" - web3-core-subscriptions "1.2.6" - web3-eth-abi "1.2.6" - web3-eth-accounts "1.2.6" - web3-eth-contract "1.2.6" - web3-eth-ens "1.2.6" - web3-eth-iban "1.2.6" - web3-eth-personal "1.2.6" - web3-net "1.2.6" - web3-utils "1.2.6" - -web3-net@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.10.0.tgz#be53e7f5dafd55e7c9013d49c505448b92c9c97b" - integrity sha512-NLH/N3IshYWASpxk4/18Ge6n60GEvWBVeM8inx2dmZJVmRI6SJIlUxbL8jySgiTn3MMZlhbdvrGo8fpUW7a1GA== - dependencies: - web3-core "1.10.0" - web3-core-method "1.10.0" - web3-utils "1.10.0" - -web3-net@1.10.4: - version "1.10.4" - resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.10.4.tgz#20e12c60e4477d4298979d8d5d66b9abf8e66a09" - integrity sha512-mKINnhOOnZ4koA+yV2OT5s5ztVjIx7IY9a03w6s+yao/BUn+Luuty0/keNemZxTr1E8Ehvtn28vbOtW7Ids+Ow== - dependencies: - web3-core "1.10.4" - web3-core-method "1.10.4" - web3-utils "1.10.4" - -web3-net@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.2.1.tgz#edd249503315dd5ab4fa00220f6509d95bb7ab10" - integrity sha512-Yt1Bs7WgnLESPe0rri/ZoPWzSy55ovioaP35w1KZydrNtQ5Yq4WcrAdhBzcOW7vAkIwrsLQsvA+hrOCy7mNauw== - dependencies: - web3-core "1.2.1" - web3-core-method "1.2.1" - web3-utils "1.2.1" - -web3-net@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.2.11.tgz#eda68ef25e5cdb64c96c39085cdb74669aabbe1b" - integrity sha512-sjrSDj0pTfZouR5BSTItCuZ5K/oZPVdVciPQ6981PPPIwJJkCMeVjD7I4zO3qDPCnBjBSbWvVnLdwqUBPtHxyg== - dependencies: - web3-core "1.2.11" - web3-core-method "1.2.11" - web3-utils "1.2.11" - -web3-net@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.2.2.tgz#5c3226ca72df7c591422440ce6f1203fd42ddad9" - integrity sha512-K07j2DXq0x4UOJgae65rWZKraOznhk8v5EGSTdFqASTx7vWE/m+NqBijBYGEsQY1lSMlVaAY9UEQlcXK5HzXTw== - dependencies: - web3-core "1.2.2" - web3-core-method "1.2.2" - web3-utils "1.2.2" - -web3-net@1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.2.6.tgz#035ca0fbe55282fda848ca17ebb4c8966147e5ea" - integrity sha512-hsNHAPddrhgjWLmbESW0KxJi2GnthPcow0Sqpnf4oB6+/+ZnQHU9OsIyHb83bnC1OmunrK2vf9Ye2mLPdFIu3A== - dependencies: - web3-core "1.2.6" - web3-core-method "1.2.6" - web3-utils "1.2.6" - -web3-provider-engine@14.2.1: - version "14.2.1" - resolved "https://registry.yarnpkg.com/web3-provider-engine/-/web3-provider-engine-14.2.1.tgz#ef351578797bf170e08d529cb5b02f8751329b95" - integrity sha512-iSv31h2qXkr9vrL6UZDm4leZMc32SjWJFGOp/D92JXfcEboCqraZyuExDkpxKw8ziTufXieNM7LSXNHzszYdJw== - dependencies: - async "^2.5.0" - backoff "^2.5.0" - clone "^2.0.0" - cross-fetch "^2.1.0" - eth-block-tracker "^3.0.0" - eth-json-rpc-infura "^3.1.0" - eth-sig-util "^1.4.2" - ethereumjs-block "^1.2.2" - ethereumjs-tx "^1.2.0" - ethereumjs-util "^5.1.5" - ethereumjs-vm "^2.3.4" - json-rpc-error "^2.0.0" - json-stable-stringify "^1.0.1" - promise-to-callback "^1.0.0" - readable-stream "^2.2.9" - request "^2.85.0" - semaphore "^1.0.3" - ws "^5.1.1" - xhr "^2.2.0" - xtend "^4.0.1" - -web3-providers-http@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.10.0.tgz#864fa48675e7918c9a4374e5f664b32c09d0151b" - integrity sha512-eNr965YB8a9mLiNrkjAWNAPXgmQWfpBfkkn7tpEFlghfww0u3I0tktMZiaToJVcL2+Xq+81cxbkpeWJ5XQDwOA== - dependencies: - abortcontroller-polyfill "^1.7.3" - cross-fetch "^3.1.4" - es6-promise "^4.2.8" - web3-core-helpers "1.10.0" - -web3-providers-http@1.10.4: - version "1.10.4" - resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.10.4.tgz#ca7aa58aeaf8123500c24ffe0595896319f830e8" - integrity sha512-m2P5Idc8hdiO0l60O6DSCPw0kw64Zgi0pMjbEFRmxKIck2Py57RQMu4bxvkxJwkF06SlGaEQF8rFZBmuX7aagQ== - dependencies: - abortcontroller-polyfill "^1.7.5" - cross-fetch "^4.0.0" - es6-promise "^4.2.8" - web3-core-helpers "1.10.4" - -web3-providers-http@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.2.1.tgz#c93ea003a42e7b894556f7e19dd3540f947f5013" - integrity sha512-BDtVUVolT9b3CAzeGVA/np1hhn7RPUZ6YYGB/sYky+GjeO311Yoq8SRDUSezU92x8yImSC2B+SMReGhd1zL+bQ== - dependencies: - web3-core-helpers "1.2.1" - xhr2-cookies "1.1.0" - -web3-providers-http@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.2.11.tgz#1cd03442c61670572d40e4dcdf1faff8bd91e7c6" - integrity sha512-psh4hYGb1+ijWywfwpB2cvvOIMISlR44F/rJtYkRmQ5jMvG4FOCPlQJPiHQZo+2cc3HbktvvSJzIhkWQJdmvrA== - dependencies: - web3-core-helpers "1.2.11" - xhr2-cookies "1.1.0" - -web3-providers-http@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.2.2.tgz#155e55c1d69f4c5cc0b411ede40dea3d06720956" - integrity sha512-BNZ7Hguy3eBszsarH5gqr9SIZNvqk9eKwqwmGH1LQS1FL3NdoOn7tgPPdddrXec4fL94CwgNk4rCU+OjjZRNDg== - dependencies: - web3-core-helpers "1.2.2" - xhr2-cookies "1.1.0" - -web3-providers-http@1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.2.6.tgz#3c7b1252751fb37e53b873fce9dbb6340f5e31d9" - integrity sha512-2+SaFCspb5f82QKuHB3nEPQOF9iSWxRf7c18fHtmnLNVkfG9SwLN1zh67bYn3tZGUdOI3gj8aX4Uhfpwx9Ezpw== - dependencies: - web3-core-helpers "1.2.6" - xhr2-cookies "1.1.0" - -web3-providers-ipc@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.10.0.tgz#9747c7a6aee96a51488e32fa7c636c3460b39889" - integrity sha512-OfXG1aWN8L1OUqppshzq8YISkWrYHaATW9H8eh0p89TlWMc1KZOL9vttBuaBEi96D/n0eYDn2trzt22bqHWfXA== - dependencies: - oboe "2.1.5" - web3-core-helpers "1.10.0" - -web3-providers-ipc@1.10.4: - version "1.10.4" - resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.10.4.tgz#2e03437909e4e7771d646ff05518efae44b783c3" - integrity sha512-YRF/bpQk9z3WwjT+A6FI/GmWRCASgd+gC0si7f9zbBWLXjwzYAKG73bQBaFRAHex1hl4CVcM5WUMaQXf3Opeuw== - dependencies: - oboe "2.1.5" - web3-core-helpers "1.10.4" - -web3-providers-ipc@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.2.1.tgz#017bfc687a8fc5398df2241eb98f135e3edd672c" - integrity sha512-oPEuOCwxVx8L4CPD0TUdnlOUZwGBSRKScCz/Ws2YHdr9Ium+whm+0NLmOZjkjQp5wovQbyBzNa6zJz1noFRvFA== - dependencies: - oboe "2.1.4" - underscore "1.9.1" - web3-core-helpers "1.2.1" - -web3-providers-ipc@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.2.11.tgz#d16d6c9be1be6e0b4f4536c4acc16b0f4f27ef21" - integrity sha512-yhc7Y/k8hBV/KlELxynWjJDzmgDEDjIjBzXK+e0rHBsYEhdCNdIH5Psa456c+l0qTEU2YzycF8VAjYpWfPnBpQ== - dependencies: - oboe "2.1.4" - underscore "1.9.1" - web3-core-helpers "1.2.11" - -web3-providers-ipc@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.2.2.tgz#c6d165a12bc68674b4cdd543ea18aec79cafc2e8" - integrity sha512-t97w3zi5Kn/LEWGA6D9qxoO0LBOG+lK2FjlEdCwDQatffB/+vYrzZ/CLYVQSoyFZAlsDoBasVoYSWZK1n39aHA== - dependencies: - oboe "2.1.4" - underscore "1.9.1" - web3-core-helpers "1.2.2" - -web3-providers-ipc@1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.2.6.tgz#adabab5ac66b3ff8a26c7dc97af3f1a6a7609701" - integrity sha512-b0Es+/GTZyk5FG3SgUDW+2/mBwJAXWt5LuppODptiOas8bB2khLjG6+Gm1K4uwOb+1NJGPt5mZZ8Wi7vibtQ+A== - dependencies: - oboe "2.1.4" - underscore "1.9.1" - web3-core-helpers "1.2.6" - -web3-providers-ws@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.10.0.tgz#cb0b87b94c4df965cdf486af3a8cd26daf3975e5" - integrity sha512-sK0fNcglW36yD5xjnjtSGBnEtf59cbw4vZzJ+CmOWIKGIR96mP5l684g0WD0Eo+f4NQc2anWWXG74lRc9OVMCQ== - dependencies: - eventemitter3 "4.0.4" - web3-core-helpers "1.10.0" - websocket "^1.0.32" - -web3-providers-ws@1.10.4: - version "1.10.4" - resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.10.4.tgz#55d0c3ba36c6a79d105f02e20a707eb3978e7f82" - integrity sha512-j3FBMifyuFFmUIPVQR4pj+t5ILhAexAui0opgcpu9R5LxQrLRUZxHSnU+YO25UycSOa/NAX8A+qkqZNpcFAlxA== - dependencies: - eventemitter3 "4.0.4" - web3-core-helpers "1.10.4" - websocket "^1.0.32" - -web3-providers-ws@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.2.1.tgz#2d941eaf3d5a8caa3214eff8dc16d96252b842cb" - integrity sha512-oqsQXzu+ejJACVHy864WwIyw+oB21nw/pI65/sD95Zi98+/HQzFfNcIFneF1NC4bVF3VNX4YHTNq2I2o97LAiA== - dependencies: - underscore "1.9.1" - web3-core-helpers "1.2.1" - websocket "github:web3-js/WebSocket-Node#polyfill/globalThis" - -web3-providers-ws@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.2.11.tgz#a1dfd6d9778d840561d9ec13dd453046451a96bb" - integrity sha512-ZxnjIY1Er8Ty+cE4migzr43zA/+72AF1myzsLaU5eVgdsfV7Jqx7Dix1hbevNZDKFlSoEyq/3j/jYalh3So1Zg== - dependencies: - eventemitter3 "4.0.4" - underscore "1.9.1" - web3-core-helpers "1.2.11" - websocket "^1.0.31" - -web3-providers-ws@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.2.2.tgz#d2c05c68598cea5ad3fa6ef076c3bcb3ca300d29" - integrity sha512-Wb1mrWTGMTXOpJkL0yGvL/WYLt8fUIXx8k/l52QB2IiKzvyd42dTWn4+j8IKXGSYYzOm7NMqv6nhA5VDk12VfA== - dependencies: - underscore "1.9.1" - web3-core-helpers "1.2.2" - websocket "github:web3-js/WebSocket-Node#polyfill/globalThis" - -web3-providers-ws@1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.2.6.tgz#3cecc49f7c99f07a75076d3c54247050bc4f7e11" - integrity sha512-20waSYX+gb5M5yKhug5FIwxBBvkKzlJH7sK6XEgdOx6BZ9YYamLmvg9wcRVtnSZO8hV/3cWenO/tRtTrHVvIgQ== - dependencies: - "@web3-js/websocket" "^1.0.29" - underscore "1.9.1" - web3-core-helpers "1.2.6" - -web3-shh@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.10.0.tgz#c2979b87e0f67a7fef2ce9ee853bd7bfbe9b79a8" - integrity sha512-uNUUuNsO2AjX41GJARV9zJibs11eq6HtOe6Wr0FtRUcj8SN6nHeYIzwstAvJ4fXA53gRqFMTxdntHEt9aXVjpg== - dependencies: - web3-core "1.10.0" - web3-core-method "1.10.0" - web3-core-subscriptions "1.10.0" - web3-net "1.10.0" - -web3-shh@1.10.4: - version "1.10.4" - resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.10.4.tgz#9852d6f3d05678e31e49235a60fea10ca7a9e21d" - integrity sha512-cOH6iFFM71lCNwSQrC3niqDXagMqrdfFW85hC9PFUrAr3PUrIem8TNstTc3xna2bwZeWG6OBy99xSIhBvyIACw== - dependencies: - web3-core "1.10.4" - web3-core-method "1.10.4" - web3-core-subscriptions "1.10.4" - web3-net "1.10.4" - -web3-shh@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.2.1.tgz#4460e3c1e07faf73ddec24ccd00da46f89152b0c" - integrity sha512-/3Cl04nza5kuFn25bV3FJWa0s3Vafr5BlT933h26xovQ6HIIz61LmvNQlvX1AhFL+SNJOTcQmK1SM59vcyC8bA== - dependencies: - web3-core "1.2.1" - web3-core-method "1.2.1" - web3-core-subscriptions "1.2.1" - web3-net "1.2.1" - -web3-shh@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.2.11.tgz#f5d086f9621c9a47e98d438010385b5f059fd88f" - integrity sha512-B3OrO3oG1L+bv3E1sTwCx66injW1A8hhwpknDUbV+sw3fehFazA06z9SGXUefuFI1kVs4q2vRi0n4oCcI4dZDg== - dependencies: - web3-core "1.2.11" - web3-core-method "1.2.11" - web3-core-subscriptions "1.2.11" - web3-net "1.2.11" - -web3-shh@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.2.2.tgz#44ed998f2a6ba0ec5cb9d455184a0f647826a49c" - integrity sha512-og258NPhlBn8yYrDWjoWBBb6zo1OlBgoWGT+LL5/LPqRbjPe09hlOYHgscAAr9zZGtohTOty7RrxYw6Z6oDWCg== - dependencies: - web3-core "1.2.2" - web3-core-method "1.2.2" - web3-core-subscriptions "1.2.2" - web3-net "1.2.2" - -web3-shh@1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.2.6.tgz#2492616da4cac32d4c7534b890f43bac63190c14" - integrity sha512-rouWyOOM6YMbLQd65grpj8BBezQfgNeRRX+cGyW4xsn6Xgu+B73Zvr6OtA/ftJwwa9bqHGpnLrrLMeWyy4YLUw== - dependencies: - web3-core "1.2.6" - web3-core-method "1.2.6" - web3-core-subscriptions "1.2.6" - web3-net "1.2.6" - -web3-utils@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.10.0.tgz#ca4c1b431a765c14ac7f773e92e0fd9377ccf578" - integrity sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg== - dependencies: - bn.js "^5.2.1" - ethereum-bloom-filters "^1.0.6" - ethereumjs-util "^7.1.0" - ethjs-unit "0.1.6" - number-to-bn "1.7.0" - randombytes "^2.1.0" - utf8 "3.0.0" - -web3-utils@1.10.4, web3-utils@^1.0.0-beta.31, web3-utils@^1.2.5, web3-utils@^1.3.6: - version "1.10.4" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.10.4.tgz#0daee7d6841641655d8b3726baf33b08eda1cbec" - integrity sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A== - dependencies: - "@ethereumjs/util" "^8.1.0" - bn.js "^5.2.1" - ethereum-bloom-filters "^1.0.6" - ethereum-cryptography "^2.1.2" - ethjs-unit "0.1.6" - number-to-bn "1.7.0" - randombytes "^2.1.0" - utf8 "3.0.0" - -web3-utils@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.1.tgz#21466e38291551de0ab34558de21512ac4274534" - integrity sha512-Mrcn3l58L+yCKz3zBryM6JZpNruWuT0OCbag8w+reeNROSGVlXzUQkU+gtAwc9JCZ7tKUyg67+2YUGqUjVcyBA== - dependencies: - bn.js "4.11.8" - eth-lib "0.2.7" - ethjs-unit "0.1.6" - number-to-bn "1.7.0" - randomhex "0.1.5" - underscore "1.9.1" - utf8 "3.0.0" - -web3-utils@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.11.tgz#af1942aead3fb166ae851a985bed8ef2c2d95a82" - integrity sha512-3Tq09izhD+ThqHEaWYX4VOT7dNPdZiO+c/1QMA0s5X2lDFKK/xHJb7cyTRRVzN2LvlHbR7baS1tmQhSua51TcQ== - dependencies: - bn.js "^4.11.9" - eth-lib "0.2.8" - ethereum-bloom-filters "^1.0.6" - ethjs-unit "0.1.6" - number-to-bn "1.7.0" - randombytes "^2.1.0" - underscore "1.9.1" - utf8 "3.0.0" - -web3-utils@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.2.tgz#b53a08c40d2c3f31d3c4a28e7d749405df99c8c0" - integrity sha512-joF+s3243TY5cL7Z7y4h1JsJpUCf/kmFmj+eJar7Y2yNIGVcW961VyrAms75tjUysSuHaUQ3eQXjBEUJueT52A== - dependencies: - bn.js "4.11.8" - eth-lib "0.2.7" - ethereum-bloom-filters "^1.0.6" - ethjs-unit "0.1.6" - number-to-bn "1.7.0" - randombytes "^2.1.0" - underscore "1.9.1" - utf8 "3.0.0" - -web3-utils@1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.6.tgz#b9a25432da00976457fcc1094c4af8ac6d486db9" - integrity sha512-8/HnqG/l7dGmKMgEL9JeKPTtjScxOePTzopv5aaKFExPfaBrYRkgoMqhoowCiAl/s16QaTn4DoIF1QC4YsT7Mg== - dependencies: - bn.js "4.11.8" - eth-lib "0.2.7" - ethereum-bloom-filters "^1.0.6" - ethjs-unit "0.1.6" - number-to-bn "1.7.0" - randombytes "^2.1.0" - underscore "1.9.1" - utf8 "3.0.0" - -web3@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/web3/-/web3-1.10.0.tgz#2fde0009f59aa756c93e07ea2a7f3ab971091274" - integrity sha512-YfKY9wSkGcM8seO+daR89oVTcbu18NsVfvOngzqMYGUU0pPSQmE57qQDvQzUeoIOHAnXEBNzrhjQJmm8ER0rng== - dependencies: - web3-bzz "1.10.0" - web3-core "1.10.0" - web3-eth "1.10.0" - web3-eth-personal "1.10.0" - web3-net "1.10.0" - web3-shh "1.10.0" - web3-utils "1.10.0" - -web3@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3/-/web3-1.2.1.tgz#5d8158bcca47838ab8c2b784a2dee4c3ceb4179b" - integrity sha512-nNMzeCK0agb5i/oTWNdQ1aGtwYfXzHottFP2Dz0oGIzavPMGSKyVlr8ibVb1yK5sJBjrWVnTdGaOC2zKDFuFRw== - dependencies: - web3-bzz "1.2.1" - web3-core "1.2.1" - web3-eth "1.2.1" - web3-eth-personal "1.2.1" - web3-net "1.2.1" - web3-shh "1.2.1" - web3-utils "1.2.1" - -web3@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3/-/web3-1.2.11.tgz#50f458b2e8b11aa37302071c170ed61cff332975" - integrity sha512-mjQ8HeU41G6hgOYm1pmeH0mRAeNKJGnJEUzDMoerkpw7QUQT4exVREgF1MYPvL/z6vAshOXei25LE/t/Bxl8yQ== - dependencies: - web3-bzz "1.2.11" - web3-core "1.2.11" - web3-eth "1.2.11" - web3-eth-personal "1.2.11" - web3-net "1.2.11" - web3-shh "1.2.11" - web3-utils "1.2.11" - -web3@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3/-/web3-1.2.2.tgz#b1b8b69aafdf94cbaeadbb68a8aa1df2ef266aec" - integrity sha512-/ChbmB6qZpfGx6eNpczt5YSUBHEA5V2+iUCbn85EVb3Zv6FVxrOo5Tv7Lw0gE2tW7EEjASbCyp3mZeiZaCCngg== - dependencies: - "@types/node" "^12.6.1" - web3-bzz "1.2.2" - web3-core "1.2.2" - web3-eth "1.2.2" - web3-eth-personal "1.2.2" - web3-net "1.2.2" - web3-shh "1.2.2" - web3-utils "1.2.2" - -web3@=1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/web3/-/web3-1.2.6.tgz#c497dcb14cdd8d6d9fb6b445b3b68ff83f8ccf68" - integrity sha512-tpu9fLIComgxGrFsD8LUtA4s4aCZk7px8UfcdEy6kS2uDi/ZfR07KJqpXZMij7Jvlq+cQrTAhsPSiBVvoMaivA== - dependencies: - "@types/node" "^12.6.1" - web3-bzz "1.2.6" - web3-core "1.2.6" - web3-eth "1.2.6" - web3-eth-personal "1.2.6" - web3-net "1.2.6" - web3-shh "1.2.6" - web3-utils "1.2.6" - -web3@^1.2.4, web3@^1.2.5, web3@^1.2.9, web3@^1.6.0: - version "1.10.4" - resolved "https://registry.yarnpkg.com/web3/-/web3-1.10.4.tgz#5d5e59b976eaf758b060fe1a296da5fe87bdc79c" - integrity sha512-kgJvQZjkmjOEKimx/tJQsqWfRDPTTcBfYPa9XletxuHLpHcXdx67w8EFn5AW3eVxCutE9dTVHgGa9VYe8vgsEA== - dependencies: - web3-bzz "1.10.4" - web3-core "1.10.4" - web3-eth "1.10.4" - web3-eth-personal "1.10.4" - web3-net "1.10.4" - web3-shh "1.10.4" - web3-utils "1.10.4" - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -websocket-driver@>=0.5.1: - version "0.7.4" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" - integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== - dependencies: - http-parser-js ">=0.5.1" - safe-buffer ">=5.1.0" - websocket-extensions ">=0.1.1" - -websocket-extensions@>=0.1.1: - version "0.1.4" - resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" - integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== - -websocket@1.0.32: - version "1.0.32" - resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.32.tgz#1f16ddab3a21a2d929dec1687ab21cfdc6d3dbb1" - integrity sha512-i4yhcllSP4wrpoPMU2N0TQ/q0O94LRG/eUQjEAamRltjQ1oT1PFFKOG4i877OlJgCG8rw6LrrowJp+TYCEWF7Q== - dependencies: - bufferutil "^4.0.1" - debug "^2.2.0" - es5-ext "^0.10.50" - typedarray-to-buffer "^3.1.5" - utf-8-validate "^5.0.2" - yaeti "^0.0.6" - -websocket@^1.0.31, websocket@^1.0.32: - version "1.0.35" - resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.35.tgz#374197207d7d4cc4c36cbf8a1bb886ee52a07885" - integrity sha512-/REy6amwPZl44DDzvRCkaI1q1bIiQB0mEFQLUrhz3z2EK91cp3n72rAjUlrTP0zV22HJIUOVHQGPxhFRjxjt+Q== - dependencies: - bufferutil "^4.0.1" - debug "^2.2.0" - es5-ext "^0.10.63" - typedarray-to-buffer "^3.1.5" - utf-8-validate "^5.0.2" - yaeti "^0.0.6" - -"websocket@github:web3-js/WebSocket-Node#polyfill/globalThis": - version "1.0.29" - resolved "https://codeload.github.com/web3-js/WebSocket-Node/tar.gz/ef5ea2f41daf4a2113b80c9223df884b4d56c400" - dependencies: - debug "^2.2.0" - es5-ext "^0.10.50" - nan "^2.14.0" - typedarray-to-buffer "^3.1.5" - yaeti "^0.0.6" - -whatwg-encoding@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz#d0f4ef769905d426e1688f3e34381a99b60b76e5" - integrity sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ== - dependencies: - iconv-lite "0.6.3" - -whatwg-fetch@2.0.4, whatwg-fetch@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" - integrity sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng== - -whatwg-mimetype@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz#bc1bf94a985dc50388d54a9258ac405c3ca2fc0a" - integrity sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - -which-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" - integrity sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ== - -which-module@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" - integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== - -which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.2: - version "1.1.15" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" - integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.2" - -which@^1.1.1, which@^1.2.9, which@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -widest-line@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" - integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== - dependencies: - string-width "^4.0.0" - -window-size@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" - integrity sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw== - -word-wrap@~1.2.3: - version "1.2.5" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" - integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== - -wordwrap@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== - -workerpool@^6.5.1: - version "6.5.1" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.5.1.tgz#060f73b39d0caf97c6db64da004cd01b4c099544" - integrity sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA== - -wrap-ansi@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" - integrity sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw== - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -write-file-atomic@^2.0.0: - version "2.4.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" - integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== - dependencies: - graceful-fs "^4.1.11" - imurmurhash "^0.1.4" - signal-exit "^3.0.2" - -write-file-atomic@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" - integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== - dependencies: - imurmurhash "^0.1.4" - is-typedarray "^1.0.0" - signal-exit "^3.0.2" - typedarray-to-buffer "^3.1.5" - -write@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" - integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== - dependencies: - mkdirp "^0.5.1" - -ws@7.4.6: - version "7.4.6" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" - integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== - -ws@8.17.1: - version "8.17.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" - integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== - -ws@^3.0.0: - version "3.3.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" - integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA== - dependencies: - async-limiter "~1.0.0" - safe-buffer "~5.1.0" - ultron "~1.1.0" - -ws@^5.1.1: - version "5.2.4" - resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.4.tgz#c7bea9f1cfb5f410de50e70e82662e562113f9a7" - integrity sha512-fFCejsuC8f9kOSu9FYaOw8CdO68O3h5v0lg4p74o8JqWpwTf9tniOD+nOB78aWoVSS6WptVUmDrp/KPsMVBWFQ== - dependencies: - async-limiter "~1.0.0" - -ws@^7.4.6: - version "7.5.10" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" - integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== - -xdg-basedir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" - integrity sha512-1Dly4xqlulvPD3fZUQJLY+FUIeqN3N2MM3uqe4rCJftAvOjFa3jFGfctOgluGx4ahPbUCsZkmJILiP0Vi4T6lQ== - -xdg-basedir@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" - integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== - -xhr-request-promise@^0.1.2: - version "0.1.3" - resolved "https://registry.yarnpkg.com/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz#2d5f4b16d8c6c893be97f1a62b0ed4cf3ca5f96c" - integrity sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg== - dependencies: - xhr-request "^1.1.0" - -xhr-request@^1.0.1, xhr-request@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/xhr-request/-/xhr-request-1.1.0.tgz#f4a7c1868b9f198723444d82dcae317643f2e2ed" - integrity sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA== - dependencies: - buffer-to-arraybuffer "^0.0.5" - object-assign "^4.1.1" - query-string "^5.0.1" - simple-get "^2.7.0" - timed-out "^4.0.1" - url-set-query "^1.0.0" - xhr "^2.0.4" - -xhr2-cookies@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz#7d77449d0999197f155cb73b23df72505ed89d48" - integrity sha512-hjXUA6q+jl/bd8ADHcVfFsSPIf+tyLIjuO9TwJC9WI6JP2zKcS7C+p56I9kCLLsaCiNT035iYvEUUzdEFj/8+g== - dependencies: - cookiejar "^2.1.1" - -xhr@^2.0.4, xhr@^2.2.0, xhr@^2.3.3: - version "2.6.0" - resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.6.0.tgz#b69d4395e792b4173d6b7df077f0fc5e4e2b249d" - integrity sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA== - dependencies: - global "~4.4.0" - is-function "^1.0.1" - parse-headers "^2.0.0" - xtend "^4.0.0" - -xmlhttprequest@1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc" - integrity sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA== - -xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0, xtend@~4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -xtend@~2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b" - integrity sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ== - dependencies: - object-keys "~0.4.0" - -y18n@^3.2.1: - version "3.2.2" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696" - integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yaeti@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577" - integrity sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug== - -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== - -yallist@^3.0.0, yallist@^3.0.2, yallist@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yaml@^1.10.2: - version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== - -yargs-parser@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-2.4.1.tgz#85568de3cf150ff49fa51825f03a8c880ddcc5c4" - integrity sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA== - dependencies: - camelcase "^3.0.0" - lodash.assign "^4.0.6" - -yargs-parser@^20.2.2, yargs-parser@^20.2.9: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs-parser@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950" - integrity sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ== - dependencies: - camelcase "^4.1.0" - -yargs-unparser@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" - integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== - dependencies: - camelcase "^6.0.0" - decamelize "^4.0.0" - flat "^5.0.2" - is-plain-obj "^2.1.0" - -yargs@^10.0.3: - version "10.1.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.1.2.tgz#454d074c2b16a51a43e2fb7807e4f9de69ccb5c5" - integrity sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig== - dependencies: - cliui "^4.0.0" - decamelize "^1.1.1" - find-up "^2.1.0" - get-caller-file "^1.0.1" - os-locale "^2.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1" - yargs-parser "^8.1.0" - -yargs@^16.2.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -yargs@^17.7.2: - version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - -yargs@^4.7.1: - version "4.8.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0" - integrity sha512-LqodLrnIDM3IFT+Hf/5sxBnEGECrfdC1uIbgZeJmESCSo4HoCAaKEus8MylXHAkdacGc0ye+Qa+dpkuom8uVYA== - dependencies: - cliui "^3.2.0" - decamelize "^1.1.1" - get-caller-file "^1.0.1" - lodash.assign "^4.0.3" - os-locale "^1.4.0" - read-pkg-up "^1.0.1" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^1.0.1" - which-module "^1.0.0" - window-size "^0.2.0" - y18n "^3.2.1" - yargs-parser "^2.4.1" - -yauzl@^2.4.2: - version "2.10.0" - resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" - integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== - dependencies: - buffer-crc32 "~0.2.3" - fd-slicer "~1.1.0" - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== diff --git a/evm/hardhat.config.ts b/evm/hardhat.config.ts new file mode 100644 index 00000000..4d414895 --- /dev/null +++ b/evm/hardhat.config.ts @@ -0,0 +1,311 @@ +import "@nomicfoundation/hardhat-chai-matchers" +import "@nomicfoundation/hardhat-ethers" +import "@nomicfoundation/hardhat-verify" +import "@openzeppelin/hardhat-upgrades" +import "@typechain/hardhat" +import * as dotenv from "dotenv" +import "hardhat-storage-layout" +import type { HardhatUserConfig } from "hardhat/config" +import "solidity-coverage" +import "./src/eNear/scripts" +import { task } from "hardhat/config" +import type { HttpNetworkUserConfig } from "hardhat/types" +import type { OmniBridge, OmniBridgeWormhole } from "./typechain-types" +import { deriveEVMAddress, mpcRootPublicKeys } from "./utils/kdf" + +import "hardhat/types/config" +import assert from "node:assert" +import * as fs from "node:fs" + +declare module "hardhat/types/config" { + interface HttpNetworkUserConfig { + omniChainId: number + wormholeAddress?: string + } +} + +dotenv.config() + +const INFURA_API_KEY = process.env.INFURA_API_KEY +const EVM_PRIVATE_KEY = process.env.EVM_PRIVATE_KEY || "11".repeat(32) +const ETHERSCAN_API_KEY = process.env.ETHERSCAN_API_KEY || "" +const ARBISCAN_API_KEY = process.env.ARBISCAN_API_KEY || "" +const BASESCAN_API_KEY = process.env.BASESCAN_API_KEY || "" + +task("set-metadata-ft", "Set metadata for NEP-141 tokens on the Ethereum side") + .addParam("nearTokenAccount", "Near account id of the token") + .addParam("name", "The new name of the token") + .addParam("symbol", "The new symbol of the token") + .addParam("factory", "The address of the factory contract on Ethereum") + .setAction(async (taskArgs, hre) => { + const { ethers } = hre + const OmniBridgeContract = await ethers.getContractFactory("OmniBridge") + const OmniBridge = OmniBridgeContract.attach(taskArgs.factory) as OmniBridge + await OmniBridge.setMetadata(taskArgs.nearTokenAccount, taskArgs.name, taskArgs.symbol) + }) + +task("deploy-bridge-token-factory", "Deploys the OmniBridge contract") + .addParam("bridgeTokenImpl", "The address of the bridge token implementation") + .addParam("nearBridgeAccountId", "The OmniBridge account ID on NEAR") + .setAction(async (taskArgs, hre) => { + const { ethers, upgrades } = hre + const networkConfig = hre.network.config as HttpNetworkUserConfig + const omniChainId = networkConfig.omniChainId + const wormholeAddress = networkConfig.wormholeAddress + + const mpcRootPublicKey = hre.network.name.toLowerCase().endsWith("mainnet") + ? mpcRootPublicKeys.mainnet.key + : mpcRootPublicKeys.testnet.key + + const nearBridgeDerivedAddress = await deriveEVMAddress( + taskArgs.nearBridgeAccountId, + "bridge-1", + mpcRootPublicKey, + ) + + const isWormholeContract = wormholeAddress ?? false + const contractName = isWormholeContract ? "OmniBridgeWormhole" : "OmniBridge" + const OmniBridgeContract = await ethers.getContractFactory(contractName) + const consistencyLevel = 0 + + const OmniBridge = await upgrades.deployProxy( + OmniBridgeContract, + isWormholeContract + ? [ + taskArgs.bridgeTokenImpl, + nearBridgeDerivedAddress, + omniChainId, + wormholeAddress, + consistencyLevel, + ] + : [taskArgs.bridgeTokenImpl, nearBridgeDerivedAddress, omniChainId], + { + initializer: isWormholeContract ? "initializeWormhole" : "initialize", + timeout: 0, + }, + ) + + await OmniBridge.waitForDeployment() + const bridgeAddress = await OmniBridge.getAddress() + const implementationAddress = await upgrades.erc1967.getImplementationAddress(bridgeAddress) + + const wormholeAddressStorageValue = await hre.ethers.provider.getStorage(bridgeAddress, 58) + const decodedWormholeAddress = ethers.AbiCoder.defaultAbiCoder().decode( + ["address"], + wormholeAddressStorageValue, + )[0] + assert.strictEqual(decodedWormholeAddress, wormholeAddress ?? ethers.ZeroAddress) + + console.log( + JSON.stringify({ + bridgeAddress, + implementationAddress, + derivedAddress: nearBridgeDerivedAddress, + omniChainId, + wormholeAddress: wormholeAddress ?? null, + }), + ) + }) + +task("deploy-token-impl", "Deploys the BridgeToken implementation").setAction(async (_, hre) => { + const { ethers } = hre + const BridgeTokenContractFactory = await ethers.getContractFactory("BridgeToken") + const BridgeTokenContract = await BridgeTokenContractFactory.deploy() + await BridgeTokenContract.waitForDeployment() + console.log( + JSON.stringify({ + tokenImplAddress: await BridgeTokenContract.getAddress(), + }), + ) +}) + +task("upgrade-bridge-token", "Upgrades a BridgeToken to a new implementation") + .addParam("factory", "The address of the OmniBridge contract") + .addParam("nearTokenAccount", "The NEAR token ID") + .setAction(async (taskArgs, hre) => { + const { ethers } = hre + + const OmniBridgeContract = await ethers.getContractFactory("OmniBridge") + const OmniBridge = OmniBridgeContract.attach(taskArgs.factory) as OmniBridge + + const BridgeTokenV2Instance = await ethers.getContractFactory("BridgeTokenV2") + const BridgeTokenV2 = await BridgeTokenV2Instance.deploy() + await BridgeTokenV2.waitForDeployment() + + console.log(`BridgeTokenV2 deployed at ${await BridgeTokenV2.getAddress()}`) + + const tx = await OmniBridge.upgradeToken( + taskArgs.nearTokenAccount, + await BridgeTokenV2.getAddress(), + ) + await tx.wait() + + console.log( + JSON.stringify({ + upgradingToken: taskArgs.nearTokenAccount, + tokenProxyAddress: await OmniBridge.nearToEthToken(taskArgs.nearTokenAccount), + newImplementationAddress: await BridgeTokenV2.getAddress(), + }), + ) + }) + +task("upgrade-factory", "Upgrades the OmniBridge contract") + .addParam("factory", "The address of the OmniBridge contract") + .setAction(async (taskArgs, hre) => { + const { ethers, upgrades } = hre + const networkConfig = hre.network.config as HttpNetworkUserConfig + const wormholeAddress = networkConfig.wormholeAddress + const isWormholeContract = wormholeAddress ?? false + const contractName = isWormholeContract ? "OmniBridgeWormhole" : "OmniBridge" + + const OmniBridgeContract = await ethers.getContractFactory(contractName) + + const currentImpl = await upgrades.erc1967.getImplementationAddress(taskArgs.factory) + await upgrades.upgradeProxy(taskArgs.factory, OmniBridgeContract) + const newImpl = await upgrades.erc1967.getImplementationAddress(taskArgs.factory) + + console.log( + JSON.stringify({ + proxyAddress: taskArgs.factory, + previousImplementation: currentImpl, + newImplementation: newImpl, + }), + ) + }) + +task("etherscan-verify", "Verify contract on etherscan") + .addParam("address", "Contract address") + .addParam("args", "Constructor arguments in JSON array") + .setAction(async (taskArgs, hre) => { + await hre.run("verify:verify", { + address: taskArgs.address, + constructorArguments: JSON.parse(taskArgs.args), + }) + }) + +task("update-wormhole-address", "Update the wormhole address") + .addParam("factory", "The address of the OmniBridge contract") + .setAction(async (taskArgs, hre) => { + const { ethers } = hre + const networkConfig = hre.network.config as HttpNetworkUserConfig + const wormholeAddress = networkConfig.wormholeAddress + if (!wormholeAddress) { + throw new Error("Wormhole address is not set") + } + + const OmniBridgeContract = await ethers.getContractFactory("OmniBridgeWormhole") + const consistencyLevel = 0 + const OmniBridge = OmniBridgeContract.attach(taskArgs.factory) as OmniBridgeWormhole + const tx = await OmniBridge.setWormholeAddress(wormholeAddress, consistencyLevel) + const receipt = await tx.wait() + + console.log("Address upgraded at tx hash:", receipt?.hash) + }) + +task("deploy-bytecode", "Deploys a contract with a given bytecode") + .addParam("bytecode", "The path to the file containing the bytecode of the contract") + .setAction(async (taskArgs, hre) => { + const { ethers } = hre + + const bytecode = fs.readFileSync(taskArgs.bytecode, "utf8") + const [signer] = await ethers.getSigners() + + const contractFactory = new ethers.ContractFactory([], bytecode, signer) + const contract = await contractFactory.deploy() + await contract.waitForDeployment() + + console.log( + JSON.stringify({ + contractAddress: await contract.getAddress(), + }), + ) + }) + +const config: HardhatUserConfig = { + paths: { + sources: "./src", + cache: "./cache", + artifacts: "./build", + tests: "./tests", + }, + solidity: { + compilers: [ + { + version: "0.8.24", + settings: { + optimizer: { + enabled: true, + runs: 200, + }, + metadata: { + // do not include the metadata hash, since this is machine dependent + // and we want all generated code to be deterministic + // https://docs.soliditylang.org/en/v0.8.24/metadata.html + bytecodeHash: "none", + }, + }, + }, + ], + }, + networks: { + hardhat: { + chainId: 1337, + mining: { + auto: true, + 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, + url: `https://sepolia.infura.io/v3/${INFURA_API_KEY}`, + accounts: [`${EVM_PRIVATE_KEY}`], + }, + arbitrumSepolia: { + wormholeAddress: "0x6b9C8671cdDC8dEab9c719bB87cBd3e782bA6a35", + omniChainId: 3, + chainId: 421614, + url: `https://arbitrum-sepolia.infura.io/v3/${INFURA_API_KEY}`, + accounts: [`${EVM_PRIVATE_KEY}`], + }, + baseSepolia: { + wormholeAddress: "0x79A1027a6A159502049F10906D333EC57E95F083", + omniChainId: 4, + chainId: 84532, + url: `https://base-sepolia.infura.io/v3/${INFURA_API_KEY}`, + accounts: [`${EVM_PRIVATE_KEY}`], + }, + }, + etherscan: { + apiKey: { + mainnet: ETHERSCAN_API_KEY, + arbitrumOne: ARBISCAN_API_KEY, + base: BASESCAN_API_KEY, + sepolia: ETHERSCAN_API_KEY, + arbitrumSepolia: ARBISCAN_API_KEY, + baseSepolia: BASESCAN_API_KEY, + }, + }, +} + +export default config diff --git a/evm/package.json b/evm/package.json new file mode 100644 index 00000000..1c28746e --- /dev/null +++ b/evm/package.json @@ -0,0 +1,47 @@ +{ + "name": "omni-bridge", + "version": "0.1.0", + "description": "OmniBridge contracts for the EVM", + "license": "MIT", + "dependencies": { + "@openzeppelin/contracts": "^5.1.0", + "@openzeppelin/contracts-upgradeable": "^5.1.0", + "prettier": "^3.3.3", + "prettier-plugin-solidity": "^1.4.1" + }, + "devDependencies": { + "@biomejs/biome": "^1.9.4", + "@nomicfoundation/hardhat-chai-matchers": "^2.0.8", + "@nomicfoundation/hardhat-ethers": "^3.0.6", + "@nomicfoundation/hardhat-network-helpers": "^1.0.12", + "@nomicfoundation/hardhat-verify": "^2.0.12", + "@openzeppelin/hardhat-upgrades": "^3.5.0", + "@typechain/ethers-v6": "^0.5.1", + "@typechain/hardhat": "^9.1.0", + "@types/chai": "4", + "@types/elliptic": "^6.4.18", + "@types/mocha": "^10.0.9", + "@types/node": "^22.9.0", + "borsh": "^2.0.0", + "chai": "4", + "dotenv": "^16.4.5", + "ethers": "^6.13.4", + "hardhat": "^2.22.16", + "hardhat-storage-layout": "^0.1.7", + "solidity-coverage": "^0.8.13", + "ts-node": "^10.9.2", + "typechain": "^8.3.2", + "typescript": "^5.7.2", + "bs58": "^6.0.0" + }, + "scripts": { + "build": "yarn hardhat compile", + "testrpc": "", + "test": "yarn hardhat test", + "coverage": "yarn hardhat coverage", + "lint:js": "biome check", + "lint:js:fix": "biome check --write", + "lint": "prettier --list-different --plugin=prettier-plugin-solidity '**/*.sol'", + "lint:fix": "prettier --write --plugin=prettier-plugin-solidity '**/*.sol'" + } +} diff --git a/evm/bridge-token-factory/contracts/Borsh.sol b/evm/src/common/Borsh.sol similarity index 70% rename from evm/bridge-token-factory/contracts/Borsh.sol rename to evm/src/common/Borsh.sol index 666653f3..e93c9f14 100644 --- a/evm/bridge-token-factory/contracts/Borsh.sol +++ b/evm/src/common/Borsh.sol @@ -2,12 +2,16 @@ pragma solidity ^0.8.24; library Borsh { - function encodeUint32(uint32 val) internal pure returns (bytes memory) { - return abi.encodePacked(swapBytes4(val)); + function encodeUint32(uint32 val) internal pure returns (bytes4) { + return bytes4(swapBytes4(val)); } - function encodeUint128(uint128 val) internal pure returns (bytes memory) { - return abi.encodePacked(swapBytes16(val)); + function encodeUint64(uint64 val) internal pure returns (bytes8) { + return bytes8(swapBytes8(val)); + } + + function encodeUint128(uint128 val) internal pure returns (bytes16) { + return bytes16(swapBytes16(val)); } function encodeString(string memory val) internal pure returns (bytes memory) { @@ -27,10 +31,16 @@ library Borsh { return (v << 16) | (v >> 16); } + function swapBytes8(uint64 v) internal pure returns (uint64) { + v = ((v & 0x00ff00ff00ff00ff) << 8) | ((v & 0xff00ff00ff00ff00) >> 8); + v = ((v & 0x0000ffff0000ffff) << 16) | ((v & 0xffff0000ffff0000) >> 16); + return (v << 32) | (v >> 32); + } + function swapBytes16(uint128 v) internal pure returns (uint128) { v = ((v & 0x00ff00ff00ff00ff00ff00ff00ff00ff) << 8) | ((v & 0xff00ff00ff00ff00ff00ff00ff00ff00) >> 8); v = ((v & 0x0000ffff0000ffff0000ffff0000ffff) << 16) | ((v & 0xffff0000ffff0000ffff0000ffff0000) >> 16); v = ((v & 0x00000000ffffffff00000000ffffffff) << 32) | ((v & 0xffffffff00000000ffffffff00000000) >> 32); return (v << 64) | (v >> 64); } -} \ No newline at end of file +} diff --git a/evm/src/common/ICustomMinter.sol b/evm/src/common/ICustomMinter.sol new file mode 100644 index 00000000..20b4594a --- /dev/null +++ b/evm/src/common/ICustomMinter.sol @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.24; + +interface ICustomMinter { + function mint(address token, address to, uint128 amount) external; + function burn(address token, uint128 amount) external; +} \ No newline at end of file diff --git a/evm/src/eNear/README.md b/evm/src/eNear/README.md new file mode 100644 index 00000000..053b79c1 --- /dev/null +++ b/evm/src/eNear/README.md @@ -0,0 +1,27 @@ +# eNear Proxy +The NEAR token on Ethereum(eNear) is an ERC20 token with two additional functions: finaliseNearToEthTransfer and transferToNear. +You can find the implementation here: https://github.com/Near-One/near-erc20-connector/tree/main/eNear + +The `finaliseNearToEthTransfer` function is used for transferring NEAR tokens to Ethereum. +It takes as input proof that the NEAR tokens were locked on NEAR and after verification mint the eNear tokens. +The proof itself is verified using [NearProver](https://github.com/Near-One/rainbow-bridge/blob/master/contracts/eth/nearprover/contracts/NearProver.sol), which is based on RainbowBridge. + +`transferToNear` function burns tokens and emits `TransferToNearInitiated` event. + +Currently, `eNEAR` is based on RainbowBridge, but we need eNEAR to now be controlled by OmniBridge. +For this, OmniBridge needs the ability to mint and burn tokens. +However, the eNEAR contract is not upgradable, and minting and +burning tokens can only be done using the functions described above. + +To solve this problem, we implemented `eNearProxy` with `mint` and `burn` functions. +We will make `eNearProxy` the admin of `eNear` and replace the `Prover` with a `FakeProver` +that will successfully verify any proof. +We will pause the `finaliseNearToEthTransfer` and `transferToNear` functions, +and only `eNearProxy`, as the admin, will have the ability to call these functions. +For minting, the `eNearProxy` will call `finaliseNearToEthTransfer` on `eNear`, +providing a fake proof with the necessary data on who and how much to mint. +For burning, it will call the `transferToNear` function with a non-existent address on NEAR. + +**The deployment of eNear on mainnet:** https://etherscan.io/address/0x85F17Cf997934a597031b2E18a9aB6ebD4B9f6a4 + +**The deployment of eNear on testnet:** https://sepolia.etherscan.io/address/0x1f89e263159F541182f875AC05d773657D24eB92 diff --git a/evm/src/eNear/contracts/ENearProxy.sol b/evm/src/eNear/contracts/ENearProxy.sol new file mode 100644 index 00000000..80e45de8 --- /dev/null +++ b/evm/src/eNear/contracts/ENearProxy.sol @@ -0,0 +1,59 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.24; + +import "../../common/Borsh.sol"; +import {AccessControlUpgradeable} from '@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol'; +import {UUPSUpgradeable} from '@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol'; +import {IENear} from './IENear.sol'; +import {ICustomMinter} from '../../common/ICustomMinter.sol'; + +contract ENearProxy is UUPSUpgradeable, AccessControlUpgradeable, ICustomMinter { + IENear public eNear; + + bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); + bytes public nearConnector; + uint256 public currentReceiptId; + + /// @custom:oz-upgrades-unsafe-allow constructor + constructor() { + _disableInitializers(); + } + + function initialize(address _eNear, bytes memory _nearConnector, uint256 _currentReceiptId) public initializer { + __UUPSUpgradeable_init(); + __AccessControl_init(); + eNear = IENear(_eNear); + nearConnector = _nearConnector; + currentReceiptId = _currentReceiptId; + _grantRole(DEFAULT_ADMIN_ROLE, _msgSender()); + } + + function mint(address token, address to, uint128 amount) public onlyRole(MINTER_ROLE) { + require(token == address(eNear), "ERR_INCORRECT_ENEAR_ADDRESS"); + + bytes memory fakeProofData = bytes.concat( + new bytes(72), + hex"01000000", + abi.encodePacked(currentReceiptId), + new bytes(24), + abi.encodePacked(Borsh.swapBytes4(uint32(nearConnector.length))), + abi.encodePacked(nearConnector), + hex"022500000000", + abi.encodePacked(Borsh.swapBytes16(amount)), + abi.encodePacked(to), + new bytes(280) + ); + + currentReceiptId += 1; + eNear.finaliseNearToEthTransfer(fakeProofData, 0); + } + + function burn(address token, uint128 amount) public onlyRole(MINTER_ROLE) { + require(token == address(eNear), "ERR_INCORRECT_ENEAR_ADDRESS"); + eNear.transferToNear(amount, string('')); + } + + function _authorizeUpgrade( + address newImplementation + ) internal override onlyRole(DEFAULT_ADMIN_ROLE) {} +} diff --git a/evm/src/eNear/contracts/FakeProver.sol b/evm/src/eNear/contracts/FakeProver.sol new file mode 100644 index 00000000..78ce14f3 --- /dev/null +++ b/evm/src/eNear/contracts/FakeProver.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.24; + +interface INearProver { + function proveOutcome(bytes calldata proofData, uint64 blockHeight) external view returns (bool); +} + +contract FakeProver is INearProver { + function proveOutcome(bytes calldata, uint64) external pure returns (bool) { + return true; + } +} diff --git a/evm/src/eNear/contracts/IENear.sol b/evm/src/eNear/contracts/IENear.sol new file mode 100644 index 00000000..a59430e4 --- /dev/null +++ b/evm/src/eNear/contracts/IENear.sol @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.24; + +//eNear on mainnet: https://etherscan.io/address/0x85F17Cf997934a597031b2E18a9aB6ebD4B9f6a4#code +interface IENear { + function transferToNear(uint256 _amount, string calldata _nearReceiverAccountId) external; + function finaliseNearToEthTransfer(bytes calldata proofData, uint64 proofBlockHeight) external; + function nearConnector() external view returns(bytes memory); + function adminSstore(uint key, uint value) external; + function balanceOf(address account) external view returns (uint256); + function totalSupply() external view returns (uint256); + function transfer(address recipient, uint256 amount) external returns (bool); + function prover() external view returns (address); + function admin() external view returns (address); + function adminPause(uint256 flags) external; +} diff --git a/evm/src/eNear/scripts.ts b/evm/src/eNear/scripts.ts new file mode 100644 index 00000000..4310adaa --- /dev/null +++ b/evm/src/eNear/scripts.ts @@ -0,0 +1,55 @@ +import { task } from "hardhat/config" +import type { HardhatRuntimeEnvironment } from "hardhat/types" + +task("deploy-e-near-proxy", "Deploys the ENearProxy contract") + .addParam("enear", "Address of eNear contract") + .setAction(async (taskArgs, hre: HardhatRuntimeEnvironment) => { + const { ethers, upgrades } = hre + + const eNear = await ethers.getContractAt("IENear", taskArgs.enear) + const nearConnector = await eNear.nearConnector() + + const eNearProxyContract = await ethers.getContractFactory("ENearProxy") + const eNearProxy = await upgrades.deployProxy( + eNearProxyContract, + [taskArgs.enear, nearConnector, 0], + { + initializer: "initialize", + timeout: 0, + }, + ) + + await eNearProxy.waitForDeployment() + const proxyAddress = await eNearProxy.getAddress() + const implementationAddress = await upgrades.erc1967.getImplementationAddress(proxyAddress) + console.log( + JSON.stringify({ + proxyAddress, + implementationAddress, + }), + ) + }) + +task("e-near-set-admin", "Set the proxy as admin for eNear") + .addParam("newAdmin", "New admin address") + .addParam("enear", "Address of the eNear contract") + .setAction(async (taskArgs, hre: HardhatRuntimeEnvironment) => { + const { ethers } = hre + const eNear = await ethers.getContractAt("IENear", taskArgs.enear) + await eNear.adminSstore(9, ethers.zeroPadValue(taskArgs.newAdmin, 32)) + }) + +task("deploy-fake-prover", "Deploy fake prover").setAction( + async (_taskArgs, hre: HardhatRuntimeEnvironment) => { + const { ethers } = hre + const FakeProverContractFactory = await ethers.getContractFactory("FakeProver") + const FakeProverContract = await FakeProverContractFactory.deploy() + await FakeProverContract.waitForDeployment() + + console.log( + JSON.stringify({ + fakeProverAddress: await FakeProverContract.getAddress(), + }), + ) + }, +) diff --git a/evm/src/omni-bridge/.catalog-info.yaml b/evm/src/omni-bridge/.catalog-info.yaml new file mode 100644 index 00000000..cd248b38 --- /dev/null +++ b/evm/src/omni-bridge/.catalog-info.yaml @@ -0,0 +1,21 @@ +--- +apiVersion: backstage.io/v1alpha1 +kind: Component +metadata: + name: bridge-token-factory + title: "BridgeTokenFactory on Ethereum" + description: |- + Bridge Token Factory on Ethereum that manages bridged ERC-20 tokens from EVM + tags: + - contract + - ethereum + links: [] + annotations: + aurora.dev/security-tier: "1" +spec: + owner: nearone-team + type: contract + lifecycle: production + system: omnibridge-protocol + deployedAt: [] + interactsWith: [] diff --git a/evm/bridge-token-factory/contracts/BridgeToken.sol b/evm/src/omni-bridge/contracts/BridgeToken.sol similarity index 100% rename from evm/bridge-token-factory/contracts/BridgeToken.sol rename to evm/src/omni-bridge/contracts/BridgeToken.sol diff --git a/evm/src/omni-bridge/contracts/BridgeTypes.sol b/evm/src/omni-bridge/contracts/BridgeTypes.sol new file mode 100644 index 00000000..7d4d144f --- /dev/null +++ b/evm/src/omni-bridge/contracts/BridgeTypes.sol @@ -0,0 +1,71 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity ^0.8.24; + +library BridgeTypes { + struct TransferMessagePayload { + uint64 destinationNonce; + uint8 originChain; + uint64 originNonce; + address tokenAddress; + uint128 amount; + address recipient; + string feeRecipient; + } + + struct MetadataPayload { + string token; + string name; + string symbol; + uint8 decimals; + } + + event InitTransfer( + address indexed sender, + address indexed tokenAddress, + uint64 indexed originNonce, + uint128 amount, + uint128 fee, + uint128 nativeFee, + string recipient, + string message + ); + + event FinTransfer( + uint8 indexed originChain, + uint64 indexed originNonce, + address tokenAddress, + uint128 amount, + address recipient, + string feeRecipient + ); + + event DeployToken( + address indexed tokenAddress, + string token, + string name, + string symbol, + uint8 decimals, + uint8 originDecimals + ); + + event LogMetadata( + address indexed tokenAddress, + string name, + string symbol, + uint8 decimals + ); + + event SetMetadata( + address indexed tokenAddress, + string token, + string name, + string symbol, + uint8 decimals + ); + + enum PayloadType { + TransferMessage, + Metadata, + ClaimNativeFee + } +} diff --git a/evm/src/omni-bridge/contracts/OmniBridge.sol b/evm/src/omni-bridge/contracts/OmniBridge.sol new file mode 100644 index 00000000..e1f7b8c1 --- /dev/null +++ b/evm/src/omni-bridge/contracts/OmniBridge.sol @@ -0,0 +1,333 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity ^0.8.24; + +import {AccessControlUpgradeable} from "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; +import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {ECDSA} from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; +import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; +import {ICustomMinter} from "../../common/ICustomMinter.sol"; + +import "./BridgeToken.sol"; +import "./SelectivePausableUpgradable.sol"; +import "../../common/Borsh.sol"; +import "./BridgeTypes.sol"; + +contract OmniBridge is + UUPSUpgradeable, + AccessControlUpgradeable, + SelectivePausableUpgradable +{ + using SafeERC20 for IERC20; + mapping(address => string) public ethToNearToken; + mapping(string => address) public nearToEthToken; + mapping(address => bool) public isBridgeToken; + + address public tokenImplementationAddress; + address public nearBridgeDerivedAddress; + uint8 public omniBridgeChainId; + + mapping(uint64 => bool) public completedTransfers; + uint64 public currentOriginNonce; + + mapping(address => address) public customMinters; + + bytes32 public constant PAUSABLE_ADMIN_ROLE = keccak256("PAUSABLE_ADMIN_ROLE"); + uint constant UNPAUSED_ALL = 0; + uint constant PAUSED_INIT_TRANSFER = 1 << 0; + uint constant PAUSED_FIN_TRANSFER = 1 << 1; + + error InvalidSignature(); + error NonceAlreadyUsed(uint64 nonce); + error InvalidFee(); + error InvalidValue(); + error FailedToSendEther(); + + function initialize( + address tokenImplementationAddress_, + address nearBridgeDerivedAddress_, + uint8 omniBridgeChainId_ + ) public initializer { + tokenImplementationAddress = tokenImplementationAddress_; + nearBridgeDerivedAddress = nearBridgeDerivedAddress_; + omniBridgeChainId = omniBridgeChainId_; + + __UUPSUpgradeable_init(); + __AccessControl_init(); + __Pausable_init_unchained(); + _grantRole(DEFAULT_ADMIN_ROLE, _msgSender()); + _grantRole(PAUSABLE_ADMIN_ROLE, _msgSender()); + } + + function addCustomToken(string calldata nearTokenId, address tokenAddress, address customMinter, uint8 originDecimals) external onlyRole(DEFAULT_ADMIN_ROLE) { + isBridgeToken[tokenAddress] = true; + ethToNearToken[tokenAddress] = nearTokenId; + nearToEthToken[nearTokenId] = tokenAddress; + customMinters[tokenAddress] = customMinter; + + string memory name = IERC20Metadata(tokenAddress).name(); + string memory symbol = IERC20Metadata(tokenAddress).symbol(); + uint8 decimals = IERC20Metadata(tokenAddress).decimals(); + + deployTokenExtension(nearTokenId, tokenAddress, decimals, originDecimals); + + emit BridgeTypes.DeployToken( + tokenAddress, + nearTokenId, + name, + symbol, + decimals, + originDecimals + ); + } + + function removeCustomToken(address tokenAddress) external onlyRole(DEFAULT_ADMIN_ROLE) { + delete isBridgeToken[tokenAddress]; + delete nearToEthToken[ethToNearToken[tokenAddress]]; + delete ethToNearToken[tokenAddress]; + delete customMinters[tokenAddress]; + } + + function deployToken(bytes calldata signatureData, BridgeTypes.MetadataPayload calldata metadata) payable external returns (address) { + bytes memory borshEncoded = bytes.concat( + bytes1(uint8(BridgeTypes.PayloadType.Metadata)), + Borsh.encodeString(metadata.token), + Borsh.encodeString(metadata.name), + Borsh.encodeString(metadata.symbol), + bytes1(metadata.decimals) + ); + bytes32 hashed = keccak256(borshEncoded); + + if (ECDSA.recover(hashed, signatureData) != nearBridgeDerivedAddress) { + revert InvalidSignature(); + } + + require(!isBridgeToken[nearToEthToken[metadata.token]], "ERR_TOKEN_EXIST"); + uint8 decimals = _normalizeDecimals(metadata.decimals); + + address bridgeTokenProxy = address( + new ERC1967Proxy( + tokenImplementationAddress, + abi.encodeWithSelector( + BridgeToken.initialize.selector, + metadata.name, + metadata.symbol, + decimals + ) + ) + ); + + deployTokenExtension(metadata.token, bridgeTokenProxy, decimals, metadata.decimals); + + emit BridgeTypes.DeployToken( + bridgeTokenProxy, + metadata.token, + metadata.name, + metadata.symbol, + decimals, + metadata.decimals + ); + + isBridgeToken[address(bridgeTokenProxy)] = true; + ethToNearToken[address(bridgeTokenProxy)] = metadata.token; + nearToEthToken[metadata.token] = address(bridgeTokenProxy); + + return bridgeTokenProxy; + } + + function deployTokenExtension(string memory token, address tokenAddress, uint8 decimals, uint8 originDecimals) internal virtual {} + + function setMetadata( + string calldata token, + string calldata name, + string calldata symbol + ) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(isBridgeToken[nearToEthToken[token]], "ERR_NOT_BRIDGE_TOKEN"); + + BridgeToken bridgeToken = BridgeToken(nearToEthToken[token]); + + bridgeToken.setMetadata(name, symbol, bridgeToken.decimals()); + + emit BridgeTypes.SetMetadata( + address(bridgeToken), + token, + name, + symbol, + bridgeToken.decimals() + ); + } + + function logMetadata( + address tokenAddress + ) external { + string memory name = IERC20Metadata(tokenAddress).name(); + string memory symbol = IERC20Metadata(tokenAddress).symbol(); + uint8 decimals = IERC20Metadata(tokenAddress).decimals(); + + logMetadataExtension(tokenAddress, name, symbol, decimals); + + emit BridgeTypes.LogMetadata( + tokenAddress, + name, + symbol, + decimals + ); + } + + function logMetadataExtension( + address tokenAddress, + string memory name, + string memory symbol, + uint8 decimals + ) internal virtual {} + + function finTransfer( + bytes calldata signatureData, + BridgeTypes.TransferMessagePayload calldata payload + ) payable external whenNotPaused(PAUSED_FIN_TRANSFER) { + if (completedTransfers[payload.destinationNonce]) { + revert NonceAlreadyUsed(payload.destinationNonce); + } + + completedTransfers[payload.destinationNonce] = true; + + bytes memory borshEncoded = bytes.concat( + bytes1(uint8(BridgeTypes.PayloadType.TransferMessage)), + Borsh.encodeUint64(payload.destinationNonce), + bytes1(payload.originChain), + Borsh.encodeUint64(payload.originNonce), + bytes1(omniBridgeChainId), + Borsh.encodeAddress(payload.tokenAddress), + Borsh.encodeUint128(payload.amount), + bytes1(omniBridgeChainId), + Borsh.encodeAddress(payload.recipient), + bytes(payload.feeRecipient).length == 0 // None or Some(String) in rust + ? bytes("\x00") + : bytes.concat(bytes("\x01"), Borsh.encodeString(payload.feeRecipient)) + ); + bytes32 hashed = keccak256(borshEncoded); + + if (ECDSA.recover(hashed, signatureData) != nearBridgeDerivedAddress) { + revert InvalidSignature(); + } + + if (payload.tokenAddress == address(0)) { + (bool success, ) = payload.recipient.call{value: payload.amount}(""); + if (!success) revert FailedToSendEther(); + } + else if (customMinters[payload.tokenAddress] != address(0)) { + ICustomMinter(customMinters[payload.tokenAddress]).mint(payload.tokenAddress, payload.recipient, payload.amount); + } else if (isBridgeToken[payload.tokenAddress]) { + BridgeToken(payload.tokenAddress).mint(payload.recipient, payload.amount); + } else { + IERC20(payload.tokenAddress).safeTransfer(payload.recipient, payload.amount); + } + + finTransferExtension(payload); + + emit BridgeTypes.FinTransfer( + payload.originChain, + payload.originNonce, + payload.tokenAddress, + payload.amount, + payload.recipient, + payload.feeRecipient + ); + } + + function finTransferExtension(BridgeTypes.TransferMessagePayload memory payload) internal virtual {} + + function initTransfer( + address tokenAddress, + uint128 amount, + uint128 fee, + uint128 nativeFee, + string calldata recipient, + string calldata message + ) payable external whenNotPaused(PAUSED_INIT_TRANSFER) { + currentOriginNonce += 1; + if (fee >= amount) { + revert InvalidFee(); + } + + uint256 extensionValue; + if (tokenAddress == address(0)) { + if (fee != 0) { + revert InvalidFee(); + } + extensionValue = msg.value - amount - nativeFee; + } else { + extensionValue = msg.value - nativeFee; + if (customMinters[tokenAddress] != address(0)) { + IERC20(tokenAddress).transferFrom(msg.sender, customMinters[tokenAddress], amount); + ICustomMinter(customMinters[tokenAddress]).burn(tokenAddress, amount); + } else if (isBridgeToken[tokenAddress]) { + BridgeToken(tokenAddress).burn(msg.sender, amount); + } else { + IERC20(tokenAddress).safeTransferFrom(msg.sender, address(this), amount); + } + } + + initTransferExtension(msg.sender, tokenAddress, currentOriginNonce, amount, fee, nativeFee, recipient, message, extensionValue); + + emit BridgeTypes.InitTransfer(msg.sender, tokenAddress, currentOriginNonce, amount, fee, nativeFee, recipient, message); + } + + function initTransferExtension( + address /*sender*/, + address /*tokenAddress*/, + uint64 /*originNonce*/, + uint128 /*amount*/, + uint128 /*fee*/, + uint128 /*nativeFee*/, + string calldata /*recipient*/, + string calldata /*message*/, + uint256 value + ) internal virtual { + if (value != 0) { + revert InvalidValue(); + } + } + + function pause(uint flags) external onlyRole(DEFAULT_ADMIN_ROLE) { + _pause(flags); + } + + function pauseAll() external onlyRole(PAUSABLE_ADMIN_ROLE) { + uint flags = PAUSED_FIN_TRANSFER | PAUSED_INIT_TRANSFER; + _pause(flags); + } + + function upgradeToken( + address tokenAddress, + address implementation + ) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(isBridgeToken[tokenAddress], "ERR_NOT_BRIDGE_TOKEN"); + BridgeToken proxy = BridgeToken(tokenAddress); + proxy.upgradeToAndCall(implementation, bytes("")); + } + + function setNearBridgeDerivedAddress( + address nearBridgeDerivedAddress_ + ) external onlyRole(DEFAULT_ADMIN_ROLE) { + nearBridgeDerivedAddress = nearBridgeDerivedAddress_; + } + + function _normalizeDecimals( + uint8 decimals + ) internal pure returns (uint8) { + uint8 maxAllowedDecimals = 18; + if (decimals > maxAllowedDecimals) { + return maxAllowedDecimals; + } + return decimals; + } + + function _authorizeUpgrade( + address newImplementation + ) internal override onlyRole(DEFAULT_ADMIN_ROLE) {} + + uint256[50] private __gap; +} diff --git a/evm/src/omni-bridge/contracts/OmniBridgeWormhole.sol b/evm/src/omni-bridge/contracts/OmniBridgeWormhole.sol new file mode 100644 index 00000000..4ef82474 --- /dev/null +++ b/evm/src/omni-bridge/contracts/OmniBridgeWormhole.sol @@ -0,0 +1,145 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity ^0.8.24; + +import {OmniBridge} from "./OmniBridge.sol"; +import "../../common/Borsh.sol"; +import "./BridgeTypes.sol"; + +interface IWormhole { + function publishMessage( + uint32 nonce, + bytes memory payload, + uint8 consistencyLevel + ) external payable returns (uint64 sequence); + + function messageFee() external view returns (uint256); +} + +enum MessageType { + InitTransfer, + FinTransfer, + DeployToken, + LogMetadata +} + +contract OmniBridgeWormhole is OmniBridge { + IWormhole private _wormhole; + // https://wormhole.com/docs/build/reference/consistency-levels + uint8 private _consistencyLevel; + uint32 public wormholeNonce; + + function initializeWormhole( + address tokenImplementationAddress, + address nearBridgeDerivedAddress, + uint8 omniBridgeChainId, + address wormholeAddress, + uint8 consistencyLevel + ) external initializer { + initialize(tokenImplementationAddress, nearBridgeDerivedAddress, omniBridgeChainId); + _wormhole = IWormhole(wormholeAddress); + _consistencyLevel = consistencyLevel; + } + + function deployTokenExtension(string memory token, address tokenAddress, uint8 decimals, uint8 originDecimals) internal override { + bytes memory payload = bytes.concat( + bytes1(uint8(MessageType.DeployToken)), + Borsh.encodeString(token), + bytes1(omniBridgeChainId), + Borsh.encodeAddress(tokenAddress), + bytes1(decimals), + bytes1(originDecimals) + ); + _wormhole.publishMessage{value: msg.value}( + wormholeNonce, + payload, + _consistencyLevel + ); + + wormholeNonce++; + } + + + function logMetadataExtension( + address tokenAddress, + string memory name, + string memory symbol, + uint8 decimals + ) internal override { + bytes memory payload = bytes.concat( + bytes1(uint8(MessageType.LogMetadata)), + bytes1(omniBridgeChainId), + Borsh.encodeAddress(tokenAddress), + Borsh.encodeString(name), + Borsh.encodeString(symbol), + bytes1(decimals) + ); + + _wormhole.publishMessage{value: msg.value}( + wormholeNonce, + payload, + _consistencyLevel + ); + + wormholeNonce++; + } + + function finTransferExtension(BridgeTypes.TransferMessagePayload memory payload) internal override { + bytes memory messagePayload = bytes.concat( + bytes1(uint8(MessageType.FinTransfer)), + bytes1(payload.originChain), + Borsh.encodeUint64(payload.originNonce), + bytes1(omniBridgeChainId), + Borsh.encodeAddress(payload.tokenAddress), + Borsh.encodeUint128(payload.amount), + Borsh.encodeString(payload.feeRecipient) + ); + _wormhole.publishMessage{value: msg.value}( + wormholeNonce, + messagePayload, + _consistencyLevel + ); + + wormholeNonce++; + } + + function initTransferExtension( + address sender, + address tokenAddress, + uint64 originNonce, + uint128 amount, + uint128 fee, + uint128 nativeFee, + string calldata recipient, + string calldata message, + uint256 value + ) internal override { + bytes memory payload = bytes.concat( + bytes1(uint8(MessageType.InitTransfer)), + bytes1(omniBridgeChainId), + Borsh.encodeAddress(sender), + bytes1(omniBridgeChainId), + Borsh.encodeAddress(tokenAddress), + Borsh.encodeUint64(originNonce), + Borsh.encodeUint128(amount), + Borsh.encodeUint128(fee), + Borsh.encodeUint128(nativeFee), + Borsh.encodeString(recipient), + Borsh.encodeString(message) + ); + _wormhole.publishMessage{value: value}( + wormholeNonce, + payload, + _consistencyLevel + ); + + wormholeNonce++; + } + + function setWormholeAddress( + address wormholeAddress, + uint8 consistencyLevel + ) external onlyRole(DEFAULT_ADMIN_ROLE) { + _wormhole = IWormhole(wormholeAddress); + _consistencyLevel = consistencyLevel; + } +} diff --git a/evm/bridge-token-factory/contracts/SelectivePausableUpgradable.sol b/evm/src/omni-bridge/contracts/SelectivePausableUpgradable.sol similarity index 100% rename from evm/bridge-token-factory/contracts/SelectivePausableUpgradable.sol rename to evm/src/omni-bridge/contracts/SelectivePausableUpgradable.sol diff --git a/evm/bridge-token-factory/contracts/test/TestBridgeToken.sol b/evm/src/omni-bridge/contracts/test/TestBridgeToken.sol similarity index 100% rename from evm/bridge-token-factory/contracts/test/TestBridgeToken.sol rename to evm/src/omni-bridge/contracts/test/TestBridgeToken.sol diff --git a/evm/bridge-token-factory/contracts/test/TestWormhole.sol b/evm/src/omni-bridge/contracts/test/TestWormhole.sol similarity index 73% rename from evm/bridge-token-factory/contracts/test/TestWormhole.sol rename to evm/src/omni-bridge/contracts/test/TestWormhole.sol index f164fefe..211e086e 100644 --- a/evm/bridge-token-factory/contracts/test/TestWormhole.sol +++ b/evm/src/omni-bridge/contracts/test/TestWormhole.sol @@ -9,7 +9,12 @@ contract TestWormhole { bytes memory payload, uint8 consistencyLevel ) external payable returns (uint64) { + require(msg.value == this.messageFee(), "invalid fee"); emit MessagePublished(nonce, payload, consistencyLevel); return 0; } -} \ No newline at end of file + + function messageFee() external pure returns (uint256) { + return 10000; + } +} diff --git a/evm/tests/BridgeToken.ts b/evm/tests/BridgeToken.ts new file mode 100644 index 00000000..830392b7 --- /dev/null +++ b/evm/tests/BridgeToken.ts @@ -0,0 +1,497 @@ +import type { BridgeToken, OmniBridge, TestBridgeToken } from "../typechain-types" + +import type { HardhatEthersSigner } from "@nomicfoundation/hardhat-ethers/signers" +import { expect } from "chai" +import { ethers, upgrades } from "hardhat" +import { depositSignature, metadataSignature, testWallet } from "./helpers/signatures" + +const PauseMode = { + UnpausedAll: 0, + PausedInitTransfer: 1 << 0, + PausedFinTransfer: 1 << 1, +} +const PauseAll = PauseMode.PausedInitTransfer | PauseMode.PausedFinTransfer +const PanicCodeArithmeticOperationOverflowed = "0x11" + +describe("BridgeToken", () => { + const wrappedNearId = "wrap.testnet" + + let OmniBridgeInstance: BridgeToken + let OmniBridge: OmniBridge + let adminAccount: HardhatEthersSigner + let user1: HardhatEthersSigner + let user2: HardhatEthersSigner + + beforeEach(async () => { + ;[adminAccount] = await ethers.getSigners() + user1 = await ethers.getImpersonatedSigner("0x3A445243376C32fAba679F63586e236F77EA601e") + user2 = await ethers.getImpersonatedSigner("0x5a08feed678c056650b3eb4a5cb1b9bb6f0fe265") + + await fundAddress(user1.address, "1") + await fundAddress(user2.address, "1") + + const BridgeToken_factory = await ethers.getContractFactory("BridgeToken") + const bridgeToken = await BridgeToken_factory.deploy() + OmniBridgeInstance = await bridgeToken.waitForDeployment() + + // Use our test wallet's address as the bridge authority + const nearBridgeDeriveAddress = testWallet.address + //console.log("nearBridgeDeriveAddress:", nearBridgeDeriveAddress) + const omniBridgeChainId = 0 + + const OmniBridge_factory = await ethers.getContractFactory("OmniBridge") + const upgradedContract = await upgrades.deployProxy( + OmniBridge_factory, + [await bridgeToken.getAddress(), nearBridgeDeriveAddress, omniBridgeChainId], + { initializer: "initialize" }, + ) + OmniBridge = (await upgradedContract.waitForDeployment()) as unknown as OmniBridge + }) + + async function fundAddress(address: string, amount: string) { + const tx = await adminAccount.sendTransaction({ + to: address, + value: ethers.parseEther(amount), + }) + await tx.wait() + } + + async function createToken(tokenId: string) { + const { signature, payload } = await metadataSignature(tokenId) + await OmniBridge.deployToken(signature, payload) + const tokenProxyAddress = await OmniBridge.nearToEthToken(tokenId) + const token = OmniBridgeInstance.attach(tokenProxyAddress) as BridgeToken + return { token, tokenProxyAddress } + } + + it("can create a token", async () => { + await createToken(wrappedNearId) + const tokenProxyAddress = await OmniBridge.nearToEthToken(wrappedNearId) + const token = OmniBridgeInstance.attach(tokenProxyAddress) as BridgeToken + expect(await token.name()).to.be.equal("Wrapped NEAR fungible token") + expect(await token.symbol()).to.be.equal("wNEAR") + expect((await token.decimals()).toString()).to.be.equal("18") + }) + + it("can't create token if token already exists", async () => { + await createToken(wrappedNearId) + await expect(createToken(wrappedNearId)).to.be.revertedWith("ERR_TOKEN_EXIST") + }) + + it("can update token's metadata", async () => { + const { token } = await createToken(wrappedNearId) + + await OmniBridge.setMetadata(wrappedNearId, "Circle USDC Bridged", "USDC.E") + expect(await token.name()).to.equal("Circle USDC Bridged") + expect(await token.symbol()).to.equal("USDC.E") + }) + + it("can't update metadata of non-existent token", async () => { + await createToken(wrappedNearId) + + await expect(OmniBridge.setMetadata("non-existing", "Circle USDC", "USDC")).to.be.revertedWith( + "ERR_NOT_BRIDGE_TOKEN", + ) + }) + + it("can't update metadata as a normal user", async () => { + await createToken(wrappedNearId) + + await expect( + OmniBridge.connect(user1).setMetadata(wrappedNearId, "Circle USDC", "USDC"), + ).to.be.revertedWithCustomError(OmniBridge, "AccessControlUnauthorizedAccount") + }) + + it("can fin transfer", async () => { + const { token } = await createToken(wrappedNearId) + const tokenProxyAddress = await OmniBridge.nearToEthToken(wrappedNearId) + + const { signature, payload } = await depositSignature(tokenProxyAddress, user1.address) + + await expect(OmniBridge.finTransfer(signature, payload)) + .to.emit(OmniBridge, "FinTransfer") + .withArgs( + payload.destinationNonce, + payload.originChain, + tokenProxyAddress, + 1, + payload.recipient, + payload.feeRecipient, + ) + + expect((await token.balanceOf(payload.recipient)).toString()).to.be.equal( + payload.amount.toString(), + ) + }) + + it("can't fin transfer if the contract is paused", async () => { + await createToken(wrappedNearId) + const tokenProxyAddress = await OmniBridge.nearToEthToken(wrappedNearId) + + await expect(OmniBridge.pause(PauseMode.PausedFinTransfer)) + .to.emit(OmniBridge, "Paused") + .withArgs(adminAccount.address, PauseMode.PausedFinTransfer) + + const { signature, payload } = depositSignature(tokenProxyAddress, user1.address) + + await expect(OmniBridge.finTransfer(signature, payload)).to.be.revertedWith("Pausable: paused") + }) + + it("can't fin transfer twice with the same signature", async () => { + await createToken(wrappedNearId) + const tokenProxyAddress = await OmniBridge.nearToEthToken(wrappedNearId) + + const { signature, payload } = depositSignature(tokenProxyAddress, user1.address) + await OmniBridge.finTransfer(signature, payload) + + await expect(OmniBridge.finTransfer(signature, payload)).to.be.revertedWithCustomError( + OmniBridge, + "NonceAlreadyUsed", + ) + }) + + it("can't fin transfer with invalid amount", async () => { + await createToken(wrappedNearId) + const tokenProxyAddress = await OmniBridge.nearToEthToken(wrappedNearId) + + const { signature, payload } = depositSignature(tokenProxyAddress, user1.address) + payload.amount = 100000 + + await expect(OmniBridge.finTransfer(signature, payload)).to.be.revertedWithCustomError( + OmniBridge, + "InvalidSignature", + ) + }) + + it("can't fin transfer with invalid nonce", async () => { + await createToken(wrappedNearId) + const tokenProxyAddress = await OmniBridge.nearToEthToken(wrappedNearId) + + const { signature, payload } = depositSignature(tokenProxyAddress, user1.address) + payload.destinationNonce = 99 + + await expect(OmniBridge.finTransfer(signature, payload)).to.be.revertedWithCustomError( + OmniBridge, + "InvalidSignature", + ) + }) + + it("can't fin transfer with invalid token", async () => { + await createToken(wrappedNearId) + const wrappedNearTokenAddress = await OmniBridge.nearToEthToken(wrappedNearId) + + const { signature, payload } = depositSignature(wrappedNearTokenAddress, user1.address) + const tokenProxyAddress = await OmniBridge.nearToEthToken("test-token.testnet") + payload.tokenAddress = tokenProxyAddress + + await expect(OmniBridge.finTransfer(signature, payload)).to.be.revertedWithCustomError( + OmniBridge, + "InvalidSignature", + ) + }) + + it("can't fin transfer with invalid recipient", async () => { + await createToken(wrappedNearId) + const tokenProxyAddress = await OmniBridge.nearToEthToken(wrappedNearId) + + const { signature, payload } = depositSignature(tokenProxyAddress, user1.address) + payload.recipient = user2.address + + await expect(OmniBridge.finTransfer(signature, payload)).to.be.revertedWithCustomError( + OmniBridge, + "InvalidSignature", + ) + }) + + it("can't fin transfer with invalid relayer", async () => { + await createToken(wrappedNearId) + const wrappedNearTokenAddress = await OmniBridge.nearToEthToken(wrappedNearId) + + const { signature, payload } = depositSignature(wrappedNearTokenAddress, user1.address) + payload.feeRecipient = "testrecipient.near" + + await expect(OmniBridge.finTransfer(signature, payload)).to.be.revertedWithCustomError( + OmniBridge, + "InvalidSignature", + ) + }) + + it("can init transfer", async () => { + const { token } = await createToken(wrappedNearId) + const tokenProxyAddress = await token.getAddress() + + const { signature, payload } = await depositSignature(tokenProxyAddress, user1.address) + await OmniBridge.finTransfer(signature, payload) + + const recipient = "testrecipient.near" + const fee = 0 + const nativeFee = 0 + + await expect( + OmniBridge.connect(user1).initTransfer( + tokenProxyAddress, + payload.amount, + fee, + nativeFee, + recipient, + "", + ), + ) + .to.emit(OmniBridge, "InitTransfer") + .withArgs(user1.address, tokenProxyAddress, 1, payload.amount, fee, nativeFee, recipient, "") + + expect((await token.balanceOf(user1.address)).toString()).to.be.equal("0") + }) + + it("can't init transfer token when paused", async () => { + await createToken(wrappedNearId) + const tokenProxyAddress = await OmniBridge.nearToEthToken(wrappedNearId) + + const { signature, payload } = depositSignature(tokenProxyAddress, user1.address) + await OmniBridge.finTransfer(signature, payload) + + const fee = 0 + const nativeFee = 100 + const message = "" + await expect(OmniBridge.pause(PauseMode.PausedInitTransfer)) + .to.emit(OmniBridge, "Paused") + .withArgs(adminAccount.address, PauseMode.PausedInitTransfer) + await expect( + OmniBridge.initTransfer( + tokenProxyAddress, + payload.amount, + fee, + nativeFee, + "testrecipient.near", + message, + { + value: 100, + }, + ), + ).to.be.revertedWith("Pausable: paused") + }) + + it("can't init transfer when value is too low", async () => { + await createToken(wrappedNearId) + const tokenProxyAddress = await OmniBridge.nearToEthToken(wrappedNearId) + + const { signature, payload } = depositSignature(tokenProxyAddress, user1.address) + await OmniBridge.finTransfer(signature, payload) + + const fee = 0 + const nativeFee = 100 + const message = "" + + await expect( + OmniBridge.initTransfer( + tokenProxyAddress, + payload.amount, + fee, + nativeFee, + "testrecipient.near", + message, + ), + ).to.be.revertedWithPanic(PanicCodeArithmeticOperationOverflowed) + }) + + it("can't init transfer when value is too high", async () => { + await createToken(wrappedNearId) + const tokenProxyAddress = await OmniBridge.nearToEthToken(wrappedNearId) + + const { signature, payload } = depositSignature(tokenProxyAddress, user1.address) + await OmniBridge.finTransfer(signature, payload) + + const fee = 0 + const nativeFee = 100 + const message = "" + + await expect( + OmniBridge.connect(user1).initTransfer( + tokenProxyAddress, + payload.amount, + fee, + nativeFee, + "testrecipient.near", + message, + { + value: 200, + }, + ), + ).to.be.revertedWithCustomError(OmniBridge, "InvalidValue") + }) + + it("can fin and init transfer after unpausing", async () => { + const { token } = await createToken(wrappedNearId) + const tokenProxyAddress = await token.getAddress() + + const { signature, payload } = depositSignature(tokenProxyAddress, user1.address) + await OmniBridge.finTransfer(signature, payload) + + await expect(OmniBridge.pause(PauseMode.PausedInitTransfer)) + .to.emit(OmniBridge, "Paused") + .withArgs(adminAccount.address, PauseMode.PausedInitTransfer) + + await expect(OmniBridge.pause(PauseMode.UnpausedAll)) + .to.emit(OmniBridge, "Paused") + .withArgs(adminAccount.address, PauseMode.UnpausedAll) + + const recipient = "testrecipient.near" + const fee = 0 + const nativeFee = 0 + const message = "" + await OmniBridge.connect(user1).initTransfer( + tokenProxyAddress, + payload.amount, + fee, + nativeFee, + recipient, + message, + ) + + expect((await token.balanceOf(user1.address)).toString()).to.be.equal("0") + }) + + it("upgrade token contract", async () => { + const { tokenProxyAddress } = await createToken(wrappedNearId) + + const BridgeTokenV2Instance = await ethers.getContractFactory("TestBridgeToken") + const BridgeTokenV2 = await BridgeTokenV2Instance.deploy() + await BridgeTokenV2.waitForDeployment() + + await OmniBridge.upgradeToken(tokenProxyAddress, await BridgeTokenV2.getAddress()) + const BridgeTokenV2Proxied = BridgeTokenV2Instance.attach(tokenProxyAddress) as TestBridgeToken + expect(await BridgeTokenV2Proxied.returnTestString()).to.equal("test") + expect(await BridgeTokenV2Proxied.name()).to.equal("Wrapped NEAR fungible token") + expect(await BridgeTokenV2Proxied.symbol()).to.equal("wNEAR") + expect((await BridgeTokenV2Proxied.decimals()).toString()).to.equal("18") + }) + + it("user can't upgrade token contract", async () => { + await createToken(wrappedNearId) + const tokenProxyAddress = await OmniBridge.nearToEthToken(wrappedNearId) + + const BridgeTokenV2Instance = await ethers.getContractFactory("TestBridgeToken") + const BridgeTokenV2 = await BridgeTokenV2Instance.deploy() + await BridgeTokenV2.waitForDeployment() + + await expect( + OmniBridge.connect(user1).upgradeToken(tokenProxyAddress, await BridgeTokenV2.getAddress()), + ).to.be.revertedWithCustomError(OmniBridge, "AccessControlUnauthorizedAccount") + }) + + it("Test selective pause", async () => { + // Pause withdraw + await expect(OmniBridge.pause(PauseMode.PausedInitTransfer)) + .to.emit(OmniBridge, "Paused") + .withArgs(adminAccount.address, PauseMode.PausedInitTransfer) + expect(await OmniBridge.pausedFlags()).to.be.equal(PauseMode.PausedInitTransfer) + + // Pause withdraw again + await expect(OmniBridge.pause(PauseMode.PausedInitTransfer)) + .to.emit(OmniBridge, "Paused") + .withArgs(adminAccount.address, PauseMode.PausedInitTransfer) + expect(await OmniBridge.pausedFlags()).to.be.equal(PauseMode.PausedInitTransfer) + expect(await OmniBridge.paused(PauseMode.PausedFinTransfer)).to.be.equal(false) + expect(await OmniBridge.paused(PauseMode.PausedInitTransfer)).to.be.equal(true) + + // Pause deposit + await expect(OmniBridge.pause(PauseMode.PausedFinTransfer | PauseMode.PausedInitTransfer)) + .to.emit(OmniBridge, "Paused") + .withArgs(adminAccount.address, PauseMode.PausedFinTransfer | PauseMode.PausedInitTransfer) + expect(await OmniBridge.pausedFlags()).to.be.equal( + PauseMode.PausedFinTransfer | PauseMode.PausedInitTransfer, + ) + + // Pause deposit again + await expect(OmniBridge.pause(PauseMode.PausedFinTransfer | PauseMode.PausedInitTransfer)) + .to.emit(OmniBridge, "Paused") + .withArgs(adminAccount.address, PauseMode.PausedFinTransfer | PauseMode.PausedInitTransfer) + expect(await OmniBridge.pausedFlags()).to.be.equal( + PauseMode.PausedFinTransfer | PauseMode.PausedInitTransfer, + ) + + // Pause deposit and withdraw + await expect(OmniBridge.pause(PauseMode.PausedFinTransfer | PauseMode.PausedInitTransfer)) + .to.emit(OmniBridge, "Paused") + .withArgs(adminAccount.address, PauseMode.PausedFinTransfer | PauseMode.PausedInitTransfer) + expect(await OmniBridge.pausedFlags()).to.be.equal( + PauseMode.PausedFinTransfer | PauseMode.PausedInitTransfer, + ) + expect(await OmniBridge.paused(PauseMode.PausedFinTransfer)).to.be.equal(true) + expect(await OmniBridge.paused(PauseMode.PausedInitTransfer)).to.be.equal(true) + + // Unpause all + await expect(OmniBridge.pause(PauseMode.UnpausedAll)) + .to.emit(OmniBridge, "Paused") + .withArgs(adminAccount.address, PauseMode.UnpausedAll) + expect(await OmniBridge.pausedFlags()).to.be.equal(PauseMode.UnpausedAll) + + // Pause all + await expect(OmniBridge.pauseAll()) + .to.emit(OmniBridge, "Paused") + .withArgs(adminAccount.address, PauseMode.PausedFinTransfer | PauseMode.PausedInitTransfer) + expect(await OmniBridge.pausedFlags()).to.be.equal( + PauseMode.PausedFinTransfer | PauseMode.PausedInitTransfer, + ) + expect(await OmniBridge.paused(PauseMode.PausedFinTransfer)).to.be.equal(true) + expect(await OmniBridge.paused(PauseMode.PausedInitTransfer)).to.be.equal(true) + }) + + it("Test grant admin role", async () => { + await OmniBridge.connect(adminAccount).pause(PauseMode.UnpausedAll) + expect(await OmniBridge.paused(PauseMode.PausedInitTransfer)).to.be.false + + await OmniBridge.connect(adminAccount).pauseAll() + expect(await OmniBridge.paused(PauseMode.PausedInitTransfer)).to.be.true + + const signers = await ethers.getSigners() + const newAdminAccount = signers[2] + const DEFAULT_ADMIN_ROLE = "0x0000000000000000000000000000000000000000000000000000000000000000" + await expect( + OmniBridge.connect(newAdminAccount).pause(PauseMode.UnpausedAll), + ).to.be.revertedWithCustomError(OmniBridge, "AccessControlUnauthorizedAccount") + expect(await OmniBridge.paused(PauseMode.PausedInitTransfer)).to.be.true + + // Grant DEFAULT_ADMIN_ROLE to newAdminAccount + await expect(OmniBridge.grantRole(DEFAULT_ADMIN_ROLE, newAdminAccount.address)) + .to.emit(OmniBridge, "RoleGranted") + .withArgs(DEFAULT_ADMIN_ROLE, newAdminAccount.address, adminAccount.address) + await OmniBridge.connect(newAdminAccount).pause(PauseMode.UnpausedAll) + expect(await OmniBridge.paused(PauseMode.PausedInitTransfer)).to.be.false + + await OmniBridge.connect(newAdminAccount).pause(PauseAll) + expect(await OmniBridge.paused(PauseMode.PausedInitTransfer)).to.be.true + + // Revoke DEFAULT_ADMIN_ROLE from adminAccount + await expect( + OmniBridge.connect(newAdminAccount).revokeRole(DEFAULT_ADMIN_ROLE, adminAccount.address), + ) + .to.emit(OmniBridge, "RoleRevoked") + .withArgs(DEFAULT_ADMIN_ROLE, adminAccount.address, newAdminAccount.address) + + // Check tx reverted on call from revoked adminAccount + await expect( + OmniBridge.connect(adminAccount).pause(PauseMode.UnpausedAll), + ).to.be.revertedWithCustomError(OmniBridge, "AccessControlUnauthorizedAccount") + expect(await OmniBridge.paused(PauseMode.PausedInitTransfer)).to.be.true + + // Check newAdminAccount can perform admin calls + await OmniBridge.connect(newAdminAccount).pause(PauseMode.UnpausedAll) + expect(await OmniBridge.paused(PauseMode.PausedInitTransfer)).to.be.false + await OmniBridge.connect(newAdminAccount).pause(PauseAll) + expect(await OmniBridge.paused(PauseMode.PausedInitTransfer)).to.be.true + + // Check newAdminAccount can grant DEFAULT_ADMIN_ROLE to adminAccount + await expect( + OmniBridge.connect(newAdminAccount).grantRole(DEFAULT_ADMIN_ROLE, adminAccount.address), + ) + .to.emit(OmniBridge, "RoleGranted") + .withArgs(DEFAULT_ADMIN_ROLE, adminAccount.address, newAdminAccount.address) + + // Check that adminAccount can perform admin calls again + await OmniBridge.connect(adminAccount).pause(PauseMode.UnpausedAll) + expect(await OmniBridge.paused(PauseMode.PausedInitTransfer)).to.be.false + await OmniBridge.connect(adminAccount).pause(PauseAll) + expect(await OmniBridge.paused(PauseMode.PausedInitTransfer)).to.be.true + }) +}) diff --git a/evm/tests/BridgeTokenWormhole.ts b/evm/tests/BridgeTokenWormhole.ts new file mode 100644 index 00000000..002c969e --- /dev/null +++ b/evm/tests/BridgeTokenWormhole.ts @@ -0,0 +1,230 @@ +import { anyValue } from "@nomicfoundation/hardhat-chai-matchers/withArgs" +import * as borsh from "borsh" +import { expect } from "chai" +import type { BigNumberish, Signer } from "ethers" +import { ethers, upgrades } from "hardhat" +import type { BridgeToken, OmniBridgeWormhole, TestWormhole } from "../typechain-types" +import { depositSignature, metadataSignature, testWallet } from "./helpers/signatures" + +const WormholeFee = 10000 + +class FinTransferWormholeMessage { + static schema = { + struct: { + messageType: "u8", + originChain: "u8", + originNonce: "u64", + omniBridgeChainId: "u8", + tokenAddress: { array: { type: "u8", len: 20 } }, + amount: "u128", + feeRecipient: "string", + }, + } + + constructor( + public messageType: number, + public originChain: BigNumberish, + public originNonce: bigint, + public omniBridgeChainId: number, + public tokenAddress: Uint8Array, + public amount: bigint, + public feeRecipient: string, + ) {} + + static serialize(msg: FinTransferWormholeMessage): Uint8Array { + return borsh.serialize(FinTransferWormholeMessage.schema, msg) + } +} + +class InitTransferWormholeMessage { + static schema = { + struct: { + messageType: "u8", + originChainId: "u8", + sender: { array: { type: "u8", len: 20 } }, + destinationChainId: "u8", + tokenAddress: { array: { type: "u8", len: 20 } }, + originNonce: "u64", + amount: "u128", + fee: "u128", + nativeFee: "u128", + recipient: "string", + message: "string", + }, + } + + constructor( + public messageType: number, + public originChainId: number, + public sender: Uint8Array, + public destinationChainId: number, + public tokenAddress: Uint8Array, + public originNonce: bigint, + public amount: bigint, + public fee: bigint, + public nativeFee: bigint, + public recipient: string, + public message: string, + ) {} + + static serialize(msg: InitTransferWormholeMessage): Uint8Array { + return borsh.serialize(InitTransferWormholeMessage.schema, msg) + } +} + +describe("BridgeTokenWormhole", () => { + const wrappedNearId = "wrap.testnet" + const consistencyLevel = 3 + + let user1: Signer + let adminAccount: Signer + let OmniBridgeInstance: BridgeToken + let OmniBridgeWormhole: OmniBridgeWormhole + let TestWormhole: TestWormhole + + beforeEach(async () => { + ;[adminAccount] = await ethers.getSigners() + user1 = await ethers.getImpersonatedSigner("0x3A445243376C32fAba679F63586e236F77EA601e") + await fundAddress(await user1.getAddress(), "1") + + const bridgeToken_factory = await ethers.getContractFactory("BridgeToken") + OmniBridgeInstance = await bridgeToken_factory.deploy() + await OmniBridgeInstance.waitForDeployment() + + const testWormhole_factory = await ethers.getContractFactory("TestWormhole") + TestWormhole = await testWormhole_factory.deploy() + await TestWormhole.waitForDeployment() + + const nearBridgeDeriveAddress = testWallet.address + const omniBridgeChainId = 0 + + const OmniBridgeWormhole_factory = await ethers.getContractFactory("OmniBridgeWormhole") + OmniBridgeWormhole = (await upgrades.deployProxy( + OmniBridgeWormhole_factory, + [ + await OmniBridgeInstance.getAddress(), + nearBridgeDeriveAddress, + omniBridgeChainId, + await TestWormhole.getAddress(), + consistencyLevel, + ], + { initializer: "initializeWormhole" }, + )) as unknown as OmniBridgeWormhole + await OmniBridgeWormhole.waitForDeployment() + }) + + async function fundAddress(address: string, amount: string): Promise { + const tx = await adminAccount.sendTransaction({ + to: address, + value: ethers.parseEther(amount), + }) + await tx.wait() + } + + async function createToken( + tokenId: string, + ): Promise<{ tokenProxyAddress: string; token: BridgeToken }> { + const { signature, payload } = metadataSignature(tokenId) + + await OmniBridgeWormhole.deployToken(signature, payload, { value: WormholeFee }) + const tokenProxyAddress = await OmniBridgeWormhole.nearToEthToken(tokenId) + const token = OmniBridgeInstance.attach(tokenProxyAddress) as BridgeToken + return { tokenProxyAddress, token } + } + + it("deploy token", async () => { + const { signature, payload } = metadataSignature(wrappedNearId) + + await expect(await OmniBridgeWormhole.deployToken(signature, payload, { value: WormholeFee })) + .to.emit(TestWormhole, "MessagePublished") + .withArgs(0, anyValue, consistencyLevel) + }) + + it("fin transfer", async () => { + const { token } = await createToken(wrappedNearId) + const tokenProxyAddress = await token.getAddress() + const { signature, payload } = depositSignature(tokenProxyAddress, await user1.getAddress()) + + // Serialize the payload using borsh + const messagePayload = FinTransferWormholeMessage.serialize({ + messageType: 1, + originChain: payload.originChain, + originNonce: BigInt(payload.originNonce), + omniBridgeChainId: 0, + tokenAddress: ethers.getBytes(tokenProxyAddress), + amount: BigInt(payload.amount), + feeRecipient: payload.feeRecipient, + }) + + await expect(OmniBridgeWormhole.finTransfer(signature, payload, { value: WormholeFee })) + .to.emit(TestWormhole, "MessagePublished") + .withArgs(1, messagePayload, consistencyLevel) + + expect((await token.balanceOf(payload.recipient)).toString()).to.be.equal( + payload.amount.toString(), + ) + }) + + it("init transfer", async () => { + const { token } = await createToken(wrappedNearId) + const tokenProxyAddress = await token.getAddress() + const { signature, payload } = depositSignature(tokenProxyAddress, await user1.getAddress()) + await OmniBridgeWormhole.finTransfer(signature, payload, { value: WormholeFee }) + + const recipient = "testrecipient.near" + const fee = 0 + const nativeFee = 0 + const nonce = 1 + const message = "" + + const expectedWormholeMessage = InitTransferWormholeMessage.serialize({ + messageType: 0, + originChainId: 0, + sender: ethers.getBytes(await user1.getAddress()), + destinationChainId: 0, + tokenAddress: ethers.getBytes(tokenProxyAddress), + originNonce: BigInt(nonce), + amount: BigInt(payload.amount), + fee: BigInt(fee), + nativeFee: BigInt(nativeFee), + recipient: recipient, + message: message, + }) + + await expect( + OmniBridgeWormhole.connect(user1).initTransfer( + tokenProxyAddress, + payload.amount, + fee, + nativeFee, + recipient, + message, + { + value: WormholeFee, + }, + ), + ) + .to.emit(TestWormhole, "MessagePublished") + .withArgs(2, expectedWormholeMessage, consistencyLevel) + + expect((await token.balanceOf(await user1.getAddress())).toString()).to.be.equal("0") + }) + + it("can't init transfer without enough value", async () => { + const { token } = await createToken(wrappedNearId) + const tokenProxyAddress = await token.getAddress() + const { signature, payload } = depositSignature(tokenProxyAddress, await user1.getAddress()) + await OmniBridgeWormhole.finTransfer(signature, payload, { value: WormholeFee }) + + await expect( + OmniBridgeWormhole.connect(user1).initTransfer( + tokenProxyAddress, + payload.amount, + 0, + 0, + "testrecipient.near", + "", + ), + ).to.be.revertedWith("invalid fee") + }) +}) diff --git a/evm/tests/eNearProxy.test.ts b/evm/tests/eNearProxy.test.ts new file mode 100644 index 00000000..12a96fac --- /dev/null +++ b/evm/tests/eNearProxy.test.ts @@ -0,0 +1,137 @@ +import type { HardhatEthersSigner } from "@nomicfoundation/hardhat-ethers/signers" +import { expect } from "chai" +import { ethers, upgrades } from "hardhat" +import type { ENearProxy, FakeProver, IENear } from "../typechain-types" + +const UNPAUSED_ALL = 0 +const PAUSE_FINALISE_FROM_NEAR = 1 << 0 +const PAUSE_TRANSFER_TO_NEAR = 1 << 1 + +describe("eNearProxy contract", () => { + let deployer: HardhatEthersSigner + let eNearAdmin: HardhatEthersSigner + let alice: HardhatEthersSigner + let _bob: HardhatEthersSigner + let nearProver: FakeProver + let eNear: IENear + let eNearProxy: ENearProxy + + const ERC20_NAME = "eNear" + const ERC20_SYMBOL = "eNear" + + //https://etherscan.io/address/0x85F17Cf997934a597031b2E18a9aB6ebD4B9f6a4#code + const eNearDeployBytecode = + "0x60806040523480156200001157600080fd5b5060405162002d2638038062002d26833981810160405260e08110156200003757600080fd5b81019080805160405193929190846401000000008211156200005857600080fd5b9083019060208201858111156200006e57600080fd5b82516401000000008111828201881017156200008957600080fd5b82525081516020918201929091019080838360005b83811015620000b85781810151838201526020016200009e565b50505050905090810190601f168015620000e65780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200010a57600080fd5b9083019060208201858111156200012057600080fd5b82516401000000008111828201881017156200013b57600080fd5b82525081516020918201929091019080838360005b838110156200016a57818101518382015260200162000150565b50505050905090810190601f168015620001985780820380516001836020036101000a031916815260200191505b5060405260200180516040519392919084640100000000821115620001bc57600080fd5b908301906020820185811115620001d257600080fd5b8251640100000000811182820188101715620001ed57600080fd5b82525081516020918201929091019080838360005b838110156200021c57818101518382015260200162000202565b50505050905090810190601f1680156200024a5780820380516001836020036101000a031916815260200191505b506040908152602082810151918301516060840151608090940151895193965090945091839183918791899188918d918d916200028d916003918501906200035a565b508051620002a39060049060208401906200035a565b505060058054601260ff1990911617610100600160a81b0319166101006001600160a01b03871602179055508151620002e49060069060208501906200035a565b50600780546001600160401b0319166001600160401b03929092169190911790555050600980546001600160a01b0319166001600160a01b039390931692909217909155600a5562000337601862000344565b50505050505050620003f6565b6005805460ff191660ff92909216919091179055565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200039d57805160ff1916838001178555620003cd565b82800160010185558215620003cd579182015b82811115620003cd578251825591602001919060010190620003b0565b50620003db929150620003df565b5090565b5b80821115620003db5760008155600101620003e0565b61292080620004066000396000f3fe60806040526004361061014b5760003560e01c80636bf43296116100b6578063be831a2e1161006f578063be831a2e14610614578063c30a0f2514610644578063dd62ed3e1461066e578063e3113e3b146106a9578063f48ab4e014610763578063f851a4401461076b5761014b565b80636bf432961461047357806370a08231146104a457806395d89b41146104d7578063a457c2d7146104ec578063a9059cbb14610525578063b8e9744c1461055e5761014b565b8063313ce56711610108578063313ce567146102d257806332a8f30f146102fd578063395093511461032e5780633a239bee14610367578063530208f2146104255780635c975abb1461045e5761014b565b806306fdde0314610150578063095ea7b3146101da57806318160ddd1461022757806323b872dd1461024e5780632692c59f146102915780632a8853cd146102bd575b600080fd5b34801561015c57600080fd5b50610165610780565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561019f578181015183820152602001610187565b50505050905090810190601f1680156101cc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156101e657600080fd5b50610213600480360360408110156101fd57600080fd5b506001600160a01b038135169060200135610816565b604080519115158252519081900360200190f35b34801561023357600080fd5b5061023c610833565b60408051918252519081900360200190f35b34801561025a57600080fd5b506102136004803603606081101561027157600080fd5b506001600160a01b03813581169160208101359091169060400135610839565b34801561029d57600080fd5b506102bb600480360360208110156102b457600080fd5b50356108c0565b005b3480156102c957600080fd5b506101656108dc565b3480156102de57600080fd5b506102e761096a565b6040805160ff9092168252519081900360200190f35b34801561030957600080fd5b50610312610973565b604080516001600160a01b039092168252519081900360200190f35b34801561033a57600080fd5b506102136004803603604081101561035157600080fd5b506001600160a01b038135169060200135610987565b34801561037357600080fd5b506102bb6004803603604081101561038a57600080fd5b8101906020810181356401000000008111156103a557600080fd5b8201836020820111156103b757600080fd5b803590602001918460018302840111640100000000831117156103d957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505090356001600160401b031691506109d59050565b34801561043157600080fd5b506102bb6004803603604081101561044857600080fd5b506001600160a01b038135169060200135610a9c565b34801561046a57600080fd5b5061023c610aee565b34801561047f57600080fd5b50610488610af4565b604080516001600160401b039092168252519081900360200190f35b3480156104b057600080fd5b5061023c600480360360208110156104c757600080fd5b50356001600160a01b0316610b03565b3480156104e357600080fd5b50610165610b22565b3480156104f857600080fd5b506102136004803603604081101561050f57600080fd5b506001600160a01b038135169060200135610b83565b34801561053157600080fd5b506102136004803603604081101561054857600080fd5b506001600160a01b038135169060200135610beb565b6101656004803603604081101561057457600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561059f57600080fd5b8201836020820111156105b157600080fd5b803590602001918460018302840111640100000000831117156105d357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610bff945050505050565b34801561062057600080fd5b506102bb6004803603604081101561063757600080fd5b5080359060200135610cd3565b34801561065057600080fd5b506102136004803603602081101561066757600080fd5b5035610cee565b34801561067a57600080fd5b5061023c6004803603604081101561069157600080fd5b506001600160a01b0381358116916020013516610d03565b3480156106b557600080fd5b506102bb600480360360408110156106cc57600080fd5b813591908101906040810160208201356401000000008111156106ee57600080fd5b82018360208201111561070057600080fd5b8035906020019184600183028401116401000000008311171561072257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610d2e945050505050565b6102bb610e10565b34801561077757600080fd5b50610312610e29565b60038054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561080c5780601f106107e15761010080835404028352916020019161080c565b820191906000526020600020905b8154815290600101906020018083116107ef57829003601f168201915b5050505050905090565b600061082a610823610e38565b8484610e3c565b50600192915050565b60025490565b6000610846848484610f28565b6108b684610852610e38565b6108b18560405180606001604052806028815260200161276a602891396001600160a01b038a16600090815260016020526040812090610890610e38565b6001600160a01b031681526020810191909152604001600020549190611083565b610e3c565b5060019392505050565b6009546001600160a01b031633146108d757600080fd5b600a55565b6006805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156109625780601f1061093757610100808354040283529160200191610962565b820191906000526020600020905b81548152906001019060200180831161094557829003601f168201915b505050505081565b60055460ff1690565b60055461010090046001600160a01b031681565b600061082a610994610e38565b846108b185600160006109a5610e38565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549061111a565b600180600a5416600014806109f457506009546001600160a01b031633145b6109fd57600080fd5b610a0561244b565b610a0f848461117b565b9050610a19612478565b610a2682606001516115b6565b9050610a43816020015182600001516001600160801b0316611664565b80602001516001600160a01b03167f3538c3349544a9ce6d1cfda849857b2b8fa919c15fe6d382e08573b9838d2aa8826000015160405180826001600160801b0316815260200191505060405180910390a25050505050565b6009546001600160a01b03163314610ab357600080fd5b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610ae9573d6000803e3d6000fd5b505050565b600a5481565b6007546001600160401b031681565b6001600160a01b0381166000908152602081905260409020545b919050565b60048054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561080c5780601f106107e15761010080835404028352916020019161080c565b600061082a610b90610e38565b846108b1856040518060600160405280602581526020016128c66025913960016000610bba610e38565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190611083565b600061082a610bf8610e38565b8484610f28565b6009546060906001600160a01b03163314610c1957600080fd5b60006060846001600160a01b0316846040518082805190602001908083835b60208310610c575780518252601f199092019160209182019101610c38565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114610cb7576040519150601f19603f3d011682016040523d82523d6000602084013e610cbc565b606091505b509150915081610ccb57600080fd5b949350505050565b6009546001600160a01b03163314610cea57600080fd5b9055565b60086020526000908152604090205460ff1681565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600280600a541660001480610d4d57506009546001600160a01b031633145b610d5657600080fd5b610d603384611754565b336001600160a01b03167fabeef16c62fe7504587dd9ef5d707aeb0932570da8eb1a4f099c6e80524b17c384846040518083815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610dd0578181015183820152602001610db8565b50505050905090810190601f168015610dfd5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a2505050565b6009546001600160a01b03163314610e2757600080fd5b565b6009546001600160a01b031681565b3390565b6001600160a01b038316610e815760405162461bcd60e51b81526004018080602001828103825260248152602001806128656024913960400191505060405180910390fd5b6001600160a01b038216610ec65760405162461bcd60e51b81526004018080602001828103825260228152602001806126b66022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b038316610f6d5760405162461bcd60e51b81526004018080602001828103825260258152602001806127ef6025913960400191505060405180910390fd5b6001600160a01b038216610fb25760405162461bcd60e51b81526004018080602001828103825260238152602001806126296023913960400191505060405180910390fd5b610fbd838383610ae9565b610ffa8160405180606001604052806026815260200161270f602691396001600160a01b0386166000908152602081905260409020549190611083565b6001600160a01b038085166000908152602081905260408082209390935590841681522054611029908261111a565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081848411156111125760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156110d75781810151838201526020016110bf565b50505050905090810190601f1680156111045780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082820183811015611174576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b61118361244b565b600554604080516392d68dfd60e01b81526001600160401b0385166024820152600481019182528551604482015285516101009093046001600160a01b0316926392d68dfd9287928792829160640190602086019080838360005b838110156111f65781810151838201526020016111de565b50505050905090810190601f1680156112235780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b15801561124157600080fd5b505afa158015611255573d6000803e3d6000fd5b505050506040513d602081101561126b57600080fd5b50516112b6576040805162461bcd60e51b8152602060048201526015602482015274141c9bdbd9881cda1bdd5b19081899481d985b1a59605a1b604482015290519081900360640190fd5b6112be61248f565b6112c784611850565b90506112d16124a9565b6112da82611872565b6007546040808301510151519192506001600160401b0390811691161015611349576040805162461bcd60e51b815260206004820152601f60248201527f50726f6f662069732066726f6d2074686520616e6369656e7420626c6f636b00604482015290519081900360640190fd5b611352826118b4565b61138d5760405162461bcd60e51b815260040180806020018281038252602c815260200180612814602c913960400191505060405180910390fd5b600081600001516040015160200151602001516000815181106113ac57fe5b6020908102919091018101516000818152600890925260409091205490915060ff161561140a5760405162461bcd60e51b81526004018080602001828103825260258152602001806128406025913960400191505060405180910390fd5b60008181526008602052604090819020805460ff19166001908117909155905160068054909282918491600260001991831615610100029190910190911604801561148c5780601f1061146a57610100808354040283529182019161148c565b820191906000526020600020905b815481529060010190602001808311611478575b50509150506040518091039020826000015160400151602001516080015180519060200120146114ed5760405162461bcd60e51b815260040180806020018281038252604881526020018061264c6048913960600191505060405180910390fd5b8160000151604001516020015160a0015193508360400151156115415760405162461bcd60e51b815260040180806020018281038252603c815260200180612792603c913960400191505060405180910390fd5b8360200151156115825760405162461bcd60e51b815260040180806020018281038252603d815260200180612889603d913960400191505060405180910390fd5b60405181907fb226e263cb7a3bde6afd6e46c543e956d49171b4fe4f0daf93cb1798f2315d1d90600090a250505092915050565b6115be612478565b6115c661248f565b6115cf83611850565b905060006115dc826118c0565b905060ff811615611634576040805162461bcd60e51b815260206004820152601760248201527f4552525f4e4f545f57495448445241575f524553554c54000000000000000000604482015290519081900360640190fd5b61163d82611942565b6001600160801b03168352600061165383611974565b60601c602085015250919392505050565b6001600160a01b0382166116bf576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6116cb60008383610ae9565b6002546116d8908261111a565b6002556001600160a01b0382166000908152602081905260409020546116fe908261111a565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b0382166117995760405162461bcd60e51b81526004018080602001828103825260218152602001806127ce6021913960400191505060405180910390fd5b6117a582600083610ae9565b6117e281604051806060016040528060228152602001612694602291396001600160a01b0385166000908152602081905260409020549190611083565b6001600160a01b03831660009081526020819052604090205560025461180890826119b0565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b61185861248f565b506040805180820190915260008152602081019190915290565b61187a6124a9565b61188382611a0d565b815261188e82611a41565b602082015261189c82611ae1565b60408201526118aa82611a41565b6060820152919050565b60208101515190511490565b600081600180826000015101826020015151101561191b576040805162461bcd60e51b8152602060048201526013602482015272426f7273683a204f7574206f662072616e676560681b604482015290519081900360640190fd5b602084015184518151811061192c57fe5b0160200151825190910190915260f81c92915050565b600061194d82611c86565b6001600160401b03169050604061196383611c86565b6001600160401b0316901b17919050565b6000805b60148110156119aa578060080261198e846118c0565b60f81b6001600160f81b031916901c9190911790600101611978565b50919050565b600082821115611a07576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b611a156124e8565b611a1e82611a41565b8152611a2982611cb2565b6020820152611a3782611d27565b6040820152919050565b611a4961250f565b611a5282611ea0565b63ffffffff166001600160401b0381118015611a6d57600080fd5b50604051908082528060200260200182016040528015611aa757816020015b611a94612478565b815260200190600190039081611a8c5790505b50815260005b8151518110156119aa57611ac083611ec8565b8251805183908110611ace57fe5b6020908102919091010152600101611aad565b611ae9612522565b611af282611cb2565b8152611afd82611cb2565b6020820152611b0b82611f2c565b816040018190525060028082604001516101000151836020015160405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b60208310611b7a5780518252601f199092019160209182019101611b5b565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa158015611bb9573d6000803e3d6000fd5b5050506040513d6020811015611bce57600080fd5b50518251604080516020818101949094528082019290925280518083038201815260609092019081905281519192909182918401908083835b60208310611c265780518252601f199092019160209182019101611c07565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa158015611c65573d6000803e3d6000fd5b5050506040513d6020811015611c7a57600080fd5b50516060820152919050565b6000611c9182611ea0565b63ffffffff1690506020611ca483611ea0565b63ffffffff16901b17919050565b6000816020808260000151018260200151511015611d0d576040805162461bcd60e51b8152602060048201526013602482015272426f7273683a204f7574206f662072616e676560681b604482015290519081900360640190fd5b602080850151945190940190930151815190930190525090565b611d2f61254e565b611d3882611cb2565b8152611d4382611fc9565b81602001819052506000816020015160c001515160010190506002600082901c60ff16600883901c60ff16601084901c60ff16601885901c60ff168660000151876020015160c00151604051602001808760ff1660f81b81526001018660ff1660f81b81526001018560ff1660f81b81526001018460ff1660f81b8152600101838152602001828051906020019060200280838360005b83811015611df2578181015183820152602001611dda565b5050505090500196505050505050506040516020818303038152906040526040518082805190602001908083835b60208310611e3f5780518252601f199092019160209182019101611e20565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa158015611e7e573d6000803e3d6000fd5b5050506040513d6020811015611e9357600080fd5b5051604083015250919050565b6000611eab82612297565b61ffff1690506010611ebc83612297565b61ffff16901b17919050565b611ed0612478565b611ed982611cb2565b8152611ee4826118c0565b60ff1660208201819052600211610b1d5760405162461bcd60e51b81526004018080602001828103825260378152602001806126d86037913960400191505060405180910390fd5b611f34612569565b611f3f8260d06122bd565b610100820152611f4e82611c86565b6001600160401b03168152611f6282611cb2565b6020820152611f7082611cb2565b6040820152611f7e82611cb2565b6060820152611f8c82611cb2565b6080820152611f9a82611c86565b6001600160401b031660a0820152611fb182611cb2565b60c0820152611fbf82611cb2565b60e0820152919050565b611fd16125b5565b611fda82611ea0565b63ffffffff166001600160401b0381118015611ff557600080fd5b5060405190808252806020026020018201604052801561202957816020015b60608152602001906001900390816120145790505b50815260005b81515181101561206357612042836122d2565b825180518390811061205057fe5b602090810291909101015260010161202f565b50815161206f83611ea0565b63ffffffff166001600160401b038111801561208a57600080fd5b506040519080825280602002602001820160405280156120b4578160200160208202803683370190505b50602083015260005b8260200151518110156120f6576120d384611cb2565b836020015182815181106120e357fe5b60209081029190910101526001016120bd565b5061210083611c86565b6001600160401b0316604083015261211783611942565b6001600160801b0316606083015261212e836122d2565b608083015261213c83612369565b60a083015282518251516001016001600160401b038111801561215e57600080fd5b50604051908082528060200260200182016040528015612188578160200160208202803683370190505b5060c084015281845261219d848383036122bd565b8360c001516000815181106121ae57fe5b602090810291909101015280845260005b83515181101561228f576002846000015182815181106121db57fe5b60200260200101516040518082805190602001908083835b602083106122125780518252601f1990920191602091820191016121f3565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa158015612251573d6000803e3d6000fd5b5050506040513d602081101561226657600080fd5b505160c085015180516001840190811061227c57fe5b60209081029190910101526001016121bf565b505050919050565b60006122a2826118c0565b60ff16905060086122b2836118c0565b60ff16901b17919050565b60006111748360200151846000015184612429565b60606122dd82611ea0565b63ffffffff166001600160401b03811180156122f857600080fd5b506040519080825280601f01601f191660200182016040528015612323576020820181803683370190505b50905060005b81518110156119aa5761233b836118c0565b60f81b82828151811061234a57fe5b60200101906001600160f81b031916908160001a905350600101612329565b61237161244b565b61237a826118c0565b60ff168082526123905760016020820152610b1d565b806000015160ff16600114156123ac5760016040820152610b1d565b806000015160ff16600214156123cf576123c5826122d2565b6060820152610b1d565b806000015160ff16600314156123f2576123e882611cb2565b6080820152610b1d565b60405162461bcd60e51b81526004018080602001828103825260358152602001806127356035913960400191505060405180910390fd5b600061243361260a565b6020818486602089010160025afa5051949350505050565b6040805160a081018252600080825260208201819052918101829052606080820152608081019190915290565b604080518082019091526000808252602082015290565b604051806040016040528060008152602001606081525090565b60405180608001604052806124bc6124e8565b81526020016124c961250f565b81526020016124d6612522565b81526020016124e361250f565b905290565b60405180606001604052806124fb61250f565b8152600060208201526040016124e361254e565b6040518060200160405280606081525090565b6040805160808101825260008082526020820152908101612541612569565b8152600060209091015290565b604080516060810190915260008152602081016125416125b5565b6040805161012081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081019190915290565b6040518060e00160405280606081526020016060815260200160006001600160401b0316815260200160006001600160801b03168152602001606081526020016125fd61244b565b8152602001606081525090565b6040518060200160405280600190602082028036833750919291505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737343616e206f6e6c7920756e6c6f636b20746f6b656e732066726f6d20746865206c696e6b65642070726f6f662070726f6475636572206f6e204e65617220626c6f636b636861696e45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737350726f6f664465636f6465723a204d65726b6c65506174684974656d20646972656374696f6e2073686f756c642062652030206f72203145524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654e6561724465636f6465723a206465636f6465457865637574696f6e53746174757320696e646578206f7574206f662072616e676545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636543616e6e6f7420757365206661696c656420657865637574696f6e206f7574636f6d6520666f7220756e6c6f636b696e672074686520746f6b656e7345524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f2061646472657373417267756d656e742073686f756c6420626520657861637420626f7273682073657269616c697a6174696f6e546865206275726e206576656e742070726f6f662063616e6e6f742062652072657573656445524332303a20617070726f76652066726f6d20746865207a65726f206164647265737343616e6e6f742075736520756e6b6e6f776e20657865637574696f6e206f7574636f6d6520666f7220756e6c6f636b696e672074686520746f6b656e7345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212201225bbd7f0a82122ab1cb419399486bffa69ce7288e9343b357e554f3a55808a64736f6c634300060c0033" + const eNearAbi = + '[{"inputs":[{"internalType":"string","name":"_tokenName","type":"string"},{"internalType":"string","name":"_tokenSymbol","type":"string"},{"internalType":"bytes","name":"_nearConnector","type":"bytes"},{"internalType":"contract INearProver","name":"_prover","type":"address"},{"internalType":"uint64","name":"_minBlockAcceptanceHeight","type":"uint64"},{"internalType":"address","name":"_admin","type":"address"},{"internalType":"uint256","name":"_pausedFlags","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"_receiptId","type":"bytes32"}],"name":"ConsumedProof","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint128","name":"amount","type":"uint128"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"}],"name":"NearToEthTransferFinalised","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"string","name":"accountId","type":"string"}],"name":"TransferToNearInitiated","type":"event"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"adminDelegatecall","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"flags","type":"uint256"}],"name":"adminPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"adminReceiveEth","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address payable","name":"destination","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"adminSendEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"key","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"adminSstore","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"proofData","type":"bytes"},{"internalType":"uint64","name":"proofBlockHeight","type":"uint64"}],"name":"finaliseNearToEthTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minBlockAcceptanceHeight","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nearConnector","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"prover","outputs":[{"internalType":"contract INearProver","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"string","name":"_nearReceiverAccountId","type":"string"}],"name":"transferToNear","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"usedProofs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]' + + beforeEach(async () => { + ;[deployer, eNearAdmin, alice, _bob] = await ethers.getSigners() + + const nearProverMockContractFactory = await ethers.getContractFactory("FakeProver") + nearProver = await nearProverMockContractFactory.deploy() + await nearProver.waitForDeployment() + + // Proofs coming from blocks below this value should be rejected + const minBlockAcceptanceHeight = 0 + + const eNearContractFactory = new ethers.ContractFactory(eNearAbi, eNearDeployBytecode, deployer) + + eNear = (await eNearContractFactory.deploy( + ERC20_NAME, + ERC20_SYMBOL, + Buffer.from("eNearBridge", "utf-8"), + await nearProver.getAddress(), + minBlockAcceptanceHeight, + eNearAdmin.address, + UNPAUSED_ALL, + )) as IENear + + await eNear.waitForDeployment() + + const eNearProxyFactory = await ethers.getContractFactory("ENearProxy") + eNearProxy = (await upgrades.deployProxy( + eNearProxyFactory, + [await eNear.getAddress(), Buffer.from("eNearBridge", "utf-8"), 0], + { initializer: "initialize" }, + )) as unknown as ENearProxy + + await eNearProxy.waitForDeployment() + }) + + describe("transferToNear()", () => { + it("Mint by using eNearProxy", async () => { + await eNearProxy + .connect(deployer) + .grantRole(ethers.keccak256(ethers.toUtf8Bytes("MINTER_ROLE")), alice.address) + await eNearProxy.connect(alice).mint(await eNear.getAddress(), alice.address, 100) + expect(await eNear.balanceOf(alice.address)).to.equal(100) + }) + + it("Two mints by using eNearProxy", async () => { + await eNearProxy + .connect(deployer) + .grantRole(ethers.keccak256(ethers.toUtf8Bytes("MINTER_ROLE")), alice.address) + await eNearProxy.connect(alice).mint(await eNear.getAddress(), alice.address, 100) + expect(await eNear.balanceOf(alice.address)).to.equal(100) + + await eNearProxy.connect(alice).mint(await eNear.getAddress(), alice.address, 100) + expect(await eNear.balanceOf(alice.address)).to.equal(200) + }) + + it("Burn by using eNearProxy", async () => { + await eNearProxy + .connect(deployer) + .grantRole(ethers.keccak256(ethers.toUtf8Bytes("MINTER_ROLE")), alice.address) + await eNearProxy.connect(alice).mint(await eNear.getAddress(), alice.address, 100) + expect(await eNear.balanceOf(alice.address)).to.equal(100) + expect(await eNear.totalSupply()).to.equal(100) + + await eNear.connect(alice).transfer(await eNearProxy.getAddress(), 100) + + expect(await eNear.totalSupply()).to.equal(100) + + await eNearProxy.connect(alice).burn(await eNear.getAddress(), 100) + + expect(await eNear.totalSupply()).to.equal(0) + }) + + it("Set Fake Prover", async () => { + const nearProverMockContractFactory = await ethers.getContractFactory("FakeProver") + const fakeProver = await nearProverMockContractFactory.deploy() + await fakeProver.waitForDeployment() + + expect(await eNear.prover()).to.equal(await nearProver.getAddress()) + let slotValue = await ethers.provider.getStorage(await eNear.getAddress(), 5) + slotValue = (await fakeProver.getAddress()).concat(slotValue.slice(-2)) + + await eNear.connect(eNearAdmin).adminSstore(5, ethers.zeroPadValue(slotValue, 32)) + expect(await eNear.prover()).to.equal(await fakeProver.getAddress()) + }) + + it("Set Proxy as Admin", async () => { + expect(await eNear.admin()).to.equal(await eNearAdmin.getAddress()) + await eNear + .connect(eNearAdmin) + .adminSstore(9, ethers.zeroPadValue(await eNearProxy.getAddress(), 32)) + expect(await eNear.admin()).to.equal(await eNearProxy.getAddress()) + }) + + it("Pause All", async () => { + await eNear.connect(eNearAdmin).adminPause(PAUSE_TRANSFER_TO_NEAR | PAUSE_FINALISE_FROM_NEAR) + + await eNearProxy + .connect(deployer) + .grantRole(ethers.keccak256(ethers.toUtf8Bytes("MINTER_ROLE")), alice.address) + await expect(eNearProxy.connect(alice).mint(await eNear.getAddress(), alice.address, 100)).to + .be.reverted + expect(await eNear.balanceOf(alice.address)).to.equal(0) + + await eNear + .connect(eNearAdmin) + .adminSstore(9, ethers.zeroPadValue(await eNearProxy.getAddress(), 32)) + await eNearProxy.connect(alice).mint(await eNear.getAddress(), alice.address, 100) + expect(await eNear.balanceOf(alice.address)).to.equal(100) + }) + }) +}) diff --git a/evm/tests/helpers/signatures.ts b/evm/tests/helpers/signatures.ts new file mode 100644 index 00000000..ef28eb9a --- /dev/null +++ b/evm/tests/helpers/signatures.ts @@ -0,0 +1,144 @@ +import * as borsh from "borsh" +import { type BigNumberish, Wallet } from "ethers" +import { ethers } from "hardhat" +import type { BridgeTypes } from "../../typechain-types/src/omni-bridge/contracts/OmniBridge" + +interface SignatureData { + payload: T + signature: string +} + +// Constants +const TEST_PRIVATE_KEY = "0x1234567890123456789012345678901234567890123456789012345678901234" +export const testWallet = new Wallet(TEST_PRIVATE_KEY) + +// Message Classes +class MetadataMessage { + static schema = { + struct: { + payloadType: "u8", + token: "string", + name: "string", + symbol: "string", + decimals: "u8", + }, + } + + constructor( + public payloadType: number, + public token: string, + public name: string, + public symbol: string, + public decimals: BigNumberish, + ) {} + + static serialize(msg: MetadataMessage): Uint8Array { + return borsh.serialize(MetadataMessage.schema, msg) + } +} + +class TransferMessage { + static schema = { + struct: { + payloadType: "u8", + destinationNonce: "u64", + originChain: "u8", + originNonce: "u64", + omniBridgeChainId: "u8", + tokenAddress: { array: { type: "u8", len: 20 } }, + amount: "u128", + recipientChainId: "u8", + recipient: { array: { type: "u8", len: 20 } }, + feeRecipient: { option: "string" }, + }, + } + + constructor( + public payloadType: number, + public destinationNonce: bigint, + public originChain: BigNumberish, + public originNonce: bigint, + public omniBridgeChainId: number, + public tokenAddress: Uint8Array, + public amount: bigint, + public recipientChainId: number, + public recipient: Uint8Array, + public feeRecipient: string | null, + ) {} + + static serialize(msg: TransferMessage): Uint8Array { + return borsh.serialize(TransferMessage.schema, msg) + } +} + +// Utility Functions +function createMessageHash(borshEncoded: Uint8Array): string { + return ethers.keccak256(borshEncoded) +} + +function signMessage(messageHash: string): string { + return testWallet.signingKey.sign(ethers.getBytes(messageHash)).serialized +} + +// Main Functions +export function metadataSignature( + tokenId: string, +): SignatureData { + const payload: BridgeTypes.MetadataPayloadStruct = { + token: tokenId, + name: "Wrapped NEAR fungible token", + symbol: "wNEAR", + decimals: 24, + } + + const message = new MetadataMessage( + 1, + payload.token, + payload.name, + payload.symbol, + payload.decimals, + ) + const borshEncoded = MetadataMessage.serialize(message) + const messageHash = createMessageHash(borshEncoded) + const signature = signMessage(messageHash) + + return { payload, signature } +} + +export function depositSignature( + tokenAddress: string, + recipient: string, +): SignatureData { + const payload: BridgeTypes.TransferMessagePayloadStruct = { + destinationNonce: 1, + tokenAddress, + amount: 1, + recipient, + feeRecipient: "", + originChain: 1, + originNonce: 1, + } + + if (typeof payload.tokenAddress !== "string" || typeof payload.recipient !== "string") { + throw new Error("tokenAddress and recipient must be strings") + } + + const message = new TransferMessage( + 0, + BigInt(payload.destinationNonce), + payload.originChain, + BigInt(payload.originNonce), + 0, + ethers.getBytes(payload.tokenAddress), + BigInt(payload.amount), + 0, + ethers.getBytes(payload.recipient), + null, + ) + + const borshEncoded = TransferMessage.serialize(message) + const messageHash = createMessageHash(borshEncoded) + const signature = signMessage(messageHash) + + return { payload, signature } +} diff --git a/evm/tsconfig.json b/evm/tsconfig.json new file mode 100644 index 00000000..0b1e1d4c --- /dev/null +++ b/evm/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "target": "es2020", + "module": "commonjs", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "moduleResolution": "node", + "resolveJsonModule": true, + "outDir": "dist", + "declaration": true + }, + "include": ["./tests", "./scripts", "./typechain-types"], + "files": ["hardhat.config.ts"] +} diff --git a/evm/utils/kdf.ts b/evm/utils/kdf.ts new file mode 100644 index 00000000..ac1a9817 --- /dev/null +++ b/evm/utils/kdf.ts @@ -0,0 +1,70 @@ +import bs58 from "bs58" +import { ec as EC } from "elliptic" +import { ethers } from "ethers" +import { sha3_256 } from "js-sha3" + +// sources: +// https://github.com/near-examples/near-multichain/blob/main/src/services/kdf.js +// https://docs.near.org/build/chain-abstraction/chain-signatures/#1-deriving-the-foreign-address + +const mpcRootPublicKeys = { + testnet: { + accountId: "v1.signer-prod.testnet", + key: "secp256k1:4NfTiv3UsGahebgTaHyD9vF8KYKMBnfd6kh94mK6xv8fGBiJB8TBtFMP5WWXz6B89Ac1fbpzPwAvoyQebemHFwx3", + }, + mainnet: { + accountId: "v1.signer", + key: "secp256k1:3tFRbMqmoa6AAALMrEFAYCEoHcqKxeW38YptwowBVBtXK1vo36HDbUWuR6EZmoK4JcH6HDkNMGGqP1ouV7VZUWya", + }, +} + +function najPublicKeyStrToUncompressedHexPoint(rootPublicKey: string): string { + const res = `04${Buffer.from(bs58.decode(rootPublicKey.split(":")[1])).toString("hex")}` + return res +} + +async function deriveChildPublicKey( + parentUncompressedPublicKeyHex: string, + signerId: string, + path = "", +): Promise { + const ec = new EC("secp256k1") + const scalarHex = sha3_256(`near-mpc-recovery v0.1.0 epsilon derivation:${signerId},${path}`) + + const x = parentUncompressedPublicKeyHex.substring(2, 66) + const y = parentUncompressedPublicKeyHex.substring(66) + + // Create a point object from X and Y coordinates + const oldPublicKeyPoint = ec.curve.point(x, y) + + // Multiply the scalar by the generator point G + const scalarTimesG = ec.g.mul(scalarHex) + + // Add the result to the old public key point + const newPublicKeyPoint = oldPublicKeyPoint.add(scalarTimesG) + const newX = newPublicKeyPoint.getX().toString("hex").padStart(64, "0") + const newY = newPublicKeyPoint.getY().toString("hex").padStart(64, "0") + return `04${newX}${newY}` +} + +function uncompressedHexPointToEvmAddress(uncompressedHexPoint: string): string { + const addressHash = ethers.keccak256(`0x${uncompressedHexPoint.slice(2)}`) + + // Ethereum address is last 20 bytes of hash (40 characters), prefixed with 0x + return `0x${addressHash.substring(addressHash.length - 40)}` +} + +async function deriveEVMAddress( + accountId: string, + derivation_path: string, + rootPublicKey: string, +): Promise { + const publicKey = await deriveChildPublicKey( + najPublicKeyStrToUncompressedHexPoint(rootPublicKey), + accountId, + derivation_path, + ) + return uncompressedHexPointToEvmAddress(publicKey) +} + +export { deriveEVMAddress, deriveChildPublicKey, mpcRootPublicKeys } diff --git a/evm/yarn.lock b/evm/yarn.lock new file mode 100644 index 00000000..89dd5abb --- /dev/null +++ b/evm/yarn.lock @@ -0,0 +1,3555 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@adraffy/ens-normalize@1.10.1": + version "1.10.1" + resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz#63430d04bd8c5e74f8d7d049338f1cd9d4f02069" + integrity sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw== + +"@aws-crypto/sha256-js@1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-js/-/sha256-js-1.2.2.tgz#02acd1a1fda92896fc5a28ec7c6e164644ea32fc" + integrity sha512-Nr1QJIbW/afYYGzYvrF70LtaHrIRtd4TNAglX8BvlfxJLZ45SAmueIKYl5tWoNBPzp65ymXGFK0Bb1vZUpuc9g== + dependencies: + "@aws-crypto/util" "^1.2.2" + "@aws-sdk/types" "^3.1.0" + tslib "^1.11.1" + +"@aws-crypto/util@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@aws-crypto/util/-/util-1.2.2.tgz#b28f7897730eb6538b21c18bd4de22d0ea09003c" + integrity sha512-H8PjG5WJ4wz0UXAFXeJjWCW1vkvIJ3qUUD+rGRwJ2/hj+xT58Qle2MTql/2MGzkU+1JLAFuR6aJpLAjHwhmwwg== + dependencies: + "@aws-sdk/types" "^3.1.0" + "@aws-sdk/util-utf8-browser" "^3.0.0" + tslib "^1.11.1" + +"@aws-sdk/types@^3.1.0": + version "3.696.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.696.0.tgz#559c3df74dc389b6f40ba6ec6daffeab155330cd" + integrity sha512-9rTvUJIAj5d3//U5FDPWGJ1nFJLuWb30vugGOrWk7aNZ6y9tuA3PI7Cc9dP8WEXKVyK1vuuk8rSFP2iqXnlgrw== + dependencies: + "@smithy/types" "^3.7.1" + tslib "^2.6.2" + +"@aws-sdk/util-utf8-browser@^3.0.0": + version "3.259.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz#3275a6f5eb334f96ca76635b961d3c50259fd9ff" + integrity sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw== + dependencies: + tslib "^2.3.1" + +"@biomejs/biome@^1.9.4": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@biomejs/biome/-/biome-1.9.4.tgz#89766281cbc3a0aae865a7ff13d6aaffea2842bf" + integrity sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog== + optionalDependencies: + "@biomejs/cli-darwin-arm64" "1.9.4" + "@biomejs/cli-darwin-x64" "1.9.4" + "@biomejs/cli-linux-arm64" "1.9.4" + "@biomejs/cli-linux-arm64-musl" "1.9.4" + "@biomejs/cli-linux-x64" "1.9.4" + "@biomejs/cli-linux-x64-musl" "1.9.4" + "@biomejs/cli-win32-arm64" "1.9.4" + "@biomejs/cli-win32-x64" "1.9.4" + +"@biomejs/cli-darwin-arm64@1.9.4": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.9.4.tgz#dfa376d23a54a2d8f17133c92f23c1bf2e62509f" + integrity sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw== + +"@biomejs/cli-darwin-x64@1.9.4": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.9.4.tgz#eafc2ce3849d385fc02238aad1ca4a73395a64d9" + integrity sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg== + +"@biomejs/cli-linux-arm64-musl@1.9.4": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.9.4.tgz#d780c3e01758fc90f3268357e3f19163d1f84fca" + integrity sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA== + +"@biomejs/cli-linux-arm64@1.9.4": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.9.4.tgz#8ed1dd0e89419a4b66a47f95aefb8c46ae6041c9" + integrity sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g== + +"@biomejs/cli-linux-x64-musl@1.9.4": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.9.4.tgz#f36982b966bd671a36671e1de4417963d7db15fb" + integrity sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg== + +"@biomejs/cli-linux-x64@1.9.4": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64/-/cli-linux-x64-1.9.4.tgz#a0a7f56680c76b8034ddc149dbf398bdd3a462e8" + integrity sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg== + +"@biomejs/cli-win32-arm64@1.9.4": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.9.4.tgz#e2ef4e0084e76b7e26f0fc887c5ef1265ea56200" + integrity sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg== + +"@biomejs/cli-win32-x64@1.9.4": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-x64/-/cli-win32-x64-1.9.4.tgz#4c7afa90e3970213599b4095e62f87e5972b2340" + integrity sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA== + +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + +"@ethereumjs/rlp@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@ethereumjs/rlp/-/rlp-4.0.1.tgz#626fabfd9081baab3d0a3074b0c7ecaf674aaa41" + integrity sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw== + +"@ethereumjs/util@^8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/util/-/util-8.1.0.tgz#299df97fb6b034e0577ce9f94c7d9d1004409ed4" + integrity sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA== + dependencies: + "@ethereumjs/rlp" "^4.0.1" + ethereum-cryptography "^2.0.0" + micro-ftch "^0.3.1" + +"@ethersproject/abi@^5.0.9", "@ethersproject/abi@^5.1.2": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" + integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== + dependencies: + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/abstract-provider@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef" + integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + +"@ethersproject/abstract-signer@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2" + integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + +"@ethersproject/address@^5.0.2", "@ethersproject/address@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" + integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + +"@ethersproject/base64@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c" + integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== + dependencies: + "@ethersproject/bytes" "^5.7.0" + +"@ethersproject/bignumber@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" + integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + bn.js "^5.2.1" + +"@ethersproject/bytes@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" + integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/constants@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e" + integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + +"@ethersproject/hash@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" + integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/keccak256@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" + integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== + dependencies: + "@ethersproject/bytes" "^5.7.0" + js-sha3 "0.8.0" + +"@ethersproject/logger@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" + integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== + +"@ethersproject/networks@^5.7.0": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" + integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/properties@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" + integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/rlp@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" + integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/signing-key@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3" + integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + bn.js "^5.2.1" + elliptic "6.5.4" + hash.js "1.1.7" + +"@ethersproject/strings@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" + integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/transactions@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" + integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== + dependencies: + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + +"@ethersproject/web@^5.7.0": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" + integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== + dependencies: + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@fastify/busboy@^2.0.0": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.1.tgz#b9da6a878a371829a0502c9b6c1c143ef6663f4d" + integrity sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA== + +"@jridgewell/resolve-uri@^3.0.3": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@metamask/eth-sig-util@^4.0.0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz#3ad61f6ea9ad73ba5b19db780d40d9aae5157088" + integrity sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ== + dependencies: + ethereumjs-abi "^0.6.8" + ethereumjs-util "^6.2.1" + ethjs-util "^0.1.6" + tweetnacl "^1.0.3" + tweetnacl-util "^0.15.1" + +"@noble/curves@1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.2.0.tgz#92d7e12e4e49b23105a2555c6984d41733d65c35" + integrity sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw== + dependencies: + "@noble/hashes" "1.3.2" + +"@noble/curves@1.4.2", "@noble/curves@~1.4.0": + version "1.4.2" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.4.2.tgz#40309198c76ed71bc6dbf7ba24e81ceb4d0d1fe9" + integrity sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw== + dependencies: + "@noble/hashes" "1.4.0" + +"@noble/hashes@1.2.0", "@noble/hashes@~1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.2.0.tgz#a3150eeb09cc7ab207ebf6d7b9ad311a9bdbed12" + integrity sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ== + +"@noble/hashes@1.3.2": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39" + integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== + +"@noble/hashes@1.4.0", "@noble/hashes@~1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" + integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== + +"@noble/hashes@^1.4.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.6.0.tgz#d4bfb516ad6e7b5111c216a5cc7075f4cf19e6c5" + integrity sha512-YUULf0Uk4/mAA89w+k3+yUYh6NrEvxZa5T6SY3wlMvE2chHkxFUUIDI8/XW1QSC357iA5pSnqt7XEhvFOqmDyQ== + +"@noble/secp256k1@1.7.1", "@noble/secp256k1@~1.7.0": + version "1.7.1" + resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c" + integrity sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@nomicfoundation/edr-darwin-arm64@0.6.5": + version "0.6.5" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.6.5.tgz#37a31565d7ef42bed9028ac44aed82144de30bd1" + integrity sha512-A9zCCbbNxBpLgjS1kEJSpqxIvGGAX4cYbpDYCU2f3jVqOwaZ/NU761y1SvuCRVpOwhoCXqByN9b7HPpHi0L4hw== + +"@nomicfoundation/edr-darwin-x64@0.6.5": + version "0.6.5" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.6.5.tgz#3252f6e86397af460b7a480bfe1b889464d75b89" + integrity sha512-x3zBY/v3R0modR5CzlL6qMfFMdgwd6oHrWpTkuuXnPFOX8SU31qq87/230f4szM+ukGK8Hi+mNq7Ro2VF4Fj+w== + +"@nomicfoundation/edr-linux-arm64-gnu@0.6.5": + version "0.6.5" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.6.5.tgz#e7dc2934920b6cfabeb5ee7a5e26c8fb0d4964ac" + integrity sha512-HGpB8f1h8ogqPHTyUpyPRKZxUk2lu061g97dOQ/W4CxevI0s/qiw5DB3U3smLvSnBHKOzYS1jkxlMeGN01ky7A== + +"@nomicfoundation/edr-linux-arm64-musl@0.6.5": + version "0.6.5" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.6.5.tgz#00459cd53e9fb7bd5b7e32128b508a6e89079d89" + integrity sha512-ESvJM5Y9XC03fZg9KaQg3Hl+mbx7dsSkTIAndoJS7X2SyakpL9KZpOSYrDk135o8s9P9lYJdPOyiq+Sh+XoCbQ== + +"@nomicfoundation/edr-linux-x64-gnu@0.6.5": + version "0.6.5" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.6.5.tgz#5c9e4e2655caba48e0196977cba395bbde6fe97d" + integrity sha512-HCM1usyAR1Ew6RYf5AkMYGvHBy64cPA5NMbaeY72r0mpKaH3txiMyydcHibByOGdQ8iFLWpyUdpl1egotw+Tgg== + +"@nomicfoundation/edr-linux-x64-musl@0.6.5": + version "0.6.5" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.6.5.tgz#9c220751b66452dc43a365f380e1e236a0a8c5a9" + integrity sha512-nB2uFRyczhAvWUH7NjCsIO6rHnQrof3xcCe6Mpmnzfl2PYcGyxN7iO4ZMmRcQS7R1Y670VH6+8ZBiRn8k43m7A== + +"@nomicfoundation/edr-win32-x64-msvc@0.6.5": + version "0.6.5" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.6.5.tgz#90d3ac2a6a8a687522bda5ff2e92dd97e68126ea" + integrity sha512-B9QD/4DSSCFtWicO8A3BrsnitO1FPv7axB62wq5Q+qeJ50yJlTmyeGY3cw62gWItdvy2mh3fRM6L1LpnHiB77A== + +"@nomicfoundation/edr@^0.6.4": + version "0.6.5" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr/-/edr-0.6.5.tgz#b3b1ebcdd0148cfe67cca128e7ebe8092e200359" + integrity sha512-tAqMslLP+/2b2sZP4qe9AuGxG3OkQ5gGgHE4isUuq6dUVjwCRPFhAOhpdFl+OjY5P3yEv3hmq9HjUGRa2VNjng== + dependencies: + "@nomicfoundation/edr-darwin-arm64" "0.6.5" + "@nomicfoundation/edr-darwin-x64" "0.6.5" + "@nomicfoundation/edr-linux-arm64-gnu" "0.6.5" + "@nomicfoundation/edr-linux-arm64-musl" "0.6.5" + "@nomicfoundation/edr-linux-x64-gnu" "0.6.5" + "@nomicfoundation/edr-linux-x64-musl" "0.6.5" + "@nomicfoundation/edr-win32-x64-msvc" "0.6.5" + +"@nomicfoundation/ethereumjs-common@4.0.4": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.4.tgz#9901f513af2d4802da87c66d6f255b510bef5acb" + integrity sha512-9Rgb658lcWsjiicr5GzNCjI1llow/7r0k50dLL95OJ+6iZJcVbi15r3Y0xh2cIO+zgX0WIHcbzIu6FeQf9KPrg== + dependencies: + "@nomicfoundation/ethereumjs-util" "9.0.4" + +"@nomicfoundation/ethereumjs-rlp@5.0.4": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.4.tgz#66c95256fc3c909f6fb18f6a586475fc9762fa30" + integrity sha512-8H1S3s8F6QueOc/X92SdrA4RDenpiAEqMg5vJH99kcQaCy/a3Q6fgseo75mgWlbanGJXSlAPtnCeG9jvfTYXlw== + +"@nomicfoundation/ethereumjs-tx@5.0.4": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.4.tgz#b0ceb58c98cc34367d40a30d255d6315b2f456da" + integrity sha512-Xjv8wAKJGMrP1f0n2PeyfFCCojHd7iS3s/Ab7qzF1S64kxZ8Z22LCMynArYsVqiFx6rzYy548HNVEyI+AYN/kw== + dependencies: + "@nomicfoundation/ethereumjs-common" "4.0.4" + "@nomicfoundation/ethereumjs-rlp" "5.0.4" + "@nomicfoundation/ethereumjs-util" "9.0.4" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/ethereumjs-util@9.0.4": + version "9.0.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.4.tgz#84c5274e82018b154244c877b76bc049a4ed7b38" + integrity sha512-sLOzjnSrlx9Bb9EFNtHzK/FJFsfg2re6bsGqinFinH1gCqVfz9YYlXiMWwDM4C/L4ywuHFCYwfKTVr/QHQcU0Q== + dependencies: + "@nomicfoundation/ethereumjs-rlp" "5.0.4" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/hardhat-chai-matchers@^2.0.8": + version "2.0.8" + resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-2.0.8.tgz#9c7cfc4ad0f0a5e9cf16aba8ab668c02f6e273aa" + integrity sha512-Z5PiCXH4xhNLASROlSUOADfhfpfhYO6D7Hn9xp8PddmHey0jq704cr6kfU8TRrQ4PUZbpfsZadPj+pCfZdjPIg== + dependencies: + "@types/chai-as-promised" "^7.1.3" + chai-as-promised "^7.1.1" + deep-eql "^4.0.1" + ordinal "^1.0.3" + +"@nomicfoundation/hardhat-ethers@^3.0.6": + version "3.0.8" + resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-ethers/-/hardhat-ethers-3.0.8.tgz#af078f566373abeb77e11cbe69fe3dd47f8bfc27" + integrity sha512-zhOZ4hdRORls31DTOqg+GmEZM0ujly8GGIuRY7t7szEk2zW/arY1qDug/py8AEktT00v5K+b6RvbVog+va51IA== + dependencies: + debug "^4.1.1" + lodash.isequal "^4.5.0" + +"@nomicfoundation/hardhat-network-helpers@^1.0.12": + version "1.0.12" + resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.12.tgz#2c0abec0c50b75f9d0d71776e49e3b5ef746d289" + integrity sha512-xTNQNI/9xkHvjmCJnJOTyqDSl8uq1rKb2WOVmixQxFtRd7Oa3ecO8zM0cyC2YmOK+jHB9WPZ+F/ijkHg1CoORA== + dependencies: + ethereumjs-util "^7.1.4" + +"@nomicfoundation/hardhat-verify@^2.0.12": + version "2.0.12" + resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-verify/-/hardhat-verify-2.0.12.tgz#480819a245a2db0b127e473c62079f7b4f16daa8" + integrity sha512-Lg3Nu7DCXASQRVI/YysjuAX2z8jwOCbS0w5tz2HalWGSTZThqA0v9N0v0psHbKNqzPJa8bNOeapIVSziyJTnAg== + dependencies: + "@ethersproject/abi" "^5.1.2" + "@ethersproject/address" "^5.0.2" + cbor "^8.1.0" + debug "^4.1.1" + lodash.clonedeep "^4.5.0" + picocolors "^1.1.0" + semver "^6.3.0" + table "^6.8.0" + undici "^5.14.0" + +"@nomicfoundation/slang-darwin-arm64@0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/slang-darwin-arm64/-/slang-darwin-arm64-0.17.0.tgz#8cded3c24322624e3b6618760caba8e840bd1c1d" + integrity sha512-O0q94EUtoWy9A5kOTOa9/khtxXDYnLqmuda9pQELurSiwbQEVCPQL8kb34VbOW+ifdre66JM/05Xw9JWhIZ9sA== + +"@nomicfoundation/slang-darwin-x64@0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/slang-darwin-x64/-/slang-darwin-x64-0.17.0.tgz#6ebeb33a2ced89fc6023f6cda4af96403486038a" + integrity sha512-IaDbHzvT08sBK2HyGzonWhq1uu8IxdjmTqAWHr25Oh/PYnamdi8u4qchZXXYKz/DHLoYN3vIpBXoqLQIomhD/g== + +"@nomicfoundation/slang-linux-arm64-gnu@0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/slang-linux-arm64-gnu/-/slang-linux-arm64-gnu-0.17.0.tgz#41c7e57a9b1a3aee6911f0cab22e683c149fb470" + integrity sha512-Lj4anvOsQZxs1SycG8VyT2Rl2oqIhyLSUCgGepTt3CiJ/bM+8r8bLJIgh8vKkki4BWz49YsYIgaJB2IPv8FFTw== + +"@nomicfoundation/slang-linux-arm64-musl@0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/slang-linux-arm64-musl/-/slang-linux-arm64-musl-0.17.0.tgz#9c4b51689274ae75c2c8a4cddd2e1cc0a79c191d" + integrity sha512-/xkTCa9d5SIWUBQE3BmLqDFfJRr4yUBwbl4ynPiGUpRXrD69cs6pWKkwjwz/FdBpXqVo36I+zY95qzoTj/YhOA== + +"@nomicfoundation/slang-linux-x64-gnu@0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/slang-linux-x64-gnu/-/slang-linux-x64-gnu-0.17.0.tgz#c3a3b6a7b775fc617832958d10e6664bf86d39d0" + integrity sha512-oe5IO5vntOqYvTd67deCHPIWuSuWm6aYtT2/0Kqz2/VLtGz4ClEulBSRwfnNzBVtw2nksWipE1w8BzhImI7Syg== + +"@nomicfoundation/slang-linux-x64-musl@0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/slang-linux-x64-musl/-/slang-linux-x64-musl-0.17.0.tgz#725118ff99a7217b9f1d1bd84411d9442084077d" + integrity sha512-PpYCI5K/kgLAMXaPY0V4VST5gCDprEOh7z/47tbI8kJQumI5odjsj/Cs8MpTo7/uRH6flKYbVNgUzcocWVYrAQ== + +"@nomicfoundation/slang-win32-arm64-msvc@0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/slang-win32-arm64-msvc/-/slang-win32-arm64-msvc-0.17.0.tgz#9c8bc4ccf21eaaac0cfcb6d3954ede4e2dea4c02" + integrity sha512-u/Mkf7OjokdBilP7QOJj6QYJU4/mjkbKnTX21wLyCIzeVWS7yafRPYpBycKIBj2pRRZ6ceAY5EqRpb0aiCq+0Q== + +"@nomicfoundation/slang-win32-ia32-msvc@0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/slang-win32-ia32-msvc/-/slang-win32-ia32-msvc-0.17.0.tgz#3fc5d00a3f8c1d85a5e94146af78a5526a4f3d27" + integrity sha512-XJBVQfNnZQUv0tP2JSJ573S+pmgrLWgqSZOGaMllnB/TL1gRci4Z7dYRJUF2s82GlRJE+FHSI2Ro6JISKmlXCg== + +"@nomicfoundation/slang-win32-x64-msvc@0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/slang-win32-x64-msvc/-/slang-win32-x64-msvc-0.17.0.tgz#f6a5e3250fa07cbda49151edeb80f09090e5b71a" + integrity sha512-zPGsAeiTfqfPNYHD8BfrahQmYzA78ZraoHKTGraq/1xwJwzBK4bu/NtvVA4pJjBV+B4L6DCxVhSbpn40q26JQA== + +"@nomicfoundation/slang@^0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/slang/-/slang-0.17.0.tgz#d9c25cd711ebf3490c9d0c99e9b4ca2481341a6b" + integrity sha512-1GlkGRcGpVnjFw9Z1vvDKOKo2mzparFt7qrl2pDxWp+jrVtlvej98yCMX52pVyrYE7ZeOSZFnx/DtsSgoukStQ== + dependencies: + "@nomicfoundation/slang-darwin-arm64" "0.17.0" + "@nomicfoundation/slang-darwin-x64" "0.17.0" + "@nomicfoundation/slang-linux-arm64-gnu" "0.17.0" + "@nomicfoundation/slang-linux-arm64-musl" "0.17.0" + "@nomicfoundation/slang-linux-x64-gnu" "0.17.0" + "@nomicfoundation/slang-linux-x64-musl" "0.17.0" + "@nomicfoundation/slang-win32-arm64-msvc" "0.17.0" + "@nomicfoundation/slang-win32-ia32-msvc" "0.17.0" + "@nomicfoundation/slang-win32-x64-msvc" "0.17.0" + +"@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.2.tgz#3a9c3b20d51360b20affb8f753e756d553d49557" + integrity sha512-JaqcWPDZENCvm++lFFGjrDd8mxtf+CtLd2MiXvMNTBD33dContTZ9TWETwNFwg7JTJT5Q9HEecH7FA+HTSsIUw== + +"@nomicfoundation/solidity-analyzer-darwin-x64@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.2.tgz#74dcfabeb4ca373d95bd0d13692f44fcef133c28" + integrity sha512-fZNmVztrSXC03e9RONBT+CiksSeYcxI1wlzqyr0L7hsQlK1fzV+f04g2JtQ1c/Fe74ZwdV6aQBdd6Uwl1052sw== + +"@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.2.tgz#4af5849a89e5a8f511acc04f28eb5d4460ba2b6a" + integrity sha512-3d54oc+9ZVBuB6nbp8wHylk4xh0N0Gc+bk+/uJae+rUgbOBwQSfuGIbAZt1wBXs5REkSmynEGcqx6DutoK0tPA== + +"@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.2.tgz#54036808a9a327b2ff84446c130a6687ee702a8e" + integrity sha512-iDJfR2qf55vgsg7BtJa7iPiFAsYf2d0Tv/0B+vhtnI16+wfQeTbP7teookbGvAo0eJo7aLLm0xfS/GTkvHIucA== + +"@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.2.tgz#466cda0d6e43691986c944b909fc6dbb8cfc594e" + integrity sha512-9dlHMAt5/2cpWyuJ9fQNOUXFB/vgSFORg1jpjX1Mh9hJ/MfZXlDdHQ+DpFCs32Zk5pxRBb07yGvSHk9/fezL+g== + +"@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.2.tgz#2b35826987a6e94444140ac92310baa088ee7f94" + integrity sha512-GzzVeeJob3lfrSlDKQw2bRJ8rBf6mEYaWY+gW0JnTDHINA0s2gPR4km5RLIj1xeZZOYz4zRw+AEeYgLRqB2NXg== + +"@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.2.tgz#e6363d13b8709ca66f330562337dbc01ce8bbbd9" + integrity sha512-Fdjli4DCcFHb4Zgsz0uEJXZ2K7VEO+w5KVv7HmT7WO10iODdU9csC2az4jrhEsRtiR9Gfd74FlG0NYlw1BMdyA== + +"@nomicfoundation/solidity-analyzer@^0.1.0": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.2.tgz#8bcea7d300157bf3a770a851d9f5c5e2db34ac55" + integrity sha512-q4n32/FNKIhQ3zQGGw5CvPF6GTvDCpYwIf7bEY/dZTZbgfDsHyjJwURxUJf3VQuuJj+fDIFl4+KkBVbw4Ef6jA== + optionalDependencies: + "@nomicfoundation/solidity-analyzer-darwin-arm64" "0.1.2" + "@nomicfoundation/solidity-analyzer-darwin-x64" "0.1.2" + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu" "0.1.2" + "@nomicfoundation/solidity-analyzer-linux-arm64-musl" "0.1.2" + "@nomicfoundation/solidity-analyzer-linux-x64-gnu" "0.1.2" + "@nomicfoundation/solidity-analyzer-linux-x64-musl" "0.1.2" + "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.1.2" + +"@openzeppelin/contracts-upgradeable@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-5.1.0.tgz#4d37648b7402929c53e2ff6e45749ecff91eb2b6" + integrity sha512-AIElwP5Ck+cslNE+Hkemf5SxjJoF4wBvvjxc27Rp+9jaPs/CLIaUBMYe1FNzhdiN0cYuwGRmYaRHmmntuiju4Q== + +"@openzeppelin/contracts@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-5.1.0.tgz#4e61162f2a2bf414c4e10c45eca98ce5f1aadbd4" + integrity sha512-p1ULhl7BXzjjbha5aqst+QMLY+4/LCWADXOCsmLHRM77AqiPjnd9vvUN9sosUfhL9JGKpZ0TjEGxgvnizmWGSA== + +"@openzeppelin/defender-sdk-base-client@^1.14.4", "@openzeppelin/defender-sdk-base-client@^1.15.2": + version "1.15.2" + resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-base-client/-/defender-sdk-base-client-1.15.2.tgz#aae7ec001365968b81ccce087f39a6eb52fa13f9" + integrity sha512-N3ZTeH8TXyklL7yNPMLUv0dxQwT78DTkOEDhzMS2/QE2FxbXrclSseoeeXxl6UYI61RBtZKn+okbSsbwiB5QWQ== + dependencies: + amazon-cognito-identity-js "^6.3.6" + async-retry "^1.3.3" + +"@openzeppelin/defender-sdk-deploy-client@^1.14.4": + version "1.15.2" + resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-deploy-client/-/defender-sdk-deploy-client-1.15.2.tgz#3b1d953aa66b6cdee13e7e672a488af2e2acf974" + integrity sha512-zspzMqh+OC8arXAkgBqTUDVO+NfCkt54UrsmQHbA3UAjr5TiDXKycBKU5ORb01hE+2gAmoPwEpDW9uS2VLg33A== + dependencies: + "@openzeppelin/defender-sdk-base-client" "^1.15.2" + axios "^1.7.2" + lodash "^4.17.21" + +"@openzeppelin/defender-sdk-network-client@^1.14.4": + version "1.15.2" + resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-network-client/-/defender-sdk-network-client-1.15.2.tgz#7178836d9861272ad509d93dea8739a5c4bf86c1" + integrity sha512-9r9pegc1aR7xzP9fmj1zvkk0OXMRJE10JabxxiJzAQQgmNXDeTGI6W5bFgrNJfxzcImNGqddJ3K4weKdLyL21A== + dependencies: + "@openzeppelin/defender-sdk-base-client" "^1.15.2" + axios "^1.7.2" + lodash "^4.17.21" + +"@openzeppelin/hardhat-upgrades@^3.5.0": + version "3.5.0" + resolved "https://registry.yarnpkg.com/@openzeppelin/hardhat-upgrades/-/hardhat-upgrades-3.5.0.tgz#90ed0508fed8415b7fa9ee1c04ade8ec57091d46" + integrity sha512-Ju/JnT7NRiOMi5m5Y0dGiz37d8wnjVBep1v5Vr7+6+MFNuQa1yddUEVWhWhoEw4udI3/mYwyw4Sfz3sq7vhicQ== + dependencies: + "@openzeppelin/defender-sdk-base-client" "^1.14.4" + "@openzeppelin/defender-sdk-deploy-client" "^1.14.4" + "@openzeppelin/defender-sdk-network-client" "^1.14.4" + "@openzeppelin/upgrades-core" "^1.40.0" + chalk "^4.1.0" + debug "^4.1.1" + ethereumjs-util "^7.1.5" + proper-lockfile "^4.1.1" + undici "^6.11.1" + +"@openzeppelin/upgrades-core@^1.40.0": + version "1.40.0" + resolved "https://registry.yarnpkg.com/@openzeppelin/upgrades-core/-/upgrades-core-1.40.0.tgz#f01647afb99b46356b3e7b98e3b2c7f864d85add" + integrity sha512-4bPSXdEqHsNRL5T1ybPLneWGYjzGl6XWGWkv7aUoFFgz8mOdarstRBX1Wi4XJFw6IeHPUI7mMSQr2jdz8Y2ypQ== + dependencies: + "@nomicfoundation/slang" "^0.17.0" + cbor "^9.0.0" + chalk "^4.1.0" + compare-versions "^6.0.0" + debug "^4.1.1" + ethereumjs-util "^7.0.3" + minimatch "^9.0.5" + minimist "^1.2.7" + proper-lockfile "^4.1.1" + solidity-ast "^0.4.51" + +"@scure/base@~1.1.0", "@scure/base@~1.1.6": + version "1.1.9" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.9.tgz#e5e142fbbfe251091f9c5f1dd4c834ac04c3dbd1" + integrity sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg== + +"@scure/bip32@1.1.5": + version "1.1.5" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.1.5.tgz#d2ccae16dcc2e75bc1d75f5ef3c66a338d1ba300" + integrity sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw== + dependencies: + "@noble/hashes" "~1.2.0" + "@noble/secp256k1" "~1.7.0" + "@scure/base" "~1.1.0" + +"@scure/bip32@1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.4.0.tgz#4e1f1e196abedcef395b33b9674a042524e20d67" + integrity sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg== + dependencies: + "@noble/curves" "~1.4.0" + "@noble/hashes" "~1.4.0" + "@scure/base" "~1.1.6" + +"@scure/bip39@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.1.1.tgz#b54557b2e86214319405db819c4b6a370cf340c5" + integrity sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg== + dependencies: + "@noble/hashes" "~1.2.0" + "@scure/base" "~1.1.0" + +"@scure/bip39@1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.3.0.tgz#0f258c16823ddd00739461ac31398b4e7d6a18c3" + integrity sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ== + dependencies: + "@noble/hashes" "~1.4.0" + "@scure/base" "~1.1.6" + +"@sentry/core@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3" + integrity sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg== + dependencies: + "@sentry/hub" "5.30.0" + "@sentry/minimal" "5.30.0" + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + tslib "^1.9.3" + +"@sentry/hub@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.30.0.tgz#2453be9b9cb903404366e198bd30c7ca74cdc100" + integrity sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ== + dependencies: + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + tslib "^1.9.3" + +"@sentry/minimal@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.30.0.tgz#ce3d3a6a273428e0084adcb800bc12e72d34637b" + integrity sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw== + dependencies: + "@sentry/hub" "5.30.0" + "@sentry/types" "5.30.0" + tslib "^1.9.3" + +"@sentry/node@^5.18.1": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.30.0.tgz#4ca479e799b1021285d7fe12ac0858951c11cd48" + integrity sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg== + dependencies: + "@sentry/core" "5.30.0" + "@sentry/hub" "5.30.0" + "@sentry/tracing" "5.30.0" + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + cookie "^0.4.1" + https-proxy-agent "^5.0.0" + lru_map "^0.3.3" + tslib "^1.9.3" + +"@sentry/tracing@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-5.30.0.tgz#501d21f00c3f3be7f7635d8710da70d9419d4e1f" + integrity sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw== + dependencies: + "@sentry/hub" "5.30.0" + "@sentry/minimal" "5.30.0" + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + tslib "^1.9.3" + +"@sentry/types@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.30.0.tgz#19709bbe12a1a0115bc790b8942917da5636f402" + integrity sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw== + +"@sentry/utils@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.30.0.tgz#9a5bd7ccff85ccfe7856d493bffa64cabc41e980" + integrity sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww== + dependencies: + "@sentry/types" "5.30.0" + tslib "^1.9.3" + +"@smithy/types@^3.7.1": + version "3.7.1" + resolved "https://registry.yarnpkg.com/@smithy/types/-/types-3.7.1.tgz#4af54c4e28351e9101996785a33f2fdbf93debe7" + integrity sha512-XKLcLXZY7sUQgvvWyeaL/qwNPp6V3dWcUjqrQKjSb+tzYiCy340R/c64LV5j+Tnb2GhmunEX0eou+L+m2hJNYA== + dependencies: + tslib "^2.6.2" + +"@solidity-parser/parser@^0.18.0": + version "0.18.0" + resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.18.0.tgz#8e77a02a09ecce957255a2f48c9a7178ec191908" + integrity sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA== + +"@tsconfig/node10@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" + integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== + +"@typechain/ethers-v6@^0.5.1": + version "0.5.1" + resolved "https://registry.yarnpkg.com/@typechain/ethers-v6/-/ethers-v6-0.5.1.tgz#42fe214a19a8b687086c93189b301e2b878797ea" + integrity sha512-F+GklO8jBWlsaVV+9oHaPh5NJdd6rAKN4tklGfInX1Q7h0xPgVLP39Jl3eCulPB5qexI71ZFHwbljx4ZXNfouA== + dependencies: + lodash "^4.17.15" + ts-essentials "^7.0.1" + +"@typechain/hardhat@^9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@typechain/hardhat/-/hardhat-9.1.0.tgz#6985015f01dfb37ef2ca8a29c742d05890351ddc" + integrity sha512-mtaUlzLlkqTlfPwB3FORdejqBskSnh+Jl8AIJGjXNAQfRQ4ofHADPl1+oU7Z3pAJzmZbUXII8MhOLQltcHgKnA== + dependencies: + fs-extra "^9.1.0" + +"@types/bn.js@*", "@types/bn.js@^5.1.0": + version "5.1.6" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.6.tgz#9ba818eec0c85e4d3c679518428afdf611d03203" + integrity sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w== + dependencies: + "@types/node" "*" + +"@types/bn.js@^4.11.3": + version "4.11.6" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" + integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== + dependencies: + "@types/node" "*" + +"@types/chai-as-promised@^7.1.3": + version "7.1.8" + resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.8.tgz#f2b3d82d53c59626b5d6bbc087667ccb4b677fe9" + integrity sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw== + dependencies: + "@types/chai" "*" + +"@types/chai@*": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-5.0.1.tgz#2c3705555cf11f5f59c836a84c44afcfe4e5689d" + integrity sha512-5T8ajsg3M/FOncpLYW7sdOcD6yf4+722sze/tc4KQV0P8Z2rAr3SAuHCIkYmYpt8VbcQlnz8SxlOlPQYefe4cA== + dependencies: + "@types/deep-eql" "*" + +"@types/chai@4": + version "4.3.20" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.20.tgz#cb291577ed342ca92600430841a00329ba05cecc" + integrity sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ== + +"@types/deep-eql@*": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/deep-eql/-/deep-eql-4.0.2.tgz#334311971d3a07121e7eb91b684a605e7eea9cbd" + integrity sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw== + +"@types/elliptic@^6.4.18": + version "6.4.18" + resolved "https://registry.yarnpkg.com/@types/elliptic/-/elliptic-6.4.18.tgz#bc96e26e1ccccbabe8b6f0e409c85898635482e1" + integrity sha512-UseG6H5vjRiNpQvrhy4VF/JXdA3V/Fp5amvveaL+fs28BZ6xIKJBPnUPRlEaZpysD9MbpfaLi8lbl7PGUAkpWw== + dependencies: + "@types/bn.js" "*" + +"@types/glob@^7.1.1": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" + integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== + dependencies: + "@types/minimatch" "*" + "@types/node" "*" + +"@types/lru-cache@^5.1.0": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.1.tgz#c48c2e27b65d2a153b19bfc1a317e30872e01eef" + integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== + +"@types/minimatch@*": + version "5.1.2" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" + integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== + +"@types/mocha@^10.0.9": + version "10.0.10" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.10.tgz#91f62905e8d23cbd66225312f239454a23bebfa0" + integrity sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q== + +"@types/node@*": + version "22.9.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.9.2.tgz#51e58f2bf29cc38f529dacbb0eafca890464138e" + integrity sha512-wwuxAVEbsRvDD9x7buvAl7DyQ7Oj+va/d/Veug7higYzp9MF0CINbfWTBgDFMpcVwcdUiYuNmX2KfnvY3N70mw== + dependencies: + undici-types "~6.19.8" + +"@types/node@22.7.5": + version "22.7.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.5.tgz#cfde981727a7ab3611a481510b473ae54442b92b" + integrity sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ== + dependencies: + undici-types "~6.19.2" + +"@types/node@^22.9.0": + version "22.9.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.9.3.tgz#08f3d64b3bc6d74b162d36f60213e8a6704ef2b4" + integrity sha512-F3u1fs/fce3FFk+DAxbxc78DF8x0cY09RRL8GnXLmkJ1jvx3TtPdWoTT5/NiYfI5ASqXBmfqJi9dZ3gxMx4lzw== + dependencies: + undici-types "~6.19.8" + +"@types/pbkdf2@^3.0.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.2.tgz#2dc43808e9985a2c69ff02e2d2027bd4fe33e8dc" + integrity sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew== + dependencies: + "@types/node" "*" + +"@types/prettier@^2.1.1": + version "2.7.3" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f" + integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== + +"@types/secp256k1@^4.0.1": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.6.tgz#d60ba2349a51c2cbc5e816dcd831a42029d376bf" + integrity sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ== + dependencies: + "@types/node" "*" + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +abbrev@1.0.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" + integrity sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q== + +acorn-walk@^8.1.1: + version "8.3.4" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.4.tgz#794dd169c3977edf4ba4ea47583587c5866236b7" + integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== + dependencies: + acorn "^8.11.0" + +acorn@^8.11.0, acorn@^8.4.1: + version "8.14.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0" + integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== + +adm-zip@^0.4.16: + version "0.4.16" + resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365" + integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg== + +aes-js@4.0.0-beta.5: + version "4.0.0-beta.5" + resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-4.0.0-beta.5.tgz#8d2452c52adedebc3a3e28465d858c11ca315873" + integrity sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q== + +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv@^8.0.1: + version "8.17.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" + integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== + dependencies: + fast-deep-equal "^3.1.3" + fast-uri "^3.0.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + +amazon-cognito-identity-js@^6.3.6: + version "6.3.12" + resolved "https://registry.yarnpkg.com/amazon-cognito-identity-js/-/amazon-cognito-identity-js-6.3.12.tgz#af73df033094ad4c679c19cf6122b90058021619" + integrity sha512-s7NKDZgx336cp+oDeUtB2ZzT8jWJp/v2LWuYl+LQtMEODe22RF1IJ4nRiDATp+rp1pTffCZcm44Quw4jx2bqNg== + dependencies: + "@aws-crypto/sha256-js" "1.2.2" + buffer "4.9.2" + fast-base64-decode "^1.0.0" + isomorphic-unfetch "^3.0.0" + js-cookie "^2.2.1" + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + integrity sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg== + +ansi-align@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" + integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== + dependencies: + string-width "^4.1.0" + +ansi-colors@^4.1.1, ansi-colors@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + +ansi-escapes@^4.3.0: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-back@^3.0.1, array-back@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/array-back/-/array-back-3.1.0.tgz#b8859d7a508871c9a7b2cf42f99428f65e96bfb0" + integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q== + +array-back@^4.0.1, array-back@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/array-back/-/array-back-4.0.2.tgz#8004e999a6274586beeb27342168652fdb89fa1e" + integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +assertion-error@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +async-retry@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.3.3.tgz#0e7f36c04d8478e7a58bdbed80cedf977785f280" + integrity sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw== + dependencies: + retry "0.13.1" + +async@1.x: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + integrity sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +axios@^1.7.2: + version "1.7.7" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.7.tgz#2f554296f9892a72ac8d8e4c5b79c14a91d0a47f" + integrity sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q== + dependencies: + follow-redirects "^1.15.6" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base-x@^3.0.2: + version "3.0.10" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.10.tgz#62de58653f8762b5d6f8d9fe30fa75f7b2585a75" + integrity sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ== + dependencies: + safe-buffer "^5.0.1" + +base-x@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-5.0.0.tgz#6d835ceae379130e1a4cb846a70ac4746f28ea9b" + integrity sha512-sMW3VGSX1QWVFA6l8U62MLKz29rRfpTlYdCqLdpLo1/Yd4zZwSbnUaDfciIAowAqvq7YFnWq9hrhdg1KYgc1lQ== + +base64-js@^1.0.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +binary-extensions@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== + +blakejs@^1.1.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" + integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== + +bn.js@4.11.6: + version "4.11.6" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" + integrity sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA== + +bn.js@^4.11.0, bn.js@^4.11.8, bn.js@^4.11.9: + version "4.12.1" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.1.tgz#215741fe3c9dba2d7e12c001d0cfdbae43975ba7" + integrity sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg== + +bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" + integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== + +borsh@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/borsh/-/borsh-2.0.0.tgz#042a9f109565caac3c6a21297cd8c0ae8db3149d" + integrity sha512-kc9+BgR3zz9+cjbwM8ODoUB4fs3X3I5A/HtX7LZKxCLaMrEeDFoBpnhZY//DTS1VZBSs6S5v46RZRbZjRFspEg== + +boxen@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" + integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== + dependencies: + ansi-align "^3.0.0" + camelcase "^6.2.0" + chalk "^4.1.0" + cli-boxes "^2.2.1" + string-width "^4.2.2" + type-fest "^0.20.2" + widest-line "^3.1.0" + wrap-ansi "^7.0.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.3, braces@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + +brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== + +browser-stdout@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +browserify-aes@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +bs58@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" + integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== + dependencies: + base-x "^3.0.2" + +bs58@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-6.0.0.tgz#a2cda0130558535dd281a2f8697df79caaf425d8" + integrity sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw== + dependencies: + base-x "^5.0.0" + +bs58check@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" + integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== + dependencies: + bs58 "^4.0.0" + create-hash "^1.1.0" + safe-buffer "^5.1.2" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== + +buffer@4.9.2: + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +camelcase@^6.0.0, camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +cbor@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/cbor/-/cbor-8.1.0.tgz#cfc56437e770b73417a2ecbfc9caf6b771af60d5" + integrity sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg== + dependencies: + nofilter "^3.1.0" + +cbor@^9.0.0: + version "9.0.2" + resolved "https://registry.yarnpkg.com/cbor/-/cbor-9.0.2.tgz#536b4f2d544411e70ec2b19a2453f10f83cd9fdb" + integrity sha512-JPypkxsB10s9QOWwa6zwPzqE1Md3vqpPc+cai4sAecuCsRyAtAl/pMyhPlMbT/xtPnm2dznJZYRLui57qiRhaQ== + dependencies: + nofilter "^3.1.0" + +chai-as-promised@^7.1.1: + version "7.1.2" + resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-7.1.2.tgz#70cd73b74afd519754161386421fb71832c6d041" + integrity sha512-aBDHZxRzYnUYuIAIPBH2s511DjlKPzXNlXSGFC8CwmroWQLfrW0LtE1nK3MAwwNhJPa9raEjNCmRoFpG0Hurdw== + dependencies: + check-error "^1.0.2" + +chai@4: + version "4.5.0" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.5.0.tgz#707e49923afdd9b13a8b0b47d33d732d13812fd8" + integrity sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw== + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.3" + deep-eql "^4.1.3" + get-func-name "^2.0.2" + loupe "^2.3.6" + pathval "^1.1.1" + type-detect "^4.1.0" + +chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +check-error@^1.0.2, check-error@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694" + integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== + dependencies: + get-func-name "^2.0.2" + +chokidar@^3.5.3: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chokidar@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.1.tgz#4a6dff66798fb0f72a94f616abbd7e1a19f31d41" + integrity sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA== + dependencies: + readdirp "^4.0.1" + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.5" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.5.tgz#749f80731c7821e9a5fabd51f6998b696f296686" + integrity sha512-xq7ICKB4TMHUx7Tz1L9O2SGKOhYMOTR32oir45Bq28/AQTpHogKgHcoYFSdRbMtddl+ozNXfXY9jWcgYKmde0w== + dependencies: + inherits "^2.0.4" + safe-buffer "^5.2.1" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-boxes@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" + integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +command-exists@^1.2.8: + version "1.2.9" + resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" + integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== + +command-line-args@^5.1.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-5.2.1.tgz#c44c32e437a57d7c51157696893c5909e9cec42e" + integrity sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg== + dependencies: + array-back "^3.1.0" + find-replace "^3.0.0" + lodash.camelcase "^4.3.0" + typical "^4.0.0" + +command-line-usage@^6.1.0: + version "6.1.3" + resolved "https://registry.yarnpkg.com/command-line-usage/-/command-line-usage-6.1.3.tgz#428fa5acde6a838779dfa30e44686f4b6761d957" + integrity sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw== + dependencies: + array-back "^4.0.2" + chalk "^2.4.2" + table-layout "^1.0.2" + typical "^5.2.0" + +commander@^8.1.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + +compare-versions@^6.0.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-6.1.1.tgz#7af3cc1099ba37d244b3145a9af5201b629148a9" + integrity sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +console-table-printer@^2.9.0: + version "2.12.1" + resolved "https://registry.yarnpkg.com/console-table-printer/-/console-table-printer-2.12.1.tgz#4a9646537a246a6d8de57075d4fae1e08abae267" + integrity sha512-wKGOQRRvdnd89pCeH96e2Fn4wkbenSP6LMHfjfyNLMbGuHEFbMqQNuxXqd0oXG9caIOQ1FTvc5Uijp9/4jujnQ== + dependencies: + simple-wcswidth "^1.0.1" + +cookie@^0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" + integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +death@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/death/-/death-1.1.0.tgz#01aa9c401edd92750514470b8266390c66c67318" + integrity sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w== + +debug@4, debug@^4.1.1, debug@^4.3.1, debug@^4.3.5: + version "4.3.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" + integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== + dependencies: + ms "^2.1.3" + +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + +deep-eql@^4.0.1, deep-eql@^4.1.3: + version "4.1.4" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.4.tgz#d0d3912865911bb8fac5afb4e3acfa6a28dc72b7" + integrity sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg== + dependencies: + type-detect "^4.0.0" + +deep-extend@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deep-is@~0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +diff@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531" + integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== + +difflib@^0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/difflib/-/difflib-0.2.4.tgz#b5e30361a6db023176d562892db85940a718f47e" + integrity sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w== + dependencies: + heap ">= 0.2.0" + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dotenv@^16.4.5: + version "16.4.5" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" + integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== + +elliptic@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +elliptic@^6.5.2, elliptic@^6.5.7: + version "6.6.1" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.6.1.tgz#3b8ffb02670bf69e382c7f65bf524c97c5405c06" + integrity sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +enquirer@^2.3.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" + integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== + dependencies: + ansi-colors "^4.1.1" + strip-ansi "^6.0.1" + +env-paths@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + +escalade@^3.1.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escodegen@1.8.x: + version "1.8.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" + integrity sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A== + dependencies: + esprima "^2.7.1" + estraverse "^1.9.1" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.2.0" + +esprima@2.7.x, esprima@^2.7.1: + version "2.7.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + integrity sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A== + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +estraverse@^1.9.1: + version "1.9.3" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" + integrity sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +ethereum-bloom-filters@^1.0.6: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.2.0.tgz#8294f074c1a6cbd32c39d2cc77ce86ff14797dab" + integrity sha512-28hyiE7HVsWubqhpVLVmZXFd4ITeHi+BUu05o9isf0GUpMtzBUi+8/gFrGaGYzvGAJQmJ3JKj77Mk9G98T84rA== + dependencies: + "@noble/hashes" "^1.4.0" + +ethereum-cryptography@0.1.3, ethereum-cryptography@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" + integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== + dependencies: + "@types/pbkdf2" "^3.0.0" + "@types/secp256k1" "^4.0.1" + blakejs "^1.1.0" + browserify-aes "^1.2.0" + bs58check "^2.1.2" + create-hash "^1.2.0" + create-hmac "^1.1.7" + hash.js "^1.1.7" + keccak "^3.0.0" + pbkdf2 "^3.0.17" + randombytes "^2.1.0" + safe-buffer "^5.1.2" + scrypt-js "^3.0.0" + secp256k1 "^4.0.1" + setimmediate "^1.0.5" + +ethereum-cryptography@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz#5ccfa183e85fdaf9f9b299a79430c044268c9b3a" + integrity sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw== + dependencies: + "@noble/hashes" "1.2.0" + "@noble/secp256k1" "1.7.1" + "@scure/bip32" "1.1.5" + "@scure/bip39" "1.1.1" + +ethereum-cryptography@^2.0.0, ethereum-cryptography@^2.1.2: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz#58f2810f8e020aecb97de8c8c76147600b0b8ccf" + integrity sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg== + dependencies: + "@noble/curves" "1.4.2" + "@noble/hashes" "1.4.0" + "@scure/bip32" "1.4.0" + "@scure/bip39" "1.3.0" + +ethereumjs-abi@^0.6.8: + version "0.6.8" + resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz#71bc152db099f70e62f108b7cdfca1b362c6fcae" + integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA== + dependencies: + bn.js "^4.11.8" + ethereumjs-util "^6.0.0" + +ethereumjs-util@^6.0.0, ethereumjs-util@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz#fcb4e4dd5ceacb9d2305426ab1a5cd93e3163b69" + integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw== + dependencies: + "@types/bn.js" "^4.11.3" + bn.js "^4.11.0" + create-hash "^1.1.2" + elliptic "^6.5.2" + ethereum-cryptography "^0.1.3" + ethjs-util "0.1.6" + rlp "^2.2.3" + +ethereumjs-util@^7.0.3, ethereumjs-util@^7.1.4, ethereumjs-util@^7.1.5: + version "7.1.5" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz#9ecf04861e4fbbeed7465ece5f23317ad1129181" + integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg== + dependencies: + "@types/bn.js" "^5.1.0" + bn.js "^5.1.2" + create-hash "^1.1.2" + ethereum-cryptography "^0.1.3" + rlp "^2.2.4" + +ethers@^6.13.4: + version "6.13.4" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.13.4.tgz#bd3e1c3dc1e7dc8ce10f9ffb4ee40967a651b53c" + integrity sha512-21YtnZVg4/zKkCQPjrDj38B1r4nQvTZLopUGMLQ1ePU2zV/joCfDC3t3iKQjWRzjjjbzR+mdAIoikeBRNkdllA== + dependencies: + "@adraffy/ens-normalize" "1.10.1" + "@noble/curves" "1.2.0" + "@noble/hashes" "1.3.2" + "@types/node" "22.7.5" + aes-js "4.0.0-beta.5" + tslib "2.7.0" + ws "8.17.1" + +ethjs-unit@0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" + integrity sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw== + dependencies: + bn.js "4.11.6" + number-to-bn "1.7.0" + +ethjs-util@0.1.6, ethjs-util@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536" + integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w== + dependencies: + is-hex-prefixed "1.0.0" + strip-hex-prefix "1.0.0" + +evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +fast-base64-decode@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fast-base64-decode/-/fast-base64-decode-1.0.0.tgz#b434a0dd7d92b12b43f26819300d2dafb83ee418" + integrity sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q== + +fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.0.3: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fast-uri@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.3.tgz#892a1c91802d5d7860de728f18608a0573142241" + integrity sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw== + +fastq@^1.6.0: + version "1.17.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" + integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== + dependencies: + reusify "^1.0.4" + +fdir@^6.4.2: + version "6.4.2" + resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.2.tgz#ddaa7ce1831b161bc3657bb99cb36e1622702689" + integrity sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ== + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + +find-replace@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-3.0.0.tgz#3e7e23d3b05167a76f770c9fbd5258b0def68c38" + integrity sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ== + dependencies: + array-back "^3.0.1" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +follow-redirects@^1.12.1, follow-redirects@^1.15.6: + version "1.15.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" + integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== + +form-data@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.1.tgz#ba1076daaaa5bfd7e99c1a6cb02aa0a5cff90d48" + integrity sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +fp-ts@1.19.3: + version "1.19.3" + resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.3.tgz#261a60d1088fbff01f91256f91d21d0caaaaa96f" + integrity sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg== + +fp-ts@^1.0.0: + version "1.19.5" + resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.5.tgz#3da865e585dfa1fdfd51785417357ac50afc520a" + integrity sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A== + +fs-extra@^7.0.0, fs-extra@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-func-name@^2.0.1, get-func-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" + integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== + +ghost-testrpc@^0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz#c4de9557b1d1ae7b2d20bbe474a91378ca90ce92" + integrity sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ== + dependencies: + chalk "^2.4.2" + node-emoji "^1.10.0" + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob@7.1.7: + version "7.1.7" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^5.0.15: + version "5.0.15" + resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" + integrity sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA== + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.0.0, glob@^7.1.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + +global-modules@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + +globby@^10.0.1: + version "10.0.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.2.tgz#277593e745acaa4646c3ab411289ec47a0392543" + integrity sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg== + dependencies: + "@types/glob" "^7.1.1" + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.0.3" + glob "^7.1.3" + ignore "^5.1.1" + merge2 "^1.2.3" + slash "^3.0.0" + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +handlebars@^4.0.1: + version "4.7.8" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9" + integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== + dependencies: + minimist "^1.2.5" + neo-async "^2.6.2" + source-map "^0.6.1" + wordwrap "^1.0.0" + optionalDependencies: + uglify-js "^3.1.4" + +hardhat-storage-layout@^0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/hardhat-storage-layout/-/hardhat-storage-layout-0.1.7.tgz#ad8a5afd8593ee51031eb1dd9476b4a2ed981785" + integrity sha512-q723g2iQnJpRdMC6Y8fbh/stG6MLHKNxa5jq/ohjtD5znOlOzQ6ojYuInY8V4o4WcPyG3ty4hzHYunLf66/1+A== + dependencies: + console-table-printer "^2.9.0" + +hardhat@^2.22.16: + version "2.22.16" + resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.22.16.tgz#6cf3413f63b14770f863f35452da891ac2bd50cb" + integrity sha512-d52yQZ09u0roL6GlgJSvtknsBtIuj9JrJ/U8VMzr/wue+gO5v2tQayvOX6llerlR57Zw2EOTQjLAt6RpHvjwHA== + dependencies: + "@ethersproject/abi" "^5.1.2" + "@metamask/eth-sig-util" "^4.0.0" + "@nomicfoundation/edr" "^0.6.4" + "@nomicfoundation/ethereumjs-common" "4.0.4" + "@nomicfoundation/ethereumjs-tx" "5.0.4" + "@nomicfoundation/ethereumjs-util" "9.0.4" + "@nomicfoundation/solidity-analyzer" "^0.1.0" + "@sentry/node" "^5.18.1" + "@types/bn.js" "^5.1.0" + "@types/lru-cache" "^5.1.0" + adm-zip "^0.4.16" + aggregate-error "^3.0.0" + ansi-escapes "^4.3.0" + boxen "^5.1.2" + chokidar "^4.0.0" + ci-info "^2.0.0" + debug "^4.1.1" + enquirer "^2.3.0" + env-paths "^2.2.0" + ethereum-cryptography "^1.0.3" + ethereumjs-abi "^0.6.8" + find-up "^5.0.0" + fp-ts "1.19.3" + fs-extra "^7.0.1" + immutable "^4.0.0-rc.12" + io-ts "1.10.4" + json-stream-stringify "^3.1.4" + keccak "^3.0.2" + lodash "^4.17.11" + mnemonist "^0.38.0" + mocha "^10.0.0" + p-map "^4.0.0" + picocolors "^1.1.0" + raw-body "^2.4.1" + resolve "1.17.0" + semver "^6.3.0" + solc "0.8.26" + source-map-support "^0.5.13" + stacktrace-parser "^0.1.10" + tinyglobby "^0.2.6" + tsort "0.0.1" + undici "^5.14.0" + uuid "^8.3.2" + ws "^7.4.6" + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + integrity sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +he@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +"heap@>= 0.2.0": + version "0.2.7" + resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.7.tgz#1e6adf711d3f27ce35a81fe3b7bd576c2260a8fc" + integrity sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg== + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +https-proxy-agent@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ieee754@^1.1.4: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore@^5.1.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== + +immutable@^4.0.0-rc.12: + version "4.3.7" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.7.tgz#c70145fc90d89fb02021e65c84eb0226e4e5a381" + integrity sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@^1.3.5: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +interpret@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== + +io-ts@1.10.4: + version "1.10.4" + resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-1.10.4.tgz#cd5401b138de88e4f920adbcb7026e2d1967e6e2" + integrity sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g== + dependencies: + fp-ts "^1.0.0" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-core-module@^2.13.0: + version "2.15.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37" + integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ== + dependencies: + hasown "^2.0.2" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-hex-prefixed@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" + integrity sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA== + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +isarray@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isomorphic-unfetch@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz#87341d5f4f7b63843d468438128cb087b7c3e98f" + integrity sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q== + dependencies: + node-fetch "^2.6.1" + unfetch "^4.2.0" + +js-cookie@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-2.2.1.tgz#69e106dc5d5806894562902aa5baec3744e9b2b8" + integrity sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ== + +js-sha3@0.8.0, js-sha3@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" + integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== + +js-yaml@3.x: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-stream-stringify@^3.1.4: + version "3.1.6" + resolved "https://registry.yarnpkg.com/json-stream-stringify/-/json-stream-stringify-3.1.6.tgz#ebe32193876fb99d4ec9f612389a8d8e2b5d54d4" + integrity sha512-x7fpwxOkbhFCaJDJ8vb1fBY3DdSa4AlITaz+HHILQJzdPMnHEFjxPwVUi1ALIbcIxDE0PNe/0i7frnY8QnBQog== + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonschema@^1.2.4: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.1.tgz#cc4c3f0077fb4542982973d8a083b6b34f482dab" + integrity sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ== + +keccak@^3.0.0, keccak@^3.0.2: + version "3.0.4" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.4.tgz#edc09b89e633c0549da444432ecf062ffadee86d" + integrity sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q== + dependencies: + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + readable-stream "^3.6.0" + +kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== + +lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ== + +lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== + +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== + +lodash@^4.17.11, lodash@^4.17.15, lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +loupe@^2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697" + integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== + dependencies: + get-func-name "^2.0.1" + +lru_map@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" + integrity sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ== + +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +memorystream@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" + integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== + +merge2@^1.2.3, merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micro-ftch@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/micro-ftch/-/micro-ftch-0.3.1.tgz#6cb83388de4c1f279a034fb0cf96dfc050853c5f" + integrity sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg== + +micromatch@^4.0.4: + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== + +"minimatch@2 || 3", minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^5.0.1, minimatch@^5.1.6: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^9.0.5: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.5, minimist@^1.2.6, minimist@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +mkdirp@0.5.x: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +mnemonist@^0.38.0: + version "0.38.5" + resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.38.5.tgz#4adc7f4200491237fe0fa689ac0b86539685cade" + integrity sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg== + dependencies: + obliterator "^2.0.0" + +mocha@^10.0.0, mocha@^10.2.0: + version "10.8.2" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.8.2.tgz#8d8342d016ed411b12a429eb731b825f961afb96" + integrity sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg== + dependencies: + ansi-colors "^4.1.3" + browser-stdout "^1.3.1" + chokidar "^3.5.3" + debug "^4.3.5" + diff "^5.2.0" + escape-string-regexp "^4.0.0" + find-up "^5.0.0" + glob "^8.1.0" + he "^1.2.0" + js-yaml "^4.1.0" + log-symbols "^4.1.0" + minimatch "^5.1.6" + ms "^2.1.3" + serialize-javascript "^6.0.2" + strip-json-comments "^3.1.1" + supports-color "^8.1.1" + workerpool "^6.5.1" + yargs "^16.2.0" + yargs-parser "^20.2.9" + yargs-unparser "^2.0.0" + +ms@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +node-addon-api@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" + integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== + +node-addon-api@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.1.0.tgz#49da1ca055e109a23d537e9de43c09cca21eb762" + integrity sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA== + +node-emoji@^1.10.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c" + integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A== + dependencies: + lodash "^4.17.21" + +node-fetch@^2.6.1: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + +node-gyp-build@^4.2.0: + version "4.8.4" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.4.tgz#8a70ee85464ae52327772a90d66c6077a900cfc8" + integrity sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ== + +nofilter@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-3.1.0.tgz#c757ba68801d41ff930ba2ec55bab52ca184aa66" + integrity sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g== + +nopt@3.x: + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + integrity sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg== + dependencies: + abbrev "1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +number-to-bn@1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0" + integrity sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig== + dependencies: + bn.js "4.11.6" + strip-hex-prefix "1.0.0" + +obliterator@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-2.0.4.tgz#fa650e019b2d075d745e44f1effeb13a2adbe816" + integrity sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ== + +once@1.x, once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + +ordinal@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/ordinal/-/ordinal-1.0.3.tgz#1a3c7726a61728112f50944ad7c35c06ae3a0d4d" + integrity sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ== + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-parse@^1.0.6, path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pathval@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" + integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== + +pbkdf2@^3.0.17: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +picocolors@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +picomatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" + integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== + +prettier-plugin-solidity@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/prettier-plugin-solidity/-/prettier-plugin-solidity-1.4.1.tgz#8060baf18853a9e34d2e09e47e87b4f19e15afe9" + integrity sha512-Mq8EtfacVZ/0+uDKTtHZGW3Aa7vEbX/BNx63hmVg6YTiTXSiuKP0amj0G6pGwjmLaOfymWh3QgXEZkjQbU8QRg== + dependencies: + "@solidity-parser/parser" "^0.18.0" + semver "^7.5.4" + +prettier@^2.3.1: + version "2.8.8" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== + +prettier@^3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.3.tgz#30c54fe0be0d8d12e6ae61dbb10109ea00d53105" + integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew== + +proper-lockfile@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/proper-lockfile/-/proper-lockfile-4.1.2.tgz#c8b9de2af6b2f1601067f98e01ac66baa223141f" + integrity sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA== + dependencies: + graceful-fs "^4.2.4" + retry "^0.12.0" + signal-exit "^3.0.2" + +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +raw-body@^2.4.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.0.2.tgz#388fccb8b75665da3abffe2d8f8ed59fe74c230a" + integrity sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA== + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== + dependencies: + resolve "^1.1.6" + +recursive-readdir@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.3.tgz#e726f328c0d69153bcabd5c322d3195252379372" + integrity sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA== + dependencies: + minimatch "^3.0.5" + +reduce-flatten@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-2.0.0.tgz#734fd84e65f375d7ca4465c69798c25c9d10ae27" + integrity sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w== + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +resolve@1.1.x: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + integrity sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg== + +resolve@1.17.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== + dependencies: + path-parse "^1.0.6" + +resolve@^1.1.6: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +retry@0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +rlp@^2.2.3, rlp@^2.2.4: + version "2.2.7" + resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf" + integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== + dependencies: + bn.js "^5.2.0" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sc-istanbul@^0.4.5: + version "0.4.6" + resolved "https://registry.yarnpkg.com/sc-istanbul/-/sc-istanbul-0.4.6.tgz#cf6784355ff2076f92d70d59047d71c13703e839" + integrity sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g== + dependencies: + abbrev "1.0.x" + async "1.x" + escodegen "1.8.x" + esprima "2.7.x" + glob "^5.0.15" + handlebars "^4.0.1" + js-yaml "3.x" + mkdirp "0.5.x" + nopt "3.x" + once "1.x" + resolve "1.1.x" + supports-color "^3.1.0" + which "^1.1.1" + wordwrap "^1.0.0" + +scrypt-js@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" + integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== + +secp256k1@^4.0.1: + version "4.0.4" + resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.4.tgz#58f0bfe1830fe777d9ca1ffc7574962a8189f8ab" + integrity sha512-6JfvwvjUOn8F/jUoBY2Q1v5WY5XS+rj8qSe0v8Y4ezH4InLgTEeOOPQsRll9OV429Pvo6BCHGavIyJfr3TAhsw== + dependencies: + elliptic "^6.5.7" + node-addon-api "^5.0.0" + node-gyp-build "^4.2.0" + +semver@^5.5.0: + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + +semver@^6.3.0: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.3.4, semver@^7.5.4: + version "7.6.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== + +serialize-javascript@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== + dependencies: + randombytes "^2.1.0" + +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shelljs@^0.8.3: + version "0.8.5" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" + integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + +signal-exit@^3.0.2: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +simple-wcswidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/simple-wcswidth/-/simple-wcswidth-1.0.1.tgz#8ab18ac0ae342f9d9b629604e54d2aa1ecb018b2" + integrity sha512-xMO/8eNREtaROt7tJvWJqHBDTMFN4eiQ5I4JRMuilwfnFcV5W9u7RUkueNkdw0jPqGMX36iCywelS5yilTuOxg== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +solc@0.8.26: + version "0.8.26" + resolved "https://registry.yarnpkg.com/solc/-/solc-0.8.26.tgz#afc78078953f6ab3e727c338a2fefcd80dd5b01a" + integrity sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g== + dependencies: + command-exists "^1.2.8" + commander "^8.1.0" + follow-redirects "^1.12.1" + js-sha3 "0.8.0" + memorystream "^0.3.1" + semver "^5.5.0" + tmp "0.0.33" + +solidity-ast@^0.4.51: + version "0.4.59" + resolved "https://registry.yarnpkg.com/solidity-ast/-/solidity-ast-0.4.59.tgz#290a2815aef70a61092591ab3e991da080ae5931" + integrity sha512-I+CX0wrYUN9jDfYtcgWSe+OAowaXy8/1YQy7NS4ni5IBDmIYBq7ZzaP/7QqouLjzZapmQtvGLqCaYgoUWqBo5g== + +solidity-coverage@^0.8.13: + version "0.8.13" + resolved "https://registry.yarnpkg.com/solidity-coverage/-/solidity-coverage-0.8.13.tgz#8eeada2e82ae19d25568368aa782a2baad0e0ce7" + integrity sha512-RiBoI+kF94V3Rv0+iwOj3HQVSqNzA9qm/qDP1ZDXK5IX0Cvho1qiz8hAXTsAo6KOIUeP73jfscq0KlLqVxzGWA== + dependencies: + "@ethersproject/abi" "^5.0.9" + "@solidity-parser/parser" "^0.18.0" + chalk "^2.4.2" + death "^1.1.0" + difflib "^0.2.4" + fs-extra "^8.1.0" + ghost-testrpc "^0.0.2" + global-modules "^2.0.0" + globby "^10.0.1" + jsonschema "^1.2.4" + lodash "^4.17.21" + mocha "^10.2.0" + node-emoji "^1.10.0" + pify "^4.0.1" + recursive-readdir "^2.2.2" + sc-istanbul "^0.4.5" + semver "^7.3.4" + shelljs "^0.8.3" + web3-utils "^1.3.6" + +source-map-support@^0.5.13: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0, source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" + integrity sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA== + dependencies: + amdefine ">=0.0.4" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +stacktrace-parser@^0.1.10: + version "0.1.10" + resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" + integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== + dependencies: + type-fest "^0.7.1" + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +string-format@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string-format/-/string-format-2.0.0.tgz#f2df2e7097440d3b65de31b6d40d54c96eaffb9b" + integrity sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA== + +string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-hex-prefix@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f" + integrity sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A== + dependencies: + is-hex-prefixed "1.0.0" + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +supports-color@^3.1.0: + version "3.2.3" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + integrity sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A== + dependencies: + has-flag "^1.0.0" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +table-layout@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-1.0.2.tgz#c4038a1853b0136d63365a734b6931cf4fad4a04" + integrity sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A== + dependencies: + array-back "^4.0.1" + deep-extend "~0.6.0" + typical "^5.2.0" + wordwrapjs "^4.0.0" + +table@^6.8.0: + version "6.8.2" + resolved "https://registry.yarnpkg.com/table/-/table-6.8.2.tgz#c5504ccf201213fa227248bdc8c5569716ac6c58" + integrity sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA== + dependencies: + ajv "^8.0.1" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + +tinyglobby@^0.2.6: + version "0.2.10" + resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.10.tgz#e712cf2dc9b95a1f5c5bbd159720e15833977a0f" + integrity sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew== + dependencies: + fdir "^6.4.2" + picomatch "^4.0.2" + +tmp@0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +ts-command-line-args@^2.2.0: + version "2.5.1" + resolved "https://registry.yarnpkg.com/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz#e64456b580d1d4f6d948824c274cf6fa5f45f7f0" + integrity sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw== + dependencies: + chalk "^4.1.0" + command-line-args "^5.1.1" + command-line-usage "^6.1.0" + string-format "^2.0.0" + +ts-essentials@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-7.0.3.tgz#686fd155a02133eedcc5362dc8b5056cde3e5a38" + integrity sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ== + +ts-node@^10.9.2: + version "10.9.2" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" + integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + +tslib@2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01" + integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== + +tslib@^1.11.1, tslib@^1.9.3: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.3.1, tslib@^2.6.2: + version "2.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== + +tsort@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786" + integrity sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw== + +tweetnacl-util@^0.15.1: + version "0.15.1" + resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz#b80fcdb5c97bcc508be18c44a4be50f022eea00b" + integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw== + +tweetnacl@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" + integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== + dependencies: + prelude-ls "~1.1.2" + +type-detect@^4.0.0, type-detect@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.1.0.tgz#deb2453e8f08dcae7ae98c626b13dddb0155906c" + integrity sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-fest@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" + integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== + +typechain@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/typechain/-/typechain-8.3.2.tgz#1090dd8d9c57b6ef2aed3640a516bdbf01b00d73" + integrity sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q== + dependencies: + "@types/prettier" "^2.1.1" + debug "^4.3.1" + fs-extra "^7.0.0" + glob "7.1.7" + js-sha3 "^0.8.0" + lodash "^4.17.15" + mkdirp "^1.0.4" + prettier "^2.3.1" + ts-command-line-args "^2.2.0" + ts-essentials "^7.0.1" + +typescript@^5.7.2: + version "5.7.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.2.tgz#3169cf8c4c8a828cde53ba9ecb3d2b1d5dd67be6" + integrity sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg== + +typical@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/typical/-/typical-4.0.0.tgz#cbeaff3b9d7ae1e2bbfaf5a4e6f11eccfde94fc4" + integrity sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw== + +typical@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/typical/-/typical-5.2.0.tgz#4daaac4f2b5315460804f0acf6cb69c52bb93066" + integrity sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg== + +uglify-js@^3.1.4: + version "3.19.3" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.19.3.tgz#82315e9bbc6f2b25888858acd1fff8441035b77f" + integrity sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ== + +undici-types@~6.19.2, undici-types@~6.19.8: + version "6.19.8" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" + integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== + +undici@^5.14.0: + version "5.28.4" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.4.tgz#6b280408edb6a1a604a9b20340f45b422e373068" + integrity sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g== + dependencies: + "@fastify/busboy" "^2.0.0" + +undici@^6.11.1: + version "6.21.0" + resolved "https://registry.yarnpkg.com/undici/-/undici-6.21.0.tgz#4b3d3afaef984e07b48e7620c34ed8a285ed4cd4" + integrity sha512-BUgJXc752Kou3oOIuU1i+yZZypyZRqNPW0vqoMPl8VaoalSfeR0D8/t4iAS3yirs79SSMTxTag+ZC86uswv+Cw== + +unfetch@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.2.0.tgz#7e21b0ef7d363d8d9af0fb929a5555f6ef97a3be" + integrity sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA== + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +universalify@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== + +unpipe@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +utf8@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" + integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== + +util-deprecate@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + +web3-utils@^1.3.6: + version "1.10.4" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.10.4.tgz#0daee7d6841641655d8b3726baf33b08eda1cbec" + integrity sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A== + dependencies: + "@ethereumjs/util" "^8.1.0" + bn.js "^5.2.1" + ethereum-bloom-filters "^1.0.6" + ethereum-cryptography "^2.1.2" + ethjs-unit "0.1.6" + number-to-bn "1.7.0" + randombytes "^2.1.0" + utf8 "3.0.0" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which@^1.1.1, which@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +widest-line@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" + integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== + dependencies: + string-width "^4.0.0" + +word-wrap@~1.2.3: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + +wordwrap@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== + +wordwrapjs@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/wordwrapjs/-/wordwrapjs-4.0.1.tgz#d9790bccfb110a0fc7836b5ebce0937b37a8b98f" + integrity sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA== + dependencies: + reduce-flatten "^2.0.0" + typical "^5.2.0" + +workerpool@^6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.5.1.tgz#060f73b39d0caf97c6db64da004cd01b4c099544" + integrity sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +ws@8.17.1: + version "8.17.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" + integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== + +ws@^7.4.6: + version "7.5.10" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" + integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yargs-parser@^20.2.2, yargs-parser@^20.2.9: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-unparser@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== diff --git a/near/Cargo.lock b/near/Cargo.lock index c7bfb764..0c59d9a2 100644 --- a/near/Cargo.lock +++ b/near/Cargo.lock @@ -1960,6 +1960,12 @@ version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" +[[package]] +name = "futures-timer" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" + [[package]] name = "futures-util" version = "0.3.30" @@ -2765,6 +2771,9 @@ name = "lazy_static" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin", +] [[package]] name = "lazycell" @@ -3392,7 +3401,7 @@ dependencies = [ [[package]] name = "near-plugins" version = "0.2.0" -source = "git+https://github.com/aurora-is-near/near-plugins?tag=v0.3.0#eff928fda517caf4276b9b58b5a3ece0c48ba5ed" +source = "git+https://github.com/aurora-is-near/near-plugins?tag=v0.4.1#6149e0378fe46c7f740153cc0274b6da1f194112" dependencies = [ "bitflags 1.3.2", "near-plugins-derive", @@ -3403,7 +3412,7 @@ dependencies = [ [[package]] name = "near-plugins-derive" version = "0.2.0" -source = "git+https://github.com/aurora-is-near/near-plugins?tag=v0.3.0#eff928fda517caf4276b9b58b5a3ece0c48ba5ed" +source = "git+https://github.com/aurora-is-near/near-plugins?tag=v0.4.1#6149e0378fe46c7f740153cc0274b6da1f194112" dependencies = [ "darling 0.13.4", "proc-macro-crate 0.1.5", @@ -3520,10 +3529,15 @@ dependencies = [ "borsh", "bs58 0.5.1", "near-account-id", + "near-crypto", "near-gas 0.2.5", + "near-parameters", + "near-primitives", + "near-primitives-core", "near-sdk-macros", "near-sys", "near-token 0.2.1", + "near-vm-runner", "once_cell", "serde", "serde_json", @@ -3609,6 +3623,36 @@ dependencies = [ "serde", ] +[[package]] +name = "near-vm-runner" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48e94f68dde77aa3c94e659edab4c98b14f6dbbeba2aded72ebb6c6456631164" +dependencies = [ + "borsh", + "bytesize", + "ed25519-dalek", + "enum-map", + "lru", + "near-crypto", + "near-parameters", + "near-primitives-core", + "near-stdx", + "num-rational 0.3.2", + "once_cell", + "ripemd", + "rustix", + "serde", + "serde_repr", + "sha2 0.10.8", + "sha3", + "strum 0.24.1", + "tempfile", + "thiserror", + "tracing", + "zeropool-bn", +] + [[package]] name = "near-workspaces" version = "0.12.0" @@ -3672,19 +3716,6 @@ dependencies = [ "uriparse", ] -[[package]] -name = "nep141-locker" -version = "0.1.0" -dependencies = [ - "borsh", - "hex", - "near-contract-standards", - "near-plugins", - "near-sdk", - "omni-types", - "serde", -] - [[package]] name = "new_debug_unreachable" version = "1.0.6" @@ -3864,6 +3895,19 @@ dependencies = [ "memchr", ] +[[package]] +name = "omni-bridge" +version = "0.1.0" +dependencies = [ + "borsh", + "hex", + "near-contract-standards", + "near-plugins", + "near-sdk", + "omni-types", + "serde", +] + [[package]] name = "omni-prover" version = "2.0.0" @@ -3882,9 +3926,19 @@ dependencies = [ "near-sdk", "near-workspaces", "omni-types", + "rstest", "tokio", ] +[[package]] +name = "omni-token" +version = "0.1.0" +dependencies = [ + "near-contract-standards", + "near-sdk", + "omni-types", +] + [[package]] name = "omni-types" version = "2.0.0" @@ -4655,6 +4709,12 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +[[package]] +name = "relative-path" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2" + [[package]] name = "rend" version = "0.4.2" @@ -4733,6 +4793,15 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "ripemd" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" +dependencies = [ + "digest 0.10.7", +] + [[package]] name = "rkyv" version = "0.7.45" @@ -4782,6 +4851,35 @@ dependencies = [ "rustc-hex", ] +[[package]] +name = "rstest" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97eeab2f3c0a199bc4be135c36c924b6590b88c377d416494288c14f2db30199" +dependencies = [ + "futures", + "futures-timer", + "rstest_macros", + "rustc_version 0.4.1", +] + +[[package]] +name = "rstest_macros" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d428f8247852f894ee1be110b375111b586d4fa431f6c46e64ba5a0dcccbe605" +dependencies = [ + "cfg-if 1.0.0", + "glob", + "proc-macro2", + "quote", + "regex", + "relative-path", + "rustc_version 0.4.1", + "syn 2.0.75", + "unicode-ident", +] + [[package]] name = "ruint" version = "1.12.3" @@ -5796,6 +5894,20 @@ dependencies = [ "rand", ] +[[package]] +name = "token-deployer" +version = "0.1.0" +dependencies = [ + "borsh", + "hex", + "near-contract-standards", + "near-plugins", + "near-sdk", + "omni-token", + "omni-types", + "serde", +] + [[package]] name = "tokio" version = "1.40.0" @@ -6821,6 +6933,19 @@ dependencies = [ "syn 2.0.75", ] +[[package]] +name = "zeropool-bn" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e61de68ede9ffdd69c01664f65a178c5188b73f78faa21f0936016a888ff7c" +dependencies = [ + "byteorder", + "crunchy", + "lazy_static", + "rand", + "rustc-hex", +] + [[package]] name = "zip" version = "0.5.13" diff --git a/near/Cargo.toml b/near/Cargo.toml index f50b007a..be90c094 100644 --- a/near/Cargo.toml +++ b/near/Cargo.toml @@ -4,10 +4,12 @@ authors = ["Karim Alabtakh "] [workspace] resolver = "2" members = [ - "nep141-locker", + "omni-bridge", + "token-deployer", "omni-prover/omni-prover", "omni-prover/wormhole-omni-prover-proxy", "omni-prover/evm-prover", + "omni-token", "omni-types", "omni-tests", "mock/mock-token", @@ -29,7 +31,7 @@ near-contract-standards = "5.2.0" hex = "0.4.2" borsh = "1.5.1" serde = { version = "1.0.200", features = ["derive"] } -near-plugins = { git = "https://github.com/aurora-is-near/near-plugins", tag = "v0.3.0" } +near-plugins = { git = "https://github.com/aurora-is-near/near-plugins", tag = "v0.4.1" } omni-types = { path = "omni-types" } strum_macros = "0.26" near-workspaces = "0.12.0" @@ -39,3 +41,4 @@ ethereum-types = { version = "0.15.1", default-features = false, features = ["rl rlp = "0.6" sha3 = "0.10.0" alloy-sol-types = "0.8" +rstest = "0.18.2" diff --git a/near/build.sh b/near/build.sh new file mode 100755 index 00000000..a7c89ad2 --- /dev/null +++ b/near/build.sh @@ -0,0 +1,101 @@ +#!/usr/bin/env bash + +# Exit script as soon as a command fails. +set -e + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +DEFAULT_RES_DIR="$DIR/res" +RES_DIR=$DEFAULT_RES_DIR + +show_help() { + echo "Usage: $0 [OPTION] [COMPONENT_DIR]" + echo + echo "Build NEAR smart contracts." + echo + echo "Options:" + echo " -h, --help Display this help message" + echo " -o, --output-dir DIR Specify output directory for WASM files (default: ./res)" + echo + echo "Arguments:" + echo " COMPONENT_DIR Optional. Directory name of the specific component to build" + echo " If not provided, builds all components" + echo + echo "Examples:" + echo " $0 # Build all contracts" + echo " $0 omni-bridge # Build only omni-bridge contract" + echo " $0 token-deployer # Build only token-deployer contract" + echo " $0 -o ../dist # Build all contracts and output to ../dist" + echo +} + +# Parse command line arguments +while [[ $# -gt 0 ]]; do + case $1 in + -h|--help) + show_help + exit 0 + ;; + -o|--output-dir) + if [ -z "$2" ]; then + echo "Error: Output directory not specified" + exit 1 + fi + RES_DIR="$2" + shift 2 + ;; + *) + COMPONENT="$1" + shift + ;; + esac +done + +# Determine Docker user flags +if [[ -z "$BUILDKITE" ]] && [[ "$(uname -s)" != "Darwin" ]]; +then + userflag="-u $UID:$UID" +else + userflag="" +fi + +# Determine architecture-specific tag +arch=`uname -m` +if [ "$arch" == "arm64" ] +then + tag=":latest-arm64" +else + tag="" +fi + +if [ -z "$COMPONENT" ]; then + BUILD_CMD="cargo build --workspace --target wasm32-unknown-unknown --release" + echo "Building entire workspace..." +else + if [ ! -d "$DIR/$COMPONENT" ]; then + echo "Error: Directory '$COMPONENT' not found in $DIR" + exit 1 + fi + BUILD_CMD="cargo build --manifest-path $COMPONENT/Cargo.toml --target wasm32-unknown-unknown --release" + echo "Building component: $COMPONENT" +fi + +docker run \ + --rm \ + --mount type=bind,source=$DIR,target=/host \ + --cap-add=SYS_PTRACE --security-opt seccomp=unconfined $userflag \ + -w /host \ + -e RUSTFLAGS='-C link-arg=-s' \ + nearprotocol/contract-builder$tag \ + /bin/bash -c "rustup target add wasm32-unknown-unknown && $BUILD_CMD" + +mkdir -p $RES_DIR + +if [ -z "$COMPONENT" ]; then + find $DIR/target/wasm32-unknown-unknown/release/ -name "*.wasm" -maxdepth 1 -exec cp -f {} $RES_DIR/ \; +else + binary_name=$(basename $COMPONENT | tr '-' '_') + find $DIR/target/wasm32-unknown-unknown/release/ -name "$binary_name.wasm" -maxdepth 1 -exec cp -f {} $RES_DIR/ \; +fi + +echo "Build completed! Contract files are in the $RES_DIR directory:" +ls -l $RES_DIR diff --git a/near/mock/mock-prover/src/lib.rs b/near/mock/mock-prover/src/lib.rs index 8a630cec..5a13c4e0 100644 --- a/near/mock/mock-prover/src/lib.rs +++ b/near/mock/mock-prover/src/lib.rs @@ -24,20 +24,23 @@ impl Default for OmniProver { #[near] impl OmniProver { - pub fn add_prover(&mut self, prover_id: ProverId, account_id: AccountId) { - self.provers.insert(&prover_id, &account_id); + pub fn add_prover(&mut self, prover_id: &ProverId, account_id: &AccountId) { + self.provers.insert(prover_id, account_id); } - pub fn remove_prover(&mut self, prover_id: ProverId) { - self.provers.remove(&prover_id); + pub fn remove_prover(&mut self, prover_id: &ProverId) { + self.provers.remove(prover_id); } pub fn get_provers(&self) -> Vec<(ProverId, AccountId)> { self.provers.iter().collect::>() } + /// # Panics + /// + /// This function will panic if the prover args are not valid. #[result_serializer(borsh)] - pub fn verify_proof(&self, #[serializer(borsh)] args: VerifyProofArgs) -> ProverResult { + pub fn verify_proof(&self, #[serializer(borsh)] args: &VerifyProofArgs) -> ProverResult { ProverResult::try_from_slice(&args.prover_args).unwrap() } } diff --git a/near/mock/mock-token/src/lib.rs b/near/mock/mock-token/src/lib.rs index bf0919a6..9d24a28e 100644 --- a/near/mock/mock-token/src/lib.rs +++ b/near/mock/mock-token/src/lib.rs @@ -35,11 +35,11 @@ impl Contract { /// Initializes the contract with the given total supply owned by the given `owner_id` with /// default metadata (for example purposes only). #[init] - pub fn new_default_meta(owner_id: AccountId, total_supply: U128) -> Self { + pub fn new_default_meta(owner_id: &AccountId, total_supply: U128) -> Self { Self::new( owner_id, total_supply, - FungibleTokenMetadata { + &FungibleTokenMetadata { spec: FT_METADATA_SPEC.to_string(), name: "Example NEAR fungible token".to_string(), symbol: "EXAMPLE".to_string(), @@ -54,18 +54,18 @@ impl Contract { /// Initializes the contract with the given total supply owned by the given `owner_id` with /// the given fungible token metadata. #[init] - pub fn new(owner_id: AccountId, total_supply: U128, metadata: FungibleTokenMetadata) -> Self { + pub fn new(owner_id: &AccountId, total_supply: U128, metadata: &FungibleTokenMetadata) -> Self { require!(!env::state_exists(), "Already initialized"); metadata.assert_valid(); let mut this = Self { token: FungibleToken::new(StorageKey::FungibleToken), - metadata: LazyOption::new(StorageKey::Metadata, Some(&metadata)), + metadata: LazyOption::new(StorageKey::Metadata, Some(metadata)), }; - this.token.internal_register_account(&owner_id); - this.token.internal_deposit(&owner_id, total_supply.into()); + this.token.internal_register_account(owner_id); + this.token.internal_deposit(owner_id, total_supply.into()); near_contract_standards::fungible_token::events::FtMint { - owner_id: &owner_id, + owner_id, amount: total_supply, memo: Some("new tokens are minted"), } @@ -79,7 +79,7 @@ impl Contract { impl FungibleTokenCore for Contract { #[payable] fn ft_transfer(&mut self, receiver_id: AccountId, amount: U128, memo: Option) { - self.token.ft_transfer(receiver_id, amount, memo) + self.token.ft_transfer(receiver_id, amount, memo); } #[payable] diff --git a/near/nep141-locker/src/lib.rs b/near/nep141-locker/src/lib.rs deleted file mode 100644 index c68a3e0a..00000000 --- a/near/nep141-locker/src/lib.rs +++ /dev/null @@ -1,858 +0,0 @@ -use errors::SdkExpect; -use near_plugins::{ - access_control, access_control_any, pause, AccessControlRole, AccessControllable, Pausable, - Upgradable, -}; - -use near_contract_standards::fungible_token::metadata::FungibleTokenMetadata; -use near_contract_standards::fungible_token::receiver::FungibleTokenReceiver; -use near_contract_standards::storage_management::StorageBalance; -use near_sdk::borsh::{self, BorshDeserialize, BorshSerialize}; -use near_sdk::collections::LookupMap; -use near_sdk::json_types::U128; -use near_sdk::serde::{Deserialize, Serialize}; -use near_sdk::{ - env, ext_contract, near, require, serde_json, AccountId, BorshStorageKey, Gas, NearToken, - PanicOnDefault, Promise, PromiseError, PromiseOrValue, PromiseResult, -}; -use omni_types::locker_args::{BindTokenArgs, ClaimFeeArgs, FinTransferArgs, StorageDepositArgs}; -use omni_types::mpc_types::SignatureResponse; -use omni_types::near_events::Nep141LockerEvent; -use omni_types::prover_args::VerifyProofArgs; -use omni_types::prover_result::ProverResult; -use omni_types::{ - ChainKind, ClaimNativeFeePayload, Fee, InitTransferMsg, MetadataPayload, NativeFee, - NearRecipient, Nonce, OmniAddress, SignRequest, TransferId, TransferMessage, - TransferMessagePayload, UpdateFee, -}; -use storage::{TransferMessageStorage, TransferMessageStorageValue}; - -mod errors; -mod storage; - -const LOG_METADATA_GAS: Gas = Gas::from_tgas(10); -const LOG_METADATA_CALLBCAK_GAS: Gas = Gas::from_tgas(260); -const MPC_SIGNING_GAS: Gas = Gas::from_tgas(250); -const SIGN_TRANSFER_CALLBACK_GAS: Gas = Gas::from_tgas(5); -const SIGN_LOG_METADATA_CALLBACK_GAS: Gas = Gas::from_tgas(5); -const SIGN_CLAIM_NATIVE_FEE_CALLBACK_GAS: Gas = Gas::from_tgas(5); -const VERIFY_POOF_GAS: Gas = Gas::from_tgas(50); -const CLAIM_FEE_CALLBACK_GAS: Gas = Gas::from_tgas(50); -const BIND_TOKEN_CALLBACK_GAS: Gas = Gas::from_tgas(25); -const FT_TRANSFER_CALL_GAS: Gas = Gas::from_tgas(50); -const FT_TRANSFER_GAS: Gas = Gas::from_tgas(5); -const STORAGE_BALANCE_OF_GAS: Gas = Gas::from_tgas(3); -const STORAGE_DEPOSIT_GAS: Gas = Gas::from_tgas(3); -const NO_DEPOSIT: NearToken = NearToken::from_near(0); -const ONE_YOCTO: NearToken = NearToken::from_yoctonear(1); -const NEP141_DEPOSIT: NearToken = NearToken::from_yoctonear(1250000000000000000000); - -const SIGN_PATH: &str = "bridge-1"; - -#[derive(BorshSerialize, BorshStorageKey)] -enum StorageKey { - PendingTransfers, - Factories, - FinalisedTransfers, - TokensMapping, - AccountsBalances, -} - -#[derive(AccessControlRole, Deserialize, Serialize, Copy, Clone)] -#[serde(crate = "near_sdk::serde")] -pub enum Role { - DAO, - PauseManager, - UnrestrictedDeposit, - UpgradableCodeStager, - UpgradableCodeDeployer, -} - -#[ext_contract(ext_token)] -pub trait ExtToken { - fn ft_transfer( - &mut self, - receiver_id: AccountId, - amount: U128, - memo: Option, - ) -> PromiseOrValue; - - fn ft_transfer_call( - &mut self, - receiver_id: AccountId, - amount: U128, - memo: Option, - msg: String, - ) -> PromiseOrValue; - - fn ft_metadata(&self) -> FungibleTokenMetadata; - - fn storage_deposit( - &mut self, - account_id: Option, - registration_only: Option, - ) -> Option; - - fn storage_balance_of(&mut self, account_id: Option) -> Option; -} - -#[ext_contract(ext_signer)] -pub trait ExtSigner { - fn sign(&mut self, request: SignRequest); -} - -#[ext_contract(ext_prover)] -pub trait Prover { - #[result_serializer(borsh)] - fn verify_proof(&self, #[serializer(borsh)] args: VerifyProofArgs) -> ProverResult; -} - -#[near(contract_state)] -#[derive(Pausable, Upgradable, PanicOnDefault)] -#[access_control(role_type(Role))] -#[pausable(manager_roles(Role::PauseManager))] -#[upgradable(access_control_roles( - code_stagers(Role::UpgradableCodeStager, Role::DAO), - code_deployers(Role::UpgradableCodeDeployer, Role::DAO), - duration_initializers(Role::DAO), - duration_update_stagers(Role::DAO), - duration_update_appliers(Role::DAO), -))] -pub struct Contract { - pub prover_account: AccountId, - pub factories: LookupMap, - pub pending_transfers: LookupMap, - pub finalised_transfers: LookupMap>, - pub tokens_to_address_mapping: LookupMap<(ChainKind, AccountId), OmniAddress>, - pub mpc_signer: AccountId, - pub current_nonce: Nonce, - pub accounts_balances: LookupMap, -} - -#[near] -impl FungibleTokenReceiver for Contract { - #[pause(except(roles(Role::DAO, Role::UnrestrictedDeposit)))] - fn ft_on_transfer( - &mut self, - sender_id: AccountId, - amount: U128, - msg: String, - ) -> PromiseOrValue { - let parsed_msg: InitTransferMsg = serde_json::from_str(&msg).sdk_expect("ERR_PARSE_MSG"); - - self.current_nonce += 1; - let transfer_message = TransferMessage { - origin_nonce: U128(self.current_nonce), - token: env::predecessor_account_id(), - amount, - recipient: parsed_msg.recipient, - fee: Fee { - fee: parsed_msg.fee, - native_fee: parsed_msg.native_token_fee, - }, - sender: OmniAddress::Near(sender_id.to_string()), - }; - require!( - transfer_message.fee.fee < transfer_message.amount, - "ERR_INVALID_FEE" - ); - - let mut required_storage_balance = self.add_transfer_message( - self.current_nonce, - transfer_message.clone(), - sender_id.clone(), - ); - required_storage_balance = required_storage_balance - .saturating_add(NearToken::from_yoctonear(parsed_msg.native_token_fee.0)); - - self.update_storage_balance( - sender_id, - required_storage_balance, - NearToken::from_yoctonear(0), - ); - - env::log_str(&Nep141LockerEvent::InitTransferEvent { transfer_message }.to_log_string()); - PromiseOrValue::Value(U128(0)) - } -} - -#[near] -impl Contract { - #[init] - pub fn new(prover_account: AccountId, mpc_signer: AccountId, nonce: U128) -> Self { - let mut contract = Self { - prover_account, - factories: LookupMap::new(StorageKey::Factories), - pending_transfers: LookupMap::new(StorageKey::PendingTransfers), - finalised_transfers: LookupMap::new(StorageKey::FinalisedTransfers), - tokens_to_address_mapping: LookupMap::new(StorageKey::TokensMapping), - mpc_signer, - current_nonce: nonce.0, - accounts_balances: LookupMap::new(StorageKey::AccountsBalances), - }; - - contract.acl_init_super_admin(near_sdk::env::predecessor_account_id()); - contract.acl_grant_role("DAO".to_owned(), near_sdk::env::predecessor_account_id()); - contract - } - - pub fn log_metadata(&self, token_id: AccountId) -> Promise { - ext_token::ext(token_id.clone()) - .with_static_gas(LOG_METADATA_GAS) - .ft_metadata() - .then( - Self::ext(env::current_account_id()) - .with_static_gas(LOG_METADATA_CALLBCAK_GAS) - .with_attached_deposit(env::attached_deposit()) - .log_metadata_callbcak(token_id), - ) - } - - #[private] - #[result_serializer(borsh)] - pub fn log_metadata_callbcak( - &self, - #[callback] metadata: FungibleTokenMetadata, - token_id: AccountId, - ) -> Promise { - let metadata_payload = MetadataPayload { - token: token_id.to_string(), - name: metadata.name, - symbol: metadata.symbol, - decimals: metadata.decimals, - }; - - let payload = near_sdk::env::keccak256_array( - &borsh::to_vec(&metadata_payload).sdk_expect("ERR_BORSH"), - ); - - ext_signer::ext(self.mpc_signer.clone()) - .with_static_gas(MPC_SIGNING_GAS) - .with_attached_deposit(env::attached_deposit()) - .sign(SignRequest { - payload, - path: SIGN_PATH.to_owned(), - key_version: 0, - }) - .then( - Self::ext(env::current_account_id()) - .with_static_gas(SIGN_LOG_METADATA_CALLBACK_GAS) - .sign_log_metadata_callbcak(metadata_payload), - ) - } - - #[private] - #[result_serializer(borsh)] - pub fn sign_log_metadata_callbcak( - &self, - #[callback_result] call_result: Result, - #[serializer(borsh)] metadata_payload: MetadataPayload, - ) { - if let Ok(signature) = call_result { - env::log_str( - &Nep141LockerEvent::LogMetadataEvent { - signature, - metadata_payload, - } - .to_log_string(), - ); - } - } - - #[payable] - pub fn update_transfer_fee(&mut self, nonce: U128, fee: UpdateFee) { - match fee { - UpdateFee::Fee(fee) => { - let mut transfer = self.get_transfer_message_storage(nonce); - - require!( - OmniAddress::Near(env::predecessor_account_id().to_string()) - == transfer.message.sender, - "Only sender can update fee" - ); - - let current_fee = transfer.message.fee; - require!( - fee.fee >= current_fee.fee && fee.fee < transfer.message.amount, - "ERR_INVALID_FEE" - ); - - let diff_native_fee = current_fee - .native_fee - .0 - .checked_sub(fee.native_fee.0) - .sdk_expect("ERR_LOWER_FEE"); - - require!( - NearToken::from_yoctonear(diff_native_fee) == env::attached_deposit(), - "ERR_INVALID_ATTACHED_DEPOSIT" - ); - - transfer.message.fee = fee; - self.insert_raw_transfer(nonce.0, transfer.message.clone(), transfer.owner); - - env::log_str( - &Nep141LockerEvent::UpdateFeeEvent { - transfer_message: transfer.message, - } - .to_log_string(), - ); - } - UpdateFee::Proof(_) => env::panic_str("TODO"), - } - } - - #[payable] - pub fn sign_claim_native_fee(&mut self, nonces: Vec, recipient: OmniAddress) -> Promise { - let chain_kind = recipient.get_chain(); - let mut amount: u128 = 0_u128; - for nonce in &nonces { - let native_fee = self - .finalised_transfers - .get(&(chain_kind, nonce.0)) - .flatten() - .sdk_expect("ERR_NATIVE_FEE_NOT_EXISIT"); - - require!(native_fee.recipient == recipient, "ERR_WRONG_RECIPIENT"); - amount += native_fee.amount.0; - } - - let claim_payload = ClaimNativeFeePayload { - nonces, - amount: U128(amount), - recipient, - }; - let payload = - near_sdk::env::keccak256_array(&borsh::to_vec(&claim_payload).sdk_expect("ERR_BORSH")); - - ext_signer::ext(self.mpc_signer.clone()) - .with_static_gas(MPC_SIGNING_GAS) - .with_attached_deposit(env::attached_deposit()) - .sign(SignRequest { - payload, - path: SIGN_PATH.to_owned(), - key_version: 0, - }) - .then( - Self::ext(env::current_account_id()) - .with_static_gas(SIGN_CLAIM_NATIVE_FEE_CALLBACK_GAS) - .sign_claim_native_fee_callback(claim_payload), - ) - } - - #[private] - pub fn sign_claim_native_fee_callback( - &mut self, - #[callback_result] call_result: Result, - #[serializer(borsh)] claim_payload: ClaimNativeFeePayload, - ) { - if let Ok(signature) = call_result { - env::log_str( - &Nep141LockerEvent::SignClaimNativeFeeEvent { - signature, - claim_payload, - } - .to_log_string(), - ); - } - } - - #[payable] - pub fn sign_transfer( - &mut self, - nonce: U128, - fee_recipient: Option, - fee: Option, - ) -> Promise { - let transfer_message = self.get_transfer_message(nonce); - if let Some(fee) = &fee { - require!(&transfer_message.fee == fee, "Invalid fee"); - } - - let transfer_payload = TransferMessagePayload { - nonce, - token: transfer_message.token, - amount: U128(transfer_message.amount.0 - transfer_message.fee.fee.0), - recipient: transfer_message.recipient, - fee_recipient, - }; - - let payload = near_sdk::env::keccak256_array(&borsh::to_vec(&transfer_payload).unwrap()); - - ext_signer::ext(self.mpc_signer.clone()) - .with_static_gas(MPC_SIGNING_GAS) - .with_attached_deposit(env::attached_deposit()) - .sign(SignRequest { - payload, - path: SIGN_PATH.to_owned(), - key_version: 0, - }) - .then( - Self::ext(env::current_account_id()) - .with_static_gas(SIGN_TRANSFER_CALLBACK_GAS) - .sign_transfer_callback(transfer_payload, transfer_message.fee), - ) - } - - #[private] - pub fn sign_transfer_callback( - &mut self, - #[callback_result] call_result: Result, - #[serializer(borsh)] message_payload: TransferMessagePayload, - #[serializer(borsh)] fee: Fee, - ) { - if let Ok(signature) = call_result { - let nonce = message_payload.nonce; - if fee.is_zero() { - self.remove_transfer_message(nonce.0); - } - - env::log_str( - &Nep141LockerEvent::SignTransferEvent { - signature, - message_payload, - } - .to_log_string(), - ); - } - } - - #[payable] - pub fn fin_transfer(&mut self, #[serializer(borsh)] args: FinTransferArgs) -> Promise { - require!( - args.storage_deposit_args.accounts.len() <= 2, - "Invalid len of accounts for storage deposit" - ); - let main_promise = ext_prover::ext(self.prover_account.clone()) - .with_static_gas(VERIFY_POOF_GAS) - .with_attached_deposit(NO_DEPOSIT) - .verify_proof(VerifyProofArgs { - prover_id: args.chain_kind.as_ref().to_owned(), - prover_args: args.prover_args, - }); - - let mut attached_deposit = env::attached_deposit(); - Self::check_or_pay_ft_storage( - main_promise, - &args.storage_deposit_args, - &mut attached_deposit, - ) - .then( - Self::ext(env::current_account_id()) - .with_attached_deposit(attached_deposit) - .with_static_gas(CLAIM_FEE_CALLBACK_GAS) - .fin_transfer_callback( - args.storage_deposit_args, - env::predecessor_account_id(), - args.native_fee_recipient, - ), - ) - } - - #[private] - #[payable] - pub fn fin_transfer_callback( - &mut self, - #[serializer(borsh)] storage_deposit_args: StorageDepositArgs, - #[serializer(borsh)] predecessor_account_id: AccountId, - #[serializer(borsh)] native_fee_recipient: OmniAddress, - ) -> PromiseOrValue { - let Ok(ProverResult::InitTransfer(init_transfer)) = Self::decode_prover_result(0) else { - env::panic_str("Invalid proof message") - }; - require!( - self.factories - .get(&init_transfer.emitter_address.get_chain()) - == Some(init_transfer.emitter_address), - "Unknown factory" - ); - - let transfer_message = init_transfer.transfer; - let mut required_balance; - - if let OmniAddress::Near(recipient) = &transfer_message.recipient { - required_balance = self.add_fin_transfer( - &transfer_message.get_transfer_id(), - &Some(NativeFee { - amount: transfer_message.fee.native_fee, - recipient: native_fee_recipient, - }), - ); - - let recipient: NearRecipient = - recipient.parse().sdk_expect("Failed to parse recipient"); - - require!( - transfer_message.token == storage_deposit_args.token, - "STORAGE_ERR: Invalid token" - ); - require!( - Self::check_storage_balance_result(1) - && storage_deposit_args.accounts[0].0 == recipient.target, - "STORAGE_ERR: The transfer recipient is omitted" - ); - - let amount_to_transfer = U128(transfer_message.amount.0 - transfer_message.fee.fee.0); - let mut promise = match recipient.message { - Some(message) => ext_token::ext(transfer_message.token.clone()) - .with_static_gas(FT_TRANSFER_CALL_GAS) - .with_attached_deposit(ONE_YOCTO) - .ft_transfer_call(recipient.target, amount_to_transfer, None, message), - None => ext_token::ext(transfer_message.token.clone()) - .with_static_gas(FT_TRANSFER_GAS) - .with_attached_deposit(ONE_YOCTO) - .ft_transfer(recipient.target, amount_to_transfer, None), - }; - - if transfer_message.fee.fee.0 > 0 { - require!( - Self::check_storage_balance_result(2) - && storage_deposit_args.accounts[1].0 == predecessor_account_id, - "STORAGE_ERR: The fee recipient is omitted" - ); - promise = promise.then( - ext_token::ext(transfer_message.token.clone()) - .with_static_gas(FT_TRANSFER_GAS) - .with_attached_deposit(ONE_YOCTO) - .ft_transfer( - predecessor_account_id.clone(), - transfer_message.fee.fee, - None, - ), - ); - } - - self.update_storage_balance( - predecessor_account_id, - required_balance, - env::attached_deposit(), - ); - - env::log_str( - &Nep141LockerEvent::FinTransferEvent { - nonce: None, - transfer_message, - } - .to_log_string(), - ); - - promise.into() - } else { - required_balance = self.add_fin_transfer(&transfer_message.get_transfer_id(), &None); - self.current_nonce += 1; - required_balance = self - .add_transfer_message( - self.current_nonce, - transfer_message.clone(), - predecessor_account_id.clone(), - ) - .saturating_add(required_balance); - - self.update_storage_balance( - predecessor_account_id, - required_balance, - env::attached_deposit(), - ); - - env::log_str( - &Nep141LockerEvent::FinTransferEvent { - nonce: Some(U128(self.current_nonce)), - transfer_message, - } - .to_log_string(), - ); - - PromiseOrValue::Value(U128(self.current_nonce)) - } - } - - #[payable] - pub fn claim_fee(&mut self, #[serializer(borsh)] args: ClaimFeeArgs) -> Promise { - ext_prover::ext(self.prover_account.clone()) - .with_static_gas(VERIFY_POOF_GAS) - .with_attached_deposit(NO_DEPOSIT) - .verify_proof(VerifyProofArgs { - prover_id: args.chain_kind.as_ref().to_owned(), - prover_args: args.prover_args, - }) - .then( - Self::ext(env::current_account_id()) - .with_attached_deposit(env::attached_deposit()) - .with_static_gas(CLAIM_FEE_CALLBACK_GAS) - .claim_fee_callback(args.native_fee_recipient, env::predecessor_account_id()), - ) - } - - #[private] - #[payable] - pub fn claim_fee_callback( - &mut self, - #[serializer(borsh)] native_fee_recipient: OmniAddress, - #[serializer(borsh)] predecessor_account_id: AccountId, - #[callback_result] - #[serializer(borsh)] - call_result: Result, - ) -> Promise { - let Ok(ProverResult::FinTransfer(fin_transfer)) = call_result else { - env::panic_str("Invalid proof message") - }; - require!( - fin_transfer.fee_recipient == predecessor_account_id, - "ERR_ONLY_FEE_RECIPIENT_CAN_CLAIM" - ); - require!( - self.factories - .get(&fin_transfer.emitter_address.get_chain()) - == Some(fin_transfer.emitter_address), - "ERR_UNKNOWN_FACTORY" - ); - - let message = self.remove_transfer_message(fin_transfer.nonce.0); - let fee = message.amount.0 - fin_transfer.amount.0; - - if message.fee.native_fee.0 != 0 { - if message.get_origin_chain() == ChainKind::Near { - let OmniAddress::Near(recipient) = native_fee_recipient else { - env::panic_str("ERR_WRONG_CHAIN_KIND") - }; - Promise::new(recipient.parse().sdk_expect("ERR_PARSE_FEE_RECIPIENT")) - .transfer(NearToken::from_yoctonear(message.fee.native_fee.0)); - } else { - let required_balance = self.update_fin_transfer( - &message.get_transfer_id(), - &Some(NativeFee { - amount: message.fee.native_fee, - recipient: native_fee_recipient, - }), - ); - - self.update_storage_balance( - predecessor_account_id, - required_balance, - env::attached_deposit(), - ); - } - } - - ext_token::ext(message.token) - .with_static_gas(LOG_METADATA_GAS) - .ft_transfer(fin_transfer.fee_recipient, U128(fee), None) - } - - #[payable] - pub fn bind_token(&mut self, #[serializer(borsh)] args: BindTokenArgs) -> Promise { - ext_prover::ext(self.prover_account.clone()) - .with_static_gas(VERIFY_POOF_GAS) - .with_attached_deposit(NO_DEPOSIT) - .verify_proof(VerifyProofArgs { - prover_id: args.chain_kind.as_ref().to_owned(), - prover_args: args.prover_args, - }) - .then( - Self::ext(env::current_account_id()) - .with_attached_deposit(env::attached_deposit()) - .with_static_gas(BIND_TOKEN_CALLBACK_GAS) - .bind_token_callback(), - ) - } - - #[private] - pub fn bind_token_callback( - &mut self, - #[callback_result] - #[serializer(borsh)] - call_result: Result, - ) { - let Ok(ProverResult::DeployToken(deploy_token)) = call_result else { - env::panic_str("Invalid proof message") - }; - - self.tokens_to_address_mapping.insert( - &(deploy_token.token_address.get_chain(), deploy_token.token), - &deploy_token.token_address, - ); - } - - pub fn get_token_address( - &self, - chain_kind: ChainKind, - token: AccountId, - ) -> Option { - self.tokens_to_address_mapping.get(&(chain_kind, token)) - } - - pub fn get_transfer_message(&self, nonce: U128) -> TransferMessage { - self.pending_transfers - .get(&nonce.0) - .map(|m| m.into_main().message) - .sdk_expect("The transfer does not exist") - } - - pub fn get_transfer_message_storage(&self, nonce: U128) -> TransferMessageStorageValue { - self.pending_transfers - .get(&nonce.0) - .map(|m| m.into_main()) - .sdk_expect("The transfer does not exist") - } - - #[access_control_any(roles(Role::DAO))] - pub fn add_factory(&mut self, address: OmniAddress) { - self.factories.insert(&(&address).into(), &address); - } -} - -impl Contract { - fn check_or_pay_ft_storage( - mut main_promise: Promise, - args: &StorageDepositArgs, - attached_deposit: &mut NearToken, - ) -> Promise { - for (account, is_storage_deposit) in &args.accounts { - let promise = if *is_storage_deposit { - *attached_deposit = attached_deposit - .checked_sub(NEP141_DEPOSIT) - .sdk_expect("The attached deposit is less than required"); - ext_token::ext(args.token.clone()) - .with_static_gas(STORAGE_DEPOSIT_GAS) - .with_attached_deposit(NEP141_DEPOSIT) - .storage_deposit(Some(account.clone()), Some(true)) - } else { - ext_token::ext(args.token.clone()) - .with_static_gas(STORAGE_BALANCE_OF_GAS) - .with_attached_deposit(NO_DEPOSIT) - .storage_balance_of(Some(account.clone())) - }; - - main_promise = main_promise.and(promise); - } - - main_promise - } - - fn check_storage_balance_result(result_idx: u64) -> bool { - if result_idx >= env::promise_results_count() { - return false; - } - match env::promise_result(result_idx) { - PromiseResult::Successful(data) => { - serde_json::from_slice::>(&data) - .ok() - .flatten() - .is_some() - } - _ => false, - } - } - - fn decode_prover_result(result_idx: u64) -> Result { - match env::promise_result(result_idx) { - PromiseResult::Successful(data) => { - Ok(ProverResult::try_from_slice(&data).sdk_expect("Invalid proof")) - } - PromiseResult::Failed => Err(PromiseError::Failed), - } - } - - fn insert_raw_transfer( - &mut self, - nonce: u128, - transfer_message: TransferMessage, - message_owner: AccountId, - ) -> Option> { - self.pending_transfers.insert_raw( - &borsh::to_vec(&nonce).sdk_expect("ERR_BORSH"), - &TransferMessageStorage::encode_borsh(transfer_message, message_owner) - .sdk_expect("ERR_BORSH"), - ) - } - - fn add_transfer_message( - &mut self, - nonce: u128, - transfer_message: TransferMessage, - message_owner: AccountId, - ) -> NearToken { - let storage_usage = env::storage_usage(); - require!( - self.insert_raw_transfer(nonce, transfer_message, message_owner) - .is_some(), - "ERR_KEY_EXIST" - ); - env::storage_byte_cost().saturating_mul((env::storage_usage() - storage_usage).into()) - } - - fn remove_transfer_message(&mut self, nonce: u128) -> TransferMessage { - let storage_usage = env::storage_usage(); - let transfer = self - .pending_transfers - .remove(&nonce) - .map(|m| m.into_main()) - .sdk_expect("ERR_TRANSFER_NOT_EXIST"); - - let refund = - env::storage_byte_cost().saturating_mul((storage_usage - env::storage_usage()).into()); - - if let Some(mut storage) = self.accounts_balances.get(&transfer.owner) { - storage.available = storage.available.saturating_add(refund); - self.accounts_balances.insert(&transfer.owner, &storage); - } - - transfer.message - } - - fn add_fin_transfer( - &mut self, - transfer_id: &TransferId, - native_token_fee: &Option, - ) -> NearToken { - let storage_usage = env::storage_usage(); - require!( - self.finalised_transfers - .insert(transfer_id, native_token_fee) - .is_none(), - "The transfer is already finalised" - ); - env::storage_byte_cost() - .saturating_mul((env::storage_usage().saturating_sub(storage_usage)).into()) - } - - fn update_fin_transfer( - &mut self, - transfer_id: &TransferId, - native_token_fee: &Option, - ) -> NearToken { - let storage_usage = env::storage_usage(); - self.finalised_transfers - .insert(transfer_id, native_token_fee); - env::storage_byte_cost() - .saturating_mul((env::storage_usage().saturating_sub(storage_usage)).into()) - } - - fn update_storage_balance( - &mut self, - account_id: AccountId, - required_balance: NearToken, - attached_deposit: NearToken, - ) { - if attached_deposit >= required_balance { - let refund = attached_deposit.saturating_sub(required_balance); - if !refund.is_zero() { - Promise::new(account_id).transfer(refund); - } - } else { - let required_balance = required_balance.saturating_sub(attached_deposit); - let mut storage_balance = self - .accounts_balances - .get(&account_id) - .sdk_expect("ERR_ACCOUNT_NOT_REGISTERED"); - - if storage_balance.available >= required_balance { - storage_balance.available = - storage_balance.available.saturating_sub(required_balance); - self.accounts_balances.insert(&account_id, &storage_balance); - } else { - env::panic_str("Not enough storage deposited"); - } - } - } -} diff --git a/near/omni-bridge/.catalog-info.yaml b/near/omni-bridge/.catalog-info.yaml new file mode 100644 index 00000000..eae83482 --- /dev/null +++ b/near/omni-bridge/.catalog-info.yaml @@ -0,0 +1,19 @@ +apiVersion: backstage.io/v1alpha1 +kind: Component +metadata: + name: omni-bridge + title: OmniBridge + description: OmniBridge on Near + tags: + - contract + - near + links: [] + annotations: + aurora.dev/security-tier: "1" +spec: + owner: nearone-team + type: contract + lifecycle: production + system: omnibridge-protocol + deployedAt: [] + interactsWith: [] diff --git a/near/nep141-locker/Cargo.lock b/near/omni-bridge/Cargo.lock similarity index 100% rename from near/nep141-locker/Cargo.lock rename to near/omni-bridge/Cargo.lock diff --git a/near/omni-bridge/Cargo.toml b/near/omni-bridge/Cargo.toml new file mode 100644 index 00000000..6f4e7999 --- /dev/null +++ b/near/omni-bridge/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "omni-bridge" +version = "0.1.0" +authors = ["Karim Alabtakh "] +edition = "2021" +publish = false + +[lib] +crate-type = ["cdylib", "rlib"] + +[dependencies] +near-sdk.workspace = true +near-contract-standards.workspace = true +hex.workspace = true +borsh.workspace = true +serde.workspace = true +near-plugins.workspace = true +omni-types.workspace = true + +[dev-dependencies] +near-sdk = { workspace = true, features = ["unit-testing"] } diff --git a/near/nep141-locker/src/errors.rs b/near/omni-bridge/src/errors.rs similarity index 100% rename from near/nep141-locker/src/errors.rs rename to near/omni-bridge/src/errors.rs diff --git a/near/omni-bridge/src/lib.rs b/near/omni-bridge/src/lib.rs new file mode 100644 index 00000000..6cc933f8 --- /dev/null +++ b/near/omni-bridge/src/lib.rs @@ -0,0 +1,1299 @@ +#![allow(clippy::too_many_arguments)] +use errors::SdkExpect; +use near_plugins::{ + access_control, access_control_any, pause, AccessControlRole, AccessControllable, Pausable, + Upgradable, +}; + +use near_contract_standards::fungible_token::metadata::FungibleTokenMetadata; +use near_contract_standards::fungible_token::receiver::FungibleTokenReceiver; +use near_contract_standards::storage_management::StorageBalance; +use near_sdk::borsh::{self, BorshDeserialize, BorshSerialize}; +use near_sdk::collections::{LookupMap, LookupSet}; +use near_sdk::json_types::{Base64VecU8, U128}; +use near_sdk::serde::{Deserialize, Serialize}; +use near_sdk::{ + env, ext_contract, near, require, serde_json, AccountId, BorshStorageKey, Gas, NearToken, + PanicOnDefault, Promise, PromiseError, PromiseOrValue, PromiseResult, +}; +use omni_types::locker_args::{ + BindTokenArgs, ClaimFeeArgs, DeployTokenArgs, FinTransferArgs, StorageDepositAction, +}; +use omni_types::mpc_types::SignatureResponse; +use omni_types::near_events::OmniBridgeEvent; +use omni_types::prover_args::VerifyProofArgs; +use omni_types::prover_result::ProverResult; +use omni_types::{ + BasicMetadata, ChainKind, Fee, InitTransferMsg, MetadataPayload, Nonce, OmniAddress, + PayloadType, SignRequest, TransferId, TransferMessage, TransferMessagePayload, UpdateFee, +}; +use storage::{Decimals, TransferMessageStorage, TransferMessageStorageValue, NEP141_DEPOSIT}; + +mod errors; +mod storage; + +#[cfg(test)] +mod tests; + +const LOG_METADATA_GAS: Gas = Gas::from_tgas(10); +const LOG_METADATA_CALLBACK_GAS: Gas = Gas::from_tgas(260); +const MPC_SIGNING_GAS: Gas = Gas::from_tgas(250); +const SIGN_TRANSFER_CALLBACK_GAS: Gas = Gas::from_tgas(5); +const SIGN_LOG_METADATA_CALLBACK_GAS: Gas = Gas::from_tgas(5); +const VERIFY_PROOF_GAS: Gas = Gas::from_tgas(30); +const VERIFY_PROOF_CALLBACK_GAS: Gas = Gas::from_tgas(150); +const CLAIM_FEE_CALLBACK_GAS: Gas = Gas::from_tgas(50); +const BIND_TOKEN_CALLBACK_GAS: Gas = Gas::from_tgas(25); +const BIND_TOKEN_REFUND_GAS: Gas = Gas::from_tgas(5); +const FT_TRANSFER_CALL_GAS: Gas = Gas::from_tgas(125); +const FT_TRANSFER_GAS: Gas = Gas::from_tgas(5); +const WNEAR_WITHDRAW_GAS: Gas = Gas::from_tgas(10); +const STORAGE_BALANCE_OF_GAS: Gas = Gas::from_tgas(3); +const STORAGE_DEPOSIT_GAS: Gas = Gas::from_tgas(3); +const DEPLOY_TOKEN_CALLBACK_GAS: Gas = Gas::from_tgas(75); +const DEPLOY_TOKEN_GAS: Gas = Gas::from_tgas(50); +const BURN_TOKEN_GAS: Gas = Gas::from_tgas(10); +const MINT_TOKEN_GAS: Gas = Gas::from_tgas(5); +const SET_METADATA_GAS: Gas = Gas::from_tgas(10); +const NO_DEPOSIT: NearToken = NearToken::from_near(0); +const ONE_YOCTO: NearToken = NearToken::from_yoctonear(1); +const SIGN_PATH: &str = "bridge-1"; + +#[derive(BorshSerialize, BorshStorageKey)] +enum StorageKey { + PendingTransfers, + Factories, + FinalisedTransfers, + TokenIdToAddress, + AccountsBalances, + TokenAddressToId, + TokenDeployerAccounts, + DeployedTokens, + DestinationNonces, + TokenDecimals, +} + +#[derive(AccessControlRole, Deserialize, Serialize, Copy, Clone)] +#[serde(crate = "near_sdk::serde")] +pub enum Role { + DAO, + PauseManager, + UnrestrictedDeposit, + UpgradableCodeStager, + UpgradableCodeDeployer, + MetadataManager, + UnrestrictedRelayer, +} + +#[ext_contract(ext_token)] +pub trait ExtToken { + fn ft_transfer( + &mut self, + receiver_id: AccountId, + amount: U128, + memo: Option, + ) -> PromiseOrValue; + + fn ft_transfer_call( + &mut self, + receiver_id: AccountId, + amount: U128, + memo: Option, + msg: String, + ) -> PromiseOrValue; + + fn ft_metadata(&self) -> FungibleTokenMetadata; + + fn storage_deposit( + &mut self, + account_id: &AccountId, + registration_only: Option, + ) -> Option; + + fn storage_balance_of(&mut self, account_id: &AccountId) -> Option; + + fn mint(&mut self, account_id: AccountId, amount: U128, msg: Option); + + fn burn(&mut self, amount: U128); + + fn set_metadata( + &mut self, + name: Option, + symbol: Option, + reference: Option, + reference_hash: Option, + decimals: Option, + icon: Option, + ); +} + +#[ext_contract(ext_signer)] +pub trait ExtSigner { + fn sign(&mut self, request: SignRequest); +} + +#[ext_contract(ext_prover)] +pub trait Prover { + #[result_serializer(borsh)] + fn verify_proof(&self, #[serializer(borsh)] args: VerifyProofArgs) -> ProverResult; +} + +#[ext_contract(ext_wnear_token)] +pub trait ExtWNearToken { + fn near_withdraw(&self, amount: U128); +} + +#[ext_contract(ext_deployer)] +pub trait TokenDeployer { + fn deploy_token(&self, account_id: AccountId, metadata: BasicMetadata) -> Promise; +} + +#[near(contract_state)] +#[derive(Pausable, Upgradable, PanicOnDefault)] +#[access_control(role_type(Role))] +#[pausable(manager_roles(Role::PauseManager))] +#[upgradable(access_control_roles( + code_stagers(Role::UpgradableCodeStager, Role::DAO), + code_deployers(Role::UpgradableCodeDeployer, Role::DAO), + duration_initializers(Role::DAO), + duration_update_stagers(Role::DAO), + duration_update_appliers(Role::DAO), +))] +pub struct Contract { + pub prover_account: AccountId, + pub factories: LookupMap, + pub pending_transfers: LookupMap, + pub finalised_transfers: LookupSet, + pub token_id_to_address: LookupMap<(ChainKind, AccountId), OmniAddress>, + pub token_address_to_id: LookupMap, + pub token_decimals: LookupMap, + pub deployed_tokens: LookupSet, + pub token_deployer_accounts: LookupMap, + pub mpc_signer: AccountId, + pub current_origin_nonce: Nonce, + // We maintain a separate nonce for each chain to optimize the storage usage on Solana by reducing the gaps. + pub destination_nonces: LookupMap, + pub accounts_balances: LookupMap, + pub wnear_account_id: AccountId, +} + +#[near] +impl FungibleTokenReceiver for Contract { + #[pause(except(roles(Role::DAO, Role::UnrestrictedDeposit)))] + fn ft_on_transfer( + &mut self, + sender_id: AccountId, + amount: U128, + msg: String, + ) -> PromiseOrValue { + let parsed_msg: InitTransferMsg = serde_json::from_str(&msg).sdk_expect("ERR_PARSE_MSG"); + let token_id = env::predecessor_account_id(); + require!( + parsed_msg.recipient.get_chain() != ChainKind::Near, + "ERR_INVALID_RECIPIENT_CHAIN" + ); + + self.current_origin_nonce += 1; + let destination_nonce = self.get_next_destination_nonce(parsed_msg.recipient.get_chain()); + + let transfer_message = TransferMessage { + origin_nonce: self.current_origin_nonce, + token: OmniAddress::Near(token_id.clone()), + amount, + recipient: parsed_msg.recipient, + fee: Fee { + fee: parsed_msg.fee, + native_fee: parsed_msg.native_token_fee, + }, + sender: OmniAddress::Near(sender_id.clone()), + msg: String::new(), + destination_nonce, + }; + require!( + transfer_message.fee.fee < transfer_message.amount, + "ERR_INVALID_FEE" + ); + + let mut required_storage_balance = + self.add_transfer_message(transfer_message.clone(), sender_id.clone()); + required_storage_balance = required_storage_balance + .saturating_add(NearToken::from_yoctonear(parsed_msg.native_token_fee.0)); + + self.update_storage_balance( + sender_id, + required_storage_balance, + NearToken::from_yoctonear(0), + ); + + if self.deployed_tokens.contains(&token_id) { + ext_token::ext(token_id.clone()) + .with_static_gas(BURN_TOKEN_GAS) + .burn(amount); + } + + env::log_str(&OmniBridgeEvent::InitTransferEvent { transfer_message }.to_log_string()); + PromiseOrValue::Value(U128(0)) + } +} + +#[near] +impl Contract { + #[init] + pub fn new( + prover_account: AccountId, + mpc_signer: AccountId, + wnear_account_id: AccountId, + ) -> Self { + let mut contract = Self { + prover_account, + factories: LookupMap::new(StorageKey::Factories), + pending_transfers: LookupMap::new(StorageKey::PendingTransfers), + finalised_transfers: LookupSet::new(StorageKey::FinalisedTransfers), + token_id_to_address: LookupMap::new(StorageKey::TokenIdToAddress), + token_address_to_id: LookupMap::new(StorageKey::TokenAddressToId), + token_decimals: LookupMap::new(StorageKey::TokenDecimals), + deployed_tokens: LookupSet::new(StorageKey::DeployedTokens), + token_deployer_accounts: LookupMap::new(StorageKey::TokenDeployerAccounts), + mpc_signer, + current_origin_nonce: 0, + destination_nonces: LookupMap::new(StorageKey::DestinationNonces), + accounts_balances: LookupMap::new(StorageKey::AccountsBalances), + wnear_account_id, + }; + + contract.acl_init_super_admin(near_sdk::env::predecessor_account_id()); + contract.acl_grant_role(Role::DAO.into(), near_sdk::env::predecessor_account_id()); + contract + } + + #[pause(except(roles(Role::DAO, Role::UnrestrictedRelayer)))] + pub fn log_metadata(&self, token_id: &AccountId) -> Promise { + ext_token::ext(token_id.clone()) + .with_static_gas(LOG_METADATA_GAS) + .ft_metadata() + .then( + Self::ext(env::current_account_id()) + .with_static_gas(LOG_METADATA_CALLBACK_GAS) + .with_attached_deposit(env::attached_deposit()) + .log_metadata_callback(token_id), + ) + } + + #[private] + #[result_serializer(borsh)] + pub fn log_metadata_callback( + &self, + #[callback] metadata: FungibleTokenMetadata, + token_id: &AccountId, + ) -> Promise { + require!( + !metadata.name.is_empty() && !metadata.symbol.is_empty(), + "ERR_INVALID_METADATA" + ); + + let metadata_payload = MetadataPayload { + prefix: PayloadType::Metadata, + token: token_id.to_string(), + name: metadata.name, + symbol: metadata.symbol, + decimals: metadata.decimals, + }; + + let payload = near_sdk::env::keccak256_array( + &borsh::to_vec(&metadata_payload).sdk_expect("ERR_BORSH"), + ); + + ext_signer::ext(self.mpc_signer.clone()) + .with_static_gas(MPC_SIGNING_GAS) + .with_attached_deposit(env::attached_deposit()) + .sign(SignRequest { + payload, + path: SIGN_PATH.to_owned(), + key_version: 0, + }) + .then( + Self::ext(env::current_account_id()) + .with_static_gas(SIGN_LOG_METADATA_CALLBACK_GAS) + .sign_log_metadata_callback(metadata_payload), + ) + } + + #[private] + #[result_serializer(borsh)] + pub fn sign_log_metadata_callback( + &self, + #[callback_result] call_result: Result, + #[serializer(borsh)] metadata_payload: MetadataPayload, + ) { + if let Ok(signature) = call_result { + env::log_str( + &OmniBridgeEvent::LogMetadataEvent { + signature, + metadata_payload, + } + .to_log_string(), + ); + } + } + + #[payable] + #[pause] + pub fn update_transfer_fee(&mut self, transfer_id: TransferId, fee: UpdateFee) { + match fee { + UpdateFee::Fee(fee) => { + let mut transfer = self.get_transfer_message_storage(transfer_id); + + require!( + OmniAddress::Near(env::predecessor_account_id()) == transfer.message.sender, + "Only sender can update fee" + ); + + let current_fee = transfer.message.fee; + require!( + fee.fee >= current_fee.fee && fee.fee < transfer.message.amount, + "ERR_INVALID_FEE" + ); + + let diff_native_fee = fee + .native_fee + .0 + .checked_sub(current_fee.native_fee.0) + .sdk_expect("ERR_LOWER_FEE"); + + require!( + NearToken::from_yoctonear(diff_native_fee) == env::attached_deposit(), + "ERR_INVALID_ATTACHED_DEPOSIT" + ); + + transfer.message.fee = fee; + self.insert_raw_transfer(transfer.message.clone(), transfer.owner); + + env::log_str( + &OmniBridgeEvent::UpdateFeeEvent { + transfer_message: transfer.message, + } + .to_log_string(), + ); + } + UpdateFee::Proof(_) => env::panic_str("TODO"), + } + } + + /// # Panics + /// + /// This function will panic under the following conditions: + /// + /// - If the `borsh::to_vec` serialization of the `TransferMessagePayload` fails. + /// - If a `fee` is provided and it doesn't match the fee in the stored transfer message. + #[payable] + #[pause(except(roles(Role::DAO, Role::UnrestrictedRelayer)))] + pub fn sign_transfer( + &mut self, + transfer_id: TransferId, + fee_recipient: Option, + fee: &Option, + ) -> Promise { + let transfer_message = self.get_transfer_message(transfer_id); + if let Some(fee) = &fee { + require!(&transfer_message.fee == fee, "Invalid fee"); + } + + let token_address = self + .get_token_address( + transfer_message.get_destination_chain(), + self.get_token_id(&transfer_message.token), + ) + .unwrap_or_else(|| env::panic_str("ERR_FAILED_TO_GET_TOKEN_ADDRESS")); + + let decimals = self + .token_decimals + .get(&token_address) + .sdk_expect("ERR_TOKEN_DECIMALS_NOT_FOUND"); + let amount_to_transfer = Self::normalize_amount( + transfer_message.amount.0 - transfer_message.fee.fee.0, + decimals, + ); + + require!(amount_to_transfer > 0, "Invalid amount to transfer"); + + let transfer_payload = TransferMessagePayload { + prefix: PayloadType::TransferMessage, + destination_nonce: transfer_message.destination_nonce, + transfer_id, + token_address, + amount: U128(amount_to_transfer), + recipient: transfer_message.recipient, + fee_recipient, + }; + + let payload = near_sdk::env::keccak256_array(&borsh::to_vec(&transfer_payload).unwrap()); + + ext_signer::ext(self.mpc_signer.clone()) + .with_static_gas(MPC_SIGNING_GAS) + .with_attached_deposit(env::attached_deposit()) + .sign(SignRequest { + payload, + path: SIGN_PATH.to_owned(), + key_version: 0, + }) + .then( + Self::ext(env::current_account_id()) + .with_static_gas(SIGN_TRANSFER_CALLBACK_GAS) + .sign_transfer_callback(transfer_payload, &transfer_message.fee), + ) + } + + #[private] + pub fn sign_transfer_callback( + &mut self, + #[callback_result] call_result: Result, + #[serializer(borsh)] message_payload: TransferMessagePayload, + #[serializer(borsh)] fee: &Fee, + ) { + if let Ok(signature) = call_result { + if fee.is_zero() { + self.remove_transfer_message(message_payload.transfer_id); + } + + env::log_str( + &OmniBridgeEvent::SignTransferEvent { + signature, + message_payload, + } + .to_log_string(), + ); + } + } + + #[payable] + #[pause(except(roles(Role::DAO, Role::UnrestrictedRelayer)))] + pub fn fin_transfer(&mut self, #[serializer(borsh)] args: FinTransferArgs) -> Promise { + require!( + args.storage_deposit_actions.len() <= 3, + "Invalid len of accounts for storage deposit" + ); + let main_promise = ext_prover::ext(self.prover_account.clone()) + .with_static_gas(VERIFY_PROOF_GAS) + .with_attached_deposit(NO_DEPOSIT) + .verify_proof(VerifyProofArgs { + prover_id: args.chain_kind.as_ref().to_owned(), + prover_args: args.prover_args, + }); + + let mut attached_deposit = env::attached_deposit(); + Self::check_or_pay_ft_storage( + main_promise, + &args.storage_deposit_actions, + &mut attached_deposit, + ) + .then( + Self::ext(env::current_account_id()) + .with_attached_deposit(attached_deposit) + .with_static_gas(VERIFY_PROOF_CALLBACK_GAS) + .fin_transfer_callback( + &args.storage_deposit_actions, + env::predecessor_account_id(), + ), + ) + } + + #[private] + #[payable] + pub fn fin_transfer_callback( + &mut self, + #[serializer(borsh)] storage_deposit_actions: &Vec, + #[serializer(borsh)] predecessor_account_id: AccountId, + ) -> PromiseOrValue { + let Ok(ProverResult::InitTransfer(init_transfer)) = Self::decode_prover_result(0) else { + env::panic_str("Invalid proof message") + }; + require!( + self.factories + .get(&init_transfer.emitter_address.get_chain()) + == Some(init_transfer.emitter_address), + "Unknown factory" + ); + + let decimals = self + .token_decimals + .get(&init_transfer.token) + .sdk_expect("ERR_TOKEN_DECIMALS_NOT_FOUND"); + + let destination_nonce = + self.get_next_destination_nonce(init_transfer.recipient.get_chain()); + let transfer_message = TransferMessage { + origin_nonce: init_transfer.origin_nonce, + token: init_transfer.token, + amount: Self::denormalize_amount(init_transfer.amount.0, decimals).into(), + recipient: init_transfer.recipient, + fee: Fee { + fee: Self::denormalize_amount(init_transfer.fee.fee.0, decimals).into(), + native_fee: init_transfer.fee.native_fee, + }, + sender: init_transfer.sender, + msg: init_transfer.msg, + destination_nonce, + }; + + if let OmniAddress::Near(recipient) = transfer_message.recipient.clone() { + self.process_fin_transfer_to_near( + recipient, + predecessor_account_id, + transfer_message, + storage_deposit_actions, + ) + .into() + } else { + self.process_fin_transfer_to_other_cahin(predecessor_account_id, transfer_message); + PromiseOrValue::Value(destination_nonce) + } + } + + #[payable] + #[pause(except(roles(Role::DAO, Role::UnrestrictedRelayer)))] + pub fn claim_fee(&mut self, #[serializer(borsh)] args: ClaimFeeArgs) -> Promise { + ext_prover::ext(self.prover_account.clone()) + .with_static_gas(VERIFY_PROOF_GAS) + .with_attached_deposit(NO_DEPOSIT) + .verify_proof(VerifyProofArgs { + prover_id: args.chain_kind.as_ref().to_owned(), + prover_args: args.prover_args, + }) + .then( + Self::ext(env::current_account_id()) + .with_attached_deposit(env::attached_deposit()) + .with_static_gas(CLAIM_FEE_CALLBACK_GAS) + .claim_fee_callback(&env::predecessor_account_id()), + ) + } + + #[private] + #[payable] + pub fn claim_fee_callback( + &mut self, + #[serializer(borsh)] predecessor_account_id: &AccountId, + #[callback_result] + #[serializer(borsh)] + call_result: Result, + ) -> PromiseOrValue<()> { + let Ok(ProverResult::FinTransfer(fin_transfer)) = call_result else { + env::panic_str("Invalid proof message") + }; + require!( + fin_transfer.fee_recipient == *predecessor_account_id, + "ERR_ONLY_FEE_RECIPIENT_CAN_CLAIM" + ); + require!( + self.factories + .get(&fin_transfer.emitter_address.get_chain()) + .as_ref() + == Some(&fin_transfer.emitter_address), + "ERR_UNKNOWN_FACTORY" + ); + + let message = self.remove_transfer_message(fin_transfer.transfer_id); + let token_address = self + .get_token_address( + message.get_destination_chain(), + self.get_token_id(&message.token), + ) + .unwrap_or_else(|| env::panic_str("ERR_FAILED_TO_GET_TOKEN_ADDRESS")); + + let denormalized_amount = Self::denormalize_amount( + fin_transfer.amount.0, + self.token_decimals + .get(&token_address) + .sdk_expect("ERR_TOKEN_DECIMALS_NOT_FOUND"), + ); + let fee = message.amount.0 - denormalized_amount; + + if message.fee.native_fee.0 != 0 { + if message.get_origin_chain() == ChainKind::Near { + Promise::new(fin_transfer.fee_recipient.clone()) + .transfer(NearToken::from_yoctonear(message.fee.native_fee.0)); + } else { + ext_token::ext(self.get_native_token_id(message.get_origin_chain())) + .with_static_gas(MINT_TOKEN_GAS) + .mint( + fin_transfer.fee_recipient.clone(), + message.fee.native_fee, + None, + ); + } + } + + let token = self.get_token_id(&message.token); + env::log_str( + &OmniBridgeEvent::ClaimFeeEvent { + transfer_message: message, + } + .to_log_string(), + ); + + if fee > 0 { + if self.deployed_tokens.contains(&token) { + PromiseOrValue::Promise(ext_token::ext(token).with_static_gas(MINT_TOKEN_GAS).mint( + fin_transfer.fee_recipient, + U128(fee), + None, + )) + } else { + PromiseOrValue::Promise( + ext_token::ext(token) + .with_static_gas(FT_TRANSFER_GAS) + .with_attached_deposit(ONE_YOCTO) + .ft_transfer(fin_transfer.fee_recipient, U128(fee), None), + ) + } + } else { + PromiseOrValue::Value(()) + } + } + + #[payable] + #[pause(except(roles(Role::DAO, Role::UnrestrictedRelayer)))] + pub fn deploy_token(&mut self, #[serializer(borsh)] args: DeployTokenArgs) -> Promise { + ext_prover::ext(self.prover_account.clone()) + .with_static_gas(VERIFY_PROOF_GAS) + .with_attached_deposit(NO_DEPOSIT) + .verify_proof(VerifyProofArgs { + prover_id: args.chain_kind.as_ref().to_owned(), + prover_args: args.prover_args, + }) + .then( + Self::ext(env::current_account_id()) + .with_attached_deposit(NO_DEPOSIT) + .with_static_gas(DEPLOY_TOKEN_CALLBACK_GAS) + .deploy_token_callback(near_sdk::env::attached_deposit()), + ) + } + + #[private] + pub fn deploy_token_callback( + &mut self, + attached_deposit: NearToken, + #[callback_result] + #[serializer(borsh)] + call_result: Result, + ) -> Promise { + let Ok(ProverResult::LogMetadata(metadata)) = call_result else { + env::panic_str("ERR_INVALID_PROOF"); + }; + + let chain = metadata.emitter_address.get_chain(); + require!( + self.factories.get(&chain) == Some(metadata.emitter_address), + "ERR_UNKNOWN_FACTORY" + ); + + self.deploy_token_internal( + chain, + &metadata.token_address, + BasicMetadata { + name: metadata.name, + symbol: metadata.symbol, + decimals: metadata.decimals, + }, + attached_deposit, + ) + } + + #[payable] + #[access_control_any(roles(Role::DAO))] + pub fn deploy_native_token( + &mut self, + chain_kind: ChainKind, + name: String, + symbol: String, + decimals: u8, + ) -> Promise { + self.deploy_token_internal( + chain_kind, + &OmniAddress::new_zero(chain_kind) + .unwrap_or_else(|_| env::panic_str("ERR_FAILED_TO_GET_ZERO_ADDRESS")), + BasicMetadata { + name, + symbol, + decimals, + }, + env::attached_deposit(), + ) + } + + #[payable] + #[pause(except(roles(Role::DAO, Role::UnrestrictedRelayer)))] + pub fn bind_token(&mut self, #[serializer(borsh)] args: BindTokenArgs) -> Promise { + ext_prover::ext(self.prover_account.clone()) + .with_static_gas(VERIFY_PROOF_GAS) + .with_attached_deposit(NO_DEPOSIT) + .verify_proof(VerifyProofArgs { + prover_id: args.chain_kind.as_ref().to_owned(), + prover_args: args.prover_args, + }) + .then( + Self::ext(env::current_account_id()) + .with_attached_deposit(NO_DEPOSIT) + .with_static_gas(BIND_TOKEN_CALLBACK_GAS) + .bind_token_callback(near_sdk::env::attached_deposit()), + ) + .then( + Self::ext(env::current_account_id()) + .with_attached_deposit(env::attached_deposit()) + .with_static_gas(BIND_TOKEN_REFUND_GAS) + .bind_token_refund(near_sdk::env::predecessor_account_id()), + ) + } + + #[private] + pub fn bind_token_callback( + &mut self, + attached_deposit: NearToken, + #[callback_result] + #[serializer(borsh)] + call_result: Result, + ) -> NearToken { + let Ok(ProverResult::DeployToken(deploy_token)) = call_result else { + env::panic_str("ERROR: Invalid proof message"); + }; + + require!( + self.factories + .get(&deploy_token.emitter_address.get_chain()) + == Some(deploy_token.emitter_address), + "Unknown factory" + ); + + let storage_usage = env::storage_usage(); + self.token_id_to_address.insert( + &( + deploy_token.token_address.get_chain(), + deploy_token.token.clone(), + ), + &deploy_token.token_address, + ); + self.token_address_to_id + .insert(&deploy_token.token_address, &deploy_token.token); + + self.token_decimals.insert( + &deploy_token.token_address, + &Decimals { + decimals: deploy_token.decimals, + origin_decimals: deploy_token.origin_decimals, + }, + ); + + let required_deposit = env::storage_byte_cost() + .saturating_mul((env::storage_usage().saturating_sub(storage_usage)).into()); + + require!( + attached_deposit >= required_deposit, + "ERROR: The deposit is not sufficient to cover the storage." + ); + attached_deposit.saturating_sub(required_deposit) + } + + #[private] + #[payable] + pub fn bind_token_refund( + &mut self, + predecessor_account_id: AccountId, + #[callback_result] call_result: Result, + ) { + let refund_amount = call_result.unwrap_or(env::attached_deposit()); + Self::refund(predecessor_account_id, refund_amount); + } + + pub fn get_token_address( + &self, + chain_kind: ChainKind, + token: AccountId, + ) -> Option { + self.token_id_to_address.get(&(chain_kind, token)) + } + + pub fn get_token_id(&self, address: &OmniAddress) -> AccountId { + if let OmniAddress::Near(token_account_id) = address { + token_account_id.clone() + } else { + self.token_address_to_id + .get(address) + .sdk_expect("ERR_TOKEN_NOT_REGISTERED") + } + } + + pub fn get_native_token_id(&self, chain: ChainKind) -> AccountId { + let native_token_address = + OmniAddress::new_zero(chain).sdk_expect("ERR_FAILED_TO_GET_ZERO_ADDRESS"); + + self.get_token_id(&native_token_address) + } + + pub fn get_transfer_message(&self, transfer_id: TransferId) -> TransferMessage { + self.pending_transfers + .get(&transfer_id) + .map(storage::TransferMessageStorage::into_main) + .map(|m| m.message) + .sdk_expect("The transfer does not exist") + } + + pub fn get_transfer_message_storage( + &self, + transfer_id: TransferId, + ) -> TransferMessageStorageValue { + self.pending_transfers + .get(&transfer_id) + .map(storage::TransferMessageStorage::into_main) + .sdk_expect("The transfer does not exist") + } + + pub fn is_transfer_finalised(&self, transfer_id: TransferId) -> bool { + self.finalised_transfers.contains(&transfer_id) + } + + #[access_control_any(roles(Role::DAO))] + pub fn add_factory(&mut self, address: OmniAddress) { + self.factories.insert(&(&address).into(), &address); + } + + #[access_control_any(roles(Role::DAO))] + pub fn add_token_deployer(&mut self, chain: ChainKind, account_id: AccountId) { + self.token_deployer_accounts.insert(&chain, &account_id); + } + + #[access_control_any(roles(Role::DAO))] + #[payable] + pub fn add_deployed_tokens(&mut self, tokens: Vec<(OmniAddress, AccountId)>) { + require!( + env::attached_deposit() >= NEP141_DEPOSIT.saturating_mul(tokens.len() as u128), + "ERR_NOT_ENOUGH_ATTACHED_DEPOSIT" + ); + + for (token_address, token_id) in tokens { + self.deployed_tokens.insert(&token_id); + self.token_address_to_id.insert(&token_address, &token_id); + self.token_id_to_address.insert( + &(token_address.get_chain(), token_id.clone()), + &token_address, + ); + self.token_decimals.insert( + &token_address, + &Decimals { + decimals: 0, + origin_decimals: 0, + }, + ); + + ext_token::ext(token_id) + .with_static_gas(STORAGE_DEPOSIT_GAS) + .with_attached_deposit(NEP141_DEPOSIT) + .storage_deposit(&env::current_account_id(), Some(true)); + } + } + + #[access_control_any(roles(Role::DAO, Role::MetadataManager))] + pub fn set_token_metadata( + &mut self, + token: AccountId, + name: Option, + symbol: Option, + icon: Option, + reference: Option, + reference_hash: Option, + ) -> Promise { + ext_token::ext(token) + .with_static_gas(SET_METADATA_GAS) + .set_metadata(name, symbol, reference, reference_hash, None, icon) + } + + pub fn get_current_destination_nonce(&self, chain_kind: ChainKind) -> Nonce { + self.destination_nonces.get(&chain_kind).unwrap_or_default() + } + + pub fn get_mpc_account(&self) -> AccountId { + self.mpc_signer.clone() + } +} + +impl Contract { + fn get_next_destination_nonce(&mut self, chain_kind: ChainKind) -> Nonce { + if chain_kind == ChainKind::Near { + return 0; + } + + let mut payload_nonce = self.destination_nonces.get(&chain_kind).unwrap_or_default(); + + payload_nonce += 1; + + self.destination_nonces.insert(&chain_kind, &payload_nonce); + + payload_nonce + } + + #[allow(clippy::too_many_lines, clippy::ptr_arg)] + fn process_fin_transfer_to_near( + &mut self, + recipient: AccountId, + predecessor_account_id: AccountId, + transfer_message: TransferMessage, + storage_deposit_actions: &Vec, + ) -> Promise { + let mut required_balance = self.add_fin_transfer(&transfer_message.get_transfer_id()); + + let token = self.get_token_id(&transfer_message.token); + + let mut storage_deposit_action_index: usize = 0; + require!( + Self::check_storage_balance_result((storage_deposit_action_index + 1) as u64) + && storage_deposit_actions[storage_deposit_action_index].account_id == recipient + && storage_deposit_actions[storage_deposit_action_index].token_id == token, + "STORAGE_ERR: The transfer recipient is omitted" + ); + storage_deposit_action_index += 1; + + let amount_to_transfer = U128(transfer_message.amount.0 - transfer_message.fee.fee.0); + let is_deployed_token = self.deployed_tokens.contains(&token); + + let mut promise = if token == self.wnear_account_id && transfer_message.msg.is_empty() { + // Unwrap wNEAR and transfer NEAR tokens + ext_wnear_token::ext(self.wnear_account_id.clone()) + .with_static_gas(WNEAR_WITHDRAW_GAS) + .with_attached_deposit(ONE_YOCTO) + .near_withdraw(amount_to_transfer) + .then( + Promise::new(recipient) + .transfer(NearToken::from_yoctonear(amount_to_transfer.0)), + ) + } else if is_deployed_token { + let deposit = if transfer_message.msg.is_empty() { + NO_DEPOSIT + } else { + ONE_YOCTO + }; + ext_token::ext(token.clone()) + .with_attached_deposit(deposit) + .with_static_gas(MINT_TOKEN_GAS.saturating_add(FT_TRANSFER_CALL_GAS)) + .mint( + recipient, + amount_to_transfer, + (!transfer_message.msg.is_empty()).then(|| transfer_message.msg.clone()), + ) + } else if transfer_message.msg.is_empty() { + ext_token::ext(token.clone()) + .with_attached_deposit(ONE_YOCTO) + .with_static_gas(FT_TRANSFER_GAS) + .ft_transfer(recipient, amount_to_transfer, None) + } else { + ext_token::ext(token.clone()) + .with_attached_deposit(ONE_YOCTO) + .with_static_gas(FT_TRANSFER_CALL_GAS) + .ft_transfer_call( + recipient, + amount_to_transfer, + None, + transfer_message.msg.clone(), + ) + }; + + if transfer_message.fee.fee.0 > 0 { + require!( + Self::check_storage_balance_result((storage_deposit_action_index + 1) as u64) + && storage_deposit_actions[storage_deposit_action_index].account_id + == predecessor_account_id + && storage_deposit_actions[storage_deposit_action_index].token_id == token, + "STORAGE_ERR: The fee recipient is omitted" + ); + storage_deposit_action_index += 1; + + promise = promise.then(if is_deployed_token { + ext_token::ext(token).with_static_gas(MINT_TOKEN_GAS).mint( + predecessor_account_id.clone(), + transfer_message.fee.fee, + None, + ) + } else { + ext_token::ext(token) + .with_attached_deposit(ONE_YOCTO) + .with_static_gas(FT_TRANSFER_GAS) + .ft_transfer( + predecessor_account_id.clone(), + transfer_message.fee.fee, + None, + ) + }); + + required_balance = required_balance.saturating_add(NearToken::from_yoctonear(2)); + } else { + required_balance = required_balance.saturating_add(ONE_YOCTO); + } + + if transfer_message.fee.native_fee.0 > 0 { + let native_token_id = self.get_native_token_id(transfer_message.get_origin_chain()); + + require!( + Self::check_storage_balance_result((storage_deposit_action_index + 1) as u64) + && storage_deposit_actions[storage_deposit_action_index].account_id + == predecessor_account_id + && storage_deposit_actions[storage_deposit_action_index].token_id + == native_token_id, + "STORAGE_ERR: The native fee recipient is omitted" + ); + + promise = promise.then( + ext_token::ext(native_token_id) + .with_static_gas(MINT_TOKEN_GAS) + .mint( + predecessor_account_id.clone(), + transfer_message.fee.native_fee, + None, + ), + ); + } + + self.update_storage_balance( + predecessor_account_id, + required_balance, + env::attached_deposit(), + ); + + env::log_str(&OmniBridgeEvent::FinTransferEvent { transfer_message }.to_log_string()); + + promise + } + + fn process_fin_transfer_to_other_cahin( + &mut self, + predecessor_account_id: AccountId, + transfer_message: TransferMessage, + ) { + let mut required_balance = self.add_fin_transfer(&transfer_message.get_transfer_id()); + + required_balance = self + .add_transfer_message(transfer_message.clone(), predecessor_account_id.clone()) + .saturating_add(required_balance); + + self.update_storage_balance( + predecessor_account_id, + required_balance, + env::attached_deposit(), + ); + + env::log_str(&OmniBridgeEvent::FinTransferEvent { transfer_message }.to_log_string()); + } + + fn check_or_pay_ft_storage( + mut main_promise: Promise, + storage_deposit_actions: &Vec, + attached_deposit: &mut NearToken, + ) -> Promise { + for action in storage_deposit_actions { + let promise = if let Some(storage_deposit_amount) = action.storage_deposit_amount { + let storage_deposit_amount = NearToken::from_yoctonear(storage_deposit_amount); + + *attached_deposit = attached_deposit + .checked_sub(storage_deposit_amount) + .sdk_expect("The attached deposit is less than required"); + + ext_token::ext(action.token_id.clone()) + .with_static_gas(STORAGE_DEPOSIT_GAS) + .with_attached_deposit(storage_deposit_amount) + .storage_deposit(&action.account_id, Some(true)) + } else { + ext_token::ext(action.token_id.clone()) + .with_static_gas(STORAGE_BALANCE_OF_GAS) + .with_attached_deposit(NO_DEPOSIT) + .storage_balance_of(&action.account_id) + }; + + main_promise = main_promise.and(promise); + } + + main_promise + } + + fn check_storage_balance_result(result_idx: u64) -> bool { + if result_idx >= env::promise_results_count() { + return false; + } + match env::promise_result(result_idx) { + PromiseResult::Successful(data) => { + serde_json::from_slice::>(&data) + .ok() + .flatten() + .is_some() + } + PromiseResult::Failed => false, + } + } + + fn decode_prover_result(result_idx: u64) -> Result { + match env::promise_result(result_idx) { + PromiseResult::Successful(data) => { + Ok(ProverResult::try_from_slice(&data).sdk_expect("Invalid proof")) + } + PromiseResult::Failed => Err(PromiseError::Failed), + } + } + + fn insert_raw_transfer( + &mut self, + transfer_message: TransferMessage, + message_owner: AccountId, + ) -> Option> { + self.pending_transfers.insert_raw( + &borsh::to_vec(&transfer_message.get_transfer_id()).sdk_expect("ERR_BORSH"), + &TransferMessageStorage::encode_borsh(transfer_message, message_owner) + .sdk_expect("ERR_BORSH"), + ) + } + + fn add_transfer_message( + &mut self, + transfer_message: TransferMessage, + message_owner: AccountId, + ) -> NearToken { + let storage_usage = env::storage_usage(); + require!( + self.insert_raw_transfer(transfer_message, message_owner,) + .is_none(), + "ERR_KEY_EXIST" + ); + env::storage_byte_cost().saturating_mul((env::storage_usage() - storage_usage).into()) + } + + fn remove_transfer_message(&mut self, transfer_id: TransferId) -> TransferMessage { + let storage_usage = env::storage_usage(); + let transfer = self + .pending_transfers + .remove(&transfer_id) + .map(storage::TransferMessageStorage::into_main) + .sdk_expect("ERR_TRANSFER_NOT_EXIST"); + + let refund = + env::storage_byte_cost().saturating_mul((storage_usage - env::storage_usage()).into()); + + if let Some(mut storage) = self.accounts_balances.get(&transfer.owner) { + storage.available = storage.available.saturating_add(refund); + self.accounts_balances.insert(&transfer.owner, &storage); + } + + transfer.message + } + + fn add_fin_transfer(&mut self, transfer_id: &TransferId) -> NearToken { + let storage_usage = env::storage_usage(); + require!( + self.finalised_transfers.insert(transfer_id), + "The transfer is already finalised" + ); + env::storage_byte_cost() + .saturating_mul((env::storage_usage().saturating_sub(storage_usage)).into()) + } + + fn update_storage_balance( + &mut self, + account_id: AccountId, + required_balance: NearToken, + attached_deposit: NearToken, + ) { + if attached_deposit >= required_balance { + Self::refund( + account_id, + attached_deposit.saturating_sub(required_balance), + ); + } else { + let required_balance = required_balance.saturating_sub(attached_deposit); + let mut storage_balance = self + .accounts_balances + .get(&account_id) + .sdk_expect("ERR_ACCOUNT_NOT_REGISTERED"); + + if storage_balance.available >= required_balance { + storage_balance.available = + storage_balance.available.saturating_sub(required_balance); + self.accounts_balances.insert(&account_id, &storage_balance); + } else { + env::panic_str("Not enough storage deposited"); + } + } + } + + fn deploy_token_internal( + &mut self, + chain_kind: ChainKind, + token_address: &OmniAddress, + metadata: BasicMetadata, + attached_deposit: NearToken, + ) -> Promise { + let deployer = self + .token_deployer_accounts + .get(&chain_kind) + .unwrap_or_else(|| env::panic_str("ERR_DEPLOYER_NOT_SET")); + let prefix = token_address.get_token_prefix(); + let token_id: AccountId = format!("{prefix}.{deployer}") + .parse() + .unwrap_or_else(|_| env::panic_str("ERR_PARSE_ACCOUNT")); + + let storage_usage = env::storage_usage(); + require!( + self.token_id_to_address + .insert(&(chain_kind, token_id.clone()), token_address) + .is_none(), + "ERR_TOKEN_EXIST" + ); + require!( + self.token_address_to_id + .insert(token_address, &token_id) + .is_none(), + "ERR_TOKEN_EXIST" + ); + require!( + self.token_decimals + .insert( + token_address, + &Decimals { + decimals: metadata.decimals, + origin_decimals: metadata.decimals + } + ) + .is_none(), + "ERR_TOKEN_EXIST" + ); + require!(self.deployed_tokens.insert(&token_id), "ERR_TOKEN_EXIST"); + let required_deposit = env::storage_byte_cost() + .saturating_mul((env::storage_usage().saturating_sub(storage_usage)).into()) + .saturating_add(storage::BRIDGE_TOKEN_INIT_BALANCE) + .saturating_add(NEP141_DEPOSIT); + + require!( + attached_deposit >= required_deposit, + "ERROR: The deposit is not sufficient to cover the storage." + ); + + ext_deployer::ext(deployer) + .with_static_gas(DEPLOY_TOKEN_GAS) + .with_attached_deposit(storage::BRIDGE_TOKEN_INIT_BALANCE) + .deploy_token(token_id.clone(), metadata) + .then( + ext_token::ext(token_id) + .with_static_gas(STORAGE_DEPOSIT_GAS) + .with_attached_deposit(NEP141_DEPOSIT) + .storage_deposit(&env::current_account_id(), Some(true)), + ) + } + + fn refund(account_id: AccountId, amount: NearToken) { + if !amount.is_zero() { + Promise::new(account_id).transfer(amount); + } + } + + fn denormalize_amount(amount: u128, decimals: Decimals) -> u128 { + let diff_decimals: u32 = (decimals.origin_decimals - decimals.decimals).into(); + amount * (10_u128.pow(diff_decimals)) + } + + fn normalize_amount(amount: u128, decimals: Decimals) -> u128 { + let diff_decimals: u32 = (decimals.origin_decimals - decimals.decimals).into(); + amount / (10_u128.pow(diff_decimals)) + } +} diff --git a/near/nep141-locker/src/storage.rs b/near/omni-bridge/src/storage.rs similarity index 65% rename from near/nep141-locker/src/storage.rs rename to near/omni-bridge/src/storage.rs index 6415be5d..72ca58b8 100644 --- a/near/nep141-locker/src/storage.rs +++ b/near/omni-bridge/src/storage.rs @@ -1,8 +1,15 @@ use near_contract_standards::storage_management::{StorageBalance, StorageBalanceBounds}; use near_sdk::{assert_one_yocto, borsh}; use near_sdk::{env, near_bindgen, AccountId, NearToken}; +use omni_types::TransferId; -use crate::*; +use crate::{ + require, BorshDeserialize, BorshSerialize, ChainKind, Contract, ContractExt, Deserialize, Fee, + OmniAddress, Promise, SdkExpect, Serialize, TransferMessage, U128, +}; + +pub const BRIDGE_TOKEN_INIT_BALANCE: NearToken = NearToken::from_near(3); +pub const NEP141_DEPOSIT: NearToken = NearToken::from_yoctonear(1_250_000_000_000_000_000_000); #[derive(BorshDeserialize, BorshSerialize, Serialize, Deserialize, Debug, Clone)] pub struct TransferMessageStorageValue { @@ -33,6 +40,12 @@ impl TransferMessageStorage { } } +#[derive(BorshDeserialize, BorshSerialize, Debug, Clone, Copy, PartialEq, Eq)] +pub struct Decimals { + pub decimals: u8, + pub origin_decimals: u8, +} + #[near_bindgen] impl Contract { #[payable] @@ -111,11 +124,11 @@ impl Contract { } pub fn storage_balance_of(&self, account_id: &AccountId) -> Option { - self.accounts_balances.get(&account_id) + self.accounts_balances.get(account_id) } pub fn required_balance_for_account(&self) -> NearToken { - let key_len = 64 + 4; + let key_len = Self::max_key_len_of_account_id(); let value_len = borsh::to_vec(&StorageBalance { total: NearToken::from_yoctonear(0), available: NearToken::from_yoctonear(0), @@ -127,21 +140,21 @@ impl Contract { .saturating_mul((Self::get_basic_storage() + key_len + value_len).into()) } - pub fn required_balance_for_init_transfer( - &self, - recipient: OmniAddress, - sender: OmniAddress, - ) -> NearToken { - let key_len = borsh::to_vec(&0_u128).sdk_expect("ERR_BORSH").len() as u64; + pub fn required_balance_for_init_transfer(&self) -> NearToken { + let key_len = borsh::to_vec(&TransferId::default()) + .sdk_expect("ERR_BORSH") + .len() as u64; let max_account_id: AccountId = "a".repeat(64).parse().sdk_expect("ERR_PARSE_ACCOUNT_ID"); let value_len = borsh::to_vec(&TransferMessageStorage::V0(TransferMessageStorageValue { message: TransferMessage { - origin_nonce: U128(0), - token: max_account_id.clone(), + origin_nonce: 0, + token: OmniAddress::Near(max_account_id.clone()), amount: U128(0), - recipient, + recipient: OmniAddress::Near(max_account_id.clone()), fee: Fee::default(), - sender, + sender: OmniAddress::Near(max_account_id.clone()), + msg: String::new(), + destination_nonce: 0, }, owner: max_account_id, })) @@ -157,7 +170,38 @@ impl Contract { .sdk_expect("ERR_BORSH") .len() as u64; - env::storage_byte_cost().saturating_mul((Self::get_basic_storage() + key_len).into()) + let storage_cost = + env::storage_byte_cost().saturating_mul((Self::get_basic_storage() + key_len).into()); + let ft_transfers_cost = NearToken::from_yoctonear(2); + + storage_cost.saturating_add(ft_transfers_cost) + } + + pub fn required_balance_for_bind_token(&self) -> NearToken { + let max_token_id: AccountId = "a".repeat(64).parse().sdk_expect("ERR_PARSE_ACCOUNT_ID"); + + let key_len = borsh::to_vec(&(ChainKind::Near, &max_token_id)) + .sdk_expect("ERR_BORSH") + .len() as u64; + + let value_len = borsh::to_vec(&OmniAddress::Near(max_token_id)) + .sdk_expect("ERR_BORSH") + .len() as u64; + + env::storage_byte_cost() + .saturating_mul((3 * (Self::get_basic_storage() + key_len + value_len)).into()) + } + + pub fn required_balance_for_deploy_token(&self) -> NearToken { + let key_len = Self::max_key_len_of_account_id(); + let deployed_tokens_required_balance = + env::storage_byte_cost().saturating_mul((Self::get_basic_storage() + key_len).into()); + let bind_token_required_balance = self.required_balance_for_bind_token(); + + bind_token_required_balance + .saturating_add(deployed_tokens_required_balance) + .saturating_add(BRIDGE_TOKEN_INIT_BALANCE) + .saturating_add(NEP141_DEPOSIT) } fn get_basic_storage() -> u64 { @@ -165,4 +209,9 @@ impl Contract { const EXTRA_KEY_PREFIX_LEN: u64 = 1; EXTRA_BYTES_RECORD + EXTRA_KEY_PREFIX_LEN } + + fn max_key_len_of_account_id() -> u64 { + let max_account_id: AccountId = "a".repeat(64).parse().sdk_expect("ERR_PARSE_ACCOUNT_ID"); + borsh::to_vec(&max_account_id).sdk_expect("ERR_BORSH").len() as u64 + } } diff --git a/near/omni-bridge/src/tests/lib_test.rs b/near/omni-bridge/src/tests/lib_test.rs new file mode 100644 index 00000000..3e3e8a01 --- /dev/null +++ b/near/omni-bridge/src/tests/lib_test.rs @@ -0,0 +1,744 @@ +use near_contract_standards::storage_management::StorageBalance; +use omni_types::locker_args::StorageDepositAction; + +use crate::storage::Decimals; +use crate::Contract; +use near_sdk::test_utils::VMContextBuilder; +use near_sdk::RuntimeFeesConfig; +use near_sdk::{test_vm_config, testing_env}; +use omni_types::prover_result::{InitTransferMessage, ProverResult}; +use omni_types::{EvmAddress, Nonce, TransferId}; +use std::str::FromStr; + +use near_contract_standards::fungible_token::receiver::FungibleTokenReceiver; +use near_sdk::borsh; +use near_sdk::json_types::U128; +use near_sdk::{serde_json, AccountId, NearToken, PromiseOrValue, PromiseResult}; +use omni_types::{ChainKind, Fee, InitTransferMsg, OmniAddress, TransferMessage, UpdateFee}; + +const DEFAULT_NONCE: Nonce = 0; +const DEFAULT_TRANSFER_ID: TransferId = TransferId { + origin_chain: ChainKind::Near, + origin_nonce: DEFAULT_NONCE, +}; +const DEFAULT_PROVER_ACCOUNT: &str = "prover.testnet"; +const DEFAULT_MPC_SIGNER_ACCOUNT: &str = "mpc_signer.testnet"; +const DEFAULT_WNEAR_ACCOUNT: &str = "wnear.testnet"; + +const DEFAULT_NEAR_USER_ACCOUNT: &str = "user.testnet"; +const DEFAULT_FT_CONTRACT_ACCOUNT: &str = "ft_contract.testnet"; +const DEFAULT_ETH_USER_ADDRESS: &str = "0x1234567890123456789012345678901234567890"; +const DEFAULT_TRANSFER_AMOUNT: u128 = 100; +const NEP141_DEPOSIT: NearToken = NearToken::from_yoctonear(1_250_000_000_000_000_000_000); + +fn setup_test_env( + predecessor_account_id: AccountId, + attached_deposit: NearToken, + promise_results: Option>, +) { + let context = VMContextBuilder::new() + .predecessor_account_id(predecessor_account_id) + .attached_deposit(attached_deposit) + .build(); + + if let Some(results) = promise_results { + testing_env!( + context, + test_vm_config(), + RuntimeFeesConfig::test(), + Default::default(), + results, + ); + } else { + testing_env!(context); + } +} + +fn setup_contract(prover_id: String, mpc_signer_id: String, wnear_id: String) -> Contract { + Contract::new( + AccountId::try_from(prover_id).expect("Invalid default prover ID"), + AccountId::try_from(mpc_signer_id).expect("Invalid default mpc signer ID"), + AccountId::try_from(wnear_id).expect("Invalid default wnear ID"), + ) +} + +fn get_default_contract() -> Contract { + setup_contract( + DEFAULT_PROVER_ACCOUNT.to_string(), + DEFAULT_MPC_SIGNER_ACCOUNT.to_string(), + DEFAULT_WNEAR_ACCOUNT.to_string(), + ) +} + +fn run_storage_deposit( + contract: &mut Contract, + account_id: AccountId, + storage_deposit_balance: NearToken, +) { + setup_test_env(account_id.clone(), storage_deposit_balance, None); + contract.storage_deposit(Some(account_id)); +} + +fn get_init_transfer_msg(recipient: String, fee: u128, native_token_fee: u128) -> InitTransferMsg { + InitTransferMsg { + recipient: OmniAddress::Eth(EvmAddress::from_str(&recipient).unwrap()), + fee: U128(fee), + native_token_fee: U128(native_token_fee), + } +} + +fn run_ft_on_transfer( + contract: &mut Contract, + sender_id: String, + token_id: String, + amount: U128, + attached_deposit: Option, + msg: InitTransferMsg, +) -> PromiseOrValue { + let sender_id = AccountId::try_from(sender_id).expect("Invalid sender ID"); + let token_id = AccountId::try_from(token_id).expect("Invalid token ID"); + + let attached_deposit = match attached_deposit { + Some(deposit) => deposit, + None => { + let min_storage_balance = contract.required_balance_for_account(); + let init_transfer_balance = contract.required_balance_for_init_transfer(); + min_storage_balance.saturating_add(init_transfer_balance) + } + }; + + run_storage_deposit(contract, sender_id.clone(), attached_deposit); + setup_test_env(token_id.clone(), NearToken::from_yoctonear(0), None); + + let msg = serde_json::to_string(&msg).expect("Failed to serialize transfer message"); + + contract.ft_on_transfer(sender_id, amount, msg) +} + +#[test] +fn test_initialize_contract() { + let contract = get_default_contract(); + + assert_eq!(contract.prover_account, DEFAULT_PROVER_ACCOUNT); + assert_eq!(contract.mpc_signer, DEFAULT_MPC_SIGNER_ACCOUNT); + assert_eq!(contract.current_origin_nonce, DEFAULT_NONCE); + assert_eq!(contract.wnear_account_id, DEFAULT_WNEAR_ACCOUNT); +} + +#[test] +fn test_ft_on_transfer_nonce_increment() { + let mut contract = get_default_contract(); + + run_ft_on_transfer( + &mut contract, + DEFAULT_NEAR_USER_ACCOUNT.to_string(), + DEFAULT_FT_CONTRACT_ACCOUNT.to_string(), + U128(100), + None, + get_init_transfer_msg(DEFAULT_ETH_USER_ADDRESS.to_string(), 0, 0), + ); + + assert_eq!(contract.current_origin_nonce, DEFAULT_NONCE + 1); +} + +#[test] +fn test_ft_on_transfer_stored_transfer_message() { + let mut contract = get_default_contract(); + + let msg = get_init_transfer_msg(DEFAULT_ETH_USER_ADDRESS.to_string(), 0, 0); + run_ft_on_transfer( + &mut contract, + DEFAULT_NEAR_USER_ACCOUNT.to_string(), + DEFAULT_FT_CONTRACT_ACCOUNT.to_string(), + U128(DEFAULT_TRANSFER_AMOUNT), + None, + msg.clone(), + ); + + let stored_transfer = contract.get_transfer_message(TransferId { + origin_chain: ChainKind::Near, + origin_nonce: contract.current_origin_nonce, + }); + assert_eq!( + stored_transfer.recipient, msg.recipient, + "Incorrect stored recipient" + ); + assert_eq!(stored_transfer.fee.fee, msg.fee, "Incorrect stored fee"); + assert_eq!( + stored_transfer.fee.native_fee, msg.native_token_fee, + "Incorrect stored native fee" + ); + assert_eq!( + stored_transfer.sender, + OmniAddress::Near(DEFAULT_NEAR_USER_ACCOUNT.parse().unwrap()), + "Incorrect stored sender" + ); + assert_eq!( + stored_transfer.token, + OmniAddress::Near(DEFAULT_FT_CONTRACT_ACCOUNT.parse().unwrap()), + "Incorrect stored token" + ); + assert_eq!( + stored_transfer.amount, + U128(DEFAULT_TRANSFER_AMOUNT), + "Incorrect stored amount" + ); +} + +#[test] +fn test_ft_on_transfer_promise_result() { + let mut contract = get_default_contract(); + + let promise = run_ft_on_transfer( + &mut contract, + DEFAULT_NEAR_USER_ACCOUNT.to_string(), + DEFAULT_FT_CONTRACT_ACCOUNT.to_string(), + U128(DEFAULT_TRANSFER_AMOUNT), + None, + get_init_transfer_msg(DEFAULT_ETH_USER_ADDRESS.to_string(), 0, 0), + ); + + let remaining = match promise { + PromiseOrValue::Value(remaining) => remaining, + PromiseOrValue::Promise(_) => panic!("Expected Value variant, got Promise"), + }; + assert_eq!(remaining, U128(0), "Expected remaining amount to be 0"); +} + +#[test] +#[should_panic(expected = "ERR_INVALID_FEE")] +fn test_ft_on_transfer_invalid_fee() { + let mut contract = get_default_contract(); + run_ft_on_transfer( + &mut contract, + DEFAULT_NEAR_USER_ACCOUNT.to_string(), + DEFAULT_FT_CONTRACT_ACCOUNT.to_string(), + U128(DEFAULT_TRANSFER_AMOUNT), + None, + get_init_transfer_msg( + DEFAULT_ETH_USER_ADDRESS.to_string(), + DEFAULT_TRANSFER_AMOUNT + 1, + 0, + ), + ); +} + +#[test] +fn test_ft_on_transfer_balance_updated() { + let mut contract = get_default_contract(); + + let min_storage_balance = contract.required_balance_for_account(); + let init_transfer_balance = contract.required_balance_for_init_transfer(); + let total_balance = min_storage_balance.saturating_add(init_transfer_balance); + + run_ft_on_transfer( + &mut contract, + DEFAULT_NEAR_USER_ACCOUNT.to_string(), + DEFAULT_FT_CONTRACT_ACCOUNT.to_string(), + U128(DEFAULT_TRANSFER_AMOUNT), + Some(total_balance), + get_init_transfer_msg(DEFAULT_ETH_USER_ADDRESS.to_string(), 0, 0), + ); + + let storage_balance = contract + .accounts_balances + .get(&AccountId::try_from(DEFAULT_NEAR_USER_ACCOUNT.to_string()).unwrap()) + .unwrap(); + assert!( + storage_balance.available < total_balance, + "Expected storage balance must be deducted" + ); +} + +fn run_update_transfer_fee( + contract: &mut Contract, + sender_id: String, + init_fee: Fee, + new_fee: UpdateFee, + attached_deposit: Option, +) { + use std::str::FromStr; + + let transfer_msg = TransferMessage { + origin_nonce: DEFAULT_NONCE, + token: OmniAddress::Near( + AccountId::try_from(DEFAULT_FT_CONTRACT_ACCOUNT.to_string()).unwrap(), + ), + amount: U128(DEFAULT_TRANSFER_AMOUNT), + recipient: OmniAddress::Eth(EvmAddress::from_str(DEFAULT_ETH_USER_ADDRESS).unwrap()), + fee: init_fee.clone(), + sender: OmniAddress::Near(sender_id.clone().parse().unwrap()), + msg: "".to_string(), + destination_nonce: 1, + }; + + contract.insert_raw_transfer( + transfer_msg.clone(), + AccountId::try_from(sender_id.clone()).unwrap(), + ); + + let attached_deposit = attached_deposit.unwrap_or_else(|| match &new_fee { + UpdateFee::Fee(new_fee) => { + NearToken::from_yoctonear(new_fee.native_fee.0.saturating_sub(init_fee.native_fee.0)) + } + _ => panic!("Not supported fee type"), + }); + + setup_test_env( + AccountId::try_from(sender_id).unwrap(), + attached_deposit, + None, + ); + contract.update_transfer_fee(transfer_msg.get_transfer_id(), new_fee); +} + +#[test] +fn test_update_transfer_fee_same_fee() { + let mut contract = get_default_contract(); + + let fee = Fee { + fee: U128(DEFAULT_TRANSFER_AMOUNT - 2), + native_fee: U128(10), + }; + + run_update_transfer_fee( + &mut contract, + DEFAULT_NEAR_USER_ACCOUNT.to_string(), + fee.clone(), + UpdateFee::Fee(fee.clone()), + Some(NearToken::from_yoctonear(0)), + ); + + let updated_transfer = contract.get_transfer_message(DEFAULT_TRANSFER_ID); + assert_eq!(updated_transfer.fee, fee); +} + +#[test] +fn test_update_transfer_fee_valid() { + let mut contract = get_default_contract(); + + let fee = Fee { + fee: U128(DEFAULT_TRANSFER_AMOUNT - 2), + native_fee: U128(10), + }; + + let new_fee = Fee { + fee: U128(DEFAULT_TRANSFER_AMOUNT - 1), + native_fee: U128(15), + }; + + run_update_transfer_fee( + &mut contract, + DEFAULT_NEAR_USER_ACCOUNT.to_string(), + fee.clone(), + UpdateFee::Fee(new_fee.clone()), + None, + ); + + let updated_transfer = contract.get_transfer_message(DEFAULT_TRANSFER_ID); + assert_eq!(updated_transfer.fee, new_fee); +} + +#[test] +#[should_panic(expected = "ERR_INVALID_FEE")] +fn test_update_transfer_fee_exceeds_amount() { + let mut contract = get_default_contract(); + + let init_fee = Fee { + fee: U128(DEFAULT_TRANSFER_AMOUNT - 2), + native_fee: U128(10), + }; + + let new_fee = Fee { + fee: U128(DEFAULT_TRANSFER_AMOUNT + 1), // Fee larger than amount + native_fee: U128(10), + }; + + run_update_transfer_fee( + &mut contract, + DEFAULT_NEAR_USER_ACCOUNT.to_string(), + init_fee, + UpdateFee::Fee(new_fee), + None, + ); +} + +#[test] +#[should_panic(expected = "ERR_LOWER_FEE")] +fn test_update_transfer_fee_lower_native_fee() { + let mut contract = get_default_contract(); + + let init_fee = Fee { + fee: U128(DEFAULT_TRANSFER_AMOUNT - 2), + native_fee: U128(10), + }; + + let new_fee = Fee { + fee: U128(DEFAULT_TRANSFER_AMOUNT - 1), + native_fee: U128(5), // Lower native fee + }; + + run_update_transfer_fee( + &mut contract, + DEFAULT_NEAR_USER_ACCOUNT.to_string(), + init_fee, + UpdateFee::Fee(new_fee), + None, + ); +} + +#[test] +#[should_panic(expected = "ERR_INVALID_ATTACHED_DEPOSIT")] +fn test_update_transfer_fee_invalid_deposit() { + let mut contract = get_default_contract(); + + let init_fee = Fee { + fee: U128(DEFAULT_TRANSFER_AMOUNT - 2), + native_fee: U128(10), + }; + + let new_fee = Fee { + fee: U128(DEFAULT_TRANSFER_AMOUNT - 1), + native_fee: U128(15), + }; + + // Attached deposit doesn't match native fee difference + run_update_transfer_fee( + &mut contract, + DEFAULT_NEAR_USER_ACCOUNT.to_string(), + init_fee, + UpdateFee::Fee(new_fee), + Some(NearToken::from_yoctonear(2)), // Wrong deposit amount + ); +} + +#[test] +#[should_panic(expected = "Only sender can update fee")] +fn test_update_transfer_fee_wrong_sender() { + let mut contract = get_default_contract(); + + let init_fee = Fee { + fee: U128(DEFAULT_TRANSFER_AMOUNT - 2), + native_fee: U128(10), + }; + + let new_fee = Fee { + fee: U128(DEFAULT_TRANSFER_AMOUNT - 1), + native_fee: U128(15), + }; + + run_update_transfer_fee( + &mut contract, + DEFAULT_NEAR_USER_ACCOUNT.to_string(), // Original sender + init_fee, + UpdateFee::Fee(new_fee.clone()), + None, + ); + + // Try to update with different sender + setup_test_env( + AccountId::try_from("different_user.testnet".to_string()).unwrap(), + NearToken::from_yoctonear(5), + None, + ); + contract.update_transfer_fee(DEFAULT_TRANSFER_ID, UpdateFee::Fee(new_fee)); +} + +fn get_default_storage_deposit_actions() -> Vec { + vec![StorageDepositAction { + token_id: AccountId::try_from(DEFAULT_FT_CONTRACT_ACCOUNT.to_string()).unwrap(), + account_id: AccountId::try_from(DEFAULT_NEAR_USER_ACCOUNT.to_string()).unwrap(), + storage_deposit_amount: Some(NEP141_DEPOSIT.as_yoctonear()), + }] +} + +fn get_prover_result(recipient: Option) -> ProverResult { + use std::str::FromStr; + let recipient = recipient.unwrap_or(OmniAddress::Near( + DEFAULT_NEAR_USER_ACCOUNT.parse().unwrap(), + )); + ProverResult::InitTransfer(InitTransferMessage { + origin_nonce: DEFAULT_NONCE, + token: OmniAddress::Near( + AccountId::try_from(DEFAULT_FT_CONTRACT_ACCOUNT.to_string()).unwrap(), + ), + amount: U128(DEFAULT_TRANSFER_AMOUNT), + recipient, + fee: Fee { + fee: U128(10), + native_fee: U128(5), + }, + sender: OmniAddress::Eth(EvmAddress::from_str(DEFAULT_ETH_USER_ADDRESS).unwrap()), + msg: "".to_string(), + emitter_address: OmniAddress::Eth(EvmAddress::from_str(DEFAULT_ETH_USER_ADDRESS).unwrap()), + }) +} + +#[test] +fn test_fin_transfer_callback_near_success() { + let mut contract = get_default_contract(); + contract.factories.insert( + &ChainKind::Eth, + &OmniAddress::Eth(EvmAddress::from_str(DEFAULT_ETH_USER_ADDRESS).unwrap()), + ); + + let native_token_address = OmniAddress::new_zero(ChainKind::Eth).unwrap(); + contract.token_address_to_id.insert( + &native_token_address, + &DEFAULT_FT_CONTRACT_ACCOUNT.parse().unwrap(), + ); + contract.token_decimals.insert( + &OmniAddress::Near(AccountId::try_from(DEFAULT_FT_CONTRACT_ACCOUNT.to_string()).unwrap()), + &Decimals { + decimals: 24, + origin_decimals: 24, + }, + ); + + let storage_actions = vec![ + StorageDepositAction { + token_id: AccountId::try_from(DEFAULT_FT_CONTRACT_ACCOUNT.to_string()).unwrap(), + account_id: AccountId::try_from(DEFAULT_NEAR_USER_ACCOUNT.to_string()).unwrap(), + storage_deposit_amount: Some(NEP141_DEPOSIT.as_yoctonear()), + }, + StorageDepositAction { + token_id: AccountId::try_from(DEFAULT_FT_CONTRACT_ACCOUNT.to_string()).unwrap(), + account_id: AccountId::try_from(DEFAULT_NEAR_USER_ACCOUNT.to_string()).unwrap(), + storage_deposit_amount: Some(NEP141_DEPOSIT.as_yoctonear()), + }, + StorageDepositAction { + token_id: AccountId::try_from(DEFAULT_FT_CONTRACT_ACCOUNT.to_string()).unwrap(), + account_id: AccountId::try_from(DEFAULT_NEAR_USER_ACCOUNT.to_string()).unwrap(), + storage_deposit_amount: Some(NEP141_DEPOSIT.as_yoctonear()), + }, + ]; + + let predecessor = AccountId::try_from(DEFAULT_NEAR_USER_ACCOUNT.to_string()).unwrap(); + + let prover_result = get_prover_result(Some(OmniAddress::Near( + DEFAULT_NEAR_USER_ACCOUNT.parse().unwrap(), + ))); + + setup_test_env( + predecessor.clone(), + NearToken::from_near(1), + Some(vec![ + PromiseResult::Successful(borsh::to_vec(&prover_result).unwrap()), + // Storage balance result for transfer recipient + PromiseResult::Successful( + serde_json::to_vec(&Some(StorageBalance { + total: NearToken::from_near(1), + available: NearToken::from_near(1), + })) + .unwrap(), + ), + // Storage balance result for fee recipient + PromiseResult::Successful( + serde_json::to_vec(&Some(StorageBalance { + total: NearToken::from_near(1), + available: NearToken::from_near(1), + })) + .unwrap(), + ), + // Storage balance result for native fee recipient + PromiseResult::Successful( + serde_json::to_vec(&Some(StorageBalance { + total: NearToken::from_near(1), + available: NearToken::from_near(1), + })) + .unwrap(), + ), + ]), + ); + + let result = contract.fin_transfer_callback(&storage_actions, predecessor.clone()); + + assert!(matches!(result, PromiseOrValue::Promise(_))); +} + +#[test] +fn test_fin_transfer_callback_non_near_success() { + use std::str::FromStr; + + let mut contract = get_default_contract(); + contract.factories.insert( + &ChainKind::Eth, + &OmniAddress::Eth(EvmAddress::from_str(DEFAULT_ETH_USER_ADDRESS).unwrap()), + ); + let storage_actions = get_default_storage_deposit_actions(); + let predecessor = AccountId::try_from(DEFAULT_NEAR_USER_ACCOUNT.to_string()).unwrap(); + + // Create prover result with ETH recipient + let eth_recipient = OmniAddress::Eth(EvmAddress::from_str(DEFAULT_ETH_USER_ADDRESS).unwrap()); + let prover_result = get_prover_result(Some(eth_recipient.clone())); + + contract.token_decimals.insert( + &OmniAddress::Near(AccountId::try_from(DEFAULT_FT_CONTRACT_ACCOUNT.to_string()).unwrap()), + &Decimals { + decimals: 24, + origin_decimals: 24, + }, + ); + + setup_test_env( + predecessor.clone(), + NearToken::from_near(1), + Some(vec![PromiseResult::Successful( + borsh::to_vec(&prover_result).unwrap(), + )]), + ); + + let result = contract.fin_transfer_callback(&storage_actions, predecessor.clone()); + + // For non-NEAR recipients, should return u64 value of current_destination_nonce + match result { + PromiseOrValue::Value(nonce) => { + assert_eq!( + nonce, + contract.get_current_destination_nonce(ChainKind::Eth) + ); + + // Verify transfer was stored correctly + let stored_transfer = contract.get_transfer_message(TransferId { + origin_chain: ChainKind::Eth, + origin_nonce: DEFAULT_NONCE, + }); + assert_eq!(stored_transfer.recipient, eth_recipient); + } + PromiseOrValue::Promise(_) => panic!("Expected Value variant, got Promise"), + } +} + +#[test] +#[should_panic(expected = "Invalid proof message")] +fn test_fin_transfer_callback_invalid_proof() { + let mut contract = get_default_contract(); + let storage_actions = get_default_storage_deposit_actions(); + let predecessor = AccountId::try_from(DEFAULT_NEAR_USER_ACCOUNT.to_string()).unwrap(); + + testing_env!( + VMContextBuilder::new() + .predecessor_account_id(predecessor.clone()) + .attached_deposit(NearToken::from_near(1)) + .build(), + test_vm_config(), + RuntimeFeesConfig::test(), + Default::default(), + vec![PromiseResult::Failed], + ); + + contract.fin_transfer_callback(&storage_actions, predecessor); +} + +#[test] +#[should_panic(expected = "Unknown factory")] +fn test_fin_transfer_callback_unknown_factory() { + let mut contract = get_default_contract(); + let storage_actions = get_default_storage_deposit_actions(); + let predecessor = AccountId::try_from(DEFAULT_NEAR_USER_ACCOUNT.to_string()).unwrap(); + + // Don't add factory to make it fail + + testing_env!( + VMContextBuilder::new() + .predecessor_account_id(predecessor.clone()) + .attached_deposit(NearToken::from_near(1)) + .build(), + test_vm_config(), + RuntimeFeesConfig::test(), + Default::default(), + vec![PromiseResult::Successful( + borsh::to_vec(&get_prover_result(None)).unwrap() + )], + ); + + contract.fin_transfer_callback(&storage_actions, predecessor); +} + +#[test] +fn test_is_transfer_finalised() { + let mut contract = get_default_contract(); + let chain = ChainKind::Eth; + let nonce = 1; + let transfer_id = TransferId { + origin_chain: chain, + origin_nonce: nonce, + }; + + assert!(!contract.is_transfer_finalised(transfer_id)); + + contract.finalised_transfers.insert(&transfer_id); + assert!(contract.is_transfer_finalised(transfer_id)); +} + +#[test] +fn test_normalize_amount() { + assert_eq!( + Contract::normalize_amount( + u128::MAX, + Decimals { + decimals: 18, + origin_decimals: 18 + } + ), + u128::MAX + ); + + assert_eq!( + Contract::normalize_amount( + u128::MAX, + Decimals { + decimals: 18, + origin_decimals: 24 + } + ), + u128::MAX / 1_000_000 + ); + + assert_eq!( + Contract::normalize_amount( + u128::MAX, + Decimals { + decimals: 9, + origin_decimals: 24 + } + ), + u128::MAX / 1_000_000_000_000_000 + ); +} + +#[test] +fn test_denormalize_amount() { + assert_eq!( + Contract::denormalize_amount( + u128::MAX, + Decimals { + decimals: 18, + origin_decimals: 18 + } + ), + u128::MAX + ); + + assert_eq!( + Contract::denormalize_amount( + u64::MAX.into(), + Decimals { + decimals: 18, + origin_decimals: 24 + } + ), + u64::MAX as u128 * 1_000_000_u128 + ); + + assert_eq!( + Contract::denormalize_amount( + u64::MAX.into(), + Decimals { + decimals: 9, + origin_decimals: 24 + } + ), + u64::MAX as u128 * 1_000_000_000_000_000_u128 + ); +} diff --git a/near/omni-bridge/src/tests/mod.rs b/near/omni-bridge/src/tests/mod.rs new file mode 100644 index 00000000..a22a1ae4 --- /dev/null +++ b/near/omni-bridge/src/tests/mod.rs @@ -0,0 +1 @@ +pub mod lib_test; diff --git a/near/omni-prover/evm-prover/.catalog-info.yaml b/near/omni-prover/evm-prover/.catalog-info.yaml new file mode 100644 index 00000000..3b4e07b1 --- /dev/null +++ b/near/omni-prover/evm-prover/.catalog-info.yaml @@ -0,0 +1,21 @@ +--- +apiVersion: backstage.io/v1alpha1 +kind: Component +metadata: + name: evm-prover + title: "EVM Prover" + description: |- + Takes proof of a Receipt from an EVM blockchain and checks if it's valid and included on-chain. + tags: + - contract + - near + links: [] + annotations: + aurora.dev/security-tier: "1" +spec: + owner: nearone-team + type: contract + lifecycle: production + system: omnibridge-protocol + deployedAt: [] + interactsWith: [] diff --git a/near/omni-prover/evm-prover/build.sh b/near/omni-prover/evm-prover/build.sh deleted file mode 100755 index 6e1d70c1..00000000 --- a/near/omni-prover/evm-prover/build.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/env bash - -# Exit script as soon as a command fails. -set -e - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" - -if [[ -z "$BUILDKITE" ]] && [[ "$(uname -s)" != "Darwin" ]]; -then - userflag="-u $UID:$UID" -else - userflag="" -fi - -arch=`uname -m` -if [ "$arch" == "arm64" ] -then - tag=":latest-arm64" -else - tag="" -fi - -docker run \ - --rm \ - --mount type=bind,source=$DIR/../..,target=/host \ - --cap-add=SYS_PTRACE --security-opt seccomp=unconfined $userflag \ - -w /host/omni-prover/rainbow-omni-prover-proxy \ - -e RUSTFLAGS='-C link-arg=-s' \ - nearprotocol/contract-builder$tag \ - /bin/bash -c "rustup target add wasm32-unknown-unknown; cargo build --target wasm32-unknown-unknown --release" - -cp $DIR/../../target/wasm32-unknown-unknown/release/rainbow_omni_prover_proxy.wasm $DIR/../../res/ diff --git a/near/omni-prover/evm-prover/src/lib.rs b/near/omni-prover/evm-prover/src/lib.rs index 9087a882..40b49629 100644 --- a/near/omni-prover/evm-prover/src/lib.rs +++ b/near/omni-prover/evm-prover/src/lib.rs @@ -1,11 +1,11 @@ use near_sdk::borsh::{self, BorshDeserialize, BorshSerialize}; -use near_sdk::{env, ext_contract, near_bindgen, AccountId, Gas, PanicOnDefault, Promise}; +use near_sdk::{env, ext_contract, near_bindgen, require, AccountId, Gas, PanicOnDefault, Promise}; use omni_types::evm::events::parse_evm_event; use omni_types::evm::header::BlockHeader; use omni_types::evm::receipt::{LogEntry, Receipt}; -use omni_types::evm::utils::keccak256; use omni_types::prover_args::EvmVerifyProofArgs; use omni_types::prover_result::{ProofKind, ProverResult}; +use omni_types::utils::keccak256; use omni_types::ChainKind; use rlp::Rlp; @@ -42,6 +42,15 @@ impl EvmProver { } } + /// # Panics + /// + /// This function will panic in the following situations: + /// - If the log entry at the specified index doesn't match the decoded log entry. + /// + /// # Errors + /// + /// This function will return an error if the proof is invalid. + #[allow(clippy::needless_pass_by_value)] #[handle_result] pub fn verify_proof(&self, #[serializer(borsh)] input: Vec) -> Result { let args = EvmVerifyProofArgs::try_from_slice(&input).map_err(|_| "ERR_PARSE_ARGS")?; @@ -54,7 +63,7 @@ impl EvmProver { // Verify log_entry included in receipt let log_index_usize = usize::try_from(evm_proof.log_index).map_err(|e| e.to_string())?; - assert_eq!(receipt.logs[log_index_usize], log_entry); + require!(receipt.logs[log_index_usize] == log_entry); // Verify receipt included into header let data = Self::verify_trie_proof( @@ -82,8 +91,13 @@ impl EvmProver { )) } + /// # Errors + /// + /// This function will return an error if the block hash is not valid. + #[allow(clippy::needless_pass_by_value)] #[private] #[handle_result] + #[result_serializer(borsh)] pub fn verify_proof_callback( &mut self, #[serializer(borsh)] kind: ProofKind, @@ -110,6 +124,10 @@ impl EvmProver { self.chain_kind, log_entry_data, )?)), + ProofKind::LogMetadata => Ok(ProverResult::LogMetadata(parse_evm_event( + self.chain_kind, + log_entry_data, + )?)), } } @@ -136,6 +154,7 @@ impl EvmProver { Self::_verify_trie_proof(expected_root.to_vec(), &actual_key, proof, 0, 0) } + #[allow(clippy::needless_pass_by_value)] fn _verify_trie_proof( expected_root: Vec, key: &Vec, @@ -147,24 +166,28 @@ impl EvmProver { if key_index == 0 { // trie root is always a hash - assert_eq!(keccak256(node), expected_root.as_slice()); + require!(keccak256(node) == expected_root.as_slice()); } else if node.len() < 32 { // if rlp < 32 bytes, then it is not hashed - assert_eq!(node.as_slice(), expected_root); + require!(node.as_slice() == expected_root); } else { - assert_eq!(keccak256(node), expected_root.as_slice()); + require!(keccak256(node) == expected_root.as_slice()); } - let node = Rlp::new(&node.as_slice()); + let node = Rlp::new(node.as_slice()); if node.iter().count() == 17 { // Branch node if key_index >= key.len() { - assert_eq!(proof_index + 1, proof.len()); + require!(proof_index + 1 == proof.len()); get_vec(&node, 16) } else { + #[allow(clippy::as_conversions)] let new_expected_root = get_vec(&node, key[key_index] as usize); - if !new_expected_root.is_empty() { + if new_expected_root.is_empty() { + // not included in proof + vec![] + } else { Self::_verify_trie_proof( new_expected_root, key, @@ -172,19 +195,16 @@ impl EvmProver { key_index + 1, proof_index + 1, ) - } else { - // not included in proof - vec![] } } } else { // Leaf or extension node - assert_eq!(node.iter().count(), 2); + require!(node.iter().count() == 2); let path_u8 = get_vec(&node, 0); // Extract first nibble let head = path_u8[0] / 16; - // assert!(0 <= head); is implicit because of type limits - assert!(head <= 3); + // require!(0 <= head); is implicit because of type limits + require!(head <= 3); // Extract path let mut path = vec![]; @@ -198,8 +218,8 @@ impl EvmProver { if head >= 2 { // Leaf node - assert_eq!(proof_index + 1, proof.len()); - assert_eq!(key_index + path.len(), key.len()); + require!(proof_index + 1 == proof.len()); + require!(key_index + path.len() == key.len()); if path.as_slice() == &key[key_index..key_index + path.len()] { get_vec(&node, 1) } else { @@ -207,7 +227,7 @@ impl EvmProver { } } else { // Extension node - assert_eq!(path.as_slice(), &key[key_index..key_index + path.len()]); + require!(path.as_slice() == &key[key_index..key_index + path.len()]); let new_expected_root = get_vec(&node, 1); Self::_verify_trie_proof( new_expected_root, diff --git a/near/omni-prover/omni-prover/.catalog-info.yaml b/near/omni-prover/omni-prover/.catalog-info.yaml new file mode 100644 index 00000000..7c3952ab --- /dev/null +++ b/near/omni-prover/omni-prover/.catalog-info.yaml @@ -0,0 +1,21 @@ +--- +apiVersion: backstage.io/v1alpha1 +kind: Component +metadata: + name: omni-prover + title: "Omni Prover" + description: |- + Aggregator or proxy for others provers, redirects calls to evm or wormhole prover + tags: + - contract + - near + links: [] + annotations: + aurora.dev/security-tier: "1" +spec: + owner: nearone-team + type: contract + lifecycle: production + system: omnibridge-protocol + deployedAt: [] + interactsWith: [] diff --git a/near/omni-prover/omni-prover/build.sh b/near/omni-prover/omni-prover/build.sh deleted file mode 100755 index 5aff7f3a..00000000 --- a/near/omni-prover/omni-prover/build.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/env bash - -# Exit script as soon as a command fails. -set -e - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" - -if [[ -z "$BUILDKITE" ]] && [[ "$(uname -s)" != "Darwin" ]]; -then - userflag="-u $UID:$UID" -else - userflag="" -fi - -arch=`uname -m` -if [ "$arch" == "arm64" ] -then - tag=":latest-arm64" -else - tag="" -fi - -docker run \ - --rm \ - --mount type=bind,source=$DIR/../..,target=/host \ - --cap-add=SYS_PTRACE --security-opt seccomp=unconfined $userflag \ - -w /host/omni-prover/omni-prover \ - -e RUSTFLAGS='-C link-arg=-s' \ - nearprotocol/contract-builder$tag \ - /bin/bash -c "rustup target add wasm32-unknown-unknown; cargo build --target wasm32-unknown-unknown --release" - -cp $DIR/../../target/wasm32-unknown-unknown/release/omni_prover.wasm $DIR/../../res/ diff --git a/near/omni-prover/omni-prover/src/lib.rs b/near/omni-prover/omni-prover/src/lib.rs index 283d83c9..5a664616 100644 --- a/near/omni-prover/omni-prover/src/lib.rs +++ b/near/omni-prover/omni-prover/src/lib.rs @@ -72,6 +72,7 @@ impl OmniProver { self.provers.remove(&prover_id); } + #[must_use] pub fn get_provers(&self) -> Vec<(ProverId, AccountId)> { self.provers.iter().collect::>() } diff --git a/near/omni-prover/wormhole-omni-prover-proxy/.catalog-info.yaml b/near/omni-prover/wormhole-omni-prover-proxy/.catalog-info.yaml new file mode 100644 index 00000000..dd69e7a7 --- /dev/null +++ b/near/omni-prover/wormhole-omni-prover-proxy/.catalog-info.yaml @@ -0,0 +1,21 @@ +--- +apiVersion: backstage.io/v1alpha1 +kind: Component +metadata: + name: wormhole-omni-prover-proxy + title: "Wormhole Omni Prover Proxy" + description: |- + Takes proof of a Receipt from Wormhole and checks if it's valid and included on-chain. + tags: + - contract + - near + links: [] + annotations: + aurora.dev/security-tier: "1" +spec: + owner: nearone-team + type: contract + lifecycle: production + system: omnibridge-protocol + deployedAt: [] + interactsWith: [] diff --git a/near/omni-prover/wormhole-omni-prover-proxy/build.sh b/near/omni-prover/wormhole-omni-prover-proxy/build.sh deleted file mode 100755 index 6c398bdf..00000000 --- a/near/omni-prover/wormhole-omni-prover-proxy/build.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/env bash - -# Exit script as soon as a command fails. -set -e - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" - -if [[ -z "$BUILDKITE" ]] && [[ "$(uname -s)" != "Darwin" ]]; -then - userflag="-u $UID:$UID" -else - userflag="" -fi - -arch=`uname -m` -if [ "$arch" == "arm64" ] -then - tag=":latest-arm64" -else - tag="" -fi - -docker run \ - --rm \ - --mount type=bind,source=$DIR/../..,target=/host \ - --cap-add=SYS_PTRACE --security-opt seccomp=unconfined $userflag \ - -w /host/omni-prover/wormhole-omni-prover-proxy \ - -e RUSTFLAGS='-C link-arg=-s' \ - nearprotocol/contract-builder$tag \ - /bin/bash -c "rustup target add wasm32-unknown-unknown; cargo build --target wasm32-unknown-unknown --release" - -cp $DIR/../../target/wasm32-unknown-unknown/release/wormhole_omni_prover_proxy.wasm $DIR/../../res/ diff --git a/near/omni-prover/wormhole-omni-prover-proxy/src/lib.rs b/near/omni-prover/wormhole-omni-prover-proxy/src/lib.rs index 3e9647ae..3b413398 100644 --- a/near/omni-prover/wormhole-omni-prover-proxy/src/lib.rs +++ b/near/omni-prover/wormhole-omni-prover-proxy/src/lib.rs @@ -8,12 +8,12 @@ use omni_types::prover_result::{ProofKind, ProverResult}; mod byte_utils; mod parsed_vaa; -/// Gas to call verify_log_entry on prover. -pub const VERIFY_LOG_ENTRY_GAS: Gas = Gas::from_tgas(50); +pub const VERIFY_VAA_GAS: Gas = Gas::from_tgas(10); +pub const VERIFY_VAA_CALLBACK_GAS: Gas = Gas::from_tgas(10); #[ext_contract(ext_prover)] pub trait Prover { - fn verify_vaa(&self, vaa: &String) -> u32; + fn verify_vaa(&self, vaa: &str) -> u32; } #[near_bindgen] @@ -31,29 +31,37 @@ impl WormholeOmniProverProxy { Self { prover_account } } + #[allow(clippy::needless_pass_by_value)] pub fn verify_proof(&self, #[serializer(borsh)] input: Vec) -> Promise { let args = WormholeVerifyProofArgs::try_from_slice(&input) .unwrap_or_else(|_| env::panic_str("ErrorOnArgsParsing")); - env::log_str(&format!("{}", args.vaa)); + env::log_str(&args.vaa); ext_prover::ext(self.prover_account.clone()) - .with_static_gas(VERIFY_LOG_ENTRY_GAS) + .with_static_gas(VERIFY_VAA_GAS) .verify_vaa(&args.vaa) .then( Self::ext(env::current_account_id()) - .with_static_gas(VERIFY_LOG_ENTRY_GAS) + .with_static_gas(VERIFY_VAA_CALLBACK_GAS) .verify_vaa_callback(args.proof_kind, args.vaa), ) } + /// # Panics + /// + /// This function will panic in the following situations: + /// - If the `vaa` string cannot be decoded as a valid hexadecimal string. + /// - If the `ParsedVAA::parse` function fails to parse the decoded VAA data. + /// - If the `proof_kind` doesn't match the first byte of the VAA payload. #[private] #[handle_result] + #[result_serializer(borsh)] pub fn verify_vaa_callback( &mut self, proof_kind: ProofKind, vaa: String, - #[callback_result] gov_idx: Result, + #[callback_result] gov_idx: &Result, ) -> Result { if gov_idx.is_err() { return Err("Proof is not valid!".to_owned()); @@ -71,6 +79,7 @@ impl WormholeOmniProverProxy { ProofKind::InitTransfer => Ok(ProverResult::InitTransfer(parsed_vaa.try_into()?)), ProofKind::FinTransfer => Ok(ProverResult::FinTransfer(parsed_vaa.try_into()?)), ProofKind::DeployToken => Ok(ProverResult::DeployToken(parsed_vaa.try_into()?)), + ProofKind::LogMetadata => Ok(ProverResult::LogMetadata(parsed_vaa.try_into()?)), } } } diff --git a/near/omni-prover/wormhole-omni-prover-proxy/src/parsed_vaa.rs b/near/omni-prover/wormhole-omni-prover-proxy/src/parsed_vaa.rs index 75b8159e..01f524a3 100644 --- a/near/omni-prover/wormhole-omni-prover-proxy/src/parsed_vaa.rs +++ b/near/omni-prover/wormhole-omni-prover-proxy/src/parsed_vaa.rs @@ -2,16 +2,19 @@ use { crate::byte_utils::ByteUtils, - alloy_sol_types::{sol, SolType}, - near_sdk::{bs58, env}, + borsh::BorshDeserialize, + near_sdk::env, omni_types::{ - prover_result::{DeployTokenMessage, FinTransferMessage, InitTransferMessage}, - stringify, EvmAddress, Fee, OmniAddress, TransferMessage, H160, + prover_result::{ + DeployTokenMessage, FinTransferMessage, InitTransferMessage, LogMetadataMessage, + ProofKind, + }, + stringify, Fee, Nonce, OmniAddress, TransferId, }, }; // Validator Action Approval(VAA) data - +#[allow(dead_code)] pub struct ParsedVAA { pub version: u8, pub guardian_set_index: u32, @@ -69,7 +72,7 @@ impl ParsedVAA { // Load 4 bytes starting from index 1 let guardian_set_index: u32 = data.get_u32(Self::GUARDIAN_SET_INDEX_POS); let len_signers = data.get_u8(Self::LEN_SIGNER_POS) as usize; - let body_offset: usize = Self::HEADER_LEN + Self::SIGNATURE_LEN * len_signers as usize; + let body_offset: usize = Self::HEADER_LEN + Self::SIGNATURE_LEN * len_signers; // Hash the body if body_offset >= data.len() { @@ -99,7 +102,7 @@ impl ParsedVAA { guardian_set_index, timestamp, nonce, - len_signers: len_signers as usize, + len_signers, emitter_chain, emitter_address, sequence, @@ -110,50 +113,71 @@ impl ParsedVAA { } } -sol! { - struct InitTransferWh { - uint128 nonce; - string token; - uint128 amount; - uint128 fee; - uint128 nativeFee; - string recipient; - address sender; - } +#[derive(Debug, BorshDeserialize)] +struct DeployTokenWh { + payload_type: ProofKind, + token: String, + token_address: OmniAddress, + decimals: u8, + origin_decimals: u8, +} - struct FinTransferWh { - string token; - uint128 amount; - string recipient; - uint128 nonce; - } +#[derive(Debug, BorshDeserialize)] +struct LogMetadataWh { + payload_type: ProofKind, + token_address: OmniAddress, + name: String, + symbol: String, + decimals: u8, +} - struct DeployTokenWh { - string token; - address tokenAddress; - } +#[derive(Debug, BorshDeserialize)] +struct FinTransferWh { + payload_type: ProofKind, + transfer_id: TransferId, + token_address: OmniAddress, + amount: u128, + fee_recipient: String, +} + +#[derive(Debug, BorshDeserialize)] +struct InitTransferWh { + payload_type: ProofKind, + sender: OmniAddress, + token_address: OmniAddress, + origin_nonce: Nonce, + amount: u128, + fee: u128, + native_fee: u128, + recipient: String, + message: String, } impl TryInto for ParsedVAA { type Error = String; fn try_into(self) -> Result { - let data: &[u8] = &self.payload[1..]; - let transfer = InitTransferWh::abi_decode(data, true).map_err(stringify)?; + let transfer: InitTransferWh = borsh::from_slice(&self.payload).map_err(stringify)?; + + if transfer.payload_type != ProofKind::InitTransfer { + return Err("Invalid proof kind".to_owned()); + } Ok(InitTransferMessage { - transfer: TransferMessage { - token: transfer.token.parse().map_err(stringify)?, - amount: transfer.amount.into(), - fee: Fee { - fee: transfer.fee.into(), - native_fee: transfer.nativeFee.into(), - }, - recipient: transfer.recipient.parse().map_err(stringify)?, - origin_nonce: transfer.nonce.into(), - sender: to_omni_address(self.emitter_chain, &transfer.sender.0 .0), + token: transfer.token_address.clone(), + amount: transfer.amount.into(), + fee: Fee { + fee: transfer.fee.into(), + native_fee: transfer.native_fee.into(), }, - emitter_address: to_omni_address(self.emitter_chain, &self.emitter_address), + recipient: transfer.recipient.parse().map_err(stringify)?, + origin_nonce: transfer.origin_nonce, + sender: transfer.sender, + msg: transfer.message, + emitter_address: OmniAddress::new_from_slice( + transfer.token_address.get_chain(), + &self.emitter_address, + )?, }) } } @@ -162,14 +186,20 @@ impl TryInto for ParsedVAA { type Error = String; fn try_into(self) -> Result { - let data: &[u8] = &self.payload[1..]; - let transfer = FinTransferWh::abi_decode(data, true).map_err(stringify)?; + let transfer: FinTransferWh = borsh::from_slice(&self.payload).map_err(stringify)?; + + if transfer.payload_type != ProofKind::FinTransfer { + return Err("Invalid proof kind".to_owned()); + } Ok(FinTransferMessage { - nonce: transfer.nonce.into(), - fee_recipient: transfer.recipient.parse().map_err(stringify)?, + transfer_id: transfer.transfer_id, + fee_recipient: transfer.fee_recipient.parse().map_err(stringify)?, amount: transfer.amount.into(), - emitter_address: to_omni_address(self.emitter_chain, &self.emitter_address), + emitter_address: OmniAddress::new_from_slice( + transfer.token_address.get_chain(), + &self.emitter_address, + )?, }) } } @@ -178,30 +208,42 @@ impl TryInto for ParsedVAA { type Error = String; fn try_into(self) -> Result { - let data: &[u8] = &self.payload[1..]; - let transfer = DeployTokenWh::abi_decode(data, true).map_err(stringify)?; + let parsed_payload: DeployTokenWh = borsh::from_slice(&self.payload).map_err(stringify)?; + + if parsed_payload.payload_type != ProofKind::DeployToken { + return Err("Invalid proof kind".to_owned()); + } Ok(DeployTokenMessage { - token: transfer.token.parse().map_err(stringify)?, - token_address: to_omni_address(self.emitter_chain, &transfer.tokenAddress.0 .0), - emitter_address: to_omni_address(self.emitter_chain, &self.emitter_address), + token: parsed_payload.token.parse().map_err(stringify)?, + token_address: parsed_payload.token_address.clone(), + decimals: parsed_payload.decimals, + origin_decimals: parsed_payload.origin_decimals, + emitter_address: OmniAddress::new_from_slice( + parsed_payload.token_address.get_chain(), + &self.emitter_address, + )?, }) } } -fn to_omni_address(emitter_chain: u16, address: &[u8]) -> OmniAddress { - match emitter_chain { - 1 => OmniAddress::Sol(bs58::encode(address).into_string()), - 2 => OmniAddress::Eth(to_evm_address(address)), - 23 => OmniAddress::Arb(to_evm_address(address)), - 30 => OmniAddress::Base(to_evm_address(address)), - _ => env::panic_str("Chain not supported"), - } -} +impl TryInto for ParsedVAA { + type Error = String; + + fn try_into(self) -> Result { + let parsed_payload: LogMetadataWh = borsh::from_slice(&self.payload).map_err(stringify)?; -fn to_evm_address(address: &[u8]) -> EvmAddress { - match address.try_into() { - Ok(bytes) => H160(bytes), - Err(_) => env::panic_str("Invalid EVM address"), + if parsed_payload.payload_type != ProofKind::LogMetadata { + return Err("Invalid proof kind".to_owned()); + } + + let chain_kind = parsed_payload.token_address.get_chain(); + Ok(LogMetadataMessage { + token_address: parsed_payload.token_address, + name: parsed_payload.name, + symbol: parsed_payload.symbol, + decimals: parsed_payload.decimals, + emitter_address: OmniAddress::new_from_slice(chain_kind, &self.emitter_address)?, + }) } } diff --git a/near/omni-tests/Cargo.toml b/near/omni-tests/Cargo.toml index d8c14a5f..cbbbb642 100644 --- a/near/omni-tests/Cargo.toml +++ b/near/omni-tests/Cargo.toml @@ -13,4 +13,5 @@ near-sdk.workspace = true near-workspaces.workspace = true tokio.workspace = true anyhow.workspace = true -omni-types.workspace = true \ No newline at end of file +omni-types.workspace = true +rstest.workspace = true \ No newline at end of file diff --git a/near/omni-tests/src/fin_transfer.rs b/near/omni-tests/src/fin_transfer.rs new file mode 100644 index 00000000..f3bb8bcd --- /dev/null +++ b/near/omni-tests/src/fin_transfer.rs @@ -0,0 +1,257 @@ +#[cfg(test)] +mod tests { + use crate::helpers::tests::{ + account_n, eth_eoa_address, eth_factory_address, eth_token_address, relayer_account_id, + LOCKER_PATH, MOCK_PROVER_PATH, MOCK_TOKEN_PATH, NEP141_DEPOSIT, + }; + use near_sdk::{borsh, json_types::U128, serde_json::json, AccountId}; + use near_workspaces::types::NearToken; + use omni_types::{ + locker_args::{BindTokenArgs, FinTransferArgs, StorageDepositAction}, + prover_result::{DeployTokenMessage, InitTransferMessage, ProverResult}, + Fee, OmniAddress, + }; + use rstest::rstest; + + #[rstest] + #[case(vec![(account_n(1), true), (relayer_account_id(), true)], 1000, 1, None)] + #[case(vec![(account_n(1), true)], 1000, 0, None)] + #[case( + vec![ + (account_n(1), true), + (relayer_account_id(), true), + (account_n(2), true), + (account_n(2), true), + ], + 1000, + 1, + Some("Invalid len of accounts for storage deposit") + )] + #[case( + vec![(relayer_account_id(), true), (account_n(1), true)], + 1000, + 1, + Some("STORAGE_ERR: The transfer recipient is omitted") + )] + #[case( + vec![(account_n(1), true)], + 1000, + 1, + Some("STORAGE_ERR: The fee recipient is omitted") + )] + #[case(vec![], 1000, 1, Some("STORAGE_ERR: The transfer recipient is omitted"))] + #[case( + vec![(account_n(1), false), (relayer_account_id(), false)], + 1000, + 1, + Some("STORAGE_ERR: The transfer recipient is omitted") + )] + #[case( + vec![(account_n(1), true), (relayer_account_id(), false)], + 1000, + 1, + Some("STORAGE_ERR: The fee recipient is omitted") + )] + #[case( + vec![(account_n(1), false), (relayer_account_id(), true)], + 1000, + 1, + Some("STORAGE_ERR: The transfer recipient is omitted") + )] + #[tokio::test] + async fn test_storage_deposit_on_fin_transfer( + #[case] storage_deposit_accounts: Vec<(AccountId, bool)>, + #[case] amount: u128, + #[case] fee: u128, + #[case] expected_error: Option<&str>, + ) { + let result = test_fin_transfer(storage_deposit_accounts, amount, fee).await; + + match result { + Ok(_) => assert!( + expected_error.is_none(), + "Expected an error but got success" + ), + Err(result_error) => { + let error = expected_error.expect(&format!( + "Got an error {result_error} when none was expected" + )); + assert!( + result_error.to_string().contains(error), + "Wrong error. Got: {}, Expected: {}", + result_error, + error + ); + } + } + } + + async fn test_fin_transfer( + storage_deposit_accounts: Vec<(AccountId, bool)>, + amount: u128, + fee: u128, + ) -> anyhow::Result<()> { + let worker = near_workspaces::sandbox().await?; + // Deploy and init FT token + let token_contract = worker.dev_deploy(&std::fs::read(MOCK_TOKEN_PATH)?).await?; + token_contract + .call("new_default_meta") + .args_json(json!({ + "owner_id": token_contract.id(), + "total_supply": U128(u128::MAX) + })) + .max_gas() + .transact() + .await? + .into_result()?; + + let prover_contract = worker.dev_deploy(&std::fs::read(MOCK_PROVER_PATH)?).await?; + // Deploy and init locker + let locker_contract = worker.dev_deploy(&std::fs::read(LOCKER_PATH)?).await?; + locker_contract + .call("new") + .args_json(json!({ + "prover_account": prover_contract.id(), + "mpc_signer": "mpc.testnet", + "nonce": U128(0), + "wnear_account_id": "wnear.testnet", + })) + .max_gas() + .transact() + .await? + .into_result()?; + + // Get required balances + let required_balance_for_fin_transfer: NearToken = locker_contract + .view("required_balance_for_fin_transfer") + .await? + .json()?; + + // Create relayer account + let relayer_account = worker + .create_tla(relayer_account_id(), worker.dev_generate().await.1) + .await? + .unwrap(); + + // Storage deposit and transfer tokens + token_contract + .call("storage_deposit") + .args_json(json!({ + "account_id": locker_contract.id(), + "registration_only": true, + })) + .deposit(NEP141_DEPOSIT) + .max_gas() + .transact() + .await? + .into_result()?; + + token_contract + .call("ft_transfer") + .args_json(json!({ + "receiver_id": locker_contract.id(), + "amount": U128(amount), + })) + .deposit(NearToken::from_yoctonear(1)) + .max_gas() + .transact() + .await? + .into_result()?; + + locker_contract + .call("add_factory") + .args_json(json!({ + "address": eth_factory_address(), + })) + .max_gas() + .transact() + .await? + .into_result()?; + + // Bind token + let required_balance_for_bind_token: NearToken = locker_contract + .view("required_balance_for_bind_token") + .await? + .json()?; + + relayer_account + .call(locker_contract.id(), "bind_token") + .args_borsh(BindTokenArgs { + chain_kind: omni_types::ChainKind::Eth, + prover_args: borsh::to_vec(&ProverResult::DeployToken(DeployTokenMessage { + token: token_contract.id().clone(), + token_address: eth_token_address(), + decimals: 24, + origin_decimals: 24, + emitter_address: eth_factory_address(), + })) + .unwrap(), + }) + .deposit(required_balance_for_bind_token) + .max_gas() + .transact() + .await? + .into_result()?; + + let required_deposit_for_fin_transfer = NEP141_DEPOSIT + .saturating_mul(storage_deposit_accounts.len() as u128) + .saturating_add(required_balance_for_fin_transfer); + + let storage_deposit_actions = storage_deposit_accounts + .iter() + .map(|(account_id, is_deposit_needed)| StorageDepositAction { + token_id: token_contract.id().clone(), + account_id: account_id.clone(), + storage_deposit_amount: is_deposit_needed.then(|| NEP141_DEPOSIT.as_yoctonear()), + }) + .collect(); + + // Fin transfer + relayer_account + .call(locker_contract.id(), "fin_transfer") + .args_borsh(FinTransferArgs { + chain_kind: omni_types::ChainKind::Eth, + storage_deposit_actions, + prover_args: borsh::to_vec(&ProverResult::InitTransfer(InitTransferMessage { + origin_nonce: 1, + token: eth_token_address(), + recipient: OmniAddress::Near(account_n(1)), + amount: U128(amount), + fee: Fee { + fee: U128(fee), + native_fee: U128(0), + }, + sender: eth_eoa_address(), + msg: String::default(), + emitter_address: eth_factory_address(), + })) + .unwrap(), + }) + .deposit(required_deposit_for_fin_transfer) + .max_gas() + .transact() + .await? + .into_result()?; + + // Check balances + let recipient_balance: U128 = token_contract + .view("ft_balance_of") + .args_json(json!({ + "account_id": account_n(1), + })) + .await? + .json()?; + assert_eq!(amount - fee, recipient_balance.0); + + let relayer_balance: U128 = token_contract + .view("ft_balance_of") + .args_json(json!({ + "account_id": relayer_account_id(), + })) + .await? + .json()?; + assert_eq!(fee, relayer_balance.0); + + Ok(()) + } +} diff --git a/near/omni-tests/src/helpers.rs b/near/omni-tests/src/helpers.rs new file mode 100644 index 00000000..72d667f0 --- /dev/null +++ b/near/omni-tests/src/helpers.rs @@ -0,0 +1,160 @@ +#[cfg(test)] +pub mod tests { + use near_sdk::{borsh, json_types::U128, serde_json, AccountId}; + use near_workspaces::types::NearToken; + use omni_types::{ + locker_args::{BindTokenArgs, ClaimFeeArgs, DeployTokenArgs}, + prover_result::{DeployTokenMessage, FinTransferMessage, LogMetadataMessage, ProverResult}, + BasicMetadata, ChainKind, Nonce, OmniAddress, TransferId, + }; + + pub const MOCK_TOKEN_PATH: &str = "./../target/wasm32-unknown-unknown/release/mock_token.wasm"; + pub const MOCK_PROVER_PATH: &str = + "./../target/wasm32-unknown-unknown/release/mock_prover.wasm"; + pub const LOCKER_PATH: &str = "./../target/wasm32-unknown-unknown/release/omni_bridge.wasm"; + pub const NEP141_DEPOSIT: NearToken = NearToken::from_yoctonear(1250000000000000000000); + pub const TOKEN_DEPLOYER_PATH: &str = + "./../target/wasm32-unknown-unknown/release/token_deployer.wasm"; + + pub fn relayer_account_id() -> AccountId { + "relayer".parse().unwrap() + } + + pub fn account_n(n: u8) -> AccountId { + format!("account_{}", n).parse().unwrap() + } + + pub fn eth_factory_address() -> OmniAddress { + "eth:0x252e87862A3A720287E7fd527cE6e8d0738427A2" + .parse() + .unwrap() + } + + pub fn arb_factory_address() -> OmniAddress { + "arb:0x252e87862A3A720287E7fd527cE6e8d0738427A2" + .parse() + .unwrap() + } + + pub fn base_factory_address() -> OmniAddress { + "base:0x252e87862A3A720287E7fd527cE6e8d0738427A2" + .parse() + .unwrap() + } + + pub fn sol_factory_address() -> OmniAddress { + "sol:11111111111111111111111111111111".parse().unwrap() + } + + pub fn eth_eoa_address() -> OmniAddress { + "eth:0xc5ed912ca6db7b41de4ef3632fa0a5641e42bf09" + .parse() + .unwrap() + } + + pub fn eth_token_address() -> OmniAddress { + "eth:0x1234567890123456789012345678901234567890" + .parse() + .unwrap() + } + + pub fn sol_token_address() -> OmniAddress { + "sol:11111111111111111111111111111111".parse().unwrap() + } + + pub fn arb_token_address() -> OmniAddress { + "arb:0x1234567890123456789012345678901234567890" + .parse() + .unwrap() + } + + pub fn base_token_address() -> OmniAddress { + "base:0x1234567890123456789012345678901234567890" + .parse() + .unwrap() + } + + pub fn get_claim_fee_args_near( + origin_chain: ChainKind, + destination_chain: ChainKind, + origin_nonce: Nonce, + fee_recipient: AccountId, + amount: u128, + emitter_address: OmniAddress, + ) -> ClaimFeeArgs { + let fin_transfer = FinTransferMessage { + transfer_id: TransferId { + origin_chain: origin_chain, + origin_nonce: origin_nonce, + }, + fee_recipient: fee_recipient.clone(), + amount: U128(amount), + emitter_address, + }; + + let prover_result = ProverResult::FinTransfer(fin_transfer); + + let prover_args = borsh::to_vec(&prover_result).expect("Failed to serialize prover result"); + + ClaimFeeArgs { + chain_kind: destination_chain, + prover_args, + } + } + + pub fn get_test_deploy_token_args( + token_address: &OmniAddress, + factory_contract_address: &OmniAddress, + token_metadata: &BasicMetadata, + ) -> DeployTokenArgs { + let log_metadata_message = LogMetadataMessage { + token_address: token_address.clone(), + name: token_metadata.name.clone(), + symbol: token_metadata.symbol.clone(), + decimals: token_metadata.decimals, + emitter_address: factory_contract_address.clone(), + }; + + let prover_result = ProverResult::LogMetadata(log_metadata_message); + let prover_args = borsh::to_vec(&prover_result).expect("Failed to serialize prover result"); + + DeployTokenArgs { + chain_kind: token_address.get_chain(), + prover_args, + } + } + + pub fn get_bind_token_args( + token: &AccountId, + token_address: &OmniAddress, + emitter_address: &OmniAddress, + decimals: u8, + origin_decimals: u8, + ) -> BindTokenArgs { + let deploy_token_message = DeployTokenMessage { + token: token.clone(), + token_address: token_address.clone(), + emitter_address: emitter_address.clone(), + decimals, + origin_decimals, + }; + let prover_result = ProverResult::DeployToken(deploy_token_message); + + let prover_args = borsh::to_vec(&prover_result).expect("Failed to serialize prover result"); + + BindTokenArgs { + chain_kind: ChainKind::Eth, + prover_args, + } + } + + pub fn get_event_data( + event_name: &str, + logs: &Vec<&String>, + ) -> anyhow::Result> { + logs.iter() + .find(|log| log.contains(event_name)) + .map(|log| serde_json::from_str(log).map_err(anyhow::Error::from)) + .transpose() + } +} diff --git a/near/omni-tests/src/init_transfer.rs b/near/omni-tests/src/init_transfer.rs new file mode 100644 index 00000000..4e0b13bb --- /dev/null +++ b/near/omni-tests/src/init_transfer.rs @@ -0,0 +1,754 @@ +#[cfg(test)] +mod tests { + use crate::helpers::tests::{ + account_n, eth_eoa_address, eth_factory_address, eth_token_address, get_bind_token_args, + get_claim_fee_args_near, get_event_data, relayer_account_id, LOCKER_PATH, MOCK_PROVER_PATH, + MOCK_TOKEN_PATH, NEP141_DEPOSIT, + }; + use anyhow::Ok; + use near_sdk::{ + json_types::U128, + serde_json::{self, json}, + }; + use near_workspaces::{result::ExecutionSuccess, types::NearToken, AccountId}; + use omni_types::{ + near_events::OmniBridgeEvent, ChainKind, Fee, InitTransferMsg, OmniAddress, TransferId, + TransferMessage, UpdateFee, + }; + + const DEFAULT_NEAR_SANDBOX_BALANCE: NearToken = NearToken::from_near(100); + const EXPECTED_RELAYER_GAS_COST: NearToken = + NearToken::from_yoctonear(1_500_000_000_000_000_000_000); + + struct TestEnv { + worker: near_workspaces::Worker, + token_contract: near_workspaces::Contract, + locker_contract: near_workspaces::Contract, + relayer_account: near_workspaces::Account, + sender_account: near_workspaces::Account, + eth_factory_address: OmniAddress, + } + + impl TestEnv { + async fn new(sender_balance_token: u128) -> anyhow::Result { + let worker = near_workspaces::sandbox().await?; + // Deploy and initialize FT token + let token_contract = worker.dev_deploy(&std::fs::read(MOCK_TOKEN_PATH)?).await?; + token_contract + .call("new_default_meta") + .args_json(json!({ + "owner_id": token_contract.id(), + "total_supply": U128(u128::MAX) + })) + .max_gas() + .transact() + .await? + .into_result()?; + + let prover_contract = worker.dev_deploy(&std::fs::read(MOCK_PROVER_PATH)?).await?; + // Deploy and initialize locker + let locker_contract = worker.dev_deploy(&std::fs::read(LOCKER_PATH)?).await?; + locker_contract + .call("new") + .args_json(json!({ + "prover_account": prover_contract.id(), + "mpc_signer": "mpc.testnet", + "nonce": U128(0), + "wnear_account_id": "wnear.testnet", + })) + .max_gas() + .transact() + .await? + .into_result()?; + + // Register the locker contract in the token contract + token_contract + .call("storage_deposit") + .args_json(json!({ + "account_id": locker_contract.id(), + "registration_only": true, + })) + .deposit(NEP141_DEPOSIT) + .max_gas() + .transact() + .await? + .into_result()?; + + // Create relayer account. (Default account in sandbox has 100 NEAR) + let relayer_account = worker + .create_tla(relayer_account_id(), worker.dev_generate().await.1) + .await? + .unwrap(); + + // Create sender account. (Default account in sandbox has 100 NEAR) + let sender_account = worker + .create_tla(account_n(1), worker.dev_generate().await.1) + .await? + .unwrap(); + + // Register the sender in the token contract + token_contract + .call("storage_deposit") + .args_json(json!({ + "account_id": sender_account.id(), + "registration_only": true, + })) + .deposit(NEP141_DEPOSIT) + .max_gas() + .transact() + .await? + .into_result()?; + + // Register the relayer in the token contract + token_contract + .call("storage_deposit") + .args_json(json!({ + "account_id": relayer_account.id(), + "registration_only": true, + })) + .deposit(NEP141_DEPOSIT) + .max_gas() + .transact() + .await? + .into_result()?; + + // Transfer initial tokens to the sender account + token_contract + .call("ft_transfer") + .args_json(json!({ + "receiver_id": sender_account.id(), + "amount": U128(sender_balance_token), + "memo": None::, + })) + .deposit(NearToken::from_yoctonear(1)) + .max_gas() + .transact() + .await? + .into_result()?; + + // Add the ETH factory address to the locker contract + let eth_factory_address = eth_factory_address(); + locker_contract + .call("add_factory") + .args_json(json!({ + "address": eth_factory_address, + })) + .max_gas() + .transact() + .await? + .into_result()?; + + // Bind the token to the locker contract + let required_deposit_for_bind_token = locker_contract + .view("required_balance_for_bind_token") + .await? + .json()?; + locker_contract + .call("bind_token") + .args_borsh(get_bind_token_args( + &token_contract.id(), + ð_token_address(), + ð_factory_address, + 24, + 24, + )) + .deposit(required_deposit_for_bind_token) + .max_gas() + .transact() + .await? + .into_result()?; + + Ok(Self { + worker, + token_contract, + locker_contract, + relayer_account, + sender_account, + eth_factory_address, + }) + } + } + + async fn init_transfer_flow_on_near( + env: &TestEnv, + transfer_amount: u128, + init_transfer_msg: InitTransferMsg, + custom_deposit: Option, + update_fee: Option, + is_relayer_sign: bool, + ) -> anyhow::Result<()> { + let storage_deposit_amount = get_balance_required_for_account( + &env.locker_contract, + &env.sender_account, + &init_transfer_msg, + custom_deposit, + ) + .await?; + + // Deposit to the storage + env.sender_account + .call(env.locker_contract.id(), "storage_deposit") + .args_json(json!({ + "account_id": env.sender_account.id(), + })) + .deposit(storage_deposit_amount) + .max_gas() + .transact() + .await? + .into_result()?; + + // Initiate the transfer + let transfer_result = env + .sender_account + .call(env.token_contract.id(), "ft_transfer_call") + .args_json(json!({ + "receiver_id": env.locker_contract.id(), + "amount": U128(transfer_amount), + "memo": None::, + "msg": serde_json::to_string(&init_transfer_msg)?, + })) + .deposit(NearToken::from_yoctonear(1)) + .max_gas() + .transact() + .await? + .into_result()?; + + // Ensure the transfer event is emitted + let transfer_message = get_transfer_message_from_event(&transfer_result)?; + + // Update the transfer fee if needed + let signing_fee = if let Some(update_fee) = update_fee.clone() { + make_fee_update( + update_fee.clone(), + &transfer_message, + &env.locker_contract, + &env.sender_account, + ) + .await?; + match update_fee { + UpdateFee::Fee(new_fee) => new_fee, + UpdateFee::Proof(_) => transfer_message.fee.clone(), + } + } else { + transfer_message.fee.clone() + }; + + // Transfer is signed by the relayer or the sender + let signer = if is_relayer_sign { + &env.relayer_account + } else { + &env.sender_account + }; + + signer + .call(env.locker_contract.id(), "sign_transfer") + .args_json(json!({ + "transfer_id": TransferId { + origin_chain: ChainKind::Near, + origin_nonce: transfer_message.origin_nonce, + }, + "fee_recipient": env.relayer_account.id(), + "fee": &Some(signing_fee.clone()), + })) + .max_gas() + .transact() + .await? + .into_result()?; + + // Relayer claims the fee + let claim_fee_args = get_claim_fee_args_near( + ChainKind::Near, + ChainKind::Eth, + transfer_message.origin_nonce.into(), + env.relayer_account.id().clone(), + transfer_amount - signing_fee.fee.0, + env.eth_factory_address.clone(), + ); + env.relayer_account + .call(env.locker_contract.id(), "claim_fee") + .args_borsh(claim_fee_args) + .deposit(NearToken::from_yoctonear(1)) + .max_gas() + .transact() + .await? + .into_result()?; + Ok(()) + } + async fn get_balance_required_for_account( + locker_contract: &near_workspaces::Contract, + sender_account: &near_workspaces::Account, + init_transfer_msg: &InitTransferMsg, + custom_deposit: Option, + ) -> anyhow::Result { + let required_balance_account: NearToken = locker_contract + .view("required_balance_for_account") + .await? + .json()?; + + let required_balance_init_transfer: NearToken = locker_contract + .view("required_balance_for_init_transfer") + .args_json(json!({ + "recipient": init_transfer_msg.recipient, + "sender": OmniAddress::Near(sender_account.id().clone()), + })) + .await? + .json()?; + + let storage_deposit_amount = match custom_deposit { + Some(deposit) => deposit, + None => required_balance_account + .saturating_add(NearToken::from_yoctonear( + init_transfer_msg.native_token_fee.0, + )) + .saturating_add(required_balance_init_transfer), + }; + + Ok(storage_deposit_amount) + } + + fn get_transfer_message_from_event( + transfer_result: &ExecutionSuccess, + ) -> anyhow::Result { + let logs = transfer_result + .receipt_outcomes() + .iter() + .flat_map(|outcome| &outcome.logs) + .collect::>(); + + let omni_bridge_event: OmniBridgeEvent = serde_json::from_value( + get_event_data("InitTransferEvent", &logs)? + .ok_or_else(|| anyhow::anyhow!("InitTransferEvent not found"))?, + )?; + let transfer_message = match omni_bridge_event { + OmniBridgeEvent::InitTransferEvent { transfer_message } => transfer_message, + _ => anyhow::bail!("InitTransferEvent is found in unexpected event"), + }; + + Ok(transfer_message) + } + + async fn make_fee_update( + update_fee: UpdateFee, + transfer_message: &TransferMessage, + locker_contract: &near_workspaces::Contract, + sender_account: &near_workspaces::Account, + ) -> anyhow::Result<()> { + let deposit = match update_fee.clone() { + UpdateFee::Fee(update_fee) => NearToken::from_yoctonear( + update_fee + .native_fee + .0 + .checked_sub(transfer_message.fee.native_fee.0) + .unwrap_or(0), + ), + // To be updated once the proof is implemented + UpdateFee::Proof(_) => NearToken::from_yoctonear(0), + }; + sender_account + .call(locker_contract.id(), "update_transfer_fee") + .args_json(json!({ + "transfer_id": TransferId { + origin_chain: ChainKind::Near, + origin_nonce: transfer_message.origin_nonce, + }, + "fee": update_fee.clone(), + })) + .max_gas() + .deposit(deposit) + .transact() + .await? + .into_result()?; + Ok(()) + } + + async fn get_token_balance( + token_contract: &near_workspaces::Contract, + account_id: &AccountId, + ) -> anyhow::Result { + Ok(token_contract + .view("ft_balance_of") + .args_json(json!({ "account_id": account_id })) + .await? + .json()?) + } + async fn get_test_balances(env: &TestEnv) -> anyhow::Result<(U128, U128, U128, NearToken)> { + let user_balance_token: U128 = + get_token_balance(&env.token_contract, &env.sender_account.id()).await?; + let locker_balance_token: U128 = + get_token_balance(&env.token_contract, &env.locker_contract.id()).await?; + let relayer_balance_token: U128 = + get_token_balance(&env.token_contract, &env.relayer_account.id()).await?; + let relayer_balance_near: NearToken = env + .worker + .view_account(env.relayer_account.id()) + .await? + .balance; + + Ok(( + user_balance_token, + locker_balance_token, + relayer_balance_token, + relayer_balance_near, + )) + } + #[tokio::test] + async fn test_native_fee() -> anyhow::Result<()> { + let sender_balance_token = 1_000_000; + let transfer_amount = 100; + let init_transfer_msg = InitTransferMsg { + native_token_fee: U128(NearToken::from_near(1).as_yoctonear()), + fee: U128(0), + recipient: eth_eoa_address(), + }; + + let env = TestEnv::new(sender_balance_token).await?; + + init_transfer_flow_on_near( + &env, + transfer_amount, + init_transfer_msg.clone(), + None, + None, + false, + ) + .await?; + + let (user_balance_token, locker_balance_token, _, relayer_balance_near) = + get_test_balances(&env).await?; + + assert_eq!( + user_balance_token, + U128(sender_balance_token - transfer_amount), + "User balance was not deducted" + ); + assert_eq!( + locker_balance_token, + U128(transfer_amount), + "Locker balance was not increased" + ); + assert!( + DEFAULT_NEAR_SANDBOX_BALANCE.as_yoctonear() + + NearToken::from_yoctonear(init_transfer_msg.native_token_fee.0).as_yoctonear() + - relayer_balance_near.as_yoctonear() + < EXPECTED_RELAYER_GAS_COST.as_yoctonear(), + "Relayer didn't receive native fee." + ); + Ok(()) + } + + #[tokio::test] + async fn test_transfer_fee() -> anyhow::Result<()> { + let sender_balance_token = 1_000_000; + let transfer_amount = 5000; + let init_transfer_msg = InitTransferMsg { + native_token_fee: U128(0), + fee: U128(1000), + recipient: eth_eoa_address(), + }; + + let env = TestEnv::new(sender_balance_token).await?; + + init_transfer_flow_on_near( + &env, + transfer_amount, + init_transfer_msg.clone(), + None, + None, + false, + ) + .await?; + + let (user_balance_token, locker_balance_token, relayer_balance_token, _) = + get_test_balances(&env).await?; + + assert_eq!( + user_balance_token, + U128(sender_balance_token - transfer_amount), + "User balance was not deducted" + ); + assert_eq!( + locker_balance_token, + U128(transfer_amount - init_transfer_msg.fee.0), + "Locker balance was not increased or the fee was not deducted" + ); + assert_eq!( + relayer_balance_token, + U128(init_transfer_msg.fee.0), + "Relayer didn't receive transfer fee." + ); + Ok(()) + } + + #[tokio::test] + async fn test_both_fee() -> anyhow::Result<()> { + let sender_balance_token = 1_000_000; + let transfer_amount = 5000; + let init_transfer_msg = InitTransferMsg { + native_token_fee: U128(NearToken::from_near(1).as_yoctonear()), + fee: U128(1000), + recipient: eth_eoa_address(), + }; + + let env = TestEnv::new(sender_balance_token).await?; + + init_transfer_flow_on_near( + &env, + transfer_amount, + init_transfer_msg.clone(), + None, + None, + false, + ) + .await?; + + let (user_balance_token, locker_balance_token, relayer_balance_token, relayer_balance_near) = + get_test_balances(&env).await?; + + assert_eq!( + user_balance_token, + U128(sender_balance_token - transfer_amount), + "User balance was not deducted" + ); + assert_eq!( + locker_balance_token, + U128(transfer_amount - init_transfer_msg.fee.0), + "Locker balance was not increased or the fee was not deducted" + ); + + assert!( + DEFAULT_NEAR_SANDBOX_BALANCE.as_yoctonear() + + NearToken::from_yoctonear(init_transfer_msg.native_token_fee.0).as_yoctonear() + - relayer_balance_near.as_yoctonear() + < EXPECTED_RELAYER_GAS_COST.as_yoctonear(), + "Relayer didn't receive native fee." + ); + + assert_eq!( + relayer_balance_token, + U128(init_transfer_msg.fee.0), + "Relayer didn't receive transfer fee." + ); + Ok(()) + } + + #[tokio::test] + async fn test_update_fee() -> anyhow::Result<()> { + let sender_balance_token = 1_000_000; + let transfer_amount = 5000; + let init_transfer_msg = InitTransferMsg { + native_token_fee: U128(NearToken::from_near(1).as_yoctonear()), + fee: U128(1000), + recipient: eth_eoa_address(), + }; + let update_fee_value = Fee { + native_fee: U128(NearToken::from_near(2).as_yoctonear()), + fee: U128(2000), + }; + let update_fee = UpdateFee::Fee(update_fee_value.clone()); + + let env = TestEnv::new(sender_balance_token).await?; + + init_transfer_flow_on_near( + &env, + transfer_amount, + init_transfer_msg.clone(), + None, + Some(update_fee), + false, + ) + .await?; + + let (user_balance_token, locker_balance_token, relayer_balance_token, relayer_balance_near) = + get_test_balances(&env).await?; + + assert_eq!( + user_balance_token, + U128(sender_balance_token - transfer_amount), + "User balance was not deducted" + ); + assert_eq!( + locker_balance_token, + U128(transfer_amount - update_fee_value.fee.0), + "Locker balance was not increased or the fee was not deducted" + ); + + assert!( + DEFAULT_NEAR_SANDBOX_BALANCE.as_yoctonear() + + NearToken::from_yoctonear(update_fee_value.native_fee.0).as_yoctonear() + - relayer_balance_near.as_yoctonear() + < EXPECTED_RELAYER_GAS_COST.as_yoctonear(), + "Relayer didn't receive native fee." + ); + + assert_eq!( + relayer_balance_token, + U128(update_fee_value.fee.0), + "Relayer didn't receive transfer fee." + ); + Ok(()) + } + + #[tokio::test] + async fn test_relayer_sign() -> anyhow::Result<()> { + let sender_balance_token = 1_000_000; + let transfer_amount = 100; + let init_transfer_msg = InitTransferMsg { + native_token_fee: U128(NearToken::from_near(1).as_yoctonear()), + fee: U128(0), + recipient: eth_eoa_address(), + }; + + let env = TestEnv::new(sender_balance_token).await?; + + init_transfer_flow_on_near( + &env, + transfer_amount, + init_transfer_msg.clone(), + None, + None, + true, + ) + .await?; + + let (user_balance_token, locker_balance_token, _, relayer_balance_near) = + get_test_balances(&env).await?; + + assert_eq!( + user_balance_token, + U128(sender_balance_token - transfer_amount), + "User balance was not deducted" + ); + assert_eq!( + locker_balance_token, + U128(transfer_amount), + "Locker balance was not increased" + ); + + assert!( + DEFAULT_NEAR_SANDBOX_BALANCE.as_yoctonear() + + NearToken::from_yoctonear(init_transfer_msg.native_token_fee.0).as_yoctonear() + - relayer_balance_near.as_yoctonear() + < EXPECTED_RELAYER_GAS_COST.as_yoctonear(), + "Relayer didn't receive native fee." + ); + Ok(()) + } + + #[tokio::test] + #[should_panic(expected = "ERR_LOWER_FEE")] + async fn test_update_fee_native_too_small() { + let sender_balance_token = 1_000_000; + let transfer_amount = 5000; + let init_transfer_msg = InitTransferMsg { + native_token_fee: U128(NearToken::from_near(1).as_yoctonear()), + fee: U128(1000), + recipient: eth_eoa_address(), + }; + let update_fee_value = Fee { + native_fee: U128(NearToken::from_near(0).as_yoctonear()), + fee: U128(2000), + }; + let update_fee = UpdateFee::Fee(update_fee_value.clone()); + + let env = TestEnv::new(sender_balance_token).await.unwrap(); + + init_transfer_flow_on_near( + &env, + transfer_amount, + init_transfer_msg.clone(), + None, + Some(update_fee), + false, + ) + .await + .unwrap(); + () + } + + #[tokio::test] + #[should_panic(expected = "ERR_INVALID_FEE")] + async fn test_update_fee_transfer_fee_too_small() { + let sender_balance_token = 1_000_000; + let transfer_amount = 5000; + let init_transfer_msg = InitTransferMsg { + native_token_fee: U128(NearToken::from_near(1).as_yoctonear()), + fee: U128(1000), + recipient: eth_eoa_address(), + }; + let update_fee_value = Fee { + native_fee: U128(NearToken::from_near(1).as_yoctonear()), + fee: U128(500), + }; + let update_fee = UpdateFee::Fee(update_fee_value.clone()); + + let env = TestEnv::new(sender_balance_token).await.unwrap(); + + init_transfer_flow_on_near( + &env, + transfer_amount, + init_transfer_msg.clone(), + None, + Some(update_fee), + false, + ) + .await + .unwrap(); + } + + #[tokio::test] + #[should_panic(expected = "ERR_INVALID_FEE")] + async fn test_update_fee_transfer_fee_too_big() { + let sender_balance_token = 1_000_000; + let transfer_amount = 5000; + let init_transfer_msg = InitTransferMsg { + native_token_fee: U128(NearToken::from_near(1).as_yoctonear()), + fee: U128(1000), + recipient: eth_eoa_address(), + }; + let update_fee_value = Fee { + native_fee: U128(NearToken::from_near(1).as_yoctonear()), + fee: U128(6000), + }; + let update_fee = UpdateFee::Fee(update_fee_value.clone()); + + let env = TestEnv::new(sender_balance_token).await.unwrap(); + + init_transfer_flow_on_near( + &env, + transfer_amount, + init_transfer_msg.clone(), + None, + Some(update_fee), + false, + ) + .await + .unwrap(); + } + + #[tokio::test] + #[should_panic(expected = "TODO")] + // Add a test once the Proof update fee is implemented + async fn test_update_fee_proof() { + let sender_balance_token = 1_000_000; + let transfer_amount = 5000; + let init_transfer_msg = InitTransferMsg { + native_token_fee: U128(NearToken::from_near(1).as_yoctonear()), + fee: U128(1000), + recipient: eth_eoa_address(), + }; + let update_fee = UpdateFee::Proof(vec![]); + + let env = TestEnv::new(sender_balance_token).await.unwrap(); + + init_transfer_flow_on_near( + &env, + transfer_amount, + init_transfer_msg.clone(), + None, + Some(update_fee), + false, + ) + .await + .unwrap(); + } +} diff --git a/near/omni-tests/src/lib.rs b/near/omni-tests/src/lib.rs index f9fe2017..1717cf35 100644 --- a/near/omni-tests/src/lib.rs +++ b/near/omni-tests/src/lib.rs @@ -1,256 +1,4 @@ -#[cfg(test)] -mod tests { - use near_sdk::{borsh, json_types::U128, serde_json::json, AccountId}; - use near_workspaces::types::NearToken; - use omni_types::{ - locker_args::{FinTransferArgs, StorageDepositArgs}, - prover_result::{InitTransferMessage, ProverResult}, - OmniAddress, TransferMessage, - }; - - const MOCK_TOKEN_PATH: &str = "./../target/wasm32-unknown-unknown/release/mock_token.wasm"; - const MOCK_PROVER_PATH: &str = "./../target/wasm32-unknown-unknown/release/mock_prover.wasm"; - const LOCKER_PATH: &str = "./../target/wasm32-unknown-unknown/release/nep141_locker.wasm"; - const NEP141_DEPOSIT: NearToken = NearToken::from_yoctonear(1250000000000000000000); - - fn relayer_account_id() -> AccountId { - "relayer".parse().unwrap() - } - - fn account_1() -> AccountId { - "account_1".parse().unwrap() - } - - fn account_2() -> AccountId { - "account_2".parse().unwrap() - } - - fn eth_factory_address() -> OmniAddress { - "eth:0x252e87862A3A720287E7fd527cE6e8d0738427A2" - .parse() - .unwrap() - } - - fn eth_eoa_address() -> OmniAddress { - "eth:0xc5ed912ca6db7b41de4ef3632fa0a5641e42bf09" - .parse() - .unwrap() - } - - #[tokio::test] - async fn test_storage_deposit_on_fin_transfer() { - struct TestStorageDeposit<'a> { - storage_deposit_accounts: Vec<(AccountId, bool)>, - amount: u128, - fee: u128, - error: Option<&'a str>, - } - let test_data = [ - TestStorageDeposit { - storage_deposit_accounts: [(account_1(), true), (relayer_account_id(), true)] - .to_vec(), - amount: 1000, - fee: 1, - error: None, - }, - TestStorageDeposit { - storage_deposit_accounts: [(account_1(), true)].to_vec(), - amount: 1000, - fee: 0, - error: None, - }, - TestStorageDeposit { - storage_deposit_accounts: [ - (account_1(), true), - (relayer_account_id(), true), - (account_2(), true), - ] - .to_vec(), - amount: 1000, - fee: 1, - error: Some("Invalid len of accounts for storage deposit"), - }, - TestStorageDeposit { - storage_deposit_accounts: [(relayer_account_id(), true), (account_1(), true)] - .to_vec(), - amount: 1000, - fee: 1, - error: Some("STORAGE_ERR: The transfer recipient is omitted"), - }, - TestStorageDeposit { - storage_deposit_accounts: [(account_1(), true)].to_vec(), - amount: 1000, - fee: 1, - error: Some("STORAGE_ERR: The fee recipient is omitted"), - }, - TestStorageDeposit { - storage_deposit_accounts: [].to_vec(), - amount: 1000, - fee: 1, - error: Some("STORAGE_ERR: The transfer recipient is omitted"), - }, - TestStorageDeposit { - storage_deposit_accounts: [(account_1(), false), (relayer_account_id(), false)] - .to_vec(), - amount: 1000, - fee: 1, - error: Some("STORAGE_ERR: The transfer recipient is omitted"), - }, - TestStorageDeposit { - storage_deposit_accounts: [(account_1(), true), (relayer_account_id(), false)] - .to_vec(), - amount: 1000, - fee: 1, - error: Some("STORAGE_ERR: The fee recipient is omitted"), - }, - TestStorageDeposit { - storage_deposit_accounts: [(account_1(), false), (relayer_account_id(), true)] - .to_vec(), - amount: 1000, - fee: 1, - error: Some("STORAGE_ERR: The transfer recipient is omitted"), - }, - ]; - - for (index, test) in test_data.into_iter().enumerate() { - let result = - test_fin_transfer(test.storage_deposit_accounts, test.amount, test.fee).await; - - match result { - Ok(_) => assert!(test.error.is_none()), - Err(e) => assert!( - e.to_string().contains(test.error.unwrap()), - "Test index: {}, err: {}", - index, - e - ), - } - } - } - - async fn test_fin_transfer( - storage_deposit_accounts: Vec<(AccountId, bool)>, - amount: u128, - fee: u128, - ) -> anyhow::Result<()> { - let worker = near_workspaces::sandbox().await?; - // Deploy and init FT token - let token_contract = worker.dev_deploy(&std::fs::read(MOCK_TOKEN_PATH)?).await?; - token_contract - .call("new_default_meta") - .args_json(json!({ - "owner_id": token_contract.id(), - "total_supply": U128(u128::MAX) - })) - .max_gas() - .transact() - .await? - .into_result()?; - - let prover_contract = worker.dev_deploy(&std::fs::read(MOCK_PROVER_PATH)?).await?; - // Deploy and init locker - let locker_contract = worker.dev_deploy(&std::fs::read(LOCKER_PATH)?).await?; - locker_contract - .call("new") - .args_json(json!({ - "prover_account": prover_contract.id(), - "mpc_signer": "mpc.testnet", - "nonce": U128(0) - })) - .max_gas() - .transact() - .await? - .into_result()?; - - // Create relayer account - let relayer_account = worker - .create_tla(relayer_account_id(), worker.dev_generate().await.1) - .await? - .unwrap(); - - // Storage deposit and transfer tokens - token_contract - .call("storage_deposit") - .args_json(json!({ - "account_id": locker_contract.id(), - "registration_only": true, - })) - .deposit(NEP141_DEPOSIT) - .max_gas() - .transact() - .await? - .into_result()?; - - token_contract - .call("ft_transfer") - .args_json(json!({ - "receiver_id": locker_contract.id(), - "amount": U128(amount), - })) - .deposit(NearToken::from_yoctonear(1)) - .max_gas() - .transact() - .await? - .into_result()?; - - // Add factory address - locker_contract - .call("add_factory") - .args_json(json!({ - "address": eth_factory_address(), - })) - .max_gas() - .transact() - .await? - .into_result()?; - - // Fin transfer - relayer_account - .call(locker_contract.id(), "fin_transfer") - .args_borsh(FinTransferArgs { - chain_kind: omni_types::ChainKind::Eth, - storage_deposit_args: StorageDepositArgs { - token: token_contract.id().clone(), - accounts: storage_deposit_accounts, - }, - prover_args: borsh::to_vec(&ProverResult::InitTransfer(InitTransferMessage { - emitter_address: eth_factory_address(), - transfer: TransferMessage { - origin_nonce: U128(1), - token: token_contract.id().clone(), - recipient: OmniAddress::Near(account_1().to_string()), - amount: U128(amount), - fee: U128(fee), - sender: eth_eoa_address(), - }, - })) - .unwrap(), - }) - .deposit(NEP141_DEPOSIT.saturating_mul(2)) - .max_gas() - .transact() - .await? - .into_result()?; - - // Check balances - let recipient_balance: U128 = token_contract - .view("ft_balance_of") - .args_json(json!({ - "account_id": account_1(), - })) - .await? - .json()?; - assert_eq!(amount - fee, recipient_balance.0); - - let relayer_balance: U128 = token_contract - .view("ft_balance_of") - .args_json(json!({ - "account_id": relayer_account_id(), - })) - .await? - .json()?; - assert_eq!(fee, relayer_balance.0); - - Ok(()) - } -} +mod fin_transfer; +mod helpers; +mod init_transfer; +mod omni_token; diff --git a/near/omni-tests/src/omni_token.rs b/near/omni-tests/src/omni_token.rs new file mode 100644 index 00000000..2a24c778 --- /dev/null +++ b/near/omni-tests/src/omni_token.rs @@ -0,0 +1,437 @@ +#[cfg(test)] +mod tests { + use crate::helpers::tests::{ + account_n, arb_factory_address, arb_token_address, base_factory_address, + base_token_address, eth_eoa_address, eth_factory_address, eth_token_address, + get_test_deploy_token_args, sol_factory_address, sol_token_address, LOCKER_PATH, + MOCK_PROVER_PATH, NEP141_DEPOSIT, TOKEN_DEPLOYER_PATH, + }; + use anyhow; + use near_sdk::borsh; + use near_sdk::json_types::U128; + use near_sdk::serde_json::json; + use near_workspaces::{types::NearToken, AccountId}; + use omni_types::locker_args::{FinTransferArgs, StorageDepositAction}; + use omni_types::prover_result::InitTransferMessage; + use omni_types::prover_result::ProverResult; + use omni_types::Fee; + use omni_types::{BasicMetadata, ChainKind, OmniAddress}; + use rstest::rstest; + use std::str::FromStr; + + struct TestEnv { + worker: near_workspaces::Worker, + locker: near_workspaces::Contract, + token_contract: near_workspaces::Contract, + init_token_address: OmniAddress, + factory_contract_address: OmniAddress, + token_metadata: BasicMetadata, + } + + impl TestEnv { + async fn new(init_token_address: OmniAddress) -> anyhow::Result { + let worker = near_workspaces::sandbox().await?; + let token_metadata = BasicMetadata { + name: "Test Token".to_string(), + symbol: "TEST".to_string(), + decimals: 18, + }; + + // Setup prover + let prover_contract = worker.dev_deploy(&std::fs::read(MOCK_PROVER_PATH)?).await?; + + // Setup locker + let locker = worker.dev_deploy(&std::fs::read(LOCKER_PATH)?).await?; + locker + .call("new") + .args_json(json!({ + "prover_account": prover_contract.id(), + "mpc_signer": "mpc.testnet", + "nonce": U128(0), + "wnear_account_id": "wnear.testnet", + })) + .max_gas() + .transact() + .await? + .into_result()?; + + // Setup token deployer + let token_deployer = worker + .create_tla_and_deploy( + account_n(1), + worker.dev_generate().await.1, + &std::fs::read(TOKEN_DEPLOYER_PATH)?, + ) + .await? + .unwrap(); + + token_deployer + .call("new") + .args_json(json!({ + "controller": locker.id(), + "dao": AccountId::from_str("dao.near").unwrap(), + })) + .max_gas() + .transact() + .await? + .into_result()?; + + // Configure locker + locker + .call("add_token_deployer") + .args_json(json!({ + "chain": init_token_address.get_chain(), + "account_id": token_deployer.id(), + })) + .max_gas() + .transact() + .await? + .into_result()?; + + let factory_contract_address = match init_token_address.get_chain() { + ChainKind::Eth => eth_factory_address(), + ChainKind::Sol => sol_factory_address(), + ChainKind::Arb => arb_factory_address(), + ChainKind::Base => base_factory_address(), + _ => panic!("Unsupported chain"), + }; + + locker + .call("add_factory") + .args_json(json!({ + "address": factory_contract_address, + })) + .max_gas() + .transact() + .await? + .into_result()?; + + // Deploy token + let token_contract = Self::deploy_token( + &worker, + &locker, + &init_token_address, + &factory_contract_address, + &token_metadata, + ) + .await?; + + Ok(Self { + worker, + locker, + token_contract, + init_token_address, + factory_contract_address, + token_metadata, + }) + } + + async fn new_native(chain_kind: ChainKind) -> anyhow::Result { + let init_token_address = OmniAddress::new_zero(chain_kind).unwrap(); + Self::new(init_token_address).await + } + + async fn deploy_token( + worker: &near_workspaces::Worker, + locker: &near_workspaces::Contract, + init_token_address: &OmniAddress, + factoty_contract_address: &OmniAddress, + token_metadata: &BasicMetadata, + ) -> anyhow::Result { + let token_deploy_initiator = worker + .create_tla(account_n(2), worker.dev_generate().await.1) + .await? + .unwrap(); + + let required_storage: NearToken = locker + .view("required_balance_for_deploy_token") + .await? + .json()?; + + if init_token_address == &OmniAddress::new_zero(init_token_address.get_chain()).unwrap() + { + locker + .call("deploy_native_token") + .args_json(json!({ + "chain_kind": init_token_address.get_chain(), + "name": token_metadata.name, + "symbol": token_metadata.symbol, + "decimals": token_metadata.decimals, + })) + .deposit(required_storage) + .max_gas() + .transact() + .await? + .into_result()?; + } else { + token_deploy_initiator + .call(locker.id(), "deploy_token") + .args_borsh(get_test_deploy_token_args( + init_token_address, + &factoty_contract_address, + token_metadata, + )) + .deposit(required_storage) + .max_gas() + .transact() + .await? + .into_result()?; + } + + let token_account_id: AccountId = locker + .view("get_token_id") + .args_json(json!({ + "address": init_token_address + })) + .await? + .json()?; + + let token_contract = worker + .import_contract(&token_account_id, worker) + .transact() + .await?; + + Ok(token_contract) + } + + // Helper to create and register a new account + async fn create_registered_account( + &self, + account_num: u8, + ) -> anyhow::Result { + let account = self + .worker + .create_tla(account_n(account_num), self.worker.dev_generate().await.1) + .await? + .unwrap(); + + self.token_contract + .call("storage_deposit") + .args_json(json!({ + "account_id": Some(account.id()), + "registration_only": Some(true), + })) + .deposit(NEP141_DEPOSIT) + .max_gas() + .transact() + .await? + .into_result()?; + + Ok(account) + } + } + + #[rstest] + #[case(eth_token_address(), false)] + #[case(sol_token_address(), false)] + #[case(arb_token_address(), false)] + #[case(base_token_address(), false)] + #[case(eth_token_address(), true)] + #[case(sol_token_address(), true)] + #[case(arb_token_address(), true)] + #[case(base_token_address(), true)] + #[tokio::test] + async fn test_token_metadata( + #[case] init_token_address: OmniAddress, + #[case] is_native: bool, + ) -> anyhow::Result<()> { + let env = if is_native { + TestEnv::new_native(init_token_address.get_chain()).await? + } else { + TestEnv::new(init_token_address).await? + }; + + let fetched_metadata: BasicMetadata = + env.token_contract.view("ft_metadata").await?.json()?; + + assert_eq!(env.token_metadata.name, fetched_metadata.name); + assert_eq!(env.token_metadata.symbol, fetched_metadata.symbol); + assert_eq!(env.token_metadata.decimals, fetched_metadata.decimals); + + Ok(()) + } + + #[rstest] + #[case(eth_token_address(), false)] + #[case(sol_token_address(), false)] + #[case(arb_token_address(), false)] + #[case(base_token_address(), false)] + #[case(eth_token_address(), true)] + #[case(sol_token_address(), true)] + #[case(arb_token_address(), true)] + #[case(base_token_address(), true)] + #[tokio::test] + async fn test_token_minting( + #[case] init_token_address: OmniAddress, + #[case] is_native: bool, + ) -> anyhow::Result<()> { + let env = if is_native { + TestEnv::new_native(init_token_address.get_chain()).await? + } else { + TestEnv::new(init_token_address).await? + }; + let recipient = env.create_registered_account(3).await?; + let amount = U128(1000000000000000000000000); + + fake_finalize_transfer( + &env.locker, + &env.token_contract, + &recipient, + env.init_token_address, + env.factory_contract_address, + amount, + ) + .await?; + + let balance: U128 = env + .token_contract + .view("ft_balance_of") + .args_json(json!({ + "account_id": recipient.id(), + })) + .await? + .json()?; + + let total_supply: U128 = env.token_contract.view("ft_total_supply").await?.json()?; + + assert_eq!( + balance, amount, + "Balance should be equal to the minted amount" + ); + assert_eq!( + total_supply, amount, + "Total supply should be equal to the minted amount" + ); + Ok(()) + } + + #[rstest] + #[case(eth_token_address(), false)] + #[case(sol_token_address(), false)] + #[case(arb_token_address(), false)] + #[case(base_token_address(), false)] + #[case(eth_token_address(), true)] + #[case(sol_token_address(), true)] + #[case(arb_token_address(), true)] + #[case(base_token_address(), true)] + #[tokio::test] + async fn test_token_transfer( + #[case] init_token_address: OmniAddress, + #[case] is_native: bool, + ) -> anyhow::Result<()> { + let env = if is_native { + TestEnv::new_native(init_token_address.get_chain()).await? + } else { + TestEnv::new(init_token_address).await? + }; + let sender = env.create_registered_account(3).await?; + let receiver = env.create_registered_account(4).await?; + let amount = U128(1000000000000000000000000); + + // Mint tokens to sender + fake_finalize_transfer( + &env.locker, + &env.token_contract, + &sender, + env.init_token_address, + env.factory_contract_address, + amount, + ) + .await?; + + // Transfer tokens + sender + .call(env.token_contract.id(), "ft_transfer") + .args_json(json!({ + "receiver_id": receiver.id(), + "amount": amount, + })) + .deposit(NearToken::from_yoctonear(1)) + .max_gas() + .transact() + .await? + .into_result()?; + + // Verify balances + let sender_balance: U128 = env + .token_contract + .view("ft_balance_of") + .args_json(json!({ + "account_id": sender.id(), + })) + .await? + .json()?; + + let receiver_balance: U128 = env + .token_contract + .view("ft_balance_of") + .args_json(json!({ + "account_id": receiver.id(), + })) + .await? + .json()?; + + let total_supply: U128 = env.token_contract.view("ft_total_supply").await?.json()?; + + assert_eq!(sender_balance, U128(0), "Sender balance should be 0"); + assert_eq!( + receiver_balance, amount, + "Receiver balance should be equal to the sent amount" + ); + assert_eq!( + total_supply, amount, + "Total supply should be equal to the minted amount" + ); + + Ok(()) + } + + async fn fake_finalize_transfer( + locker_contract: &near_workspaces::Contract, + token_contract: &near_workspaces::Contract, + recipient: &near_workspaces::Account, + token_address: OmniAddress, + emitter_address: OmniAddress, + amount: U128, + ) -> anyhow::Result<()> { + let storage_deposit_actions = vec![StorageDepositAction { + token_id: token_contract.id().clone(), + account_id: recipient.id().clone(), + storage_deposit_amount: Some(NEP141_DEPOSIT.as_yoctonear()), + }]; + let required_balance_for_fin_transfer: NearToken = locker_contract + .view("required_balance_for_fin_transfer") + .await? + .json()?; + let required_deposit_for_fin_transfer = + NEP141_DEPOSIT.saturating_add(required_balance_for_fin_transfer); + + // Simulate finalization of transfer through locker + locker_contract + .call("fin_transfer") + .args_borsh(FinTransferArgs { + chain_kind: ChainKind::Near, + storage_deposit_actions, + prover_args: borsh::to_vec(&ProverResult::InitTransfer(InitTransferMessage { + origin_nonce: 1, + token: token_address, + recipient: OmniAddress::Near(recipient.id().clone()), + amount, + fee: Fee { + fee: U128(0), + native_fee: U128(0), + }, + sender: eth_eoa_address(), + msg: String::default(), + emitter_address, + }))?, + }) + .deposit(required_deposit_for_fin_transfer) + .max_gas() + .transact() + .await? + .into_result()?; + + Ok(()) + } +} diff --git a/near/omni-token/.catalog-info.yaml b/near/omni-token/.catalog-info.yaml new file mode 100644 index 00000000..73f07b71 --- /dev/null +++ b/near/omni-token/.catalog-info.yaml @@ -0,0 +1,13 @@ +apiVersion: backstage.io/v1alpha1 +kind: Component +metadata: + name: omni-token + tags: + - near + links: [] + annotations: + aurora.dev/security-tier: "1" +spec: + owner: nearone-team + type: library + lifecycle: production diff --git a/near/omni-token/Cargo.toml b/near/omni-token/Cargo.toml new file mode 100644 index 00000000..575720b9 --- /dev/null +++ b/near/omni-token/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "omni-token" +version = "0.1.0" +authors = ["Karim Alabtakh "] +edition = "2021" +publish = false + +[lib] +crate-type = ["cdylib", "rlib"] + +[dependencies] +near-sdk.workspace = true +near-contract-standards.workspace = true +omni-types.workspace = true diff --git a/near/omni-token/src/lib.rs b/near/omni-token/src/lib.rs new file mode 100644 index 00000000..4a7852c9 --- /dev/null +++ b/near/omni-token/src/lib.rs @@ -0,0 +1,287 @@ +use near_contract_standards::fungible_token::metadata::{ + FungibleTokenMetadata, FungibleTokenMetadataProvider, FT_METADATA_SPEC, +}; +use near_contract_standards::fungible_token::{ + FungibleToken, FungibleTokenCore, FungibleTokenResolver, +}; +use near_contract_standards::storage_management::{ + StorageBalance, StorageBalanceBounds, StorageManagement, +}; +use near_sdk::collections::LazyOption; +use near_sdk::json_types::{Base64VecU8, U128}; +use near_sdk::serde_json::json; +use near_sdk::{ + env, ext_contract, near, require, AccountId, Gas, NearToken, PanicOnDefault, Promise, + PromiseOrValue, PublicKey, +}; +use omni_ft::{MetadataManagment, MintAndBurn, UpgradeAndMigrate}; +use omni_types::{BasicMetadata, OmniAddress}; +const OUTER_UPGRADE_GAS: Gas = Gas::from_tgas(15); +const NO_DEPOSIT: NearToken = NearToken::from_yoctonear(0); +const CURRENT_STATE_VERSION: u32 = 1; + +pub mod omni_ft; + +#[near(contract_state)] +#[derive(PanicOnDefault)] +pub struct OmniToken { + controller: AccountId, + token: FungibleToken, + metadata: LazyOption, +} + +#[ext_contract(ext_omni_factory)] +pub trait ExtOmniTokenFactory { + fn init_transfer( + &self, + sender: AccountId, + amount: U128, + recipient: OmniAddress, + fee: U128, + native_fee: U128, + ) -> Promise; +} + +#[near] +impl OmniToken { + #[init] + pub fn new(controller: AccountId, metadata: BasicMetadata) -> Self { + let current_account_id = env::current_account_id(); + let deployer_account = current_account_id + .get_parent_account_id() + .unwrap_or_else(|| env::panic_str("ERR_INVALID_PARENT_ACCOUNT")); + + require!( + env::predecessor_account_id().as_str() == deployer_account, + "Only the deployer account can init this contract" + ); + + Self { + controller, + token: FungibleToken::new(b"t".to_vec()), + metadata: LazyOption::new( + b"m".to_vec(), + Some(&FungibleTokenMetadata { + spec: FT_METADATA_SPEC.to_string(), + name: metadata.name, + symbol: metadata.symbol, + icon: None, + reference: None, + reference_hash: None, + decimals: metadata.decimals, + }), + ), + } + } + + #[private] + #[init(ignore_state)] + #[allow(unused_variables)] + pub fn migrate(from_version: u32) -> Self { + env::state_read().unwrap_or_else(|| env::panic_str("ERR_FAILED_TO_READ_STATE")) + } + + /// Attach a new full access to the current contract. + pub fn attach_full_access_key(&mut self, public_key: PublicKey) -> Promise { + self.assert_controller(); + Promise::new(env::current_account_id()).add_full_access_key(public_key) + } + + pub fn version(&self) -> String { + env!("CARGO_PKG_VERSION").to_owned() + } + + fn assert_controller(&self) { + let caller = env::predecessor_account_id(); + require!(caller == self.controller, "ERR_MISSING_PERMISSION"); + } +} + +#[near] +impl MintAndBurn for OmniToken { + #[payable] + fn mint( + &mut self, + account_id: AccountId, + amount: U128, + msg: Option, + ) -> PromiseOrValue { + self.assert_controller(); + + if let Some(msg) = msg { + self.token + .internal_deposit(&env::predecessor_account_id(), amount.into()); + + self.ft_transfer_call(account_id, amount, None, msg) + } else { + self.token.internal_deposit(&account_id, amount.into()); + PromiseOrValue::Value(amount) + } + } + + fn burn(&mut self, amount: U128) { + self.assert_controller(); + + self.token + .internal_withdraw(&env::predecessor_account_id(), amount.into()); + } +} + +#[near] +impl MetadataManagment for OmniToken { + fn set_metadata( + &mut self, + name: Option, + symbol: Option, + reference: Option, + reference_hash: Option, + decimals: Option, + icon: Option, + ) { + self.assert_controller(); + + let mut metadata = self.ft_metadata(); + if let Some(name) = name { + metadata.name = name; + } + if let Some(symbol) = symbol { + metadata.symbol = symbol; + } + if let Some(reference) = reference { + metadata.reference = Some(reference); + } + if let Some(reference_hash) = reference_hash { + metadata.reference_hash = Some(reference_hash); + } + if let Some(decimals) = decimals { + // Decimals can't be changed if it's already set. + if decimals != 0 { + metadata.decimals = decimals; + } + } + if let Some(icon) = icon { + metadata.icon = Some(icon); + } + + self.metadata.set(&metadata); + } +} + +#[near] +impl UpgradeAndMigrate for OmniToken { + fn upgrade_and_migrate(&self) { + self.assert_controller(); + + // Receive the code directly from the input to avoid the + // GAS overhead of deserializing parameters + let code = env::input().unwrap_or_else(|| env::panic_str("ERR_NO_INPUT")); + // Deploy the contract code. + let promise_id = env::promise_batch_create(&env::current_account_id()); + env::promise_batch_action_deploy_contract(promise_id, &code); + // Call promise to migrate the state. + // Batched together to fail upgrade if migration fails. + env::promise_batch_action_function_call( + promise_id, + "migrate", + &json!({ "from_version": CURRENT_STATE_VERSION }) + .to_string() + .into_bytes(), + NO_DEPOSIT, + env::prepaid_gas() + .saturating_sub(env::used_gas()) + .saturating_sub(OUTER_UPGRADE_GAS), + ); + env::promise_return(promise_id); + } +} + +#[near] +impl FungibleTokenCore for OmniToken { + #[payable] + fn ft_transfer(&mut self, receiver_id: AccountId, amount: U128, memo: Option) { + self.token.ft_transfer(receiver_id, amount, memo); + } + + #[payable] + fn ft_transfer_call( + &mut self, + receiver_id: AccountId, + amount: U128, + memo: Option, + msg: String, + ) -> PromiseOrValue { + self.token.ft_transfer_call(receiver_id, amount, memo, msg) + } + + fn ft_total_supply(&self) -> U128 { + self.token.ft_total_supply() + } + + fn ft_balance_of(&self, account_id: AccountId) -> U128 { + self.token.ft_balance_of(account_id) + } +} + +#[near] +impl FungibleTokenResolver for OmniToken { + #[private] + fn ft_resolve_transfer( + &mut self, + sender_id: AccountId, + receiver_id: AccountId, + amount: U128, + ) -> U128 { + let (used_amount, _burned_amount) = + self.token + .internal_ft_resolve_transfer(&sender_id, receiver_id, amount); + + used_amount.into() + } +} + +#[near] +impl StorageManagement for OmniToken { + #[payable] + fn storage_deposit( + &mut self, + account_id: Option, + registration_only: Option, + ) -> StorageBalance { + self.token.storage_deposit(account_id, registration_only) + } + + #[payable] + fn storage_withdraw(&mut self, amount: Option) -> StorageBalance { + self.token.storage_withdraw(amount) + } + + #[payable] + fn storage_unregister(&mut self, force: Option) -> bool { + self.token.internal_storage_unregister(force).is_some() + } + + fn storage_balance_bounds(&self) -> StorageBalanceBounds { + self.token.storage_balance_bounds() + } + + fn storage_balance_of(&self, account_id: AccountId) -> Option { + self.token.storage_balance_of(account_id) + } +} + +#[near] +impl FungibleTokenMetadataProvider for OmniToken { + fn ft_metadata(&self) -> FungibleTokenMetadata { + self.metadata + .get() + .unwrap_or_else(|| FungibleTokenMetadata { + spec: FT_METADATA_SPEC.to_string(), + name: String::default(), + symbol: String::default(), + icon: None, + reference: None, + reference_hash: None, + decimals: 0, + }) + } +} diff --git a/near/omni-token/src/omni_ft.rs b/near/omni-token/src/omni_ft.rs new file mode 100644 index 00000000..85ab4a75 --- /dev/null +++ b/near/omni-token/src/omni_ft.rs @@ -0,0 +1,35 @@ +use near_sdk::{ + ext_contract, + json_types::{Base64VecU8, U128}, + AccountId, PromiseOrValue, +}; + +#[ext_contract(ext_mint_and_burn)] +pub trait MintAndBurn { + fn mint( + &mut self, + account_id: AccountId, + amount: U128, + msg: Option, + ) -> PromiseOrValue; + + fn burn(&mut self, amount: U128); +} + +#[ext_contract(ext_metadata_managment)] +pub trait MetadataManagment { + fn set_metadata( + &mut self, + name: Option, + symbol: Option, + reference: Option, + reference_hash: Option, + decimals: Option, + icon: Option, + ); +} + +#[ext_contract(ext_upgrade_and_migrate)] +pub trait UpgradeAndMigrate { + fn upgrade_and_migrate(&self); +} diff --git a/near/omni-types/.catalog-info.yaml b/near/omni-types/.catalog-info.yaml new file mode 100644 index 00000000..0bb0aab0 --- /dev/null +++ b/near/omni-types/.catalog-info.yaml @@ -0,0 +1,14 @@ +apiVersion: backstage.io/v1alpha1 +kind: Component +metadata: + name: omni-types + title: Omni Bridge Protocol omni-types + tags: + - near + links: [] + annotations: + aurora.dev/security-tier: "1" +spec: + owner: nearone-team + type: library + lifecycle: production diff --git a/near/omni-types/src/evm/events.rs b/near/omni-types/src/evm/events.rs index dc39b7e9..9f5b250b 100644 --- a/near/omni-types/src/evm/events.rs +++ b/near/omni-types/src/evm/events.rs @@ -3,8 +3,10 @@ use alloy_rlp::Decodable; use alloy_sol_types::{sol, SolEvent}; use crate::{ - prover_result::{DeployTokenMessage, FinTransferMessage, InitTransferMessage}, - stringify, ChainKind, Fee, OmniAddress, TransferMessage, H160, + prover_result::{ + DeployTokenMessage, FinTransferMessage, InitTransferMessage, LogMetadataMessage, + }, + stringify, ChainKind, Fee, OmniAddress, H160, }; const ERR_INVALIDE_SIGNATURE_HASH: &str = "ERR_INVALIDE_SIGNATURE_HASH"; @@ -13,17 +15,18 @@ sol! { event InitTransfer( address indexed sender, address indexed tokenAddress, - uint128 indexed nonce, - string token, + uint64 indexed originNonce, uint128 amount, uint128 fee, uint128 nativeTokenFee, - string recipient + string recipient, + string message ); event FinTransfer( - uint128 indexed nonce, - string token, + uint8 indexed originChain, + uint64 indexed originNonce, + address tokenAddress, uint128 amount, address recipient, string feeRecipient @@ -34,10 +37,19 @@ sol! { string token, string name, string symbol, + uint8 decimals, + uint8 originDecimals + ); + + event LogMetadata( + address indexed tokenAddress, + string name, + string symbol, uint8 decimals ); } +#[allow(clippy::needless_pass_by_value)] pub fn parse_evm_event>>( chain_kind: ChainKind, log_rlp: Vec, @@ -67,10 +79,16 @@ impl TryFromLog> for FinTransferMessage { } Ok(FinTransferMessage { - nonce: near_sdk::json_types::U128(event.data.nonce), + transfer_id: crate::TransferId { + origin_chain: event.data.originChain.try_into()?, + origin_nonce: event.data.originNonce, + }, amount: near_sdk::json_types::U128(event.data.amount), fee_recipient: event.data.feeRecipient.parse().map_err(stringify)?, - emitter_address: OmniAddress::from_evm_address(chain_kind, H160(event.address.into()))?, + emitter_address: OmniAddress::new_from_evm_address( + chain_kind, + H160(event.address.into()), + )?, }) } } @@ -84,18 +102,20 @@ impl TryFromLog> for InitTransferMessage { } Ok(InitTransferMessage { - emitter_address: OmniAddress::from_evm_address(chain_kind, H160(event.address.into()))?, - transfer: TransferMessage { - origin_nonce: near_sdk::json_types::U128(event.data.nonce), - token: event.data.token.parse().map_err(stringify)?, - amount: near_sdk::json_types::U128(event.data.amount), - recipient: event.data.recipient.parse().map_err(stringify)?, - fee: Fee { - fee: near_sdk::json_types::U128(event.data.fee), - native_fee: near_sdk::json_types::U128(event.data.nativeTokenFee), - }, - sender: OmniAddress::from_evm_address(chain_kind, H160(event.data.sender.into()))?, + emitter_address: OmniAddress::new_from_evm_address( + chain_kind, + H160(event.address.into()), + )?, + origin_nonce: event.data.originNonce, + token: OmniAddress::new_from_evm_address(chain_kind, H160(event.tokenAddress.into()))?, + amount: near_sdk::json_types::U128(event.data.amount), + recipient: event.data.recipient.parse().map_err(stringify)?, + fee: Fee { + fee: near_sdk::json_types::U128(event.data.fee), + native_fee: near_sdk::json_types::U128(event.data.nativeTokenFee), }, + sender: OmniAddress::new_from_evm_address(chain_kind, H160(event.data.sender.into()))?, + msg: event.data.message, }) } } @@ -109,12 +129,42 @@ impl TryFromLog> for DeployTokenMessage { } Ok(DeployTokenMessage { - emitter_address: OmniAddress::from_evm_address(chain_kind, H160(event.address.into()))?, token: event.data.token.parse().map_err(stringify)?, - token_address: OmniAddress::from_evm_address( + token_address: OmniAddress::new_from_evm_address( + chain_kind, + H160(event.data.tokenAddress.into()), + )?, + decimals: event.data.decimals, + origin_decimals: event.data.originDecimals, + emitter_address: OmniAddress::new_from_evm_address( + chain_kind, + H160(event.address.into()), + )?, + }) + } +} + +impl TryFromLog> for LogMetadataMessage { + type Error = String; + + fn try_from_log(chain_kind: ChainKind, event: Log) -> Result { + if event.topics().0 != LogMetadata::SIGNATURE_HASH { + return Err(ERR_INVALIDE_SIGNATURE_HASH.to_string()); + } + + Ok(LogMetadataMessage { + token_address: OmniAddress::new_from_evm_address( chain_kind, H160(event.data.tokenAddress.into()), )?, + name: event.data.name, + symbol: event.data.symbol, + decimals: event.data.decimals, + + emitter_address: OmniAddress::new_from_evm_address( + chain_kind, + H160(event.address.into()), + )?, }) } } @@ -126,8 +176,9 @@ mod tests { use super::*; sol! { event TestFinTransfer( - uint128 indexed nonce, - string token, + uint8 indexed originChain, + uint64 indexed originNonce, + address tokenAddress, uint128 amount, address recipient, string feeRecipient @@ -137,16 +188,18 @@ mod tests { #[test] fn test_decode_log_with_same_params_with_validation() { let event = FinTransfer { - nonce: 55, + originChain: 1, + originNonce: 50, amount: 100, - token: "some_token".to_owned(), + tokenAddress: [0; 20].into(), recipient: [0; 20].into(), feeRecipient: "some_fee_recipient".to_owned(), }; let test_event = TestFinTransfer { - nonce: event.nonce, + originChain: event.originChain, + originNonce: event.originNonce, amount: event.amount, - token: event.token.clone(), + tokenAddress: event.tokenAddress, recipient: event.recipient, feeRecipient: event.feeRecipient.clone(), }; diff --git a/near/omni-types/src/evm/header.rs b/near/omni-types/src/evm/header.rs index c66872b5..a2c0b158 100644 --- a/near/omni-types/src/evm/header.rs +++ b/near/omni-types/src/evm/header.rs @@ -1,7 +1,7 @@ pub use ethereum_types::{Address, Bloom, H256, H64, U256, U64}; use rlp::{Decodable, DecoderError, Encodable, Rlp, RlpStream}; -use super::utils::keccak256; +use crate::utils::keccak256; #[derive(Default, Debug, Clone)] pub struct BlockHeader { diff --git a/near/omni-types/src/evm/mod.rs b/near/omni-types/src/evm/mod.rs index 220e5692..1941e45c 100644 --- a/near/omni-types/src/evm/mod.rs +++ b/near/omni-types/src/evm/mod.rs @@ -1,4 +1,3 @@ -pub mod header; pub mod events; +pub mod header; pub mod receipt; -pub mod utils; \ No newline at end of file diff --git a/near/omni-types/src/lib.rs b/near/omni-types/src/lib.rs index 6382fb85..ddd9e43c 100644 --- a/near/omni-types/src/lib.rs +++ b/near/omni-types/src/lib.rs @@ -6,6 +6,7 @@ use near_sdk::json_types::U128; use near_sdk::serde::{Deserialize, Serialize}; use near_sdk::AccountId; use serde::de::Visitor; +use sol_address::SolAddress; pub mod evm; pub mod locker_args; @@ -13,6 +14,11 @@ pub mod mpc_types; pub mod near_events; pub mod prover_args; pub mod prover_result; +pub mod sol_address; +pub mod utils; + +#[cfg(test)] +mod tests; #[derive(BorshDeserialize, BorshSerialize, Debug, Clone, PartialEq, Eq)] pub struct H160(pub [u8; 20]); @@ -26,7 +32,7 @@ impl FromStr for H160 { } else { s }; - let result = Vec::from_hex(s).map_err(|err| err.to_string())?; + let result = Vec::from_hex(s).map_err(|_| "ERR_INVALIDE_HEX")?; Ok(H160( result .try_into() @@ -42,10 +48,16 @@ impl fmt::Display for H160 { } impl H160 { + pub const ZERO: Self = Self([0u8; 20]); + + pub fn is_zero(&self) -> bool { + *self == Self::ZERO + } + pub fn to_eip_55_checksum(&self) -> String { let hex_addr = hex::encode(self.0); - let hash = evm::utils::keccak256(hex_addr.as_bytes()); + let hash = utils::keccak256(hex_addr.as_bytes()); let mut result = String::with_capacity(40); @@ -127,8 +139,10 @@ impl Serialize for H160 { Serialize, Deserialize, strum_macros::AsRefStr, + Default, )] pub enum ChainKind { + #[default] Eth, Near, Sol, @@ -142,25 +156,70 @@ impl From<&OmniAddress> for ChainKind { } } +impl TryFrom for ChainKind { + type Error = String; + fn try_from(input: u8) -> Result { + match input { + 0 => Ok(ChainKind::Eth), + 1 => Ok(ChainKind::Near), + 2 => Ok(ChainKind::Sol), + 3 => Ok(ChainKind::Arb), + 4 => Ok(ChainKind::Base), + _ => Err(format!("{input:?} invalid chain kind")), + } + } +} + pub type EvmAddress = H160; +pub const ZERO_ACCOUNT_ID: &str = + "0000000000000000000000000000000000000000000000000000000000000000"; + #[derive(BorshDeserialize, BorshSerialize, Debug, Clone, PartialEq, Eq)] pub enum OmniAddress { Eth(EvmAddress), - Near(String), - Sol(String), + Near(AccountId), + Sol(SolAddress), Arb(EvmAddress), Base(EvmAddress), } impl OmniAddress { - pub fn from_evm_address(chain_kind: ChainKind, address: EvmAddress) -> Result { + #[allow(clippy::missing_panics_doc)] + pub fn new_zero(chain_kind: ChainKind) -> Result { + match chain_kind { + ChainKind::Eth => Ok(OmniAddress::Eth(H160::ZERO)), + ChainKind::Near => Ok(OmniAddress::Near( + ZERO_ACCOUNT_ID.parse().map_err(stringify)?, + )), + ChainKind::Sol => Ok(OmniAddress::Sol(SolAddress::ZERO)), + ChainKind::Arb => Ok(OmniAddress::Arb(H160::ZERO)), + ChainKind::Base => Ok(OmniAddress::Base(H160::ZERO)), + } + } + + pub fn new_from_evm_address( + chain_kind: ChainKind, + address: EvmAddress, + ) -> Result { match chain_kind { ChainKind::Eth => Ok(Self::Eth(address)), + ChainKind::Arb => Ok(Self::Arb(address)), + ChainKind::Base => Ok(Self::Base(address)), _ => Err(format!("{chain_kind:?} is not an EVM chain")), } } + pub fn new_from_slice(chain_kind: ChainKind, address: &[u8]) -> Result { + match chain_kind { + ChainKind::Sol => Ok(Self::Sol(Self::to_sol_address(address)?)), + ChainKind::Eth | ChainKind::Arb | ChainKind::Base => { + Self::new_from_evm_address(chain_kind, Self::to_evm_address(address)?) + } + ChainKind::Near => Ok(Self::Near(Self::to_near_account_id(address)?)), + } + } + pub fn get_chain(&self) -> ChainKind { match self { OmniAddress::Eth(_) => ChainKind::Eth, @@ -170,18 +229,97 @@ impl OmniAddress { OmniAddress::Base(_) => ChainKind::Base, } } + + pub fn encode(&self, separator: char, skip_zero_address: bool) -> String { + let (chain_str, address) = match self { + OmniAddress::Eth(address) => ("eth", address.to_string()), + OmniAddress::Near(address) => ("near", address.to_string()), + OmniAddress::Sol(address) => ("sol", address.to_string()), + OmniAddress::Arb(address) => ("arb", address.to_string()), + OmniAddress::Base(address) => ("base", address.to_string()), + }; + + if skip_zero_address && self.is_zero() { + chain_str.to_string() + } else { + format!("{chain_str}{separator}{address}") + } + } + + pub fn is_zero(&self) -> bool { + match self { + OmniAddress::Eth(address) | OmniAddress::Arb(address) | OmniAddress::Base(address) => { + address.is_zero() + } + OmniAddress::Near(address) => *address == ZERO_ACCOUNT_ID, + OmniAddress::Sol(address) => address.is_zero(), + } + } + + pub fn get_token_prefix(&self) -> String { + match self { + OmniAddress::Sol(address) => { + if self.is_zero() { + "sol".to_string() + } else { + // The AccountId on Near can't be uppercased and has a 64 character limit, + // so we encode the solana address into 20 bytes to bypass these restrictions + let hashed_address = H160( + utils::keccak256(&address.0)[12..] + .try_into() + .unwrap_or_default(), + ) + .to_string(); + format!("sol-{hashed_address}") + } + } + OmniAddress::Eth(address) => { + if self.is_zero() { + "eth".to_string() + } else { + address.to_string()[2..].to_string() + } + } + _ => self.encode('-', true), + } + } + + fn to_evm_address(address: &[u8]) -> Result { + let address = if address.len() == 32 { + &address[address.len() - 20..] + } else { + address + }; + + match address.try_into() { + Ok(bytes) => Ok(H160(bytes)), + Err(_) => Err("Invalid EVM address".to_string()), + } + } + + fn to_sol_address(address: &[u8]) -> Result { + match address.try_into() { + Ok(bytes) => Ok(SolAddress(bytes)), + Err(_) => Err("Invalid SOL address".to_string()), + } + } + + fn to_near_account_id(address: &[u8]) -> Result { + AccountId::from_str(&String::from_utf8(address.to_vec()).map_err(stringify)?) + .map_err(stringify) + } } impl FromStr for OmniAddress { type Err = String; fn from_str(input: &str) -> Result { - let (chain, recipient) = input.split_once(':').ok_or("Invalid OmniAddress format")?; + let (chain, recipient) = input.split_once(':').unwrap_or(("eth", input)); match chain { "eth" => Ok(OmniAddress::Eth(recipient.parse().map_err(stringify)?)), - "near" => Ok(OmniAddress::Near(recipient.to_owned())), - "sol" => Ok(OmniAddress::Sol(recipient.to_owned())), // TODO validate sol address + "near" => Ok(OmniAddress::Near(recipient.parse().map_err(stringify)?)), + "sol" => Ok(OmniAddress::Sol(recipient.parse().map_err(stringify)?)), "arb" => Ok(OmniAddress::Arb(recipient.parse().map_err(stringify)?)), "base" => Ok(OmniAddress::Base(recipient.parse().map_err(stringify)?)), _ => Err(format!("Chain {chain} is not supported")), @@ -191,14 +329,7 @@ impl FromStr for OmniAddress { impl fmt::Display for OmniAddress { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let (chain_str, recipient) = match self { - OmniAddress::Eth(recipient) => ("eth", recipient.to_string()), - OmniAddress::Near(recipient) => ("near", recipient.to_string()), - OmniAddress::Sol(recipient) => ("sol", recipient.clone()), - OmniAddress::Arb(recipient) => ("arb", recipient.to_string()), - OmniAddress::Base(recipient) => ("base", recipient.to_string()), - }; - write!(f, "{}:{}", chain_str, recipient) + write!(f, "{}", &self.encode(':', false)) } } @@ -237,38 +368,6 @@ impl<'de> Deserialize<'de> for OmniAddress { } } -#[derive(BorshDeserialize, BorshSerialize, Serialize, Deserialize, Debug, Clone)] -pub struct NearRecipient { - pub target: AccountId, - pub message: Option, -} - -impl FromStr for NearRecipient { - type Err = String; - - fn from_str(input: &str) -> Result { - let (target, message) = input.split_once(':').map_or_else( - || (input, None), - |(recipient, msg)| (recipient, Some(msg.to_owned())), - ); - - Ok(Self { - target: target.parse().map_err(stringify)?, - message, - }) - } -} - -impl fmt::Display for NearRecipient { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - if let Some(message) = &self.message { - write!(f, "{}:{}", self.target, message) - } else { - write!(f, "{}", self.target) - } - } -} - #[derive(Serialize, Deserialize, Debug, Clone)] pub struct InitTransferMsg { pub recipient: OmniAddress, @@ -282,12 +381,6 @@ pub struct FeeRecipient { pub native_fee_recipient: OmniAddress, } -#[derive(BorshDeserialize, BorshSerialize, Serialize, Deserialize, Debug, Clone)] -pub struct NativeFee { - pub amount: U128, - pub recipient: OmniAddress, -} - #[derive( BorshDeserialize, BorshSerialize, Serialize, Deserialize, Debug, Clone, PartialEq, Default, )] @@ -302,15 +395,35 @@ impl Fee { } } -pub type TransferId = (ChainKind, Nonce); +#[derive( + BorshDeserialize, + BorshSerialize, + Serialize, + Deserialize, + Debug, + Clone, + PartialEq, + Eq, + Default, + Copy, +)] +pub struct TransferId { + // The origin chain kind + pub origin_chain: ChainKind, + // The transfer nonce that maintained on the source chain + pub origin_nonce: Nonce, +} + #[derive(BorshDeserialize, BorshSerialize, Serialize, Deserialize, Debug, Clone)] pub struct TransferMessage { - pub origin_nonce: U128, - pub token: AccountId, + pub origin_nonce: Nonce, + pub token: OmniAddress, pub amount: U128, pub recipient: OmniAddress, pub fee: Fee, pub sender: OmniAddress, + pub msg: String, + pub destination_nonce: Nonce, } impl TransferMessage { @@ -319,24 +432,42 @@ impl TransferMessage { } pub fn get_transfer_id(&self) -> TransferId { - (self.get_origin_chain(), self.origin_nonce.0) + TransferId { + origin_chain: self.get_origin_chain(), + origin_nonce: self.origin_nonce, + } } + + pub fn get_destination_chain(&self) -> ChainKind { + self.recipient.get_chain() + } +} + +#[derive(BorshDeserialize, BorshSerialize, Serialize, Deserialize, Debug, Clone)] +pub enum PayloadType { + TransferMessage, + Metadata, + ClaimNativeFee, } #[derive(BorshDeserialize, BorshSerialize, Serialize, Deserialize, Debug, Clone)] pub struct TransferMessagePayload { - pub nonce: U128, - pub token: AccountId, + pub prefix: PayloadType, + pub destination_nonce: Nonce, + pub transfer_id: TransferId, + pub token_address: OmniAddress, pub amount: U128, pub recipient: OmniAddress, pub fee_recipient: Option, } #[derive(BorshDeserialize, BorshSerialize, Serialize, Deserialize, Debug, Clone)] -pub struct ClaimNativeFeePayload { - pub nonces: Vec, - pub amount: U128, - pub recipient: OmniAddress, +pub struct MetadataPayload { + pub prefix: PayloadType, + pub token: String, + pub name: String, + pub symbol: String, + pub decimals: u8, } #[derive(Deserialize, Serialize, Clone)] @@ -353,35 +484,15 @@ pub enum UpdateFee { Proof(Vec), } -#[derive(Debug, Eq, PartialEq, BorshSerialize, BorshDeserialize, Serialize, Deserialize, Clone)] -pub struct MetadataPayload { - pub token: String, - pub name: String, - pub symbol: String, - pub decimals: u8, -} - -pub type Nonce = u128; +pub type Nonce = u64; pub fn stringify(item: T) -> String { item.to_string() } -#[cfg(test)] -mod test { - use super::*; - - use near_sdk::serde_json; - - #[test] - fn test_omni_address_serialization() { - let address_str = "0x5a08feed678c056650b3eb4a5cb1b9bb6f0fe265"; - let address = OmniAddress::Eth(H160::from_str(address_str).unwrap()); - - let serialized = serde_json::to_string(&address).unwrap(); - let deserialized = serde_json::from_str(&serialized).unwrap(); - - assert_eq!(serialized, format!("\"eth:{address_str}\"")); - assert_eq!(address, deserialized); - } +#[derive(Deserialize, Serialize, Clone)] +pub struct BasicMetadata { + pub name: String, + pub symbol: String, + pub decimals: u8, } diff --git a/near/omni-types/src/locker_args.rs b/near/omni-types/src/locker_args.rs index 6c02a516..7ea3d8c4 100644 --- a/near/omni-types/src/locker_args.rs +++ b/near/omni-types/src/locker_args.rs @@ -1,20 +1,20 @@ -use crate::{ChainKind, OmniAddress}; +use crate::ChainKind; use near_sdk::{ borsh::{self, BorshDeserialize, BorshSerialize}, AccountId, }; #[derive(BorshDeserialize, BorshSerialize, Clone)] -pub struct StorageDepositArgs { - pub token: AccountId, - pub accounts: Vec<(AccountId, bool)>, +pub struct StorageDepositAction { + pub token_id: AccountId, + pub account_id: AccountId, + pub storage_deposit_amount: Option, } #[derive(BorshDeserialize, BorshSerialize, Clone)] pub struct FinTransferArgs { pub chain_kind: ChainKind, - pub native_fee_recipient: OmniAddress, - pub storage_deposit_args: StorageDepositArgs, + pub storage_deposit_actions: Vec, pub prover_args: Vec, } @@ -22,7 +22,6 @@ pub struct FinTransferArgs { pub struct ClaimFeeArgs { pub chain_kind: ChainKind, pub prover_args: Vec, - pub native_fee_recipient: OmniAddress, } #[derive(BorshDeserialize, BorshSerialize, Clone)] @@ -30,3 +29,9 @@ pub struct BindTokenArgs { pub chain_kind: ChainKind, pub prover_args: Vec, } + +#[derive(BorshDeserialize, BorshSerialize, Clone)] +pub struct DeployTokenArgs { + pub chain_kind: ChainKind, + pub prover_args: Vec, +} diff --git a/near/omni-types/src/mpc_types.rs b/near/omni-types/src/mpc_types.rs index ed5a59d8..fb3320d9 100644 --- a/near/omni-types/src/mpc_types.rs +++ b/near/omni-types/src/mpc_types.rs @@ -19,9 +19,19 @@ pub struct SignatureResponse { } impl SignatureResponse { + /// # Panics + /// + /// This function will panic in the following cases: + /// - If `self.big_r.affine_point` is not a valid hexadecimal string. + /// - If `self.s.scalar` is not a valid hexadecimal string. + /// - If the decoded `self.big_r.affine_point` is shorter than 1 byte. + /// + /// The error message "Incorrect Signature" will be displayed in case of a panic. pub fn to_bytes(&self) -> Vec { let mut bytes = Vec::new(); - bytes.extend_from_slice(&hex::decode(&self.big_r.affine_point).expect("Incorrect Signature")[1..]); + bytes.extend_from_slice( + &hex::decode(&self.big_r.affine_point).expect("Incorrect Signature")[1..], + ); bytes.extend_from_slice(&hex::decode(&self.s.scalar).expect("Incorrect Signature")); bytes.push(self.recovery_id + 27); diff --git a/near/omni-types/src/near_events.rs b/near/omni-types/src/near_events.rs index 643a5355..e3dd1025 100644 --- a/near/omni-types/src/near_events.rs +++ b/near/omni-types/src/near_events.rs @@ -1,12 +1,11 @@ -use near_sdk::json_types::U128; use near_sdk::serde::{Deserialize, Serialize}; use near_sdk::serde_json::json; use crate::mpc_types::SignatureResponse; -use crate::{ClaimNativeFeePayload, MetadataPayload, TransferMessage, TransferMessagePayload}; +use crate::{MetadataPayload, TransferMessage, TransferMessagePayload}; #[derive(Deserialize, Serialize, Clone, Debug)] -pub enum Nep141LockerEvent { +pub enum OmniBridgeEvent { InitTransferEvent { transfer_message: TransferMessage, }, @@ -15,7 +14,6 @@ pub enum Nep141LockerEvent { message_payload: TransferMessagePayload, }, FinTransferEvent { - nonce: Option, transfer_message: TransferMessage, }, UpdateFeeEvent { @@ -25,13 +23,12 @@ pub enum Nep141LockerEvent { signature: SignatureResponse, metadata_payload: MetadataPayload, }, - SignClaimNativeFeeEvent { - signature: SignatureResponse, - claim_payload: ClaimNativeFeePayload, + ClaimFeeEvent { + transfer_message: TransferMessage, }, } -impl Nep141LockerEvent { +impl OmniBridgeEvent { pub fn to_log_string(&self) -> String { json!(self).to_string() } diff --git a/near/omni-types/src/prover_result.rs b/near/omni-types/src/prover_result.rs index 4723e801..9a40b1aa 100644 --- a/near/omni-types/src/prover_result.rs +++ b/near/omni-types/src/prover_result.rs @@ -3,17 +3,23 @@ use near_sdk::json_types::U128; use near_sdk::serde::{Deserialize, Serialize}; use near_sdk::AccountId; -use crate::{OmniAddress, TransferMessage}; +use crate::{Fee, Nonce, OmniAddress, TransferId}; #[derive(BorshDeserialize, BorshSerialize, Serialize, Deserialize, Debug, Clone)] pub struct InitTransferMessage { - pub transfer: TransferMessage, + pub origin_nonce: Nonce, + pub token: OmniAddress, + pub amount: U128, + pub recipient: OmniAddress, + pub fee: Fee, + pub sender: OmniAddress, + pub msg: String, pub emitter_address: OmniAddress, } #[derive(BorshDeserialize, BorshSerialize, Serialize, Deserialize, Debug, Clone)] pub struct FinTransferMessage { - pub nonce: U128, + pub transfer_id: TransferId, pub fee_recipient: AccountId, pub amount: U128, pub emitter_address: OmniAddress, @@ -23,6 +29,17 @@ pub struct FinTransferMessage { pub struct DeployTokenMessage { pub token: AccountId, pub token_address: OmniAddress, + pub decimals: u8, + pub origin_decimals: u8, + pub emitter_address: OmniAddress, +} + +#[derive(BorshDeserialize, BorshSerialize, Serialize, Deserialize, Debug, Clone)] +pub struct LogMetadataMessage { + pub token_address: OmniAddress, + pub name: String, + pub symbol: String, + pub decimals: u8, pub emitter_address: OmniAddress, } @@ -31,11 +48,15 @@ pub enum ProverResult { InitTransfer(InitTransferMessage), FinTransfer(FinTransferMessage), DeployToken(DeployTokenMessage), + LogMetadata(LogMetadataMessage), } -#[derive(BorshDeserialize, BorshSerialize, Serialize, Deserialize, Debug, Clone, Copy)] +#[derive( + BorshDeserialize, BorshSerialize, Serialize, Deserialize, Debug, Clone, Copy, Eq, PartialEq, +)] pub enum ProofKind { InitTransfer, FinTransfer, DeployToken, + LogMetadata, } diff --git a/near/omni-types/src/sol_address.rs b/near/omni-types/src/sol_address.rs new file mode 100644 index 00000000..77d4a30b --- /dev/null +++ b/near/omni-types/src/sol_address.rs @@ -0,0 +1,75 @@ +use core::fmt; +use core::str::FromStr; +use near_sdk::borsh::{self, BorshDeserialize, BorshSerialize}; +use near_sdk::bs58; +use near_sdk::serde::{Deserialize, Serialize}; +use serde::de::Visitor; + +#[derive(BorshDeserialize, BorshSerialize, Debug, Clone, PartialEq, Eq)] +pub struct SolAddress(pub [u8; 32]); + +impl SolAddress { + pub const ZERO: Self = Self([0u8; 32]); + + pub fn is_zero(&self) -> bool { + *self == Self::ZERO + } +} + +impl FromStr for SolAddress { + type Err = String; + + fn from_str(s: &str) -> Result { + let result = bs58::decode(s).into_vec().map_err(|err| err.to_string())?; + + Ok(SolAddress( + result + .try_into() + .map_err(|err| format!("Invalid length: {err:?}"))?, + )) + } +} + +impl fmt::Display for SolAddress { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{}", bs58::encode(self.0).into_string()) + } +} + +impl<'de> Deserialize<'de> for SolAddress { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + struct Base58Visitor; + + impl<'de> Visitor<'de> for Base58Visitor { + type Value = SolAddress; + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + formatter.write_str("a base58 string") + } + + fn visit_str(self, s: &str) -> Result + where + E: serde::de::Error, + { + s.parse().map_err(serde::de::Error::custom) + } + } + + deserializer.deserialize_str(Base58Visitor) + } +} + +impl Serialize for SolAddress { + fn serialize( + &self, + serializer: S, + ) -> Result<::Ok, ::Error> + where + S: serde::Serializer, + { + serializer.serialize_str(&self.to_string()) + } +} diff --git a/near/omni-types/src/tests/lib_test.rs b/near/omni-types/src/tests/lib_test.rs new file mode 100644 index 00000000..e8250129 --- /dev/null +++ b/near/omni-types/src/tests/lib_test.rs @@ -0,0 +1,458 @@ +use near_sdk::borsh; +use near_sdk::json_types::U128; +use near_sdk::serde_json; + +use crate::{ + stringify, ChainKind, Fee, OmniAddress, PayloadType, TransferId, TransferMessage, H160, +}; +use std::str::FromStr; + +#[test] +fn test_omni_address_serialization() { + let address_str = "0x5a08feed678c056650b3eb4a5cb1b9bb6f0fe265"; + let address = OmniAddress::Eth(H160::from_str(address_str).unwrap()); + + let serialized = serde_json::to_string(&address).unwrap(); + let deserialized = serde_json::from_str(&serialized).unwrap(); + + assert_eq!(serialized, format!("\"eth:{address_str}\"")); + assert_eq!(address, deserialized); +} + +#[test] +fn test_payload_prefix() { + let res = borsh::to_vec(&PayloadType::TransferMessage).unwrap(); + assert_eq!(hex::encode(res), "00"); + let res = borsh::to_vec(&PayloadType::Metadata).unwrap(); + assert_eq!(hex::encode(res), "01"); + let res = borsh::to_vec(&PayloadType::ClaimNativeFee).unwrap(); + assert_eq!(hex::encode(res), "02"); +} + +#[test] +fn test_h160_from_str() { + let addr = "5a08feed678c056650b3eb4a5cb1b9bb6f0fe265"; + let h160 = H160::from_str(addr).expect("Should parse without 0x prefix"); + assert_eq!(h160.to_string(), format!("0x{addr}")); + + let addr_with_prefix = format!("0x{addr}"); + let h160_with_prefix = H160::from_str(&addr_with_prefix).expect("Should parse with 0x prefix"); + assert_eq!(h160, h160_with_prefix); + + let invalid_hex = "0xnot_a_hex_string"; + let err = H160::from_str(invalid_hex).expect_err("Should fail with invalid hex"); + assert!(err.contains("ERR_INVALIDE_HEX"), "Error was: {err}"); + + let short_addr = "0x5a08"; + let err = H160::from_str(short_addr).expect_err("Should fail with invalid length"); + assert!(err.contains("Invalid length:"), "Error was: {err}"); +} + +#[test] +fn test_eip_55_checksum() { + let test_address = |input: &str, expected: &str, error_message: &str| { + let h160 = H160::from_str(input).expect("Valid address"); + assert_eq!( + h160.to_eip_55_checksum(), + expected, + "{error_message} {input} -> {expected}" + ); + }; + + let input = "0x5A08FeED678C056650b3eb4a5cb1b9BB6F0fE265"; + let expected = "5A08FeED678C056650b3eb4a5cb1b9BB6F0fE265"; + test_address(input, expected, "Original address"); + test_address(&input.to_lowercase(), expected, "Lowercase address"); + test_address( + &format!("0x{}", expected.to_ascii_uppercase()), + expected, + "Uppercase address", + ); + + let input = "0x1234567890123456789012345678901234567890"; + let expected = "1234567890123456789012345678901234567890"; + test_address(input, expected, "No mixed case address"); +} + +#[test] +fn test_h160_deserialization() { + let json = r#""0x5a08feed678c056650b3eb4a5cb1b9bb6f0fe265""#; + let h160: H160 = serde_json::from_str(json).expect("Should deserialize with 0x prefix"); + assert_eq!( + h160.to_string(), + "0x5a08feed678c056650b3eb4a5cb1b9bb6f0fe265", + "Should deserialize with 0x prefix" + ); + + let json = r#""5a08feed678c056650b3eb4a5cb1b9bb6f0fe265""#; + let h160: H160 = serde_json::from_str(json).expect("Should deserialize without 0x prefix"); + assert_eq!( + h160.to_string(), + "0x5a08feed678c056650b3eb4a5cb1b9bb6f0fe265", + "Should deserialize without 0x prefix" + ); + + let json = r#""0xnot_a_hex_string""#; + let result: Result = serde_json::from_str(json); + assert!(result.is_err(), "Should fail with invalid hex"); + let err = result.unwrap_err().to_string(); + assert!( + err.contains("ERR_INVALIDE_HEX"), + "Error was: {err} but expected ERR_INVALIDE_HEX" + ); + + let json = r#""0x5a08""#; + let result: Result = serde_json::from_str(json); + assert!(result.is_err(), "Should fail with invalid length"); + let err = result.unwrap_err().to_string(); + assert!( + err.contains("Invalid length"), + "Error was: {err} but expected Invalid length" + ); + + let json = "123"; + let result: Result = serde_json::from_str(json); + assert!(result.is_err(), "Should fail with non-string input"); + let err = result.unwrap_err().to_string(); + assert!( + err.contains("invalid type"), + "Error was: {err} but expected invalid type" + ); +} + +#[test] +fn test_h160_serialization() { + let addr = "5a08feed678c056650b3eb4a5cb1b9bb6f0fe265"; + let h160 = H160::from_str(addr).expect("Valid address"); + let serialized = serde_json::to_string(&h160).expect("Should serialize"); + assert_eq!( + serialized, r#""0x5a08feed678c056650b3eb4a5cb1b9bb6f0fe265""#, + "Invalid serialization." + ); + + let deserialized: H160 = serde_json::from_str(&serialized).expect("Should deserialize"); + assert_eq!( + h160, deserialized, + "Deserialization is not equal to initial value." + ); + + assert_eq!( + format!(r#""{}""#, h160.to_string()), + serialized, + "Serialization does not preserve format from to_string()" + ); +} + +#[test] +fn test_chain_kind_from_omni_address() { + let test_chain_kind = |addr: OmniAddress, expected: ChainKind, chain_name: &str| { + assert_eq!( + ChainKind::from(&addr), + expected, + "Invalid chain kind from {chain_name} address" + ); + }; + + let evm_address = + H160::from_str("0x5a08feed678c056650b3eb4a5cb1b9bb6f0fe265").expect("Valid address"); + + test_chain_kind(OmniAddress::Eth(evm_address.clone()), ChainKind::Eth, "ETH"); + test_chain_kind( + OmniAddress::Near("alice.near".parse().unwrap()), + ChainKind::Near, + "NEAR", + ); + test_chain_kind( + OmniAddress::Sol("11111111111111111111111111111111".parse().unwrap()), + ChainKind::Sol, + "SOL", + ); + test_chain_kind(OmniAddress::Arb(evm_address.clone()), ChainKind::Arb, "ARB"); + test_chain_kind(OmniAddress::Base(evm_address), ChainKind::Base, "BASE"); +} + +#[test] +fn test_omni_address_from_evm_address() { + let evm_address = + H160::from_str("0x5a08feed678c056650b3eb4a5cb1b9bb6f0fe265").expect("Valid address"); + + assert_eq!( + OmniAddress::new_from_evm_address(ChainKind::Eth, evm_address.clone()), + Ok(OmniAddress::Eth(evm_address.clone())) + ); + + for chain_kind in [ChainKind::Near, ChainKind::Sol] { + let expected_error = format!("{:?} is not an EVM chain", chain_kind); + assert_eq!( + OmniAddress::new_from_evm_address(chain_kind, evm_address.clone()), + Err(expected_error) + ); + } +} + +#[test] +fn test_omni_address_from_str() { + let evm_addr = "0x5a08feed678c056650b3eb4a5cb1b9bb6f0fe265"; + let test_cases = vec![ + ( + format!("eth:{}", evm_addr), + Ok(OmniAddress::Eth(H160::from_str(evm_addr).unwrap())), + "Should parse ETH address", + ), + ( + "near:alice.near".to_string(), + Ok(OmniAddress::Near("alice.near".parse().unwrap())), + "Should parse NEAR address", + ), + ( + "sol:11111111111111111111111111111111".to_string(), + Ok(OmniAddress::Sol( + "11111111111111111111111111111111".parse().unwrap(), + )), + "Should parse SOL address", + ), + ( + format!("arb:{}", evm_addr), + Ok(OmniAddress::Arb(H160::from_str(evm_addr).unwrap())), + "Should parse ARB address", + ), + ( + format!("base:{}", evm_addr), + Ok(OmniAddress::Base(H160::from_str(evm_addr).unwrap())), + "Should parse BASE address", + ), + ( + "invalid_format".to_string(), + Err("ERR_INVALIDE_HEX".to_string()), + "Should fail on missing chain prefix", + ), + ( + "unknown:address".to_string(), + Err("Chain unknown is not supported".to_string()), + "Should fail on unsupported chain", + ), + ]; + + for (input, expected, message) in test_cases { + let result = OmniAddress::from_str(&input); + assert_eq!(result, expected, "{}", message); + } +} + +#[test] +fn test_omni_address_display() { + let evm_addr = + H160::from_str("0x5a08feed678c056650b3eb4a5cb1b9bb6f0fe265").expect("Valid EVM address"); + let test_cases = vec![ + ( + OmniAddress::Eth(evm_addr.clone()), + format!("eth:{}", evm_addr), + "ETH address should format as eth:0x...", + ), + ( + OmniAddress::Near("alice.near".parse().unwrap()), + "near:alice.near".to_string(), + "NEAR address should format as near:account", + ), + ( + OmniAddress::Sol("11111111111111111111111111111111".parse().unwrap()), + "sol:11111111111111111111111111111111".to_string(), + "SOL address should format as sol:address", + ), + ( + OmniAddress::Arb(evm_addr.clone()), + format!("arb:{}", evm_addr), + "ARB address should format as arb:0x...", + ), + ( + OmniAddress::Base(evm_addr.clone()), + format!("base:{}", evm_addr), + "BASE address should format as base:0x...", + ), + ]; + + for (address, expected, message) in test_cases { + assert_eq!(address.to_string(), expected, "{}", message); + } +} + +#[test] +fn test_omni_address_visitor_expecting() { + let invalid_value = 123; + let expected_error = + "invalid type: integer `123`, expected a string in the format 'chain:address'"; + let message = "Should show expecting message for integer input"; + + let result: Result = serde_json::from_value(serde_json::json!(invalid_value)); + let error = result.unwrap_err().to_string(); + assert_eq!(error, expected_error, "{}", message); +} + +#[test] +fn test_fee_is_zero() { + let test_cases = vec![ + ( + Fee { + fee: U128(0), + native_fee: U128(0), + }, + true, + "Should return true when both fees are zero", + ), + ( + Fee { + fee: U128(1), + native_fee: U128(0), + }, + false, + "Should return false when fee is non-zero", + ), + ( + Fee { + fee: U128(0), + native_fee: U128(1), + }, + false, + "Should return false when native_fee is non-zero", + ), + ( + Fee { + fee: U128(1), + native_fee: U128(1), + }, + false, + "Should return false when both fees are non-zero", + ), + ]; + + for (fee, expected, message) in test_cases { + assert_eq!(fee.is_zero(), expected, "{}", message); + } +} + +#[test] +fn test_transfer_message_getters() { + let evm_addr = + H160::from_str("0x5a08feed678c056650b3eb4a5cb1b9bb6f0fe265").expect("Valid address"); + let test_cases = vec![ + ( + TransferMessage { + destination_nonce: 1, + origin_nonce: 123, + token: OmniAddress::Near("token.near".parse().unwrap()), + amount: U128(1000), + recipient: OmniAddress::Near("bob.near".parse().unwrap()), + fee: Fee::default(), + sender: OmniAddress::Eth(evm_addr.clone()), + msg: "".to_string(), + }, + ChainKind::Eth, + TransferId { + origin_chain: ChainKind::Eth, + origin_nonce: 123, + }, + "Should handle ETH sender", + ), + ( + TransferMessage { + destination_nonce: 1, + origin_nonce: 456, + token: OmniAddress::Near("token.near".parse().unwrap()), + amount: U128(2000), + recipient: OmniAddress::Eth(evm_addr.clone()), + fee: Fee::default(), + sender: OmniAddress::Near("alice.near".parse().unwrap()), + msg: "".to_string(), + }, + ChainKind::Near, + TransferId { + origin_chain: ChainKind::Near, + origin_nonce: 456, + }, + "Should handle NEAR sender", + ), + ( + TransferMessage { + destination_nonce: 1, + origin_nonce: 789, + token: OmniAddress::Near("token.near".parse().unwrap()), + amount: U128(3000), + recipient: OmniAddress::Near("carol.near".parse().unwrap()), + fee: Fee::default(), + sender: OmniAddress::Sol("11111111111111111111111111111111".parse().unwrap()), + msg: "".to_string(), + }, + ChainKind::Sol, + TransferId { + origin_chain: ChainKind::Sol, + origin_nonce: 789, + }, + "Should handle SOL sender", + ), + ]; + + for (message, expected_chain, expected_id, error_msg) in test_cases { + assert_eq!(message.get_origin_chain(), expected_chain, "{}", error_msg); + assert_eq!(message.get_transfer_id(), expected_id, "{}", error_msg); + } +} + +#[test] +fn test_stringify() { + assert_eq!(stringify(123), "123", "Should stringify integers"); + assert_eq!(stringify(42.5), "42.5", "Should stringify floats"); + assert_eq!(stringify(true), "true", "Should stringify booleans"); + assert_eq!(stringify('a'), "a", "Should stringify chars"); + + #[derive(Debug)] + struct CustomType(i32); + impl std::fmt::Display for CustomType { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + write!(f, "Custom({})", self.0) + } + } + + assert_eq!( + stringify(CustomType(42)), + "Custom(42)", + "Should stringify custom types with Display implementation" + ); +} + +#[test] +fn test_get_native_token_prefix() { + for chain_kind in [ + ChainKind::Near, + ChainKind::Sol, + ChainKind::Base, + ChainKind::Eth, + ChainKind::Arb, + ] { + let prefix = OmniAddress::new_zero(chain_kind) + .unwrap() + .get_token_prefix(); + assert_eq!( + prefix, + chain_kind.as_ref().to_lowercase(), + "Should return correct token prefix for {} chain", + chain_kind.as_ref() + ); + } +} + +#[test] +fn test_get_evm_token_prefix() { + let address = "0x23ddd3e3692d1861ed57ede224608875809e127f"; + let eth_address: OmniAddress = format!("eth:{address}").parse().unwrap(); + let prefix = eth_address.get_token_prefix(); + assert_eq!(prefix, "23ddd3e3692d1861ed57ede224608875809e127f"); + + for chain_kind in [ChainKind::Base, ChainKind::Arb] { + let chain_kind_prefix: String = chain_kind.as_ref().to_lowercase(); + let chain_address: OmniAddress = format!("{chain_kind_prefix}:{address}").parse().unwrap(); + assert_eq!( + chain_address.get_token_prefix(), + format!("{chain_kind_prefix}-{address}"), + ); + } +} diff --git a/near/omni-types/src/tests/mod.rs b/near/omni-types/src/tests/mod.rs new file mode 100644 index 00000000..a22a1ae4 --- /dev/null +++ b/near/omni-types/src/tests/mod.rs @@ -0,0 +1 @@ +pub mod lib_test; diff --git a/near/omni-types/src/evm/utils.rs b/near/omni-types/src/utils.rs similarity index 100% rename from near/omni-types/src/evm/utils.rs rename to near/omni-types/src/utils.rs diff --git a/near/res/evm_prover.wasm b/near/res/evm_prover.wasm new file mode 100755 index 0000000000000000000000000000000000000000..f408fa8a6ffa2ec630227e8125e2738308f03dde GIT binary patch literal 232531 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 literal 0 HcmV?d00001 diff --git a/near/res/omni_bridge.wasm b/near/res/omni_bridge.wasm new file mode 100755 index 0000000000000000000000000000000000000000..f97774a313b937bc69b92038e1952be2d11c1b5e GIT binary patch literal 577334 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

J;#%C6qPs$se;!rez1`waEN0< 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�NDq4KsicM&KvQo%S$h7#hl>(qB z;uN1=YLe+x3Ju~6Px3nR`PKKsN^Ze<s+dSD}K}cV{EFkX@Z{M1f+pB1yE_#KPLySj+LEyEd2fgXApW?k-1BX zaDXB8SiA$*5euqM1R;b^%p42<)eaSVnG-0po-$*U(Vp{i71&y@lOdnO_+=gjbMiKl zj=`m&5{@hi#eG^f7B@N~^gb?%oI@Yh%fMbB04Y7c=Iy@7KR=xkd(p!Bri;n8{W-7X zNhp5i>GwQpk-);2C&myMF<83M4d*$0w+&$XI%O8GzE3(U=XKey`3Ee zpMSa6%pMw-v1VL+42;f3GF8g7Wkl8*th75&sSi|Y1H~qn%&Q3M)iMog8iH|!JPVqo zcsIpO>abiP8RCa8XXe_6FGppN_pi|!AzMy45j}XU!mx&+_)EjG=m~LB#b$6I7^9`Y zrXnLnfrB#}m@BG)mcl(IR(~d3Y3r&=tlEgQ+p9-K_QXiCbX?qu%GE1fNQM@joZv83VpyQ+Nh!oqI57;L~mnCABWWFw78FR4dIryznio| z3F|SFIak>B!q_I1CtSBUxbPQ-WvTSy(oq_<9kZTDM9}SH`C&3#$BzK1)(a&kSJsnK zFC>4*B1@Q*FtOACh+m>d`&WC}r#M3Nzwi%%M8l#D`4Uw=et z`JBzl#jSc7xh)G7a7dRb&!1T0ZxYBNqAFjT1Gt_Qfq@GYG2iijV@{!+MZ@X_+VDTMrZ>AXnJR`23)Nq z2FhO6I196WG?4nz10T?2mXRV&3xje=z%J1p*K8s^#J9Un8k+GcPzhNrH4<&70u)-j8O~ZKZBksm$QTnV^X`K$oN~d`UaIWc{9PKKb<)=q{5?`0maZm%6=f7Z>^9^ns*jjOO zM2=UAW{m=kI`8sV)8@5Qa0<+Swwdmrx+LO2+L*0a;{J!)o=Z{Es$t-;<3oOleDIx< z<-R=i;207qN6$mUhSukLi0eQ^MrR#(Ti1FqaPUK_lM$}}WE-}W9XT3ThkEzh+PCeLgbekzdH?+Fbwh3WVo_K?=7G8{j&t!h_*c7zEmXb zJQ3Q?Vmg+Fe8h{+Y|JT^MM?W;1fnaZTme*JI=?AhE`m+ALH|rHjG$=Q35_--6e6c*&DWT~I( z5ilN4>FjXyxxU{o+cl_;u~z`hJa?auWK}- z3&Hz(4Y|P4QT_`$Y&`M>foONAzZgh zFq&}%g!>^;pGy@B23W)Ww+IVW@sfxc zsADH5nv#7Ax7j6pdgL0s$S;9|i`p zDZZ^{B}27?qKld})z=V6RZfcUMDTfI0bo66@+RtpUmny8zm1_SAVoXi!yiaFNnnG{ zM1t+dAGFI-(z06WmMMI-SKX`l>J#04yCr;O+*BVlU~wpW9Moo!D-mi!bQZA|$EWO7 z&eSnm3Y=yc{`4I+v50ma7-;vd)&gsv0Tx|pT3K{Kqxex9oY;&Ax1LLWr!(^oj)^vh z9Xu$N*5ju5^J>jsr}AsUZcC!l zd_czr3CrU?oR~3BAe1hAk4X7}T_P|_q@%>ICQ2f4Sve;ab{4CMvqn}kJ?auAd0iaw zEsA$V0+)FKX(BZ9C-#kUq}P>kY|f~}AhEA^F8!Km8%lP}EcsfXl*vzWUv9s6jlMJP z&;(6E>>pNZzqoK|l~A;-XolZhacw2Qw&%wL||x>2z|y@78y!uQw&xy<@pU9CSxC3n$szCeyUg5;=7TY zTJj!Y0Q#TB0AnUTgFV&WGov8K$t)EMG5~f?(d!5wYY(|eWfQULLaSPqiM01U!-nEh zGC?SGPZY;v630@$bv&6dZhaX=GU=LGTMZuo{8CXIqxdY5Yu^}{gsFZ0|5d_>8vf}e z%)L>bG!o{Xm?Bl!L<#~zVV+DhJcJ;D2wOs=c*}wEBZFEbj!Qg`{&$fdCK%|NHWT7{(H0?905!0!|aM=@~c+01hF{ze?jVs5_RGYq9`bli#`nHrc79B^moGdudo5?hJM zW+v<6O-2|^59S17rD>E&{`zcLOc}sJ*QnpoS0ma+16NlEZFRNM$!GyNr*)wIcx-@1 zU1irgs;k26L!;FuRLq^wqu;T3rtoS{ZZA*9VN!W5n(o9|pVbY|1d$ ziMRauogwSH3JFY7a7}eJY62^77v1|(IxX#?y_w&#-2QT>#zCyn6i_DiR-J@fv^vc= zqdIwL*V!_f{APzD(nirm+p!scx78$7d*rTaYG-O>24UOgG(SqZq{(x^PuQ4_+p_dM zMSQf#VCV`gvymt+mH8Qy6T{Z9-jR)=ao@lLP+sZhr57|t@ujN?QEjEhqDyL>-qX#p zMwUMtZ}5f$ZE}|_6FlK9X*V^Zv3j~ii}rL>fl{3G59;+&_IX#@3_yGDndw^#UcS^4 zy2mA7!QvqL+j{LS)3?@+GR4hebTg#v7NhJ$bEmimq>yq9bt&MEMJS@e5~~1oEUj*x ze%Ros<8QrQRB4dzsrKgJ^#9ygD={3!VFkBS(t&=c&Y57;vdgqRDDt>uTI<#{940$I zqhj`a!-Jm>lP!mtD+QcLdRcy^Hds`x4kPw9WE(^st1(RRQ^?ka2zD!)89=~}nMMZT zB`ns%;dnv?l$>({ar62__7LjtQjb?_Gtjwc3L^Vm+SNGO^E zyM{0~0YS#nQ>%$1C$Qb-`pl6LyNHoeBH~Ef^vlTIjws1bp~u0^_Ou)|_=um{SYrcc z0I>~2t^7y8|3?ZMwufzPn;zkx=t^;k4aY)*0eGNVK|oIc4j9tF7*F+cNhc^`ZVmNi z>ldm%c+8Fjyg~Ho>PcjSBCnvTz8@gkemI)!Y1Aih4!@-^eK7 zk5@3O(gJ~=-Zob%ertBsu%4rFOnbuBnMx?aVFFVQO zlb!ac22Kn@ha&=q3@~2P;Fuv|tVM-v$OJ>nSVYTML<@}?8aOZe8g)(Qxa$-{Oee*< zPf8>a+SkT`oZHyBE5~e02g6I7LT>G~qZ%`D4x;Qb{vLB$qf@wTRR5apHC@C|8@nhE zH1^_Pv(W@y#P=3XCZZTrk9&lMkQ??+VSKsBim+>^oDDThgz_xwaer!(o0gU-MBKDI zT+s%ct|19TCgx`AY&wo)HC>CrBGc}?k`Q{BVzz(ih#oHti3G$4d%gK>6+^xV1oj&K z6hlr%hKxue8-~n@&?}*E9;!}$y29nrUyRvA#{4C!7#dyW;X3O|Wq&>pBh@I67q8a1 zBlyEr?cRqQ+ix{dj60b~IMtK%<^A5kM0q2~mmOo@)G(o0k7lq$`p}GO_?3kjJiHQi zKy7;?_FhdgbB!&T5U_Y_F6Cz$j1Al+OGAcBh))QnakC5|`X0nxjh?o9Z9>qeGm%xG zC8$U<0wcfLM!u4VI5-biJtOP&PIrHch_>1@H_?AHp;<$#!FP;EeG{HpDS{T%dLUB-rLZX zS1DjJGDwcD#F}`v1|jO>QZ>dZ{;j4{>1zi_tiH2W{)((`t2b6~&HAk($=-*36FS0! z-GHu-#?LOtiHsXQz%BrebI(ZP|Ni}S4;T@;l5c}BBTg6Vm`E`C5*?vdjXh)g-tS!e zcQ<}>^E;Sm`e8S5$UGL{IB_n+;-52VF8pLKnHyStcCM8fmBN}EczXM2?DE*`y_^4o z&0x#7mcuhKnhzd#Z^T=j`4m=R@S!WI!Y$tXVA`mnjqFw51%~EmZ5e85#X_pzRx*4c zRnIB5dTPxm8i*Q8)x%;9Oe&njSt9N`E#DhD<72u6@W!MeBFmRte2}*0kY$#Y^i7LO zdPh9d1J;z%!MwywIN6+#=zKj7nTEyumY#NE#l1q&?k*N`s^}a6T*u^hYv+aSTDy zj~*kE(y&}t4>ruN>jT!K{b$DDnIjV0I@Mj8llj#2%!*>=A*)s&df4G>L`y1zSkcP( zN}cDB$|Vz6T6|dUJG`dhJzqe8gf(@6GmxQhsPDN3>EdyGiv-wNkcQ z%Boh%H3y`8%2H-pWo|woN%m6@)1ipww3ZNOF5>M^6D?@t9HNMWGQWU-eW1Vt*<^~DRC_F&t;8>y*Fu= z`;4cr+*$RXQf8IeaRY04tSx8oQ_71vlUee&`LU2zPsx7MQ%?6E?WmBIV0HTq=sn@( zM)tuklTd_r!#>5q3c45_zwk@76(8==-|Av?GTaJim0)cEC`nob%0jRUQ2dRrr`ief z|JmR!&EIv);4I&mcMV5O+kZD5xNNgpiEgJ~! zmPW(!*Tq%Mdu=zj{NfG5?VO}@rQsst|8S~z7&>l!Pn`z30!=Zd3>-{vw55oaw;6>@ z6uZUF70CXpDP+A%-KRZM&RsekYc5^CiQ>T9Z{R0`Nd9?={#*LK#FNQ1 z)DrivRNh&fwvCaBo-=LRNJ>C$+-xe<a{>b&LE8@nJ_R{NA$T)aW6@UYnq;qfjf z*>C~f=h>{a=ZEvG9G7ldm?%178`Q2tftF{CutlxQ&KTvJ=2qzGw?|Xu%)%VzA8g4po^K%}wg(l)1w&`}a!AMhxi#Q>hJTa# z@6@&B8ZIaw9kCW{;s?5lS|`gR){ZQHlk6;MpjM7tCt~8f2vO*;$%Okz0OP2te3N|=w!By3rgE!W3%W^H z(`txDSJ9s;MM~l7k`TP|9IC&eOW}?sDFpBCr07y}#oWPAg7(HwjIFLSM{-n%O4A^) za^b|eFXC1Lx-U97W><>Xi5lGxSAR*Z-zPz2g9I5IYkCm3vD3w_lAEIFHJ|QjJ{2gU zpi+O13Ewe}9~N&_wHhdGx5@r+>NILK!i1ACg5cJshN|(|*!Y?Q8lS`@jl-rS5g)6o z_uA**S0f}NcWB%=V0H0f$r?$H_4-6-^jVOaeOY4~7XMnk?tW>@@Tq0Kl;15##P}!v z<@q$Zk=Byt7pME-4xJq0jPYe3RK4*8QD$T;qpB03XeC@~E!W|*M7v8$Y;TvKrx;Xp z;w@~q-o`J(O`W$yA=-t4B_{MVn$Xvmsbv>mab&TnHFtQumjKPl$_r&{FJZDgTtP)9 z-4iu!%}0|cUvkXWqH6nx)YBNSZGYO#`pdYrn9E!^e}Tw}Ns^eW8US) zaU~4GI7eH^9Pl&9Iq9nNSR7`RZ6GB4AjngGFdz-x2%w!#Fsa@0%Au?xPIJ1f5_14YySVRWm+s5U#o&dA7NjFPm~Q4+ojm&%DH zI(~p@H@{Il`q|3$5?R0i$e1|JjD%5akG?U*P-kVVPQF+(nvlLAV-t1j){%bLZnZ}j z5SyOVK%qaC-z-eEJ`h_21~R6@Ze3g<`VMav?%MkR)ezF6Sdp7%$KyJBn1{D{X^s|z zcf?0%?N8z(^tK~DLUZqmkI>zp#z!^JCL#*bAl&lpk6+k(N^&wt8V@VZ47*fD{XIE( zx~1KV^L+o@cKXlrnPy*pPF@IXvPnLRpx^5Ct8C7R_AxbD>|vn zN9GdIs?BDEj*CN@uVpze35ctKex~>lD=5sKU&YJG9rt|emdm@*^fPB5YmC`$^}@O& zc}k+X74=dbdr~rWV$v6wPfF4glawq|!tkH6ON+A&noMHr5~^tx%1=sFX{wpN`4Z+=-Ikf&z@Xe%xvbN*n`h$D$1Y>|EE54O=4;1Bh-JQ zSFqc_f5gTL=_%9w47}i4#5OQz($#M~5qi&_PMDfVIt@j^BG!%}QNtu_T&5On>71t# zV0s~L%6NF?Wjk+5&JGX$=!Y*^I5R9>__8f8l~-0(1u+mbbvISu;16PYVdvK%v+C{} zQpUJLitDxnI$~3|Q&Gh@2mXg1^L32CAS?sv#zVD?#bu0AHah?&g$bW}HWe-prX;`Y zxZ^n1R}gEM z!py|-lL=a51xx@(^eVEjIN3OC)OfKvg;=#(XVc4el~}IXGN)dy=@S8B=NVZ7QcKux zZAL98?CZcpeIjWw)WD)+-#=&~(V>(_7O_zLx>WtWnKsFt#+R8N79PSBTt8UQ3pK~6yI`E)9Kgt zT6Ox?=+~&X4`o|0t{I z8nRMBrQdSx-`+N8rE|ZZ$W3>W!QW~*B7*H&IwwRxEDupN>cY}$wX;|CfIB+t9w<pbBK`CV>WBgYwkWKkQdJ0X#0^0XE@0Dc&u{mo~Q3a9)w9 zkV2Pbd8IZ&t56latA8jVyHN)R74N(7ovlG0W^sC?=4V4eeJ*;UWwC`dsJV)R^dRVDl7 z6WDJ0#W4m5VH2Fjk>q7YM7y3*wy4lyQM>S^R8DrYpfQR?aI#Q(W8zYsu^P$_mj6j> zxd2lwS@Vc=s(-YA(0<5c#Nrife?yQe`7U=J1Eq6}n8TY?Qy(Lql&tL@BM$6K(?NLz zi6lf&yz&(@8=n?ei9$rm7MfJ^EYJ9147KQhTh-44Ds5E=1~Anh{E)G(?4$Jq4jDgJ zY)3}ta4*ME8Al<;7Voxio=9{ZaMsv*(R9^%A>`IQF(&Yy1mv&Qvl(+^Q#s}=m9ffM zRkcyH+(BlvEO1wO8VHT?gtOKx(CJ>IvC87Ao^=m0w^o(^Ph+G)1?(SVO9=QuY7PGX z7gyU8@_ri{HxqFQRl{~i`e8-f2<8j?U_NXr4bPPuXa1S2+4yd#&__NgKB)4JDNeyO z(p^c-KQZ9|tE|}_#?v$%rW2DEguL%IhXHA0*c|%K82#{ME^OjW>uLKQ5AayAm*Dnw_~c<%m{8`mZQj%^Q_+}>O zN9X$aA$oLKRVOip2G%Qft0J}d$I9Bcv6Y8^YB5vGo=LB5X*vbC_b9(9oY zo1Iysy&!0a*H$Lh1<7`}SrWp#AaJX5D@NwFKF|RcN>yC)*yX9M$PWbiRsGJPlBjV( zGw26NVO$#p1cB;owo@SMG1zbMe(ob#yw)#fksX@z5-tL4Zm*^+dFbmO!kKS~cHp<& z@b#(8cd?xhX%NM3eeKI3iIB_k+vGMuTmK)l*!L-xE-mJ=#^9wkK|2VGds;2W*fPKj zWpnoq^VoF;!N3=b2kDBhK@a?jVXHJarerPKYOoJq1|xk5AeJ0U8b=nJb^4({M$~p; zw$C7cpM6F2pqY&>NAu)4=utJ+7qBofuCcfJQi?`JTg)Ec*X$a{J8^dg3GjITr{u0l z?h#&~J*ZVa4k?}CNf(zhf;>*08*WX{5{u|<>|ER?sEGue7D2Dnz-~Gs#6PPGTEZdc z$|>VstBPF~oqB^|qN>CGWvpe77eMb-680y;Vv2RizZ5tju0%BZ(CATFC*0iQSO6Ep($4g2pzbcXNfZ%L{DZV$># z@+Wh-ln}FP{tNH?OmYGD4C0XtlY|@ZqI7lHdYSGBtIkEQFt%nqGUJnE{&Vp_%X2Om zCG*jh{_>xGp&=W06KN_LpZSTUu=tVdsk2&|vKo7C{_(VZ^TztlQi@OaBtk|OHgE@q z4Rac{TP2^6>Wl&ZQhTd5eC#R>$vT~@XX|Gkd~x#UOSUyH0^**cPLfd-dJFr&V4mHg z^1P9M?};p2lGAsc2POWM*P(4}3bMHnmHC8|kl6(q>7=~7#q&jZNR&4G|KdSey5(&gs@ke-(FEaV{4w#42T#iwd5V}|1k~1^^QNvX55a1jl-TM6q*q5HM#B)fYt3@3Bkj-kXx>hu8l-P_Aje&y`ff_WwN4jp^t2FgyBH zU|lfu$$1LOWu?ww1F*U5jCfE>(2<7!CKK0^3(h(iOY!xx>N?k3wTsY!uz!yRqaxql z4k+i7q8z`97nm+!)Os7ha1#FT^FB`YVq-?WuG_Yur?14(sqSafc$~4x-kQG%$k=vvfXBkp8Rm_K3b4tGtWgFQR`1%$dIEubxH zBkw`{=?0>x=AUE&_ovF&Mw1dRl*>*%3%$BOFRJ5z!!0o7VC`rKljGMj#GTCV(5R~6 zlh3|nA>8;9m14u#&ntX6OFh(VuYd-4f#!fepgNZ~x^p!fJ zaY4i`dMrE5t~HfvbOGp&WO2m0-+m`vXsc0HV9>z~25l_LV!*!T_I89THlM+za|_|8 zo;_!VC@SgUL^?mIIwthff050PGSuOrW=HpWN}t&g&OM{-@ok@PK?_DXYsBuE4~rs} zdiF#mEhnB|=4b7K7S9uS97fZ6A5*IKSdu3vw||^b{ka6nMocL5>77b2g=hZhTX!IH zv6j)%t2=nOwA~Cy(6HHlj`d^400kH74*j5Rda**i$jYg5s4hS@JxK9PsMA8rJ+sWu zq(6OqGhuxMKXBIyIw+!^Kxe|JiW{r^Ra3C#)i-saVlxm;Q_zfNm`75v1k2T(E^TkW z!Pdx)=Nr=qfV0oS{vSZR97fk7;~~{E_3I)01{>Gf60`s8vvvvTeI}%^r(L1JnVce? zUV!hX?GRVEsa+(j6ha}12OqrX$M5{cH&=?Ja5S})%isC!_uif=WkpQcf6@ECahMWj zJmF)X`MWLe$doYc32(jZPhNeL-W89PTEFnMPuyquxxat`8xp?RReJ=~d1b zl-B*5ym4?*Z&%&c*W0+geQe9q^fG2IZ+-QcUIzBUT%;F8avjd!J+5cY_40hXrDq}K zdE$j@iH}H6;iXfc5sOfwXEcYKX&DtFPJ)-PU>A z-!6%oTCX7o`4K2I+HR5MRZn!Tc#qWL{6lGD@@bYN2;6i&nZJGqibZ=#k&%dsu=T5N zzUJ<=tt_oUmdgTL=)zp;u|1;IvM16t_yL3xkMD8UT&@Q-Di=7ow%!apS73 z4PS7U9@db8We^0NH5#k?Mn+lcRUB0<_VRz*&;^F?G=iFfIY?l;#Bc>%wjnM+rCHjt zl%IzBI8+v{xS=&}D+M`41Ss{LzBWI>Mw_d%M_F-`35A+aAuJXO@y<7jnWbHue)$st zkfurT~W9Z|BY4;*fxkTF#p9*!;0Dv zY6tVbS&0V*^H<=JJVw3uomL+<^JeH_gml4?f2yTV(7(PXTi*a)9yG0J{w9zyaar7b z?x?W7y2}8z72Plg+bg<%7R=Ymp72aM`drPwY#-t^b8Dpi=vKgw?lnmzgP?4=3_Ye` z{f8w&t|$#!V|MscIdd{IoonSh?sNDlEw-`p zPvOm`pr>Td@Gl5+tc+u6Hw&}KsSSV<{X>r>dVo4?9H3h{PnzB8=O6i;f4vH0DR0$arnm6bdaoCQMEcM}PP0=A9J>G9G zH)tBEjvoKJ#Cxm$vP78aC!B##ayD7?-H}zh)bvJ6S=&nafTgT!rF`8|j;&Ji&-L&s zr0UEJKK8Ij=E*W;qL_oJ@K62XPBhhY0w`1hm$;b9o2&hf$+ zKFnxZ74E4p`G=eX%=ac|o&_{c94P?FbB^Vwb~6NnGT6(L2Q3F5Q;6_FQs5|Trdha{ z1>$d=%EQKmaPFx%@wt>?b)|T*2w|5H9D8F7t@l~@&V^mF0b)X7JmlaDl3~=7hMk|0{Hl*jny7@v)enX!T;LQ3{^*u?@U3;3-|PvAQ#NKqZ<09{3uN*xaJI z;}}w2;d2MG053ZBQR=BWu`y19tSy>CiobKZ(3W(jS#TXcaE_r;V;zktsk z1(3Hil|6PKZR+X*x#jB*1*AGvt+1hY9~Zo#5HyU7uR#Az0`7gv&<~XQehn(LZ`5Ah z5!>~*Oyar?;xKLq+eHoyM4PpNDW$11#9`ZCH`rvgax9xI{H&Y97|AEVsS_XURUH|2TFLKP z*C|q}+%d)d#y0Ht$ZJ}s%xC6L-nv7s)mrd!_COQ5r?YQ}4&YfSS(#4Fc-HZ)EOze# zYRg#6TGz^A!!011Ww};EqgIwwkHJPx^Ly58D~k<~Fm~GXglFv-tq6z755)n|&fNIM z=}F665sD@Ub21bf#@GlvGF3kTTHqG8jxBCoknAk{A3r}x%Uy<-8 zPn({OS?%sml9g|qo{3rQ?qjMBQ>RU@h*|CKvnv#)H%=EZtKI!+vSv=3Ug=p&y3fFc z6&t4yvCK~Q*>2M8K4snCyRXyzc-XZb`%s)Vy(%_ckA6YbD>qKBj_K|0uO#b`)20uN zS?%s0Le{E{(}%^ZcK272wfeN_!(&#v`>V-1bmR1znAPt7p=2F)+Vl~gwWRxpk$L#W z=_4(()BVHgJ{*6Db${PiI^8!GnQD#xn$xD&#-{7;uc7KAHcrpR^mg};AnVA}rjLqQ z?d~5**4mBJPl#FV?yn_l_O$7vV^+KSvt%8$ak`9I?d~5%))P*fp7X37aB_?IpFrl( z8>dH>Io&4yqfKJWNhM#SofV=L{)8#IE>gn%UlK;5ZWOkfXo$N(0U;NzwUp@C99VFK zy`2;>`Myp{FZ9CxPKsFi{!R*^FT+;j#Hwbo@3v0Lco+{mJ1OGBy`7YaFu~OobH zxNd(ZB@b+YbW+4)Ta6K_ucpIv*w#rAKke+KtOzT@wVf0(#=cI<%CIu*@1%$g?(d|m z3ai3aqr<9o5&gDK%Aw)Vu(OjQ0>8GCa(FmA?Cqq8QulXKjtEDD`#UM3%dKB+V{C0$ z8@6>)M1?y$DMy8)!nK_gQQY26%F*HIu&UAhG*&t^oXM`p_2?~NwdHhZYKu%|he z?QZvsz@vu)zN9F4&`g#lD(j*}2uUwL<%3lNQ!V zR-*yTpfilBfL%16`BuIqR4{23OzPI^49V<`G zc`C$7xN~UM&wTOHMNuk5oXQ;NMKcw(*!_$Sj-tI5HZyuoVXfO$c)Uh42$Sgm7l0TN z*rbSo9=Sxr9`65Q3lU+fp{4SWoP@r%br8ikhn<}i#xh*nP6>NEb*PPf?R+6PZ0*R% z``cfHZI;)Om~E(CVs=v4IS%{UDNIncMn9Fm#C=Rtg}#-h%mG$os%rU~JW2MS$6Yic@QFmhxKhkY z3S!1eZ_aEt%P~FL`1qNlshP2a04}`&_F?f6M~5f*$&lRqpkzfGIJ|0IoDxpfs>N~!U_EryM>)h zQZ3WrHx{(9uh!;fvJGh8NS9~Fh<2&eZ(>+UIjFRFhR=#Ft66lny;XEM)P-$0 zQq4$*#}E;2wruA}geXpI=+{JdBP<+0r;iQ^cUXzgqN)g&dtBI=p zd@~uK4M)cGoI}a6ZB$ata0kn&jB})yIjk-dErGF&pI!Dchu3AI0Wg;78)m)Cn!1e4 zevDKs<0mq`%n@}Ng5uQDlD?P48R zrdpM5(G{@x>4U^m^yfL{q4OtPQm&pqnFZuw^T+e|a9d2SnIG|d#QZFOkDNb@zia1< zOSTk$Z%ZN^{1}ok;?x}y?rR1D%3Ku(V+w^*LowSP3Os~X8KNzecFfaYFieoM=lLY# z-)Rt(m&d%kRi}`zys4PyB^gqdDE@$gly%_#JrhSo{+4(6*13eOs_Mdw}sbP z!|N)@ZV75P2({06tf(cd*py**%Z=g~BXPXB8q5|gh$E5X0p{3S*~+Uhdq~VXq?K1; zc2&$<)yk_dyE^8rZsk>&Jv8PW+RCdidsxgntd&<`_VAc@cq{KwVD=J!4F>kh&=U7d{ zQ8DkRR-R)u4Nr)9PiW;iR?~2F%saZ3C#*gn*$cwf>(2>~32R6zlo^R~#rNQV;0$Y| zxf#M(N(SZOO2cI34qS_zWmrQN`gpcgn*}jg|8y9t@@WOQV>JZf`If+e`tBA>nu8nbCmITco_Ze6=e?);~v%`!;(o|a{nKYh> zvxDa>KRe9C*}=;!KRe8zbv7+5KRe8z!!>1=pB-j`&ko+!^0R}`(A2Zs>@X8&2e0Lz zv%}Pq*+EW%Y+LBh)MF+YZRsi&3IwwXYMG7HvgLD*nikkjZ8l&(AeLX}ra&gva=6AoiJInz5T zO^(W;=?r~qYSx~lv=QzU`r+b7hG2i;S79 zfzazb+yonhD0E@*e{v$X*5!a;_59@XVKidS8e2H=k5Ok@u8N;a#r4n2l?UpBM{%mx zY}(bZ?Q6e@MdgD{g)HHOBDl7kQpgPHWTv}vYNh>&we6)20ALCHM_{&Se;Qu(mo1Ek zYb~!LH^_x^W96ZA8Lzn2^Z)IF`8~;bmz0NXA%gHBgxg&?SD4vnD4TI=cdc#NLaHW^8~a%2gV-v05Iz zU>fahZbHWt(7D6SR#UyU(^`}Grurz2ANgE_^;q_0oi-pZi+Mg5vB=e062ekmFXs7N zgsoZ@=4sFC$2^~lG(4D?Iq;zG1~Jd)BCXD_F|Y8vv6vURA6+xVg23VX<@5QyDfr&9Nk( zp41#>3bPmmgGade^DP1*hq=ab2H}n+ISR_HZ~EcBB{`TFET1XxBnMeSplIS>RD55KnZ%x`l}=5=Mk*Bt-q3lILGq3^DTR!G_jOWaO4wrE zs0?m|^a+=BQe=?4vXe3v#=`DSiVTuBbW(PAx`Q#2P!!?ooYAneWE=rCe}oC$sdA}y z_2jiYcepW0E}sn~#$n~*m*7(?7l|3HHvFeuB+2IaljaUJ(Z0GooTE7U3c@p?3Iq8v zsU-$O>KpCcT%yG-GEKYj?B$sc_*HG$Ve~sAdDSNNR_E?xFo0zKR64Tp|@0b%*vAN@v z!hU#~w#TSl@u}@XD;J?be40Lm+cKy@hB2~V;@7l5f5vSX%nWl@l1AT%)C}|zMM&kQybX*l4qgNnTKSIS5L@Qc5tD6##X^rkH>`vqZEcF z;s1DsKP%oRJed;@^yT;Bjmf(~)p70@Pz-;RywdzCg!J02qR-u*^?jI)@A5<94*e~n zPgSo011q;^TRxdfAU~ybodFK;b0!yZRd6XQJmNCQ;4V|r-w%8g~6Pyj^~FE?IDrr6)0 zPEK4%NYr)SazLH0dK7iCFY$=#{PClxQ=Un>NE%kII{v@`KtAXdPSJetXM5}TkytRt z9-f2=Z9sJTKVz^$J<6-A-u5>}dM%uO_))-$_Ne}6`246&L?F(q;pzkGT)gm+kJFS? zt9KcdO;*9^r%d0vR`rG^5$z@o*IQz|ZwOYk>i|A)iSa@o5;;wfhFdH#QZ9)sSy6E; zu~#>w!)W1dOKg0*Fny-sJC@iqq%*GJ2bQ>^{v0!R8ZNn2a8B2W*f7%YT1#v|LZqY; zDkjKkpulIdWs&6nkTznh%Uq(7q`4{XKO(Jb{O|kb(lNcT!9VQcNUp_8Wah$)Y%9gL-mNO+WT3W=-f9VGTdljj7Kn_Wc0~7rZ~S^ zwFGFM`#Q}Gn?c)j!2+?S;ftLPsDOA?o^V$<^11Lx&Rxfl@-jz048n^-wwLxK?`)IP ztV>)-Y3miNfpNmjYGzDi-%4zCDNKg%IcsXD0Y|OvZd!}3a_wsR9o@_&BtAw`2K@ti`6j6oS} zrE5p}x;upFHwa#86nKzAZ~3R9Uuk^AM=xD7qFmJ>E>S z_lPX9#>T9pPs7dDX0<3v!bSLbJJNHwhU+BcJYXg&+!Aj{6si&-J&7N|4V^Dp#cIti zuK|x0hJU}zIYHm6y>B%9Su&PU;u{u^cRP26hQnlOx{=(zEY##x)?)_~_i&jE*oji*1LWH9olI^mJn5F1>pOYtBHBnTLe5`h20B z64D%Q4X!PTlDhYZpb5L5DV%(UaBiii)maQR0!90N!*ltLKIh?v+cf%>iD3*&l+$H? zUDmj}H{!G=K8e*)FDx!zhf$Qp0z}t4b?r^)(nYCyYg1E{bMef}a#GbqT}!xD?P=-LYA6DE^<6cPQDDdB zm#exK*s;!z&`a{CBTtNo5|Na}%9gZC2~V7siFVYt-`zrdxU~JoV(gu1gZ-jDp#_qO zLe^s?Y9~G|N~=eY(IY|T^rKGq+yR*rdHnzd7jF@w6=yS5rs;jU@TkvQ6^xcq+G9X` z#H3tv+c;_{$JD5|Iwh$(tM$Skrp_xVZHop8iNqE$WEt%PX|S7ZkwUb_Wb4Tgv>6V- zNQAA57nK%wX$8YVQ)S%f!N|+p!YEZ0`_Hblzg*q$j z1rJR~O(S(c+LP5gG7Qp=~sCLhk?E za>YgO|Lb>M_RDU?x$j*&Z+ZVk-+I~0&58pKlliY+dif82{KI?iKHf|G{oj1~&TsB` z!|s10Jyj-)A;g88_^0rB*4kS=PVV-Gn8IYE&Uk9Wlq1(8F0`v1s#7dW}9`_A*;TaSKJ zw^Tv`V6v_dn;}y46*!hr!Ow ztn{hAuk-w$|M|bqIkvD;MjFZ~d9f67hNLJ;Yv338G)5zWE1Ay2sSeg87tVl#D*Mu6X}#BP@Wq0Dmz0 zCMXoJ=fT_^KWw(wl}rn5%SN0v5DkW3sG>iVd?4La0qbM+H&wQMkS=B5rC_Z;;$yZ+ z11VLp_*QByOM=QvVN;0$XTucERvC+^U}m!a@;}2EUQX9(JA$GD#y~haC1fpVZ`-9u zWIU#|jtaVM0YwGz%3Iq&RuEs5OK(|WBZO6PI`||*Sm=-;ELZ$5d4$y)Ls*j^jKB(= zGK9UkiF^hV0ZXf!1$*dJXJFBmJftE)3h2BTT44_5G=CyVhoPS7AyX&6#NF-rO1EQF zXKfObaU_i|iQ(4jv|Ij7636p=dLr|(^oEI!g)yS4Np)LS#TZSyV?>y+MvGDw!^~Ap z_Qf3#Z(LY!G`YR0Ih$yXEjc#OEg!J;Q zLbH_IF*goQ?ys}>`8B}I9HFT(_>^rYpoKSQvaK4el-?UG4}SS?X@fh>Mmo*a!O!c( z#sGlm>8H~t*1fs4Yrusmt|$1C)a7fqJpL_}A_It)ziBb|&wP-M$S1~qalaN`#oRrd zd)sYqn+F(kqNGg0{NWv@Hb)NOU}lF$<^#VBT~pd7n!=!lN}?f9L!J;wT|*E$)sT8ashGFB1Q|g{uMvh#~+voo-d*NCpx%lkrXN znP;A9)=a2Bow}1^Fb$8$qLc{u#ih?0ReQYH9DQhr$D#8Wd^&Gv_Q}7bPZ))oXqJ51 zULmhCHp%09s6J?zCr~cm94rJB&tz#9?oXc0r9sMkL$S&rZ`zEo3JgeIw5t7L%da%6 z_S3^qVv*DULkST%&+Z(X5mGnAM?|Umx7G%)5r9-`U|f2>4+LiS>{(Q zb14HJt3Ok~1kFMWcv-W9K|pKW`2$%FQZJ(9HA^kF?zf5Wv< z3??PUv(ZLYm*&_+TTEE|jKuRg)HAPVh*SzfFa`-EAc7N5ikh*51>#bJN-;nhH7DO` z;bBnua!vq4Xb2rM6P6=8i)|EAq|`($`qRS;C}%JvM0OLXVR!m!IqMMc;sRJ=?_05FI)901#gJM6PIOkPzf$%BmI*uh- ztJrYWkvOWC{SkA#L^_ci(`r4XyC$V{HcCb?g(MH3(Fp#D10$bObFB8c&fICU=Qh+i zdO^)FA95Ft`Jnm-Dgw0=ZnivnRv&>bx6kXgR!Cru8{C85p0>9nh`~5}kfgD}WsJ7O z(xbVEcj~-2GRMIJL7%}k_M5%cQ@58ta|j53WMJLYrQ$xGUQ$<$HwJ}IZ7L@p71RV6%C$~4vF@|@1)Jc>!p z2|T8F(Ms#B2T#zUsVRl4+y!#v00N}&np-PHZSp=^gG=Uk1x=W@5(urXAo)xyI80h= zd-;W^iHm@x>?oWjjh~8jEh*aIre(ARB-Q4V)C|RVN!aW{WXJ$@buTQhVY=nCJ3`ag zF7k3ksOd~cRzqtFmDS=!7&gD|np)*nlS-A_RHt(7p~7@_t+1B>f$uiCHG|6APa%O}mMk!_RBcB#cv3iaQ2CoV#JGz+Pv`tRLjQ^*BR zU((ZMeESieOdNG0*28}f9!kWD*{J?CfA2g)ww;|4tL|q6KUAWhmAn>5i+!^wuo&=X zxJj#95tdGq-(h%)HXZ2Fi~nHLLFBthmu9}h%akr(8AMxRrWd_oJTz|@52*mM|26&j zLGq|_(c|+}*Ujzni1K7Rz}?u=nIL7Pj+B}@(MPAAR~}Kgz%|+AjaTzc{;$v^@<&1g z04atcgyedGCXvO;j*GDR9~^!$5Mc`c|0oe8!LXBP=b@tQ24>da$mXG@r2DUWJ8F;0 z+@d`~!@Od|hfI@9!c3F&q4DBG%A40D^LcS8h%wVzr+AtFPdOM#rm-y)V~TTtBuUC_ zz$%or#Q*h~3DQA?l6;?L0!BWJgX%Ya25is~3I)RApaI^}CNf?ZCzC2~Ug~1BMeNVh zQfFy4;7PRqjES%alE4^TNOu>6Z}VgpnAF6U&RQf4V4LpoH_HU(H1k<6on7n+ZF|+G zuct_*Hmc=jFR<<)KP%X-q!irBGzMlC_?0E^7ulw)#z9RS_h`OI`%r*uh#Ypgb5gk; zGV<7!?6YfOKmU-7yO8tAY-?GGXh&SB$XH>Ha*knTYb-VrCq-Ib!DYf&tq3sONF|?x zmRf)_wPRhOHPvlm&c&_T-l~APNp>wk7l6ah(jj5PJc?ZpS<*4(ZkpDH{H-IrtEBNN#=~|%pSxV2~1wHi89Mb z<&_+}{_nwx`Bf1-kq2Nb6PYAkFzgMnVtz$st3U#vsKOU~9#+iC-$#YnCo~it$8uP2 z(^$L6YrjevB-7~1B#!pgW6e z1Kyc%ZtIBz8qQDw-zX89D)XaUc?nokbsYu2yFpeieL7u~eOQ2E(+UZ`;;kk(kj7|U zU|R7;e^NVTq{xka|J#nST@_|BP2rd|4zr;ENM6 zpjR1sYx=q9PkJGvqu)195(iyLEyxwgR?g7;1(i*Fu_L5pHgGbvIsNnpKuFal6QH4@ zw5c-IUNO3l$RYLL4E%{pwV{^;1)VTTz#x8Jq+7igC_~8gpJe6;J*A}FY7y~g}wM7C`Id$%uU6sB8Y0Zy+{H!&rE?=#0L`)+twC0X|{^+O9TJweU`4_u5kulmL zx+Sy|8LJm3nT@=Yn5Vf-V3*AaKK2=rQ7AOT#1R_1WuB8SW+jcAK1GG3bi17?@lfx# z#1z?`-0f%zg(|!wJ5Wg9MYw`SueL)z1+Kc-5H6q z>vdE)hGnaCEUOd+RW0fkFSbdwJZWzYYEHHwC}6lyY&8ku;$ldlzH(#GkQEO&W5v{L zX^HAaVd4d*JsS+TH8m+&^^>AtDV2~k?H-s_NKj>;+DlN9@3mPOANvrmlvHmRKi9^( z;FJ9R{qNZioI`7}e~9uAh3tX8DIlIT6pH>54R=_>+Wc-SH7k&mD$khf!Pz)-Eeoo-Nz(y@x7P+2D zW&@d#q~I{Dn@XJpv=q_I!L>8QMR09cLxzK#X@tE4aR}Ni?6jh^%OgcFz?+Gt%~+CUr)h z%Suy5h^Pn~B%O>Hn4S??;}%81718v(88TtbYfPN~h z7m}-)<~$lYtIemJqZ-Ra^3cDeg8l2!Swx@N_Ejr+3X}nIaQ=tGSs^b)42sl9_z?yq z-yvZaSew2Dzc3I|Qd~R{cO9#Dy^GsOxX7~J^ffY4_61Yh9A5}P>-a??7EO?B%uFq@ zHeAv_%|WnFmM7o-ZTgaK_CbGz{ByR70(@~z!eoe!>?Q!JM1>^kCYpvZ*&u4lNU)Ur z4-`=*mS+|Fa6>BugQqOnx~C!Sq7K+%q5}PBynNvCFLv+sqeeo-{-WQw^AD`8r0dd5D^YyGIT#rpX84EUBTPCuHTstp~U zDHkf70GGL7PKCKCkInH^Sp6f%G90qx5C#ETT&1M>8^$4k2N4|)q3fn0+Zre-!YsFo zKq?4_0zx5b?EXmNUhcbVgp(rH6L5P2J5v?JnR{I*D28g8E98!1p7z&Ro=Vr)E$hkJ zJmxjwD}1Z)I(gW< zI90p@o*B=7%*8kIjDtYsnoMX@4LXS3K=X{&YQruTZYoNIAXJ*D2vqe_Q;6PKuVj4C z%yix9b=~P!?HVcd8Kx6*qqY0mQ`$=5bxJhSP+@xL$w>OfLtn5r(nB@XSc4+)_R|Qc zfkj?Buya5W@5OA{B8iF$L>04bqznoYh=`)40LDXLFB@>`CB^v~*vl!{yZEM%>ad1e zgtB@CAgmY};EkZp0eBxe%)&0m-T}PWJ7ehqZ$RlolyrcHW70aB9rp_G)fDhhf+pZ; zB-BoE$?X72-=sTXvHfW)E$#ql33{NunYC1n$f>>BpEB3VFRte3%;Je9sio>vZx+(p zoGRychmDM5iC|Uiv!na&dRg~ODvs4bbLSp@BCdsKx)W67jIEu*bnUx|PwSfCGSDVm z6U7sr_HXZdC1F25`KjQXnV<$U(% zA&3c9(=7YrO7@vhUa47Sz+7KYYL(HIFXL5--prn?j2D&cg{ZxZnHz!-2?7FcJ%n*7k`;EAWsa=eDX`Do{o;G?0WBWH778J&!yq+vRZ!2$S-Bk z?EE7w$Q~s&7L#wP`nd1Fb3TtNjqUfGG7!WSck*XFtbVh#(CpC_>K?N~K~YICJ`*)b z2qKKVn0yEQvWayX3L@}7&iquGR||Dcq>Segf;K-{ese#fdOY7G%lTRqHlH=)HEl4! z4e}-PegVIWv@~pf@~(So3-!j;ArukBjVfHk>;=uF&@HlAudQPiP}u(Z#hPtKco)PA zl;9GYZegeU*>S8dUbKyEBl@;Yl0zvM#FuR2?E;SUTtGr}D$zME?3oc?q&;aaqG2?s zlKjC3#h8{PFY8+UbEnEDXYB3e$s-@izdfZV(mvbr_T)*u-H<%1YgWRu59sa2KZTQoX?U8WOHvhw6330H-o2 zT(X%fYQAWfa8~c3uE_Dlc)pD+PB)>WJzB$5wkA{b)ZqFFVOLhUqq(l zu$MRo3`6c)AUoG=z0@^D6;$iun$WzLp&hMNU5 zbc873!50SWLPrQM%3%IFAk3%;#!Qw)NIOtmN_BHalzCAT+C)qOAwe79!-81J#Gi8m zRus-5FzR3nV6!j(bb!?aZA0Df2T_|~WJ`_>a0w~D^8`xIS9!<~*S6-kSfGTqzY4w; zlSfM8IpTGxv?IQA(T3%ZV}(Rc{fvKF%0BP53B zg(=9{j;slC9rL%&Z2sa_-d4SwZhzpHT#R>b^#1-VR zCHevJnjl_?YaJjy?{z_ZVXfvME}SuN)=Wb6NX~;GUh9P9%H~mukzUUQEAB_w#OGzm^$S#S9SH>fF^ClTfpuD_*KBS3vmN z$xk*k2q!im9fn47ah-bk+oPx+}T6k|xCBYJE1AvB~JMWFk6oPi+}< z#*{he7cVq#V$B;djDIqft~QHKEi=|&-ECtJ7o<7?2w4FgmU91%;nC&7_hV>6qk>!@}QegX}v~nzf>8>}TGppEkZ55V{Rr$?*msOIJ|4QooW!_fj%>;1iRO3rG zNbQ`icAn{wCtIz7bJW|WSGEiAbaqx*m_!T7!)A_{Q$J-k&&nmih53Y-ifJZQnKMlq zvuOv7l{{XbLZ}k$pkJm>8LQdvG*@Ix21`T|3I9|W*QHC<&xyB9RaDwV9(S8x=4|W_ zTuJ=_=u-9CB7v};S4r!lMGlO0fsxh7#h8^+&qsj%N~76V%4K%txxtw!pl#sHzWjFp z&di2#rNAh=ExiLg85pk=7_SrepaAV{u-vnoPLrah8D0zTTxBBH|VoIuWm|fiRC4D<~l6YLedwT|RFG z{0Xr9aX}tz#ePpszMU|Mj}Umg4p^Jhesye-~vKL1i9#8 z0LDCU00X9$m`q9;#O&1MpoFz|R=dA(bs@aJaN@GmJ9WC8ok*yrp6kE!NSPN37|SDN zUMS{-JW_1hERPiNF~{VHDsa~&f0Xw?;hlOHp&~#&??URq;q-(6lDd%ef`jA|7BA&J zP^IK)CQ#n%(ze(9My8w>CK7bN+ii+cA{JoT)?4v z5CRSkk?Ilgbp9Uajj|4y&%&y-(tL%uC*^;*SI0_nuAC5D=Jn*Gie|8x&Cb9^TXHZF zRE*1-wb)>T1O7=Lv*xz=)%jK_fJp2|q~ZW%k!Eh0P^`E&!}+7aLwBmFX9YQe12?Hrk(vS-p1R0ykFXf3umA7 zFz@rj?*+cf=hut1JN5a!*y6EEeSTkWd7JwDzS;6N_4$4M!+Gys>hpUs|CUCieoNVCz+ZaMR0`(!sVfk!)BYX=e`tt5ti4;Ute03){`jv~QU zMNqaxa#s=(MXK8}e5g|(W4ypfg{-vvQnib*BJCUwK_fSA&Io5T*7j7nk#LdwC=9`9khupd2p)B4qPYjL`Xc3NWk8#>*p3;3 z1|XWV#mpREmG<&8IwuI0y@SxyECu_4268CmH7)kf#nLCZLXdSP82NgilWzT79lOFM zpahQP1J5CGfiMSR_L{5rYXy*8v}jr!`GwTkk)eDWVMt$7y&dkY;}mk8sf_h;x)l5bXgchW}Ta4HZP4JnZ~U7 z$~c4HSiku(HI}NZq6G1_*+qnJI;n(Nf@99g-(gq!Z70VWm3GS7W1CL*Mp3A zOH<<=?l_XTN#meqv2mU>SB=7$f!{Gyq`!gBoEd;tI&mbE^nv72CVo@kVV|ff)Xk4p*XMQ`4Lrhly%2tf1rFf|j-rPG&Ys`Qu zW;%X=+nfzu82trq%{SBu3_};6C#Z2o!*Dq6NRobke1%{sO)nYH(}AWo5%)Tk3GaNd zZ($Y*A;M>)V=kfUECuEmv)vr;^HR+DOpQF~Yqh1w(hP;v<>oX=L4S^E0`>V}f`0Zi zISc4pJw#^%Jpo&Oo?!fQ9wMFU%n#5Th3j^t&B&UYDi|xwwEDV0&x~}S_YNXit#eqP z_dR#OdUU2d=-FqN#6?5OI%&P47+E?{f}FgDs$n}iiqd?%rDpms#!^a7m-jET#ch=r z7WBxz=~k9qY}afLFSZdYx@7rz)_Naf$UMK0dt}=7kb4)@uBOEA$5iD^pLNzRYfU`% z&*Swn+xBYqaV#{KEC{|Ejhw9}P|nTxgVAU)rd1U*GjlrFS-0=^x$o5nWp8SJpP31L zf@3ZLCm7F4Q1uBo-Ci{m+Y-1s_!Rk1y@U7PS+8&o_W_hrEy5*)4^v>zll86#@z-`e zRPWzds4|Y_9UK@>M|~gFJ$1Ef@ZAs8%MW7qEctq8 zIr9)QqEgGM-<4pmeCzsL;n0^8^}Y@@yonZ;Pt-28LTYcOT~y0v-O1ml6-rYj5euB2 ze9(1Z@rn8p>fmBEU#?!Jt#|F9Jy#r~$gDkO*Nn7<$LdR)y*#Fa9An1qF^2PzF9$L= z_avuJzH^)6OSql+;#XJkl3lwnVkKtq-3Hp#YWBsw0PFCX%&V|3VwVy<`Nu_{hJx(T zr7+>BCwWD+B&@%Q5>kWUnSYUgn=S%4(^A5W(j+UAr&`iJt!*R{JU+IaL>hO%vK6hE z)wU4eeNiWj{DoV&z{8xMgz(8zR%uH6iwOrsB&R-7_Hbg1^kk4yY~CUvbR1vu0FJbp zquDhEG`=*x>{$HfWAU4g9j{-hLGD!=wiHW^A58)WcVHFScule%gj!BJY?jNQ`UCsx zZ!upbsL(45VcgB>cRf$WOm^n&v3mb|!56C4Nf3^;42I@EC}ZNaHD4m=Y^p(t#Lf4f z(2RZPF%{e`3h&ubKVP(fObIag(9(M8E?Hm7^km_2wj)6v!TZ6tvaEJ1k-Vt$j<)KV1)K+@QE)yMwP6V zf@mE(cDxo3iUD184A4>_WJEpX{UYQyCRT3p)Gs*}FFA%Uhsre%=f#VUpEwp@emuV7 zcznrmMaTg-4%s|LLoeoZMaMM8n#ZOvgkV^Z5P9dauJ zEkA}ox?dN-8+RS2Ziw9bu>#6;V%>J7$~5bN+l>>6vE?!jR4TG+C8rIA|6h-h8Xf8; zkwyR$ONs7Qxh~Y>>|U$SygwfIpEyuuLDI#E(@K|Gz~ zArw+KZS-leKz#8|>~3UvKZDa1Uwj;&NSWU2Lw`vNBuxi-$(o$%AQF;Z&cC5*2s=m< zcbjx9Ac1TP)eb%!r(p|^?^IA0O+h?B(sB~hV5B7d@s)$ekKNVsJr3f!mo*SXByPyc z%JF;D#Zk4YtHGSfYozpMjZ~*cNiqt! z%61>UF3c9+vUopSCP_f^$Y=^9u2uK!QvExSD(zAex^3v>W{I<1^JaR=T47%_IjGcf zssdfhi#l#Wpz1(y0p_y7!Kp*m4#JR4R>{^3mL)?Yt6=?|6F^d$H*U2jO9a%-+ zkyTp0o2+69kX4ibS!GrNWED$*tfBY4U7nlwrQE!{7=xw0cy7*f8H!}woJ7XWEltMFErrd4z8p92Gj47v9XI#M zjGOm~o6l3pr6xCjx`h`%ucu^L@@mW5N9=7ac`g4I5Ow5~eU4LF8&XcGR@nS=9FG}l zn$2@ai+EN-cISlCX^|x)k5>ntgWRBiI0wrD(Z!3zH4DHrE@xb_z!Usw>;U6s+)dn4 zw3|rA8&H|3MXc1*;IgB^T*l#Zjs`!aF{`FDSV~(V5$8cn9_*co%TF@qaewvOBGQ=5 zeMx3e0#$0gaN3eF7)a$q+v$ZPY)UGoOI(haZkKo}f|W5{<1M^^x`MY^1WxN-`!+j7$Fh(+r zy>VCr85m5~vP&WM$|rVz92KOh=c2p%T&S0e=_0);#DG>Of}29DC4i|ytTU>ZV{A); zVyxxmKvscXsJ*>_!E3v6T3;A2WsqWD*XF_xk-3Sb?&uET#@IOWMdVDb(}qcUzhAR;cQ@K#6H4LoD||TvD?!X<5y- zSd$KDYaZ*`GA_$e4b)y%YiaHo$mk5OI9VVidr#ZormLQx*Hf}Id8Os;x9x2`c~m_} zS2F(yCB}gU4gVYwQ`)Lmo*0JrWO`ryGZB}{?xswEF(g_hj;;BP1OahVx3sg`Q@=zB zwzHZxQ`eDZ`CZieY!~(A>)csu zGlc2+RyYha^kUihk~(`BC?cki#M%h6wZxht7Ze^C)Ied2L1eU8wjAuI)AR2k#&Cem zzLKxo3-kiJgjX#jO6;(=m{K&aUJQF6*sJ+!cbr7a=vtNC_6!xYee~f&==Px9M&A~MS zGMhgENzG(NUR%zA3(L6h6uXz46RmHy7$qeaY=fn(jC4*wpSGh9b=O^EymY2$nTt19 zv)LM?jY(=_R@f44;hO~z)wS!HHUy4sKq2egFU#$c#Y6%jgbDK8vw4|6rGts?V~Vs1 zDPvhC>`YsRfEz%Gjl0}dErhsEqYlZWsTeSJf=gS{jW*&MMAwOh%QeaZ?V62(tF$%> zQ@riA0Ye4(X`b6WD`ZPqCZfTV8ZUKUmUG*uTid|3m&%NTP@Ou!`+0>hh#(DJf|@jU zZ6SkYowX4VOj{zMO}}Ais+O%>*}W?!(n_Exl);%%oF4WmHHw9AUon9YJ8n4(4~ zWRKp`^FpTg#9`$Is1#o#jR$n&?}gRi2<0qFepj@KiOECmuyVc%ozleGyfdnR66ZKx z?FwJ$A6lV?XSqTv>E}PP&&YW#byhymLQF$HrQrH*U|w@nRGOI`Nf9Q$uFcc!EQ&B$ z<13w%YebDeZKJDxPZbx-_>k-b1OH8LY@D{;k@PL(Ep2yVOU5X z^4D%XbU{!#cAD)JHFJ}h@-}pr$cKT1)dxgF6%kTMv>qJF>WDK^fI`Z@%OiU+k#YV# z$-fo|-Gm|_mUqP?vtHv9;C1)x*M0W7Z}w~9Jo9z-Yos<_FPi;YGa{Van?y(IkwRI+ zgphf5%A?)L+w@Qkhe7Zxqe}8Oe;dA?H_V%>!?HW030>T}*}Wf|vVBYt^h^fW9P}zy z6H<+6)(fTv8$->nufK{VU9piJKD}a}h!SYe^>zD%fZYD+8T*9csr}Q-Ks}H!4O7wf zU?SYJ+w)~hgF%NhGeuli5HBX$NjHw_uajrsIRHeG-G7@S3ypu{Mi%}6x+Krr)_$ob z)&8a(+RqEx0%5kx@Lxn>>3+tgLUdFT)S{$TEAT67q87H0GCaZ>3FIZL1CPrZWJJ6& zjhzZrgkC|PxyA7*?vA3UEu%t03ZnyvL(uM%qzsZ+v3iovL*EUK4>6|+V>Y8hn5}Pm=*GzbM1tg{XQtRY{eOO&&uQ;| z`~T#f7JjHKd-KOXLwxTaSMsku^=V#xYGMA>uRYGI`S~~B_+#G8%fC5sPx6T~y(si5 zoBHp*CwcixJcB0o{K{v6O>#~0?B{fS9$Nf_ZoXKkKBLJ?--235zJK>G4)0GO(}14t zaK>?R=7H&L201I|i@&LC%afmfO4n0S@>{>9nNE61wL{+RG-pXgLLU4WD6)fW zOvtZ?jkI*@KCw#7ed@s+(eZUxdmHFLIo<8HUnVzR^y-CMk^)}P7}_u|h;siz#F$=< z>M2ecFDm?_H~BRdqD0)1r7KyAM2lqIr=jagK!@=g(O-JCL9lK3Vs|$2W>seuK0<}1 zFbDz}p1ZW~zY3FiMMd0}7IB94U-~e>P-qVKCO=0TEKm=c<6#B+a#sI*M+HD_VyLlm z_KxP)TX4)s`e@(vjtCWV2JUc&~!c{Nb>VrT&2<#jTT4(j<8}$)u6sc!5Krfa6 zZfgk3t~Ljl;p6VBqeUEI1daZtD&7#S<7FvXj95$9w?1`%to>vsmEB2 zv~+?Cok_m#fP$$@yUWWS^cdiGihvAS+T7O5kY${Fdg3P3SAu zZj@%Qx(-UP5&eRbHW4&cd9HzKiH%{DJexK%8Z0;?ShJa-Yh%tXhT&a0z8gyI5iV^` zPXkQU$oE8YSVV8!*;F>);9JSV)+}gT)|hAujiy1I-XL~LCrI}4>}0NBK}R+SCYM5Q zR2NlS{pqXNjzBLgH$hMdTmumIMHo>!5ZmeoRSvtC^q8Jc#^H6r;AM-{Ef;$P~(j;=*W_Kn3KK};B+m*bSzUh*M!zx)q$3SJ#Myy90q7QI6 z=?KnUxP(C65#D43r%r1?7GdU16rd-Er(yz41n+{_I9w+DBH081x|{3QFsGJN3dA!; zb&yXa%ww9p0{Kc5n!bulb{CT#D5!bQG@HlP^K&(CdrR|ZZ1UNROsF0;?}8hBsm*gx zQizq~7dmiIL_&Wqg|4~7_n!`eq1t6 z2xNI}e}ya+Z$b@{pZ@6MF9lP{_rCiN_wFa_{ZseEvh`upZvT?W&JhJ*IaNe1B6MF& z1!g=2rD!x&#}Vf|SUBsf1|nqU8>nO^lCsxmnyo+sDM)rq3D{Coh!ZlyJ*m_=C4~-< z7i11N+rsu&FmVZI1R`1!B%}mNL@v_UE((Eu0BoAe3eu4G+ABP&Ne1NXACj7?Ri<9) zlcnUOi2=CVnlgaVRcSW_Bi3Y+RS+BxrqpI5Q6qpjjGc8k?vuTzf*!!|)Bjvyb(*U4 zPAJaK#5C-xIl^iTNa#|Ri$?8%1^V`2DNPT9XtoC{!3|~-qh=DM=S);S5_0^d36@ew zO|+yi7C0lD2RE9c8u8v*O;l>KAFoKX5%aY&7Nw;O&9ZZsPK5O$(1DGE3&1c|f?JXBT-QJ0l3#R_Q@ z$ch?;M>`I=4D~b#FA)H+>0*hWF^l+Y{16gh?yj7PqGGFZ|s)2P$15Z z3Vb$H5HBN^f{}NqKv^CYN*OA2of8$nj-Kl)9t1GlKSQI6usCj?7;+gI&R6Y)W&mY~ya1R6F$h1Zu z6NLq@OL0mPd-&IVlK0_*gW6+)fAb&UaUB6E-@_-X2=>A70cn6~^4Go>JW#`wVL0G| zo#=tL1ow-oh^nn z^gfn^Q?Tnlyf=CAUS5f!>*OdR6u)#Yw`qbw^RRIU#oNPI71LhXSa_K$dP?DIdhXd+ zcu7}u#y@Azh30?k3^)k-jfhjv=jEPHp3q-98{9#2{5v&><8yKHDYWg~4?U&_7IB#3 z-;dVMZ`)!d4xD&VffnLNV|_N2CQquk4bew+Pq4xx-3&PUZYPhZGcYiwxdT))%Tu$n zq{#uH#xX5P;eHU^>&7ZVSfKu!)MGczZ^;hC8TLv*?N*K+a2<>&ma9kA9%;2LB< z-CBrF={uve8a(@oNuq#A=?^QEtDm+;mNdidwRpZhHDwTE3B9oqLzZJw46#Zww?wigfLa6x)k3BN zC>cYsVjaL@vZ+En7?!>{N}lCTA*I!vzuM(V%X=|Z(=uJJ(L z^%@l@*>Pn7tth&a%p9)kkTQzF@u-8#R6h31l0k>^1+7|GKo^8|)H!2^K|p+#sN!vX z^d2gj2X~Z#o93EyA?QEyJ$#%Mp?Z7kgY^To|=$g zIF@77&L{UACr$2?3U!o;KQCKI7QTiB)xQ$CwaEajjcsziWM6Y>{<2Bz`R0f{W`|Z< zA8#yd7a^pW?fSDbF0KmiGQv*U99>6v(D#6~v>;^00AnC&r$#IK-aH316b5(=7l^6A z;Mt%0rM^3S_Dn$EJr78~t2NNV4{(7B-^GP;XqG0!cIE_pG1#9Y$xW+Lx$^tvLWDQ1 zpc6F_0Xb1KSqQ0cqfVT_%*@Gu{Ect?rv+Mrpy-1`I4wkKA$8ga4w{=KnX#~Zm;A)> zx<35b1OL-EE}20dnoeGjV7Px(V1Ws;{E_pOV20IauLK|Jl%iKDpnWrQC4jdEgT#){ znSjU%8bJU$EqEn3)S(pw@sQ$$-#qn}Ig><|&Vix0bw-Os1 znF%geBNetP)ajaCS;eLa8@YC?ILTK9w3lvo3a8r7UNk@samK2n$s}U|7ss4B@QmYk znmyz~7{pd`X{Fwn+thA$DpxZOBFX_1U$M%&oFh#lBVsQVE1E}u(BHWWB9S%6wz_L( z_HSo54|hIjEsF%zz|^RQD6vVIM$%8oBd0)NP62vC*HmVDGb4-PI##S2*90k``UwdZ zl`j{spZmZ5^JD+(Kl@uAvTveftitb{@wETgF()5g!>xww7RqGZA*`c#bs;`h zhm!AnQY)}{+@e)UWgf+TMO%C}KzDUv`>{CWQ!~flyX*iRE=-Z=!ILJ*(3OP`(c~2m zo*ewWPkrdqKl}OOjO`-;*S5ut;vBeZpZc9&`<;*fO|GkK{1|hlUNQL-Bi;{(`>P*! z0AiH?qOO>187A_tzZVG?WjZD=BS%5XQ`W# zd>L*u{}jlm<}4zg8Uq$7f>jOp8Gd<0+ywc@cZWkmuEKol1AjF|AIV~GyDFb6`wdm& z5L_{VtSm_kOH;DK6wKspiB1-_mrP2WyBxiQiGZks?I2#6Uvm$+Q+bgC zvM)6xTVzr;ZISU7(NWuGSW&e;D>W;SlqwQ+w7C}=wMz1J^aG#-rZN!Gov5^!?3voEEF$dY0jgVRl1k+QAC zXDyiq98e#_Xp1^8iiC4c9cRm7pA#w~0Et7IY}yfaDWZE(!p5oqOfa%3-%H4T|Xi zct?N`FYFQkxIp3z(KIav|+OZ-fYev zchaejEI7svnrR*+PzZ&*3|Ob0-cZK9M z0OF6#CxQ;Ep@`LU5pn>CV>=CSRCcE89-`v`2VB!sL^SojIums&={iC$%SR>?VyU`` z&XPJm#|LI$=NxQy+2KR9pMTUS&orFM{8%EcpgHyykv~H36}S7n4}PcX9&YWrKl$KH zaf|?6Gtk+2=q5=g-%(%^8nns73KUe+!)DVBDWIXYkrBH}w=$}zyjFU)a0NSi^ny+kx#tzr%8^%xOmh8*WEUM9FN@N@fKtcFQ zYL13Ir3$k47o7f&CU5qB4VN&+`|m5Ki_BVYCT@)#caWEvB`q4N-Yj4g#l>q^Fr#D( z@Jmhy@Dap*UT_qjn1N*y9DMM@NzBOd)J5usRsqW zmdcokn0lM0qeyZ&_93YvWJE1&nvSBxOh*(YFlaY*TR+b{QL1rV$i0ZxCICm8;H2ph zzIRIoX8~c-d&rB&`ESSdO+}A){*L0H@2_^v@%^XpVwq0i$`&wO^V%R`qb|#xEMF2w z4OKyYAlM9N#_V$$#8fuFke+dqGwxMZ2f{Vhpn>n)>FeYV^NkR^dsK?E`a zP+{xlK=x5t#Vg-w1ysow2MOpr7J?2R1sz;bl%yS_d1M|iMFp(t#{{Svv!e+b3d8by zHsCnhY7}h|p#nve+uR>U4^oIFA>~3Rntn+ha_AsJWuH?|Wb5aethsrZ$w6i?OFrVm zsAi!TsFf#n)DK$8a;ui||&Iq@#okjq# zJ;H6~(MmRm|De{t!ACzC61*PIPwHA6Fy9vHNK%a?!5Di1@hPNRrV+L`ReT6iI>No0 zV$GQcx1m7xgbFBtGTB?4@vuF`-ffHPb+W?(a+3`OfJ8$OUG}*yPsdfZoK@hkRyua7ohRntv(9H5g-Oy}Gz~*L6WlXNi==A_rTUzAPiL1? zH!?-_Lqb(+d|^dUB#KLvlUtS=tqA5}`T#KY4k4KUXxc1gM;De#kdzDHa?GH|m^3lg z+E~O+p4Y{tBUEQUTba;52s5P9^K;gCgOI%IF>}iSKFBuTSD%-K#pN4k(?U*S;D1>iJ@>IShHV(j_HXg7+NQXcwd_4oWEO9xu zRje#DvTLlVSp8S7SMwlJs>R2lJ{_{zK~px0mKiewPC_U#HWZqxjIk-$p;`~KY0mTm zS4BOO4@Nm`jU2WLArKaX5NRG4`JlJTNxFG;>@QsBqe6+urV^U~Vb%J|@P?5m<0pm6 zGf@i*^{uwX)ZCmAH&e5_734%_*g%sS1P;@npTe?G*BJz1q!w;jZ95ZUU72T3EXaFV zPf#1am5*ef@p{7t)vy@uj4gpD5FuYef12mCl>lM~HtM-b=3A1BjwEL~R+6unYUDC;WGe;A$7opbKVA{*-1oU;Q&RD6lAr^1gEY55p z9+%~N(sm1vYF(1;tRScMGTt;dV6a-wU7j#?V882B98^BnSLm@o9|jCJG?Rw%-vNdL z*iBq;Pp#uZ{R8@@2`fsZJu&PfQU(iD3uwHIyIEo!($D@2GD)Ztau~TbE`hW{h-Fw4 zCJ66^vXvTp?8qt!qC+eU?ramNxuE%hQi3yGPj#)7gT1m?n5lt5(k&qqRz~6}73P}C zbQVafB4$52J}1m7mj~W^L%oOHfh7IMJ&PsZpa6oD(tczqQMc4g>^NC7(L#MQnIG27 z!r7Y1^vN}os8T^-b~C$Ln`vw`*UYYSH8bwj;uV~WOgnxz*DD+iVSBFNgW(=-ti@K9 zZ7kwq#@VL$fQd-}G}&Y5e-qyl5$8}3>$_KbZ(InwKFSiuMBGYV&fi| zF$5iZQ`jJ@Kq22vp;{6642*&#XthK8F@8Jb*l{s z&=>`p7|4d2L>AZSE*q$VfxU)-*d)+A4H~oB-<5Aa`$TnWe{a@)g_kQ0^I`7x3p+WB zLGAB4ul9FcNc(}VHk#sh^J3D2})MjT^DPM7e6 zQJ?h#VsR25IBBBFW!}aD^fO(O$n;HK{tb!7>ALXtH#)KYw53V6c7j$VFWH-a?nF;b zZ~rDuBU|&CmXbBMXCBMfbslNvT#ExWt`!)Z0K$l9hB}GFS;+0Tli%`2Tffwp)<(^- z1T=aCEK3Dfw@< zr;}_M@Hn%`QGEz+GmXeC*1RT|F`GMNPeCEUHNp4HFi+FC|3|xbcu`KiOS{vxythDC zFm$;^e=yW)g8Y*_B7nP94Yoc|D+2AKBMzEaAcdTa3}LDtxpK7j5xMA6O%L}UK(i@P zK%23Malij$*40*FbRquurix#B$|M0t!OnM zg{mlpX(*ZmCRXOX%C7e~y-GSigcDIz-5@_XNMbX{`#4;Z6Fv!|N}2>aWlNId?MY}` zOA<~FvWi?O)cjMt(Bcn_1&ZpUYTTkRIwj4~LkbOA?+Zc`)Pifi+{iX@>X(4SBNBHL z%Jhy6KJ1h~bf^%`1mv|7DsjHZd?6l(#UhwQK``K&5DpDULbqTGg=Sj%S0uwkO+aCj zOgA)Tvt*d3FHKcYDvE5HFG4e4+|UpGF|@IQDI?Y6WuR{A@k%W{-kM^;R}43Ovjw#Y z^oKRL$)k^hiMEb*u(T0^mRn;A%g~BaiLCpmPfu=H*xlTH?t?R4fGs7+g!aDc;!b=Ew9W#w4I~VPF){i))<*)dGojJwL3^MkM=)jLO1K1eAd7P+U zqysVlR#F%GK>e!?NfabXB%Kx}ps`ox&E!kfaCN{p{-3D5Ubuv{ZEH9(w3&OGa-Y+SkNDh0!Cy;rv)!G+Rg)KdACD) zlOFiG$`=xN)F3A=EJEDkf)(Z5a4xTF#&(E$Tzpa+nQAlM$HeDIY|+&!%M7kW!Qm;C z#iA@dg=Wb8me!$?BU2Pih{FvcZB}|~lz_mLrEu^VHn2Ge`AFPHP^mKAmW`mCm8 z<&%oREHnefP9skgmzg!M3C8q}Qh$7Z@&P)Wy#c^M2x+#;Lv7|H$YA6bpu59vSf@=J zfK$?36})93Pzbf}iiRm!pvhNA7NFsgvcE7Wjgm}-e7=?6U>C zW2TZ|6&b?o;z|+Ae$vqp2U*HjCT5m)t|uIf@RVj08*ygZf!NLQMC0lhUNF)*2~n+lx7C$0KNJO z5;nn}&KL$rJNf#KpxU2^OHUp{7`15!Mk921khXxU)B-NHPxas`d2qRM>579;hk^kW zA{{CUGf@+pSsS{EA%R6tN}zc{?+8wG(;z=*{*BF@X*b}9|)<>ELH?iY4A)J#PXWLzf9B#Jt?qmiq8^C=w zcHW5!(fj_zO~lD&029y+mlvp@}@k#ZTmYZX&brB6$_1bB>wJ z40My2WGn~B?5L{rl_xWN@KaGkuYtdmfn=(K1zkkxB7Nj%JQZ+`ZHAzQEmYlv zdN%nD>TdE2>a!=mt$L&U4z17t8yTLf6&ZPeCa{dJ3nTFP5Q?J zc5Q90nJ28b5(+T$meU9(qcTa_2t{}oQ>&6h)68p9th^F+l>D14OwOFPt*Vm{hp=gF zh^FvUUi+&-?V`gP1we_qg(MritzbHfUUf?sl;+8(;nS}El4K1< z*yvRfRDZ=}kKYPA4pc0MdQJ4Ibp&z)&E6lxqB9m&zn!gJ>lLnJ^*r%VkNghTu3@i@(Vzf=R-qtseS zfF4h|2lTe6sClO%pz6mF9p+iG(DbByzS`NkCXt?^5n`!b60j>BNvamoRwO?1bWTlL zHbk=82?{}orK@H(0dMHI^;DcxJ!R-rS8Gp$$`d6ILZdn)I}qEpG@(jhp6XImu_=IU z;j-ervRtPgN?2w}_ z3CN7iO^8c8PUG!2Als1iiU149-3DX~HUhFLENP7xi}mBew1YIl*%1$E<&g_VK-S)e zR=VPNz+ioAW^ckfpND}l5M_X{JuI4-R&bbRYb-GpfN2JTT@ zFr0nDQz(;O_}_~7eu@i^Wie!mgW-1CM?UT(BD;AQg8Uo>dCZ#}b)0VPbp?c`7rcqe zrf0N;as%K6BAB2{FiZ&10ztBQ>I7uzbfQQg42ueYRE20P(y&+HmyH5`zFc&ho0LxY zm@MSa(z01roVcJ9b&9s12;@i@wo^3D{`}}-Dv$U^9}#{vEXAYj*>UtSkw6TL)vu_k zL9Hv`sGbKkg|VYRhY3b2u`;gKJ7_dcFpPVSQ+n^tCy&<==L?D~4321Cf+J8>3mLVOP?zrQ^pG9FW&tk})EI;ecxr|^P9_bzLBO{j zTLC-=RDO3{I9l(~h}U}`J0SB1T5Hdba`x)%ktYWMKH10zHu7nk^JCxIW(GUg=Gg;Y zQDf=w`LsDQEfLZcNAw+lv3D7uQAiR*MSDXAGV!skfTl^Ge9|SfS2rIjHzSR-%@Tkh zr~-)UOTu%ZwCJ~{y!F)_+i_7v=F0l9Fgy`$i6Ack%notULb)h`(Acr6pdO!e3R;oz zwsB)*B%Dx}-all+Ku@gwYHmbL&H4SJ&F?v?NsFeItVXIqevFF`V&S41U;TrIS3I{? zGai-^xWGa;5n!5Oddu;zDAAxl)=%!yZ)_HEY8(r2nIG6l9C(?e81S?tSF=XO?2{ZC zXBxgpJA2D8C4R~ZreLwl_J&c7*yNSiaKkwoTS4@o@Sh0TP+LZ&AXZOU|SY!9}=*0LG1y39}d}!$4 z@S&BHQ#3cEWqkeUNPK9rab$Gj@Kii?aCmZ> ztmD&@!@H;B#(j<5hgE(&-IzQ$I!=c8@Ob0CL)6+B89Vy!8yby0jRx;Wk2Hq3+d94P zHrjc|#8@)9YjAj~v3+u4Vhbb{X`~3TF`E*sDOMIW09NjxQ zKD2w^@aVX|ADXid4SFc%bxG>US+=JlCs2cn@aQkI|T<4lTKf?1{ zc~1WcPy5pcu6mxw@Aw{dWtuLH)3YD{scSa>#Hz`|Q`5Uw4Xj_iZsVqF*Kb_Aado3H zFtBOe@W$N(*REcB?Yh+?Ylb)NUbk`m#$CIvT{SkkYjPN@-aRqdaHtI&Rt=8~AL2T- zih>U|gyz=X|KQuZhPr$BeZQ3rk1?~_CdDoWy|HS1_{iv9U*VQQH5j6v|B>G^ej*|I z_Z08*|GL4$g}h*rfPZ_3Mh??tO*H>JJqo5x4<9@<-ne%teVHce^lm82vFGr(&DkMg zD}(@WfRlTNr=|`cYD^9dk1)}uCMU)kQ|@-}}juvf#ocMFww9i5)oGdXdv4VCte zPOsX%ud(|8lxND3j6-9G>A}>BJ&oNXd-e=myKc|M#-8;9yH{;kz3$q^z}l8n2EoP= zHHhJ%U*jXglOuk1+53^<>0#iK(z&hg-Fn;3q4(Tz`)!+pGsS99;oCS@!T1V(@8-t@ zh0Gm>oBEO025^R{(VuL@!u|B0;HowZ$5V}an1s8*G6UTm zMv7dAR;L{bf*s{*u!QtJRbr%SyC_v#(%?SQ=3sTl=w9gE;mO91#?&D&+Ye0>TAv~P z@@CmLc)Y!ixt2`sopKedOWQIPe1-H^k$!q&8nSt0cyvrOFKz$y#N_ba#votll*^mL zf{VJU!CO=ptYsAbGYMarRQI!+p?$+s`4SFa<#!RkK7N`LqDPDPUCeJ7zCCql zZ1`xb=Gas+`V>z#7}9Z?0lPOw)WWdI>HZ1NF5&n6!lOxV84L)d;PDjw5j+aLj+dw= zwOhY8@%w)3$`}cp!%v}LNsp`Ra}+K);dPe{gPvSG$nCYc8bEKg;u$-1E~stDf}x7kPef?)i^=ez;*{ z(j-qet0Yd1#P52iq*f%UFEvuimhF8*|g@`wF7HcuU)ft?b>x~ z*RS2McH`Pj$Z7-YR(;N^ux{hJP3x{*k7&1k&HAo={x zcEiAi)f?7qSi51}hV>gZY}mMA(}rs|4s2Y#aSigHB)ttAH*Vat@!CxTn^tdHvuW+7 zb(_|2+OTQkrcIl!y_P0kOZC@M^tEKWmRGNnmyS+P3_Eex@ls?=L)+le{%UY1aQZ4g z(XQJiiV6?##3mVai@a54i5=_@Tqo&9q-2ooFhCVP@CKFb#&yu_#N?e$@b*BZ9CuhgJ{nn2r%6*N|z5Ax)cQPLvV|&ua74hmc|8M&I>GK!nEDz;(B}23P zYLzxJHSHeKe5;_pnuF={Z!$5i%sqc$*7LV`UUuH?wqEUv0*K)0pb_7Xrbhq?wUmowa^G!51E${I7f$@oZ$Dt^bqo@kh*-~UM?bCmltLPM; zr}rUP#l!r@C(?XVX}ZslPBbnzchaKKem2K1`tLWOf!sO0XOqnv1Aqw}gZuSL_c3=UAr(@Y*@EqVC9pi22$PA|t!Jp~{nR13 zU@gDHCcVoLuxD)IUgW*Tcns~|eRvE}3=G({VVx&BL6GMCG4dfEfd^qSc-{3|Z@BTM zZST4HmRoPTefy8@xMSy?@BOj6-uM3DUAspbd-m=d-G5;0;P}L$dnTu*4tdFb|2zq;U}g^Mn} z07xhj=gAl;UjF<7^P7sc%1IBF|(4 zgB(^W40MM-Vzi|LJj=eYf?xXl9{+sZ@c1~S z86k2MJs%|-BZN~82c?#`eKtEldjc$kSqXC_X(sR{ja(^r>`ZoU^>yWog8Vj(tVpyN z!`fOjcba@jzRtGX{{6vkf)l%d$*;nAqywMic^}tb<0n}&ef|{p;&Uti~cdY|fM!Zpd}`j@`j z$o(dMuM-dC&KTO=7#l;uS$(Z{?KlMof-6r9GTkVK&D$=knr{B>H#<4xC*dFc)IV`> ze00UG$x#Gz6IoK_Xqxnw@cmc4ESo-mfoH)teSX?M-?8)d9m$Pbhqmt6vDr9|s+Q#y zxz@W*TRO*LbJpy~?xTpFaP&e{L%u56c`yXL)-WuzXp4{<*Cz=emjK zDpCw|czPN?44U~!k7)6XiwVjKAy!_(&y@|?+g5QyeU(dhf!nj5xL$C`Ig?0nN^#t)|lhu z1Y?)^D)FRD#fanx-f~B*OiS72EY3p{d(MpmDi#y-=)uDWQvk$1zh!pb7vYUS=iCAE z@!3anGV0r2h7?zqLn{?&2Jwys&YdT-pSR}|+W3|LFPyd$2OIGr>|^SCid<9I0E|X_ z_nwK#-Hmt3p?9|i7@I$$oJRQI%Hg(g9NKohkmxM`wx+78*-#LEWz2VG(-;FiDy8>l zt(zK7=~}E!#872h2c~T-Z?Q5 z9~>S(3N-*vy=o2>n~+M7=?>7jT}R_xqtkoFhWAeGnI1|pBX>I_Qzg#~pgB*#{pnq} z4=|2q@1Xq+y!(@Y@L=O0$YVhZrkM;)jE^0i0;NPdfeWcd_Z%HE%Gn&w^PROOn6H%f zF(e=1$mH<7Pyiq|Wd8WHjXzcQ?#TM)I_~e41NCd_W255->YL@UzNU`UW=_kg`sN@1 zsqBfwZ@+0IYb ztAT8*%z=(j=sbIysb{yQbNVKqd6c?jqi@c{=HMO1E|YoVH8u?8TH@s&3hV&ym3Y;?rd)?&GL(>yC;mV{SKVM7%oNK;x zAeU~U$Q_!65@;R|i36Sw3Q{vw?nUT?V7*TKn^{&34g%-%tk+NI*I)5#)H^3x+&4!b(omN8UNLnq zq^c3loPv~mZc>-w+2KQY<{NKl^IxUyGv{i%1OJ7$dicZa!v01Ei2w7YSNoI#4Sf`2f#xAcHaA@N#54*eLnR1f+k?xnLO*WI!i zMV`rfAwZJf zOgL$#_F+AZ`-uPKqr?vG5CA1gP8}FMlrl9q9zms2Z?F>VHQ~e@B4eZ22hNq~9F3QJ zGc*J^{9tm2Y$giW43V2d;6GaqdhRW3xm3d=BNtXIv9bglU09w}_P(%OYMKr9x%=uH zb>6A5BgpJ@-s!E&8kX~EiZA^9l3RG=&{@(7=?tmbiAFP4?E@oL4sw{812MK@k|Q?gAlE9u;Qo_pCe@~Lmw zy49E5+JZU2H8!y~Q?T;)rjYF#-hDt?)lkPTo}Q&$v@m5QPG4Bg^dTz``%;!7f1f4T zJvKagP=#eT*{8e~mc87C1>Y%V&ASdChlt-J_}y72SFFy1?AEP2lk1b6$(`PPy$3oo zF?m!;cADktdPd;ZYCE0eX zzTbJ<&9~kDW48_6kX(n6^L@>+yc-+pLO+%_B-?J;dOej7-MDq9Z$onZ^*grSaYw%0 z+jrc4J61k3sLk0R*Mn9Ao(gHLwZnUr!WYH*m-Zl}%b8=YOJD7tIEbyp#TE{jH0Z2`rl;;XoKonHs47;| zN^s{!>p9Y<5Xn$$j*j`BcSip9vO7+JT(a|mlSxRv;`UjSE6u0rIFHWWpUzp@z}jI7 zp1s^o8O~O!o5i^2tCmkdAvynLqeucV*cG7>43X>XczsCh@})<=0i|oAZlS?}yl=Ucb0)i**BUEhD@k5ac_Ez~oY&~3NhdE-q(v$5~|03(yE1I)oR z(*5R`TxX5*IwL> z{~vpA0!~%e{*NDNP^9CS=aW>(91Tht3z^4+jK`39o@t;Ip;9U;lr&I;2F)4}l_sP? ziKtW>RLbzX*V4nedHc=P zb+=IUd7#fnl5l`hLaOsoEay`xc98FyPJVIQthJ z2hjyoiWQ_+12P?i6(gMxR*drSk2khV)Ratj?Zsq60AY|895ZDm%>3egb{*X z)yTWL2!#R7C6Wsl3}+k;>9C@5>c)Vjk)O*N3};yGplB^5^vRCEwW!?vemTOt7#}D{ z_}+RUel*s840-`5zp!o#(g6f@EMQ6F-sK2C5&X?HsaWrKD!9>@ob0O+y44!=)!>h6 zdbnNuQ;r%HBcUwA(mT|5Hqc*A$%E^lDF5jXI2ph7gC#KZ9HD{0Ee3vfC<9Uw!JLA1S2sNN((#-D@oA`MgqSO3;#fxCWDU- zNUE9pcz`~N4`{rHn1ODS4pwc_N32vsm;|(DY9-+lWKSGsQ}AQ}O8b`pXjp=8h8X}> zUomrhiO;X$Z15!f5*Rh0bc_SNpfiKl#4#rOT;$cdXtsn5tUsFc&U`%9n*}l|1c$)| zvnvlSW+*sK-msy^U(wx}VSffBT_(h1-w74L^k`jO`;BEO)_-(wxb#hoPTO zR2VbQVJeO2*)dBCJjTzl92qV1%3q22GP0DVPzK3*)&SgwAgE0Lb{#UR-Br{6wcUk} z^?x~3o=Shop>otAI8@KzU7-5sH`|~;ZK$t88mOH{`teAAmaOM~Gc8n)D&P`{I2%l& zH567@D!?>d)aGIKhO#c9_sk1vBl$VOGt&BDeTqX64wuQ_GuDBV{VO94wUCAb+=Co6 zFhX!7u>@e${~)m>U^M?gVqw5^7W@V>5%obxe<$!q&-T+K#ZSN6;D??I(Hj2m8L5D5 zfmXg&kKpWZLgR$E5+qgx#oE~{cq(8mz*4{1q>y)%a&&ZbbM$l!a13z_)A;S$1NA-r z$~*-nM4xz9NLLv3FMR&QZoo4LgZdb~a75!x6A-eVLwy-mjQYsv+}I^V9c2M-OAsp% zq*rPKLSAbNZZtkY^GdGF1wl+K!Ug<)CVpc=5?Y{x33vvmF`%X&8WM)9KivaX8=bIl#djP`>B%B!8%kN|OMN2qP{Wv(x&gW;&RD%rAmz6+{~^D(MCS=K(BR zAw4=|;YgWf(H|D9Js2LWCy0e_54?~~_!3U$d9<$VOjywIz;5PwazPj`0yC8hf8H;) z&!Y=ji|m|WTQ+2!>;li_3i3~V8*UKS-z~p?_HC#c|N3qG@4O#re1|#j_nTkHUri_G zn-Ft}jZpYen?vIJfKfX_;yZv*yF=mz!01~d@fpB$7F-P&^#Rcj&GjL12l=~Y=CA5J zZ_`nA-tQXy8fEXK7UD;33~BF#6)VDd5|j2$STXA3;`;8l9~yV{aPKKp37Y6|e>~^p zWJZjCwnI9Q-INhdJG9e29!TRiED%nQuX4%JstzRt=G6EueK*1JS@&a=f5s;mhBp(AQ zj*ckY!kVeKE9j763r%heccgklk7UqSAtE!V=t9p5@v#CRoKF}k59ANM4^I#;5O0t@ z<^)$1tR`a)AS*`S35jLFpBpe{;QsT^4a?t50|b!9b_-%WvlZNE{6gX#;7032B+dc1 zEDJ6HH*5Gw@UUudj;Y5CO&wOfL)I4q>8|uu*s2$qGD|$y;5rm9^Exzri?unJL7~s; zy2L7lYLSk{i z(^&9Sz^LsZf9N@UKu|q|>Ym@s|37;sAO9d{_|W}ltHP(BYfbQ#(LM5_^nSMu`4=N| zE}LJ+<*0%t`)H=%X2oWJ(YYwNCJ2tfAZW~u+#w+UYK&I_*RYQ98Ug>^=VBSpj*OK% zAU;F5hr>{4rQyhW-=TnEh)xLy`6tF<5fIPcz4t%sYv$Sh+SeSJrun;xjC4+*C(g3C zIL?k3tBOD#@xe2&V)VU`n0u5z!pQ%B=YO#Q;lG~$UHWm`>$WpN{%(=^SIM#3*qUem|Bj8VTDTW9zw&o&Y?0TKHnvFopW4_WuOn@2k(jix zMPky%7Kwk?#ugb5X=95l3#5%L5(`3mrUdy!;sS7^I`WS;$*>VJpHO5bI>gxxS=$B! z#4^YXFZ9r5$$DxnH2kQKXdU7MT_5OEg?hu3k}uJ_f<;VZ?#JCV$kp8^Ec$>06{q$4 zj5|is5 zBqrB6NKCG6KvK+KFH)z1pR^V}Q0$4LRt9lQxk4OQeZ$AqNs8JO_%+hp@iD168y^`r zZ=xgJId6;(9J?b7=AvUkmWV$bwK{W^3*eY3arImi9Mxv@`Euz}RzI5?eMMWBlGl=K zrxu|L16wcu%SUx7np<2tmOt0kN~??#KhCdb{=U7bLu8rW)(0lzZ}+a&`(pIGW{g6m zUd5h=(YjHu^|p+Wk(W!Q>#MV?p88y3tv@Dds3Z8{M*TH3Nu{otm-MGLzx@78<+J|l zw7mKDi)5EbmvW@M-|W0ZFkoC|<>_rpa_g2zy*OCAggvh1bxz~ZlC>r^A+9>Jm%gA! z-|nY*FBSE%(>*P?cWGI^fZV-XcbAGA<$m6o2*(}~9h#__l9ufOLp-0P^@d&+l-;q}?pJ%!`r3?1_-%4a5(8HU#8=c#md z8fIwR;7C|0YP8!U;TpH7h0&$KClPmDlZ}+)xAQHnsxn#>@WjurqSxqF9bd|Z=hDlx z2ZUF>5?-ytih1TTUXzX$i#)C_vvb+=!6d$ang8jr0r`)WjP*WMcXYgRH|8(> zB)+m^r?F^mP+_?EZR0Jjo*R5Z*iHKS7r$aRn`aX8E#t*iw*Zr+Kjw3v9V{>rj;XyP zd%oFZ-%gDsVa1b8J@$1RtxeT2)vS5aRHYbc$~Av`n$P!Q(<0p`U)PAWn{LUvA6~Fu zz^w9&A#bX&u^A5^cTdytHD&_4c#0ZCPntOlKWMyI@WyP{#pL!=`cuslm1aJgo^509 z{G-?6{lF%3(LHmv@jty}?xr{P+iw0o^H`g4C)ph2Ec|V*@H~%lv8a_(vlY(HvWQW? ze6;OcorT}!<@KBb6w8_qiWkyF)hy>9tMU(#^0BP3mz_Apcb}zr%NfS2f_s+IrZN}z zr*c@8xPCmAc5IOqSG?U@L4{B&Gslu{r*B18?&U3R;a{FuNd(n6O{}6>PdA=lnd-gN zT5;cof@3=I*6~-erk5C=uy*|1A0YJjrFCfV=}i*b#B92klnZ=%WMNYvfY#cAd3Z%sb1YKInrDcZ<5_P{VXvn(4X*O)Ur8dg|SMGdQ-`4rN_ms%&)4R#W4& z{kh!lww}_wr~C4i?N+}PoDq7%!|qx4p7&D*ciE+tRrkp*YP5UrG&{7yWbATZbxP(` z*ZIq@=}?=vuC8qm#q)#P{<4h1o7axI_8&sN6;4-+ zvMKOM(`>a9Yc1H(G+G~-v8;;ST%kBo%Q=II~pN=;fQgia}*lzGl zbCuK8V@?Xio_S8;B9-&(R^NA`xwen@&zrdNXq<_(-dL@bO^;j@Y{rGHY@nTqIx_z7 z%0#;^0ULw1mB)9OE2?kib#^${5xq9Zz&YfNlhFRO1m~IM8t*#=%bhK|RM3S1^N)JP zjiHXNQSpnO!;hilHWujgNQ=w|4)gqH|0_(H8s z@3ojRdTKsXla{VyboZ<9GlWkwT%!_JT#$Un(B#bc)^tzGlk3)rlMN|$o*8SLJBC+n z_Utb``>xHc+H>BXRj;#ueDPebH?A|jO5W?f(X`{~pIyB+iubHI5xm3ejdalm3GN0j z-bfC+dns(*%~?0(Io_yyPu3WmdxPQYZJ;;gwpTLWd&PtEKa#y3c$XQK#CTnvk3aV=tDPDck?Sj`A*vskwQhVRhg(dbCQUk6 zKfW}uLBRj!j@*vGM913I=dK6`-JT!cXd_}Cq??kf_lBMnWPRic{|wnPL9epZasor& z2k|_iT%LYtTCgpjwu;i$<-xx8TL!C6rU$=hj(Mu4dL{VrW?_Nqp|8PKANJ*h3@L=% z|Du~e;i6l}#?M(B>jJVvj;efr6Kixcgwr`LbhGK0(3=qsjmqtFLf2S_j6J{GFSIeN zM(X6V{LrzM(MMk_Zwg(1&~As=d(JSv+AmLn!?nYNV!~{0-3<@hyYtTLHA|0%xer&X zmT^4~TX-=v@rfCKIOlQmw)^{y!oB>raxxCC4!^_^X*zVfBK*S*zV<=(*Wpb=#w7_l z^oX=YdCMiNtRs|6Yu|NxZHzeU8ndeH^2G@L__Tsq4?jh$$W=;>xGfVIwC;z3HM?`< z4At|wd~Vw!OA~so?9!->bllsere!!3*hvdTS&hS9QH9D!%2T%OiSk-$ z6r>(^H;V0xV}p+9gy^-i!xDMh7e=e(9a1u$91^WryLG|7%!AP;F_DvM)E-9%6>st! z$m5Agvr|~TVB(UPz>;|`n^I$A7=F{@=FBaNNn9!~IySj8W~KetsroNPVjpE|sK2>w z9(z}FhJL8ShWF2d>ZpD{= z-8Fwuj6ESYoRYGzV{QWbHp-D@Py7?w9kh(hjua%chBS)3ux?Js%oy7tDmOW?>fzb| z3k{t_+01D-I%^{mXNMIpl#DG-%&UEq{Hfu2;{RPe6g+zm{bPNzC1`dOSgk>z!-!Vn zUFpcc<)54fI*;2b*!Jd6yqId0f98W%`bTELT{K*Ny5+$fcnICa>5r%4f1bjMkR#WO zicQLe)J8!Y)dVp}1Xh9EK*tfqpCk-7EIJYt|2=pq)Adz$&^eB-!qHp4HOoJUT#1ur!#L6Ry%^j zVF@4<%;xY=>ey}i&-dbolnC?bfyr7j6 z&_AOS8G=@Nz%-B-aPs}Z#>)sIA2Kxjr*&{-ULK~ce_jj}wQ#(t5R?eSXlF#ZGk}o> zbLL@i1`>x@{lfhN=yyw2!qxyG~kHV56Q61?4&G*^HW&-an_+n#jg{aou))V7_`=y0!Ne{vX5l$ zMcAqBgA>AVj>KqAe<}<90T|7vlKzx2#N0B8#{gyx&j}dWa3uYw0G4OLX}Jl%`v5)x?`gWJ`PUuvGE#oI@~vT?P1ViLib7HaweW6KWXIL z{ZV0_GO-3kL|#Ygwvm|BZ6onaC?H5jJDmA*3kwMM3?b3aS<@Q=yokmBJK)(Ycr1K(8Z1}|Fl+qt z0WVVq^mJFSuOwj^OJQrB0TTRIv^_KG}rIbsQ zM#?iv?5{@+XG|F5B-3x>L3&?o!NiaI1ZoY>f99-hNSJ+(m0D5Ow6h7dYc zOQ8ONCiQpcsz;^dp^El-atx(nz3W2|KdR?QTssOUj>7v#;XJ@-(wV$|8q~|Eo+t4P zz^EQ3@hfn%`hN$^n*Nwk;bj1${vI4yfArnEe)$RWA6xo7hVSR!Q|a+*w(F+)b^SQ} z;jW1rb;tdQ-co*1F@^HFVsF~#h#b`oSTEY!@0!%>{UW9E8=usivig?X`3%`TOQnCXK?)7?vKqPDQ3-{h1#e0wargcZcmTqpKy>SX~CxO@eqN5YdTeRzWHHWoak$fq5`$IAD%jI_lSO;ILLptHo5yt@61GDp4SR%c4hN? zo7|*zp@NH1y(YrYyL!6Vw&16;cV-5?X3LqCzdk2PK=*Qj?6ZTPrsnY5cI`dRPMfQ) zGUaA-vd^q@8(XqZ+!gE3T(P*hZSK^KJMJ%8(#I|MJ=CB<|D|(R-cjAVcbr0KPU|Pf zEY$QYR4cxF(yVTsc-h|OEca{)3#Vy1Te-UDoQ`JtJ;oN`#?hJsaW%w zM_S@r`x-w=sF^b^IoBPuJj+{u?5b9^Q0BqcyNvI@;jWvq@Z+4_w|G}i;<-{{6|%c5OR1z6N7$Iu#|oFdmX;qJTDd~lGEY`LuvA)Y{l4lqL(2^K9tpq8{Ae$pxi`^! zBco|P)mgT*Lj1}P<80NULl35X5k666?^LF~L$laHvMTb`RX!QF=kYUF9?iBjH2$%5 z!yfA7J>GRKbw@w;a>sl-Rk&SbkzkcZO#V5C6(NcW+miJ7>-B#q){5LXek?t8lg=J? z9{q`1%MN~he8Q+B>d2lS^F+tyYhQk|HNG!koq|o7QVl8 z+f&%`D8=9Z^Y!T;IW?b&KAQGsiNJ&lo36~0kl86o{a*V{Vw0JhpzTJrz%kFxowecpbTxphlD6^C+p@-n znyv38PTx0*c_%)h$}U}N(!EC?mu;g4{`ep`zP2rx^59ThU*MG1snK59@zWWx88hiTR2;QFLur2NS;``h3(B< zM_*U-P~~pB*sopr@%o$@2aAu4Jt=&)aP?Aep+4Vh7H@2A_H5zXkwh8)Hd=1log%5W zC-Gra+X-s>pJzO|vxe)A%8mgm5q-Ze-6EkKMQWNwpY;Z(@b9(#X4NhuZsnA1>9i{Q zA=S-p^BML>u5T1Sns29G>=WtMKTvbq!1Ua5ht?+t8C&@2zU%xR-V1gwX@4##DWT1C zlV@Lv%zCkX24mSjdAR3@ay}BeVC7rdIew3NhWIOffdc-e^;0%}dhKhpC8UFXlxOa_ z;3(rqr}dT`5l!-E(-(7gzkI!kzlMFBjUoGm-FpOtU)}W8e>!i@+{g(&L&pSZm$e0! z6u4iuUA{boJG<wmQQDP-V5ESoT2sW)qz$g$y-s|9%W zp0B;***9y?X=<5j{cJnYL=S&$%d6+&T_%4{FK}$*Z#cQh>ygjkjhC8NT1?{;dD=Eb zhFqJXbhKG%TzZG%u;}UsTOG!ReoQG&TeV31B16DaPsgxPrthAurp->H;nzI-^VoGv zv{TO5Z9n^os(MuH)ypy7%{S+}Mn?`*YdO3Zu(ljSj}CV2Qs}SqzR7P-TW`K+S9+y) zVVpxm7{9H9_}zm>&lhc>TMY7F`|?CDPLNx&KxA0Ur09m;+^uDebu^=TpRXRbj&bq? zEH^i+m?E)Y;k#?*EvXBOK17Eu&g2rRtNSpwHG1NW5Hc}|@>?oQgS zY1E}p7V8@y@VeC{{h(rL#$Dm@Wet0pURkzCo_ca+U&tZ8c{3+1(|`9UT39~8N4R=D z)xPC0Pr(ak*^DL1Q!?fRi^TArEm|X1URCJ(sikG*On#-q+k1Auka4rvm{IaA`nP;K5!HA80#AC$;N79c zV%1_jr&dV0dx*7c^3YM8UCJid>&#zSc@jR(bvfzP_H4!WFP~&yokiQvKHphz?3Y`` z)%yoT?$gBAYH(pCfj|KvzdF_r<2Bjn+bagY5zw6MS-L*T)?_KgD|UJ0;%_ zTrFYO#K-wc4TVHBUr3X>9JEC4j^NmHru8z{Xv0mWUYmW-PUg+)kB_K9O38qBqPx(fHT79j?>FaNn<;%mtzj*1~xfSqM9Q4iLdL;tUbxM@=le$E0xJhtfscKwYdfw zvDsG`nTE}7XcQ?ie%Uqs!Odr~1&cB>nnL+MG+C^-hzvG)S5f~kBubX2+wN6U_l54* zQtRT3q|M=?bl$0LR;pD4_D?o)tvc|Pf3;4RkgiOv`!S<{pm(pf@_4RlnK^IrHqk6`pxj)pOR=7RQbC%Dv>erVwK34a{ zii1#K?c(@rv=+x9H3i5}Cz5eqVr{vf%N(cZzZ>c{88hSy&%GU1YkDirB%euO+lP zi<-er^M++#K`dfxx;n~v*6z9|biRxirYWOUUm|DGeVi`pSSnd0%S zHlUCzJ+nVEUF7w&1G`@J-%CBUKUmAPbrJtrG4tnDS%(+)ul>ABgnyVi%e6e`YE^hm z`W^Zer?V=e8%1OVR&Bp}my^58yUgt}e|~HgPfBFtqrgRy8)mNc;>p?SB&Kz7wfsx> zor@MXwul;rcNorYn0?;joO znJq4rHJ{TjQ_-SbPPdhV-%+sgaLt2r2UAaKS3)yYVx#D+_kd*(+gv zhrTu?@lm#9@mEv+tqDSrMXPU(_l%1+o_4+EN!U)_51ecrlY$g7N__Xv++n>!azzux zyue%#j=$tWtnFu(rphimx6gN8nSJ<T%$1 zEuL=8Wz%mgaw*Z=rT6%v*z>0jH&ID?*~))4Ue7N*3!6E!f%?a^Y-M0JmICABtMJn9W0)A zXy_eBmgrae2Pb5Ymt~*dwtnaI2~+|3*vP)B>FLGUkN5IQ_#Ncoy|!Fx*2MUjiwZ-h z>!LNqB36}{zRw$UZLq6%$x(WeFrD^gO8KATaN#D zEmpf(+4s1SSaNCOBHmAKQiAuJXPo;O@S<@>Ykhci_Zr&zv;)^)3+}6EmR+)OPf@P8 zZ;<)8_iaLQOWuvm7hGQ|xbf4&J=4pdS^K8$F^S&$i56!0#Vzp7%?(ldN^vsTmJ&{f zR<6A$#d+`gs*82&X*xn3XO?+4h%TJ6FJ)NcF1I(YzihNtjJ%7`&eok<)^%`6N>9z2 zU29vugtwiSdyaUs&`A?r*}SNXd5@%@=M z$*TM&6($uqX9I;zccr;*ypw)JGxNZgb~k%IuIEi6`9&@7Zah3W%WUmZs(z02%AAmy z2|QmmwUx1RiHtQA7c%Ti9-91Zfv|&56JKMV5$}Dcz4ZtBmH6T|9HpAD@mN~bxwmOJ zzC6>Urbo3RN}|?KwJLHmIiVUSC^JdzqCwA=@So+n#JTJ>1tj46K~Q^ zB)l;by*fGg-6AK+qyCeo$f$07$iL^n=2V8D@HsmUF1pP97@jPRINHLGpXKc*KWlh+ z=Budg_8pG~K40m5rdb~JyvA98orfln?KEeFNPXXoHS=HcjO`Zdl^(Fo%zP@vsh+W4 ztg+`snz(Y?!-LD#7C0?_CD1x;oo1PR;`28Jw@k}at!a+)=P6ZI*Lz3biSIB?vJ!ux z;BwJPy~!%8$iqB@Jwi|{^(CWBF6wYZ&&h-7x3AK^>oo^f9+@%a18-_`{D}z?ZmZfZ z%1K!+o~avH>>)E=$TTH!SBmK)hGg!?jpp=uyhf87WWtQD1v0k1o>DRUlEi`o6E}Rx zUuB;(MJn`5^)8_uCnxxQ>v~r*=V3+P7WHGiwsu_4J}pi#lR^&kJSrLQLj1m>aIzHfa9H>;SU9T4>RvNPo2W4Nh@ugHrrt>^>UZ_F7IVWUCqno z#wX8OCE|5Pi?6Cc%2dnI#&^}Zsr*)1lqXr;rkpno_0GMk>!Mn`rPOX{6{Hy)zIWXy zf=jgZJSET1V96uD4Uc^vY}wC$+~cP4`SIfnH|=}z{z;J;Pnkx0Ozk9&L%PHBUMd|t zA^KUd`^Wr(`Bpx|+ax|E$p|=o>{0qrQ4_vlc*==B_9`C5*Gpe+nfg#_@o?fvse6uM zAFanHYp;o^WDE~)={{5{(5E|ZE*qQM)l;goAFY2ogZ6IUrw?r2b2RLe-fTI*&nccN z{AFg&nUz1D`J4+g=UFJ&6ti-D`}YK;t_|)^T46hAwp#|98oy?D20xtVc60rC@uRIb zq9$*PPP!bU(5-p*hM+BfphB>YYvb2^}|Gqr~1_c;$CA@-|{^u6Jje)ICa%WJi)S&;{sLciJu zN;~!A+IU)}(5Zt*-qdeCX%r;C>KRaK~`Z<%LquhTL*fBnod zS&MGr>zqXgBk#}VP`O(ZxS{n7pYOyTiR%%vd7HWKUA%iNi`w?6*kiw)4#iOL^ssos z1`**G(_UA$vE9t0x$G)ana_W$QY>YQ@vR_}@Rubs)4x;OZL$tlmb?%-em2OED_%~t zJ5o3Ks@<#Dk8YbMXl9?~-_WlVA=}=$ z$LrrUFa50a*hVmaXOh~o{^b)d7W-XE6F5p^om>SsT0Up}A^HjH4=t6k{It;0AQqRv{A;KYy!}&{E&eUnA|;@JY>x9{TggxGDY

^EsFZT-y%D;pMMP=6TNMV^Z zJW^a1V2KYYFe9oH^M@6g(UdgvhZUMx!q+0jW>L}?R!Nb9^Uv^1MduNJLgD#mctY`c zB!5>E3eadN760gjA~ae`#lNgftPnjC{)`${j3(cQRu>yqkS5_*o=oMC+W`@tJvm_L#neT7xg>nI`NX>j7$t5m?LN)RJv|hGE5sKBs`|HlwFpE&I zCc?Le`kZXXiq<&%>efbf4?^J@htEuLTPr~*UgP&sA@@VdlTg6M@6WaG%+ZSnup%~k ze|e7ct?R$O#0uFcd~Nws*$b5}STP&DkE*;~DKhQ# z$8y$e@L?)+Q|$d0o3NFA&fkR43-p&hnn_blU z87qRG?c6cRLWEW98cHT>HoLY%9q0mmfEL@`PG=9y_xrAanzp9JS*3V1x6RyQz1$Pn2 zg=UYwHAn}Z^}~wp)R~;qXmcs=j9%AZg?GN*n@5}URv&)S5sek!g-^Q78b7Od<0K_Q z0iN11?_`a-pZrY?LJ^)%yk`G=-3^heClU(r!X2l%IQV?FKU+p9#!IGunvh)V>g1Op zh85&_LwXGl3RZ0@Eu_IY?>v{1v1Nm4HUm$+qWy2Tw&gpT4LcZuNC#sgn!sFSS7h%PG z9-VN$MmlHCpfaJL&%br6@Yq*3*)-4dU`2h=oF5qlW%Q{_1PFzFp0(d+b3XMx-27+| zEAI18>!+miU)grkl2G6mIhk`Q>aBg;B`ZRapSr)gx5+ywr?fi}EA;aje=6o$XI%Zb zy$vh&3r`X1>ADlxU-vc@EBI4+CAwU%*GDdV^$sig^X=?(`F`rc_SF5Wu)@FakVOAC zhGJ}hF`@V`>0F+3c6fm6ni)X=;GLVd_Q>Le<|n5SL;xW@gK68%mUZkeR>Onh=gb_Nkd0g1=8*Db#aa5#GsgaI0F zY}Cw3u^V3!nZ$wSUADpP`{O=469fYB8T6+0{x5HS%Td8Z0-Exn)NT$Jwy$FdLV@7I zt;eJ|PhYNBw+9mo#2BI_edBri%|i%+0d29HP~nn3%wCn^Kf&u2JcIX$2-Ih|H-punW-();=ADi3-$p?ILf}x8JmQ zX^RO9e9}3thdzGSdb!UJ6Bk6jQZx@Y=XSq;aRn0?sA}42+a_OafAcsD6B+o{SOk8f zhCiCYM-Uo>KWx>{k&`vtX-p6ss3l(obizX&E=Upt2fm$^xmzvGKb92LW1@rbaJ%kY zua1CSTM{tgL9)$%)7nd>ox>tb;)C5ph5bPVPcJ@Sfe8>oCCk3mb1iF9+8vCE5E8~p zvBO>OI-Mv4A%a)(hy8H=D(CP^y_gsw*cGjuXrzB?Yi|!hkWe;G$S_Sk;UGW|C1?xV zoMuZY?)xZ85GDjU?bI(F>0k2RjUY~ld)ZDsJ;^ccffGTXps^LpdQJ{~Z`4&1y6t3Repyig;aNfU?C9sRQ=J1W&QpGoS0}K zI_W5zY~<~;SK|r71oln+RUaLD1#0!3{9GbFR7-L<|giEOd^84;~4r0QFu!Pz2X7RZF`;YG>h#N266iuc(q@_6!1P;D^Kce&A1s@Om z7>S7-!W&|C8muzS;e2m{2_2GI#?Jm@c(lDL)iJSyw@UI9hpr9JWho}X<4{+}jcrG4 zg5U6BqK8Bs_4dl#O%G;-5`+)lANSWr=)T?5o6&`dA3_?NrdeklD(ML&2p|$3b9PiX zZtMx|UWkbxw81N9pO+u)%9J7qA%cSya;5_tE!97eI;Zd&)*||Wu|KO$+Odt_h z>z0vV6nDzJoxwtaXu{KS_1Jdy!2>In5rh+d?g)`sy@jSKPfIcJM5JzGZ^Mz!#;2Q( zVFC(uL9zU5e#zt=3Iq{_&!~CsvsTX;1E+g2Aw?wprBs6fW#^tyf|x>8&6_p6f-;mu zWfD{trF^*%yjt@hA3;)F)W37ELTJNa@PU*MGG za#a&CfknvtL(W4Z-ggx;Od`wO2)0`82EO23N|?~XyZ$~~3~ku{W+Fjs5jteJR;W3l z^pZ0{aFLi8U=g^)ETAQpAiD6T)=lRWda?1A2tjxee7E5J5Iz+0NG5 z6qz@6K0%NXxbl5XX2bSc{Rsq7MyzU~Me9DNJ*ig%F=2+MJGHZMLS@piN={6i5qR-V z;+kRmbdmk(m_Q?HVl!Jbpv10sIzgo2$(N%P)a~^53nU0N{D$hQCk+gxEL}zrYeY?_ zX0CVISILzziy+wK%c^y&O?YuTgdp1RPg2vC8dLXZ-4udwBeMRIw@tp2&xwr-G4Y04 z)LVUIVkNs|aXlvB@ZBj61Rdds3Z-Y_9QW34=*C1H$+|}IVp`{wGHZgc!#kii-Olc*+S9`} zn7AXfV8=W8xBS&Md<20JYrk! z$-PC+>kB7g;t$RGw64ecEnmA#2?CIS&q3?KuJFG6g4LJ^B*xZlJyhy5zmP!?f_TPA zz19@Jx`8{9AO;DnJ>s!hx>EM;-egP=65aB8Wy>6%6}szqF;R$TPGLlP(spG&4}vhn zzs{8JL}%4P;dp{LBuXnY&ba;gni4lbAmXuoA{ojaa_a1z1q6|(_Y#}O}DtSiXa&Al`=TylmrweC--8akx2UDYufUR4WU*9 z;fNZXF~>4;k&k(IDkdKBna;jCgFk(pN4p{>APGxpg$L~pJ}|hu3KNke`3(%$Q)<>f z&Evy_Bwmr-kBTlu$q3ZhV`7p}{_4ATdUu>~SU?bzBt0^xt+U;0COn-WD)AX!P(NS zm%oc$bO<8|P2zdBGH1j>?9O--#3q`7Ur5(}SgFz>2u^}4CYU`pF4&pBZ4D+miS6{b z!xh9B)*Dd9geTgC^W&%uix%51Ac#)_iV73>61i{B+GLCgP-2>KNq$p&TpgMM2_lqn zPT^9kEAv0rr(!~sfaI7AVHvgBcNYRMF-p|RwSUSkx~9!sf*{3n=*(BEi{5E+$qAS! z#ZNobC-Z)-QuqueVTyC(uILA4niE@EF>#7&`ewMw!oqu`MG3JVJrwKu@5}p(ECR$!Z z`FL+XCR$N-jXigsq7StC5riu~>$b#%PMNbjDc3RaN?5L0@~OlpSphkMfF&98@}AMB zxveH51QCl@_*sg0?=|!1&n99*mXM^-8)?6<2ZZejVwME&ds_B>kqM=zj$?urZ_AP9 zIOFFWxrI5Hs3n-beRA$TVNUjpF_^F=9vz=@nZ5U=>#paRxJ7HueO)%T*rjUtAtrDM zPS#^Q9oPKrP$EI(5>GK2KH|PUr_PKZbkXF*FK!?38guT23?_C7gmoyM{lUh5RE!{a ziPf17T5CRk{`$i{O!VT3Em(LY&3-rIT}_pzm$H_CNPYeN_wOmgucCdl)+}rk?Oi$C z(YM`Yv1*TYZR2z|p5i%+SB9RQcYBeS<#)Z~Rs42iZ>yWX9>0#8t!tiugRJODxBRIg zmK{8YT{2(1ZRw|aoSk@t+sn!JUR0Q)tl2z%O}RAdyO%!C;>g}o{>g2WUG<}HKUsFXF6Ef37Ga~nEu=wUi|nosL_rl-l+x8LIx90&6kb_v&}iMW(X-9HzQ zYrm*7S(*A>X=;??tciY`*n2mxELzC-Emn5N>Y{$u@A=G<8({H3)#_L9{tgOqVK z=ht1^E7|I8ZnFIIYK3t3T-%TZS9q!G4!8uUJdd)B)9o>xR3Y@wYRiHSE9{GjI9Q=R z?ns@LLf=c+RZ)S7A*63gVk2;)$v0Mv>|l}D4%|~g{?}Fxwv{tVR~Ysp3k!=@0)iH> z&H}<9qf_<~_GBhOo*_M65+fa5Gzs|6zGr6o{;seq0&H^t>2u@}=_6hldaoo_1UH(5 z{qLk7h|Iu(MOJuTNZ$d{LFEeZ)JW_NZd8s)yb9dto=6-9ZZyeCVmEN3NoNw?UA#Q#KEUarVSovI?M>9?zp&T@!f69hfu-?c3> zVkYZf*hiBuAl{EEGp#5%lJ?P}!5ssF_+bBpU9nh*=kGqtPy0;-l@!%s-{9VtL7eRH zaiOw>36}qk(H;nEzyF`N+mixuvfAyTBMK<&PzXFzN(cBMo%~KXqPhT?TL&}7K$Z=o z8|opWi)a^lAgg-)xlgD!?A0>L3-9m=JI{F_J4O&sCAnT}QMD zC@@38sQUxcckl23UwL|@Pnb7sF)>mx5f<%38{i(T zS<*t^2&&`Bv~9tS7J*4@4{j9}YyxhS$E3e5xLKbC^)=8p^#4^oLK^Z+IZUMlK)O4a z_e0{HfDwO<6>G8JY;dFdC;d_0v*O%Qc<(5@Zxr4Dcs2+bAHvgFa0<9JM&Vg3coVo; z(?@j{E8aW`XNKqnq3U2g%$?#^Qu=yx#F$!Cb!d9a& zDtoN)qy8o@W(WJ{4XFzW2G^pl^f?M{U|J-E;Sc>d*rP|0!gq{{_jEF3rh%(eVkb4a0r;Wu$>{jW zut8uk987>v!XVrf2=`|{4(3VJ9-tp;?^%CzCP4iP^iw7d_#a(67Gxbr52Yvt;&hBJUQ$5#=4~TOzxh zF5osF2UXLVTc)P6lLdU>Fu21U7}3fVh}MFoys;UP59) zu3&}dH;XMce}d`Ls>%d^+Jm7)Hc1qvQli}Uz{^1GJNfM7kuX5?^L#OcAI}mFS=a%S zIP!Ejhu#JHDJqB03!kI*UmRUfC|z(Ls9seCLEq7DCpKy?3hT08_o86MsQ*CXPwW&5 zeH2D*UQCo=o9Eo(meWCW}5@a?it0XQ4Ob6_Sx6`GAS^o&I3xzG%5*O1^mr;El z9SSE5YCM?ssG#cwoiwx!0~&&cqAhq~%zuK4_YWS4g!v&b$C7aIA4ZaRxQjnmxQ9b< zy*wQ6!x6okzm6v$FhIdI)ZNGD=a>|3%ryk>U0bt$+Dn0112Qb1S14DdSPq9Se>V`LnMH`hd&oW>GB@ft79(Us*0TSW8%p$;w z7Hgy)fsp}jA%VWI+jNjm5Nv6RZ=c*;f)ND<)ItN{Az))sxZ}vca6i~g7`E~9#j(NO zb6{EvW;3GEjub!9$Z4Dr4F908Xk@KN0S`Jn!A4tXbZ8jEADI9Pg{xh?7<7Mzhflaa zi=SU$U=RubjVVq9rB7Jzl3^%%Dbk@K1=C%=Fdq{bBnyQRDrqvOP%N-VNq~pnh#fUz zbc5zzVEb1FOtKSGENBmtFds-8*;XTVg^OXpCMfWYG4CrBY)CUg84O=Kq#quDTqytO zC=HgoMMlqDN9>B>8^DuA*b+4(G%!5Gok4dC4~=F-fi1GIktpyv56Byor|uyzMpN)$ zMEF2p{BZF6A+XIX+%tUkFl8K#PlI(k;`UKG$QM!xNBg#bFO(f}mg?tw!?QXe;X$yI zFg!vyb5r3zT1-RnK}MjKg4m%0?+3upf#aNj3;w zCJ?ryL0)uOln(mko+A1MMQ}vth(|!Xs=J`qqqLs&FMeE>()--CJN z5U@9{MDFi^FNVtJGx($al^aBi>PlwU587uRPcVW9GljShK=%#|^rd^kjxz8$;4_dJ zUf_?4zu0Li-VmkF?pYD;95JDf-L6&g2S%6>k5-8?G4fNAx4AqDgszsPdBOe1?g)qD1 zhG>3->DGg4!x~i^X5nFWXfMeXP-!stzgq&9`5-|nW<~Kc1q)O~=rb)3qSMxafyStQ zuw>Q`pnL}pM^+Cg1UjP!H;o=s7gY|7P(55bgu=BZP#qXU4H(M2DRcp<478b*fictt zC<&OaHbgtc65qeg&+q?do2MV>2~T3?X~OV_y4(zkbBGP==l-)M2@Q9L>M+zZ9Qq%q zOrh}|4FtK7@G>#_mbgLCw}skH)CWRtBvU|;9|}7IWF80__X&cau&CTm0zvVibI1>c zM{%Mt6Dsd$UILv%VFW->yeJLiM&Xbf#jjRDrRag!fOvsKf@}cU4N?qp2BZe$F-SMa zClHQG*oPiO9z+Ag1SAyXD9BZiM<87wy&&H~CY_{Grh;gI7=YM-_<#h1q=D=PIRbJC zg7?6x2>AY?n02X2&Ss6NdHL38u_LH>{^oKwC)#qWo#^M9_9 z{oG5!7{Z`BAC+^I-~X-sfgx)ALv{WEkU!oNSZstg=o#D(YU^U5%|YekkKynj40XvV z92cqBMk2B~stRHMxSt2uS@jEZr7zN?E0Yn8tV_YjTgk&G+8K}jaeNjK-&Bal7zCAF z5}PtH+!C$>YT?)jgMB)9Xia9PVEUDU3LB;R4JRc_J(5DX9QbklGzdkZta)FY?4a$h z@D9B&=8sKs)o6MM={0g>TeMwq;;uIK!Fl{slsdwu_4M7o$MJaV)z;FR=Y$hyA7q~) z`N|aC(Espbi&Na`u;Jc?kbMtZHYoAauA4vg4GJ*2J*8#)gMi=@GfF+Lmq^dy7hiEt zXCb%su=}M@n+C!6{fv(?=WM>#JYN0yZNTSS?;ksVwHi0_E`G^EProo#7(GI#1^Vd> zuV^I?=u%_LYkzzl9*RiwfWC;XOv$&j0zYCF5fNX3dXf zfTdXcxdF4LkJjlBM!z+4I;e(mXR(~%&Pi(T)dv@1 zoPI)G?uXaB6Xt_@7%y0S{chX++9cmWV~neA-V>Rr_vBjgpf$!j>ZYH)wa<53-k>AK zNri6l(tgE{ss=qU{?h6^dAaA&{SOBHFrM+@%F}J%+CRM?48!>J>fs}YN-8TS4aH%c zY82-;&e?6l^r0k-t&}gTxeTAHTRfD8vCWLCEosT7J5~&3VSGM8Hb^?Mzb$Mi7vqf6 zou~JmZ#$SVbO7V5_^_1Q&WFDp9xBH8cFv)UZ9#fxt`1dT?8`sp;INxFg~fG z!mycMdb5A%D#pc$v5nW;7w_U5Zoqi_f?0A`sg7V;>ORKzwububl9oPVIQ$r6?i-YK zA1gNux(|0?{6>Uls|QEtxrE^!j2lwS11C0|OWQU48Dn{daQkw>Q+LXT2QWtO9BS{} zTf;vqW@_R6?(SjKx}u+3@wGQmCG5Dyhk5FWS>K}OFJ2>oTT2S1oPR=H?5*re^Y9k} z^H+|qV{fS@WLV)@E!bmp^{b-?=G}eZk4Ih5eoO5ZoH5gEUkYU*j(z5jtM^q3+}{>Z z^e{eDQkyo9@wD_jZha_}M~tH)=^QodTJS0-g|b^bSf^jy>FP(UZ3APoF42SXJ|$kF{VXW!2qxPDWdTlWq8bQPJ=4F3(tdQGY!-ht56v_+dyj|z_ zEqVH!?EuEp)8;=?tIjDLU@OMhao^7UA-k`C5g1c}@vRH5tgS9SKBY3|9LDY1QXd6B z4Wt;4xr%XNl;gdeTl5CcF%1~ESxt@ov_fF#nlbk=)=-wreq5Q?o-^h##yiSiI9lC# zcOb^CXy#qzY#t~=VjQNbQNUqk&_vuGd$FmP$ET3d|kosP- zkuyfVpcBG zTb;@-jj_U$Vs@>LsTT{`y>_qT@7RH(`mVT1ZUrGWncJzy1Vk|DywV% zo#7kr975*d3k_txNhB{JHwk1R35j9|ARq+D4J5&!Nq8iAqCCn?NC!nkY^yGPs0@7$h^>gj)3xdX`dVyPt>*pC_uUU-g8tJ#x>moe%lY;_d+#&tbM`rV zZ|MJ^57qRe3k`YbGtG|*REXC(bH$`U8EQMR(#xg z)LooM9C#02tu;29zjqY8Zxp;g3V)dnGxMOBEk#>tW*3{4m1b#i4rrY64vgX_bdES9 zIQe4D7dq5|t4G04B5P!Qg)|9xY<)6>5{L4%EPT+Oc%p6mJ$PQ5Cb|I`S@kH*AEGo4 zkGG>R66?Iviu5Cfvr?8MZT}{bs;B#;$b+zgoWCqf#~-P1=q6)NHnP2?fJe6X_EGSA zfW`jOp}z?Dh7s_~QTQw6A?m5|ANO1LxQZEe?e?R~nu?ZUOSL?!C`)qipZijL*erW{ zuI`jd(Eex{hodyXqF_NDe!UmJ;afCzjJ~kX>TFqyJs0R49vjd$v0sSVvrrf=b9Nkc zmL1C)+o&7Du{*YQtc2IgzD5GEBDUWldIN-IeH3O55mwR;G$6oLuo7-n;eQ)}Ww|lF z5-VzNZZm~Z7UivhJ-MsE0t7GIRV->JSYR7whp9LRKD24*CHq`80u8%9?2%XCo@x=& zG6MGn;AVhk1a4>F?Y$kVZ@+U4?q9~@cC}eIR(z4G`Lf@Ni5kJP=hlvP_=r1J-a4uZ zb->L;`J&64(Vxw0a2v*25fC1Y*SWpJx)4KH8m;?3%y83n`R3%(rD3xmIugC$Q3)P7 z!QklI5Tg%;2$I=hm91z-CLneGx;3MnW#%EB3js zx4YRAh7f9n3OhlPx1xn+Hl(eiv#%4i%*h14I75$_L&C9(OAg`nXca;4Hv|C~V{mH_K<<6lv4vHlAkB=m?Wo^|jWo9l2*#(Hyo zcD9kfbj&Eia8QVujR7oLDcHOyoCMfjCoDg0R9qdwwsXXKYFToGzX$S- zux9g@;3?+*?~qQo!b4oBV+%Y#ZOfyRZ`0d(R!Q&!LafCs0g(krnV^XSuMko(r=#95 zn>1Q3%mA(3h&=3qAJdvEaF_PLy=?n!zKD7Y_=x>gC(=BmKgW6{m6lg^s9Y-qK+W~ibCjvbX1!R+3F6}EkEKO)r!WIe|VHYI-;s;gu zCm;Hi4;%Gx@r)>OjEq8WjkxMtGXKZce{(S*L?4fYg)VU58U(6{@pRyxQE+b*ZVCp2 zOP9AH2HeC?EC`v*7B4xt$qI|JkP+c)3x~gla=qa9L!_d2hka(nJq|qP!eP*ES&)#VJCkNshD^AtF{e4fD~1| zQjXvd^`_dI#3sK&Uk!XQFPwT^vp=Kz%GJOXJ`WiU$VWN`7ZFUt8C$p-zHQ3}ZXZd$ z54wrK7qTwwL=G%;pO`z6LI@+A%Bo5=O{a$JqF(MN0U9HZ3&fJ~G@d4UQsh)Eon(?# z{5E=kJxveMlk_xw)%}|OI(>tlCGW`R>4*FydcnNJ|3?4LJ|*s~im45=w`|+?gLRv} z^Wft@KKRY26;&^-n!4c6r%v-d%S^|oZ^yDO>O-R z4YOO@mi+9QZ@7VG{pu73Vg^P=q|K%UU^KO3R z(O_X#_WZ}T5B+e*uH8=_JoH<|X)bXAL!~n{GDYJ*2#<)uy#fY zgOPz$R_sgRnR=R>C(q#C+{j)flV|d5t;E%EeSeuAXJ`o(HRWuDrWeJ@87x^Q)l>M5 zav?WVU9C2=xLYq}AvsCqZnd$#Y_eyv8q|#bNpo+^({kgICZ)v2>kTMih9^-qlsYX- z?{iI`nyXaEhB8MXvY*M3P0Q2jG$XQe*@POGp?JoH6r(hs$47oq**ec%ryI33$#vR1 zPrYhHKB+ZQ+06Pf=G6?PTs8Vj6V(cqvVi!m^K5*yz0Vc-?LD(rcm|97aa;Bd%pCf~ zK)IUBmnf5rS|eK?H}F(b+l{(|zLy8`Bjf@>-reHG`}!U`d?zSEmO; zGU-2+JMh1ezvj&12B#YXGiFsqeqE^$K3`5Qq5a-`-s)apMD|Zf_2hG1rCufS$i_1~ zz&z{@-mJJe@wxdFG%j14(9nOgI~8>))x1E})yPW|jX^~sOqLaes*0xS0VBng=uYzZ zy>1`(vzVB1I(`y_Cy+#zq$ZOTnjUAeJXYWek|JJAuOqwY9=ezB)Ba9Bl|Q4Ovtj+o zwRdjX{CLsATQ=Q$f65=cz8hzK`j24Yv?WWM-yPh1-_{5AJbm!lqsLx6{`UJH3`^V+ z=(12nRs9W12k%4XPYynN?D&b3?|&d&5%&rq@5@@-2Dd)?*o!AldICA2ikkX`O-q(F zx3+EGx(6gjUp)8z2bVm7n)=qZ$l#9;9X|5f8<+mH@f(|V>^ywr=<_GfzE$_|bFUmb zak9Q)_QFNWn(w}E%hNx5=E$#(J^w}^F1~5WCx88XIMVr_Z=ds~cXg+vHn0Es{sSAH zJroz8mR>uvVYZO}uW$J2(N|yl{iQ!$UemLsx9`D8!NOe!o;mXT$v4hDB2_>1aM70Z z-@STbxMB9rio$UZq;?@wll8sUY!gsY6GiW)E)eKG2MmGKlqXBtx(g{pCLnYk3=9WOVi$?8It zD)H_{emyI|`V>%n?hsF%*lc$4RTCpG$OBKYBxT?;wn&ZB6LcYQs}w^?QWmLsa;=fi zAsnpOmCutD7mGZBtis}(SY(G*$$YF*oucK*1H*v?tuRo)GJF}n$h~~vp+wjCZ+}-V zlq(==33}x4gkE>#^`w5k969Iuziq5c?_Uxd`MDN(Nj4HHn4wJ3YBjgg>q=vb`64~C zF(Ji>(`WI>J<7fv?s#52#QV=qQr)r~+3D}UtP(RmOkpPd@9TnoMFz)SEh^v4)R_Kk^_0@w{&vG(7DkJy)v!4)pJS%{yWNfu9Dv zC!lA9t{l7P?drDAfn#&5gJ6$YX_j2W3}HtS!R>U-8bq}me64TUdd>w!YL$QWh~L^F zLM5@4v#bHA+aPd-&lFdSNgKH-ZI#2)(sA3Rn0PbYZHCh?=5No-Ei&`FcfONPcZUno zJ`D$@&&|?p!{O4;$oW!YWRzuk&X?`;wv-np43!t9wAB4MZD>|?NlW9URYP-TcW2Cf z?9k9$>14~iw$nrNq_Y_}OYfYYzyIBqg&)74vFOxCLyJu5!lFxL!(wSQLXQiuA*A>t zb*`fEe$oaJrj+onk+kF{S4h`M0w+4ut(?aywcG?^;^$}y*C48@K~qUckaG*jwlX)K(Q7siqi|6r~sQBET}q*4@-ZBMF;= zOc1h=M(M+hc!(+rWb|0IM1GSYvCSlGN=gTnI5AAxNU^q~?uk?;57DF;51FJTx`M0- zZKE`cT#ufo)Qxr(lF8sosf>2#QjJ^?-9{i>e!n>Sl6T4XWQn1bJR5fCAA!F_8(FQZ zn6D$Hz8tjEV8!66k}8%d6KyJS(-IvDi!?LQmFN`m7-8CYt7i#`BVLusztKcv;zh4w ztOOpRe?;9Bq{(!?CcarE`UAOb41+35I-!>_@{kB}Kg#38G_n4}^D*p?F|dIZ;xiwgb@=>0kih6y literal 0 HcmV?d00001 diff --git a/near/res/omni_prover.wasm b/near/res/omni_prover.wasm new file mode 100755 index 0000000000000000000000000000000000000000..5967acb692ec1aebac386ba2a62220d35c6d6815 GIT binary patch literal 329724 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μ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 H2lPJxW!Wi< literal 0 HcmV?d00001 diff --git a/near/res/omni_token.wasm b/near/res/omni_token.wasm new file mode 100755 index 0000000000000000000000000000000000000000..c5058897bc5c61cc48ae3b9b30cb4b30c555d220 GIT binary patch literal 256703 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%0Apsc$U$}P!&F9?qBLs3Qg$M5g((TLipzcQ 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

E*6k_4BoM6IOQ|XK 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