diff --git a/Makefile b/Makefile index 24e5fc92..6ed4e908 100644 --- a/Makefile +++ b/Makefile @@ -29,7 +29,7 @@ build-contract: docker run --user $(id -u):$(id -g) --rm -v $(CONTRACT_DIR):/code \ --mount type=volume,source="coreumbridge_xrpl_cache",target=/code/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/optimizer:0.15.0-beta.1 + cosmwasm/optimizer:0.15.0 mkdir -p $(BUILD_DIR) cp $(CONTRACT_DIR)/artifacts/coreumbridge_xrpl.wasm $(BUILD_DIR)/coreumbridge_xrpl.wasm diff --git a/README.md b/README.md index 08e038ed..2acf884f 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Coreumbrdige XRPL +# Coreumbridge XRPL Two-way Coreum XRPL bridge. diff --git a/contract/Cargo.lock b/contract/Cargo.lock index 2e3ee8e6..1013d81b 100644 --- a/contract/Cargo.lock +++ b/contract/Cargo.lock @@ -19,9 +19,9 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "ahash" -version = "0.7.6" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" +checksum = "5a824f2aa7e75a0c98c5a504fceb80649e9c35265d44525b5f94de4771a395cd" dependencies = [ "getrandom", "once_cell", @@ -30,9 +30,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea5d730647d4fadd988536d06fecce94b7b4f2a7efdae548f1cf4b63205518ab" +checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" dependencies = [ "memchr", ] @@ -45,13 +45,13 @@ checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" [[package]] name = "async-trait" -version = "0.1.73" +version = "0.1.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0" +checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.39", ] [[package]] @@ -95,9 +95,9 @@ checksum = "0ea22880d78093b0cbe17c89f64a7d457941e65759157ec6cb31a31d652b05e5" [[package]] name = "base64" -version = "0.21.4" +version = "0.21.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ba43ea6f343b788c8764558649e08df62f86c6ef251fdaeb1ffd010a9ae50a2" +checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" [[package]] name = "base64ct" @@ -117,7 +117,7 @@ version = "0.69.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ffcebc3849946a7170a05992aac39da343a90676ab392c51a4280981d6379c2" dependencies = [ - "bitflags 2.4.0", + "bitflags 2.4.1", "cexpr", "clang-sys", "lazy_static", @@ -130,7 +130,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.37", + "syn 2.0.39", "which", ] @@ -160,9 +160,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" +checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" [[package]] name = "block-buffer" @@ -205,9 +205,9 @@ checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" [[package]] name = "byteorder" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" @@ -313,7 +313,7 @@ dependencies = [ "cosmwasm-std", "osmosis-std-derive", "prost 0.11.9", - "prost-types 0.12.1", + "prost-types 0.12.2", "schemars", "serde", "serde-cw-value", @@ -395,9 +395,9 @@ dependencies = [ [[package]] name = "cosmwasm-schema" -version = "1.4.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fef683a9c1c4eabd6d31515719d0d2cc66952c4c87f7eb192bfc90384517dc34" +checksum = "0df41ea55f2946b6b43579659eec048cc2f66e8c8e2e3652fc5e5e476f673856" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -408,9 +408,9 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.4.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9567025acbb4c0c008178393eb53b3ac3c2e492c25949d3bf415b9cbe80772d8" +checksum = "43609e92ce1b9368aa951b334dd354a2d0dd4d484931a5f83ae10e12a26c8ba9" dependencies = [ "proc-macro2", "quote", @@ -423,7 +423,7 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04d6864742e3a7662d024b51a94ea81c9af21db6faea2f9a6d2232bb97c6e53e" dependencies = [ - "base64 0.21.4", + "base64 0.21.5", "bech32", "bnum", "cosmwasm-crypto", @@ -441,18 +441,18 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.9" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" +checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" dependencies = [ "libc", ] [[package]] name = "crypto-bigint" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "740fe28e594155f10cfc383984cbefd529d7396050557148f79cb0f621204124" +checksum = "28f85c3514d2a6e64160359b45a3918c3b4178bcbf4ae5d03ab2d02e521c479a" dependencies = [ "generic-array", "rand_core 0.6.4", @@ -542,9 +542,9 @@ dependencies = [ [[package]] name = "cw-storage-plus" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f0e92a069d62067f3472c62e30adedb4cab1754725c0f2a682b3128d2bf3c79" +checksum = "d5ff29294ee99373e2cd5fd21786a3c0ced99a52fec2ca347d565489c61b723c" dependencies = [ "cosmwasm-std", "schemars", @@ -592,9 +592,12 @@ dependencies = [ [[package]] name = "deranged" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2696e8a945f658fd14dc3b87242e6b80cd0f36ff04ea560fa39082368847946" +checksum = "0f32d04922c60427da6f9fef14d042d9edddef64cb9d4ce0d64d0685fbeb1fd3" +dependencies = [ + "powerfmt", +] [[package]] name = "derivative" @@ -630,15 +633,15 @@ dependencies = [ [[package]] name = "dyn-clone" -version = "1.0.14" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23d2f3407d9a573d666de4b5bdf10569d73ca9478087346697dcbae6244bfbcd" +checksum = "545b22097d44f8a9581187cdf93de7a71e4722bf51200cfaba810865b49a495d" [[package]] name = "ecdsa" -version = "0.16.8" +version = "0.16.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" dependencies = [ "der", "digest 0.10.7", @@ -650,9 +653,9 @@ dependencies = [ [[package]] name = "ed25519" -version = "2.2.2" +version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60f6d271ca33075c88028be6f04d502853d63a5ece419d269c15315d4fc1cf1d" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" dependencies = [ "pkcs8", "signature", @@ -678,7 +681,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c24f403d068ad0b359e577a77f92392118be3f3c927538f2bb544a5ecd828c6" dependencies = [ "curve25519-dalek", - "hashbrown", + "hashbrown 0.12.3", "hex", "rand_core 0.6.4", "serde", @@ -694,9 +697,9 @@ checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" [[package]] name = "elliptic-curve" -version = "0.13.6" +version = "0.13.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d97ca172ae9dc9f9b779a6e3a65d308f2af74e5b8c921299075bdb4a0370e914" +checksum = "e9775b22bc152ad86a0cf23f0f348b884b26add12bf741e7ffc4d4ab2ab4d205" dependencies = [ "base16ct", "crypto-bigint", @@ -712,24 +715,19 @@ dependencies = [ ] [[package]] -name = "errno" -version = "0.3.4" +name = "equivalent" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "add4f07d43996f76ef320709726a556a9d4f965d9410d8d0271132d2f8293480" -dependencies = [ - "errno-dragonfly", - "libc", - "windows-sys", -] +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] -name = "errno-dragonfly" -version = "0.1.2" +name = "errno" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +checksum = "f258a7194e7f7c2a7837a8913aeab7fd8c383457034fa20ce4dd3dcb813e8eb8" dependencies = [ - "cc", "libc", + "windows-sys", ] [[package]] @@ -785,9 +783,9 @@ checksum = "c8cbd1169bd7b4a0a20d92b9af7a7e0422888bd38a6f5ec29c1fd8c1558a272e" [[package]] name = "futures" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" +checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" dependencies = [ "futures-channel", "futures-core", @@ -800,9 +798,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" dependencies = [ "futures-core", "futures-sink", @@ -810,15 +808,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" +checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" [[package]] name = "futures-executor" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" +checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" dependencies = [ "futures-core", "futures-task", @@ -827,38 +825,38 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" +checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" [[package]] name = "futures-macro" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" +checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.39", ] [[package]] name = "futures-sink" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" +checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" [[package]] name = "futures-task" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" +checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" [[package]] name = "futures-util" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" dependencies = [ "futures-channel", "futures-core", @@ -885,9 +883,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" dependencies = [ "cfg-if", "js-sys", @@ -921,9 +919,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.21" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833" +checksum = "4d6250322ef6e60f93f9a2162799302cd6f68f79f6e5d85c8c16f14d1d958178" dependencies = [ "bytes", "fnv", @@ -947,13 +945,19 @@ dependencies = [ "ahash", ] +[[package]] +name = "hashbrown" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f93e7192158dbcda357bdec5fb5788eebf8bbac027f3f33e719d29135ae84156" + [[package]] name = "headers" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06683b93020a07e3dbcf5f8c0f6d40080d725bea7936fc01ad345c01b97dc270" dependencies = [ - "base64 0.21.4", + "base64 0.21.5", "bytes", "headers-core", "http", @@ -1003,9 +1007,9 @@ dependencies = [ [[package]] name = "http" -version = "0.2.9" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" dependencies = [ "bytes", "fnv", @@ -1052,7 +1056,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2 0.4.9", + "socket2 0.4.10", "tokio", "tower-service", "tracing", @@ -1114,12 +1118,12 @@ checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" [[package]] name = "indexmap" -version = "1.9.3" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" dependencies = [ - "autocfg", - "hashbrown", + "equivalent", + "hashbrown 0.14.2", ] [[package]] @@ -1148,18 +1152,18 @@ checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "js-sys" -version = "0.3.64" +version = "0.3.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +checksum = "54c0c35952f67de54bb584e9fd912b3023117cbafc0a77d8f3dee1fb5f572fe8" dependencies = [ "wasm-bindgen", ] [[package]] name = "k256" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" +checksum = "3f01b677d82ef7a676aa37e099defd83a28e15687112cafdd112d60236b6115b" dependencies = [ "cfg-if", "ecdsa", @@ -1183,9 +1187,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.148" +version = "0.2.150" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cdc71e17332e86d2e1d38c1f99edcb6288ee11b815fb1a4b049eaa2114d369b" +checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" [[package]] name = "libloading" @@ -1199,9 +1203,9 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.4.8" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3852614a3bd9ca9804678ba6be5e3b8ce76dfc902cae004e3e0c44051b6e88db" +checksum = "969488b55f8ac402214f3f5fd243ebb7206cf82de60d3172994707a4bcc2b829" [[package]] name = "log" @@ -1238,9 +1242,9 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" +checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" dependencies = [ "libc", "wasi", @@ -1270,9 +1274,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" +checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" dependencies = [ "autocfg", ] @@ -1399,7 +1403,7 @@ checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.39", ] [[package]] @@ -1424,6 +1428,12 @@ dependencies = [ "spki", ] +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + [[package]] name = "ppv-lite86" version = "0.2.17" @@ -1437,14 +1447,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae005bd773ab59b4725093fd7df83fd7892f7d8eafb48dbd7de6e024e4215f9d" dependencies = [ "proc-macro2", - "syn 2.0.37", + "syn 2.0.39", ] [[package]] name = "proc-macro2" -version = "1.0.67" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d433d9f1a3e8c1263d9456598b16fec66f4acc9a74dacffd35c7bb09b3a1328" +checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" dependencies = [ "unicode-ident", ] @@ -1461,12 +1471,12 @@ dependencies = [ [[package]] name = "prost" -version = "0.12.1" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4fdd22f3b9c31b53c060df4a0613a1c7f062d4115a2b984dd15b1858f7e340d" +checksum = "5a5a410fc7882af66deb8d01d01737353cf3ad6204c408177ba494291a626312" dependencies = [ "bytes", - "prost-derive 0.12.1", + "prost-derive 0.12.2", ] [[package]] @@ -1484,15 +1494,15 @@ dependencies = [ [[package]] name = "prost-derive" -version = "0.12.1" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "265baba7fabd416cf5078179f7d2cbeca4ce7a9041111900675ea7c4cb8a4c32" +checksum = "065717a5dfaca4a83d2fe57db3487b311365200000551d7a364e715dbf4346bc" dependencies = [ "anyhow", "itertools 0.11.0", "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.39", ] [[package]] @@ -1506,11 +1516,11 @@ dependencies = [ [[package]] name = "prost-types" -version = "0.12.1" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e081b29f63d83a4bc75cfc9f3fe424f9156cf92d8a4f0c9407cce9a1b67327cf" +checksum = "8339f32236f590281e2f6368276441394fcd1b2133b549cc895d0ae80f2f9a52" dependencies = [ - "prost 0.12.1", + "prost 0.12.2", ] [[package]] @@ -1560,9 +1570,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.0" +version = "1.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d119d7c7ca818f8a53c300863d4f87566aac09943aef5b355bb83969dae75d87" +checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" dependencies = [ "aho-corasick", "memchr", @@ -1572,9 +1582,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.1" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "465c6fc0621e4abc4187a2bda0937bfd4f722c2730b29562e19689ea796c9a4b" +checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" dependencies = [ "aho-corasick", "memchr", @@ -1583,9 +1593,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56d84fdd47036b038fc80dd333d10b6aab10d5d31f4a366e20014def75328d33" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "rfc6979" @@ -1635,11 +1645,11 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustix" -version = "0.38.15" +version = "0.38.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2f9da0cbd88f9f09e7814e388301c8414c51c62aa6ce1e4b5c551d49d96e531" +checksum = "9ad981d6c340a49cdc40a1028d9c6084ec7e9fa33fcb839cab656a267071e234" dependencies = [ - "bitflags 2.4.0", + "bitflags 2.4.1", "errno", "libc", "linux-raw-sys", @@ -1697,9 +1707,9 @@ dependencies = [ [[package]] name = "schemars" -version = "0.8.15" +version = "0.8.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f7b0ce13155372a76ee2e1c5ffba1fe61ede73fbea5630d61eee6fac4929c0c" +checksum = "45a28f4c49489add4ce10783f7911893516f15afe45d015608d41faca6bc4d29" dependencies = [ "dyn-clone", "schemars_derive", @@ -1709,9 +1719,9 @@ dependencies = [ [[package]] name = "schemars_derive" -version = "0.8.15" +version = "0.8.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e85e2a16b12bdb763244c69ab79363d71db2b4b918a2def53f80b02e0574b13c" +checksum = "c767fd6fa65d9ccf9cf026122c1b555f2ef9a4f0cea69da4d7dbc3e258d30967" dependencies = [ "proc-macro2", "quote", @@ -1768,9 +1778,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.19" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad977052201c6de01a8ef2aa3378c4bd23217a056337d1d6da40468d267a4fb0" +checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" [[package]] name = "serde" @@ -1816,7 +1826,7 @@ checksum = "d6c7207fbec9faa48073f3e3074cbe553af6ea512d7c21ba46e434e70ea9fbc1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.39", ] [[package]] @@ -1843,13 +1853,13 @@ dependencies = [ [[package]] name = "serde_repr" -version = "0.1.16" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8725e1dfadb3a50f7e5ce0b1a540466f6ed3fe7a0fca2ac2b8b831d31316bd00" +checksum = "3081f5ffbb02284dda55132aa26daecedd7372a42417bbbab6f14ab7d6bb9145" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.39", ] [[package]] @@ -1895,9 +1905,9 @@ checksum = "a7cee0529a6d40f580e7a5e6c495c8fbfe21b7b52795ed4bb5e62cdf92bc6380" [[package]] name = "signature" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ "digest 0.10.7", "rand_core 0.6.4", @@ -1914,9 +1924,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" dependencies = [ "libc", "winapi", @@ -1924,9 +1934,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.4" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4031e820eb552adee9295814c0ced9e5cf38ddf1e8b7d566d6de8e2538ea989e" +checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" dependencies = [ "libc", "windows-sys", @@ -1988,9 +1998,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.37" +version = "2.0.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7303ef2c05cd654186cb250d29049a24840ca25d2747c25c0381c8d9e2f582e8" +checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" dependencies = [ "proc-macro2", "quote", @@ -2146,16 +2156,17 @@ checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.39", ] [[package]] name = "time" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "426f806f4089c493dcac0d24c29c01e2c38baf8e30f1b716ee37e83d200b18fe" +checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5" dependencies = [ "deranged", + "powerfmt", "serde", "time-core", "time-macros", @@ -2193,9 +2204,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.32.0" +version = "1.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17ed6077ed6cd6c74735e21f37eb16dc3935f96878b1fe961074089cc80893f9" +checksum = "d0c014766411e834f7af5b8f4cf46257aab4036ca95e9d2c144a10f59ad6f5b9" dependencies = [ "backtrace", "bytes", @@ -2203,20 +2214,20 @@ dependencies = [ "mio", "num_cpus", "pin-project-lite", - "socket2 0.5.4", + "socket2 0.5.5", "tokio-macros", "windows-sys", ] [[package]] name = "tokio-macros" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" +checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.39", ] [[package]] @@ -2232,9 +2243,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d68074620f57a0b21594d9735eb2e98ab38b17f80d3fcb189fca266771ca60d" +checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" dependencies = [ "bytes", "futures-core", @@ -2261,20 +2272,19 @@ checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" -version = "0.1.37" +version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ - "cfg-if", "pin-project-lite", "tracing-core", ] [[package]] name = "tracing-core" -version = "0.1.31" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" dependencies = [ "once_cell", ] @@ -2368,9 +2378,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.87" +version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" +checksum = "7daec296f25a1bae309c0cd5c29c4b260e510e6d813c286b19eaadf409d40fce" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -2378,24 +2388,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.87" +version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" +checksum = "e397f4664c0e4e428e8313a469aaa58310d302159845980fd23b0f22a847f217" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.39", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.87" +version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" +checksum = "5961017b3b08ad5f3fe39f1e79877f8ee7c23c5e5fd5eb80de95abc41f1f16b2" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2403,28 +2413,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.87" +version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" +checksum = "c5353b8dab669f5e10f5bd76df26a9360c748f054f862ff5f3f8aae0c7fb3907" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.39", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.87" +version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" +checksum = "0d046c5d029ba91a1ed14da14dca44b68bf2f124cfbaf741c54151fdb3e0750b" [[package]] name = "web-sys" -version = "0.3.64" +version = "0.3.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" +checksum = "5db499c5f66323272151db0e666cd34f78617522fb0c1604d31a27c50c206a85" dependencies = [ "js-sys", "wasm-bindgen", @@ -2560,9 +2570,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "zeroize" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" dependencies = [ "zeroize_derive", ] @@ -2575,5 +2585,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.39", ] diff --git a/contract/Cargo.toml b/contract/Cargo.toml index a0060c1c..e74485ac 100644 --- a/contract/Cargo.toml +++ b/contract/Cargo.toml @@ -25,16 +25,16 @@ overflow-checks = true [dependencies] coreum-wasm-sdk = "0.2.3" -cosmwasm-schema = "1.4.1" -cosmwasm-std = { version = "1.4.1", features = ["cosmwasm_1_1"] } +cosmwasm-schema = "1.5.0" +cosmwasm-std = { version = "1.5.0", features = ["cosmwasm_1_1"] } cw-ownable = "0.5.1" -cw-storage-plus = "1.1.0" +cw-storage-plus = "1.2.0" cw-utils = "1.0.2" cw2 = "1.1.1" hex = "0.4.3" -serde_json = "1.0.107" +serde_json = "1.0.108" sha2 = "0.10.8" -thiserror = "1.0.49" +thiserror = "1.0.50" [dev-dependencies] coreum-test-tube = "3.0.1" diff --git a/contract/src/contract.rs b/contract/src/contract.rs index 7497537a..9431e1b1 100644 --- a/contract/src/contract.rs +++ b/contract/src/contract.rs @@ -4,8 +4,8 @@ use crate::{ error::ContractError, evidence::{handle_evidence, hash_bytes, Evidence, OperationResult, TransactionResult}, msg::{ - AvailableTicketsResponse, CoreumTokensResponse, ExecuteMsg, InstantiateMsg, - PendingOperationsResponse, QueryMsg, XRPLTokensResponse, + AvailableTicketsResponse, CoreumTokenResponse, CoreumTokensResponse, ExecuteMsg, + InstantiateMsg, PendingOperationsResponse, QueryMsg, XRPLTokensResponse, }, operation::{ check_operation_exists, create_pending_operation, handle_trust_set_confirmation, Operation, @@ -16,7 +16,7 @@ use crate::{ state::{ Config, ContractActions, CoreumToken, TokenState, XRPLToken, AVAILABLE_TICKETS, CONFIG, COREUM_TOKENS, PENDING_OPERATIONS, PENDING_TICKET_UPDATE, USED_TICKETS_COUNTER, - USED_XRPL_CURRENCIES_FOR_COREUM_TOKENS, XRPL_TOKENS, + XRPL_TOKENS, }, tickets::{allocate_ticket, handle_ticket_allocation_confirmation, register_used_ticket}, }; @@ -26,7 +26,7 @@ use coreum_wasm_sdk::{ core::{CoreumMsg, CoreumQueries, CoreumResult}, }; use cosmwasm_std::{ - coin, entry_point, to_json_binary, Addr, Binary, CosmosMsg, Deps, DepsMut, Empty, Env, + coin, coins, entry_point, to_json_binary, Addr, BankMsg, Binary, CosmosMsg, Deps, DepsMut, Env, MessageInfo, Order, Response, StdResult, Uint128, }; use cw2::set_contract_version; @@ -241,15 +241,20 @@ fn register_coreum_token( let xrpl_currency = convert_currency_to_xrpl_hexadecimal(format!("{}{}", COREUM_CURRENCY_PREFIX, hex_string)); - if USED_XRPL_CURRENCIES_FOR_COREUM_TOKENS.has(deps.storage, xrpl_currency.clone()) { + // We check that the this currency is not used already (we got the same hash) + if COREUM_TOKENS + .idx + .xrpl_currency + .item(deps.storage, xrpl_currency.to_owned())? + .is_some() + { return Err(ContractError::RegistrationFailure {}); } - USED_XRPL_CURRENCIES_FOR_COREUM_TOKENS.save(deps.storage, xrpl_currency.clone(), &Empty {})?; let token = CoreumToken { denom: denom.clone(), decimals, - xrpl_currency: xrpl_currency.clone(), + xrpl_currency: xrpl_currency.to_owned(), sending_precision, max_holding_amount, // All registered Coreum originated tokens will start as enabled because they don't need a TrustSet operation to be bridged because issuer for such tokens is bridge address @@ -376,42 +381,78 @@ fn save_evidence(deps: DepsMut, sender: Addr, evidence: Evidence) -> CoreumResul amount, recipient, } => { - // Create issuer+currency key to find denom on coreum. - let key = build_xrpl_token_key(issuer.clone(), currency.clone()); + deps.api.addr_validate(recipient.as_ref())?; + let config = CONFIG.load(deps.storage)?; - let token = XRPL_TOKENS - .load(deps.storage, key) - .map_err(|_| ContractError::TokenNotRegistered {})?; + // This means the token is not a Coreum originated token (the issuer is not the XRPL multisig address) + if issuer.ne(&config.bridge_xrpl_address) { + // Create issuer+currency key to find denom on coreum. + let key = build_xrpl_token_key(issuer.clone(), currency.clone()); - if token.state.ne(&TokenState::Enabled) { - return Err(ContractError::XRPLTokenNotEnabled {}); - } + let token = XRPL_TOKENS + .load(deps.storage, key) + .map_err(|_| ContractError::TokenNotRegistered {})?; - let decimals = match is_token_xrp(token.issuer, token.currency) { - true => XRP_DECIMALS, - false => XRPL_TOKENS_DECIMALS, - }; + if token.state.ne(&TokenState::Enabled) { + return Err(ContractError::XRPLTokenNotEnabled {}); + } - let amount_to_send = truncate_amount(token.sending_precision, decimals, amount)?; + let decimals = match is_token_xrp(token.issuer, token.currency) { + true => XRP_DECIMALS, + false => XRPL_TOKENS_DECIMALS, + }; - if amount_to_send - .checked_add( - deps.querier - .query_supply(token.coreum_denom.clone())? - .amount, - )? - .gt(&token.max_holding_amount) - { - return Err(ContractError::MaximumBridgedAmountReached {}); - } + let amount_to_send = truncate_amount(token.sending_precision, decimals, amount)?; + + if amount_to_send + .checked_add( + deps.querier + .query_supply(token.coreum_denom.clone())? + .amount, + )? + .gt(&token.max_holding_amount) + { + return Err(ContractError::MaximumBridgedAmountReached {}); + } - if threshold_reached { - let mint_msg = CosmosMsg::from(CoreumMsg::AssetFT(assetft::Msg::Mint { - coin: coin(amount_to_send.u128(), token.coreum_denom), - recipient: Some(recipient.to_string()), - })); + if threshold_reached { + let mint_msg = CosmosMsg::from(CoreumMsg::AssetFT(assetft::Msg::Mint { + coin: coin(amount_to_send.u128(), token.coreum_denom), + recipient: Some(recipient.to_string()), + })); + + response = response.add_message(mint_msg) + } + } else { + // We check that the token is registered and enabled + let token = match COREUM_TOKENS + .idx + .xrpl_currency + .item(deps.storage, currency.to_owned())? + .map(|(_, ct)| ct) + { + Some(token) => { + if token.state.ne(&TokenState::Enabled) { + return Err(ContractError::CoreumOriginatedTokenDisabled {}); + } + token + } + // In theory this will never happen because any token issued from the multisig address is a token that was bridged from Coreum so it will be registered. + // This could theoretically happen if the multisig address on XRPL issued a token on its own and then tried to bridge it + None => return Err(ContractError::TokenNotRegistered {}), + }; + + if threshold_reached { + let amount_to_send = + truncate_amount(token.sending_precision, token.decimals, amount)?; - response = response.add_message(mint_msg) + // TODO(keyleu): for now we are SENDING back the entire amount but when fees are implemented this will not happen and part of the amount will be sent and funds will be collected + let send_msg = BankMsg::Send { + to_address: recipient.to_string(), + amount: coins(amount_to_send.u128(), token.denom), + }; + response = response.add_message(send_msg); + } } response = response @@ -679,6 +720,9 @@ pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { QueryMsg::CoreumTokens { offset, limit } => { to_json_binary(&query_coreum_tokens(deps, offset, limit)?) } + QueryMsg::CoreumTokenByXRPLCurrency { xrpl_currency } => { + to_json_binary(&query_coreum_token_by_xrpl_currency(deps, xrpl_currency)?) + } QueryMsg::Ownership {} => to_json_binary(&get_ownership(deps.storage)?), QueryMsg::PendingOperations {} => to_json_binary(&query_pending_operations(deps)?), QueryMsg::AvailableTickets {} => to_json_binary(&query_available_tickets(deps)?), @@ -719,13 +763,26 @@ fn query_coreum_tokens( .range(deps.storage, None, None, Order::Ascending) .skip(offset as usize) .take(limit as usize) - .filter_map(|v| v.ok()) - .map(|(_, v)| v) + .filter_map(|r| r.ok()) + .map(|(_, ct)| ct) .collect(); Ok(CoreumTokensResponse { tokens }) } +fn query_coreum_token_by_xrpl_currency( + deps: Deps, + xrpl_currency: String, +) -> StdResult { + let token = COREUM_TOKENS + .idx + .xrpl_currency + .item(deps.storage, xrpl_currency)? + .map(|(_, ct)| ct); + + Ok(CoreumTokenResponse { token }) +} + fn query_pending_operations(deps: Deps) -> StdResult { let operations: Vec = PENDING_OPERATIONS .range(deps.storage, None, None, Order::Ascending) diff --git a/contract/src/msg.rs b/contract/src/msg.rs index 5de4f220..4505dac1 100644 --- a/contract/src/msg.rs +++ b/contract/src/msg.rs @@ -71,6 +71,9 @@ pub enum QueryMsg { offset: Option, limit: Option, }, + #[returns(CoreumTokenResponse)] + #[serde(rename = "coreum_token_by_xrpl_currency")] + CoreumTokenByXRPLCurrency { xrpl_currency: String }, #[returns(PendingOperationsResponse)] PendingOperations {}, #[returns(AvailableTicketsResponse)] @@ -87,6 +90,11 @@ pub struct CoreumTokensResponse { pub tokens: Vec, } +#[cw_serde] +pub struct CoreumTokenResponse { + pub token: Option, +} + #[cw_serde] pub struct PendingOperationsResponse { pub operations: Vec, diff --git a/contract/src/state.rs b/contract/src/state.rs index eda809bc..9c505b9c 100644 --- a/contract/src/state.rs +++ b/contract/src/state.rs @@ -74,8 +74,6 @@ pub struct CoreumToken { } pub const CONFIG: Item = Item::new(TopKey::Config.as_str()); -// Tokens registered from Coreum side. These tokens are coreum originated tokens that are registered to be bridged - key is denom on Coreum chain -pub const COREUM_TOKENS: Map = Map::new(TopKey::CoreumTokens.as_str()); // Tokens registered from XRPL side. These tokens are XRPL originated tokens - primary key is issuer+currency on XRPL // XRPLTokens will have coreum_denom as a secondary index so that we can get the XRPLToken corresponding to a coreum_denom pub struct XRPLTokensIndexes<'a> { @@ -98,9 +96,29 @@ pub const XRPL_TOKENS: IndexedMap = Indexe ), }, ); -// XRPL-Currencies used -pub const USED_XRPL_CURRENCIES_FOR_COREUM_TOKENS: Map = - Map::new(TopKey::UsedXRPLCurrenciesForCoreumTokens.as_str()); +// Tokens registered from Coreum side. These tokens are coreum originated tokens that are registered to be bridged - key is denom on Coreum chain +// CoreumTokens will have xrpl_currency as a secondary index so that we can get the CoreumToken corresponding to a xrpl_currency +pub struct CoreumTokensIndexes<'a> { + pub xrpl_currency: UniqueIndex<'a, String, CoreumToken, String>, +} + +impl<'a> IndexList for CoreumTokensIndexes<'a> { + fn get_indexes(&'_ self) -> Box> + '_> { + let v: Vec<&dyn Index> = vec![&self.xrpl_currency]; + Box::new(v.into_iter()) + } +} + +pub const COREUM_TOKENS: IndexedMap = IndexedMap::new( + TopKey::CoreumTokens.as_str(), + CoreumTokensIndexes { + xrpl_currency: UniqueIndex::new( + |coreum_token| coreum_token.xrpl_currency.clone(), + "coreum_token__xrpl_currency", + ), + }, +); + // Evidences, when enough evidences are collected, the transaction hashes are stored in EXECUTED_EVIDENCE_OPERATIONS. pub const TX_EVIDENCES: Map = Map::new(TopKey::TxEvidences.as_str()); // This will contain the transaction hashes of operations that have been executed (reached threshold) so that when the same hash is sent again they aren't executed again diff --git a/contract/src/tests.rs b/contract/src/tests.rs index b64b0888..22679204 100644 --- a/contract/src/tests.rs +++ b/contract/src/tests.rs @@ -15,11 +15,11 @@ mod tests { error::ContractError, evidence::{Evidence, OperationResult, TransactionResult}, msg::{ - AvailableTicketsResponse, CoreumTokensResponse, ExecuteMsg, InstantiateMsg, - PendingOperationsResponse, QueryMsg, XRPLTokensResponse, + AvailableTicketsResponse, CoreumTokenResponse, CoreumTokensResponse, ExecuteMsg, + InstantiateMsg, PendingOperationsResponse, QueryMsg, XRPLTokensResponse, }, operation::{Operation, OperationType}, - relayer::{Relayer, validate_xrpl_address}, + relayer::{validate_xrpl_address, Relayer}, signatures::Signature, state::{Config, TokenState, XRPLToken as QueriedXRPLToken}, }; @@ -692,6 +692,21 @@ mod tests { .unwrap(); assert_eq!(query_coreum_tokens.tokens.len(), 1); assert_eq!(query_coreum_tokens.tokens[0].denom, test_tokens[1].denom); + + // Query a token using the xrpl currency + let query_coreum_token_by_xrpl_currency = wasm + .query::( + &contract_addr, + &QueryMsg::CoreumTokenByXRPLCurrency { + xrpl_currency: query_coreum_tokens.tokens[0].xrpl_currency.to_owned(), + }, + ) + .unwrap(); + + assert_eq!( + query_coreum_token_by_xrpl_currency.token.unwrap(), + query_coreum_tokens.tokens[0] + ); } #[test] @@ -1006,7 +1021,7 @@ mod tests { } #[test] - fn send_from_xrpl_to_coreum() { + fn send_xrpl_originated_tokens_from_xrpl_to_coreum() { let app = CoreumTestApp::new(); let accounts_number = 4; let accounts = app @@ -1530,6 +1545,300 @@ mod tests { )); } + #[test] + fn send_coreum_originated_tokens_from_xrpl_to_coreum() { + let app = CoreumTestApp::new(); + let accounts_number = 3; + let accounts = app + .init_accounts(&coins(100_000_000_000, FEE_DENOM), accounts_number) + .unwrap(); + + let signer = accounts.get(0).unwrap(); + let sender = accounts.get(1).unwrap(); + let relayer_account = accounts.get(2).unwrap(); + let relayer = Relayer { + coreum_address: Addr::unchecked(relayer_account.address()), + xrpl_address: generate_xrpl_address(), + xrpl_pub_key: generate_xrpl_pub_key(), + }; + + let xrpl_receiver_address = generate_xrpl_address(); + let bridge_xrpl_address = generate_xrpl_address(); + + let wasm = Wasm::new(&app); + let asset_ft = AssetFT::new(&app); + + let contract_addr = store_and_instantiate( + &wasm, + signer, + Addr::unchecked(signer.address()), + vec![relayer.clone()], + 1, + 4, + Uint128::new(TRUST_SET_LIMIT_AMOUNT), + query_issue_fee(&asset_ft), + bridge_xrpl_address.to_owned(), + ); + + // Add enough tickets for all our test operations + + wasm.execute::( + &contract_addr, + &ExecuteMsg::RecoverTickets { + account_sequence: 1, + number_of_tickets: Some(5), + }, + &vec![], + &signer, + ) + .unwrap(); + + wasm.execute::( + &contract_addr, + &ExecuteMsg::SaveEvidence { + evidence: Evidence::XRPLTransactionResult { + tx_hash: Some(generate_hash()), + account_sequence: Some(1), + ticket_sequence: None, + transaction_result: TransactionResult::Accepted, + operation_result: OperationResult::TicketsAllocation { + tickets: Some(vec![1, 2, 3, 4, 5]), + }, + }, + }, + &vec![], + relayer_account, + ) + .unwrap(); + + // Let's issue a token to the sender and register it. + let asset_ft = AssetFT::new(&app); + let symbol = "TEST".to_string(); + let subunit = "utest".to_string(); + let decimals = 6; + let initial_amount = Uint128::new(100000000); + asset_ft + .issue( + MsgIssue { + issuer: sender.address(), + symbol, + subunit: subunit.to_owned(), + precision: decimals, + initial_amount: initial_amount.to_string(), + description: "description".to_string(), + features: vec![MINTING as i32], + burn_rate: "0".to_string(), + send_commission_rate: "0".to_string(), + uri: "uri".to_string(), + uri_hash: "uri_hash".to_string(), + }, + &sender, + ) + .unwrap(); + + let denom = format!("{}-{}", subunit, sender.address()).to_lowercase(); + + wasm.execute::( + &contract_addr, + &ExecuteMsg::RegisterCoreumToken { + denom: denom.to_owned(), + decimals, + sending_precision: 6, + max_holding_amount: Uint128::new(10000000), + }, + &vec![], + &signer, + ) + .unwrap(); + + let amount_to_send = Uint128::new(1000000); + // Bridge the token to the xrpl receiver address so that we can send it back. + wasm.execute::( + &contract_addr, + &ExecuteMsg::SendToXRPL { + recipient: xrpl_receiver_address.to_owned(), + }, + &coins(amount_to_send.u128(), denom.to_owned()), + &sender, + ) + .unwrap(); + + // Check balance of sender and contract + let request_balance = asset_ft + .query_balance(&QueryBalanceRequest { + account: sender.address(), + denom: denom.clone(), + }) + .unwrap(); + + assert_eq!( + request_balance.balance, + initial_amount + .checked_sub(amount_to_send) + .unwrap() + .to_string() + ); + + let request_balance = asset_ft + .query_balance(&QueryBalanceRequest { + account: contract_addr.to_owned(), + denom: denom.clone(), + }) + .unwrap(); + + assert_eq!(request_balance.balance, amount_to_send.to_string()); + + // Confirm the operation to remove it from pending operations. + let query_pending_operations = wasm + .query::( + &contract_addr, + &QueryMsg::PendingOperations {}, + ) + .unwrap(); + + assert_eq!(query_pending_operations.operations.len(), 1); + + // Send successfull evidence to remove from queue (tokens should be released on XRPL to the receiver) + wasm.execute::( + &contract_addr, + &ExecuteMsg::SaveEvidence { + evidence: Evidence::XRPLTransactionResult { + tx_hash: Some(generate_hash()), + account_sequence: query_pending_operations.operations[0].account_sequence, + ticket_sequence: query_pending_operations.operations[0].ticket_sequence, + transaction_result: TransactionResult::Accepted, + operation_result: OperationResult::CoreumToXRPLTransfer {}, + }, + }, + &vec![], + relayer_account, + ) + .unwrap(); + + let query_pending_operations = wasm + .query::( + &contract_addr, + &QueryMsg::PendingOperations {}, + ) + .unwrap(); + + assert_eq!(query_pending_operations.operations.len(), 0); + + // Get the xrpl bridge address and xrpl currency of the token so that we can send it back. + let query_coreum_tokens = wasm + .query::( + &contract_addr, + &QueryMsg::CoreumTokens { + offset: None, + limit: None, + }, + ) + .unwrap(); + + let coreum_originated_token = query_coreum_tokens + .tokens + .iter() + .find(|t| t.denom == denom) + .unwrap(); + + // Test sending the amount back from XRPL to Coreum + let amount_to_send_back = Uint128::new(1); + + // If we send the token with a different issuer (not multisig address) it should fail + let transfer_error = wasm + .execute::( + &contract_addr, + &ExecuteMsg::SaveEvidence { + evidence: Evidence::XRPLToCoreumTransfer { + tx_hash: generate_hash(), + issuer: generate_xrpl_address(), + currency: coreum_originated_token.xrpl_currency.to_owned(), + amount: amount_to_send_back.clone(), + recipient: Addr::unchecked(sender.address()), + }, + }, + &[], + relayer_account, + ) + .unwrap_err(); + + assert!(transfer_error + .to_string() + .contains(ContractError::TokenNotRegistered {}.to_string().as_str())); + + // If we send the token with a different currency (one that is not the one in the registered token list) it should fail + let transfer_error = wasm + .execute::( + &contract_addr, + &ExecuteMsg::SaveEvidence { + evidence: Evidence::XRPLToCoreumTransfer { + tx_hash: generate_hash(), + issuer: bridge_xrpl_address.to_owned(), + currency: "invalid_currency".to_string(), + amount: amount_to_send_back.clone(), + recipient: Addr::unchecked(sender.address()), + }, + }, + &[], + relayer_account, + ) + .unwrap_err(); + + assert!(transfer_error + .to_string() + .contains(ContractError::TokenNotRegistered {}.to_string().as_str())); + + // Sending the right evidence should move tokens from the contract to the sender's account + wasm.execute::( + &contract_addr, + &ExecuteMsg::SaveEvidence { + evidence: Evidence::XRPLToCoreumTransfer { + tx_hash: generate_hash(), + issuer: bridge_xrpl_address.to_owned(), + currency: coreum_originated_token.xrpl_currency.to_owned(), + amount: amount_to_send_back.clone(), + recipient: Addr::unchecked(sender.address()), + }, + }, + &[], + relayer_account, + ) + .unwrap(); + + // Check balance of sender and contract + let request_balance = asset_ft + .query_balance(&QueryBalanceRequest { + account: sender.address(), + denom: denom.clone(), + }) + .unwrap(); + + assert_eq!( + request_balance.balance, + initial_amount + .checked_sub(amount_to_send) + .unwrap() + .checked_add(amount_to_send_back) + .unwrap() + .to_string() + ); + + let request_balance = asset_ft + .query_balance(&QueryBalanceRequest { + account: contract_addr.to_owned(), + denom: denom.clone(), + }) + .unwrap(); + + assert_eq!( + request_balance.balance, + amount_to_send + .checked_sub(amount_to_send_back) + .unwrap() + .to_string() + ); + } + #[test] fn send_from_coreum_to_xrpl() { let app = CoreumTestApp::new(); @@ -1540,7 +1849,7 @@ mod tests { let signer = accounts.get(0).unwrap(); let sender = accounts.get(1).unwrap(); - let relayer_account = accounts.get(1).unwrap(); + let relayer_account = accounts.get(2).unwrap(); let relayer = Relayer { coreum_address: Addr::unchecked(relayer_account.address()), xrpl_address: generate_xrpl_address(), @@ -1649,7 +1958,7 @@ mod tests { recipient: xrpl_receiver_address.to_owned(), }, &coins(amount_to_send_and_back.u128(), denom_xrp.to_owned()), - relayer_account, + sender, ) .unwrap(); @@ -1827,7 +2136,7 @@ mod tests { denom_xrpl_origin_token.to_owned(), ), ], - relayer_account, + sender, ) .unwrap_err(); @@ -1848,7 +2157,7 @@ mod tests { amount_to_send_and_back.u128(), denom_xrpl_origin_token.to_owned(), ), - relayer_account, + sender, ) .unwrap_err(); @@ -1869,7 +2178,7 @@ mod tests { amount_to_send_and_back.u128(), denom_xrpl_origin_token.to_owned(), ), - relayer_account, + sender, ) .unwrap(); @@ -1949,7 +2258,7 @@ mod tests { asset_ft .issue( MsgIssue { - issuer: signer.address(), + issuer: sender.address(), symbol, subunit: subunit.to_owned(), precision: decimals, @@ -1961,11 +2270,11 @@ mod tests { uri: "uri".to_string(), uri_hash: "uri_hash".to_string(), }, - &signer, + &sender, ) .unwrap(); - let denom = format!("{}-{}", subunit, signer.address()).to_lowercase(); + let denom = format!("{}-{}", subunit, sender.address()).to_lowercase(); wasm.execute::( &contract_addr, @@ -1981,14 +2290,14 @@ mod tests { .unwrap(); let amount_to_send = Uint128::new(1000000); - // Bridge the token to the sender address and check pending operations + // Bridge the token to the xrpl receiver address and check pending operations wasm.execute::( &contract_addr, &ExecuteMsg::SendToXRPL { recipient: xrpl_receiver_address.to_owned(), }, &coins(amount_to_send.u128(), denom.to_owned()), - &signer, + &sender, ) .unwrap(); @@ -4053,7 +4362,7 @@ mod tests { let invalid_addresses = vec![ "zDTXLQ7ZKZVKz33zJbHjgVShjsBnqMBhmN".to_string(), // Invalid prefix - "rf1BiGeXwwQoi8Z2u".to_string(), // Too short + "rf1BiGeXwwQoi8Z2u".to_string(), // Too short "rU6K7V3Po4snVhBBaU29sesqs2qTQJWDw1hBBaU29".to_string(), // Too long "rU6K7V3Po4snVhBBa029sesqs2qTQJWDw1".to_string(), // Contains invalid character 0 "rU6K7V3Po4snVhBBaU29sesql2qTQJWDw1".to_string(), // Contains invalid character l