From 35f08d08ac9794221de0b08c3912a74e0a9843ff Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Fri, 15 May 2020 20:28:08 +0200 Subject: [PATCH 1/6] Update erc20 to 0.8 --- erc20/Cargo.lock | 270 +++++++++++++++---------------------- erc20/Cargo.toml | 15 +-- erc20/src/contract.rs | 149 ++++++++++---------- erc20/src/lib.rs | 31 ++--- erc20/src/msg.rs | 2 +- erc20/src/tests.rs | 119 ++++++++-------- erc20/tests/integration.rs | 146 +++++++++++--------- 7 files changed, 359 insertions(+), 373 deletions(-) diff --git a/erc20/Cargo.lock b/erc20/Cargo.lock index 6d4995ed..b7379b17 100644 --- a/erc20/Cargo.lock +++ b/erc20/Cargo.lock @@ -79,9 +79,9 @@ checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" [[package]] name = "blake3" -version = "0.1.5" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46080006c1505f12f64dd2a09264b343381ed3190fa02c8005d5d662ac571c63" +checksum = "68df31bdf2bbb567e5adf8f21ac125dc0e897b1381e7b841f181521f06fc3134" dependencies = [ "arrayref", "arrayvec", @@ -146,15 +146,6 @@ dependencies = [ "bitflags", ] -[[package]] -name = "cmake" -version = "0.1.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fb25b677f8bf1eb325017cb6bb8452f87969db0fedb4f757b297bee78a7c62" -dependencies = [ - "cc", -] - [[package]] name = "const-random" version = "0.1.8" @@ -182,10 +173,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" [[package]] -name = "cosmwasm" -version = "0.7.2" +name = "cosmwasm-std" +version = "0.8.0-alpha2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8709ce7dabeac33f4132cab84fda3796ac484d82c91ff5ccfb4ed61227af4bb5" +checksum = "c5d326cb2c18d14067f42333d214ff4bca6cff8679b406815e7cd1730f79c052" dependencies = [ "base64", "schemars", @@ -194,20 +185,30 @@ dependencies = [ "snafu", ] +[[package]] +name = "cosmwasm-storage" +version = "0.8.0-alpha2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0da5ae8f0fc264d228807e74373102b6e3c835ebfcb9a963ea2232d2c5ca5566" +dependencies = [ + "cosmwasm-std", + "serde", +] + [[package]] name = "cosmwasm-vm" -version = "0.7.2" +version = "0.8.0-alpha2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c435f90e1d3308bd1ea7f77de7688180e692ff4d1fde50168f3049bc4abc5c73" +checksum = "5f033bfd6112962eff6a5d66783ba1fd156f9add1fb51173c6e089861d18e8ca" dependencies = [ - "cosmwasm", - "hex 0.3.2", + "cosmwasm-std", + "hex", "lru", "memmap", "parity-wasm", "schemars", "serde", - "serde-json-wasm", + "serde_json", "sha2", "snafu", "wasmer-clif-backend", @@ -218,35 +219,36 @@ dependencies = [ [[package]] name = "cranelift-bforest" -version = "0.52.0" +version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56aa72ef104c5d634f2f9e84ef2c47e116c1d185fae13f196b97ca84b0a514f1" +checksum = "45a9c21f8042b9857bda93f6c1910b9f9f24100187a3d3d52f214a34e3dc5818" dependencies = [ "cranelift-entity", ] [[package]] name = "cranelift-codegen" -version = "0.52.0" +version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "460b9d20793543599308d22f5a1172c196e63a780c4e9aacb0b3f4f63d63ffe1" +checksum = "7853f77a6e4a33c67a69c40f5e1bb982bd2dc5c4a22e17e67b65bbccf9b33b2e" dependencies = [ "byteorder", "cranelift-bforest", "cranelift-codegen-meta", "cranelift-codegen-shared", "cranelift-entity", + "gimli", "log", - "smallvec 1.2.0", + "smallvec", "target-lexicon", "thiserror", ] [[package]] name = "cranelift-codegen-meta" -version = "0.52.0" +version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc70e4e8ccebd53a4f925147def857c9e9f7fe0fdbef4bb645a420473e012f50" +checksum = "084cd6d5fb0d1da28acd72c199471bfb09acc703ec8f3bf07b1699584272a3b9" dependencies = [ "cranelift-codegen-shared", "cranelift-entity", @@ -254,21 +256,21 @@ dependencies = [ [[package]] name = "cranelift-codegen-shared" -version = "0.52.0" +version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3992000be4d18df0fe332b7c42c120de896e8ec54cd7b6cfa050910a8c9f6e2f" +checksum = "701b599783305a58c25027a4d73f2d6b599b2d8ef3f26677275f480b4d51e05d" [[package]] name = "cranelift-entity" -version = "0.52.0" +version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "722957e05064d97a3157bf0976deed0f3e8ee4f8a4ce167a7c724ca63a4e8bd9" +checksum = "b88e792b28e1ebbc0187b72ba5ba880dad083abe9231a99d19604d10c9e73f38" [[package]] name = "cranelift-native" -version = "0.52.0" +version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21398a0bc6ba389ea86964ac4a495426dd61080f2ddd306184777a8560fe9976" +checksum = "32daf082da21c0c05d93394ff4842c2ab7c4991b1f3186a1d952f8ac660edd0b" dependencies = [ "cranelift-codegen", "raw-cpuid", @@ -336,26 +338,13 @@ dependencies = [ name = "cw-erc20" version = "0.4.0-dev" dependencies = [ - "cosmwasm", + "cosmwasm-std", + "cosmwasm-storage", "cosmwasm-vm", - "cw-storage", - "hex 0.4.0", + "hex", "schemars", "serde", "serde_json", - "snafu", -] - -[[package]] -name = "cw-storage" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ccb825baeb07ef429c0f2e71e4b4d1abacd693b6b7c4b06035f4ef294961aed" -dependencies = [ - "cosmwasm", - "schemars", - "serde", - "snafu", ] [[package]] @@ -383,9 +372,9 @@ dependencies = [ "byteorder", "lazy_static", "owning_ref", - "proc-macro2 1.0.9", - "quote 1.0.3", - "syn 1.0.16", + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -457,6 +446,16 @@ dependencies = [ "wasi", ] +[[package]] +name = "gimli" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81dd6190aad0f05ddbbf3245c54ed14ca4aa6dd32f22312b70d8f168c3e3e633" +dependencies = [ + "byteorder", + "indexmap", +] + [[package]] name = "hashbrown" version = "0.6.3" @@ -476,12 +475,6 @@ dependencies = [ "libc", ] -[[package]] -name = "hex" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "805026a5d0141ffc30abb3be3173848ad46a1b1664fe632428479619a3644d77" - [[package]] name = "hex" version = "0.4.0" @@ -512,9 +505,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.67" +version = "0.2.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb147597cdf94ed43ab7a9038716637d2d1bf2bc571da995d0028dec06bd3018" +checksum = "3baa92041a6fec78c687fa0cc2b3fae8884f743d672cf551bed1d6dac6988d0f" [[package]] name = "lock_api" @@ -642,7 +635,7 @@ dependencies = [ "cloudabi", "libc", "redox_syscall", - "smallvec 1.2.0", + "smallvec", "winapi", ] @@ -652,18 +645,9 @@ version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ecd45702f76d6d3c75a80564378ae228a85f0b59d2f3ed43c91b4a69eb2ebfc5" dependencies = [ - "proc-macro2 1.0.9", - "quote 1.0.3", - "syn 1.0.16", -] - -[[package]] -name = "proc-macro2" -version = "0.4.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" -dependencies = [ - "unicode-xid 0.1.0", + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -672,16 +656,7 @@ version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c09721c6781493a2a492a96b5a5bf19b65917fe6728884e7c44dd0c60ca3435" dependencies = [ - "unicode-xid 0.2.0", -] - -[[package]] -name = "quote" -version = "0.6.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1" -dependencies = [ - "proc-macro2 0.4.30", + "unicode-xid", ] [[package]] @@ -690,7 +665,7 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2bdc6c187c65bca4260c9011c9e3132efe4909da44726bad24cf7572ae338d7f" dependencies = [ - "proc-macro2 1.0.9", + "proc-macro2", ] [[package]] @@ -757,9 +732,9 @@ checksum = "535622e6be132bccd223f4bb2b8ac8d53cda3c7a6394944d3b2b33fb974f9d76" [[package]] name = "schemars" -version = "0.5.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "273d9b56198caf703e271dcc07b28f2e794971750ace6585399d40e2af9f4823" +checksum = "8f66247c220047d6cb96cb80ed8a4cdd74d0a41866dc41c9f8f5451d8e655bc3" dependencies = [ "schemars_derive", "serde", @@ -768,14 +743,14 @@ dependencies = [ [[package]] name = "schemars_derive" -version = "0.5.0" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73ab7f0b9b64633747a68dce4ed6318bbf30e3befe67df7624ad83abb7295c09" +checksum = "52abda4d296438d4ff1cc94008d00fc4eef6824e16de085f76011a3927f495f0" dependencies = [ - "proc-macro2 1.0.9", - "quote 1.0.3", + "proc-macro2", + "quote", "serde_derive_internals", - "syn 1.0.16", + "syn", ] [[package]] @@ -820,9 +795,9 @@ dependencies = [ [[package]] name = "serde-json-wasm" -version = "0.1.3" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77cf509484e297252a195b1338a6d45843fe11ef234259f67649e8729934f443" +checksum = "7294d94d390f1d2334697c065ea591d7074c676e2d20aa6f1df752fced29823f" dependencies = [ "serde", ] @@ -842,9 +817,9 @@ version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8c6faef9a2e64b0064f48570289b4bf8823b7581f1d6157c1b52152306651d0" dependencies = [ - "proc-macro2 1.0.9", - "quote 1.0.3", - "syn 1.0.16", + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -853,9 +828,9 @@ version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1dbab34ca63057a1f15280bdf3c39f2b1eb1b54c17e98360e511637aef7418c6" dependencies = [ - "proc-macro2 1.0.9", - "quote 1.0.3", - "syn 1.0.16", + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -881,15 +856,6 @@ dependencies = [ "opaque-debug", ] -[[package]] -name = "smallvec" -version = "0.6.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7b0758c52e15a8b5e3691eae6cc559f08eee9406e548a4477ba4e67770a82b6" -dependencies = [ - "maybe-uninit", -] - [[package]] name = "smallvec" version = "1.2.0" @@ -898,9 +864,9 @@ checksum = "5c2fb2ec9bcd216a5b0d0ccf31ab17b5ed1d627960edff65bbe95d3ce221cefc" [[package]] name = "snafu" -version = "0.5.0" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d0bf93d08d6a44363b47d737f1f5bebbf5e6a1eaaa3d4c128ceeaca6b718292" +checksum = "c7f5aed652511f5c9123cf2afbe9c244c29db6effa2abb05c866e965c82405ce" dependencies = [ "backtrace", "doc-comment", @@ -909,13 +875,13 @@ dependencies = [ [[package]] name = "snafu-derive" -version = "0.5.0" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624e94bd38e471f67883b467711e7a7ad7dbe284f5fb7e661dc8a671fc5b26a0" +checksum = "ebf8f7d5720104a9df0f7076a8682024e958bba0fe9848767bb44f251f3648e9" dependencies = [ - "proc-macro2 0.4.30", - "quote 0.6.13", - "syn 0.15.44", + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -930,33 +896,22 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" -[[package]] -name = "syn" -version = "0.15.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5" -dependencies = [ - "proc-macro2 0.4.30", - "quote 0.6.13", - "unicode-xid 0.1.0", -] - [[package]] name = "syn" version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "123bd9499cfb380418d509322d7a6d52e5315f064fe4b3ad18a53d6b92c07859" dependencies = [ - "proc-macro2 1.0.9", - "quote 1.0.3", - "unicode-xid 0.2.0", + "proc-macro2", + "quote", + "unicode-xid", ] [[package]] name = "target-lexicon" -version = "0.9.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f4c118a7a38378f305a9e111fcb2f7f838c0be324bfb31a77ea04f7f6e684b4" +checksum = "ab0e7238dcc7b40a7be719a25365910f6807bd864f4cce6b2e6b873658e2b19d" [[package]] name = "thiserror" @@ -973,9 +928,9 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7b51e1fbc44b5a0840be594fbc0f960be09050f2617e61e6aa43bef97cd3ef4" dependencies = [ - "proc-macro2 1.0.9", - "quote 1.0.3", - "syn 1.0.16", + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -984,12 +939,6 @@ version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d2783fe2d6b8c1101136184eb41be8b1ad379e4657050b8aaff0c79ee7575f9" -[[package]] -name = "unicode-xid" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" - [[package]] name = "unicode-xid" version = "0.2.0" @@ -1010,9 +959,9 @@ checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasmer-clif-backend" -version = "0.14.1" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea74b659f78bffcc2db4bd77bf27ce66907ab76728d012346b130fe384e11399" +checksum = "691ea323652d540a10722066dbf049936f4367bb22a96f8992a262a942a8b11b" dependencies = [ "byteorder", "cranelift-codegen", @@ -1036,21 +985,21 @@ dependencies = [ [[package]] name = "wasmer-clif-fork-frontend" -version = "0.52.0" +version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d2e13201ef9ef527ad30a6bf1b08e3e024a40cf2731f393d80375dc88506207" +checksum = "c23f2824f354a00a77e4b040eef6e1d4c595a8a3e9013bad65199cc8dade9a5a" dependencies = [ "cranelift-codegen", "log", - "smallvec 1.2.0", + "smallvec", "target-lexicon", ] [[package]] name = "wasmer-clif-fork-wasm" -version = "0.52.0" +version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8b09302cc4fdc4efc03823cb3e1880b0fde578ba43f27ddd212811cb28c1530" +checksum = "a35e21d3aebc51cc6ebc0e830cf8458a9891c3482fb3c65ad18d408102929ae5" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1062,25 +1011,25 @@ dependencies = [ [[package]] name = "wasmer-middleware-common" -version = "0.14.1" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24a15e6c615e8d3a8c6158acfb8cf4ca02cd8d174232a478c9df422505c2a2b5" +checksum = "fd94068186b25fbe5213442648ffe0fa65ee77389bed020404486fd22056cc87" dependencies = [ "wasmer-runtime-core", ] [[package]] name = "wasmer-runtime-core" -version = "0.14.1" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af29c21b4b17c90035dc5bc6a4dcf018b16acfd745631c905f2a7f04e3e2c74e" +checksum = "45d4253f097502423d8b19d54cb18745f61b984b9dbce32424cba7945cfef367" dependencies = [ "bincode", "blake3", "cc", "digest", "errno", - "hex 0.4.0", + "hex", "indexmap", "lazy_static", "libc", @@ -1092,16 +1041,17 @@ dependencies = [ "serde-bench", "serde_bytes", "serde_derive", - "smallvec 0.6.13", + "smallvec", + "target-lexicon", "wasmparser", "winapi", ] [[package]] name = "wasmer-singlepass-backend" -version = "0.14.1" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8aa85672d65a4a338edb4a4ac6ccf7a6e080aa1930a55eba0cbcd5700e4dad06" +checksum = "37cf84179dd5e92b784f7bc190b237f1184916a6d6d3f87d4dd94ca371a2cc25" dependencies = [ "bincode", "byteorder", @@ -1112,17 +1062,17 @@ dependencies = [ "nix", "serde", "serde_derive", - "smallvec 0.6.13", + "smallvec", "wasmer-runtime-core", ] [[package]] name = "wasmer-win-exception-handler" -version = "0.14.1" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5ede589f678bb6c061e173394506589fd2bae9165d841b218c5d07b3082cd4" +checksum = "cf22ce6dc66d893099aac853d451bf9443fa8f5443f5bf4fc63f3aebd7b592b1" dependencies = [ - "cmake", + "cc", "libc", "wasmer-runtime-core", "winapi", @@ -1130,9 +1080,9 @@ dependencies = [ [[package]] name = "wasmparser" -version = "0.45.2" +version = "0.51.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b4eab1d9971d0803729cba3617b56eb04fcb4bd25361cb63880ed41a42f20d5" +checksum = "aeb1956b19469d1c5e63e459d29e7b5aa0f558d9f16fcef09736f8a265e6c10a" [[package]] name = "winapi" diff --git a/erc20/Cargo.toml b/erc20/Cargo.toml index 223ad2d4..cbdf4b86 100644 --- a/erc20/Cargo.toml +++ b/erc20/Cargo.toml @@ -33,18 +33,17 @@ overflow-checks = true default = ["cranelift"] # for quicker tests, cargo test --lib # for more explicit tests, cargo test --features=backtraces -backtraces = ["cosmwasm/backtraces", "cosmwasm-vm/backtraces"] +backtraces = ["cosmwasm-std/backtraces", "cosmwasm-vm/backtraces"] cranelift = ["cosmwasm-vm/default-cranelift"] singlepass = ["cosmwasm-vm/default-singlepass"] [dependencies] -cosmwasm = { version = "0.7.0" } -cw-storage = "0.2.0" -schemars = "=0.5" -serde = { version = "=1.0.103", default-features = false, features = ["derive"] } -snafu = { version = "=0.5.0", default-features = false, features = ["rust_1_30"] } -hex = "=0.4.0" +cosmwasm-std = "0.8.0-alpha2" +cosmwasm-storage = "0.8.0-alpha2" +schemars = "0.7" +serde = { version = "1.0.103", default-features = false, features = ["derive"] } +hex = "0.4" [dev-dependencies] -cosmwasm-vm = { version = "0.7.0", default-features = false } +cosmwasm-vm = { version = "0.8.0-alpha2", default-features = false } serde_json = "1.0" diff --git a/erc20/src/contract.rs b/erc20/src/contract.rs index 842aed4a..fe668991 100644 --- a/erc20/src/contract.rs +++ b/erc20/src/contract.rs @@ -3,10 +3,11 @@ use serde::{Deserialize, Serialize}; use std::convert::TryInto; use crate::msg::{AllowanceResponse, BalanceResponse, HandleMsg, InitMsg, QueryMsg}; -use cosmwasm::errors::{contract_err, dyn_contract_err, Result}; -use cosmwasm::traits::{Api, Extern, ReadonlyStorage, Storage}; -use cosmwasm::types::{log, CanonicalAddr, Env, HumanAddr, Response}; -use cw_storage::{serialize, PrefixedStorage, ReadonlyPrefixedStorage}; +use cosmwasm_std::{ + generic_err, log, to_binary, to_vec, Api, Binary, CanonicalAddr, Env, Extern, HandleResponse, + HumanAddr, InitResponse, Querier, ReadonlyStorage, StdResult, Storage, +}; +use cosmwasm_storage::{PrefixedStorage, ReadonlyPrefixedStorage}; #[derive(Serialize, Debug, Deserialize, Clone, PartialEq, JsonSchema)] pub struct Constants { @@ -22,11 +23,11 @@ pub const PREFIX_ALLOWANCES: &[u8] = b"allowances"; pub const KEY_CONSTANTS: &[u8] = b"constants"; pub const KEY_TOTAL_SUPPLY: &[u8] = b"total_supply"; -pub fn init( - deps: &mut Extern, +pub fn init( + deps: &mut Extern, _env: Env, msg: InitMsg, -) -> Result { +) -> StdResult { let mut total_supply: u128 = 0; { // Initial balances @@ -34,39 +35,43 @@ pub fn init( for row in msg.initial_balances { let raw_address = deps.api.canonical_address(&row.address)?; let amount_raw = parse_u128(&row.amount)?; - balances_store.set(raw_address.as_slice(), &amount_raw.to_be_bytes()); + balances_store.set(raw_address.as_slice(), &amount_raw.to_be_bytes())?; total_supply += amount_raw; } } // Check name, symbol, decimals if !is_valid_name(&msg.name) { - return contract_err("Name is not in the expected format (3-30 UTF-8 bytes)"); + return Err(generic_err( + "Name is not in the expected format (3-30 UTF-8 bytes)", + )); } if !is_valid_symbol(&msg.symbol) { - return contract_err("Ticker symbol is not in expected format [A-Z]{3,6}"); + return Err(generic_err( + "Ticker symbol is not in expected format [A-Z]{3,6}", + )); } if msg.decimals > 18 { - return contract_err("Decimals must not exceed 18"); + return Err(generic_err("Decimals must not exceed 18")); } let mut config_store = PrefixedStorage::new(PREFIX_CONFIG, &mut deps.storage); - let constants = serialize(&Constants { + let constants = to_vec(&Constants { name: msg.name, symbol: msg.symbol, decimals: msg.decimals, })?; - config_store.set(KEY_CONSTANTS, &constants); - config_store.set(KEY_TOTAL_SUPPLY, &total_supply.to_be_bytes()); + config_store.set(KEY_CONSTANTS, &constants)?; + config_store.set(KEY_TOTAL_SUPPLY, &total_supply.to_be_bytes())?; - Ok(Response::default()) + Ok(InitResponse::default()) } -pub fn handle( - deps: &mut Extern, +pub fn handle( + deps: &mut Extern, env: Env, msg: HandleMsg, -) -> Result { +) -> StdResult { match msg { HandleMsg::Approve { spender, amount } => try_approve(deps, env, &spender, &amount), HandleMsg::Transfer { recipient, amount } => try_transfer(deps, env, &recipient, &amount), @@ -79,12 +84,15 @@ pub fn handle( } } -pub fn query(deps: &Extern, msg: QueryMsg) -> Result> { +pub fn query( + deps: &Extern, + msg: QueryMsg, +) -> StdResult { match msg { QueryMsg::Balance { address } => { let address_key = deps.api.canonical_address(&address)?; let balance = read_balance(&deps.storage, &address_key)?; - let out = serialize(&BalanceResponse { + let out = to_binary(&BalanceResponse { balance: balance.to_string(), })?; Ok(out) @@ -93,7 +101,7 @@ pub fn query(deps: &Extern, msg: QueryMsg) -> Result(deps: &Extern, msg: QueryMsg) -> Result( - deps: &mut Extern, +fn try_transfer( + deps: &mut Extern, env: Env, recipient: &HumanAddr, amount: &str, -) -> Result { - let sender_address_raw = &env.message.signer; +) -> StdResult { + let sender_address_raw = &env.message.sender; let recipient_address_raw = deps.api.canonical_address(recipient)?; let amount_raw = parse_u128(amount)?; @@ -118,13 +126,13 @@ fn try_transfer( amount_raw, )?; - let res = Response { + let res = HandleResponse { messages: vec![], log: vec![ log("action", "transfer"), log( "sender", - deps.api.human_address(&env.message.signer)?.as_str(), + deps.api.human_address(&env.message.sender)?.as_str(), ), log("recipient", recipient.as_str()), ], @@ -133,24 +141,24 @@ fn try_transfer( Ok(res) } -fn try_transfer_from( - deps: &mut Extern, +fn try_transfer_from( + deps: &mut Extern, env: Env, owner: &HumanAddr, recipient: &HumanAddr, amount: &str, -) -> Result { - let spender_address_raw = &env.message.signer; +) -> StdResult { + let spender_address_raw = &env.message.sender; let owner_address_raw = deps.api.canonical_address(owner)?; let recipient_address_raw = deps.api.canonical_address(recipient)?; let amount_raw = parse_u128(amount)?; let mut allowance = read_allowance(&deps.storage, &owner_address_raw, &spender_address_raw)?; if allowance < amount_raw { - return dyn_contract_err(format!( + return Err(generic_err(format!( "Insufficient allowance: allowance={}, required={}", allowance, amount_raw - )); + ))); } allowance -= amount_raw; write_allowance( @@ -158,7 +166,7 @@ fn try_transfer_from( &owner_address_raw, &spender_address_raw, allowance, - ); + )?; perform_transfer( &mut deps.storage, &owner_address_raw, @@ -166,13 +174,13 @@ fn try_transfer_from( amount_raw, )?; - let res = Response { + let res = HandleResponse { messages: vec![], log: vec![ log("action", "transfer_from"), log( "spender", - deps.api.human_address(&env.message.signer)?.as_str(), + deps.api.human_address(&env.message.sender)?.as_str(), ), log("sender", owner.as_str()), log("recipient", recipient.as_str()), @@ -182,13 +190,13 @@ fn try_transfer_from( Ok(res) } -fn try_approve( - deps: &mut Extern, +fn try_approve( + deps: &mut Extern, env: Env, spender: &HumanAddr, amount: &str, -) -> Result { - let owner_address_raw = &env.message.signer; +) -> StdResult { + let owner_address_raw = &env.message.sender; let spender_address_raw = deps.api.canonical_address(spender)?; let amount_raw = parse_u128(amount)?; write_allowance( @@ -196,14 +204,14 @@ fn try_approve( &owner_address_raw, &spender_address_raw, amount_raw, - ); - let res = Response { + )?; + let res = HandleResponse { messages: vec![], log: vec![ log("action", "approve"), log( "owner", - deps.api.human_address(&env.message.signer)?.as_str(), + deps.api.human_address(&env.message.sender)?.as_str(), ), log("spender", spender.as_str()), ], @@ -217,44 +225,45 @@ fn try_approve( /// Remove `amount` tokens from the system irreversibly, from signer account /// /// @param amount the amount of money to burn -fn try_burn( - deps: &mut Extern, +fn try_burn( + deps: &mut Extern, env: Env, amount: &str, -) -> Result { - let owner_address_raw = &env.message.signer; +) -> StdResult { + let owner_address_raw = &env.message.sender; let amount_raw = parse_u128(amount)?; let mut account_balance = read_balance(&deps.storage, owner_address_raw)?; if account_balance < amount_raw { - return dyn_contract_err(format!( + return Err(generic_err(format!( "insufficient funds to burn: balance={}, required={}", account_balance, amount_raw - )); + ))); } account_balance -= amount_raw; let mut balances_store = PrefixedStorage::new(PREFIX_BALANCES, &mut deps.storage); - balances_store.set(owner_address_raw.as_slice(), &account_balance.to_be_bytes()); + balances_store.set(owner_address_raw.as_slice(), &account_balance.to_be_bytes())?; let mut config_store = PrefixedStorage::new(PREFIX_CONFIG, &mut deps.storage); let data = config_store .get(KEY_TOTAL_SUPPLY) - .expect("no decimals data stored"); + .expect("could not read total supply") + .expect("no total supply data stored"); let mut total_supply = bytes_to_u128(&data).unwrap(); total_supply -= amount_raw; - config_store.set(KEY_TOTAL_SUPPLY, &total_supply.to_be_bytes()); + config_store.set(KEY_TOTAL_SUPPLY, &total_supply.to_be_bytes())?; - let res = Response { + let res = HandleResponse { messages: vec![], log: vec![ log("action", "burn"), log( "account", - deps.api.human_address(&env.message.signer)?.as_str(), + deps.api.human_address(&env.message.sender)?.as_str(), ), log("amount", amount), ], @@ -269,53 +278,54 @@ fn perform_transfer( from: &CanonicalAddr, to: &CanonicalAddr, amount: u128, -) -> Result<()> { +) -> StdResult<()> { let mut balances_store = PrefixedStorage::new(PREFIX_BALANCES, store); let mut from_balance = read_u128(&balances_store, from.as_slice())?; if from_balance < amount { - return dyn_contract_err(format!( + return Err(generic_err(format!( "Insufficient funds: balance={}, required={}", from_balance, amount - )); + ))); } from_balance -= amount; - balances_store.set(from.as_slice(), &from_balance.to_be_bytes()); + balances_store.set(from.as_slice(), &from_balance.to_be_bytes())?; let mut to_balance = read_u128(&balances_store, to.as_slice())?; to_balance += amount; - balances_store.set(to.as_slice(), &to_balance.to_be_bytes()); + balances_store.set(to.as_slice(), &to_balance.to_be_bytes())?; Ok(()) } // Converts 16 bytes value into u128 // Errors if data found that is not 16 bytes -pub fn bytes_to_u128(data: &[u8]) -> Result { +pub fn bytes_to_u128(data: &[u8]) -> StdResult { match data[0..16].try_into() { Ok(bytes) => Ok(u128::from_be_bytes(bytes)), - Err(_) => contract_err("Corrupted data found. 16 byte expected."), + Err(_) => Err(generic_err("Corrupted data found. 16 byte expected.")), } } // Reads 16 byte storage value into u128 // Returns zero if key does not exist. Errors if data found that is not 16 bytes -pub fn read_u128(store: &S, key: &[u8]) -> Result { - match store.get(key) { +pub fn read_u128(store: &S, key: &[u8]) -> StdResult { + let result = store.get(key)?; + match result { Some(data) => bytes_to_u128(&data), None => Ok(0u128), } } // Source must be a decadic integer >= 0 -pub fn parse_u128(source: &str) -> Result { +pub fn parse_u128(source: &str) -> StdResult { match source.parse::() { Ok(value) => Ok(value), - Err(_) => contract_err("Error while parsing string to u128"), + Err(_) => Err(generic_err("Error while parsing string to u128")), } } -fn read_balance(store: &S, owner: &CanonicalAddr) -> Result { +fn read_balance(store: &S, owner: &CanonicalAddr) -> StdResult { let balance_store = ReadonlyPrefixedStorage::new(PREFIX_BALANCES, store); read_u128(&balance_store, owner.as_slice()) } @@ -324,7 +334,7 @@ fn read_allowance( store: &S, owner: &CanonicalAddr, spender: &CanonicalAddr, -) -> Result { +) -> StdResult { let allowances_store = ReadonlyPrefixedStorage::new(PREFIX_ALLOWANCES, store); let owner_store = ReadonlyPrefixedStorage::new(owner.as_slice(), &allowances_store); read_u128(&owner_store, spender.as_slice()) @@ -335,10 +345,11 @@ fn write_allowance( owner: &CanonicalAddr, spender: &CanonicalAddr, amount: u128, -) { +) -> StdResult<()> { let mut allowances_store = PrefixedStorage::new(PREFIX_ALLOWANCES, store); let mut owner_store = PrefixedStorage::new(owner.as_slice(), &mut allowances_store); - owner_store.set(spender.as_slice(), &amount.to_be_bytes()); + owner_store.set(spender.as_slice(), &amount.to_be_bytes())?; + Ok(()) } fn is_valid_name(name: &str) -> bool { diff --git a/erc20/src/lib.rs b/erc20/src/lib.rs index 451d2d82..c6be92a5 100644 --- a/erc20/src/lib.rs +++ b/erc20/src/lib.rs @@ -7,35 +7,36 @@ mod tests; #[cfg(target_arch = "wasm32")] mod wasm { use super::contract; - use cosmwasm::{exports, imports}; - use std::ffi::c_void; + use cosmwasm_std::{ + do_handle, do_init, do_query, ExternalApi, ExternalQuerier, ExternalStorage, + }; #[no_mangle] - extern "C" fn init(params_ptr: *mut c_void, msg_ptr: *mut c_void) -> *mut c_void { - exports::do_init( - &contract::init::, - params_ptr, + extern "C" fn init(env_ptr: u32, msg_ptr: u32) -> u32 { + do_init( + &contract::init::, + env_ptr, msg_ptr, ) } #[no_mangle] - extern "C" fn handle(params_ptr: *mut c_void, msg_ptr: *mut c_void) -> *mut c_void { - exports::do_handle( - &contract::handle::, - params_ptr, + extern "C" fn handle(env_ptr: u32, msg_ptr: u32) -> u32 { + do_handle( + &contract::handle::, + env_ptr, msg_ptr, ) } #[no_mangle] - extern "C" fn query(msg_ptr: *mut c_void) -> *mut c_void { - exports::do_query( - &contract::query::, + extern "C" fn query(msg_ptr: u32) -> u32 { + do_query( + &contract::query::, msg_ptr, ) } - // Other C externs like cosmwasm_api_0_6, allocate, deallocate are available - // automatically because we `use cosmwasm`. + // Other C externs like cosmwasm_vm_version_1, allocate, deallocate are available + // automatically because we `use cosmwasm_std`. } diff --git a/erc20/src/msg.rs b/erc20/src/msg.rs index a9328c57..04cf07fb 100644 --- a/erc20/src/msg.rs +++ b/erc20/src/msg.rs @@ -1,7 +1,7 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use cosmwasm::types::HumanAddr; +use cosmwasm_std::HumanAddr; #[derive(Serialize, Deserialize, Clone, PartialEq, JsonSchema)] pub struct InitialBalance { diff --git a/erc20/src/tests.rs b/erc20/src/tests.rs index c3266fef..d415285f 100644 --- a/erc20/src/tests.rs +++ b/erc20/src/tests.rs @@ -1,9 +1,6 @@ -use cosmwasm::errors::Error; -use cosmwasm::mock::{dependencies, mock_env}; -use cosmwasm::serde::from_slice; -use cosmwasm::traits::{Api, ReadonlyStorage, Storage}; -use cosmwasm::types::{log, Env, HumanAddr}; -use cw_storage::ReadonlyPrefixedStorage; +use cosmwasm_std::testing::{mock_dependencies, mock_env}; +use cosmwasm_std::{from_slice, log, Api, Env, HumanAddr, ReadonlyStorage, StdError, Storage}; +use cosmwasm_storage::ReadonlyPrefixedStorage; use crate::contract::{ bytes_to_u128, handle, init, query, read_u128, Constants, KEY_CONSTANTS, KEY_TOTAL_SUPPLY, @@ -13,8 +10,8 @@ use crate::msg::{HandleMsg, InitMsg, InitialBalance, QueryMsg}; static CANONICAL_LENGTH: usize = 20; -fn mock_env_height(api: &A, signer: &HumanAddr, height: i64, time: i64) -> Env { - let mut env = mock_env(api, signer, &[], &[]); +fn mock_env_height(api: &A, signer: &HumanAddr, height: u64, time: u64) -> Env { + let mut env = mock_env(api, signer, &[]); env.block.height = height; env.block.time = time; env @@ -24,6 +21,7 @@ fn get_constants(storage: &S) -> Constants { let config_storage = ReadonlyPrefixedStorage::new(PREFIX_CONFIG, storage); let data = config_storage .get(KEY_CONSTANTS) + .expect("error reading data") .expect("no config data stored"); from_slice(&data).expect("invalid data") } @@ -32,6 +30,7 @@ fn get_total_supply(storage: &S) -> u128 { let config_storage = ReadonlyPrefixedStorage::new(PREFIX_CONFIG, storage); let data = config_storage .get(KEY_TOTAL_SUPPLY) + .expect("error reading data") .expect("no decimals data stored"); return bytes_to_u128(&data).unwrap(); } @@ -63,8 +62,8 @@ fn get_allowance( } mod helpers { + use super::*; use crate::contract::parse_u128; - use cosmwasm::errors::Error; #[test] fn works_for_simple_inputs() { @@ -88,7 +87,7 @@ mod helpers { fn errors_for_empty_input() { match parse_u128("") { Ok(_) => panic!("must not pass"), - Err(Error::ContractErr { msg, .. }) => { + Err(StdError::GenericErr { msg, .. }) => { assert_eq!(msg, "Error while parsing string to u128") } Err(e) => panic!("unexpected error: {:?}", e), @@ -99,7 +98,7 @@ mod helpers { fn errors_for_values_out_of_range() { match parse_u128("-1") { Ok(_) => panic!("must not pass"), - Err(Error::ContractErr { msg, .. }) => { + Err(StdError::GenericErr { msg, .. }) => { assert_eq!(msg, "Error while parsing string to u128") } Err(e) => panic!("unexpected error: {:?}", e), @@ -107,7 +106,7 @@ mod helpers { match parse_u128("340282366920938463463374607431768211456") { Ok(_) => panic!("must not pass"), - Err(Error::ContractErr { msg, .. }) => { + Err(StdError::GenericErr { msg, .. }) => { assert_eq!(msg, "Error while parsing string to u128") } Err(e) => panic!("unexpected error: {:?}", e), @@ -118,7 +117,7 @@ mod helpers { fn fails_for_non_decadic_strings() { match parse_u128("0xAB") { Ok(_) => panic!("must not pass"), - Err(Error::ContractErr { msg, .. }) => { + Err(StdError::GenericErr { msg, .. }) => { assert_eq!(msg, "Error while parsing string to u128") } Err(e) => panic!("unexpected error: {:?}", e), @@ -126,7 +125,7 @@ mod helpers { match parse_u128("0xab") { Ok(_) => panic!("must not pass"), - Err(Error::ContractErr { msg, .. }) => { + Err(StdError::GenericErr { msg, .. }) => { assert_eq!(msg, "Error while parsing string to u128") } Err(e) => panic!("unexpected error: {:?}", e), @@ -134,7 +133,7 @@ mod helpers { match parse_u128("0b1100") { Ok(_) => panic!("must not pass"), - Err(Error::ContractErr { msg, .. }) => { + Err(StdError::GenericErr { msg, .. }) => { assert_eq!(msg, "Error while parsing string to u128") } Err(e) => panic!("unexpected error: {:?}", e), @@ -147,7 +146,7 @@ mod init { #[test] fn works() { - let mut deps = dependencies(CANONICAL_LENGTH); + let mut deps = mock_dependencies(CANONICAL_LENGTH, &[]); let init_msg = InitMsg { name: "Cash Token".to_string(), symbol: "CASH".to_string(), @@ -179,7 +178,7 @@ mod init { #[test] fn works_with_empty_balance() { - let mut deps = dependencies(CANONICAL_LENGTH); + let mut deps = mock_dependencies(CANONICAL_LENGTH, &[]); let init_msg = InitMsg { name: "Cash Token".to_string(), symbol: "CASH".to_string(), @@ -195,7 +194,7 @@ mod init { #[test] fn works_with_multiple_balances() { - let mut deps = dependencies(CANONICAL_LENGTH); + let mut deps = mock_dependencies(CANONICAL_LENGTH, &[]); let init_msg = InitMsg { name: "Cash Token".to_string(), symbol: "CASH".to_string(), @@ -237,7 +236,7 @@ mod init { #[test] fn works_with_balance_larger_than_53_bit() { - let mut deps = dependencies(CANONICAL_LENGTH); + let mut deps = mock_dependencies(CANONICAL_LENGTH, &[]); // This value cannot be represented precisely in JavaScript and jq. Both // node -e "console.log(9007199254740993)" @@ -267,7 +266,7 @@ mod init { #[test] // Typical supply like 100 million tokens with 18 decimals exceeds the 64 bit range fn works_with_balance_larger_than_64_bit() { - let mut deps = dependencies(CANONICAL_LENGTH); + let mut deps = mock_dependencies(CANONICAL_LENGTH, &[]); let init_msg = InitMsg { name: "Cash Token".to_string(), @@ -292,7 +291,7 @@ mod init { #[test] fn fails_for_balance_larger_than_max_u128() { - let mut deps = dependencies(CANONICAL_LENGTH); + let mut deps = mock_dependencies(CANONICAL_LENGTH, &[]); let init_msg = InitMsg { name: "Cash Token".to_string(), symbol: "CASH".to_string(), @@ -308,7 +307,7 @@ mod init { let result = init(&mut deps, env, init_msg); match result { Ok(_) => panic!("expected error"), - Err(Error::ContractErr { msg, .. }) => { + Err(StdError::GenericErr { msg, .. }) => { assert_eq!(msg, "Error while parsing string to u128") } Err(e) => panic!("unexpected error: {:?}", e), @@ -317,7 +316,7 @@ mod init { #[test] fn fails_for_large_decimals() { - let mut deps = dependencies(CANONICAL_LENGTH); + let mut deps = mock_dependencies(CANONICAL_LENGTH, &[]); let init_msg = InitMsg { name: "Cash Token".to_string(), symbol: "CASH".to_string(), @@ -328,14 +327,14 @@ mod init { let result = init(&mut deps, env, init_msg); match result { Ok(_) => panic!("expected error"), - Err(Error::ContractErr { msg, .. }) => assert_eq!(msg, "Decimals must not exceed 18"), + Err(StdError::GenericErr { msg, .. }) => assert_eq!(msg, "Decimals must not exceed 18"), Err(e) => panic!("unexpected error: {:?}", e), } } #[test] fn fails_for_name_too_short() { - let mut deps = dependencies(CANONICAL_LENGTH); + let mut deps = mock_dependencies(CANONICAL_LENGTH, &[]); let init_msg = InitMsg { name: "CC".to_string(), symbol: "CASH".to_string(), @@ -346,7 +345,7 @@ mod init { let result = init(&mut deps, env, init_msg); match result { Ok(_) => panic!("expected error"), - Err(Error::ContractErr { msg, .. }) => { + Err(StdError::GenericErr { msg, .. }) => { assert_eq!(msg, "Name is not in the expected format (3-30 UTF-8 bytes)") } Err(e) => panic!("unexpected error: {:?}", e), @@ -355,7 +354,7 @@ mod init { #[test] fn fails_for_name_too_long() { - let mut deps = dependencies(CANONICAL_LENGTH); + let mut deps = mock_dependencies(CANONICAL_LENGTH, &[]); let init_msg = InitMsg { name: "Cash coin. Cash coin. Cash coin. Cash coin.".to_string(), symbol: "CASH".to_string(), @@ -366,7 +365,7 @@ mod init { let result = init(&mut deps, env, init_msg); match result { Ok(_) => panic!("expected error"), - Err(Error::ContractErr { msg, .. }) => { + Err(StdError::GenericErr { msg, .. }) => { assert_eq!(msg, "Name is not in the expected format (3-30 UTF-8 bytes)") } Err(e) => panic!("unexpected error: {:?}", e), @@ -375,7 +374,7 @@ mod init { #[test] fn fails_for_symbol_too_short() { - let mut deps = dependencies(CANONICAL_LENGTH); + let mut deps = mock_dependencies(CANONICAL_LENGTH, &[]); let init_msg = InitMsg { name: "De De".to_string(), symbol: "DD".to_string(), @@ -386,7 +385,7 @@ mod init { let result = init(&mut deps, env, init_msg); match result { Ok(_) => panic!("expected error"), - Err(Error::ContractErr { msg, .. }) => { + Err(StdError::GenericErr { msg, .. }) => { assert_eq!(msg, "Ticker symbol is not in expected format [A-Z]{3,6}") } Err(e) => panic!("unexpected error: {:?}", e), @@ -395,7 +394,7 @@ mod init { #[test] fn fails_for_symbol_too_long() { - let mut deps = dependencies(CANONICAL_LENGTH); + let mut deps = mock_dependencies(CANONICAL_LENGTH, &[]); let init_msg = InitMsg { name: "Super Coin".to_string(), symbol: "SUPERCOIN".to_string(), @@ -406,7 +405,7 @@ mod init { let result = init(&mut deps, env, init_msg); match result { Ok(_) => panic!("expected error"), - Err(Error::ContractErr { msg, .. }) => { + Err(StdError::GenericErr { msg, .. }) => { assert_eq!(msg, "Ticker symbol is not in expected format [A-Z]{3,6}") } Err(e) => panic!("unexpected error: {:?}", e), @@ -415,7 +414,7 @@ mod init { #[test] fn fails_for_symbol_lowercase() { - let mut deps = dependencies(CANONICAL_LENGTH); + let mut deps = mock_dependencies(CANONICAL_LENGTH, &[]); let init_msg = InitMsg { name: "Cash Token".to_string(), symbol: "CaSH".to_string(), @@ -426,7 +425,7 @@ mod init { let result = init(&mut deps, env, init_msg); match result { Ok(_) => panic!("expected error"), - Err(Error::ContractErr { msg, .. }) => { + Err(StdError::GenericErr { msg, .. }) => { assert_eq!(msg, "Ticker symbol is not in expected format [A-Z]{3,6}") } Err(e) => panic!("unexpected error: {:?}", e), @@ -461,7 +460,7 @@ mod transfer { #[test] fn can_send_to_existing_recipient() { - let mut deps = dependencies(CANONICAL_LENGTH); + let mut deps = mock_dependencies(CANONICAL_LENGTH, &[]); let init_msg = make_init_msg(); let env1 = mock_env_height(&deps.api, &HumanAddr("creator".to_string()), 450, 550); let res = init(&mut deps, env1, init_msg).unwrap(); @@ -517,7 +516,7 @@ mod transfer { #[test] fn can_send_to_non_existent_recipient() { - let mut deps = dependencies(CANONICAL_LENGTH); + let mut deps = mock_dependencies(CANONICAL_LENGTH, &[]); let init_msg = make_init_msg(); let env1 = mock_env_height(&deps.api, &HumanAddr("creator".to_string()), 450, 550); let res = init(&mut deps, env1, init_msg).unwrap(); @@ -577,7 +576,7 @@ mod transfer { #[test] fn can_send_zero_amount() { - let mut deps = dependencies(CANONICAL_LENGTH); + let mut deps = mock_dependencies(CANONICAL_LENGTH, &[]); let init_msg = make_init_msg(); let env1 = mock_env_height(&deps.api, &HumanAddr("creator".to_string()), 450, 550); let res = init(&mut deps, env1, init_msg).unwrap(); @@ -633,7 +632,7 @@ mod transfer { #[test] fn can_send_to_sender() { - let mut deps = dependencies(CANONICAL_LENGTH); + let mut deps = mock_dependencies(CANONICAL_LENGTH, &[]); let init_msg = make_init_msg(); let env1 = mock_env_height(&deps.api, &HumanAddr("creator".to_string()), 450, 550); let res = init(&mut deps, env1, init_msg).unwrap(); @@ -667,7 +666,7 @@ mod transfer { #[test] fn fails_on_insufficient_balance() { - let mut deps = dependencies(CANONICAL_LENGTH); + let mut deps = mock_dependencies(CANONICAL_LENGTH, &[]); let init_msg = make_init_msg(); let env1 = mock_env_height(&deps.api, &HumanAddr("creator".to_string()), 450, 550); let res = init(&mut deps, env1, init_msg).unwrap(); @@ -697,7 +696,7 @@ mod transfer { let transfer_result = handle(&mut deps, env2, transfer_msg); match transfer_result { Ok(_) => panic!("expected error"), - Err(Error::DynContractErr { msg, .. }) => { + Err(StdError::GenericErr { msg, .. }) => { assert_eq!(msg, "Insufficient funds: balance=11, required=12") } Err(e) => panic!("unexpected error: {:?}", e), @@ -751,7 +750,7 @@ mod approve { #[test] fn has_zero_allowance_by_default() { - let mut deps = dependencies(CANONICAL_LENGTH); + let mut deps = mock_dependencies(CANONICAL_LENGTH, &[]); let init_msg = make_init_msg(); let env1 = mock_env_height(&deps.api, &HumanAddr("creator".to_string()), 450, 550); let res = init(&mut deps, env1, init_msg).unwrap(); @@ -782,7 +781,7 @@ mod approve { #[test] fn can_set_allowance() { - let mut deps = dependencies(CANONICAL_LENGTH); + let mut deps = mock_dependencies(CANONICAL_LENGTH, &[]); let init_msg = make_init_msg(); let env1 = mock_env_height(&deps.api, &HumanAddr("creator".to_string()), 450, 550); let res = init(&mut deps, env1, init_msg).unwrap(); @@ -877,7 +876,7 @@ mod transfer_from { #[test] fn works() { - let mut deps = dependencies(CANONICAL_LENGTH); + let mut deps = mock_dependencies(CANONICAL_LENGTH, &[]); let init_msg = make_init_msg(); let env1 = mock_env_height(&deps.api, &HumanAddr("creator".to_string()), 450, 550); let res = init(&mut deps, env1, init_msg).unwrap(); @@ -933,7 +932,7 @@ mod transfer_from { #[test] fn fails_when_allowance_too_low() { - let mut deps = dependencies(CANONICAL_LENGTH); + let mut deps = mock_dependencies(CANONICAL_LENGTH, &[]); let init_msg = make_init_msg(); let env1 = mock_env_height(&deps.api, &HumanAddr("creator".to_string()), 450, 550); let res = init(&mut deps, env1, init_msg).unwrap(); @@ -973,7 +972,7 @@ mod transfer_from { let transfer_result = handle(&mut deps, env3, fransfer_from_msg); match transfer_result { Ok(_) => panic!("expected error"), - Err(Error::DynContractErr { msg, .. }) => { + Err(StdError::GenericErr { msg, .. }) => { assert_eq!(msg, "Insufficient allowance: allowance=2, required=3") } Err(e) => panic!("unexpected error: {:?}", e), @@ -982,7 +981,7 @@ mod transfer_from { #[test] fn fails_when_allowance_is_set_but_balance_too_low() { - let mut deps = dependencies(CANONICAL_LENGTH); + let mut deps = mock_dependencies(CANONICAL_LENGTH, &[]); let init_msg = make_init_msg(); let env1 = mock_env_height(&deps.api, &HumanAddr("creator".to_string()), 450, 550); let res = init(&mut deps, env1, init_msg).unwrap(); @@ -1025,7 +1024,7 @@ mod transfer_from { let transfer_result = handle(&mut deps, env3, fransfer_from_msg); match transfer_result { Ok(_) => panic!("expected error"), - Err(Error::DynContractErr { msg, .. }) => { + Err(StdError::GenericErr { msg, .. }) => { assert_eq!(msg, "Insufficient funds: balance=11, required=15") } Err(e) => panic!("unexpected error: {:?}", e), @@ -1056,7 +1055,7 @@ mod burn { #[test] fn can_burn_from_existing_account() { - let mut deps = dependencies(CANONICAL_LENGTH); + let mut deps = mock_dependencies(CANONICAL_LENGTH, &[]); let init_msg = make_init_msg(); let env1 = mock_env_height(&deps.api, &HumanAddr("creator".to_string()), 450, 550); let res = init(&mut deps, env1, init_msg).unwrap(); @@ -1103,7 +1102,7 @@ mod burn { #[test] fn can_burn_zero_amount() { - let mut deps = dependencies(CANONICAL_LENGTH); + let mut deps = mock_dependencies(CANONICAL_LENGTH, &[]); let init_msg = make_init_msg(); let env1 = mock_env_height(&deps.api, &HumanAddr("creator".to_string()), 450, 550); let res = init(&mut deps, env1, init_msg).unwrap(); @@ -1150,7 +1149,7 @@ mod burn { #[test] fn fails_on_insufficient_balance() { - let mut deps = dependencies(CANONICAL_LENGTH); + let mut deps = mock_dependencies(CANONICAL_LENGTH, &[]); let init_msg = make_init_msg(); let env1 = mock_env_height(&deps.api, &HumanAddr("creator".to_string()), 450, 550); let res = init(&mut deps, env1, init_msg).unwrap(); @@ -1175,7 +1174,7 @@ mod burn { let burn_result = handle(&mut deps, env2, burn_msg); match burn_result { Ok(_) => panic!("expected error"), - Err(Error::DynContractErr { msg, .. }) => { + Err(StdError::GenericErr { msg, .. }) => { assert_eq!(msg, "insufficient funds to burn: balance=11, required=12") } Err(e) => panic!("unexpected error: {:?}", e), @@ -1232,7 +1231,7 @@ mod query { #[test] fn can_query_balance_of_existing_address() { - let mut deps = dependencies(CANONICAL_LENGTH); + let mut deps = mock_dependencies(CANONICAL_LENGTH, &[]); let init_msg = make_init_msg(); let env1 = mock_env_height(&deps.api, &address(0), 450, 550); let res = init(&mut deps, env1, init_msg).unwrap(); @@ -1242,12 +1241,12 @@ mod query { address: address(1), }; let query_result = query(&deps, query_msg).unwrap(); - assert_eq!(query_result, b"{\"balance\":\"11\"}"); + assert_eq!(query_result.as_slice(), b"{\"balance\":\"11\"}"); } #[test] fn can_query_balance_of_nonexisting_address() { - let mut deps = dependencies(CANONICAL_LENGTH); + let mut deps = mock_dependencies(CANONICAL_LENGTH, &[]); let init_msg = make_init_msg(); let env1 = mock_env_height(&deps.api, &address(0), 450, 550); let res = init(&mut deps, env1, init_msg).unwrap(); @@ -1257,12 +1256,12 @@ mod query { address: address(4), // only indices 1, 2, 3 are initialized }; let query_result = query(&deps, query_msg).unwrap(); - assert_eq!(query_result, b"{\"balance\":\"0\"}"); + assert_eq!(query_result.as_slice(), b"{\"balance\":\"0\"}"); } #[test] fn can_query_allowance_of_existing_addresses() { - let mut deps = dependencies(CANONICAL_LENGTH); + let mut deps = mock_dependencies(CANONICAL_LENGTH, &[]); let init_msg = make_init_msg(); let env1 = mock_env_height(&deps.api, &address(0), 450, 550); let res = init(&mut deps, env1, init_msg).unwrap(); @@ -1292,12 +1291,12 @@ mod query { spender: spender.clone(), }; let query_result = query(&deps, query_msg).unwrap(); - assert_eq!(query_result, b"{\"allowance\":\"42\"}"); + assert_eq!(query_result.as_slice(), b"{\"allowance\":\"42\"}"); } #[test] fn can_query_allowance_of_nonexisting_owner() { - let mut deps = dependencies(CANONICAL_LENGTH); + let mut deps = mock_dependencies(CANONICAL_LENGTH, &[]); let init_msg = make_init_msg(); let env1 = mock_env_height(&deps.api, &address(0), 450, 550); let res = init(&mut deps, env1, init_msg).unwrap(); @@ -1329,7 +1328,7 @@ mod query { spender: bob.clone(), }; let query_result = query(&deps, query_msg).unwrap(); - assert_eq!(query_result, b"{\"allowance\":\"0\"}"); + assert_eq!(query_result.as_slice(), b"{\"allowance\":\"0\"}"); // differnet owner let query_msg = QueryMsg::Allowance { @@ -1337,6 +1336,6 @@ mod query { spender: spender.clone(), }; let query_result = query(&deps, query_msg).unwrap(); - assert_eq!(query_result, b"{\"allowance\":\"0\"}"); + assert_eq!(query_result.as_slice(), b"{\"allowance\":\"0\"}"); } } diff --git a/erc20/tests/integration.rs b/erc20/tests/integration.rs index db81fd45..7fb59e70 100644 --- a/erc20/tests/integration.rs +++ b/erc20/tests/integration.rs @@ -27,12 +27,12 @@ //! _ => panic!("Expected error"), //! } -use cosmwasm::mock::mock_env; -use cosmwasm::serde::from_slice; -use cosmwasm::traits::{Api, ReadonlyStorage, Storage}; -use cosmwasm::types::{log, Env, HumanAddr}; +use cosmwasm_std::testing::mock_env; +use cosmwasm_std::{ + from_slice, log, Api, Env, HandleResponse, HumanAddr, InitResponse, ReadonlyStorage, Storage, +}; +use cosmwasm_storage::ReadonlyPrefixedStorage; use cosmwasm_vm::testing::{handle, init, mock_instance, query}; -use cw_storage::ReadonlyPrefixedStorage; use cw_erc20::contract::{ bytes_to_u128, read_u128, Constants, KEY_CONSTANTS, KEY_TOTAL_SUPPLY, PREFIX_ALLOWANCES, @@ -42,8 +42,8 @@ use cw_erc20::msg::{HandleMsg, InitMsg, InitialBalance, QueryMsg}; static WASM: &[u8] = include_bytes!("../target/wasm32-unknown-unknown/release/cw_erc20.wasm"); -fn mock_env_height(api: &A, signer: &HumanAddr, height: i64, time: i64) -> Env { - let mut env = mock_env(api, signer, &[], &[]); +fn mock_env_height(api: &A, signer: &HumanAddr, height: u64, time: u64) -> Env { + let mut env = mock_env(api, signer, &[]); env.block.height = height; env.block.time = time; env @@ -53,6 +53,7 @@ fn get_constants(storage: &S) -> Constants { let config_storage = ReadonlyPrefixedStorage::new(PREFIX_CONFIG, storage); let data = config_storage .get(KEY_CONSTANTS) + .expect("error getting data") .expect("no config data stored"); from_slice(&data).expect("invalid data") } @@ -61,6 +62,7 @@ fn get_total_supply(storage: &S) -> u128 { let config_storage = ReadonlyPrefixedStorage::new(PREFIX_CONFIG, storage); let data = config_storage .get(KEY_TOTAL_SUPPLY) + .expect("error getting data") .expect("no decimals data stored"); return bytes_to_u128(&data).unwrap(); } @@ -126,13 +128,14 @@ fn init_msg() -> InitMsg { #[test] fn init_works() { - let mut deps = mock_instance(WASM); + let mut deps = mock_instance(WASM, &[]); let init_msg = init_msg(); let params = mock_env_height(&deps.api, &address(0), 876, 0); - let res = init(&mut deps, params, init_msg).unwrap(); + let res: InitResponse = init(&mut deps, params, init_msg).unwrap(); assert_eq!(0, res.messages.len()); // query the store directly + let api = deps.api; deps.with_storage(|storage| { assert_eq!( get_constants(storage), @@ -143,28 +146,33 @@ fn init_works() { } ); assert_eq!(get_total_supply(storage), 66); - assert_eq!(get_balance(&deps.api, storage, &address(1)), 11); - assert_eq!(get_balance(&deps.api, storage, &address(2)), 22); - assert_eq!(get_balance(&deps.api, storage, &address(3)), 33); - }); + assert_eq!(get_balance(&api, storage, &address(1)), 11); + assert_eq!(get_balance(&api, storage, &address(2)), 22); + assert_eq!(get_balance(&api, storage, &address(3)), 33); + Ok(()) + }) + .unwrap(); } #[test] fn transfer_works() { - let mut deps = mock_instance(WASM); + let mut deps = mock_instance(WASM, &[]); let init_msg = init_msg(); let env1 = mock_env_height(&deps.api, &address(0), 876, 0); - let res = init(&mut deps, env1, init_msg).unwrap(); + let res: InitResponse = init(&mut deps, env1, init_msg).unwrap(); assert_eq!(0, res.messages.len()); let sender = address(1); let recipient = address(2); // Before + let api = deps.api; deps.with_storage(|storage| { - assert_eq!(get_balance(&deps.api, storage, &sender), 11); - assert_eq!(get_balance(&deps.api, storage, &recipient), 22); - }); + assert_eq!(get_balance(&api, storage, &sender), 11); + assert_eq!(get_balance(&api, storage, &recipient), 22); + Ok(()) + }) + .unwrap(); // Transfer let transfer_msg = HandleMsg::Transfer { @@ -172,10 +180,10 @@ fn transfer_works() { amount: "1".to_string(), }; let env2 = mock_env_height(&deps.api, &sender, 877, 0); - let transfer_result = handle(&mut deps, env2, transfer_msg).unwrap(); - assert_eq!(transfer_result.messages.len(), 0); + let transfer_response: HandleResponse = handle(&mut deps, env2, transfer_msg).unwrap(); + assert_eq!(transfer_response.messages.len(), 0); assert_eq!( - transfer_result.log, + transfer_response.log, vec![ log("action", "transfer"), log("sender", sender.as_str()), @@ -185,26 +193,31 @@ fn transfer_works() { // After deps.with_storage(|storage| { - assert_eq!(get_balance(&deps.api, storage, &sender), 10); - assert_eq!(get_balance(&deps.api, storage, &recipient), 23); - }); + assert_eq!(get_balance(&api, storage, &sender), 10); + assert_eq!(get_balance(&api, storage, &recipient), 23); + Ok(()) + }) + .unwrap(); } #[test] fn approve_works() { - let mut deps = mock_instance(WASM); + let mut deps = mock_instance(WASM, &[]); let init_msg = init_msg(); let env1 = mock_env_height(&deps.api, &address(0), 876, 0); - let res = init(&mut deps, env1, init_msg).unwrap(); + let res: InitResponse = init(&mut deps, env1, init_msg).unwrap(); assert_eq!(0, res.messages.len()); let owner = address(1); let spender = address(2); // Before + let api = deps.api; deps.with_storage(|storage| { - assert_eq!(get_allowance(&deps.api, storage, &owner, &spender), 0); - }); + assert_eq!(get_allowance(&api, storage, &owner, &spender), 0); + Ok(()) + }) + .unwrap(); // Approve let approve_msg = HandleMsg::Approve { @@ -212,10 +225,10 @@ fn approve_works() { amount: "42".to_string(), }; let env2 = mock_env_height(&deps.api, &owner, 877, 0); - let approve_result = handle(&mut deps, env2, approve_msg).unwrap(); - assert_eq!(approve_result.messages.len(), 0); + let approve_response: HandleResponse = handle(&mut deps, env2, approve_msg).unwrap(); + assert_eq!(approve_response.messages.len(), 0); assert_eq!( - approve_result.log, + approve_response.log, vec![ log("action", "approve"), log("owner", owner.as_str()), @@ -225,16 +238,18 @@ fn approve_works() { // After deps.with_storage(|storage| { - assert_eq!(get_allowance(&deps.api, storage, &owner, &spender), 42); - }); + assert_eq!(get_allowance(&api, storage, &owner, &spender), 42); + Ok(()) + }) + .unwrap(); } #[test] fn transfer_from_works() { - let mut deps = mock_instance(WASM); + let mut deps = mock_instance(WASM, &[]); let init_msg = init_msg(); let env1 = mock_env_height(&deps.api, &address(0), 876, 0); - let res = init(&mut deps, env1, init_msg).unwrap(); + let res: InitResponse = init(&mut deps, env1, init_msg).unwrap(); assert_eq!(0, res.messages.len()); let owner = address(1); @@ -242,11 +257,14 @@ fn transfer_from_works() { let recipient = address(3); // Before + let api = deps.api; deps.with_storage(|storage| { - assert_eq!(get_balance(&deps.api, storage, &owner), 11); - assert_eq!(get_balance(&deps.api, storage, &recipient), 33); - assert_eq!(get_allowance(&deps.api, storage, &owner, &spender), 0); - }); + assert_eq!(get_balance(&api, storage, &owner), 11); + assert_eq!(get_balance(&api, storage, &recipient), 33); + assert_eq!(get_allowance(&api, storage, &owner, &spender), 0); + Ok(()) + }) + .unwrap(); // Approve let approve_msg = HandleMsg::Approve { @@ -254,10 +272,10 @@ fn transfer_from_works() { amount: "42".to_string(), }; let env2 = mock_env_height(&deps.api, &owner, 877, 0); - let approve_result = handle(&mut deps, env2, approve_msg).unwrap(); - assert_eq!(approve_result.messages.len(), 0); + let approve_response: HandleResponse = handle(&mut deps, env2, approve_msg).unwrap(); + assert_eq!(approve_response.messages.len(), 0); assert_eq!( - approve_result.log, + approve_response.log, vec![ log("action", "approve"), log("owner", owner.as_str()), @@ -272,10 +290,11 @@ fn transfer_from_works() { amount: "2".to_string(), }; let env3 = mock_env_height(&deps.api, &spender, 878, 0); - let transfer_from_result = handle(&mut deps, env3, transfer_from_msg).unwrap(); - assert_eq!(transfer_from_result.messages.len(), 0); + let transfer_from_response: HandleResponse = + handle(&mut deps, env3, transfer_from_msg).unwrap(); + assert_eq!(transfer_from_response.messages.len(), 0); assert_eq!( - transfer_from_result.log, + transfer_from_response.log, vec![ log("action", "transfer_from"), log("spender", spender.as_str()), @@ -286,36 +305,41 @@ fn transfer_from_works() { // After deps.with_storage(|storage| { - assert_eq!(get_balance(&deps.api, storage, &owner), 9); - assert_eq!(get_balance(&deps.api, storage, &recipient), 35); - assert_eq!(get_allowance(&deps.api, storage, &owner, &spender), 40); - }); + assert_eq!(get_balance(&api, storage, &owner), 9); + assert_eq!(get_balance(&api, storage, &recipient), 35); + assert_eq!(get_allowance(&api, storage, &owner, &spender), 40); + Ok(()) + }) + .unwrap(); } #[test] fn burn_works() { - let mut deps = mock_instance(WASM); + let mut deps = mock_instance(WASM, &[]); let init_msg = init_msg(); let env1 = mock_env_height(&deps.api, &address(0), 876, 0); - let res = init(&mut deps, env1, init_msg).unwrap(); + let res: InitResponse = init(&mut deps, env1, init_msg).unwrap(); assert_eq!(0, res.messages.len()); let owner = address(1); // Before + let api = deps.api; deps.with_storage(|storage| { - assert_eq!(get_balance(&deps.api, storage, &owner), 11); - }); + assert_eq!(get_balance(&api, storage, &owner), 11); + Ok(()) + }) + .unwrap(); // Burn let burn_msg = HandleMsg::Burn { amount: "1".to_string(), }; let env2 = mock_env_height(&deps.api, &owner, 877, 0); - let burn_result = handle(&mut deps, env2, burn_msg).unwrap(); - assert_eq!(burn_result.messages.len(), 0); + let burn_response: HandleResponse = handle(&mut deps, env2, burn_msg).unwrap(); + assert_eq!(burn_response.messages.len(), 0); assert_eq!( - burn_result.log, + burn_response.log, vec![ log("action", "burn"), log("account", owner.as_str()), @@ -325,16 +349,18 @@ fn burn_works() { // After deps.with_storage(|storage| { - assert_eq!(get_balance(&deps.api, storage, &owner), 10); - }); + assert_eq!(get_balance(&api, storage, &owner), 10); + Ok(()) + }) + .unwrap(); } #[test] fn can_query_balance_of_existing_address() { - let mut deps = mock_instance(WASM); + let mut deps = mock_instance(WASM, &[]); let init_msg = init_msg(); let env1 = mock_env_height(&deps.api, &address(0), 450, 550); - let res = init(&mut deps, env1, init_msg).unwrap(); + let res: InitResponse = init(&mut deps, env1, init_msg).unwrap(); assert_eq!(0, res.messages.len()); let query_msg = QueryMsg::Balance { From 1ce1ff37bd092a3793964b576ffaa7e87e363628 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Sat, 16 May 2020 12:09:33 +0200 Subject: [PATCH 2/6] Update erc20 schema generator --- erc20/Cargo.lock | 12 +++++++++++- erc20/Cargo.toml | 2 +- erc20/examples/schema.rs | 32 +++----------------------------- 3 files changed, 15 insertions(+), 31 deletions(-) diff --git a/erc20/Cargo.lock b/erc20/Cargo.lock index b7379b17..c2488756 100644 --- a/erc20/Cargo.lock +++ b/erc20/Cargo.lock @@ -172,6 +172,16 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" +[[package]] +name = "cosmwasm-schema" +version = "0.8.0-alpha2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb3bb9a710324419d6d9857373068ec1f0b4441b68c1ab23ab111579d8c33309" +dependencies = [ + "schemars", + "serde_json", +] + [[package]] name = "cosmwasm-std" version = "0.8.0-alpha2" @@ -338,13 +348,13 @@ dependencies = [ name = "cw-erc20" version = "0.4.0-dev" dependencies = [ + "cosmwasm-schema", "cosmwasm-std", "cosmwasm-storage", "cosmwasm-vm", "hex", "schemars", "serde", - "serde_json", ] [[package]] diff --git a/erc20/Cargo.toml b/erc20/Cargo.toml index cbdf4b86..0b17c743 100644 --- a/erc20/Cargo.toml +++ b/erc20/Cargo.toml @@ -46,4 +46,4 @@ hex = "0.4" [dev-dependencies] cosmwasm-vm = { version = "0.8.0-alpha2", default-features = false } -serde_json = "1.0" +cosmwasm-schema = "0.8.0-alpha2" diff --git a/erc20/examples/schema.rs b/erc20/examples/schema.rs index d5596d9f..8c4131ef 100644 --- a/erc20/examples/schema.rs +++ b/erc20/examples/schema.rs @@ -1,8 +1,7 @@ use std::env::current_dir; -use std::fs::{create_dir_all, write}; -use std::path::PathBuf; +use std::fs::create_dir_all; -use schemars::{schema::RootSchema, schema_for}; +use cosmwasm_schema::{export_schema, remove_schemas, schema_for}; use cw_erc20::contract::Constants; use cw_erc20::msg::{AllowanceResponse, BalanceResponse, HandleMsg, InitMsg, QueryMsg}; @@ -11,6 +10,7 @@ fn main() { let mut out_dir = current_dir().unwrap(); out_dir.push("schema"); create_dir_all(&out_dir).unwrap(); + remove_schemas(&out_dir).unwrap(); export_schema(&schema_for!(InitMsg), &out_dir); export_schema(&schema_for!(HandleMsg), &out_dir); @@ -19,29 +19,3 @@ fn main() { export_schema(&schema_for!(AllowanceResponse), &out_dir); export_schema(&schema_for!(Constants), &out_dir); } - -/// Writes schema to file. Overwrites existing file. -/// Panics on any error writing out the schema. -fn export_schema(schema: &RootSchema, out_dir: &PathBuf) -> () { - let title = schema - .schema - .metadata - .as_ref() - .map(|b| b.title.clone().unwrap_or("untitled".to_string())) - .unwrap_or("unknown".to_string()); - let path = out_dir.join(format!("{}.json", to_snake_case(&title))); - let json = serde_json::to_string_pretty(schema).unwrap(); - write(&path, json + "\n").unwrap(); - println!("Created {}", path.to_str().unwrap()); -} - -fn to_snake_case(name: &str) -> String { - let mut out = String::new(); - for (index, ch) in name.char_indices() { - if index != 0 && ch.is_uppercase() { - out.push('_'); - } - out.push(ch.to_ascii_lowercase()); - } - out -} From ba1b0a3ce018b3347519c94a954f5e918124b252 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Sun, 17 May 2020 12:24:53 +0200 Subject: [PATCH 3/6] Update integration test header --- erc20/tests/integration.rs | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/erc20/tests/integration.rs b/erc20/tests/integration.rs index 7fb59e70..20bddaa8 100644 --- a/erc20/tests/integration.rs +++ b/erc20/tests/integration.rs @@ -2,12 +2,12 @@ //! It depends on a Wasm build being available, which you can create with `cargo wasm`. //! Then running `cargo integration-test` will validate we can properly call into that generated Wasm. //! -//! You can easily convert unit tests to integration tests. -//! 1. First copy them over verbatum, +//! You can easily convert unit tests to integration tests as follows: +//! 1. Copy them over verbatim //! 2. Then change -//! let mut deps = mock_dependencies(20); +//! let mut deps = mock_dependencies(20, &[]); //! to -//! let mut deps = mock_instance(WASM); +//! let mut deps = mock_instance(WASM, &[]); //! 3. If you access raw storage, where ever you see something like: //! deps.storage.get(CONFIG_KEY).expect("no data stored"); //! replace it with: @@ -16,16 +16,6 @@ //! //... //! }); //! 4. Anywhere you see query(&deps, ...) you must replace it with query(&mut deps, ...) -//! 5. When matching on error codes, you can not use Error types, but rather must use strings: -//! match res { -//! Err(Error::Unauthorized{..}) => {}, -//! _ => panic!("Must return unauthorized error"), -//! } -//! becomes: -//! match res { -//! ContractResult::Err(msg) => assert_eq!(msg, "Unauthorized"), -//! _ => panic!("Expected error"), -//! } use cosmwasm_std::testing::mock_env; use cosmwasm_std::{ From 6753c7320748d56a1ea3552b778897a3dcceebf2 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Fri, 22 May 2020 08:35:01 +0200 Subject: [PATCH 4/6] Update to 0.8.0-rc1 --- erc20/Cargo.lock | 16 +++++------ erc20/Cargo.toml | 8 +++--- erc20/tests/integration.rs | 56 ++++++++++++++++++++++++-------------- 3 files changed, 47 insertions(+), 33 deletions(-) diff --git a/erc20/Cargo.lock b/erc20/Cargo.lock index c2488756..2b1ad607 100644 --- a/erc20/Cargo.lock +++ b/erc20/Cargo.lock @@ -174,9 +174,9 @@ checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" [[package]] name = "cosmwasm-schema" -version = "0.8.0-alpha2" +version = "0.8.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb3bb9a710324419d6d9857373068ec1f0b4441b68c1ab23ab111579d8c33309" +checksum = "2febfb3831ea768472073dc22f6d09b8c6626584645bc0d843f91b92ee39658c" dependencies = [ "schemars", "serde_json", @@ -184,9 +184,9 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.8.0-alpha2" +version = "0.8.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5d326cb2c18d14067f42333d214ff4bca6cff8679b406815e7cd1730f79c052" +checksum = "252a12bf8b58e7d350b3752fb065deec13b32f5d11e1734d15205cf5b73d734f" dependencies = [ "base64", "schemars", @@ -197,9 +197,9 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.8.0-alpha2" +version = "0.8.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0da5ae8f0fc264d228807e74373102b6e3c835ebfcb9a963ea2232d2c5ca5566" +checksum = "c4c4aa4d4a8d544aaacb45c5dce7928ab0c5261a05a2cd60fab3274fe3ad3e4e" dependencies = [ "cosmwasm-std", "serde", @@ -207,9 +207,9 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.8.0-alpha2" +version = "0.8.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f033bfd6112962eff6a5d66783ba1fd156f9add1fb51173c6e089861d18e8ca" +checksum = "a217eae9084d17e5ddf241fbd20e9156e0faea91b32a2c26b44cb6987d874683" dependencies = [ "cosmwasm-std", "hex", diff --git a/erc20/Cargo.toml b/erc20/Cargo.toml index 0b17c743..6d4974ca 100644 --- a/erc20/Cargo.toml +++ b/erc20/Cargo.toml @@ -38,12 +38,12 @@ cranelift = ["cosmwasm-vm/default-cranelift"] singlepass = ["cosmwasm-vm/default-singlepass"] [dependencies] -cosmwasm-std = "0.8.0-alpha2" -cosmwasm-storage = "0.8.0-alpha2" +cosmwasm-std = "0.8.0-rc1" +cosmwasm-storage = "0.8.0-rc1" schemars = "0.7" serde = { version = "1.0.103", default-features = false, features = ["derive"] } hex = "0.4" [dev-dependencies] -cosmwasm-vm = { version = "0.8.0-alpha2", default-features = false } -cosmwasm-schema = "0.8.0-alpha2" +cosmwasm-vm = { version = "0.8.0-rc1", default-features = false } +cosmwasm-schema = "0.8.0-rc1" diff --git a/erc20/tests/integration.rs b/erc20/tests/integration.rs index 20bddaa8..24a90f17 100644 --- a/erc20/tests/integration.rs +++ b/erc20/tests/integration.rs @@ -17,16 +17,14 @@ //! }); //! 4. Anywhere you see query(&deps, ...) you must replace it with query(&mut deps, ...) -use cosmwasm_std::testing::mock_env; -use cosmwasm_std::{ - from_slice, log, Api, Env, HandleResponse, HumanAddr, InitResponse, ReadonlyStorage, Storage, -}; -use cosmwasm_storage::ReadonlyPrefixedStorage; -use cosmwasm_vm::testing::{handle, init, mock_instance, query}; +use cosmwasm_std::{from_slice, log, Env, HandleResponse, HumanAddr, InitResponse}; +use cosmwasm_storage::{to_length_prefixed, to_length_prefixed_nested}; +use cosmwasm_vm::testing::{handle, init, mock_env, mock_instance, query}; +use cosmwasm_vm::{Api, ReadonlyStorage, Storage}; use cw_erc20::contract::{ - bytes_to_u128, read_u128, Constants, KEY_CONSTANTS, KEY_TOTAL_SUPPLY, PREFIX_ALLOWANCES, - PREFIX_BALANCES, PREFIX_CONFIG, + bytes_to_u128, Constants, KEY_CONSTANTS, KEY_TOTAL_SUPPLY, PREFIX_ALLOWANCES, PREFIX_BALANCES, + PREFIX_CONFIG, }; use cw_erc20::msg::{HandleMsg, InitMsg, InitialBalance, QueryMsg}; @@ -40,29 +38,33 @@ fn mock_env_height(api: &A, signer: &HumanAddr, height: u64, time: u64) } fn get_constants(storage: &S) -> Constants { - let config_storage = ReadonlyPrefixedStorage::new(PREFIX_CONFIG, storage); - let data = config_storage - .get(KEY_CONSTANTS) + let key = [&to_length_prefixed(PREFIX_CONFIG), KEY_CONSTANTS].concat(); + let data = storage + .get(&key) .expect("error getting data") .expect("no config data stored"); from_slice(&data).expect("invalid data") } fn get_total_supply(storage: &S) -> u128 { - let config_storage = ReadonlyPrefixedStorage::new(PREFIX_CONFIG, storage); - let data = config_storage - .get(KEY_TOTAL_SUPPLY) + let key = [&to_length_prefixed(PREFIX_CONFIG), KEY_TOTAL_SUPPLY].concat(); + let data = storage + .get(&key) .expect("error getting data") .expect("no decimals data stored"); - return bytes_to_u128(&data).unwrap(); + bytes_to_u128(&data).unwrap() } fn get_balance(api: &A, storage: &S, address: &HumanAddr) -> u128 { let address_key = api .canonical_address(address) .expect("canonical_address failed"); - let balances_storage = ReadonlyPrefixedStorage::new(PREFIX_BALANCES, storage); - return read_u128(&balances_storage, address_key.as_slice()).unwrap(); + let key = [ + &to_length_prefixed(&PREFIX_BALANCES), + address_key.as_slice(), + ] + .concat(); + read_u128(storage, &key) } fn get_allowance( @@ -77,10 +79,22 @@ fn get_allowance( let spender_raw_address = api .canonical_address(spender) .expect("canonical_address failed"); - let allowances_storage = ReadonlyPrefixedStorage::new(PREFIX_ALLOWANCES, storage); - let owner_storage = - ReadonlyPrefixedStorage::new(owner_raw_address.as_slice(), &allowances_storage); - return read_u128(&owner_storage, spender_raw_address.as_slice()).unwrap(); + let key = [ + &to_length_prefixed_nested(&[PREFIX_ALLOWANCES, owner_raw_address.as_slice()]), + spender_raw_address.as_slice(), + ] + .concat(); + return read_u128(storage, &key); +} + +// Reads 16 byte storage value into u128 +// Returns zero if key does not exist. Errors if data found that is not 16 bytes +fn read_u128(store: &S, key: &[u8]) -> u128 { + let result = store.get(key).unwrap(); + match result { + Some(data) => bytes_to_u128(&data).unwrap(), + None => 0u128, + } } fn address(index: u8) -> HumanAddr { From 3e68ffe4ce69b4085d25703800ab8f42a81ced15 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 25 May 2020 09:08:37 +0200 Subject: [PATCH 5/6] Use type Uint128 in public interface --- erc20/schema/allowance_response.json | 5 + erc20/schema/balance_response.json | 5 + erc20/schema/handle_msg.json | 11 +- erc20/schema/init_msg.json | 5 +- erc20/src/contract.rs | 35 ++--- erc20/src/msg.rs | 16 +-- erc20/src/tests.rs | 185 ++++++--------------------- erc20/tests/integration.rs | 18 +-- 8 files changed, 92 insertions(+), 188 deletions(-) diff --git a/erc20/schema/allowance_response.json b/erc20/schema/allowance_response.json index 91a8c1b7..547ecad3 100644 --- a/erc20/schema/allowance_response.json +++ b/erc20/schema/allowance_response.json @@ -7,6 +7,11 @@ ], "properties": { "allowance": { + "$ref": "#/definitions/Uint128" + } + }, + "definitions": { + "Uint128": { "type": "string" } } diff --git a/erc20/schema/balance_response.json b/erc20/schema/balance_response.json index 3995a8dc..efa5d6ce 100644 --- a/erc20/schema/balance_response.json +++ b/erc20/schema/balance_response.json @@ -7,6 +7,11 @@ ], "properties": { "balance": { + "$ref": "#/definitions/Uint128" + } + }, + "definitions": { + "Uint128": { "type": "string" } } diff --git a/erc20/schema/handle_msg.json b/erc20/schema/handle_msg.json index 9820d673..68f0758f 100644 --- a/erc20/schema/handle_msg.json +++ b/erc20/schema/handle_msg.json @@ -16,7 +16,7 @@ ], "properties": { "amount": { - "type": "string" + "$ref": "#/definitions/Uint128" }, "spender": { "$ref": "#/definitions/HumanAddr" @@ -39,7 +39,7 @@ ], "properties": { "amount": { - "type": "string" + "$ref": "#/definitions/Uint128" }, "recipient": { "$ref": "#/definitions/HumanAddr" @@ -63,7 +63,7 @@ ], "properties": { "amount": { - "type": "string" + "$ref": "#/definitions/Uint128" }, "owner": { "$ref": "#/definitions/HumanAddr" @@ -88,7 +88,7 @@ ], "properties": { "amount": { - "type": "string" + "$ref": "#/definitions/Uint128" } } } @@ -98,6 +98,9 @@ "definitions": { "HumanAddr": { "type": "string" + }, + "Uint128": { + "type": "string" } } } diff --git a/erc20/schema/init_msg.json b/erc20/schema/init_msg.json index 4207d0b8..9ef702fd 100644 --- a/erc20/schema/init_msg.json +++ b/erc20/schema/init_msg.json @@ -42,9 +42,12 @@ "$ref": "#/definitions/HumanAddr" }, "amount": { - "type": "string" + "$ref": "#/definitions/Uint128" } } + }, + "Uint128": { + "type": "string" } } } diff --git a/erc20/src/contract.rs b/erc20/src/contract.rs index fe668991..3a628623 100644 --- a/erc20/src/contract.rs +++ b/erc20/src/contract.rs @@ -5,7 +5,7 @@ use std::convert::TryInto; use crate::msg::{AllowanceResponse, BalanceResponse, HandleMsg, InitMsg, QueryMsg}; use cosmwasm_std::{ generic_err, log, to_binary, to_vec, Api, Binary, CanonicalAddr, Env, Extern, HandleResponse, - HumanAddr, InitResponse, Querier, ReadonlyStorage, StdResult, Storage, + HumanAddr, InitResponse, Querier, ReadonlyStorage, StdResult, Storage, Uint128, }; use cosmwasm_storage::{PrefixedStorage, ReadonlyPrefixedStorage}; @@ -34,7 +34,7 @@ pub fn init( let mut balances_store = PrefixedStorage::new(PREFIX_BALANCES, &mut deps.storage); for row in msg.initial_balances { let raw_address = deps.api.canonical_address(&row.address)?; - let amount_raw = parse_u128(&row.amount)?; + let amount_raw = row.amount.u128(); balances_store.set(raw_address.as_slice(), &amount_raw.to_be_bytes())?; total_supply += amount_raw; } @@ -93,7 +93,7 @@ pub fn query( let address_key = deps.api.canonical_address(&address)?; let balance = read_balance(&deps.storage, &address_key)?; let out = to_binary(&BalanceResponse { - balance: balance.to_string(), + balance: Uint128::from(balance), })?; Ok(out) } @@ -102,7 +102,7 @@ pub fn query( let spender_key = deps.api.canonical_address(&spender)?; let allowance = read_allowance(&deps.storage, &owner_key, &spender_key)?; let out = to_binary(&AllowanceResponse { - allowance: allowance.to_string(), + allowance: Uint128::from(allowance), })?; Ok(out) } @@ -113,11 +113,11 @@ fn try_transfer( deps: &mut Extern, env: Env, recipient: &HumanAddr, - amount: &str, + amount: &Uint128, ) -> StdResult { let sender_address_raw = &env.message.sender; let recipient_address_raw = deps.api.canonical_address(recipient)?; - let amount_raw = parse_u128(amount)?; + let amount_raw = amount.u128(); perform_transfer( &mut deps.storage, @@ -146,12 +146,12 @@ fn try_transfer_from( env: Env, owner: &HumanAddr, recipient: &HumanAddr, - amount: &str, + amount: &Uint128, ) -> StdResult { let spender_address_raw = &env.message.sender; let owner_address_raw = deps.api.canonical_address(owner)?; let recipient_address_raw = deps.api.canonical_address(recipient)?; - let amount_raw = parse_u128(amount)?; + let amount_raw = amount.u128(); let mut allowance = read_allowance(&deps.storage, &owner_address_raw, &spender_address_raw)?; if allowance < amount_raw { @@ -194,16 +194,15 @@ fn try_approve( deps: &mut Extern, env: Env, spender: &HumanAddr, - amount: &str, + amount: &Uint128, ) -> StdResult { let owner_address_raw = &env.message.sender; let spender_address_raw = deps.api.canonical_address(spender)?; - let amount_raw = parse_u128(amount)?; write_allowance( &mut deps.storage, &owner_address_raw, &spender_address_raw, - amount_raw, + amount.u128(), )?; let res = HandleResponse { messages: vec![], @@ -228,10 +227,10 @@ fn try_approve( fn try_burn( deps: &mut Extern, env: Env, - amount: &str, + amount: &Uint128, ) -> StdResult { let owner_address_raw = &env.message.sender; - let amount_raw = parse_u128(amount)?; + let amount_raw = amount.u128(); let mut account_balance = read_balance(&deps.storage, owner_address_raw)?; @@ -265,7 +264,7 @@ fn try_burn( "account", deps.api.human_address(&env.message.sender)?.as_str(), ), - log("amount", amount), + log("amount", &amount.to_string()), ], data: None, }; @@ -317,14 +316,6 @@ pub fn read_u128(store: &S, key: &[u8]) -> StdResult { } } -// Source must be a decadic integer >= 0 -pub fn parse_u128(source: &str) -> StdResult { - match source.parse::() { - Ok(value) => Ok(value), - Err(_) => Err(generic_err("Error while parsing string to u128")), - } -} - fn read_balance(store: &S, owner: &CanonicalAddr) -> StdResult { let balance_store = ReadonlyPrefixedStorage::new(PREFIX_BALANCES, store); read_u128(&balance_store, owner.as_slice()) diff --git a/erc20/src/msg.rs b/erc20/src/msg.rs index 04cf07fb..845ad9e1 100644 --- a/erc20/src/msg.rs +++ b/erc20/src/msg.rs @@ -1,12 +1,12 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use cosmwasm_std::HumanAddr; +use cosmwasm_std::{HumanAddr, Uint128}; #[derive(Serialize, Deserialize, Clone, PartialEq, JsonSchema)] pub struct InitialBalance { pub address: HumanAddr, - pub amount: String, + pub amount: Uint128, } #[derive(Serialize, Deserialize, JsonSchema)] @@ -22,19 +22,19 @@ pub struct InitMsg { pub enum HandleMsg { Approve { spender: HumanAddr, - amount: String, + amount: Uint128, }, Transfer { recipient: HumanAddr, - amount: String, + amount: Uint128, }, TransferFrom { owner: HumanAddr, recipient: HumanAddr, - amount: String, + amount: Uint128, }, Burn { - amount: String, + amount: Uint128, }, } @@ -52,10 +52,10 @@ pub enum QueryMsg { #[derive(Serialize, Deserialize, Clone, PartialEq, JsonSchema)] pub struct BalanceResponse { - pub balance: String, + pub balance: Uint128, } #[derive(Serialize, Deserialize, Clone, PartialEq, JsonSchema)] pub struct AllowanceResponse { - pub allowance: String, + pub allowance: Uint128, } diff --git a/erc20/src/tests.rs b/erc20/src/tests.rs index d415285f..94f50922 100644 --- a/erc20/src/tests.rs +++ b/erc20/src/tests.rs @@ -1,5 +1,7 @@ use cosmwasm_std::testing::{mock_dependencies, mock_env}; -use cosmwasm_std::{from_slice, log, Api, Env, HumanAddr, ReadonlyStorage, StdError, Storage}; +use cosmwasm_std::{ + from_slice, log, Api, Env, HumanAddr, ReadonlyStorage, StdError, Storage, Uint128, +}; use cosmwasm_storage::ReadonlyPrefixedStorage; use crate::contract::{ @@ -61,86 +63,6 @@ fn get_allowance( return read_u128(&owner_storage, spender_raw_address.as_slice()).unwrap(); } -mod helpers { - use super::*; - use crate::contract::parse_u128; - - #[test] - fn works_for_simple_inputs() { - assert_eq!(parse_u128("0").expect("could not be parsed"), 0); - assert_eq!(parse_u128("1").expect("could not be parsed"), 1); - assert_eq!(parse_u128("345").expect("could not be parsed"), 345); - assert_eq!( - parse_u128("340282366920938463463374607431768211455").expect("could not be parsed"), - 340282366920938463463374607431768211455 - ); - } - - #[test] - fn works_for_leading_zeros() { - assert_eq!(parse_u128("01").expect("could not be parsed"), 1); - assert_eq!(parse_u128("001").expect("could not be parsed"), 1); - assert_eq!(parse_u128("0001").expect("could not be parsed"), 1); - } - - #[test] - fn errors_for_empty_input() { - match parse_u128("") { - Ok(_) => panic!("must not pass"), - Err(StdError::GenericErr { msg, .. }) => { - assert_eq!(msg, "Error while parsing string to u128") - } - Err(e) => panic!("unexpected error: {:?}", e), - } - } - - #[test] - fn errors_for_values_out_of_range() { - match parse_u128("-1") { - Ok(_) => panic!("must not pass"), - Err(StdError::GenericErr { msg, .. }) => { - assert_eq!(msg, "Error while parsing string to u128") - } - Err(e) => panic!("unexpected error: {:?}", e), - } - - match parse_u128("340282366920938463463374607431768211456") { - Ok(_) => panic!("must not pass"), - Err(StdError::GenericErr { msg, .. }) => { - assert_eq!(msg, "Error while parsing string to u128") - } - Err(e) => panic!("unexpected error: {:?}", e), - } - } - - #[test] - fn fails_for_non_decadic_strings() { - match parse_u128("0xAB") { - Ok(_) => panic!("must not pass"), - Err(StdError::GenericErr { msg, .. }) => { - assert_eq!(msg, "Error while parsing string to u128") - } - Err(e) => panic!("unexpected error: {:?}", e), - } - - match parse_u128("0xab") { - Ok(_) => panic!("must not pass"), - Err(StdError::GenericErr { msg, .. }) => { - assert_eq!(msg, "Error while parsing string to u128") - } - Err(e) => panic!("unexpected error: {:?}", e), - } - - match parse_u128("0b1100") { - Ok(_) => panic!("must not pass"), - Err(StdError::GenericErr { msg, .. }) => { - assert_eq!(msg, "Error while parsing string to u128") - } - Err(e) => panic!("unexpected error: {:?}", e), - } - } -} - mod init { use super::*; @@ -153,7 +75,7 @@ mod init { decimals: 9, initial_balances: [InitialBalance { address: HumanAddr("addr0000".to_string()), - amount: "11223344".to_string(), + amount: Uint128::from(11223344u128), }] .to_vec(), }; @@ -202,15 +124,15 @@ mod init { initial_balances: [ InitialBalance { address: HumanAddr("addr0000".to_string()), - amount: "11".to_string(), + amount: Uint128::from(11u128), }, InitialBalance { address: HumanAddr("addr1111".to_string()), - amount: "22".to_string(), + amount: Uint128::from(22u128), }, InitialBalance { address: HumanAddr("addrbbbb".to_string()), - amount: "33".to_string(), + amount: Uint128::from(33u128), }, ] .to_vec(), @@ -248,7 +170,7 @@ mod init { decimals: 9, initial_balances: [InitialBalance { address: HumanAddr("addr0000".to_string()), - amount: "9007199254740993".to_string(), + amount: Uint128::from(9007199254740993u128), }] .to_vec(), }; @@ -274,7 +196,7 @@ mod init { decimals: 9, initial_balances: [InitialBalance { address: HumanAddr("addr0000".to_string()), - amount: "100000000000000000000000000".to_string(), + amount: Uint128::from(100000000000000000000000000u128), }] .to_vec(), }; @@ -289,31 +211,6 @@ mod init { assert_eq!(get_total_supply(&deps.storage), 100000000000000000000000000); } - #[test] - fn fails_for_balance_larger_than_max_u128() { - let mut deps = mock_dependencies(CANONICAL_LENGTH, &[]); - let init_msg = InitMsg { - name: "Cash Token".to_string(), - symbol: "CASH".to_string(), - decimals: 9, - initial_balances: [InitialBalance { - address: HumanAddr("addr0000".to_string()), - // 2**128 = 340282366920938463463374607431768211456 - amount: "340282366920938463463374607431768211456".to_string(), - }] - .to_vec(), - }; - let env = mock_env_height(&deps.api, &HumanAddr("creator".to_string()), 450, 550); - let result = init(&mut deps, env, init_msg); - match result { - Ok(_) => panic!("expected error"), - Err(StdError::GenericErr { msg, .. }) => { - assert_eq!(msg, "Error while parsing string to u128") - } - Err(e) => panic!("unexpected error: {:?}", e), - } - } - #[test] fn fails_for_large_decimals() { let mut deps = mock_dependencies(CANONICAL_LENGTH, &[]); @@ -444,15 +341,15 @@ mod transfer { initial_balances: vec![ InitialBalance { address: HumanAddr("addr0000".to_string()), - amount: "11".to_string(), + amount: Uint128::from(11u128), }, InitialBalance { address: HumanAddr("addr1111".to_string()), - amount: "22".to_string(), + amount: Uint128::from(22u128), }, InitialBalance { address: HumanAddr("addrbbbb".to_string()), - amount: "33".to_string(), + amount: Uint128::from(33u128), }, ], } @@ -484,7 +381,7 @@ mod transfer { // Transfer let transfer_msg = HandleMsg::Transfer { recipient: HumanAddr("addr1111".to_string()), - amount: "1".to_string(), + amount: Uint128::from(1u128), }; let env2 = mock_env_height(&deps.api, &HumanAddr("addr0000".to_string()), 450, 550); let transfer_result = handle(&mut deps, env2, transfer_msg).unwrap(); @@ -540,7 +437,7 @@ mod transfer { // Transfer let transfer_msg = HandleMsg::Transfer { recipient: HumanAddr("addr2323".to_string()), - amount: "1".to_string(), + amount: Uint128::from(1u128), }; let env2 = mock_env_height(&deps.api, &HumanAddr("addr0000".to_string()), 450, 550); let transfer_result = handle(&mut deps, env2, transfer_msg).unwrap(); @@ -600,7 +497,7 @@ mod transfer { // Transfer let transfer_msg = HandleMsg::Transfer { recipient: HumanAddr("addr1111".to_string()), - amount: "0".to_string(), + amount: Uint128::from(0u128), }; let env2 = mock_env_height(&deps.api, &HumanAddr("addr0000".to_string()), 450, 550); let transfer_result = handle(&mut deps, env2, transfer_msg).unwrap(); @@ -646,7 +543,7 @@ mod transfer { // Transfer let transfer_msg = HandleMsg::Transfer { recipient: sender.clone(), - amount: "3".to_string(), + amount: Uint128::from(3u128), }; let env2 = mock_env_height(&deps.api, &sender, 450, 550); let transfer_result = handle(&mut deps, env2, transfer_msg).unwrap(); @@ -690,7 +587,7 @@ mod transfer { // Transfer let transfer_msg = HandleMsg::Transfer { recipient: HumanAddr("addr1111".to_string()), - amount: "12".to_string(), + amount: Uint128::from(12u128), }; let env2 = mock_env_height(&deps.api, &HumanAddr("addr0000".to_string()), 450, 550); let transfer_result = handle(&mut deps, env2, transfer_msg); @@ -730,15 +627,15 @@ mod approve { initial_balances: vec![ InitialBalance { address: HumanAddr("addr0000".to_string()), - amount: "11".to_string(), + amount: Uint128::from(11u128), }, InitialBalance { address: HumanAddr("addr1111".to_string()), - amount: "22".to_string(), + amount: Uint128::from(22u128), }, InitialBalance { address: HumanAddr("addrbbbb".to_string()), - amount: "33".to_string(), + amount: Uint128::from(33u128), }, ], } @@ -802,7 +699,7 @@ mod approve { let spender = make_spender(); let approve_msg1 = HandleMsg::Approve { spender: spender.clone(), - amount: "334422".to_string(), + amount: Uint128::from(334422u128), }; let env2 = mock_env_height(&deps.api, &owner, 450, 550); let approve_result1 = handle(&mut deps, env2, approve_msg1).unwrap(); @@ -824,7 +721,7 @@ mod approve { // Updated approval let approve_msg2 = HandleMsg::Approve { spender: spender.clone(), - amount: "777888".to_string(), + amount: Uint128::from(777888u128), }; let env3 = mock_env_height(&deps.api, &owner, 450, 550); let approve_result2 = handle(&mut deps, env3, approve_msg2).unwrap(); @@ -856,15 +753,15 @@ mod transfer_from { initial_balances: vec![ InitialBalance { address: HumanAddr("addr0000".to_string()), - amount: "11".to_string(), + amount: Uint128::from(11u128), }, InitialBalance { address: HumanAddr("addr1111".to_string()), - amount: "22".to_string(), + amount: Uint128::from(22u128), }, InitialBalance { address: HumanAddr("addrbbbb".to_string()), - amount: "33".to_string(), + amount: Uint128::from(33u128), }, ], } @@ -889,7 +786,7 @@ mod transfer_from { // Set approval let approve_msg = HandleMsg::Approve { spender: spender.clone(), - amount: "4".to_string(), + amount: Uint128::from(4u128), }; let env2 = mock_env_height(&deps.api, &owner, 450, 550); let approve_result = handle(&mut deps, env2, approve_msg).unwrap(); @@ -910,7 +807,7 @@ mod transfer_from { let transfer_from_msg = HandleMsg::TransferFrom { owner: owner.clone(), recipient: recipient.clone(), - amount: "3".to_string(), + amount: Uint128::from(3u128), }; let env3 = mock_env_height(&deps.api, &spender, 450, 550); let transfer_from_result = handle(&mut deps, env3, transfer_from_msg).unwrap(); @@ -945,7 +842,7 @@ mod transfer_from { // Set approval let approve_msg = HandleMsg::Approve { spender: spender.clone(), - amount: "2".to_string(), + amount: Uint128::from(2u128), }; let env2 = mock_env_height(&deps.api, &owner, 450, 550); let approve_result = handle(&mut deps, env2, approve_msg).unwrap(); @@ -966,7 +863,7 @@ mod transfer_from { let fransfer_from_msg = HandleMsg::TransferFrom { owner: owner.clone(), recipient: recipient.clone(), - amount: "3".to_string(), + amount: Uint128::from(3u128), }; let env3 = mock_env_height(&deps.api, &spender, 450, 550); let transfer_result = handle(&mut deps, env3, fransfer_from_msg); @@ -994,7 +891,7 @@ mod transfer_from { // Set approval let approve_msg = HandleMsg::Approve { spender: spender.clone(), - amount: "20".to_string(), + amount: Uint128::from(20u128), }; let env2 = mock_env_height(&deps.api, &owner, 450, 550); let approve_result = handle(&mut deps, env2, approve_msg).unwrap(); @@ -1018,7 +915,7 @@ mod transfer_from { let fransfer_from_msg = HandleMsg::TransferFrom { owner: owner.clone(), recipient: recipient.clone(), - amount: "15".to_string(), + amount: Uint128::from(15u128), }; let env3 = mock_env_height(&deps.api, &spender, 450, 550); let transfer_result = handle(&mut deps, env3, fransfer_from_msg); @@ -1043,11 +940,11 @@ mod burn { initial_balances: vec![ InitialBalance { address: HumanAddr("addr0000".to_string()), - amount: "11".to_string(), + amount: Uint128::from(11u128), }, InitialBalance { address: HumanAddr("addr1111".to_string()), - amount: "22".to_string(), + amount: Uint128::from(22u128), }, ], } @@ -1074,7 +971,7 @@ mod burn { // Burn let burn_msg = HandleMsg::Burn { - amount: "1".to_string(), + amount: Uint128::from(1u128), }; let env2 = mock_env_height(&deps.api, &HumanAddr("addr0000".to_string()), 450, 550); let burn_result = handle(&mut deps, env2, burn_msg).unwrap(); @@ -1121,7 +1018,7 @@ mod burn { // Burn let burn_msg = HandleMsg::Burn { - amount: "0".to_string(), + amount: Uint128::from(0u128), }; let env2 = mock_env_height(&deps.api, &HumanAddr("addr0000".to_string()), 450, 550); let burn_result = handle(&mut deps, env2, burn_msg).unwrap(); @@ -1168,7 +1065,7 @@ mod burn { // Burn let burn_msg = HandleMsg::Burn { - amount: "12".to_string(), + amount: Uint128::from(12u128), }; let env2 = mock_env_height(&deps.api, &HumanAddr("addr0000".to_string()), 450, 550); let burn_result = handle(&mut deps, env2, burn_msg); @@ -1215,15 +1112,15 @@ mod query { initial_balances: vec![ InitialBalance { address: address(1), - amount: "11".to_string(), + amount: Uint128::from(11u128), }, InitialBalance { address: address(2), - amount: "22".to_string(), + amount: Uint128::from(22u128), }, InitialBalance { address: address(3), - amount: "33".to_string(), + amount: Uint128::from(33u128), }, ], } @@ -1272,7 +1169,7 @@ mod query { let approve_msg = HandleMsg::Approve { spender: spender.clone(), - amount: "42".to_string(), + amount: Uint128::from(42u128), }; let env2 = mock_env_height(&deps.api, &owner, 450, 550); let action_result = handle(&mut deps, env2, approve_msg).unwrap(); @@ -1308,7 +1205,7 @@ mod query { let approve_msg = HandleMsg::Approve { spender: spender.clone(), - amount: "42".to_string(), + amount: Uint128::from(42u128), }; let env2 = mock_env_height(&deps.api, &owner, 450, 550); let approve_result = handle(&mut deps, env2, approve_msg).unwrap(); diff --git a/erc20/tests/integration.rs b/erc20/tests/integration.rs index 24a90f17..db469977 100644 --- a/erc20/tests/integration.rs +++ b/erc20/tests/integration.rs @@ -17,7 +17,7 @@ //! }); //! 4. Anywhere you see query(&deps, ...) you must replace it with query(&mut deps, ...) -use cosmwasm_std::{from_slice, log, Env, HandleResponse, HumanAddr, InitResponse}; +use cosmwasm_std::{from_slice, log, Env, HandleResponse, HumanAddr, InitResponse, Uint128}; use cosmwasm_storage::{to_length_prefixed, to_length_prefixed_nested}; use cosmwasm_vm::testing::{handle, init, mock_env, mock_instance, query}; use cosmwasm_vm::{Api, ReadonlyStorage, Storage}; @@ -115,15 +115,15 @@ fn init_msg() -> InitMsg { initial_balances: [ InitialBalance { address: address(1), - amount: "11".to_string(), + amount: Uint128::from(11u128), }, InitialBalance { address: address(2), - amount: "22".to_string(), + amount: Uint128::from(22u128), }, InitialBalance { address: address(3), - amount: "33".to_string(), + amount: Uint128::from(33u128), }, ] .to_vec(), @@ -181,7 +181,7 @@ fn transfer_works() { // Transfer let transfer_msg = HandleMsg::Transfer { recipient: recipient.clone(), - amount: "1".to_string(), + amount: Uint128::from(1u128), }; let env2 = mock_env_height(&deps.api, &sender, 877, 0); let transfer_response: HandleResponse = handle(&mut deps, env2, transfer_msg).unwrap(); @@ -226,7 +226,7 @@ fn approve_works() { // Approve let approve_msg = HandleMsg::Approve { spender: spender.clone(), - amount: "42".to_string(), + amount: Uint128::from(42u128), }; let env2 = mock_env_height(&deps.api, &owner, 877, 0); let approve_response: HandleResponse = handle(&mut deps, env2, approve_msg).unwrap(); @@ -273,7 +273,7 @@ fn transfer_from_works() { // Approve let approve_msg = HandleMsg::Approve { spender: spender.clone(), - amount: "42".to_string(), + amount: Uint128::from(42u128), }; let env2 = mock_env_height(&deps.api, &owner, 877, 0); let approve_response: HandleResponse = handle(&mut deps, env2, approve_msg).unwrap(); @@ -291,7 +291,7 @@ fn transfer_from_works() { let transfer_from_msg = HandleMsg::TransferFrom { owner: owner.clone(), recipient: recipient.clone(), - amount: "2".to_string(), + amount: Uint128::from(2u128), }; let env3 = mock_env_height(&deps.api, &spender, 878, 0); let transfer_from_response: HandleResponse = @@ -337,7 +337,7 @@ fn burn_works() { // Burn let burn_msg = HandleMsg::Burn { - amount: "1".to_string(), + amount: Uint128::from(1u128), }; let env2 = mock_env_height(&deps.api, &owner, 877, 0); let burn_response: HandleResponse = handle(&mut deps, env2, burn_msg).unwrap(); From ddd2157f7a7965e77596ee2d9d7ed3eaf802dd22 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 25 May 2020 10:35:49 +0200 Subject: [PATCH 6/6] Update to cosmwasm 0.8.0 --- erc20/Cargo.lock | 16 ++++++++-------- erc20/Cargo.toml | 8 ++++---- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/erc20/Cargo.lock b/erc20/Cargo.lock index 2b1ad607..53d46ccb 100644 --- a/erc20/Cargo.lock +++ b/erc20/Cargo.lock @@ -174,9 +174,9 @@ checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" [[package]] name = "cosmwasm-schema" -version = "0.8.0-rc1" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2febfb3831ea768472073dc22f6d09b8c6626584645bc0d843f91b92ee39658c" +checksum = "7d98582ce64a7b719cfcd1617f94e31f87745b1baa257fe93438ff5850f56296" dependencies = [ "schemars", "serde_json", @@ -184,9 +184,9 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.8.0-rc1" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "252a12bf8b58e7d350b3752fb065deec13b32f5d11e1734d15205cf5b73d734f" +checksum = "dc9d64e57bc553d50a164daae7494d0115e66c7b6deef2255bfefda4f49a8a55" dependencies = [ "base64", "schemars", @@ -197,9 +197,9 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.8.0-rc1" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4c4aa4d4a8d544aaacb45c5dce7928ab0c5261a05a2cd60fab3274fe3ad3e4e" +checksum = "e0f75e887c93eed12ef3be1759056ea1f23466065d58c899c5a40fc5f6fe4fe0" dependencies = [ "cosmwasm-std", "serde", @@ -207,9 +207,9 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.8.0-rc1" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a217eae9084d17e5ddf241fbd20e9156e0faea91b32a2c26b44cb6987d874683" +checksum = "c07cccf5bfb9e3959451a890b4b5f5e014eaf154334789b9e9bec26c26cf9f7d" dependencies = [ "cosmwasm-std", "hex", diff --git a/erc20/Cargo.toml b/erc20/Cargo.toml index 6d4974ca..708eaa5d 100644 --- a/erc20/Cargo.toml +++ b/erc20/Cargo.toml @@ -38,12 +38,12 @@ cranelift = ["cosmwasm-vm/default-cranelift"] singlepass = ["cosmwasm-vm/default-singlepass"] [dependencies] -cosmwasm-std = "0.8.0-rc1" -cosmwasm-storage = "0.8.0-rc1" +cosmwasm-std = "0.8.0" +cosmwasm-storage = "0.8.0" schemars = "0.7" serde = { version = "1.0.103", default-features = false, features = ["derive"] } hex = "0.4" [dev-dependencies] -cosmwasm-vm = { version = "0.8.0-rc1", default-features = false } -cosmwasm-schema = "0.8.0-rc1" +cosmwasm-vm = { version = "0.8.0", default-features = false } +cosmwasm-schema = "0.8.0"