From 4d558166b9881c83b2366f40a405cb3bfdd882bd Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Mon, 24 Aug 2020 22:02:11 +0200 Subject: [PATCH 1/8] Add query_list functionality / tests --- contracts/queue/Cargo.lock | 259 ++++++++++++++++----------- contracts/queue/Cargo.toml | 1 + contracts/queue/src/contract.rs | 39 +++- contracts/queue/tests/integration.rs | 12 +- 4 files changed, 203 insertions(+), 108 deletions(-) diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 5490255a96..87f420ae4e 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -1,5 +1,20 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +[[package]] +name = "addr2line" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b6a2d3371669ab3ca9797670853d61402b03d0b4b9ebf33d677dfa720203072" +dependencies = [ + "gimli 0.22.0", +] + +[[package]] +name = "adler" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e" + [[package]] name = "arrayref" version = "0.3.6" @@ -14,32 +29,24 @@ checksum = "cff77d8686867eceff3105329d4698d96c2391c176d5d03adc90c7389162b5b8" [[package]] name = "autocfg" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" +checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" [[package]] name = "backtrace" -version = "0.3.45" +version = "0.3.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad235dabf00f36301792cfe82499880ba54c6486be094d1047b02bacb67c14e8" +checksum = "46254cf2fdcdf1badb5934448c1bcbe046a56537b3987d96c51a7afc5d03f293" dependencies = [ - "backtrace-sys", + "addr2line", "cfg-if", "libc", + "miniz_oxide", + "object", "rustc-demangle", ] -[[package]] -name = "backtrace-sys" -version = "0.1.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca797db0057bae1a7aa2eef3283a874695455cecf08a43bfb8507ee0ebc1ed69" -dependencies = [ - "cc", - "libc", -] - [[package]] name = "base64" version = "0.11.0" @@ -48,9 +55,9 @@ checksum = "b41b7ea54a0c9d92199de89e20e58d49f02f8e699814ef3fdf266f6f748d15c7" [[package]] name = "bincode" -version = "1.2.1" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5753e2a71534719bf3f4e57006c3a4f0d2c672a4b676eec84161f763eca87dbf" +checksum = "f30d3a39baa26f9651f17b375061f3233dde33424a8b72b0dbe93a68a0bc896d" dependencies = [ "byteorder", "serde", @@ -64,9 +71,9 @@ checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" [[package]] name = "blake3" -version = "0.3.3" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68df31bdf2bbb567e5adf8f21ac125dc0e897b1381e7b841f181521f06fc3134" +checksum = "ce4f9586c9a3151c4b49b19e82ba163dd073614dd057e53c969e1a4db5b52720" dependencies = [ "arrayref", "arrayvec", @@ -74,7 +81,7 @@ dependencies = [ "cfg-if", "constant_time_eq", "crypto-mac", - "digest 0.8.1", + "digest 0.9.0", ] [[package]] @@ -83,7 +90,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" dependencies = [ - "generic-array 0.14.3", + "generic-array 0.14.4", ] [[package]] @@ -94,9 +101,9 @@ checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de" [[package]] name = "cc" -version = "1.0.50" +version = "1.0.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95e28fa049fda1c330bcf9d723be7663a899c4679724b34c81e9f5a326aab8cd" +checksum = "66120af515773fb005778dc07c261bd201ec8ce50bd6e7144c927753fe013381" [[package]] name = "cfg-if" @@ -138,6 +145,14 @@ dependencies = [ "snafu", ] +[[package]] +name = "cosmwasm-storage" +version = "0.10.0" +dependencies = [ + "cosmwasm-std", + "serde", +] + [[package]] name = "cosmwasm-vm" version = "0.10.0" @@ -183,7 +198,7 @@ dependencies = [ "cranelift-codegen-meta", "cranelift-codegen-shared", "cranelift-entity", - "gimli", + "gimli 0.20.0", "log", "smallvec", "target-lexicon", @@ -251,12 +266,13 @@ dependencies = [ [[package]] name = "crossbeam-queue" -version = "0.2.1" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c695eeca1e7173472a32221542ae469b3e9aac3a4fc81f7696bcad82029493db" +checksum = "774ba60a54c213d409d5353bda12d49cd68d14e45036a285234c8d6f91f92570" dependencies = [ "cfg-if", "crossbeam-utils", + "maybe-uninit", ] [[package]] @@ -272,11 +288,11 @@ dependencies = [ [[package]] name = "crypto-mac" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4434400df11d95d556bac068ddfedd482915eb18fe8bea89bc80b6e4b1c179e5" +checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" dependencies = [ - "generic-array 0.12.3", + "generic-array 0.14.4", "subtle", ] @@ -295,14 +311,14 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" dependencies = [ - "generic-array 0.14.3", + "generic-array 0.14.4", ] [[package]] name = "doc-comment" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "807e5847c39ad6a11eac66de492ed1406f76a260eb8656e8740cad9eabc69c27" +checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" [[package]] name = "dynasm" @@ -331,15 +347,15 @@ dependencies = [ [[package]] name = "either" -version = "1.5.3" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb1f6b1ce1c140482ea30ddd3335fc0024ac7ee112895426e0a629a6c20adfe3" +checksum = "cd56b59865bce947ac5958779cfa508f6c3b9497cc762b7e24a12d11ccde2c4f" [[package]] name = "errno" -version = "0.2.4" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2a071601ed01b988f896ab14b95e67335d1eeb50190932a1320f7fe3cadc84e" +checksum = "6eab5ee3df98a279d9b316b1af6ac95422127b1290317e6d18c1743c99418b01" dependencies = [ "errno-dragonfly", "libc", @@ -373,9 +389,9 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.14.3" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60fb4bb6bba52f78a471264d9a3b7d026cc0af47b22cd2cffbc0b787ca003e63" +checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817" dependencies = [ "typenum", "version_check", @@ -391,11 +407,26 @@ dependencies = [ "indexmap", ] +[[package]] +name = "gimli" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aaf91faf136cb47367fa430cd46e37a788775e7fa104f8b4bcb3861dc389b724" + +[[package]] +name = "hashbrown" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91b62f79061a0bc2e046024cb7ba44b08419ed238ecbd9adbd787434b9e8c25" +dependencies = [ + "autocfg", +] + [[package]] name = "hermit-abi" -version = "0.1.8" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1010591b26bbfe835e9faeabeb11866061cc7dcebffd56ad7d0942d0e61aefd8" +checksum = "3deed196b6e7f9e44a2ae8d94225d80302d81208b1bb673fd21fe634645c85a9" dependencies = [ "libc", ] @@ -408,19 +439,20 @@ checksum = "644f9158b2f133fd50f5fb3242878846d9eb792e445c893805ff0e3824006e35" [[package]] name = "indexmap" -version = "1.3.2" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "076f042c5b7b98f31d205f1249267e12a6518c1481e9dae9764af19b707d2292" +checksum = "86b45e59b16c76b11bf9738fd5d38879d3bd28ad292d7b313608becb17ae2df9" dependencies = [ "autocfg", + "hashbrown", "serde", ] [[package]] name = "itoa" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8b7a7c0c47db5545ed3fef7468ee7bb5b74691498139e4b3f6a20685dc6dd8e" +checksum = "dc6f3ad7b9d11a0c00842ff8de1b60ee58661048eb8049ed33c73594f359d7e6" [[package]] name = "lazy_static" @@ -430,24 +462,24 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.69" +version = "0.2.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99e85c08494b21a9054e7fe1374a732aeadaff3980b6990b94bfd3a70f690005" +checksum = "755456fae044e6fa1ebbbd1b3e902ae19e73097ed4ed87bb79934a867c007bc3" [[package]] name = "lock_api" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79b2de95ecb4691949fea4716ca53cdbcfccb2c612e19644a8bad05edcf9f47b" +checksum = "c4da24a77a3d8a6d4862d95f72e6fdb9c09a643ecdb402d754004a557f2bec75" dependencies = [ "scopeguard", ] [[package]] name = "log" -version = "0.4.8" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7" +checksum = "4fabed175da42fed1fa0746b0ea71f412aa9d35e76e95e59b192c64b9dc2bf8b" dependencies = [ "cfg-if", ] @@ -470,11 +502,20 @@ dependencies = [ [[package]] name = "memoffset" -version = "0.5.3" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75189eb85871ea5c2e2c15abbdd541185f63b408415e5051f5cac122d8c774b9" +checksum = "c198b026e1bbf08a937e94c6c60f9ec4a2267f5b0d2eec9c1b21b061ce2be55f" dependencies = [ - "rustc_version", + "autocfg", +] + +[[package]] +name = "miniz_oxide" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d7559a8a40d0f97e1edea3220f698f78b1c5ab67532e49f68fde3910323b722" +dependencies = [ + "adler", ] [[package]] @@ -492,14 +533,20 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.12.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46203554f085ff89c235cd12f7075f3233af9b11ed7c9e16dfe2560d03313ce6" +checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" dependencies = [ "hermit-abi", "libc", ] +[[package]] +name = "object" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ab52be62400ca80aa00285d25253d7f7c437b7375c4de678f5405d3afe82ca5" + [[package]] name = "opaque-debug" version = "0.3.0" @@ -533,9 +580,9 @@ checksum = "ddfc878dac00da22f8f61e7af3157988424567ab01d9920b962ef7dcbd7cd865" [[package]] name = "parking_lot" -version = "0.10.0" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92e98c49ab0b7ce5b222f2cc9193fc4efe11c6d0bd4f648e374684a6857b1cfc" +checksum = "d3a704eb390aafdc107b0e392f56a82b668e3a71366993b5340f5833fd62505e" dependencies = [ "lock_api", "parking_lot_core", @@ -543,9 +590,9 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.7.0" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7582838484df45743c8434fbff785e8edf260c28748353d44bc0da32e0ceabf1" +checksum = "d58c7c768d4ba344e3e8d72518ac13e259d7c7ade24167003b8488e10b6740a3" dependencies = [ "cfg-if", "cloudabi", @@ -557,9 +604,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.9" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c09721c6781493a2a492a96b5a5bf19b65917fe6728884e7c44dd0c60ca3435" +checksum = "04f5f085b5d71e2188cb8271e5da0161ad52c3f227a661a3c135fdf28e258b12" dependencies = [ "unicode-xid", ] @@ -570,6 +617,7 @@ version = "0.10.0" dependencies = [ "cosmwasm-schema", "cosmwasm-std", + "cosmwasm-storage", "cosmwasm-vm", "schemars", "serde", @@ -577,9 +625,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.3" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bdc6c187c65bca4260c9011c9e3132efe4909da44726bad24cf7572ae338d7f" +checksum = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37" dependencies = [ "proc-macro2", ] @@ -597,10 +645,11 @@ dependencies = [ [[package]] name = "rayon" -version = "1.3.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db6ce3297f9c85e16621bb8cca38a06779ffc31bb8184e1be4bed2be4678a098" +checksum = "62f02856753d04e03e26929f820d0a0a337ebe71f849801eea335d464b349080" dependencies = [ + "autocfg", "crossbeam-deque", "either", "rayon-core", @@ -608,9 +657,9 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.7.0" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08a89b46efaf957e52b18062fb2f4660f8b8a4dde1807ca002690868ef2c85a9" +checksum = "e92e15d89083484e11353891f1af602cc661426deb9564c298b270c726973280" dependencies = [ "crossbeam-deque", "crossbeam-queue", @@ -621,9 +670,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.1.56" +version = "0.1.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84" +checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" [[package]] name = "rustc-demangle" @@ -642,15 +691,15 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.2" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa8506c1de11c9c4e4c38863ccbe02a305c8188e85a05a784c9e11e1c3910c8" +checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" [[package]] name = "schemars" -version = "0.7.0" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10db1d3c2260e94570e1a492c762e62c11e1aac8869a2c3d869137995e6810d4" +checksum = "be77ed66abed6954aabf6a3e31a84706bedbf93750d267e92ef4a6d90bbd6a61" dependencies = [ "schemars_derive", "serde", @@ -659,9 +708,9 @@ dependencies = [ [[package]] name = "schemars_derive" -version = "0.7.0" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "706d022205b93f710ea83037db4fc103358dd24e61a330d287d45d93fe1dc250" +checksum = "11af7a475c9ee266cfaa9e303a47c830ebe072bf3101ab907a7b7b9d816fa01d" dependencies = [ "proc-macro2", "quote", @@ -692,9 +741,9 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "serde" -version = "1.0.104" +version = "1.0.115" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "414115f25f818d7dfccec8ee535d76949ae78584fc4f79a6f45a904bf8ab4449" +checksum = "e54c9a88f2da7238af84b5101443f0c0d0a3bbdc455e34a5c9497b1903ed55d5" dependencies = [ "serde_derive", ] @@ -720,18 +769,18 @@ dependencies = [ [[package]] name = "serde_bytes" -version = "0.11.3" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "325a073952621257820e7a3469f55ba4726d8b28657e7e36653d1c36dc2c84ae" +checksum = "16ae07dd2f88a366f15bd0632ba725227018c69a1c8550a927324f8eb8368bb9" dependencies = [ "serde", ] [[package]] name = "serde_derive" -version = "1.0.104" +version = "1.0.115" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128f9e303a5a29922045a830221b8f78ec74a5f544944f3d5984f8ec3895ef64" +checksum = "609feed1d0a73cc36a0182a840a9b37b4a82f0b1150369f0536a9e3f2a31dc48" dependencies = [ "proc-macro2", "quote", @@ -751,9 +800,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.48" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9371ade75d4c2d6cb154141b9752cf3781ec9c05e0e5cf35060e1e70ee7b9c25" +checksum = "164eacbdb13512ec2745fb09d51fd5b22b0d65ed294a1dcf7285a360c80a675c" dependencies = [ "itoa", "ryu", @@ -775,15 +824,15 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.2.0" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c2fb2ec9bcd216a5b0d0ccf31ab17b5ed1d627960edff65bbe95d3ce221cefc" +checksum = "fbee7696b84bbf3d89a1c2eccff0850e3047ed46bfcd2e92c29a2d074d57e252" [[package]] name = "snafu" -version = "0.6.6" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1ec0ae2ed980f26e1ad62e717feb01df90731df56887b5391a2c79f9f6805be" +checksum = "c7f5aed652511f5c9123cf2afbe9c244c29db6effa2abb05c866e965c82405ce" dependencies = [ "backtrace", "doc-comment", @@ -792,9 +841,9 @@ dependencies = [ [[package]] name = "snafu-derive" -version = "0.6.6" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ec32ba84a7a86aeb0bc32fd0c46d31b0285599f68ea72e87eff6127889d99e1" +checksum = "ebf8f7d5720104a9df0f7076a8682024e958bba0fe9848767bb44f251f3648e9" dependencies = [ "proc-macro2", "quote", @@ -803,21 +852,21 @@ dependencies = [ [[package]] name = "stable_deref_trait" -version = "1.1.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "subtle" -version = "1.0.0" +version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" +checksum = "502d53007c02d7605a05df1c1a73ee436952781653da5d0bf57ad608f66932c1" [[package]] name = "syn" -version = "1.0.16" +version = "1.0.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "123bd9499cfb380418d509322d7a6d52e5315f064fe4b3ad18a53d6b92c07859" +checksum = "891d8d6567fe7c7f8835a3a98af4208f3846fba258c1bc3c31d6e506239f11f9" dependencies = [ "proc-macro2", "quote", @@ -832,18 +881,18 @@ checksum = "ab0e7238dcc7b40a7be719a25365910f6807bd864f4cce6b2e6b873658e2b19d" [[package]] name = "thiserror" -version = "1.0.11" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee14bf8e6767ab4c687c9e8bc003879e042a96fd67a3ba5934eadb6536bef4db" +checksum = "7dfdd070ccd8ccb78f4ad66bf1982dc37f620ef696c6b5028fe2ed83dd3d0d08" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.11" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7b51e1fbc44b5a0840be594fbc0f960be09050f2617e61e6aa43bef97cd3ef4" +checksum = "bd80fc12f73063ac132ac92aceea36734f04a1d93c1240c6944e23a3b8841793" dependencies = [ "proc-macro2", "quote", @@ -852,15 +901,15 @@ dependencies = [ [[package]] name = "typenum" -version = "1.11.2" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d2783fe2d6b8c1101136184eb41be8b1ad379e4657050b8aaff0c79ee7575f9" +checksum = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33" [[package]] name = "unicode-xid" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" +checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" [[package]] name = "version_check" @@ -1003,9 +1052,9 @@ checksum = "aeb1956b19469d1c5e63e459d29e7b5aa0f558d9f16fcef09736f8a265e6c10a" [[package]] name = "winapi" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" dependencies = [ "winapi-i686-pc-windows-gnu", "winapi-x86_64-pc-windows-gnu", diff --git a/contracts/queue/Cargo.toml b/contracts/queue/Cargo.toml index eb6bb77cbc..87246c8a02 100644 --- a/contracts/queue/Cargo.toml +++ b/contracts/queue/Cargo.toml @@ -30,6 +30,7 @@ singlepass = ["cosmwasm-vm/default-singlepass"] [dependencies] cosmwasm-std = { path = "../../packages/std", features = ["iterator"] } +cosmwasm-storage = { path = "../../packages/storage", features = ["iterator"] } schemars = "0.7" serde = { version = "1.0.103", default-features = false, features = ["derive"] } diff --git a/contracts/queue/src/contract.rs b/contracts/queue/src/contract.rs index 37acbd969a..d528b8981c 100644 --- a/contracts/queue/src/contract.rs +++ b/contracts/queue/src/contract.rs @@ -3,8 +3,9 @@ use serde::{Deserialize, Serialize}; use cosmwasm_std::{ from_slice, to_binary, to_vec, Api, Binary, Env, Extern, HandleResponse, InitResponse, Order, - Querier, QueryResponse, StdResult, Storage, + Querier, QueryResponse, ReadonlyStorage, StdError, StdResult, Storage, }; +use cosmwasm_storage::prefixed_read; #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] pub struct InitMsg {} @@ -33,6 +34,7 @@ pub enum QueryMsg { Sum {}, // Reducer holds open two iterators at once Reducer {}, + List {}, } #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] @@ -52,6 +54,12 @@ pub struct ReducerResponse { pub counters: Vec<(i32, i32)>, } +#[derive(Serialize, Deserialize, Clone, PartialEq, JsonSchema, Debug)] +pub struct ListResponse { + /// List all open swap ids + pub swaps: Vec, +} + // init is a no-op, just empty data pub fn init( _deps: &mut Extern, @@ -120,6 +128,7 @@ pub fn query( QueryMsg::Count {} => to_binary(&query_count(deps)?), QueryMsg::Sum {} => to_binary(&query_sum(deps)?), QueryMsg::Reducer {} => to_binary(&query_reducer(deps)?), + QueryMsg::List {} => to_binary(&query_list(deps)?), } } @@ -167,11 +176,27 @@ fn query_reducer( Ok(ReducerResponse { counters: out }) } +pub const PREFIX_SWAP: &[u8] = b"atomic_swap"; + +fn query_list(deps: &Extern) -> StdResult { + Ok(ListResponse { + swaps: all_swap_ids(&deps.storage)?, + }) +} + +/// This returns the list of ids for all active swaps +pub fn all_swap_ids(storage: &S) -> StdResult> { + prefixed_read(PREFIX_SWAP, storage) + .range(None, None, Order::Ascending) + .map(|(k, _)| String::from_utf8(k).map_err(|_| StdError::invalid_utf8("Parsing swap id"))) + .collect() +} + #[cfg(test)] mod tests { use super::*; - use cosmwasm_std::coins; use cosmwasm_std::testing::{mock_dependencies, mock_env, MockApi, MockQuerier, MockStorage}; + use cosmwasm_std::{coins, from_binary}; fn create_contract() -> (Extern, Env) { let mut deps = mock_dependencies(20, &coins(1000, "earth")); @@ -242,4 +267,14 @@ mod tests { let counters = query_reducer(&deps).unwrap().counters; assert_eq!(counters, vec![(40, 85), (15, 125), (85, 0), (-10, 140)]); } + + #[test] + fn query_list() { + let (mut deps, _env) = create_contract(); + + //let _query_binary: StdResult = query(&mut deps, QueryMsg::List {}); + let query_msg = QueryMsg::List {}; + let ids: ListResponse = from_binary(&query(&mut deps, query_msg).unwrap()).unwrap(); + assert_eq!(0, ids.swaps.len()); + } } diff --git a/contracts/queue/tests/integration.rs b/contracts/queue/tests/integration.rs index 33001396d2..ae24017914 100644 --- a/contracts/queue/tests/integration.rs +++ b/contracts/queue/tests/integration.rs @@ -24,7 +24,7 @@ use cosmwasm_vm::{ }; use queue::contract::{ - CountResponse, HandleMsg, InitMsg, Item, QueryMsg, ReducerResponse, SumResponse, + CountResponse, HandleMsg, InitMsg, Item, ListResponse, QueryMsg, ReducerResponse, SumResponse, }; static WASM: &[u8] = include_bytes!("../target/wasm32-unknown-unknown/release/queue.wasm"); @@ -114,3 +114,13 @@ fn push_and_reduce() { let counters = from_binary::(&data).unwrap().counters; assert_eq!(counters, vec![(40, 85), (15, 125), (85, 0), (-10, 140)]); } + +#[test] +fn query_list() { + let (mut deps, _env) = create_contract(); + + //let _query_binary: StdResult = query(&mut deps, QueryMsg::List {}); + let query_msg = QueryMsg::List {}; + let ids: ListResponse = from_binary(&query(&mut deps, query_msg).unwrap()).unwrap(); + assert_eq!(0, ids.swaps.len()); +} From 1c27e076f3b5f8148dd0bbe9616e866630464076 Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Tue, 25 Aug 2020 11:07:36 +0200 Subject: [PATCH 2/8] Simplified integration tests, any non-None range triggers this --- contracts/queue/src/contract.rs | 9 ++++----- contracts/queue/tests/integration.rs | 4 ++++ 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/contracts/queue/src/contract.rs b/contracts/queue/src/contract.rs index d528b8981c..49e41ba87e 100644 --- a/contracts/queue/src/contract.rs +++ b/contracts/queue/src/contract.rs @@ -5,7 +5,6 @@ use cosmwasm_std::{ from_slice, to_binary, to_vec, Api, Binary, Env, Extern, HandleResponse, InitResponse, Order, Querier, QueryResponse, ReadonlyStorage, StdError, StdResult, Storage, }; -use cosmwasm_storage::prefixed_read; #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] pub struct InitMsg {} @@ -176,8 +175,6 @@ fn query_reducer( Ok(ReducerResponse { counters: out }) } -pub const PREFIX_SWAP: &[u8] = b"atomic_swap"; - fn query_list(deps: &Extern) -> StdResult { Ok(ListResponse { swaps: all_swap_ids(&deps.storage)?, @@ -186,8 +183,10 @@ fn query_list(deps: &Extern) -> StdResu /// This returns the list of ids for all active swaps pub fn all_swap_ids(storage: &S) -> StdResult> { - prefixed_read(PREFIX_SWAP, storage) - .range(None, None, Order::Ascending) + storage + .range(Some(b"atomic_swap"), Some(b"atomic_swaq"), Order::Ascending) + // .range(None, Some(b"atomic_swaq"), Order::Ascending) + // .range(Some(b"atomic_swap"), None, Order::Ascending) .map(|(k, _)| String::from_utf8(k).map_err(|_| StdError::invalid_utf8("Parsing swap id"))) .collect() } diff --git a/contracts/queue/tests/integration.rs b/contracts/queue/tests/integration.rs index ae24017914..0b8c85f849 100644 --- a/contracts/queue/tests/integration.rs +++ b/contracts/queue/tests/integration.rs @@ -57,6 +57,7 @@ fn init_and_query() { assert_eq!(get_sum(&mut deps), 0); } +#[ignore] #[test] fn push_and_query() { let (mut deps, env) = create_contract(); @@ -66,6 +67,7 @@ fn push_and_query() { assert_eq!(get_sum(&mut deps), 25); } +#[ignore] #[test] fn multiple_push() { let (mut deps, env) = create_contract(); @@ -79,6 +81,7 @@ fn multiple_push() { assert_eq!(get_sum(&mut deps), 105); } +#[ignore] #[test] fn push_and_pop() { let (mut deps, env) = create_contract(); @@ -97,6 +100,7 @@ fn push_and_pop() { assert_eq!(get_sum(&mut deps), 17); } +#[ignore] #[test] fn push_and_reduce() { let (mut deps, env) = create_contract(); From ccbf3eb9e213a53d6a9fa8165b4283e4b35562e5 Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Tue, 25 Aug 2020 13:12:10 +0200 Subject: [PATCH 3/8] WIP: lots of debug println --- contracts/queue/src/contract.rs | 13 +++++++------ contracts/queue/tests/integration.rs | 1 + packages/std/src/imports.rs | 8 ++++++-- packages/vm/src/imports.rs | 10 +++++++++- packages/vm/src/memory.rs | 4 ++-- 5 files changed, 25 insertions(+), 11 deletions(-) diff --git a/contracts/queue/src/contract.rs b/contracts/queue/src/contract.rs index 49e41ba87e..e797381f94 100644 --- a/contracts/queue/src/contract.rs +++ b/contracts/queue/src/contract.rs @@ -183,12 +183,13 @@ fn query_list(deps: &Extern) -> StdResu /// This returns the list of ids for all active swaps pub fn all_swap_ids(storage: &S) -> StdResult> { - storage - .range(Some(b"atomic_swap"), Some(b"atomic_swaq"), Order::Ascending) - // .range(None, Some(b"atomic_swaq"), Order::Ascending) - // .range(Some(b"atomic_swap"), None, Order::Ascending) - .map(|(k, _)| String::from_utf8(k).map_err(|_| StdError::invalid_utf8("Parsing swap id"))) - .collect() + // storage + // .range(Some(b"atomic_swap"), Some(b"atomic_swaq"), Order::Ascending) + // .map(|(k, _)| String::from_utf8(k).map_err(|_| StdError::invalid_utf8("Parsing swap id"))) + // .collect() + let _ = storage + .range(Some(b"short"), Some(b"very very long"), Order::Ascending); + Ok(vec![]) } #[cfg(test)] diff --git a/contracts/queue/tests/integration.rs b/contracts/queue/tests/integration.rs index 0b8c85f849..4b6c2ac7e3 100644 --- a/contracts/queue/tests/integration.rs +++ b/contracts/queue/tests/integration.rs @@ -50,6 +50,7 @@ fn get_sum(deps: &mut Instance) -> i32 { res.sum } +#[ignore] #[test] fn init_and_query() { let (mut deps, _) = create_contract(); diff --git a/packages/std/src/imports.rs b/packages/std/src/imports.rs index a8d6c3e14d..7f8fa20322 100644 --- a/packages/std/src/imports.rs +++ b/packages/std/src/imports.rs @@ -71,12 +71,16 @@ impl ReadonlyStorage for ExternalStorage { ) -> Box> { // start and end (Regions) must remain in scope as long as the start_ptr / end_ptr do // thus they are not inside a block - let start = start.map(|s| build_region(s)); + let start = start.map(|s| Box::new(Region{offset: 50, length: 500, capacity: 500})); let start_ptr = match start { Some(reg) => &*reg as *const Region as u32, None => 0, }; - let end = end.map(|e| build_region(e)); + // let start = Box::new(Region{offset: 100, length: 200, capacity: 300}); + // let start_ptr = &*start as *const Region as u32; + + // let end = end.map(|e| build_region(e)); + let end = end.map(|s| Box::new(Region{offset: 4, length: 5, capacity: 6})); let end_ptr = match end { Some(reg) => &*reg as *const Region as u32, None => 0, diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index b58de59efd..d81e9975d1 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -20,7 +20,7 @@ use crate::errors::{CommunicationError, VmError, VmResult}; use crate::ffi::FfiError; #[cfg(feature = "iterator")] use crate::memory::maybe_read_region; -use crate::memory::{read_region, write_region}; +use crate::memory::{read_region, write_region, get_region}; use crate::serde::to_vec; use crate::traits::{Api, Querier, Storage}; @@ -170,8 +170,16 @@ pub fn do_scan( end_ptr: u32, order: i32, ) -> VmResult { + println!("do_scan called"); + println!("start_ptr: {:?}", start_ptr); + let mut s = get_region(ctx, start_ptr)?; + println!("start: {:?}", s); + println!("end_ptr: {:?}", end_ptr); + let start = maybe_read_region(ctx, start_ptr, MAX_LENGTH_DB_KEY)?; + println!("got_start called"); let end = maybe_read_region(ctx, end_ptr, MAX_LENGTH_DB_KEY)?; + println!("got_end called"); let order: Order = order .try_into() .map_err(|_| CommunicationError::invalid_order(order))?; diff --git a/packages/vm/src/memory.rs b/packages/vm/src/memory.rs index e8cdf48776..d9922b731c 100644 --- a/packages/vm/src/memory.rs +++ b/packages/vm/src/memory.rs @@ -19,7 +19,7 @@ use crate::errors::{ /// but defined here to allow Wasmer specific implementation. #[repr(C)] #[derive(Default, Clone, Copy, Debug)] -struct Region { +pub(crate) struct Region { pub offset: u32, /// The number of bytes available in this region pub capacity: u32, @@ -136,7 +136,7 @@ pub fn write_region(ctx: &Ctx, ptr: u32, data: &[u8]) -> VmResult<()> { } /// Reads in a Region at ptr in wasm memory and returns a copy of it -fn get_region(ctx: &Ctx, ptr: u32) -> CommunicationResult { +pub(crate) fn get_region(ctx: &Ctx, ptr: u32) -> CommunicationResult { let memory = ctx.memory(0); let wptr = WasmPtr::::new(ptr); match wptr.deref(memory) { From f0abe54c15069de0da687939d4583728166ab65a Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Tue, 25 Aug 2020 13:22:03 +0200 Subject: [PATCH 4/8] Fix ExternalStorage.range --- packages/std/src/imports.rs | 40 +++++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/packages/std/src/imports.rs b/packages/std/src/imports.rs index 7f8fa20322..0a9199c81d 100644 --- a/packages/std/src/imports.rs +++ b/packages/std/src/imports.rs @@ -69,25 +69,31 @@ impl ReadonlyStorage for ExternalStorage { end: Option<&[u8]>, order: Order, ) -> Box> { - // start and end (Regions) must remain in scope as long as the start_ptr / end_ptr do - // thus they are not inside a block - let start = start.map(|s| Box::new(Region{offset: 50, length: 500, capacity: 500})); - let start_ptr = match start { - Some(reg) => &*reg as *const Region as u32, - None => 0, - }; - // let start = Box::new(Region{offset: 100, length: 200, capacity: 300}); - // let start_ptr = &*start as *const Region as u32; - - // let end = end.map(|e| build_region(e)); - let end = end.map(|s| Box::new(Region{offset: 4, length: 5, capacity: 6})); - let end_ptr = match end { - Some(reg) => &*reg as *const Region as u32, - None => 0, - }; let order = order as i32; - let iterator_id = unsafe { db_scan(start_ptr, end_ptr, order) }; + // There is lots of gotchas on turning options into regions for FFI, thus this design + // See: https://github.com/CosmWasm/cosmwasm/pull/509 + // Note: start and end (Regions) must remain in scope as long as the start_ptr / end_ptr do + let iterator_id = match (start, end) { + (None, None) => unsafe { db_scan(0, 0, order) }, + (Some(s), None) => { + let start = build_region(s); + let start_ptr = &*start as *const Region as u32; + unsafe { db_scan(start_ptr, 0, order) } + }, + (None, Some(e)) => { + let end = build_region(e); + let end_ptr = &*end as *const Region as u32; + unsafe { db_scan(0, end_ptr, order) } + }, + (Some(s), Some(e)) => { + let start = build_region(s); + let start_ptr = &*start as *const Region as u32; + let end = build_region(e); + let end_ptr = &*end as *const Region as u32; + unsafe { db_scan(start_ptr, end_ptr, order) } + } + }; let iter = ExternalIterator { iterator_id }; Box::new(iter) } From 3d01777332918120a98e2886508e627464904d29 Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Tue, 25 Aug 2020 13:26:46 +0200 Subject: [PATCH 5/8] Cleanup --- contracts/queue/Cargo.lock | 9 --------- contracts/queue/Cargo.toml | 1 - contracts/queue/src/contract.rs | 11 ++++------- contracts/queue/tests/integration.rs | 5 ----- packages/vm/src/imports.rs | 10 +--------- packages/vm/src/memory.rs | 4 ++-- 6 files changed, 7 insertions(+), 33 deletions(-) diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 87f420ae4e..a0796fb4c7 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -145,14 +145,6 @@ dependencies = [ "snafu", ] -[[package]] -name = "cosmwasm-storage" -version = "0.10.0" -dependencies = [ - "cosmwasm-std", - "serde", -] - [[package]] name = "cosmwasm-vm" version = "0.10.0" @@ -617,7 +609,6 @@ version = "0.10.0" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cosmwasm-storage", "cosmwasm-vm", "schemars", "serde", diff --git a/contracts/queue/Cargo.toml b/contracts/queue/Cargo.toml index 87246c8a02..eb6bb77cbc 100644 --- a/contracts/queue/Cargo.toml +++ b/contracts/queue/Cargo.toml @@ -30,7 +30,6 @@ singlepass = ["cosmwasm-vm/default-singlepass"] [dependencies] cosmwasm-std = { path = "../../packages/std", features = ["iterator"] } -cosmwasm-storage = { path = "../../packages/storage", features = ["iterator"] } schemars = "0.7" serde = { version = "1.0.103", default-features = false, features = ["derive"] } diff --git a/contracts/queue/src/contract.rs b/contracts/queue/src/contract.rs index e797381f94..711123540a 100644 --- a/contracts/queue/src/contract.rs +++ b/contracts/queue/src/contract.rs @@ -183,13 +183,10 @@ fn query_list(deps: &Extern) -> StdResu /// This returns the list of ids for all active swaps pub fn all_swap_ids(storage: &S) -> StdResult> { - // storage - // .range(Some(b"atomic_swap"), Some(b"atomic_swaq"), Order::Ascending) - // .map(|(k, _)| String::from_utf8(k).map_err(|_| StdError::invalid_utf8("Parsing swap id"))) - // .collect() - let _ = storage - .range(Some(b"short"), Some(b"very very long"), Order::Ascending); - Ok(vec![]) + storage + .range(Some(b"atomic_swap"), Some(b"atomic_swaq"), Order::Ascending) + .map(|(k, _)| String::from_utf8(k).map_err(|_| StdError::invalid_utf8("Parsing swap id"))) + .collect() } #[cfg(test)] diff --git a/contracts/queue/tests/integration.rs b/contracts/queue/tests/integration.rs index 4b6c2ac7e3..ae24017914 100644 --- a/contracts/queue/tests/integration.rs +++ b/contracts/queue/tests/integration.rs @@ -50,7 +50,6 @@ fn get_sum(deps: &mut Instance) -> i32 { res.sum } -#[ignore] #[test] fn init_and_query() { let (mut deps, _) = create_contract(); @@ -58,7 +57,6 @@ fn init_and_query() { assert_eq!(get_sum(&mut deps), 0); } -#[ignore] #[test] fn push_and_query() { let (mut deps, env) = create_contract(); @@ -68,7 +66,6 @@ fn push_and_query() { assert_eq!(get_sum(&mut deps), 25); } -#[ignore] #[test] fn multiple_push() { let (mut deps, env) = create_contract(); @@ -82,7 +79,6 @@ fn multiple_push() { assert_eq!(get_sum(&mut deps), 105); } -#[ignore] #[test] fn push_and_pop() { let (mut deps, env) = create_contract(); @@ -101,7 +97,6 @@ fn push_and_pop() { assert_eq!(get_sum(&mut deps), 17); } -#[ignore] #[test] fn push_and_reduce() { let (mut deps, env) = create_contract(); diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index d81e9975d1..b58de59efd 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -20,7 +20,7 @@ use crate::errors::{CommunicationError, VmError, VmResult}; use crate::ffi::FfiError; #[cfg(feature = "iterator")] use crate::memory::maybe_read_region; -use crate::memory::{read_region, write_region, get_region}; +use crate::memory::{read_region, write_region}; use crate::serde::to_vec; use crate::traits::{Api, Querier, Storage}; @@ -170,16 +170,8 @@ pub fn do_scan( end_ptr: u32, order: i32, ) -> VmResult { - println!("do_scan called"); - println!("start_ptr: {:?}", start_ptr); - let mut s = get_region(ctx, start_ptr)?; - println!("start: {:?}", s); - println!("end_ptr: {:?}", end_ptr); - let start = maybe_read_region(ctx, start_ptr, MAX_LENGTH_DB_KEY)?; - println!("got_start called"); let end = maybe_read_region(ctx, end_ptr, MAX_LENGTH_DB_KEY)?; - println!("got_end called"); let order: Order = order .try_into() .map_err(|_| CommunicationError::invalid_order(order))?; diff --git a/packages/vm/src/memory.rs b/packages/vm/src/memory.rs index d9922b731c..e8cdf48776 100644 --- a/packages/vm/src/memory.rs +++ b/packages/vm/src/memory.rs @@ -19,7 +19,7 @@ use crate::errors::{ /// but defined here to allow Wasmer specific implementation. #[repr(C)] #[derive(Default, Clone, Copy, Debug)] -pub(crate) struct Region { +struct Region { pub offset: u32, /// The number of bytes available in this region pub capacity: u32, @@ -136,7 +136,7 @@ pub fn write_region(ctx: &Ctx, ptr: u32, data: &[u8]) -> VmResult<()> { } /// Reads in a Region at ptr in wasm memory and returns a copy of it -pub(crate) fn get_region(ctx: &Ctx, ptr: u32) -> CommunicationResult { +fn get_region(ctx: &Ctx, ptr: u32) -> CommunicationResult { let memory = ctx.memory(0); let wptr = WasmPtr::::new(ptr); match wptr.deref(memory) { From 3162244aea09a01f6811e6fe2ff868265db74fb8 Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Tue, 25 Aug 2020 13:53:09 +0200 Subject: [PATCH 6/8] cargo fmt && cargo schema --- contracts/queue/schema/query_msg.json | 11 +++++++++++ packages/std/src/imports.rs | 4 ++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/contracts/queue/schema/query_msg.json b/contracts/queue/schema/query_msg.json index 3313c79c98..4c6d53d6ec 100644 --- a/contracts/queue/schema/query_msg.json +++ b/contracts/queue/schema/query_msg.json @@ -34,6 +34,17 @@ "type": "object" } } + }, + { + "type": "object", + "required": [ + "list" + ], + "properties": { + "list": { + "type": "object" + } + } } ] } diff --git a/packages/std/src/imports.rs b/packages/std/src/imports.rs index 0a9199c81d..4eb9f65ee6 100644 --- a/packages/std/src/imports.rs +++ b/packages/std/src/imports.rs @@ -80,12 +80,12 @@ impl ReadonlyStorage for ExternalStorage { let start = build_region(s); let start_ptr = &*start as *const Region as u32; unsafe { db_scan(start_ptr, 0, order) } - }, + } (None, Some(e)) => { let end = build_region(e); let end_ptr = &*end as *const Region as u32; unsafe { db_scan(0, end_ptr, order) } - }, + } (Some(s), Some(e)) => { let start = build_region(s); let start_ptr = &*start as *const Region as u32; From 98fa86086e020d3294ba5f75b0800c3e43874bab Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Tue, 25 Aug 2020 19:36:41 +0200 Subject: [PATCH 7/8] Improve tests, also check (None, Some) and (Some, None) ranges --- contracts/queue/src/contract.rs | 59 ++++++++++++++++++++-------- contracts/queue/tests/integration.rs | 22 +++++++++-- 2 files changed, 61 insertions(+), 20 deletions(-) diff --git a/contracts/queue/src/contract.rs b/contracts/queue/src/contract.rs index 711123540a..90012cdf03 100644 --- a/contracts/queue/src/contract.rs +++ b/contracts/queue/src/contract.rs @@ -3,7 +3,7 @@ use serde::{Deserialize, Serialize}; use cosmwasm_std::{ from_slice, to_binary, to_vec, Api, Binary, Env, Extern, HandleResponse, InitResponse, Order, - Querier, QueryResponse, ReadonlyStorage, StdError, StdResult, Storage, + Querier, QueryResponse, StdResult, Storage, }; #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] @@ -55,8 +55,12 @@ pub struct ReducerResponse { #[derive(Serialize, Deserialize, Clone, PartialEq, JsonSchema, Debug)] pub struct ListResponse { - /// List all open swap ids - pub swaps: Vec, + /// List an empty range, both bounded + pub empty: Vec, + /// List all ids before 0x20 + pub early: Vec, + /// List all ids after 0x20 + pub late: Vec, } // init is a no-op, just empty data @@ -175,18 +179,25 @@ fn query_reducer( Ok(ReducerResponse { counters: out }) } +// this does a range query with both bounds set. Not really useful but to debug an issue +// between vm and wasm: https://github.com/CosmWasm/cosmwasm/issues/508 fn query_list(deps: &Extern) -> StdResult { - Ok(ListResponse { - swaps: all_swap_ids(&deps.storage)?, - }) -} - -/// This returns the list of ids for all active swaps -pub fn all_swap_ids(storage: &S) -> StdResult> { - storage - .range(Some(b"atomic_swap"), Some(b"atomic_swaq"), Order::Ascending) - .map(|(k, _)| String::from_utf8(k).map_err(|_| StdError::invalid_utf8("Parsing swap id"))) - .collect() + let empty: Vec = deps + .storage + .range(Some(b"large"), Some(b"larger"), Order::Ascending) + .map(|(k, _)| k[0] as u32) + .collect(); + let early: Vec = deps + .storage + .range(None, Some(b"\x20a"), Order::Ascending) + .map(|(k, _)| k[0] as u32) + .collect(); + let late: Vec = deps + .storage + .range(Some(b"\x20a"), None, Order::Ascending) + .map(|(k, _)| k[0] as u32) + .collect(); + Ok(ListResponse { empty, early, late }) } #[cfg(test)] @@ -267,11 +278,25 @@ mod tests { #[test] fn query_list() { - let (mut deps, _env) = create_contract(); + let (mut deps, env) = create_contract(); + for _ in 0..0x25 { + handle(&mut deps, env.clone(), HandleMsg::Enqueue { value: 40 }).unwrap(); + } + for _ in 0..0x16 { + handle(&mut deps, env.clone(), HandleMsg::Dequeue {}).unwrap(); + } + // we add 0x25 times and then pop 0x16, leaving [0x16, 0x17...0x24] + // since we count up to 0x20 in early, we get early and late both with data - //let _query_binary: StdResult = query(&mut deps, QueryMsg::List {}); let query_msg = QueryMsg::List {}; let ids: ListResponse = from_binary(&query(&mut deps, query_msg).unwrap()).unwrap(); - assert_eq!(0, ids.swaps.len()); + assert_eq!(0, ids.empty.len()); + assert_eq!(11, ids.early.len()); + assert_eq!(4, ids.late.len()); + assert_eq!( + vec![0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20], + ids.early + ); + assert_eq!(vec![0x21, 0x22, 0x23, 0x24], ids.late); } } diff --git a/contracts/queue/tests/integration.rs b/contracts/queue/tests/integration.rs index ae24017914..f269f739f0 100644 --- a/contracts/queue/tests/integration.rs +++ b/contracts/queue/tests/integration.rs @@ -117,10 +117,26 @@ fn push_and_reduce() { #[test] fn query_list() { - let (mut deps, _env) = create_contract(); + let (mut deps, env) = create_contract(); + + for _ in 0..0x25 { + let _: HandleResponse = + handle(&mut deps, env.clone(), HandleMsg::Enqueue { value: 40 }).unwrap(); + } + for _ in 0..0x16 { + let _: HandleResponse = handle(&mut deps, env.clone(), HandleMsg::Dequeue {}).unwrap(); + } + // we add 0x25 times and then pop 0x16, leaving [0x16, 0x17...0x24] + // since we count up to 0x20 in early, we get early and late both with data - //let _query_binary: StdResult = query(&mut deps, QueryMsg::List {}); let query_msg = QueryMsg::List {}; let ids: ListResponse = from_binary(&query(&mut deps, query_msg).unwrap()).unwrap(); - assert_eq!(0, ids.swaps.len()); + assert_eq!(0, ids.empty.len()); + assert_eq!(11, ids.early.len()); + assert_eq!(4, ids.late.len()); + assert_eq!( + vec![0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20], + ids.early + ); + assert_eq!(vec![0x21, 0x22, 0x23, 0x24], ids.late); } From 0d3804dbbc2ae2319e0463e89ec193c41fd5c8a9 Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Tue, 25 Aug 2020 19:37:26 +0200 Subject: [PATCH 8/8] Update schema --- contracts/queue/examples/schema.rs | 5 ++- contracts/queue/schema/list_response.json | 39 +++++++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 contracts/queue/schema/list_response.json diff --git a/contracts/queue/examples/schema.rs b/contracts/queue/examples/schema.rs index 5bfa27facb..8f8246c4cc 100644 --- a/contracts/queue/examples/schema.rs +++ b/contracts/queue/examples/schema.rs @@ -3,7 +3,9 @@ use std::fs::create_dir_all; use cosmwasm_schema::{export_schema, remove_schemas, schema_for}; -use queue::contract::{CountResponse, HandleMsg, InitMsg, Item, QueryMsg, SumResponse}; +use queue::contract::{ + CountResponse, HandleMsg, InitMsg, Item, ListResponse, QueryMsg, SumResponse, +}; fn main() { let mut out_dir = current_dir().unwrap(); @@ -17,4 +19,5 @@ fn main() { export_schema(&schema_for!(Item), &out_dir); export_schema(&schema_for!(CountResponse), &out_dir); export_schema(&schema_for!(SumResponse), &out_dir); + export_schema(&schema_for!(ListResponse), &out_dir); } diff --git a/contracts/queue/schema/list_response.json b/contracts/queue/schema/list_response.json new file mode 100644 index 0000000000..b4f8f342bc --- /dev/null +++ b/contracts/queue/schema/list_response.json @@ -0,0 +1,39 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "ListResponse", + "type": "object", + "required": [ + "early", + "empty", + "late" + ], + "properties": { + "early": { + "description": "List all ids before 0x20", + "type": "array", + "items": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + }, + "empty": { + "description": "List an empty range, both bounded", + "type": "array", + "items": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + }, + "late": { + "description": "List all ids after 0x20", + "type": "array", + "items": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + } + } +}