diff --git a/app/wasmtesting/common_test.go b/app/wasmtesting/common_test.go index 6cf5bbb..b316810 100644 --- a/app/wasmtesting/common_test.go +++ b/app/wasmtesting/common_test.go @@ -46,6 +46,7 @@ import ( wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper" wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types" + ibctransfer "github.com/cosmos/ibc-go/v10/modules/apps/transfer" "github.com/skip-mev/connect/v2/x/oracle" oraclekeeper "github.com/skip-mev/connect/v2/x/oracle/keeper" oracletypes "github.com/skip-mev/connect/v2/x/oracle/types" @@ -55,6 +56,7 @@ var ModuleBasics = module.NewBasicManager( auth.AppModuleBasic{}, bank.AppModuleBasic{}, wasm.AppModuleBasic{}, + ibctransfer.AppModuleBasic{}, oracle.AppModuleBasic{}, ) @@ -169,6 +171,7 @@ type TestKeepers struct { BankKeeper bankkeeper.Keeper WasmKeeper wasmkeeper.Keeper OracleKeeper oraclekeeper.Keeper + MsgRouter *baseapp.MsgServiceRouter EncodingConfig EncodingConfig Faucet *TestFaucet @@ -327,6 +330,7 @@ func _createTestInput( WasmKeeper: wasmKeeper, BankKeeper: bankKeeper, OracleKeeper: oracleKeeper, + MsgRouter: msgRouter, EncodingConfig: encodingConfig, Faucet: faucet, MultiStore: ms, diff --git a/app/wasmtesting/stargate-ibc-transfer/.cargo/config.toml b/app/wasmtesting/stargate-ibc-transfer/.cargo/config.toml new file mode 100644 index 0000000..f31de6c --- /dev/null +++ b/app/wasmtesting/stargate-ibc-transfer/.cargo/config.toml @@ -0,0 +1,3 @@ +[alias] +wasm = "build --release --target wasm32-unknown-unknown" +unit-test = "test --lib" diff --git a/app/wasmtesting/stargate-ibc-transfer/.gitignore b/app/wasmtesting/stargate-ibc-transfer/.gitignore new file mode 100644 index 0000000..4de6211 --- /dev/null +++ b/app/wasmtesting/stargate-ibc-transfer/.gitignore @@ -0,0 +1,13 @@ +# macOS +.DS_Store + +# Text file backups +**/*.rs.bk + +# Build results +target/ + +# IDEs +.vscode/ +.idea/ +*.iml diff --git a/app/wasmtesting/stargate-ibc-transfer/Cargo.lock b/app/wasmtesting/stargate-ibc-transfer/Cargo.lock new file mode 100644 index 0000000..508e95d --- /dev/null +++ b/app/wasmtesting/stargate-ibc-transfer/Cargo.lock @@ -0,0 +1,701 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom", + "once_cell", + "version_check", +] + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64ct" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" + +[[package]] +name = "bech32" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bnum" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56953345e39537a3e18bdaeba4cb0c58a78c1f61f361dc0fa7c5c7340ae87c5f" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "cosmwasm-crypto" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7a339f6b59ff7ad4ae05a70512a4f3c19bf8fcc845d46bfef90f4ec0810f72c" +dependencies = [ + "digest 0.10.7", + "ed25519-zebra", + "k256", + "rand_core 0.6.4", + "thiserror", +] + +[[package]] +name = "cosmwasm-derive" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d3bfea6af94a83880fb05478135ed0c256d9a2fcde58c595a10d64dcb9c925d" +dependencies = [ + "syn 1.0.109", +] + +[[package]] +name = "cosmwasm-schema" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "101d0739564bd34cba9b84bf73665f0822487ae3b29b2dd59930608ed3aafd43" +dependencies = [ + "cosmwasm-schema-derive", + "schemars", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "cosmwasm-schema-derive" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf4be75f60158478da2c5d319ed59295bca1687ad50c18215a0485aa91a995ea" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "cosmwasm-std" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded932165de44cd0717979c34fc3b84d8e8066b8dde4f5bd78f96a643b090f90" +dependencies = [ + "base64", + "bech32", + "bnum", + "cosmwasm-crypto", + "cosmwasm-derive", + "derivative", + "forward_ref", + "hex", + "schemars", + "serde", + "serde-json-wasm", + "sha2 0.10.9", + "static_assertions", + "thiserror", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "curve25519-dalek" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.5.1", + "subtle", + "zeroize", +] + +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer 0.10.4", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest 0.10.7", + "elliptic-curve", + "rfc6979", + "signature", + "spki", +] + +[[package]] +name = "ed25519-zebra" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c24f403d068ad0b359e577a77f92392118be3f3c927538f2bb544a5ecd828c6" +dependencies = [ + "curve25519-dalek", + "hashbrown", + "hex", + "rand_core 0.6.4", + "serde", + "sha2 0.9.9", + "zeroize", +] + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest 0.10.7", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core 0.6.4", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "ff" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "forward_ref" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8cbd1169bd7b4a0a20d92b9af7a7e0422888bd38a6f5ec29c1fd8c1558a272e" + +[[package]] +name = "generic-array" +version = "0.14.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash", +] + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "k256" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "once_cell", + "sha2 0.10.9", + "signature", +] + +[[package]] +name = "libc" +version = "0.2.186" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" + +[[package]] +name = "memchr" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + +[[package]] +name = "schemars" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" +dependencies = [ + "dyn-clone", + "schemars_derive", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 2.0.117", +] + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde-json-wasm" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f05da0d153dd4595bdffd5099dc0e9ce425b205ee648eb93437ff7302af8c9a5" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serde_derive_internals" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serde_json" +version = "1.0.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest 0.10.7", + "rand_core 0.6.4", +] + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "stargate-ibc-transfer" +version = "0.1.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "typenum" +version = "1.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de" + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" diff --git a/app/wasmtesting/stargate-ibc-transfer/Cargo.toml b/app/wasmtesting/stargate-ibc-transfer/Cargo.toml new file mode 100644 index 0000000..f39d3c2 --- /dev/null +++ b/app/wasmtesting/stargate-ibc-transfer/Cargo.toml @@ -0,0 +1,25 @@ +[package] +name = "stargate-ibc-transfer" +version = "0.1.0" +edition = "2021" + +[lib] +crate-type = ["cdylib", "rlib"] + +[features] +library = [] + +[profile.release] +opt-level = 3 +debug = false +rpath = false +lto = true +debug-assertions = false +codegen-units = 1 +panic = "abort" +incremental = false +overflow-checks = true + +[dependencies] +cosmwasm-schema = "=2.0.4" +cosmwasm-std = { version = "=2.0.4", features = ["stargate"] } diff --git a/app/wasmtesting/stargate-ibc-transfer/artifacts/checksums.txt b/app/wasmtesting/stargate-ibc-transfer/artifacts/checksums.txt new file mode 100644 index 0000000..440e8e7 --- /dev/null +++ b/app/wasmtesting/stargate-ibc-transfer/artifacts/checksums.txt @@ -0,0 +1 @@ +fdb932b1c7af835b6c4a0e0da09f1c0cc25d5d595e5ef22b4d9db40ccb51ba0d stargate_ibc_transfer.wasm diff --git a/app/wasmtesting/stargate-ibc-transfer/artifacts/stargate_ibc_transfer.wasm b/app/wasmtesting/stargate-ibc-transfer/artifacts/stargate_ibc_transfer.wasm new file mode 100755 index 0000000..5f2d8a7 Binary files /dev/null and b/app/wasmtesting/stargate-ibc-transfer/artifacts/stargate_ibc_transfer.wasm differ diff --git a/app/wasmtesting/stargate-ibc-transfer/src/lib.rs b/app/wasmtesting/stargate-ibc-transfer/src/lib.rs new file mode 100644 index 0000000..c12024a --- /dev/null +++ b/app/wasmtesting/stargate-ibc-transfer/src/lib.rs @@ -0,0 +1,73 @@ +mod msg; +mod proto; + +use cosmwasm_std::{ + entry_point, to_json_binary, Binary, CosmosMsg, Deps, DepsMut, Empty, Env, MessageInfo, + Response, StdResult, +}; + +use crate::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; +use crate::proto::{encode_msg_transfer, MsgTransfer, MSG_TRANSFER_TYPE_URL}; + +#[cfg_attr(not(feature = "library"), entry_point)] +pub fn instantiate( + _deps: DepsMut, + _env: Env, + _info: MessageInfo, + _msg: InstantiateMsg, +) -> StdResult { + Ok(Response::new().add_attribute("method", "instantiate")) +} + +#[cfg_attr(not(feature = "library"), entry_point)] +pub fn execute( + _deps: DepsMut, + env: Env, + _info: MessageInfo, + msg: ExecuteMsg, +) -> StdResult { + match msg { + ExecuteMsg::IbcTransfer { + source_channel, + receiver, + denom, + amount, + timeout_timestamp, + memo, + } => { + let sender = env.contract.address.to_string(); + let amount = amount.to_string(); + let value = encode_msg_transfer(MsgTransfer { + source_port: "transfer", + source_channel: &source_channel, + denom: &denom, + amount: &amount, + sender: &sender, + receiver: &receiver, + timeout_timestamp, + memo: memo.as_deref(), + }); + + #[allow(deprecated)] + let msg = CosmosMsg::::Stargate { + type_url: MSG_TRANSFER_TYPE_URL.to_string(), + value: Binary::from(value), + }; + + Ok(Response::new() + .add_message(msg) + .add_attribute("action", "ibc_transfer") + .add_attribute("source_port", "transfer") + .add_attribute("source_channel", source_channel) + .add_attribute("sender", sender) + .add_attribute("receiver", receiver) + .add_attribute("denom", denom) + .add_attribute("amount", amount)) + } + } +} + +#[cfg_attr(not(feature = "library"), entry_point)] +pub fn query(_deps: Deps, _env: Env, _msg: QueryMsg) -> StdResult { + to_json_binary(&()) +} diff --git a/app/wasmtesting/stargate-ibc-transfer/src/msg.rs b/app/wasmtesting/stargate-ibc-transfer/src/msg.rs new file mode 100644 index 0000000..c9220b5 --- /dev/null +++ b/app/wasmtesting/stargate-ibc-transfer/src/msg.rs @@ -0,0 +1,21 @@ +use cosmwasm_schema::cw_serde; +use cosmwasm_std::Uint128; + +#[cw_serde] +pub struct InstantiateMsg {} + +#[cw_serde] +pub enum ExecuteMsg { + IbcTransfer { + source_channel: String, + receiver: String, + denom: String, + amount: Uint128, + /// IBC timeout timestamp in nanoseconds. + timeout_timestamp: u64, + memo: Option, + }, +} + +#[cw_serde] +pub struct QueryMsg {} diff --git a/app/wasmtesting/stargate-ibc-transfer/src/proto.rs b/app/wasmtesting/stargate-ibc-transfer/src/proto.rs new file mode 100644 index 0000000..b6d40b3 --- /dev/null +++ b/app/wasmtesting/stargate-ibc-transfer/src/proto.rs @@ -0,0 +1,100 @@ +pub const MSG_TRANSFER_TYPE_URL: &str = "/ibc.applications.transfer.v1.MsgTransfer"; + +pub struct MsgTransfer<'a> { + pub source_port: &'a str, + pub source_channel: &'a str, + pub denom: &'a str, + pub amount: &'a str, + pub sender: &'a str, + pub receiver: &'a str, + pub timeout_timestamp: u64, + pub memo: Option<&'a str>, +} + +pub fn encode_msg_transfer(msg: MsgTransfer) -> Vec { + let mut out = Vec::new(); + + write_string(&mut out, 1, msg.source_port); + write_string(&mut out, 2, msg.source_channel); + write_message(&mut out, 3, encode_coin(msg.denom, msg.amount)); + write_string(&mut out, 4, msg.sender); + write_string(&mut out, 5, msg.receiver); + + if msg.timeout_timestamp != 0 { + write_uint64(&mut out, 7, msg.timeout_timestamp); + } + + if let Some(memo) = msg.memo { + if !memo.is_empty() { + write_string(&mut out, 8, memo); + } + } + + out +} + +fn encode_coin(denom: &str, amount: &str) -> Vec { + let mut out = Vec::new(); + write_string(&mut out, 1, denom); + write_string(&mut out, 2, amount); + out +} + +fn write_string(out: &mut Vec, field_number: u32, value: &str) { + write_key(out, field_number, 2); + write_varint(out, value.len() as u64); + out.extend_from_slice(value.as_bytes()); +} + +fn write_message(out: &mut Vec, field_number: u32, value: Vec) { + write_key(out, field_number, 2); + write_varint(out, value.len() as u64); + out.extend_from_slice(&value); +} + +fn write_uint64(out: &mut Vec, field_number: u32, value: u64) { + write_key(out, field_number, 0); + write_varint(out, value); +} + +fn write_key(out: &mut Vec, field_number: u32, wire_type: u8) { + write_varint(out, ((field_number as u64) << 3) | wire_type as u64); +} + +fn write_varint(out: &mut Vec, mut value: u64) { + while value >= 0x80 { + out.push((value as u8) | 0x80); + value >>= 7; + } + out.push(value as u8); +} + +#[cfg(test)] +mod tests { + use super::{encode_msg_transfer, MsgTransfer}; + + #[test] + fn encodes_ibc_transfer_msg() { + let encoded = encode_msg_transfer(MsgTransfer { + source_port: "transfer", + source_channel: "channel-0", + denom: "uinit", + amount: "123", + sender: "init1sender", + receiver: "cosmos1receiver", + timeout_timestamp: 1_700_000_000_000_000_000, + memo: Some("memo"), + }); + + assert_eq!( + encoded, + vec![ + 10, 8, 116, 114, 97, 110, 115, 102, 101, 114, 18, 9, 99, 104, 97, 110, 110, 101, + 108, 45, 48, 26, 12, 10, 5, 117, 105, 110, 105, 116, 18, 3, 49, 50, 51, 34, 11, + 105, 110, 105, 116, 49, 115, 101, 110, 100, 101, 114, 42, 15, 99, 111, 115, 109, + 111, 115, 49, 114, 101, 99, 101, 105, 118, 101, 114, 56, 128, 128, 168, 177, 227, + 159, 231, 203, 23, 66, 4, 109, 101, 109, 111, + ] + ); + } +} diff --git a/app/wasmtesting/stargate_test.go b/app/wasmtesting/stargate_test.go index 832439b..12ffc3e 100644 --- a/app/wasmtesting/stargate_test.go +++ b/app/wasmtesting/stargate_test.go @@ -1,6 +1,7 @@ package wasm_hooks_test import ( + "context" "os" "testing" @@ -8,6 +9,7 @@ import ( wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types" sdk "github.com/cosmos/cosmos-sdk/types" + transfertypes "github.com/cosmos/ibc-go/v10/modules/apps/transfer/types" "github.com/stretchr/testify/require" @@ -52,3 +54,79 @@ func Test_StargateQuery(t *testing.T) { require.NoError(t, err) require.Equal(t, "{\"currency_pairs\":[{\"Base\":\"BITCOIN\",\"Quote\":\"USD\"}]}", string(res)) } + +func Test_StargateIBCTransfer(t *testing.T) { + ctx, input := createDefaultTestInput(t) + _, _, addr := keyPubAddr() + + var captured *transfertypes.MsgTransfer + transfertypes.RegisterMsgServer(input.MsgRouter, &captureTransferMsgServer{ + captured: &captured, + }) + + code, err := os.ReadFile("./stargate-ibc-transfer/artifacts/stargate_ibc_transfer.wasm") + require.NoError(t, err) + + wasmMsgServer := wasmkeeper.NewMsgServerImpl(&input.WasmKeeper) + storeRes, err := wasmMsgServer.StoreCode(ctx, &wasmtypes.MsgStoreCode{ + Sender: addr.String(), + WASMByteCode: code, + }) + require.NoError(t, err) + + instantiateRes, err := wasmMsgServer.InstantiateContract(ctx, &wasmtypes.MsgInstantiateContract{ + Sender: addr.String(), + Admin: addr.String(), + CodeID: storeRes.CodeID, + Label: "stargate-ibc-transfer", + Msg: []byte("{}"), + Funds: nil, + }) + require.NoError(t, err) + + contractAddrBech32 := instantiateRes.Address + contractAddr, err := sdk.AccAddressFromBech32(contractAddrBech32) + require.NoError(t, err) + + input.Faucet.Mint(ctx, addr, sdk.NewInt64Coin("uinit", 123)) + + executeMsg := []byte(`{ + "ibc_transfer": { + "source_channel": "channel-0", + "receiver": "cosmos1receiver", + "denom": "uinit", + "amount": "123", + "timeout_timestamp": 1700000000000000000, + "memo": "memo" + } + }`) + + _, err = wasmMsgServer.ExecuteContract(ctx, &wasmtypes.MsgExecuteContract{ + Sender: addr.String(), + Contract: contractAddrBech32, + Msg: executeMsg, + Funds: sdk.NewCoins(sdk.NewInt64Coin("uinit", 123)), + }) + require.NoError(t, err) + + require.NotNil(t, captured) + require.Equal(t, "transfer", captured.SourcePort) + require.Equal(t, "channel-0", captured.SourceChannel) + require.Equal(t, sdk.NewInt64Coin("uinit", 123), captured.Token) + require.Equal(t, contractAddr.String(), captured.Sender) + require.Equal(t, "cosmos1receiver", captured.Receiver) + require.True(t, captured.TimeoutHeight.IsZero()) + require.Equal(t, uint64(1700000000000000000), captured.TimeoutTimestamp) + require.Equal(t, "memo", captured.Memo) +} + +type captureTransferMsgServer struct { + transfertypes.UnimplementedMsgServer + + captured **transfertypes.MsgTransfer +} + +func (m captureTransferMsgServer) Transfer(_ context.Context, msg *transfertypes.MsgTransfer) (*transfertypes.MsgTransferResponse, error) { + *m.captured = msg + return &transfertypes.MsgTransferResponse{Sequence: 1}, nil +}