diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7eb1b8c1d..888a46285 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -56,6 +56,13 @@ jobs: env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: + - name: Setup SSH + uses: webfactory/ssh-agent@v0.7.0 + with: + ssh-private-key: | + ${{ secrets.SSH_BRIDGE_INDEXER }} + ${{ secrets.SSH_BOREALIS }} + - uses: actions/checkout@v4 with: submodules: recursive diff --git a/.github/workflows/rust.yaml b/.github/workflows/rust.yaml index bcda1739e..06a71dcc9 100644 --- a/.github/workflows/rust.yaml +++ b/.github/workflows/rust.yaml @@ -23,6 +23,13 @@ jobs: matrix: component: [near] # Will be expanded with more components later steps: + - name: Setup SSH + uses: webfactory/ssh-agent@v0.7.0 + with: + ssh-private-key: | + ${{ secrets.SSH_BRIDGE_INDEXER }} + ${{ secrets.SSH_BOREALIS }} + - name: Checkout code uses: actions/checkout@v4 @@ -49,6 +56,13 @@ jobs: build-and-test: runs-on: ubuntu-latest steps: + - name: Setup SSH + uses: webfactory/ssh-agent@v0.7.0 + with: + ssh-private-key: | + ${{ secrets.SSH_BRIDGE_INDEXER }} + ${{ secrets.SSH_BOREALIS }} + - name: Checkout code uses: actions/checkout@v4 diff --git a/.github/workflows/security-analysis.yaml b/.github/workflows/security-analysis.yaml index 48e5355bb..1d894a0c8 100644 --- a/.github/workflows/security-analysis.yaml +++ b/.github/workflows/security-analysis.yaml @@ -17,3 +17,6 @@ jobs: uses: aurora-is-near/.github/.github/workflows/security_analysis.yml@master secrets: DD_API_KEY: ${{secrets.DD_API_KEY}} + SSH_PRIVATE_KEY: | + ${{ secrets.SSH_BRIDGE_INDEXER }} + ${{ secrets.SSH_BOREALIS }} diff --git a/.github/workflows/update-contracts.yaml b/.github/workflows/update-contracts.yaml index 34a8bac2a..cc61b3893 100644 --- a/.github/workflows/update-contracts.yaml +++ b/.github/workflows/update-contracts.yaml @@ -13,6 +13,13 @@ jobs: permissions: contents: write steps: + - name: Setup SSH + uses: webfactory/ssh-agent@v0.7.0 + with: + ssh-private-key: | + ${{ secrets.SSH_BRIDGE_INDEXER }} + ${{ secrets.SSH_BOREALIS }} + - name: Clone the repository uses: actions/checkout@v3 diff --git a/omni-relayer/.example-env b/omni-relayer/.example-env index bf5e4f468..89969db79 100644 --- a/omni-relayer/.example-env +++ b/omni-relayer/.example-env @@ -4,6 +4,10 @@ RUST_LOG=info AWS_ACCESS_KEY_ID= AWS_SECRET_ACCESS_KEY= +MONGODB_USERNAME= +MONGODB_PASSWORD= +MONGODB_HOST= + NEAR_ACCOUNT_ID= NEAR_PRIVATE_KEY= diff --git a/omni-relayer/Cargo.lock b/omni-relayer/Cargo.lock index f18c45ed3..995882df9 100644 --- a/omni-relayer/Cargo.lock +++ b/omni-relayer/Cargo.lock @@ -120,7 +120,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if 1.0.0", - "getrandom 0.2.15", + "getrandom 0.2.16", "once_cell", "version_check", "zerocopy 0.7.35", @@ -278,7 +278,7 @@ dependencies = [ "itoa", "serde", "serde_json", - "winnow", + "winnow 0.7.6", ] [[package]] @@ -474,7 +474,7 @@ dependencies = [ "rustc-hash 2.1.1", "serde", "sha3", - "tiny-keccak", + "tiny-keccak 2.0.2", ] [[package]] @@ -544,7 +544,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d6c1d995bff8d011f7cd6c81820d51825e6e06d6db73914c1630ecf544d83d6" dependencies = [ "alloy-rlp-derive", - "arrayvec", + "arrayvec 0.7.6", "bytes", ] @@ -713,7 +713,7 @@ dependencies = [ "quote", "syn 2.0.100", "syn-solidity", - "tiny-keccak", + "tiny-keccak 2.0.2", ] [[package]] @@ -741,7 +741,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d162f8524adfdfb0e4bd0505c734c985f3e2474eb022af32eef0d52a4f3935c" dependencies = [ "serde", - "winnow", + "winnow 0.7.6", ] [[package]] @@ -820,7 +820,7 @@ checksum = "d95a94854e420f07e962f7807485856cde359ab99ab6413883e15235ad996e8b" dependencies = [ "alloy-primitives", "alloy-rlp", - "arrayvec", + "arrayvec 0.7.6", "derive_more 1.0.0", "nybbles", "serde", @@ -1097,6 +1097,12 @@ version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" +[[package]] +name = "arrayvec" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" + [[package]] name = "arrayvec" version = "0.7.6" @@ -1545,9 +1551,9 @@ dependencies = [ [[package]] name = "aws-smithy-http" -version = "0.62.0" +version = "0.62.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5949124d11e538ca21142d1fba61ab0a2a2c1bc3ed323cdb3e4b878bfb83166" +checksum = "99335bec6cdc50a346fda1437f9fefe33abf8c99060739a546a16457f2862ca9" dependencies = [ "aws-smithy-eventstream", "aws-smithy-runtime-api", @@ -1558,7 +1564,6 @@ dependencies = [ "http 0.2.12", "http 1.3.1", "http-body 0.4.6", - "once_cell", "percent-encoding", "pin-project-lite", "pin-utils", @@ -1604,12 +1609,11 @@ dependencies = [ [[package]] name = "aws-smithy-observability" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445d065e76bc1ef54963db400319f1dd3ebb3e0a74af20f7f7630625b0cc7cc0" +checksum = "9364d5989ac4dd918e5cc4c4bdcc61c9be17dcd2586ea7f69e348fc7c6cab393" dependencies = [ "aws-smithy-runtime-api", - "once_cell", ] [[package]] @@ -1624,9 +1628,9 @@ dependencies = [ [[package]] name = "aws-smithy-runtime" -version = "1.8.1" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0152749e17ce4d1b47c7747bdfec09dac1ccafdcbc741ebf9daa2a373356730f" +checksum = "14302f06d1d5b7d333fd819943075b13d27c7700b414f574c3c35859bfb55d5e" dependencies = [ "aws-smithy-async", "aws-smithy-http", @@ -1640,7 +1644,6 @@ dependencies = [ "http 1.3.1", "http-body 0.4.6", "http-body 1.0.1", - "once_cell", "pin-project-lite", "pin-utils", "tokio", @@ -1649,9 +1652,9 @@ dependencies = [ [[package]] name = "aws-smithy-runtime-api" -version = "1.7.4" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3da37cf5d57011cb1753456518ec76e31691f1f474b73934a284eb2a1c76510f" +checksum = "a1e5d9e3a80a18afa109391fb5ad09c3daf887b516c6fd805a157c6ea7994a57" dependencies = [ "aws-smithy-async", "aws-smithy-types", @@ -1666,9 +1669,9 @@ dependencies = [ [[package]] name = "aws-smithy-types" -version = "1.3.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836155caafba616c0ff9b07944324785de2ab016141c3550bd1c07882f8cee8f" +checksum = "40076bd09fadbc12d5e026ae080d0930defa606856186e31d83ccc6a255eeaf3" dependencies = [ "base64-simd", "bytes", @@ -1869,16 +1872,38 @@ dependencies = [ "serde", ] +[[package]] +name = "bitvec" +version = "0.17.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41262f11d771fd4a61aa3ce019fca363b4b6c282fca9da2a31186d3965a47a5c" +dependencies = [ + "either", + "radium 0.3.0", +] + +[[package]] +name = "bitvec" +version = "0.20.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7774144344a4faa177370406a7ff5f1da24303817368584c6206c8303eb07848" +dependencies = [ + "funty 1.1.0", + "radium 0.6.2", + "tap", + "wyz 0.2.0", +] + [[package]] name = "bitvec" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" dependencies = [ - "funty", - "radium", + "funty 2.0.0", + "radium 0.7.0", "tap", - "wyz", + "wyz 0.5.1", ] [[package]] @@ -1897,7 +1922,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" dependencies = [ "arrayref", - "arrayvec", + "arrayvec 0.7.6", "cc", "cfg-if 1.0.0", "constant_time_eq 0.3.1", @@ -2005,7 +2030,7 @@ dependencies = [ [[package]] name = "bridge-connector-common" version = "0.2.0" -source = "git+https://github.com/Near-One/bridge-sdk-rs?rev=8f1a290c162a91b0314f363759fdc0e210e48d89#8f1a290c162a91b0314f363759fdc0e210e48d89" +source = "git+https://github.com/Near-One/bridge-sdk-rs?rev=b79015b09390fe129405f894c428e9ed62729e08#b79015b09390fe129405f894c428e9ed62729e08" dependencies = [ "eth-proof", "ethers", @@ -2017,6 +2042,26 @@ dependencies = [ "thiserror 2.0.12", ] +[[package]] +name = "bridge-indexer-types" +version = "0.1.0" +source = "git+ssh://git@github.com/near-one/bridge-indexer-rs.git?rev=73b0c8947de08b8e8a8f68e8b7693e75c74b6a7f#73b0c8947de08b8e8a8f68e8b7693e75c74b6a7f" +dependencies = [ + "borsh 1.5.7", + "bson", + "ethabi 12.0.0", + "ethereum-types 0.12.1", + "hex", + "near-indexer-primitives 0.29.2", + "omni-types", + "rlp 0.4.6", + "serde", + "serde_json", + "serde_with", + "thiserror 1.0.69", + "tiny-keccak 2.0.2", +] + [[package]] name = "brotli" version = "8.0.0" @@ -2054,6 +2099,29 @@ dependencies = [ "tinyvec", ] +[[package]] +name = "bson" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af8113ff51309e2779e8785a246c10fb783e8c2452f134d6257fd71cc03ccd6c" +dependencies = [ + "ahash", + "base64 0.22.1", + "bitvec 1.0.1", + "getrandom 0.2.16", + "getrandom 0.3.2", + "hex", + "indexmap 2.9.0", + "js-sys", + "once_cell", + "rand 0.9.1", + "serde", + "serde_bytes", + "serde_json", + "time", + "uuid 1.16.0", +] + [[package]] name = "bumpalo" version = "3.17.0" @@ -2070,6 +2138,12 @@ dependencies = [ "serde", ] +[[package]] +name = "byte-slice-cast" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0a5e3906bcbf133e33c1d4d95afc664ad37fbdb9f6568d8043e7ea8c27d93d3" + [[package]] name = "byte-slice-cast" version = "1.2.3" @@ -2380,7 +2454,7 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3db8fba409ce3dc04f7d804074039eb68b960b0829161f8e06c95fea3f122528" dependencies = [ - "bitvec", + "bitvec 1.0.1", "coins-bip32", "hmac 0.12.1", "once_cell", @@ -2504,6 +2578,26 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" +[[package]] +name = "const-random" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" +dependencies = [ + "const-random-macro", +] + +[[package]] +name = "const-random-macro" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" +dependencies = [ + "getrandom 0.2.16", + "once_cell", + "tiny-keccak 2.0.2", +] + [[package]] name = "const_format" version = "0.2.34" @@ -2536,6 +2630,12 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + [[package]] name = "core-foundation" version = "0.9.4" @@ -2705,7 +2805,7 @@ source = "git+https://github.com/near-one/mpc?rev=463172481597ee09b12020b72c61d6 dependencies = [ "anyhow", "borsh 1.5.7", - "getrandom 0.2.15", + "getrandom 0.2.16", "k256", "near-account-id", "near-sdk", @@ -2718,7 +2818,7 @@ dependencies = [ [[package]] name = "crypto-utils" version = "0.2.0" -source = "git+https://github.com/Near-One/bridge-sdk-rs?rev=8f1a290c162a91b0314f363759fdc0e210e48d89#8f1a290c162a91b0314f363759fdc0e210e48d89" +source = "git+https://github.com/Near-One/bridge-sdk-rs?rev=b79015b09390fe129405f894c428e9ed62729e08#b79015b09390fe129405f894c428e9ed62729e08" dependencies = [ "crypto-shared", "ethers", @@ -2906,6 +3006,28 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "derive-syn-parse" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d65d7ce8132b7c0e54497a4d9a55a1c2a0912a0d786cf894472ba818fba45762" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "derive-where" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2364b9aa47e460ce9bca6ac1777d14c98eef7e274eb077beed49f3adc94183ed" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + [[package]] name = "derive_arbitrary" version = "1.4.1" @@ -2948,6 +3070,19 @@ dependencies = [ "syn 2.0.100", ] +[[package]] +name = "derive_more" +version = "0.99.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version 0.4.1", + "syn 2.0.100", +] + [[package]] name = "derive_more" version = "1.0.0" @@ -3291,6 +3426,18 @@ dependencies = [ "zeroize", ] +[[package]] +name = "enum-as-inner" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.100", +] + [[package]] name = "enum-iterator" version = "1.5.0" @@ -3398,7 +3545,7 @@ dependencies = [ [[package]] name = "eth-proof" version = "0.2.1" -source = "git+https://github.com/Near-One/bridge-sdk-rs?rev=8f1a290c162a91b0314f363759fdc0e210e48d89#8f1a290c162a91b0314f363759fdc0e210e48d89" +source = "git+https://github.com/Near-One/bridge-sdk-rs?rev=b79015b09390fe129405f894c428e9ed62729e08#b79015b09390fe129405f894c428e9ed62729e08" dependencies = [ "borsh 1.5.7", "cita_trie", @@ -3414,6 +3561,20 @@ dependencies = [ "tokio", ] +[[package]] +name = "ethabi" +version = "12.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "052a565e3de82944527d6d10a465697e6bb92476b772ca7141080c901f6a63c6" +dependencies = [ + "ethereum-types 0.9.2", + "rustc-hex", + "serde", + "serde_json", + "tiny-keccak 1.5.0", + "uint 0.8.5", +] + [[package]] name = "ethabi" version = "18.0.0" @@ -3431,6 +3592,32 @@ dependencies = [ "uint 0.9.5", ] +[[package]] +name = "ethbloom" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71a6567e6fd35589fea0c63b94b4cf2e55573e413901bdbe60ab15cf0e25e5df" +dependencies = [ + "crunchy", + "fixed-hash 0.6.1", + "impl-rlp 0.2.1", + "impl-serde 0.3.2", + "tiny-keccak 2.0.2", +] + +[[package]] +name = "ethbloom" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfb684ac8fa8f6c5759f788862bb22ec6fe3cb392f6bfd08e3c64b603661e3f8" +dependencies = [ + "crunchy", + "fixed-hash 0.7.0", + "impl-rlp 0.3.0", + "impl-serde 0.3.2", + "tiny-keccak 2.0.2", +] + [[package]] name = "ethbloom" version = "0.13.0" @@ -3439,11 +3626,11 @@ checksum = "c22d4b5885b6aa2fe5e8b9329fb8d232bf739e434e6b87347c63bdd00c120f60" dependencies = [ "crunchy", "fixed-hash 0.8.0", - "impl-codec", + "impl-codec 0.6.0", "impl-rlp 0.3.0", "impl-serde 0.4.0", "scale-info", - "tiny-keccak", + "tiny-keccak 2.0.2", ] [[package]] @@ -3456,7 +3643,35 @@ dependencies = [ "fixed-hash 0.8.0", "impl-rlp 0.4.0", "impl-serde 0.5.0", - "tiny-keccak", + "tiny-keccak 2.0.2", +] + +[[package]] +name = "ethereum-types" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "473aecff686bd8e7b9db0165cbbb53562376b39bf35b427f0c60446a9e1634b0" +dependencies = [ + "ethbloom 0.9.2", + "fixed-hash 0.6.1", + "impl-rlp 0.2.1", + "impl-serde 0.3.2", + "primitive-types 0.7.3", + "uint 0.8.5", +] + +[[package]] +name = "ethereum-types" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05136f7057fe789f06e6d41d07b34e6f70d8c86e5693b60f97aaa6553553bdaf" +dependencies = [ + "ethbloom 0.11.1", + "fixed-hash 0.7.0", + "impl-rlp 0.3.0", + "impl-serde 0.3.2", + "primitive-types 0.10.1", + "uint 0.9.5", ] [[package]] @@ -3467,7 +3682,7 @@ checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" dependencies = [ "ethbloom 0.13.0", "fixed-hash 0.8.0", - "impl-codec", + "impl-codec 0.6.0", "impl-rlp 0.3.0", "impl-serde 0.4.0", "primitive-types 0.12.2", @@ -3582,13 +3797,13 @@ version = "2.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "82d80cc6ad30b14a48ab786523af33b37f28a8623fc06afd55324816ef18fb1f" dependencies = [ - "arrayvec", + "arrayvec 0.7.6", "bytes", "cargo_metadata", "chrono", "const-hex", "elliptic-curve 0.13.8", - "ethabi", + "ethabi 18.0.0", "generic-array", "k256", "num_enum", @@ -3602,7 +3817,7 @@ dependencies = [ "syn 2.0.100", "tempfile", "thiserror 1.0.69", - "tiny-keccak", + "tiny-keccak 2.0.2", "unicode-xid", ] @@ -3730,7 +3945,7 @@ dependencies = [ "solang-parser", "svm-rs", "thiserror 1.0.69", - "tiny-keccak", + "tiny-keccak 2.0.2", "tokio", "tracing", "walkdir", @@ -3767,7 +3982,7 @@ dependencies = [ [[package]] name = "evm-bridge-client" version = "0.2.1" -source = "git+https://github.com/Near-One/bridge-sdk-rs?rev=8f1a290c162a91b0314f363759fdc0e210e48d89#8f1a290c162a91b0314f363759fdc0e210e48d89" +source = "git+https://github.com/Near-One/bridge-sdk-rs?rev=b79015b09390fe129405f894c428e9ed62729e08#b79015b09390fe129405f894c428e9ed62729e08" dependencies = [ "borsh 1.5.7", "bridge-connector-common", @@ -3808,7 +4023,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "139834ddba373bbdd213dffe02c8d110508dcf1726c2be27e8d1f7d7e1856418" dependencies = [ - "arrayvec", + "arrayvec 0.7.6", "auto_impl", "bytes", ] @@ -3819,7 +4034,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce8dba4714ef14b8274c371879b175aa55b16b30f269663f19d576f380018dc4" dependencies = [ - "arrayvec", + "arrayvec 0.7.6", "auto_impl", "bytes", ] @@ -3871,12 +4086,27 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2551bf44bc5f776c15044b9b94153a00198be06743e262afaaa61f11ac7523a5" +[[package]] +name = "fixed-hash" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11498d382790b7a8f2fd211780bec78619bba81cdad3a283997c0c41f836759c" +dependencies = [ + "byteorder", + "rand 0.7.3", + "rustc-hex", + "static_assertions", +] + [[package]] name = "fixed-hash" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfcf0ed7fe52a17a03854ec54a9f76d6d84508d1c0e66bc1793301c73fc8493c" dependencies = [ + "byteorder", + "rand 0.8.5", + "rustc-hex", "static_assertions", ] @@ -3960,6 +4190,12 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" +[[package]] +name = "funty" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fed34cd105917e91daa4da6b3728c47b068749d6a62c59811f06ed2ac71d9da7" + [[package]] name = "funty" version = "2.0.0" @@ -4126,9 +4362,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if 1.0.0", "js-sys", @@ -4303,7 +4539,7 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbbba678b6567f27ce22870d951f4208e1dc2fef64993bd4521b1d497ef8a3aa" dependencies = [ - "tiny-keccak", + "tiny-keccak 2.0.2", ] [[package]] @@ -4357,6 +4593,51 @@ dependencies = [ "serde", ] +[[package]] +name = "hickory-proto" +version = "0.24.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92652067c9ce6f66ce53cc38d1169daa36e6e7eb7dd3b63b5103bd9d97117248" +dependencies = [ + "async-trait", + "cfg-if 1.0.0", + "data-encoding", + "enum-as-inner", + "futures-channel", + "futures-io", + "futures-util", + "idna", + "ipnet", + "once_cell", + "rand 0.8.5", + "thiserror 1.0.69", + "tinyvec", + "tokio", + "tracing", + "url", +] + +[[package]] +name = "hickory-resolver" +version = "0.24.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbb117a1ca520e111743ab2f6688eddee69db4e0ea242545a604dce8a66fd22e" +dependencies = [ + "cfg-if 1.0.0", + "futures-util", + "hickory-proto", + "ipconfig", + "lru-cache", + "once_cell", + "parking_lot", + "rand 0.8.5", + "resolv-conf", + "smallvec", + "thiserror 1.0.69", + "tokio", + "tracing", +] + [[package]] name = "histogram" version = "0.6.9" @@ -4402,6 +4683,17 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "hostname" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a56f203cd1c76362b69e3863fd987520ac36cf70a8c92627449b2f64a8cf7d65" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "windows-link", +] + [[package]] name = "http" version = "0.2.12" @@ -4759,13 +5051,40 @@ dependencies = [ "icu_properties", ] +[[package]] +name = "impl-codec" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1be51a921b067b0eaca2fad532d9400041561aa922221cc65f95a85641c6bf53" +dependencies = [ + "parity-scale-codec 1.3.7", +] + +[[package]] +name = "impl-codec" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "161ebdfec3c8e3b52bf61c4f3550a1eea4f9579d10dc1b936f3171ebdcd6c443" +dependencies = [ + "parity-scale-codec 2.3.1", +] + [[package]] name = "impl-codec" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" dependencies = [ - "parity-scale-codec", + "parity-scale-codec 3.7.4", +] + +[[package]] +name = "impl-rlp" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f7a72f11830b52333f36e3b09a288333888bf54380fd0ac0790a3c31ab0f3c5" +dependencies = [ + "rlp 0.4.6", ] [[package]] @@ -4786,6 +5105,15 @@ dependencies = [ "rlp 0.6.1", ] +[[package]] +name = "impl-serde" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4551f042f3438e64dbd6226b20527fc84a6e1fe65688b58746a2f53623f25f5c" +dependencies = [ + "serde", +] + [[package]] name = "impl-serde" version = "0.4.0" @@ -4874,6 +5202,18 @@ dependencies = [ "cfg-if 1.0.0", ] +[[package]] +name = "ipconfig" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" +dependencies = [ + "socket2", + "widestring", + "windows-sys 0.48.0", + "winreg", +] + [[package]] name = "ipnet" version = "2.11.0" @@ -5066,7 +5406,7 @@ dependencies = [ "regex-syntax", "string_cache", "term", - "tiny-keccak", + "tiny-keccak 2.0.2", "unicode-xid", "walkdir", ] @@ -5172,6 +5512,12 @@ dependencies = [ "libsecp256k1-core", ] +[[package]] +name = "linked-hash-map" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" + [[package]] name = "linux-raw-sys" version = "0.4.15" @@ -5196,41 +5542,98 @@ version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ - "autocfg", - "scopeguard", + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" + +[[package]] +name = "lru" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" +dependencies = [ + "hashbrown 0.15.2", +] + +[[package]] +name = "lru" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "227748d55f2f0ab4735d87fd623798cb6b664512fe979705f829c9f81c934465" +dependencies = [ + "hashbrown 0.15.2", +] + +[[package]] +name = "lru-cache" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c" +dependencies = [ + "linked-hash-map", +] + +[[package]] +name = "macro-string" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b27834086c65ec3f9387b096d66e99f221cf081c2b738042aa252bcd41204e3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", ] [[package]] -name = "log" -version = "0.4.27" +name = "macro_magic" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" +checksum = "cc33f9f0351468d26fbc53d9ce00a096c8522ecb42f19b50f34f2c422f76d21d" +dependencies = [ + "macro_magic_core", + "macro_magic_macros", + "quote", + "syn 2.0.100", +] [[package]] -name = "lru" -version = "0.12.5" +name = "macro_magic_core" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" +checksum = "1687dc887e42f352865a393acae7cf79d98fab6351cde1f58e9e057da89bf150" dependencies = [ - "hashbrown 0.15.2", + "const-random", + "derive-syn-parse", + "macro_magic_core_macros", + "proc-macro2", + "quote", + "syn 2.0.100", ] [[package]] -name = "lru" -version = "0.13.0" +name = "macro_magic_core_macros" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "227748d55f2f0ab4735d87fd623798cb6b664512fe979705f829c9f81c934465" +checksum = "b02abfe41815b5bd98dbd4260173db2c116dda171dc0fe7838cb206333b83308" dependencies = [ - "hashbrown 0.15.2", + "proc-macro2", + "quote", + "syn 2.0.100", ] [[package]] -name = "macro-string" -version = "0.1.4" +name = "macro_magic_macros" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b27834086c65ec3f9387b096d66e99f221cf081c2b738042aa252bcd41204e3" +checksum = "73ea28ee64b88876bf45277ed9a5817c1817df061a74f2b988971a12570e5869" dependencies = [ - "proc-macro2", + "macro_magic_core", "quote", "syn 2.0.100", ] @@ -5329,6 +5732,67 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "mongodb" +version = "3.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdf4261933e5113914caec01c4bb16a7502bdaa9cf80fd87191765e7d9ff16b2" +dependencies = [ + "async-trait", + "base64 0.13.1", + "bitflags 1.3.2", + "bson", + "chrono", + "derive-where", + "derive_more 0.99.20", + "futures-core", + "futures-executor", + "futures-io", + "futures-util", + "hex", + "hickory-proto", + "hickory-resolver", + "hmac 0.12.1", + "macro_magic", + "md-5", + "mongodb-internal-macros", + "once_cell", + "pbkdf2 0.11.0", + "percent-encoding", + "rand 0.8.5", + "rustc_version_runtime", + "rustls 0.21.12", + "rustls-pemfile 1.0.4", + "serde", + "serde_bytes", + "serde_with", + "sha-1", + "sha2 0.10.8", + "socket2", + "stringprep", + "strsim", + "take_mut", + "thiserror 1.0.69", + "tokio", + "tokio-rustls 0.24.1", + "tokio-util", + "typed-builder", + "uuid 1.16.0", + "webpki-roots 0.25.4", +] + +[[package]] +name = "mongodb-internal-macros" +version = "3.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "619176c99deef0d50be51ce3193e9efd6a56ab0f4e6a38d5fd614880d148c7ae" +dependencies = [ + "macro_magic", + "proc-macro2", + "quote", + "syn 2.0.100", +] + [[package]] name = "mpl-token-metadata" version = "5.1.0" @@ -5361,9 +5825,9 @@ dependencies = [ [[package]] name = "near-account-id" -version = "1.0.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35cbb989542587b47205e608324ddd391f0cee1c22b4b64ae49f458334b95907" +checksum = "a2b7bc5222fb14254ed47d81e869f65bb2f5075bc5fc40b24a794277c7657a9f" dependencies = [ "borsh 1.5.7", "serde", @@ -5372,7 +5836,7 @@ dependencies = [ [[package]] name = "near-bridge-client" version = "0.2.0" -source = "git+https://github.com/Near-One/bridge-sdk-rs?rev=8f1a290c162a91b0314f363759fdc0e210e48d89#8f1a290c162a91b0314f363759fdc0e210e48d89" +source = "git+https://github.com/Near-One/bridge-sdk-rs?rev=b79015b09390fe129405f894c428e9ed62729e08#b79015b09390fe129405f894c428e9ed62729e08" dependencies = [ "borsh 1.5.7", "bridge-connector-common", @@ -5525,6 +5989,17 @@ dependencies = [ "serde", ] +[[package]] +name = "near-indexer-primitives" +version = "0.29.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf3ac9f6c8a43b941776120b25abb1b387e98ced51991e79961b581fe9014a95" +dependencies = [ + "near-primitives 0.29.2", + "serde", + "serde_json", +] + [[package]] name = "near-indexer-primitives" version = "0.30.0-rc.1" @@ -5588,7 +6063,7 @@ dependencies = [ "aws-types", "derive_builder", "futures", - "near-indexer-primitives", + "near-indexer-primitives 0.30.0-rc.1", "reqwest 0.12.15", "serde", "serde_json", @@ -5601,7 +6076,7 @@ dependencies = [ [[package]] name = "near-light-client-on-eth" version = "0.2.0" -source = "git+https://github.com/Near-One/bridge-sdk-rs?rev=8f1a290c162a91b0314f363759fdc0e210e48d89#8f1a290c162a91b0314f363759fdc0e210e48d89" +source = "git+https://github.com/Near-One/bridge-sdk-rs?rev=b79015b09390fe129405f894c428e9ed62729e08#b79015b09390fe129405f894c428e9ed62729e08" dependencies = [ "ethereum-types 0.14.1", "ethers", @@ -5655,7 +6130,7 @@ checksum = "bd5009712faf116cdadda4c1636daf04f0f53a5537555f38ded2736f2d9e0cac" dependencies = [ "arbitrary", "base64 0.21.7", - "bitvec", + "bitvec 1.0.1", "borsh 1.5.7", "bytes", "bytesize", @@ -5697,7 +6172,7 @@ checksum = "bcc1d0b59952b2f408e83ffdad01f9b863f4d835431c3875ee1e6653a942337d" dependencies = [ "arbitrary", "base64 0.21.7", - "bitvec", + "bitvec 1.0.1", "borsh 1.5.7", "bytes", "bytesize", @@ -5774,7 +6249,7 @@ dependencies = [ [[package]] name = "near-rpc-client" version = "0.2.0" -source = "git+https://github.com/Near-One/bridge-sdk-rs?rev=8f1a290c162a91b0314f363759fdc0e210e48d89#8f1a290c162a91b0314f363759fdc0e210e48d89" +source = "git+https://github.com/Near-One/bridge-sdk-rs?rev=b79015b09390fe129405f894c428e9ed62729e08#b79015b09390fe129405f894c428e9ed62729e08" dependencies = [ "borsh 1.5.7", "lazy_static", @@ -6168,7 +6643,7 @@ dependencies = [ [[package]] name = "omni-connector" version = "0.2.8" -source = "git+https://github.com/Near-One/bridge-sdk-rs?rev=8f1a290c162a91b0314f363759fdc0e210e48d89#8f1a290c162a91b0314f363759fdc0e210e48d89" +source = "git+https://github.com/Near-One/bridge-sdk-rs?rev=b79015b09390fe129405f894c428e9ed62729e08#b79015b09390fe129405f894c428e9ed62729e08" dependencies = [ "borsh 1.5.7", "bridge-connector-common", @@ -6202,6 +6677,7 @@ dependencies = [ "anyhow", "borsh 1.5.7", "bridge-connector-common", + "bridge-indexer-types", "chrono", "clap", "dotenv", @@ -6211,6 +6687,7 @@ dependencies = [ "futures", "hex", "log", + "mongodb", "near-bridge-client", "near-crypto 0.29.2", "near-jsonrpc-client", @@ -6278,7 +6755,7 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "786393f80485445794f6043fd3138854dd109cc6c4bd1a6383db304c9ce9b9ce" dependencies = [ - "arrayvec", + "arrayvec 0.7.6", "auto_impl", "bytes", "ethereum-types 0.14.1", @@ -6386,22 +6863,60 @@ dependencies = [ "sha2 0.10.8", ] +[[package]] +name = "parity-scale-codec" +version = "1.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4b26b16c7687c3075982af47719e481815df30bc544f7a6690763a25ca16e9d" +dependencies = [ + "arrayvec 0.5.2", + "bitvec 0.17.4", + "byte-slice-cast 0.3.5", + "serde", +] + +[[package]] +name = "parity-scale-codec" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "373b1a4c1338d9cd3d1fa53b3a11bdab5ab6bd80a20f7f7becd76953ae2be909" +dependencies = [ + "arrayvec 0.7.6", + "bitvec 0.20.4", + "byte-slice-cast 1.2.3", + "impl-trait-for-tuples", + "parity-scale-codec-derive 2.3.1", + "serde", +] + [[package]] name = "parity-scale-codec" version = "3.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c9fde3d0718baf5bc92f577d652001da0f8d54cd03a7974e118d04fc888dc23d" dependencies = [ - "arrayvec", - "bitvec", - "byte-slice-cast", + "arrayvec 0.7.6", + "bitvec 1.0.1", + "byte-slice-cast 1.2.3", "const_format", "impl-trait-for-tuples", - "parity-scale-codec-derive", + "parity-scale-codec-derive 3.7.4", "rustversion", "serde", ] +[[package]] +name = "parity-scale-codec-derive" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1557010476e0595c9b568d16dcfb81b93cdeb157612726f5170d31aa707bed27" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "parity-scale-codec-derive" version = "3.7.4" @@ -6702,6 +7217,19 @@ dependencies = [ "syn 2.0.100", ] +[[package]] +name = "primitive-types" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd39dcacf71411ba488570da7bbc89b717225e46478b30ba99b92db6b149809" +dependencies = [ + "fixed-hash 0.6.1", + "impl-codec 0.4.2", + "impl-rlp 0.2.1", + "impl-serde 0.3.2", + "uint 0.8.5", +] + [[package]] name = "primitive-types" version = "0.10.1" @@ -6709,6 +7237,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05e4722c697a58a99d5d06a08c30821d7c082a4632198de1eaa5a6c22ef42373" dependencies = [ "fixed-hash 0.7.0", + "impl-codec 0.5.1", + "impl-rlp 0.3.0", + "impl-serde 0.3.2", "uint 0.9.5", ] @@ -6719,7 +7250,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" dependencies = [ "fixed-hash 0.8.0", - "impl-codec", + "impl-codec 0.6.0", "impl-rlp 0.3.0", "impl-serde 0.4.0", "scale-info", @@ -6747,13 +7278,23 @@ dependencies = [ "toml 0.5.11", ] +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit 0.19.15", +] + [[package]] name = "proc-macro-crate" version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" dependencies = [ - "toml_edit", + "toml_edit 0.22.24", ] [[package]] @@ -6907,6 +7448,18 @@ version = "5.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" +[[package]] +name = "radium" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "def50a86306165861203e7f84ecffbbdfdea79f0e51039b33de1e952358c47ac" + +[[package]] +name = "radium" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "643f8f41a8ebc4c5dc4515c82bb8abd397b527fc20fd681b7c011c2aee5d44fb" + [[package]] name = "radium" version = "0.7.0" @@ -6993,7 +7546,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", "serde", ] @@ -7055,12 +7608,13 @@ dependencies = [ [[package]] name = "redis" -version = "0.29.5" +version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc42f3a12fd4408ce64d8efef67048a924e543bd35c6591c0447fda9054695f" +checksum = "438a4e5f8e9aa246d6f3666d6978441bf1b37d5f417b50c4dd220be09f5fcc17" dependencies = [ "arc-swap", "bytes", + "cfg-if 1.0.0", "combine 4.6.7", "futures-util", "itoa", @@ -7090,7 +7644,7 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", "libredox", "thiserror 1.0.69", ] @@ -7233,6 +7787,15 @@ dependencies = [ "thiserror 1.0.69", ] +[[package]] +name = "resolv-conf" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48375394603e3dd4b2d64371f7148fd8c7baa2680e28741f2cb8d23b59e3d4c4" +dependencies = [ + "hostname", +] + [[package]] name = "rfc6979" version = "0.3.1" @@ -7277,7 +7840,7 @@ checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if 1.0.0", - "getrandom 0.2.15", + "getrandom 0.2.16", "libc", "untrusted 0.9.0", "windows-sys 0.52.0", @@ -7292,6 +7855,15 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "rlp" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1190dcc8c3a512f1eef5d09bb8c84c7f39e1054e174d1795482e18f5272f2e73" +dependencies = [ + "rustc-hex", +] + [[package]] name = "rlp" version = "0.5.2" @@ -7339,7 +7911,7 @@ dependencies = [ "num-bigint 0.4.6", "num-integer", "num-traits", - "parity-scale-codec", + "parity-scale-codec 3.7.4", "primitive-types 0.12.2", "proptest", "rand 0.8.5", @@ -7399,6 +7971,16 @@ dependencies = [ "semver 1.0.26", ] +[[package]] +name = "rustc_version_runtime" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dd18cd2bae1820af0b6ad5e54f4a51d0f3fcc53b05f845675074efcc7af071d" +dependencies = [ + "rustc_version 0.4.1", + "semver 1.0.26", +] + [[package]] name = "rusticata-macros" version = "4.1.0" @@ -7611,7 +8193,7 @@ checksum = "346a3b32eba2640d17a9cb5927056b08f3de90f65b72fe09402c2ad07d684d0b" dependencies = [ "cfg-if 1.0.0", "derive_more 1.0.0", - "parity-scale-codec", + "parity-scale-codec 3.7.4", "scale-info-derive", ] @@ -7866,6 +8448,7 @@ version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" dependencies = [ + "indexmap 2.9.0", "itoa", "memchr", "ryu", @@ -7957,6 +8540,17 @@ dependencies = [ "serde", ] +[[package]] +name = "sha-1" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5058ada175748e33390e40e872bd0fe59a19f265d0158daa551c5a88a76009c" +dependencies = [ + "cfg-if 1.0.0", + "cpufeatures", + "digest 0.10.7", +] + [[package]] name = "sha1" version = "0.10.6" @@ -8300,7 +8894,7 @@ dependencies = [ [[package]] name = "solana-bridge-client" version = "0.2.3" -source = "git+https://github.com/Near-One/bridge-sdk-rs?rev=8f1a290c162a91b0314f363759fdc0e210e48d89#8f1a290c162a91b0314f363759fdc0e210e48d89" +source = "git+https://github.com/Near-One/bridge-sdk-rs?rev=b79015b09390fe129405f894c428e9ed62729e08#b79015b09390fe129405f894c428e9ed62729e08" dependencies = [ "borsh 1.5.7", "derive_builder", @@ -8503,9 +9097,9 @@ dependencies = [ [[package]] name = "solana-curve25519" -version = "2.2.11" +version = "2.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1de13796959f32e52eb2d59a0dbfe0d55ee59b07e04b0ae5648e07ba1082dd98" +checksum = "3241d534ec36aff225705eea77785589906c9ecaa3db2a0de0d821bae8d32dcc" dependencies = [ "bytemuck", "bytemuck_derive", @@ -8778,7 +9372,7 @@ checksum = "9ce496a475e5062ba5de97215ab39d9c358f9c9df4bb7f3a45a1f1a8bd9065ed" dependencies = [ "bincode", "borsh 1.5.7", - "getrandom 0.2.15", + "getrandom 0.2.16", "js-sys", "num-traits", "serde", @@ -9149,7 +9743,7 @@ dependencies = [ "bytemuck", "console_error_panic_hook", "console_log", - "getrandom 0.2.15", + "getrandom 0.2.16", "lazy_static", "log", "memoffset", @@ -9321,7 +9915,7 @@ dependencies = [ "bytemuck_derive", "curve25519-dalek 4.1.3", "five8_const", - "getrandom 0.2.15", + "getrandom 0.2.16", "js-sys", "num-traits", "rand 0.8.5", @@ -10314,9 +10908,9 @@ dependencies = [ [[package]] name = "solana-zk-sdk" -version = "2.2.11" +version = "2.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70d19fb9ff055569f32871dfd619355780f151f17285cabd23effcdd74167f73" +checksum = "27c757a8d8b66af3e150c29e961310bafa9d8c91ad826f96fb88b2bface31ba2" dependencies = [ "aes-gcm-siv", "base64 0.22.1", @@ -10780,6 +11374,17 @@ dependencies = [ "precomputed-hash", ] +[[package]] +name = "stringprep" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" +dependencies = [ + "unicode-bidi", + "unicode-normalization", + "unicode-properties", +] + [[package]] name = "strsim" version = "0.11.1" @@ -10992,6 +11597,12 @@ dependencies = [ "libc", ] +[[package]] +name = "take_mut" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60" + [[package]] name = "tap" version = "1.0.1" @@ -11120,6 +11731,15 @@ dependencies = [ "time-core", ] +[[package]] +name = "tiny-keccak" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d8a021c69bb74a44ccedb824a046447e2c84a01df9e5c20779750acb38e11b2" +dependencies = [ + "crunchy", +] + [[package]] name = "tiny-keccak" version = "2.0.2" @@ -11258,12 +11878,13 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.14" +version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b9590b93e6fcc1739458317cccd391ad3955e2bde8913edf6f95f9e65a8f034" +checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" dependencies = [ "bytes", "futures-core", + "futures-io", "futures-sink", "pin-project-lite", "tokio", @@ -11287,7 +11908,7 @@ dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit", + "toml_edit 0.22.24", ] [[package]] @@ -11299,6 +11920,17 @@ dependencies = [ "serde", ] +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.9.0", + "toml_datetime", + "winnow 0.5.40", +] + [[package]] name = "toml_edit" version = "0.22.24" @@ -11309,7 +11941,7 @@ dependencies = [ "serde", "serde_spanned", "toml_datetime", - "winnow", + "winnow 0.7.6", ] [[package]] @@ -11429,6 +12061,17 @@ dependencies = [ "utf-8", ] +[[package]] +name = "typed-builder" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89851716b67b937e393b3daa8423e67ddfc4bbbf1654bcf05488e95e0828db0c" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "typenum" version = "1.18.0" @@ -11441,6 +12084,18 @@ version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" +[[package]] +name = "uint" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9db035e67dfaf7edd9aebfe8676afcd63eed53c8a4044fed514c8cccf1835177" +dependencies = [ + "byteorder", + "crunchy", + "rustc-hex", + "static_assertions", +] + [[package]] name = "uint" version = "0.9.5" @@ -11477,12 +12132,33 @@ version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" +[[package]] +name = "unicode-bidi" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" + [[package]] name = "unicode-ident" version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +[[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-properties" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" + [[package]] name = "unicode-width" version = "0.2.0" @@ -11589,7 +12265,7 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", "serde", ] @@ -11598,6 +12274,12 @@ name = "uuid" version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9" +dependencies = [ + "getrandom 0.3.2", + "js-sys", + "serde", + "wasm-bindgen", +] [[package]] name = "valuable" @@ -11840,6 +12522,12 @@ dependencies = [ "rustix 0.38.44", ] +[[package]] +name = "widestring" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd7cf3379ca1aac9eea11fba24fd7e315d621f8dfe35c8d7d2be8b793726e07d" + [[package]] name = "winapi" version = "0.3.9" @@ -12228,6 +12916,15 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + [[package]] name = "winnow" version = "0.7.6" @@ -12259,7 +12956,7 @@ dependencies = [ [[package]] name = "wormhole-bridge-client" version = "0.2.0" -source = "git+https://github.com/Near-One/bridge-sdk-rs?rev=8f1a290c162a91b0314f363759fdc0e210e48d89#8f1a290c162a91b0314f363759fdc0e210e48d89" +source = "git+https://github.com/Near-One/bridge-sdk-rs?rev=b79015b09390fe129405f894c428e9ed62729e08#b79015b09390fe129405f894c428e9ed62729e08" dependencies = [ "bridge-connector-common", "derive_builder", @@ -12301,6 +12998,12 @@ dependencies = [ "web-sys", ] +[[package]] +name = "wyz" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85e60b0d1b5f99db2556934e21937020776a5d31520bf169e851ac44e6420214" + [[package]] name = "wyz" version = "0.5.1" diff --git a/omni-relayer/Cargo.toml b/omni-relayer/Cargo.toml index 80239a0a6..8df097799 100644 --- a/omni-relayer/Cargo.toml +++ b/omni-relayer/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "omni-relayer" version = "0.3.8" -edition = "2021" +edition = "2024" resolver = "2" repository = "https://github.com/Near-One/omni-bridge" @@ -31,6 +31,7 @@ solana-rpc-client-api = "2.1.9" ethereum-types = "0.14.1" omni-types = { git = "https://github.com/near-one/omni-bridge", package = "omni-types", rev = "303facdae820faef114282d99c1cabd24787b93c" } +bridge-indexer-types = { git = "ssh://git@github.com/near-one/bridge-indexer-rs.git", package = "bridge-indexer-types", rev = "73b0c8947de08b8e8a8f68e8b7693e75c74b6a7f" } near-lake-framework = "0.7.12" near-jsonrpc-client = "0.16.0" @@ -42,20 +43,21 @@ near-sdk = "5.8.0" hex = "0.4.3" alloy = { version = "0.12.5", features = ["node-bindings", "providers", "rpc-types", "sol-types", "provider-ws", "signers", "signer-local"] } -redis = { version = "0.29.1", features = ["aio", "tokio-comp"] } +mongodb = "3.2.2" +redis = { version = "0.30.0", features = ["aio", "tokio-comp"] } reqwest = "0.12" -eth-proof = { git = "https://github.com/Near-One/bridge-sdk-rs", package = "eth-proof", rev = "8f1a290c162a91b0314f363759fdc0e210e48d89" } +eth-proof = { git = "https://github.com/Near-One/bridge-sdk-rs", package = "eth-proof", rev = "b79015b09390fe129405f894c428e9ed62729e08" } -bridge-connector-common = { git = "https://github.com/Near-One/bridge-sdk-rs", package = "bridge-connector-common", rev = "8f1a290c162a91b0314f363759fdc0e210e48d89" } -near-rpc-client = { git = "https://github.com/Near-One/bridge-sdk-rs", package = "near-rpc-client", rev = "8f1a290c162a91b0314f363759fdc0e210e48d89" } +bridge-connector-common = { git = "https://github.com/Near-One/bridge-sdk-rs", package = "bridge-connector-common", rev = "b79015b09390fe129405f894c428e9ed62729e08" } +near-rpc-client = { git = "https://github.com/Near-One/bridge-sdk-rs", package = "near-rpc-client", rev = "b79015b09390fe129405f894c428e9ed62729e08" } -near-bridge-client = { git = "https://github.com/Near-One/bridge-sdk-rs", package = "near-bridge-client", rev = "8f1a290c162a91b0314f363759fdc0e210e48d89" } -evm-bridge-client = { git = "https://github.com/Near-One/bridge-sdk-rs", package = "evm-bridge-client", rev = "8f1a290c162a91b0314f363759fdc0e210e48d89" } -solana-bridge-client = { git = "https://github.com/Near-One/bridge-sdk-rs", package = "solana-bridge-client", rev = "8f1a290c162a91b0314f363759fdc0e210e48d89" } -wormhole-bridge-client = { git = "https://github.com/Near-One/bridge-sdk-rs", package = "wormhole-bridge-client", rev = "8f1a290c162a91b0314f363759fdc0e210e48d89" } +near-bridge-client = { git = "https://github.com/Near-One/bridge-sdk-rs", package = "near-bridge-client", rev = "b79015b09390fe129405f894c428e9ed62729e08" } +evm-bridge-client = { git = "https://github.com/Near-One/bridge-sdk-rs", package = "evm-bridge-client", rev = "b79015b09390fe129405f894c428e9ed62729e08" } +solana-bridge-client = { git = "https://github.com/Near-One/bridge-sdk-rs", package = "solana-bridge-client", rev = "b79015b09390fe129405f894c428e9ed62729e08" } +wormhole-bridge-client = { git = "https://github.com/Near-One/bridge-sdk-rs", package = "wormhole-bridge-client", rev = "b79015b09390fe129405f894c428e9ed62729e08" } -omni-connector = { git = "https://github.com/Near-One/bridge-sdk-rs", package = "omni-connector", rev = "8f1a290c162a91b0314f363759fdc0e210e48d89" } +omni-connector = { git = "https://github.com/Near-One/bridge-sdk-rs", package = "omni-connector", rev = "b79015b09390fe129405f894c428e9ed62729e08" } # The profile that 'dist' will build with [profile.dist] diff --git a/omni-relayer/example-devnet-config.toml b/omni-relayer/example-devnet-config.toml index 509a4085c..7d3cdc8e2 100644 --- a/omni-relayer/example-devnet-config.toml +++ b/omni-relayer/example-devnet-config.toml @@ -4,8 +4,12 @@ url = "redis://127.0.0.1/" [bridge_indexer] # Used to check if provided fee is sufficient to complete the transfer api_url = "https://testnet.api.bridge.nearone.org/" + +# mongodb_uri = "mongodb+srv://MONGODB_USERNAME:MONGODB_PASSWORD@MONGODB_HOST/?retryWrites=true&w=majority" +# db_name = "testnet_omni_bridge_db" + # Discount that relayer can accept [default: 0] -# fee_discount = 20 +# fee_discount = 30 [near] network = "testnet" @@ -74,7 +78,3 @@ finalize_transfer_sol_discriminator = [104, 27, 121, 69, 3, 70, 217, 66] [wormhole] api_url = "https://api.testnet.wormholescan.io/" solana_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/example-mainnet-config.toml b/omni-relayer/example-mainnet-config.toml index 7d7d8a75d..8092da54c 100644 --- a/omni-relayer/example-mainnet-config.toml +++ b/omni-relayer/example-mainnet-config.toml @@ -4,8 +4,12 @@ url = "redis://127.0.0.1/" [bridge_indexer] # Used to check if provided fee is sufficient to complete the transfer api_url = "https://mainnet.api.bridge.nearone.org/" + +# mongodb_uri = "mongodb+srv://MONGODB_USERNAME:MONGODB_PASSWORD@MONGODB_HOST/?retryWrites=true&w=majority" +# db_name = "mainnet_omni_bridge_db" + # Discount that relayer can accept [default: 0] -# fee_discount = 20 +# fee_discount = 30 [near] network = "mainnet" @@ -74,7 +78,3 @@ 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-testnet-config.toml b/omni-relayer/example-testnet-config.toml index 36baca48e..1e048dc8b 100644 --- a/omni-relayer/example-testnet-config.toml +++ b/omni-relayer/example-testnet-config.toml @@ -4,8 +4,12 @@ url = "redis://127.0.0.1/" [bridge_indexer] # Used to check if provided fee is sufficient to complete the transfer api_url = "https://testnet.api.bridge.nearone.org/" + +# mongodb_uri = "mongodb+srv://MONGODB_USERNAME:MONGODB_PASSWORD@MONGODB_HOST/?retryWrites=true&w=majority" +# db_name = "testnet_omni_bridge_db" + # Discount that relayer can accept [default: 0] -# fee_discount = 20 +# fee_discount = 30 [near] network = "testnet" @@ -74,7 +78,3 @@ finalize_transfer_sol_discriminator = [104, 27, 121, 69, 3, 70, 217, 66] [wormhole] api_url = "https://api.testnet.wormholescan.io/" solana_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 4f0d6934c..a4bae32cd 100644 --- a/omni-relayer/src/config.rs +++ b/omni-relayer/src/config.rs @@ -30,6 +30,27 @@ pub fn get_relayer_evm_address(chain_kind: ChainKind) -> Address { signer.address() } +fn replace_mongodb_credentials<'de, D>(deserializer: D) -> Result, D::Error> +where + D: serde::Deserializer<'de>, +{ + let uri = Option::::deserialize(deserializer)?; + + if let Some(uri) = uri { + let username = std::env::var("MONGODB_USERNAME").map_err(serde::de::Error::custom)?; + let password = std::env::var("MONGODB_PASSWORD").map_err(serde::de::Error::custom)?; + let host = std::env::var("MONGODB_HOST").map_err(serde::de::Error::custom)?; + + Ok(Some( + uri.replace("MONGODB_USERNAME", &username) + .replace("MONGODB_PASSWORD", &password) + .replace("MONGODB_HOST", &host), + )) + } else { + Ok(None) + } +} + fn replace_rpc_api_key<'de, D>(deserializer: D) -> Result where D: serde::Deserializer<'de>, @@ -69,7 +90,11 @@ pub struct Config { } impl Config { - pub fn is_check_fee_enabled(&self) -> bool { + pub fn is_bridge_indexer_enabled(&self) -> bool { + self.bridge_indexer.mongodb_uri.is_some() && self.bridge_indexer.db_name.is_some() + } + + pub fn is_bridge_api_enabled(&self) -> bool { self.bridge_indexer.api_url.is_some() } } @@ -83,6 +108,10 @@ pub struct Redis { pub struct BridgeIndexer { pub api_url: Option, + #[serde(default, deserialize_with = "replace_mongodb_credentials")] + pub mongodb_uri: Option, + pub db_name: Option, + #[serde(default, deserialize_with = "validate_fee_discount")] pub fee_discount: u8, } @@ -143,8 +172,5 @@ pub struct Solana { #[derive(Debug, Clone, 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 384ccc9cb..fe8ddb22e 100644 --- a/omni-relayer/src/main.rs +++ b/omni-relayer/src/main.rs @@ -65,79 +65,91 @@ async fn main() -> Result<()> { let mut handles = Vec::new(); - 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, - args.near_start_block, - ) - .await - } - })); - if config.eth.is_some() { + if config.is_bridge_indexer_enabled() { 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, - 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, - args.base_start_block, - ) - .await - } + async move { startup::bridge_indexer::start_indexer(config, redis_client).await } })); - } - if config.arb.is_some() { + } else { 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( + startup::near::start_indexer( config, redis_client, - ChainKind::Arb, - args.arb_start_block, + jsonrpc_client, + args.near_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, args.solana_start_signature) + 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, + args.eth_start_block, + ) .await - } - })); - handles.push(tokio::spawn({ - let config = config.clone(); - let redis_client = redis_client.clone(); - async move { startup::solana::process_signature(config, redis_client).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, + 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, + 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, + args.solana_start_signature, + ) + .await + } + })); + handles.push(tokio::spawn({ + let config = config.clone(); + let redis_client = redis_client.clone(); + async move { startup::solana::process_signature(config, redis_client).await } + })); + } } handles.push(tokio::spawn({ @@ -168,7 +180,7 @@ async fn main() -> Result<()> { result = futures::future::select_all(handles) => { let (res, _, _) = result; if let Ok(Err(err)) = res { - error!("A worker encountered an error: {:?}", err); + error!("A worker encountered an error: {err:?}"); } } } diff --git a/omni-relayer/src/startup/bridge_indexer.rs b/omni-relayer/src/startup/bridge_indexer.rs new file mode 100644 index 000000000..33d8d2d2b --- /dev/null +++ b/omni-relayer/src/startup/bridge_indexer.rs @@ -0,0 +1,455 @@ +use std::str::FromStr; + +use alloy::{primitives::Address, sol_types::SolEvent}; +use anyhow::{Context, Result}; +use bridge_indexer_types::documents_types::{ + OmniEvent, OmniEventData, OmniMetaEvent, OmniMetaEventDetails, OmniTransactionEvent, + OmniTransactionOrigin, OmniTransferMessage, +}; +use ethereum_types::H256; +use log::{info, warn}; +use mongodb::{change_stream::event::ResumeToken, options::ClientOptions, Client, Collection}; +use omni_types::{near_events::OmniBridgeEvent, ChainKind, OmniAddress}; +use solana_sdk::pubkey::Pubkey; +use tokio_stream::StreamExt; + +use crate::{config, utils, workers}; + +const OMNI_EVENTS: &str = "omni_events"; + +fn get_expected_finalization_time(config: config::Config, chain_kind: ChainKind) -> Result { + let Some(expected_finalization_time) = (match chain_kind { + ChainKind::Eth => config.eth.map(|eth| eth.expected_finalization_time), + ChainKind::Base => config.base.map(|base| base.expected_finalization_time), + ChainKind::Arb => config.arb.map(|arb| arb.expected_finalization_time), + _ => None, + }) else { + anyhow::bail!( + "Failed to get expected_finalization_time, since config for {:?} is not set", + chain_kind + ); + }; + + Ok(expected_finalization_time) +} + +async fn handle_transaction_event( + mut redis_connection: redis::aio::MultiplexedConnection, + config: config::Config, + transaction_id: String, + origin: OmniTransactionOrigin, + event: OmniTransactionEvent, +) -> Result<()> { + match event.transfer_message { + OmniTransferMessage::NearTransferMessage(transfer_message) => { + info!( + "Received NearTransferMessage: {}", + transfer_message.origin_nonce + ); + + if transfer_message.recipient.get_chain() != ChainKind::Near { + utils::redis::add_event( + &mut redis_connection, + utils::redis::EVENTS, + transfer_message.origin_nonce.to_string(), + crate::workers::Transfer::Near { + transfer_message, + creation_timestamp: chrono::Utc::now().timestamp(), + last_update_timestamp: None, + }, + ) + .await; + } + } + OmniTransferMessage::NearSignTransferEvent(sign_event) => { + info!("Received NearSignTransferEvent"); + + utils::redis::add_event( + &mut redis_connection, + utils::redis::EVENTS, + sign_event + .message_payload + .transfer_id + .origin_nonce + .to_string(), + OmniBridgeEvent::SignTransferEvent { + signature: sign_event.signature, + message_payload: sign_event.message_payload, + }, + ) + .await; + } + OmniTransferMessage::NearClaimFeeEvent(_) => {} + OmniTransferMessage::EvmInitTransferMessage(init_transfer) => { + info!( + "Received EvmInitTransferMessage: {}", + init_transfer.origin_nonce + ); + + let OmniTransactionOrigin::EVMLog { + block_number, + block_timestamp, + chain_kind, + .. + } = origin + else { + anyhow::bail!("Expected EVMLog for EvmInitTransfer: {:?}", init_transfer); + }; + + let Ok(tx_hash) = H256::from_str(&transaction_id) else { + anyhow::bail!( + "Failed to parse transaction_id as H256: {:?}", + transaction_id + ); + }; + + let (OmniAddress::Eth(sender) | OmniAddress::Base(sender) | OmniAddress::Arb(sender)) = + init_transfer.sender.clone() + else { + anyhow::bail!("Unexpected token address: {}", init_transfer.sender); + }; + + let (OmniAddress::Eth(token) | OmniAddress::Base(token) | OmniAddress::Arb(token)) = + init_transfer.token.clone() + else { + anyhow::bail!("Unexpected token address: {}", init_transfer.token); + }; + + let log = utils::evm::InitTransfer { + sender: Address(sender.0.into()), + tokenAddress: Address(token.0.into()), + originNonce: init_transfer.origin_nonce, + amount: init_transfer.amount.into(), + fee: init_transfer.fee.fee.into(), + nativeFee: init_transfer.fee.native_fee.into(), + recipient: init_transfer.recipient.to_string(), + message: init_transfer.msg, + }; + + let Ok(creation_timestamp) = i64::try_from(block_timestamp) else { + anyhow::bail!( + "Failed to parse block_timestamp as i64: {}", + block_timestamp + ); + }; + + let expected_finalization_time = + get_expected_finalization_time(config, chain_kind).unwrap(); + + utils::redis::add_event( + &mut redis_connection, + utils::redis::EVENTS, + transaction_id, + workers::Transfer::Evm { + chain_kind, + block_number, + tx_hash, + log, + creation_timestamp, + last_update_timestamp: None, + expected_finalization_time, + }, + ) + .await; + } + OmniTransferMessage::EvmFinTransferMessage(fin_transfer) => { + info!("Received EvmFinTransferMessage"); + + let OmniTransactionOrigin::EVMLog { + block_number, + block_timestamp, + chain_kind, + .. + } = origin + else { + anyhow::bail!("Expected EVMLog for EvmFinTransfer: {:?}", fin_transfer); + }; + + let Ok(tx_hash) = H256::from_str(&transaction_id) else { + anyhow::bail!( + "Failed to parse transaction_id as H256: {:?}", + transaction_id + ); + }; + + let Ok(creation_timestamp) = i64::try_from(block_timestamp) else { + anyhow::bail!( + "Failed to parse block_timestamp as i64: {}", + block_timestamp + ); + }; + + let expected_finalization_time = + get_expected_finalization_time(config, chain_kind).unwrap(); + + utils::redis::add_event( + &mut redis_connection, + utils::redis::EVENTS, + transaction_id, + workers::FinTransfer::Evm { + chain_kind, + block_number, + tx_hash, + topic: utils::evm::FinTransfer::SIGNATURE_HASH, + origin_chain: fin_transfer.transfer_id.origin_chain, + origin_nonce: fin_transfer.transfer_id.origin_nonce, + creation_timestamp, + expected_finalization_time, + }, + ) + .await; + } + OmniTransferMessage::SolanaInitTransfer(init_transfer) => { + info!( + "Received SolanaInitTransfer: {}", + init_transfer.origin_nonce + ); + + let OmniAddress::Sol(ref token) = init_transfer.token else { + anyhow::bail!("Unexpected token address: {}", init_transfer.token); + }; + let Ok(native_fee) = u64::try_from(init_transfer.fee.native_fee.0) else { + anyhow::bail!( + "Failed to parse native fee for Solana transfer: {:?}", + init_transfer + ); + }; + let Some(emitter) = init_transfer.emitter else { + anyhow::bail!( + "Emitter is not set for Solana transfer: {:?}", + init_transfer + ); + }; + + utils::redis::add_event( + &mut redis_connection, + utils::redis::EVENTS, + transaction_id, + crate::workers::Transfer::Solana { + amount: init_transfer.amount.0.into(), + token: Pubkey::new_from_array(token.0), + sender: init_transfer.sender, + recipient: init_transfer.recipient, + fee: init_transfer.fee.fee, + native_fee, + message: init_transfer.message.unwrap_or_default(), + emitter: Pubkey::from_str(&emitter).context("Failed to parse emitter")?, + sequence: init_transfer.origin_nonce, + creation_timestamp: chrono::Utc::now().timestamp(), + last_update_timestamp: None, + }, + ) + .await; + } + OmniTransferMessage::SolanaFinTransfer(fin_transfer) => { + info!("Received SolanaFinTransfer"); + + let Some(emitter) = fin_transfer.emitter.clone() else { + anyhow::bail!("Emitter is not set for Solana transfer: {:?}", fin_transfer); + }; + let Some(sequence) = fin_transfer.sequence else { + anyhow::bail!( + "Sequence is not set for Solana transfer: {:?}", + fin_transfer + ); + }; + + utils::redis::add_event( + &mut redis_connection, + utils::redis::EVENTS, + transaction_id, + crate::workers::FinTransfer::Solana { emitter, sequence }, + ) + .await; + } + } + + Ok(()) +} + +async fn handle_meta_event( + mut redis_connection: redis::aio::MultiplexedConnection, + config: config::Config, + transaction_id: String, + origin: OmniTransactionOrigin, + event: OmniMetaEvent, +) -> Result<()> { + match event.details { + OmniMetaEventDetails::EVMDeployToken(deploy_token_event) => { + info!("Received EVMDeployToken: {deploy_token_event:?}"); + + let OmniTransactionOrigin::EVMLog { + block_number, + block_timestamp, + chain_kind, + .. + } = origin + else { + anyhow::bail!( + "Expected EVMLog for EvmDeployToken: {:?}", + deploy_token_event + ); + }; + + let Ok(tx_hash) = H256::from_str(&transaction_id) else { + anyhow::bail!( + "Failed to parse transaction_id as H256: {:?}", + transaction_id + ); + }; + + let Ok(creation_timestamp) = i64::try_from(block_timestamp) else { + anyhow::bail!( + "Failed to parse block_timestamp as i64: {}", + block_timestamp + ); + }; + + let expected_finalization_time = + get_expected_finalization_time(config, chain_kind).unwrap(); + + utils::redis::add_event( + &mut redis_connection, + utils::redis::EVENTS, + transaction_id, + workers::DeployToken::Evm { + chain_kind, + block_number, + tx_hash, + topic: utils::evm::DeployToken::SIGNATURE_HASH, + creation_timestamp, + expected_finalization_time, + }, + ) + .await; + } + OmniMetaEventDetails::SolanaDeployToken { + emitter, sequence, .. + } => { + info!("Received EVMDeployToken: {sequence}"); + utils::redis::add_event( + &mut redis_connection, + utils::redis::EVENTS, + transaction_id, + workers::DeployToken::Solana { emitter, sequence }, + ) + .await; + } + OmniMetaEventDetails::EVMLogMetadata(_) + | OmniMetaEventDetails::SolanaLogMetadata { .. } + | OmniMetaEventDetails::NearLogMetadataEvent { .. } + | OmniMetaEventDetails::NearDeployTokenEvent { .. } + | OmniMetaEventDetails::NearBindTokenEvent { .. } => {} + } + + Ok(()) +} + +async fn watch_omni_events_collection( + collection: &Collection, + mut redis_connection: redis::aio::MultiplexedConnection, + config: &config::Config, +) { + let resume_token: Option = utils::redis::get_last_processed::<&str, String>( + &mut redis_connection, + utils::redis::MONGODB_OMNI_EVENTS_RT, + ) + .await + .and_then(|rt| serde_json::from_str(&rt).ok()) + .unwrap_or_default(); + + let mut stream = collection.watch().resume_after(resume_token).await.unwrap(); + + while let Some(change) = stream.next().await { + match change { + Ok(doc) => { + if let Some(event) = doc.full_document { + match event.event { + OmniEventData::Transaction(transaction_event) => { + tokio::spawn({ + let redis_connection = redis_connection.clone(); + let config = config.clone(); + + async move { + if let Err(err) = handle_transaction_event( + redis_connection, + config, + event.transaction_id, + event.origin, + transaction_event, + ) + .await + { + warn!("Failed to handle transaction event: {err:?}"); + } + } + }); + } + OmniEventData::Meta(meta_event) => { + tokio::spawn({ + let redis_connection = redis_connection.clone(); + let config = config.clone(); + + async move { + if let Err(err) = handle_meta_event( + redis_connection, + config, + event.transaction_id, + event.origin, + meta_event, + ) + .await + { + warn!("Failed to handle meta event: {err:?}"); + } + } + }); + } + } + } + } + Err(err) => warn!("Error watching changes: {err:?}"), + } + + if let Some(ref resume_token) = stream + .resume_token() + .and_then(|rt| serde_json::to_string(&rt).ok()) + { + utils::redis::update_last_processed( + &mut redis_connection, + utils::redis::MONGODB_OMNI_EVENTS_RT, + resume_token, + ) + .await; + } + } +} + +pub async fn start_indexer(config: config::Config, redis_client: redis::Client) -> Result<()> { + info!("Connecting to bridge-indexer"); + + let Some(ref uri) = config.bridge_indexer.mongodb_uri else { + anyhow::bail!("MONGODB_URI is not set"); + }; + let Some(ref db_name) = config.bridge_indexer.db_name else { + anyhow::bail!("DB_NAME is not set"); + }; + + let redis_connection = redis_client.get_multiplexed_tokio_connection().await?; + + let client_options = ClientOptions::parse(uri).await?; + let client = Client::with_options(client_options)?; + + let db = client.database(db_name); + let omni_events_collection = db.collection::(OMNI_EVENTS); + + loop { + info!("Starting a mongodb stream that track changes in {OMNI_EVENTS}"); + + watch_omni_events_collection(&omni_events_collection, redis_connection.clone(), &config) + .await; + + warn!("Mongodb stream was closed, restarting..."); + tokio::time::sleep(tokio::time::Duration::from_secs(1)).await; + } +} diff --git a/omni-relayer/src/startup/evm.rs b/omni-relayer/src/startup/evm.rs index de42c4454..dbb7c4143 100644 --- a/omni-relayer/src/startup/evm.rs +++ b/omni-relayer/src/startup/evm.rs @@ -92,17 +92,11 @@ pub async fn start_indexer( ) .await .map_err(|err| hide_api_key(&err)), - format!( - "Failed to process recent blocks for {:?} indexer", - chain_kind - ), + format!("Failed to process recent blocks for {chain_kind:?} indexer"), 5 ); - info!( - "All historical logs processed, starting {:?} WS subscription", - chain_kind - ); + info!("All historical logs processed, starting {chain_kind:?} WS subscription"); let ws_provider = crate::skip_fail!( ProviderBuilder::new() @@ -123,7 +117,7 @@ pub async fn start_indexer( ) .into_stream(); - info!("Subscribed to {:?} logs", chain_kind); + info!("Subscribed to {chain_kind:?} logs"); while let Some(log) = stream.next().await { process_log( @@ -213,19 +207,14 @@ async fn process_log( expected_finalization_time: i64, ) { let Some(tx_hash) = log.transaction_hash else { - warn!("No transaction hash in log: {:?}", log); - return; - }; - - let Ok(tx_logs) = http_provider.get_transaction_receipt(tx_hash).await else { - warn!("Failed to get transaction receipt for tx: {:?}", tx_hash); + warn!("No transaction hash in log: {log:?}"); return; }; let tx_hash = H256::from_slice(tx_hash.as_slice()); let Some(block_number) = log.block_number else { - warn!("No block number in log: {:?}", log); + warn!("No block number in log: {log:?}"); return; }; @@ -239,8 +228,22 @@ async fn process_log( .and_then(|block| i64::try_from(block.header.timestamp).ok()) .unwrap_or_else(|| chrono::Utc::now().timestamp()); - if log.log_decode::().is_ok() { - info!("Received InitTransfer on {:?} ({:?})", chain_kind, tx_hash); + let topic = log.topic0(); + + if let Ok(init_log) = log.log_decode::() { + info!("Received InitTransfer on {chain_kind:?} ({tx_hash:?})"); + + let log = utils::evm::InitTransfer { + sender: init_log.inner.sender, + tokenAddress: init_log.inner.tokenAddress, + originNonce: init_log.inner.originNonce, + amount: init_log.inner.amount, + fee: init_log.inner.fee, + nativeFee: init_log.inner.nativeFee, + recipient: init_log.inner.recipient.clone(), + message: init_log.inner.message.clone(), + }; + utils::redis::add_event( redis_connection, utils::redis::EVENTS, @@ -248,16 +251,26 @@ async fn process_log( crate::workers::Transfer::Evm { chain_kind, block_number, + tx_hash, log, - tx_logs: tx_logs.map(Box::new), creation_timestamp: timestamp, last_update_timestamp: None, expected_finalization_time, }, ) .await; - } else if log.log_decode::().is_ok() { - info!("Received FinTransfer on {:?} ({:?})", chain_kind, tx_hash); + } else if let Ok(fin_log) = log.log_decode::() { + info!("Received FinTransfer on {chain_kind:?} ({tx_hash:?})"); + + let Some(&topic) = topic else { + warn!("Topic is empty for log: {log:?}"); + return; + }; + + let Ok(origin_chain) = ChainKind::try_from(fin_log.inner.originChain) else { + warn!("Failed to parse origin chain from log: {log:?}"); + return; + }; utils::redis::add_event( redis_connection, @@ -266,15 +279,22 @@ async fn process_log( FinTransfer::Evm { chain_kind, block_number, - log, - tx_logs: tx_logs.map(Box::new), + tx_hash, + topic, + origin_chain, + origin_nonce: fin_log.inner.originNonce, creation_timestamp: timestamp, expected_finalization_time, }, ) .await; } else if log.log_decode::().is_ok() { - info!("Received DeployToken on {:?} ({:?})", chain_kind, tx_hash); + info!("Received DeployToken on {chain_kind:?} ({tx_hash:?})"); + + let Some(&topic) = topic else { + warn!("Topic is empty for log: {log:?}"); + return; + }; utils::redis::add_event( redis_connection, @@ -283,15 +303,15 @@ async fn process_log( DeployToken::Evm { chain_kind, block_number, - log, - tx_logs: tx_logs.map(Box::new), + tx_hash, + topic, creation_timestamp: timestamp, expected_finalization_time, }, ) .await; } else { - warn!("Received unknown log on {:?}: {:?}", chain_kind, log); + warn!("Received unknown log on {chain_kind:?}: {log:?}"); } utils::redis::update_last_processed( diff --git a/omni-relayer/src/startup/mod.rs b/omni-relayer/src/startup/mod.rs index 5c6a3f2e3..dd55eb8da 100644 --- a/omni-relayer/src/startup/mod.rs +++ b/omni-relayer/src/startup/mod.rs @@ -12,6 +12,7 @@ use wormhole_bridge_client::WormholeBridgeClientBuilder; use crate::{config, startup}; +pub mod bridge_indexer; pub mod evm; pub mod near; pub mod solana; diff --git a/omni-relayer/src/startup/near.rs b/omni-relayer/src/startup/near.rs index 988ea8c86..afd0d3663 100644 --- a/omni-relayer/src/startup/near.rs +++ b/omni-relayer/src/startup/near.rs @@ -15,7 +15,7 @@ pub fn get_signer(file: Option<&String>) -> Result { info!("Creating NEAR signer"); if let Some(file) = file { - info!("Using NEAR credentials file: {}", file); + info!("Using NEAR credentials file: {file}"); if let Ok(Signer::InMemory(signer)) = InMemorySigner::from_file(Path::new(file)) { return Ok(signer); } @@ -58,7 +58,7 @@ async fn create_lake_config( ), }; - info!("NEAR Lake will start from block: {}", start_block_height); + info!("NEAR Lake will start from block: {start_block_height}"); let lake_config = LakeConfigBuilder::default().start_block_height(start_block_height); diff --git a/omni-relayer/src/startup/solana.rs b/omni-relayer/src/startup/solana.rs index 1b5badadd..d1308f739 100644 --- a/omni-relayer/src/startup/solana.rs +++ b/omni-relayer/src/startup/solana.rs @@ -86,7 +86,7 @@ pub async fn start_indexer( while let Some(log) = log_stream.next().await { if let Ok(signature) = Signature::from_str(&log.value.signature) { - info!("Found a signature on Solana: {:?}", signature); + info!("Found a signature on Solana: {signature:?}"); utils::redis::add_event( &mut redis_connection, utils::redis::SOLANA_EVENTS, @@ -206,11 +206,11 @@ pub async fn process_signature(config: config::Config, redis_client: redis::Clie async move { let Ok(signature) = Signature::from_str(&key) else { - warn!("Failed to parse signature: {:?}", key); + warn!("Failed to parse signature: {key:?}"); return; }; - info!("Trying to process signature: {:?}", signature); + info!("Trying to process signature: {signature:?}"); match http_client .get_transaction_with_config(&signature, fetching_config) @@ -248,9 +248,9 @@ pub async fn process_signature(config: config::Config, redis_client: redis::Clie .await; } Err(err) => { - warn!("Failed to fetch transaction (probably signature wasn't finalized yet): {}", err); + warn!("Failed to fetch transaction (probably signature wasn't finalized yet): {err:?}"); } - }; + } } })); } diff --git a/omni-relayer/src/utils/fee.rs b/omni-relayer/src/utils/bridge_api.rs similarity index 100% rename from omni-relayer/src/utils/fee.rs rename to omni-relayer/src/utils/bridge_api.rs diff --git a/omni-relayer/src/utils/evm.rs b/omni-relayer/src/utils/evm.rs index 5bd3d2bf0..ae34b352e 100644 --- a/omni-relayer/src/utils/evm.rs +++ b/omni-relayer/src/utils/evm.rs @@ -1,9 +1,8 @@ -use std::{str::FromStr, sync::Arc}; +use std::str::FromStr; use log::warn; use anyhow::Result; -use omni_connector::OmniConnector; use omni_types::{ prover_args::{EvmVerifyProofArgs, WormholeVerifyProofArgs}, prover_result::ProofKind, @@ -58,65 +57,6 @@ sol!( ); ); -pub async fn get_vaa_from_evm_log( - connector: Arc, - chain_kind: ChainKind, - tx_logs: Option>, - config: &config::Config, -) -> Option { - 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; - }; - - let Ok(vaa) = connector - .wormhole_get_vaa(chain_id, bridge_token_factory, log.inner.sequence) - .await - else { - continue; - }; - - return Some(vaa); - } - - None -} - pub async fn construct_prover_args( config: &config::Config, vaa: Option, @@ -140,7 +80,7 @@ pub async fn construct_prover_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); + warn!("Failed to get proof: {err:?}"); return None; } }; diff --git a/omni-relayer/src/utils/mod.rs b/omni-relayer/src/utils/mod.rs index 786c749a1..646416422 100644 --- a/omni-relayer/src/utils/mod.rs +++ b/omni-relayer/src/utils/mod.rs @@ -1,5 +1,5 @@ +pub mod bridge_api; pub mod evm; -pub mod fee; pub mod near; pub mod nonce; pub mod redis; diff --git a/omni-relayer/src/utils/near.rs b/omni-relayer/src/utils/near.rs index 9b7a1a161..7a8183a43 100644 --- a/omni-relayer/src/utils/near.rs +++ b/omni-relayer/src/utils/near.rs @@ -144,18 +144,14 @@ pub async fn handle_streamer_message( info!("Received OmniBridgeEvent: {}", log.to_log_string()); match log { - OmniBridgeEvent::InitTransferEvent { - ref transfer_message, - } - | OmniBridgeEvent::UpdateFeeEvent { - ref transfer_message, - } => { + OmniBridgeEvent::InitTransferEvent { transfer_message } + | OmniBridgeEvent::UpdateFeeEvent { transfer_message } => { utils::redis::add_event( redis_connection, utils::redis::EVENTS, transfer_message.origin_nonce.to_string(), crate::workers::Transfer::Near { - event: log, + transfer_message, creation_timestamp: chrono::Utc::now().timestamp(), last_update_timestamp: None, }, @@ -174,16 +170,14 @@ pub async fn handle_streamer_message( ) .await; } - OmniBridgeEvent::FinTransferEvent { - ref transfer_message, - } => { + OmniBridgeEvent::FinTransferEvent { transfer_message } => { if transfer_message.recipient.get_chain() != ChainKind::Near { utils::redis::add_event( redis_connection, utils::redis::EVENTS, transfer_message.origin_nonce.to_string(), crate::workers::Transfer::Near { - event: log, + transfer_message, creation_timestamp: chrono::Utc::now().timestamp(), last_update_timestamp: None, }, diff --git a/omni-relayer/src/utils/redis.rs b/omni-relayer/src/utils/redis.rs index 09c213a1b..c5c48b60d 100644 --- a/omni-relayer/src/utils/redis.rs +++ b/omni-relayer/src/utils/redis.rs @@ -2,6 +2,8 @@ use log::warn; use omni_types::ChainKind; use redis::{aio::MultiplexedConnection, AsyncCommands}; +pub const MONGODB_OMNI_EVENTS_RT: &str = "mongodb_omni_events_rt"; + pub const EVENTS: &str = "events"; pub const SOLANA_EVENTS: &str = "solana_events"; @@ -96,7 +98,7 @@ pub async fn add_event( E: serde::Serialize + std::fmt::Debug + Send, { let Ok(serialized_event) = serde_json::to_string(&event) else { - warn!("Failed to serialize event: {:?}", event); + warn!("Failed to serialize event: {event:?}"); return; }; diff --git a/omni-relayer/src/utils/solana.rs b/omni-relayer/src/utils/solana.rs index 6f948dc1c..ed4125414 100644 --- a/omni-relayer/src/utils/solana.rs +++ b/omni-relayer/src/utils/solana.rs @@ -1,7 +1,10 @@ +use std::str::FromStr; + use anyhow::{Context, Result}; use log::{info, warn}; use borsh::BorshDeserialize; +use omni_types::{ChainKind, OmniAddress}; use solana_sdk::{bs58, pubkey::Pubkey, signature::Signature}; use solana_transaction_status::{ option_serializer::OptionSerializer, EncodedTransactionWithStatusMeta, UiRawMessage, @@ -43,7 +46,7 @@ pub async fn process_message( ) .await { - warn!("Failed to decode instruction: {}", err); + warn!("Failed to decode instruction: {err:?}"); } } } @@ -74,7 +77,7 @@ async fn decode_instruction( .starts_with(discriminator) .then_some((discriminator, len)) }) { - info!("Received InitTransfer on Solana ({})", signature); + info!("Received InitTransfer on Solana ({signature})"); let mut payload_data = decoded_data .get(offset..) @@ -117,17 +120,36 @@ async fn decode_instruction( { for log in logs { if log.contains("Sequence") { - let Some(sequence) = log - .split_ascii_whitespace() - .last() - .map(std::string::ToString::to_string) + let Ok(Ok(sender)) = Pubkey::from_str(sender).map(|sender| { + OmniAddress::new_from_slice(ChainKind::Sol, &sender.to_bytes()) + }) else { + warn!("Failed to parse sender as a pubkey: {sender:?}"); + continue; + }; + + let Ok(Ok(recipient)) = + Pubkey::from_str(&payload.recipient).map(|recipient| { + OmniAddress::new_from_slice(ChainKind::Sol, &recipient.to_bytes()) + }) + else { + warn!("Failed to parse recipient as a pubkey: {sender:?}"); + continue; + }; + + let Ok(token) = Pubkey::from_str(token) else { + warn!("Failed to parse token as a pubkey: {token:?}"); + continue; + }; + + let Some(Ok(sequence)) = + log.split_ascii_whitespace().last().map(str::parse) else { - warn!("Failed to parse sequence number from log: {:?}", log); + 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); + let Ok(emitter) = Pubkey::from_str(emitter) else { + warn!("Failed to parse emitter as a pubkey: {emitter:?}"); continue; }; @@ -137,13 +159,13 @@ async fn decode_instruction( signature.to_string(), Transfer::Solana { amount: payload.amount.into(), - token: token.clone(), - sender: sender.clone(), - recipient: payload.recipient.clone(), + token, + sender, + recipient, fee: payload.fee.into(), native_fee: payload.native_fee, message: payload.message.clone(), - emitter: emitter.clone(), + emitter, sequence, creation_timestamp: chrono::Utc::now().timestamp(), last_update_timestamp: None, @@ -161,7 +183,7 @@ async fn decode_instruction( .into_iter() .find(|discriminator| decoded_data.starts_with(discriminator)) { - info!("Received FinTransfer on Solana: {}", signature); + info!("Received FinTransfer on Solana: {signature}"); let emitter = if discriminator == &solana.finalize_transfer_discriminator { account_keys @@ -187,12 +209,12 @@ async fn decode_instruction( .last() .map(std::string::ToString::to_string) else { - warn!("Failed to parse sequence number from log: {:?}", log); + 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); + warn!("Failed to parse sequence as a number: {sequence:?}"); continue; }; @@ -210,7 +232,7 @@ async fn decode_instruction( } } } else if decoded_data.starts_with(&solana.deploy_token_discriminator) { - info!("Received DeployToken on Solana ({})", signature); + info!("Received DeployToken on Solana ({signature})"); if let Some(OptionSerializer::Some(logs)) = transaction.clone().meta.map(|meta| meta.log_messages) @@ -222,11 +244,11 @@ async fn decode_instruction( .last() .map(std::string::ToString::to_string) else { - warn!("Failed to parse sequence number from log: {:?}", log); + 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); + warn!("Failed to parse sequence as a number: {sequence:?}"); continue; }; diff --git a/omni-relayer/src/workers/mod.rs b/omni-relayer/src/workers/mod.rs index 268e4785d..1adfedb46 100644 --- a/omni-relayer/src/workers/mod.rs +++ b/omni-relayer/src/workers/mod.rs @@ -1,16 +1,15 @@ -use std::str::FromStr; use std::sync::Arc; +use alloy::primitives::B256; use anyhow::{Context, Result}; use bridge_connector_common::result::BridgeSdkError; use futures::future::join_all; use log::{info, warn}; -use alloy::rpc::types::{Log, TransactionReceipt}; use ethereum_types::H256; use near_bridge_client::TransactionOptions; -use near_jsonrpc_client::{errors::JsonRpcError, JsonRpcClient}; +use near_jsonrpc_client::{JsonRpcClient, errors::JsonRpcError}; use near_primitives::{hash::CryptoHash, types::AccountId, views::TxExecutionStatus}; use near_rpc_client::NearRpcError; use near_sdk::json_types::U128; @@ -20,8 +19,8 @@ use solana_sdk::{instruction::InstructionError, pubkey::Pubkey, transaction::Tra use omni_connector::OmniConnector; use omni_types::{ - locker_args::ClaimFeeArgs, near_events::OmniBridgeEvent, prover_args::WormholeVerifyProofArgs, - prover_result::ProofKind, ChainKind, Fee, OmniAddress, TransferId, + ChainKind, Fee, OmniAddress, TransferId, TransferMessage, locker_args::ClaimFeeArgs, + near_events::OmniBridgeEvent, prover_args::WormholeVerifyProofArgs, prover_result::ProofKind, }; use crate::{config, utils}; @@ -37,28 +36,28 @@ enum EventAction { #[serde(tag = "init_transfer")] pub enum Transfer { Near { - event: OmniBridgeEvent, + transfer_message: TransferMessage, creation_timestamp: i64, last_update_timestamp: Option, }, Evm { chain_kind: ChainKind, block_number: u64, - log: Log, - tx_logs: Option>, + tx_hash: H256, + log: utils::evm::InitTransfer, creation_timestamp: i64, last_update_timestamp: Option, expected_finalization_time: i64, }, Solana { amount: U128, - token: String, - sender: String, - recipient: String, + token: Pubkey, + sender: OmniAddress, + recipient: OmniAddress, fee: U128, native_fee: u64, message: String, - emitter: String, + emitter: Pubkey, sequence: u64, creation_timestamp: i64, last_update_timestamp: Option, @@ -71,8 +70,10 @@ pub enum FinTransfer { Evm { chain_kind: ChainKind, block_number: u64, - log: Log, - tx_logs: Option>, + tx_hash: H256, + topic: B256, + origin_chain: ChainKind, + origin_nonce: u64, creation_timestamp: i64, expected_finalization_time: i64, }, @@ -88,8 +89,8 @@ pub enum DeployToken { Evm { chain_kind: ChainKind, block_number: u64, - log: Log, - tx_logs: Option>, + tx_hash: H256, + topic: B256, creation_timestamp: i64, expected_finalization_time: i64, }, @@ -140,11 +141,11 @@ pub async fn process_events( }; if let Err(err) = near_nonce.resync_nonce().await { - warn!("Failed to resync near nonce: {}", err); + warn!("Failed to resync near nonce: {err:?}"); } if let Err(err) = evm_nonces.resync_nonces().await { - warn!("Failed to resync evm nonces: {}", err); + warn!("Failed to resync evm nonces: {err:?}"); } let mut handlers = Vec::new(); @@ -189,7 +190,7 @@ pub async fn process_events( ) .await; } - }; + } } })); } else if let Transfer::Evm { .. } = transfer { @@ -231,7 +232,7 @@ pub async fn process_events( ) .await; } - }; + } } })); } else if let Transfer::Solana { .. } = transfer { @@ -271,7 +272,7 @@ pub async fn process_events( ) .await; } - }; + } } })); } @@ -312,7 +313,7 @@ pub async fn process_events( ) .await; } - }; + } } })); } @@ -353,7 +354,7 @@ pub async fn process_events( ) .await; } - }; + } } })); } else if let FinTransfer::Solana { .. } = fin_transfer_event { @@ -390,7 +391,7 @@ pub async fn process_events( ) .await; } - }; + } } })); } @@ -431,7 +432,7 @@ pub async fn process_events( ) .await; } - }; + } } })); } else if let DeployToken::Solana { .. } = deploy_token_event { @@ -468,7 +469,7 @@ pub async fn process_events( ) .await; } - }; + } } })); } @@ -510,7 +511,7 @@ async fn process_near_transfer_event( near_nonce: Arc, ) -> Result { let Transfer::Near { - ref event, + ref transfer_message, creation_timestamp, last_update_timestamp, } = transfer @@ -526,32 +527,28 @@ async fn process_near_transfer_event( return Ok(EventAction::Retry); } - let (OmniBridgeEvent::InitTransferEvent { - ref transfer_message, - } - | OmniBridgeEvent::FinTransferEvent { - ref transfer_message, - } - | OmniBridgeEvent::UpdateFeeEvent { - ref transfer_message, - }) = event - else { - anyhow::bail!( - "Expected InitTransferEvent/FinTransferEvent/UpdateFeeEvent, got: {:?}", - event - ); - }; + info!("Trying to process TransferMessage on NEAR"); - info!("Trying to process InitTransferEvent/FinTransferEvent/UpdateFeeEvent"); + match connector + .near_is_transfer_finalised(transfer_message.get_transfer_id()) + .await + { + Ok(true) => anyhow::bail!("Transfer is already finalised: {:?}", transfer_message), + Ok(false) => {} + Err(err) => { + warn!("Failed to check if transfer is finalised: {err:?}"); + return Ok(EventAction::Retry); + } + } - if config.is_check_fee_enabled() + if config.is_bridge_api_enabled() && !config .near .sign_without_checking_fee .as_ref() .is_some_and(|list| list.contains(&transfer_message.sender)) { - match utils::fee::is_fee_sufficient( + match utils::bridge_api::is_fee_sufficient( &config, transfer_message.fee.clone(), &transfer_message.sender, @@ -562,11 +559,11 @@ async fn process_near_transfer_event( { Ok(true) => {} Ok(false) => { - warn!("Insufficient fee for transfer: {:?}", transfer_message); + warn!("Insufficient fee for transfer: {transfer_message:?}"); return Ok(EventAction::Retry); } Err(err) => { - warn!("Failed to check fee sufficiency: {}", err); + warn!("Failed to check fee sufficiency: {err:?}"); return Ok(EventAction::Retry); } } @@ -613,7 +610,7 @@ async fn process_near_transfer_event( ) .await; - info!("Signed transfer: {:?}", tx_hash); + info!("Signed transfer: {tx_hash:?}"); Ok(EventAction::Remove) } @@ -665,13 +662,28 @@ async fn process_sign_transfer_event( anyhow::bail!("Expected SignTransferEvent, got: {:?}", sign_transfer_event); }; - info!("Received SignTransferEvent"); + info!("Trying to process SignTransferEvent log on NEAR"); + + match connector + .near_is_transfer_finalised(message_payload.transfer_id) + .await + { + Ok(true) => anyhow::bail!( + "Transfer is already finalised: {:?}", + message_payload.transfer_id + ), + Ok(false) => {} + Err(err) => { + warn!("Failed to check if transfer is finalised: {err:?}"); + return Ok(EventAction::Retry); + } + } if message_payload.fee_recipient != Some(signer) { anyhow::bail!("Fee recipient mismatch"); } - if config.is_check_fee_enabled() { + if config.is_bridge_api_enabled() { let transfer_message = match connector .near_get_transfer_message(message_payload.transfer_id) .await @@ -679,7 +691,10 @@ async fn process_sign_transfer_event( Ok(transfer_message) => transfer_message, Err(err) => { if err.to_string().contains("The transfer does not exist") { - anyhow::bail!("Transfer does not exist: {:?} (probably fee is 0 or transfer was already finalized)", message_payload.transfer_id); + anyhow::bail!( + "Transfer does not exist: {:?} (probably fee is 0 or transfer was already finalized)", + message_payload.transfer_id + ); } warn!( @@ -691,7 +706,7 @@ async fn process_sign_transfer_event( } }; - match utils::fee::is_fee_sufficient( + match utils::bridge_api::is_fee_sufficient( &config, transfer_message.fee, &transfer_message.sender, @@ -702,11 +717,11 @@ async fn process_sign_transfer_event( { Ok(true) => {} Ok(false) => { - warn!("Insufficient fee for transfer: {:?}", message_payload); + warn!("Insufficient fee for transfer: {message_payload:?}"); return Ok(EventAction::Retry); } Err(err) => { - warn!("Failed to check fee sufficiency: {}", err); + warn!("Failed to check fee sufficiency: {err:?}"); return Ok(EventAction::Retry); } } @@ -745,7 +760,7 @@ async fn process_sign_transfer_event( match connector.fin_transfer(fin_transfer_args).await { Ok(tx_hash) => { - info!("Finalized deposit: {}", tx_hash); + info!("Finalized deposit: {tx_hash}"); Ok(EventAction::Remove) } Err(err) => { @@ -791,8 +806,8 @@ async fn process_evm_init_transfer_event( let Transfer::Evm { chain_kind, block_number, + tx_hash: transaction_hash, ref log, - ref tx_logs, creation_timestamp, last_update_timestamp, expected_finalization_time, @@ -813,56 +828,54 @@ async fn process_evm_init_transfer_event( return Ok(EventAction::Retry); } - let Ok(init_log) = log.log_decode::() else { - anyhow::bail!("Failed to decode log as InitTransfer: {:?}", log); - }; - - info!("Trying to process InitTransfer log on {:?}", chain_kind); + info!("Trying to process InitTransfer log on {chain_kind:?}"); - let Some(tx_hash) = log.transaction_hash else { - anyhow::bail!("No transaction hash in log: {:?}", log); + let transfer_id = TransferId { + origin_chain: chain_kind, + origin_nonce: log.originNonce, }; + match connector.near_is_transfer_finalised(transfer_id).await { + Ok(true) => anyhow::bail!("Transfer is already finalised: {:?}", transfer_id), + Ok(false) => {} + Err(err) => { + warn!("Failed to check if transfer is finalised: {err:?}"); + return Ok(EventAction::Retry); + } + } - let recipient = init_log - .inner - .recipient - .parse::() - .map_err(|err| { - anyhow::anyhow!( - "Failed to parse \"{}\" as `OmniAddress`: {:?}", - init_log.inner.recipient, - err - ) - })?; + let recipient = log.recipient.parse::().map_err(|err| { + anyhow::anyhow!( + "Failed to parse \"{}\" as `OmniAddress`: {:?}", + log.recipient, + err + ) + })?; - if config.is_check_fee_enabled() { - let sender = - utils::evm::string_to_evm_omniaddress(chain_kind, &init_log.inner.sender.to_string()) - .map_err(|err| { + if config.is_bridge_api_enabled() { + let sender = utils::evm::string_to_evm_omniaddress(chain_kind, &log.sender.to_string()) + .map_err(|err| { anyhow::anyhow!( "Failed to parse \"{}\" as `OmniAddress`: {:?}", - init_log.inner.recipient, + log.sender, err ) })?; - let token = utils::evm::string_to_evm_omniaddress( - chain_kind, - &init_log.inner.tokenAddress.to_string(), - ) - .map_err(|err| { - anyhow::anyhow!( - "Failed to parse \"{}\" as `OmniAddress`: {:?}", - init_log.inner.recipient, - err - ) - })?; - - match utils::fee::is_fee_sufficient( + let token = + utils::evm::string_to_evm_omniaddress(chain_kind, &log.tokenAddress.to_string()) + .map_err(|err| { + anyhow::anyhow!( + "Failed to parse \"{}\" as `OmniAddress`: {:?}", + log.tokenAddress, + err + ) + })?; + + match utils::bridge_api::is_fee_sufficient( &config, Fee { - fee: init_log.inner.fee.into(), - native_fee: init_log.inner.nativeFee.into(), + fee: log.fee.into(), + native_fee: log.nativeFee.into(), }, &sender, &recipient, @@ -872,19 +885,20 @@ async fn process_evm_init_transfer_event( { Ok(true) => {} Ok(false) => { - warn!("Insufficient fee for transfer: {:?}", transfer); + warn!("Insufficient fee for transfer: {transfer:?}"); return Ok(EventAction::Retry); } Err(err) => { - warn!("Failed to check fee sufficiency: {}", err); + warn!("Failed to check fee sufficiency: {err:?}"); return Ok(EventAction::Retry); } } } - let vaa = - utils::evm::get_vaa_from_evm_log(connector.clone(), chain_kind, tx_logs.clone(), &config) - .await; + let vaa = connector + .wormhole_get_vaa_by_tx_hash(format!("{transaction_hash:?}")) + .await + .ok(); if vaa.is_none() { if chain_kind == ChainKind::Eth { @@ -918,15 +932,13 @@ async fn process_evm_init_transfer_event( } } - let tx_hash = H256::from_slice(tx_hash.as_slice()); - let storage_deposit_actions = match utils::storage::get_storage_deposit_actions( &connector, chain_kind, &recipient, - &init_log.inner.tokenAddress.to_string(), - init_log.inner.fee, - init_log.inner.nativeFee, + &log.tokenAddress.to_string(), + log.fee, + log.nativeFee, ) .await { @@ -956,7 +968,7 @@ async fn process_evm_init_transfer_event( } else { omni_connector::FinTransferArgs::NearFinTransferWithEvmProof { chain_kind, - tx_hash, + tx_hash: transaction_hash, storage_deposit_actions, transaction_options: TransactionOptions { nonce: Some(nonce), @@ -968,7 +980,7 @@ async fn process_evm_init_transfer_event( match connector.fin_transfer(fin_transfer_args).await { Ok(tx_hash) => { - info!("Finalized InitTransfer: {:?}", tx_hash); + info!("Finalized InitTransfer: {tx_hash:?}"); Ok(EventAction::Remove) } Err(err) => { @@ -979,22 +991,19 @@ async fn process_evm_init_transfer_event( | NearRpcError::RpcTransactionError(JsonRpcError::TransportError(_)) => { warn!( "Failed to finalize transfer ({}), retrying: {near_rpc_error:?}", - init_log.inner.originNonce + log.originNonce ); return Ok(EventAction::Retry); } _ => { anyhow::bail!( "Failed to finalize transfer ({}): {near_rpc_error:?}", - init_log.inner.originNonce + log.originNonce ); } }; } - anyhow::bail!( - "Failed to finalize transfer ({}): {err:?}", - init_log.inner.originNonce - ); + anyhow::bail!("Failed to finalize transfer ({}): {err:?}", log.originNonce); } } } @@ -1035,48 +1044,44 @@ async fn process_solana_init_transfer_event( info!("Trying to process InitTransfer log on Solana"); - let recipient = recipient.parse::().map_err(|err| { - anyhow::anyhow!( - "Failed to parse \"{}\" as `OmniAddress`: {:?}", - recipient, - err - ) - })?; - - if config.is_check_fee_enabled() { - let sender = Pubkey::from_str(sender)?; - - let sender = - OmniAddress::new_from_slice(ChainKind::Sol, &sender.to_bytes()).map_err(|err| { - anyhow::anyhow!("Failed to parse \"{}\" as `OmniAddress`: {:?}", sender, err) - })?; - - let token = Pubkey::from_str(token)?; + let transfer_id = TransferId { + origin_chain: ChainKind::Sol, + origin_nonce: sequence, + }; + match connector.near_is_transfer_finalised(transfer_id).await { + Ok(true) => anyhow::bail!("Transfer is already finalised: {:?}", transfer_id), + Ok(false) => {} + Err(err) => { + warn!("Failed to check if transfer is finalised: {err:?}"); + return Ok(EventAction::Retry); + } + } + if config.is_bridge_api_enabled() { let token = OmniAddress::new_from_slice(ChainKind::Sol, &token.to_bytes()).map_err(|err| { anyhow::anyhow!("Failed to parse \"{}\" as `OmniAddress`: {:?}", sender, err) })?; - match utils::fee::is_fee_sufficient( + match utils::bridge_api::is_fee_sufficient( &config, Fee { fee, native_fee: u128::from(native_fee).into(), }, - &sender, - &recipient, + sender, + recipient, &token, ) .await { Ok(true) => {} Ok(false) => { - warn!("Insufficient fee for transfer: {:?}", transfer); + warn!("Insufficient fee for transfer: {transfer:?}"); return Ok(EventAction::Retry); } Err(err) => { - warn!("Failed to check fee sufficiency: {}", err); + warn!("Failed to check fee sufficiency: {err:?}"); return Ok(EventAction::Retry); } } @@ -1086,15 +1091,15 @@ async fn process_solana_init_transfer_event( .wormhole_get_vaa(config.wormhole.solana_chain_id, &emitter, sequence) .await else { - warn!("Failed to get VAA for sequence: {}", sequence); + warn!("Failed to get VAA for sequence: {sequence}"); return Ok(EventAction::Retry); }; let storage_deposit_actions = match utils::storage::get_storage_deposit_actions( &connector, ChainKind::Sol, - &recipient, - token, + recipient, + &token.to_string(), fee.0, u128::from(native_fee), ) @@ -1126,7 +1131,7 @@ async fn process_solana_init_transfer_event( match connector.fin_transfer(fin_transfer_args).await { Ok(tx_hash) => { - info!("Finalized InitTransfer: {:?}", tx_hash); + info!("Finalized InitTransfer: {tx_hash:?}"); Ok(EventAction::Remove) } Err(err) => { @@ -1159,8 +1164,10 @@ async fn process_evm_fin_transfer_event( let FinTransfer::Evm { chain_kind, block_number, - log, - tx_logs, + tx_hash: transaction_hash, + topic, + origin_chain, + origin_nonce, creation_timestamp, expected_finalization_time, } = fin_transfer @@ -1174,10 +1181,25 @@ async fn process_evm_fin_transfer_event( return Ok(EventAction::Retry); } - info!("Trying to process FinTransfer log on {:?}", chain_kind); + info!("Trying to process FinTransfer log on {chain_kind:?}"); - let vaa = - utils::evm::get_vaa_from_evm_log(connector.clone(), chain_kind, tx_logs, &config).await; + let transfer_id = TransferId { + origin_chain, + origin_nonce, + }; + match connector.near_is_transfer_finalised(transfer_id).await { + Ok(true) => anyhow::bail!("Transfer is already finalised: {:?}", transfer_id), + Ok(false) => {} + Err(err) => { + warn!("Failed to check if transfer is finalised: {err:?}"); + return Ok(EventAction::Retry); + } + } + + let vaa = connector + .wormhole_get_vaa_by_tx_hash(format!("{transaction_hash:?}")) + .await + .ok(); if vaa.is_none() { if chain_kind == ChainKind::Eth { @@ -1203,26 +1225,16 @@ async fn process_evm_fin_transfer_event( } } - let Some(tx_hash) = log.transaction_hash else { - anyhow::bail!("No transaction hash in log: {:?}", log); - }; - - let Some(topic) = log.topic0() else { - anyhow::bail!("No topic0 in log: {:?}", log); - }; - - let tx_hash = H256::from_slice(tx_hash.as_slice()); - let Some(prover_args) = utils::evm::construct_prover_args( &config, vaa, - tx_hash, + transaction_hash, H256::from_slice(topic.as_slice()), ProofKind::FinTransfer, ) .await else { - warn!("Failed to get prover args for {:?}", tx_hash); + warn!("Failed to get prover args for {transaction_hash:?}"); return Ok(EventAction::Retry); }; @@ -1248,7 +1260,7 @@ async fn process_evm_fin_transfer_event( .await { Ok(tx_hash) => { - info!("Claimed fee: {:?}", tx_hash); + info!("Claimed fee: {tx_hash:?}"); Ok(EventAction::Remove) } Err(err) => { @@ -1292,7 +1304,7 @@ async fn process_solana_fin_transfer_event( .wormhole_get_vaa(config.wormhole.solana_chain_id, emitter, sequence) .await else { - warn!("Failed to get VAA for sequence: {}", sequence); + warn!("Failed to get VAA for sequence: {sequence}"); return Ok(EventAction::Retry); }; @@ -1325,7 +1337,7 @@ async fn process_solana_fin_transfer_event( .await { Ok(tx_hash) => { - info!("Claimed fee: {:?}", tx_hash); + info!("Claimed fee: {tx_hash:?}"); Ok(EventAction::Remove) } Err(err) => { @@ -1357,8 +1369,8 @@ async fn process_evm_deploy_token_event( let DeployToken::Evm { chain_kind, block_number, - log, - tx_logs, + tx_hash: transaction_hash, + topic, creation_timestamp, expected_finalization_time, } = deploy_token_event @@ -1372,10 +1384,12 @@ async fn process_evm_deploy_token_event( return Ok(EventAction::Retry); } - info!("Trying to process DeployToken log on {:?}", chain_kind); + info!("Trying to process DeployToken log on {chain_kind:?}"); - let vaa = - utils::evm::get_vaa_from_evm_log(connector.clone(), chain_kind, tx_logs, &config).await; + let vaa = connector + .wormhole_get_vaa_by_tx_hash(format!("{transaction_hash:?}")) + .await + .ok(); if vaa.is_none() { if chain_kind == ChainKind::Eth { @@ -1401,26 +1415,16 @@ async fn process_evm_deploy_token_event( } } - let Some(tx_hash) = log.transaction_hash else { - anyhow::bail!("No transaction hash in log: {:?}", log); - }; - - let Some(topic) = log.topic0() else { - anyhow::bail!("No topic0 in log: {:?}", log); - }; - - let tx_hash = H256::from_slice(tx_hash.as_slice()); - let Some(prover_args) = utils::evm::construct_prover_args( &config, vaa, - tx_hash, + transaction_hash, H256::from_slice(topic.as_slice()), ProofKind::DeployToken, ) .await else { - warn!("Failed to get prover args for {:?}", tx_hash); + warn!("Failed to get prover args for {transaction_hash:?}"); return Ok(EventAction::Retry); }; @@ -1441,7 +1445,7 @@ async fn process_evm_deploy_token_event( match connector.bind_token(bind_token_args).await { Ok(tx_hash) => { - info!("Bound token: {:?}", tx_hash); + info!("Bound token: {tx_hash:?}"); Ok(EventAction::Remove) } Err(err) => { @@ -1486,7 +1490,7 @@ async fn process_solana_deploy_token_event( .wormhole_get_vaa(config.wormhole.solana_chain_id, emitter, sequence) .await else { - warn!("Failed to get VAA for sequence: {}", sequence); + warn!("Failed to get VAA for sequence: {sequence}"); return Ok(EventAction::Retry); }; @@ -1500,7 +1504,7 @@ async fn process_solana_deploy_token_event( let nonce = match near_nonce.reserve_nonce().await { Ok(nonce) => Some(nonce), Err(err) => { - warn!("Failed to reserve nonce: {}", err); + warn!("Failed to reserve nonce: {err:?}"); return Ok(EventAction::Retry); } }; @@ -1517,7 +1521,7 @@ async fn process_solana_deploy_token_event( match connector.bind_token(bind_token_args).await { Ok(tx_hash) => { - info!("Bound token: {:?}", tx_hash); + info!("Bound token: {tx_hash:?}"); Ok(EventAction::Remove) } Err(err) => { diff --git a/solana/bridge_token_factory/programs/bridge_token_factory/src/constants.rs b/solana/bridge_token_factory/programs/bridge_token_factory/src/constants.rs index 0e51eb22b..d43518698 100644 --- a/solana/bridge_token_factory/programs/bridge_token_factory/src/constants.rs +++ b/solana/bridge_token_factory/programs/bridge_token_factory/src/constants.rs @@ -25,7 +25,7 @@ pub const METADATA_SEED: &[u8] = b"metadata"; pub const USED_NONCES_PER_ACCOUNT: u32 = 1024; #[constant] -pub const USED_NONCES_ACCOUNT_SIZE: u32 = 8 + (USED_NONCES_PER_ACCOUNT + 7) / 8; +pub const USED_NONCES_ACCOUNT_SIZE: u32 = 8 + (USED_NONCES_PER_ACCOUNT + 7).div_ceil(8); #[constant] pub const SOLANA_OMNI_BRIDGE_CHAIN_ID: u8 = 2; diff --git a/solana/bridge_token_factory/programs/bridge_token_factory/src/state/used_nonces.rs b/solana/bridge_token_factory/programs/bridge_token_factory/src/state/used_nonces.rs index 81e7117cf..5ea553722 100644 --- a/solana/bridge_token_factory/programs/bridge_token_factory/src/state/used_nonces.rs +++ b/solana/bridge_token_factory/programs/bridge_token_factory/src/state/used_nonces.rs @@ -16,7 +16,7 @@ use super::config::Config; #[account(zero_copy(unsafe))] #[repr(C)] pub struct UsedNonces { - used: BitArray<[u8; (USED_NONCES_PER_ACCOUNT as usize + 7) / 8]>, + used: BitArray<[u8; (USED_NONCES_PER_ACCOUNT as usize + 7).div_ceil(8)]>, } #[cfg(feature = "idl-build")]