From 83785bebcfeb504002a238a312de82ebcc7b2cee Mon Sep 17 00:00:00 2001 From: Daniyar Itegulov Date: Wed, 2 Feb 2022 18:52:39 +1100 Subject: [PATCH 1/9] migrate wNEAR tests to use workspaces --- .gitignore | 1 + w-near/Cargo.lock | 2909 +++++++++++++++++++------------------------ w-near/Cargo.toml | 12 +- w-near/tests/mod.rs | 477 ++++--- 4 files changed, 1581 insertions(+), 1818 deletions(-) diff --git a/.gitignore b/.gitignore index 1827cc56..269a2486 100644 --- a/.gitignore +++ b/.gitignore @@ -14,5 +14,6 @@ target # Key pairs generated by the NEAR shell neardev +**/.near-credentials .DS_Store diff --git a/w-near/Cargo.lock b/w-near/Cargo.lock index e62509d3..b1fa95b1 100644 --- a/w-near/Cargo.lock +++ b/w-near/Cargo.lock @@ -1,18 +1,64 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +version = 3 + [[package]] name = "Inflector" version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" +[[package]] +name = "actix" +version = "0.11.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eb78f9871feb3519e06b947c2becbf2cc7f67ce786e510e6bd3f9a27da3dbf1" +dependencies = [ + "actix-rt", + "actix_derive", + "bitflags", + "bytes", + "crossbeam-channel", + "futures-core", + "futures-sink", + "futures-task", + "log", + "once_cell", + "parking_lot", + "pin-project-lite", + "smallvec", + "tokio", + "tokio-util", +] + +[[package]] +name = "actix-rt" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdf3f2183be1241ed4dd22611850b85d38de0b08a09f1f7bcccbd0809084b359" +dependencies = [ + "futures-core", + "tokio", +] + +[[package]] +name = "actix_derive" +version = "0.6.0-beta.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae749cf2582eb83efd288edd4e9704600fdce1bc4f69aa0c86ca1368a3e4c13f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "addr2line" version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a55f82cfe485775d02112886f4169bde0c5894d75e79ead7eafe7e40a25e45f7" dependencies = [ - "gimli 0.23.0", + "gimli", ] [[package]] @@ -23,24 +69,29 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "ahash" -version = "0.4.7" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "739f4a8db6605981345c5654f3a85b056ce52f37a39d34da03f25bf2151ea16e" +checksum = "43bb833f0bf979d8475d38fbf09ed3b8a55e1885fe93ad3f93239fc6a4f17b98" +dependencies = [ + "getrandom 0.2.2", + "once_cell", + "version_check", +] [[package]] name = "aho-corasick" -version = "0.7.15" +version = "0.7.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7404febffaa47dac81aa44dba71523c9d069b1bdc50a77db41195149e17f68e5" +checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" dependencies = [ "memchr", ] [[package]] name = "anyhow" -version = "1.0.40" +version = "1.0.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28b2cd92db5cbd74e8e5028f7e27dd7aa3090e89e4f2a197cc7c8dfb69c7063b" +checksum = "94a45b455c14666b85fc40a019e8ab9eb75e3a124e05494f5397122bc9eb06e0" [[package]] name = "arrayref" @@ -48,6 +99,15 @@ version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" +[[package]] +name = "arrayvec" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd9fd44efafa8690358b7408d253adf110036b88f55672a933f01d616ad9b1b9" +dependencies = [ + "nodrop", +] + [[package]] name = "arrayvec" version = "0.5.2" @@ -60,15 +120,6 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a2f58b0bb10c380af2b26e57212856b8c9a59e0925b4c20f4a174a49734eaf7" -[[package]] -name = "async-mutex" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479db852db25d9dbf6204e6cb6253698f175c15726470f78af0d918e99d6156e" -dependencies = [ - "event-listener", -] - [[package]] name = "async-trait" version = "0.1.42" @@ -96,42 +147,37 @@ dependencies = [ "cfg-if 1.0.0", "libc", "miniz_oxide", - "object 0.23.0", + "object", "rustc-demangle", ] [[package]] name = "base64" -version = "0.13.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" +checksum = "b41b7ea54a0c9d92199de89e20e58d49f02f8e699814ef3fdf266f6f748d15c7" [[package]] -name = "bincode" -version = "1.3.3" +name = "base64" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" -dependencies = [ - "serde", -] +checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" [[package]] -name = "bindgen" -version = "0.57.0" +name = "binary-install" +version = "0.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd4865004a46a0aafb2a0a5eb19d3c9fc46ee5f063a6cfc605c69ac9ecf5263d" +checksum = "7b5bc5f8c50dd6a80d0b303ddab79f42ddcb52fd43d68107ecf622c551fd4cd4" dependencies = [ - "bitflags", - "cexpr", - "clang-sys", - "lazy_static", - "lazycell", - "peeking_take_while", - "proc-macro2", - "quote", - "regex", - "rustc-hash", - "shlex", + "curl", + "dirs 1.0.5", + "failure", + "flate2", + "hex 0.3.2", + "is_executable", + "siphasher", + "tar", + "zip", ] [[package]] @@ -164,18 +210,14 @@ dependencies = [ ] [[package]] -name = "blake3" -version = "0.3.7" +name = "blake2b_simd" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9ff35b701f3914bdb8fad3368d822c766ef2858b2583198e41639b936f09d3f" +checksum = "afa748e348ad3be8263be728124b24a24f268266f6f5d58af9d75f6a40b5c587" dependencies = [ "arrayref", "arrayvec 0.5.2", - "cc", - "cfg-if 0.1.10", "constant_time_eq", - "crypto-mac", - "digest 0.9.0", ] [[package]] @@ -210,32 +252,32 @@ dependencies = [ [[package]] name = "borsh" -version = "0.8.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5a26c53ddf60281f18e7a29b20db7ba3db82a9d81b9650bfaa02d646f50d364" +checksum = "4c9d0958efb8301e1626692ea879cbff622ef45cf731807ec8d488b34be98cb8" dependencies = [ "borsh-derive", - "hashbrown", + "hashbrown 0.11.2", ] [[package]] name = "borsh-derive" -version = "0.8.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b637a47728b78a78cd7f4b85bf06d71ef4221840e059a38f048be2422bf673b2" +checksum = "325164710ad57bae6d32455ce3bd384f95768464a927ce145626dc3390a7f9fe" dependencies = [ "borsh-derive-internal", "borsh-schema-derive-internal", - "proc-macro-crate", + "proc-macro-crate 0.1.5", "proc-macro2", "syn", ] [[package]] name = "borsh-derive-internal" -version = "0.8.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d813fa25eb0bed78c36492cff4415f38c760d6de833d255ba9095bd8ebb7d725" +checksum = "f74159f43b231f4af8c4ce4967fef76e4e59725acf51706ddb9268c94348d15c" dependencies = [ "proc-macro2", "quote", @@ -244,9 +286,9 @@ dependencies = [ [[package]] name = "borsh-schema-derive-internal" -version = "0.8.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf78ee4a98c8cb9eba1bac3d3e2a1ea3d7673c719ce691e67b5cbafc472d3b7" +checksum = "99b2a77771907a820a860d200d193a0787c79a7890c8e253c462fa0f51ad58b6" dependencies = [ "proc-macro2", "quote", @@ -259,6 +301,12 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" +[[package]] +name = "bumpalo" +version = "3.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a45a46ab1f2412e53d3a0ade76ffad2025804294569aae387231a0cd6e0899" + [[package]] name = "byte-slice-cast" version = "1.0.0" @@ -284,66 +332,47 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b700ce4376041dcd0a327fd0097c41095743c4c8af8887265942faf1100bd040" [[package]] -name = "c2-chacha" -version = "0.3.0" +name = "bytesize" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb6b83fa00a7c53f420893670940c8fdfaa89f9dd9adb52062cca39482a31ab6" -dependencies = [ - "cipher", - "ppv-lite86", -] +checksum = "6c58ec36aac5066d5ca17df51b3e70279f5670a72102f5752cb7e7c856adfc70" [[package]] -name = "cached" -version = "0.23.0" +name = "bzip2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e2afe73808fbaac302e39c9754bfc3c4b4d0f99c9c240b9f4e4efc841ad1b74" +checksum = "6afcd980b5f3a45017c57e57a2fcccbb351cc43a356ce117ef760ef8052b89b0" dependencies = [ - "async-mutex", - "async-trait", - "cached_proc_macro", - "cached_proc_macro_types", - "futures", - "hashbrown", - "once_cell", + "bzip2-sys", + "libc", ] [[package]] -name = "cached_proc_macro" -version = "0.6.0" +name = "bzip2-sys" +version = "0.1.11+1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf857ae42d910aede5c5186e62684b0d7a597ce2fe3bd14448ab8f7ef439848c" +checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" dependencies = [ - "async-mutex", - "cached_proc_macro_types", - "darling 0.10.2", - "quote", - "syn", + "cc", + "libc", + "pkg-config", ] [[package]] -name = "cached_proc_macro_types" -version = "0.1.0" +name = "c2-chacha" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a4f925191b4367301851c6d99b09890311d74b0d43f274c0b34c86d308a3663" +checksum = "fb6b83fa00a7c53f420893670940c8fdfaa89f9dd9adb52062cca39482a31ab6" +dependencies = [ + "cipher", + "ppv-lite86", +] [[package]] name = "cc" version = "1.0.67" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3c69b077ad434294d3ce9f1f6143a2a4b89a8a2d54ef813d85003a4fd1137fd" -dependencies = [ - "jobserver", -] - -[[package]] -name = "cexpr" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4aedb84272dbe89af497cf81375129abda4fc0a9e7c5d317498c15cc30c0d27" -dependencies = [ - "nom", -] [[package]] name = "cfg-if" @@ -381,36 +410,26 @@ dependencies = [ ] [[package]] -name = "clang-sys" -version = "1.2.0" +name = "constant_time_eq" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "853eda514c284c2287f4bf20ae614f8781f40a81d32ecda6e91449304dfe077c" -dependencies = [ - "glob", - "libc", - "libloading 0.7.0", -] +checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" [[package]] -name = "cloudabi" -version = "0.0.3" +name = "core-foundation" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" +checksum = "6888e10551bb93e424d8df1d07f1a8b4fceb0001a3a4b048bfc47554946f47b3" dependencies = [ - "bitflags", + "core-foundation-sys", + "libc", ] [[package]] -name = "concat-with" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ae45936bbf9bddd6a0268c0ea5d3814a72403f4b69a1c318aae2ce90444ad55" - -[[package]] -name = "constant_time_eq" -version = "0.1.5" +name = "core-foundation-sys" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" +checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" [[package]] name = "cpuid-bool" @@ -419,516 +438,274 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8aebca1129a03dc6dc2b127edd729435bbc4a37e1d5f4d7513165089ceb02634" [[package]] -name = "cranelift-bforest" -version = "0.67.0" +name = "crc32fast" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f065f6889758f817f61a230220d1811ba99a9762af2fb69ae23048314f75ff2" +checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" dependencies = [ - "cranelift-entity 0.67.0", + "cfg-if 1.0.0", ] [[package]] -name = "cranelift-bforest" -version = "0.68.0" +name = "crossbeam-channel" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9221545c0507dc08a62b2d8b5ffe8e17ac580b0a74d1813b496b8d70b070fbd0" +checksum = "06ed27e177f16d65f0f0c22a213e17c696ace5dd64b14258b52f9417ccb52db4" dependencies = [ - "cranelift-entity 0.68.0", + "cfg-if 1.0.0", + "crossbeam-utils", ] [[package]] -name = "cranelift-codegen" -version = "0.67.0" +name = "crossbeam-utils" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "510aa2ab4307644100682b94e449940a0ea15c5887f1d4b9678b8dd5ef31e736" +checksum = "e7e9d99fa91428effe99c5c6d4634cdeba32b8cf784fc428a2a687f61a952c49" dependencies = [ - "byteorder", - "cranelift-bforest 0.67.0", - "cranelift-codegen-meta 0.67.0", - "cranelift-codegen-shared 0.67.0", - "cranelift-entity 0.67.0", - "gimli 0.21.0", - "log", - "regalloc 0.0.30", - "serde", - "smallvec", - "target-lexicon 0.11.2", - "thiserror", + "autocfg", + "cfg-if 1.0.0", + "lazy_static", ] [[package]] -name = "cranelift-codegen" -version = "0.68.0" +name = "crunchy" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e9936ea608b6cd176f107037f6adbb4deac933466fc7231154f96598b2d3ab1" -dependencies = [ - "byteorder", - "cranelift-bforest 0.68.0", - "cranelift-codegen-meta 0.68.0", - "cranelift-codegen-shared 0.68.0", - "cranelift-entity 0.68.0", - "gimli 0.22.0", - "log", - "regalloc 0.0.31", - "smallvec", - "target-lexicon 0.11.2", - "thiserror", -] +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" [[package]] -name = "cranelift-codegen-meta" -version = "0.67.0" +name = "crypto-mac" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4cb0c7e87c60d63b35f9670c15479ee4a5e557dd127efab88b2f9b2ca83c9a0" +checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" dependencies = [ - "cranelift-codegen-shared 0.67.0", - "cranelift-entity 0.67.0", + "generic-array 0.14.4", + "subtle", ] [[package]] -name = "cranelift-codegen-meta" -version = "0.68.0" +name = "curl" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ef2b2768568306540f4c8db3acce9105534d34c4a1e440529c1e702d7f8c8d7" +checksum = "7de97b894edd5b5bcceef8b78d7da9b75b1d2f2f9a910569d0bde3dd31d84939" dependencies = [ - "cranelift-codegen-shared 0.68.0", - "cranelift-entity 0.68.0", + "curl-sys", + "libc", + "openssl-probe", + "openssl-sys", + "schannel", + "socket2", + "winapi", ] [[package]] -name = "cranelift-codegen-shared" -version = "0.67.0" +name = "curl-sys" +version = "0.4.52+curl-7.81.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60636227098693e06de8d6d88beea2a7d32ecf8a8030dacdb57c68e06f381826" +checksum = "14b8c2d1023ea5fded5b7b892e4b8e95f70038a421126a056761a84246a28971" +dependencies = [ + "cc", + "libc", + "libz-sys", + "openssl-sys", + "pkg-config", + "vcpkg", + "winapi", +] [[package]] -name = "cranelift-codegen-shared" -version = "0.68.0" +name = "curve25519-dalek" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6759012d6d19c4caec95793f052613e9d4113e925e7f14154defbac0f1d4c938" +checksum = "639891fde0dbea823fc3d798a0fdf9d2f9440a42d64a78ab3488b0ca025117b3" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.5.1", + "subtle", + "zeroize", +] [[package]] -name = "cranelift-entity" -version = "0.67.0" +name = "derive_more" +version = "0.99.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6156db73e0c9f65f80c512988d63ec736be0dee3dd66bf951e3e28aed9dc02d3" +checksum = "41cb0e6161ad61ed084a36ba71fbba9e3ac5aee3606fb607fe08da6acbcf3d8c" dependencies = [ - "serde", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "cranelift-entity" -version = "0.68.0" +name = "digest" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86badbce14e15f52a45b666b38abe47b204969dd7f8fb7488cb55dd46b361fa6" +checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" dependencies = [ - "serde", + "generic-array 0.12.3", ] [[package]] -name = "cranelift-frontend" -version = "0.67.0" +name = "digest" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e09cd158c9a820a4cc14a34076811da225cce1d31dc6d03c5ef85b91aef560b9" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" dependencies = [ - "cranelift-codegen 0.67.0", - "log", - "smallvec", - "target-lexicon 0.11.2", + "generic-array 0.14.4", ] [[package]] -name = "cranelift-frontend" -version = "0.68.0" +name = "dirs" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b608bb7656c554d0a4cf8f50c7a10b857e80306f6ff829ad6d468a7e2323c8d8" +checksum = "3fd78930633bd1c6e35c4b42b1df7b0cbc6bc191146e512bb3bedf243fcc3901" dependencies = [ - "cranelift-codegen 0.68.0", - "log", - "smallvec", - "target-lexicon 0.11.2", + "libc", + "redox_users 0.3.5", + "winapi", ] [[package]] -name = "cranelift-native" -version = "0.67.0" +name = "dirs" +version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7054533ae1fc2048c1a6110bdf8f4314b77c60329ec6a7df79d2cfb84e3dcc1c" +checksum = "30baa043103c9d0c2a57cf537cc2f35623889dc0d405e6c3cccfadbc81c71309" dependencies = [ - "cranelift-codegen 0.67.0", - "raw-cpuid", - "target-lexicon 0.11.2", + "dirs-sys", ] [[package]] -name = "cranelift-wasm" -version = "0.67.0" +name = "dirs-sys" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aee0e0b68eba99f99a4923212d97aca9e44655ca8246f07fffe11236109b0d0" +checksum = "03d86534ed367a67548dc68113a0f5db55432fdfbb6e6f9d77704397d95d5780" dependencies = [ - "cranelift-codegen 0.67.0", - "cranelift-entity 0.67.0", - "cranelift-frontend 0.67.0", - "log", - "serde", - "thiserror", - "wasmparser 0.59.0", + "libc", + "redox_users 0.4.0", + "winapi", ] [[package]] -name = "crc32fast" -version = "1.2.1" +name = "easy-ext" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" +checksum = "62473f23f4a15690bd64ea37269266ba7b273e7c26b302aef68d3968ae9262a0" dependencies = [ - "cfg-if 1.0.0", + "quote", + "syn", ] [[package]] -name = "crossbeam-channel" -version = "0.5.1" +name = "ed25519" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ed27e177f16d65f0f0c22a213e17c696ace5dd64b14258b52f9417ccb52db4" +checksum = "37c66a534cbb46ab4ea03477eae19d5c22c01da8258030280b7bd9d8433fb6ef" dependencies = [ - "cfg-if 1.0.0", - "crossbeam-utils", + "signature", ] [[package]] -name = "crossbeam-deque" -version = "0.8.0" +name = "ed25519-dalek" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94af6efb46fef72616855b036a624cf27ba656ffc9be1b9a3c931cfc7749a9a9" +checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" dependencies = [ - "cfg-if 1.0.0", - "crossbeam-epoch", - "crossbeam-utils", + "curve25519-dalek", + "ed25519", + "rand 0.7.3", + "serde", + "sha2", + "zeroize", ] [[package]] -name = "crossbeam-epoch" -version = "0.9.3" +name = "encoding_rs" +version = "0.8.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2584f639eb95fea8c798496315b297cf81b9b58b6d30ab066a75455333cf4b12" +checksum = "7896dc8abb250ffdda33912550faa54c88ec8b998dec0b2c55ab224921ce11df" dependencies = [ "cfg-if 1.0.0", - "crossbeam-utils", - "lazy_static", - "memoffset 0.6.3", - "scopeguard", ] [[package]] -name = "crossbeam-utils" -version = "0.8.3" +name = "failure" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7e9d99fa91428effe99c5c6d4634cdeba32b8cf784fc428a2a687f61a952c49" +checksum = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86" dependencies = [ - "autocfg", - "cfg-if 1.0.0", - "lazy_static", + "backtrace", + "failure_derive", ] [[package]] -name = "crunchy" -version = "0.2.2" +name = "failure_derive" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" - -[[package]] -name = "crypto-mac" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" +checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4" dependencies = [ - "generic-array 0.14.4", - "subtle", -] - -[[package]] -name = "curve25519-dalek" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "639891fde0dbea823fc3d798a0fdf9d2f9440a42d64a78ab3488b0ca025117b3" -dependencies = [ - "byteorder", - "digest 0.9.0", - "rand_core 0.5.1", - "subtle", - "zeroize", -] - -[[package]] -name = "darling" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d706e75d87e35569db781a9b5e2416cff1236a47ed380831f959382ccd5f858" -dependencies = [ - "darling_core 0.10.2", - "darling_macro 0.10.2", -] - -[[package]] -name = "darling" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f2c43f534ea4b0b049015d00269734195e6d3f0f6635cb692251aca6f9f8b3c" -dependencies = [ - "darling_core 0.12.4", - "darling_macro 0.12.4", -] - -[[package]] -name = "darling_core" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0c960ae2da4de88a91b2d920c2a7233b400bc33cb28453a2987822d8392519b" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim 0.9.3", - "syn", -] - -[[package]] -name = "darling_core" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e91455b86830a1c21799d94524df0845183fa55bafd9aa137b01c7d1065fa36" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim 0.10.0", - "syn", -] - -[[package]] -name = "darling_macro" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72" -dependencies = [ - "darling_core 0.10.2", - "quote", - "syn", -] - -[[package]] -name = "darling_macro" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29b5acf0dea37a7f66f7b25d2c5e93fd46f8f6968b1a5d7a3e02e97768afc95a" -dependencies = [ - "darling_core 0.12.4", - "quote", - "syn", -] - -[[package]] -name = "derive_more" -version = "0.99.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41cb0e6161ad61ed084a36ba71fbba9e3ac5aee3606fb607fe08da6acbcf3d8c" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "digest" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" -dependencies = [ - "generic-array 0.12.3", -] - -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array 0.14.4", -] - -[[package]] -name = "dynasm" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d7d1242462849390bb2ad38aeed769499f1afc7383affa2ab0c1baa894c0200" -dependencies = [ - "bitflags", - "byteorder", - "lazy_static", - "proc-macro-error", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "dynasmrt" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1dd4d1d5ca12258cef339a57a7643e8b233a42dea9bb849630ddd9dd7726aa9" -dependencies = [ - "byteorder", - "dynasm", - "memmap2", -] - -[[package]] -name = "easy-ext" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62473f23f4a15690bd64ea37269266ba7b273e7c26b302aef68d3968ae9262a0" -dependencies = [ - "quote", - "syn", -] - -[[package]] -name = "ed25519" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37c66a534cbb46ab4ea03477eae19d5c22c01da8258030280b7bd9d8433fb6ef" -dependencies = [ - "signature", -] - -[[package]] -name = "ed25519-dalek" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" -dependencies = [ - "curve25519-dalek", - "ed25519", - "rand 0.7.3", - "serde", - "sha2", - "zeroize", -] - -[[package]] -name = "either" -version = "1.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" - -[[package]] -name = "elastic-array" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d63720ea2bc2e1b79f7aa044d9dc0b825f9ccb6930b32120f8fb9e873aa84bc" -dependencies = [ - "heapsize", -] - -[[package]] -name = "enumset" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbd795df6708a599abf1ee10eacc72efd052b7a5f70fdf0715e4d5151a6db9c3" -dependencies = [ - "enumset_derive", -] - -[[package]] -name = "enumset_derive" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e19c52f9ec503c8a68dc04daf71a04b07e690c32ab1a8b68e33897f255269d47" -dependencies = [ - "darling 0.12.4", "proc-macro2", "quote", "syn", + "synstructure", ] [[package]] -name = "errno" -version = "0.2.7" +name = "filetime" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa68f2fb9cae9d37c9b2b3584aba698a2e97f72d7aef7b9f7aa71d8b54ce46fe" +checksum = "1d34cfa13a63ae058bfa601fe9e313bbdb3746427c1459185464ce0fcf62e1e8" dependencies = [ - "errno-dragonfly", + "cfg-if 1.0.0", "libc", + "redox_syscall 0.2.6", "winapi", ] [[package]] -name = "errno-dragonfly" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14ca354e36190500e1e1fb267c647932382b54053c50b14970856c0b00a35067" -dependencies = [ - "gcc", - "libc", -] - -[[package]] -name = "ethbloom" -version = "0.11.0" +name = "fixed-hash" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "779864b9c7f7ead1f092972c3257496c6a84b46dba2ce131dd8a282cb2cc5972" +checksum = "cfcf0ed7fe52a17a03854ec54a9f76d6d84508d1c0e66bc1793301c73fc8493c" dependencies = [ - "crunchy", - "fixed-hash", - "impl-rlp", - "impl-serde", - "tiny-keccak", + "byteorder", + "rand 0.8.4", + "rustc-hex", + "static_assertions", ] [[package]] -name = "ethereum-types" -version = "0.11.0" +name = "flate2" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f64b5df66a228d85e4b17e5d6c6aa43b0310898ffe8a85988c4c032357aaabfd" +checksum = "1e6988e897c1c9c485f43b47a529cef42fde0547f9d8d41a7062518f1d8fc53f" dependencies = [ - "ethbloom", - "fixed-hash", - "impl-rlp", - "impl-serde", - "primitive-types", - "uint", + "cfg-if 1.0.0", + "crc32fast", + "libc", + "miniz_oxide", ] [[package]] -name = "event-listener" -version = "2.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7531096570974c3a9dcf9e4b8e1cede1ec26cf5046219fb3b9d897503b9be59" - -[[package]] -name = "fallible-iterator" -version = "0.2.0" +name = "fnv" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] -name = "fixed-hash" -version = "0.7.0" +name = "foreign-types" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcf0ed7fe52a17a03854ec54a9f76d6d84508d1c0e66bc1793301c73fc8493c" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" dependencies = [ - "byteorder", - "rand 0.8.3", - "rustc-hex", - "static_assertions", + "foreign-types-shared", ] [[package]] -name = "fnv" -version = "1.0.7" +name = "foreign-types-shared" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" @@ -940,33 +717,12 @@ dependencies = [ "percent-encoding", ] -[[package]] -name = "fs_extra" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2022715d62ab30faffd124d40b76f4134a550a87792276512b18d63272333394" - [[package]] name = "funty" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fed34cd105917e91daa4da6b3728c47b068749d6a62c59811f06ed2ac71d9da7" -[[package]] -name = "futures" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9d5813545e459ad3ca1bff9915e9ad7f1a47dc6a91b627ce321d5863b7dd253" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - [[package]] name = "futures-channel" version = "0.3.14" @@ -974,7 +730,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce79c6a52a299137a6013061e0cf0e688fce5d7f1bc60125f520912fdb29ec25" dependencies = [ "futures-core", - "futures-sink", ] [[package]] @@ -983,35 +738,6 @@ version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "098cd1c6dda6ca01650f1a37a794245eb73181d0d4d4e955e2f3c37db7af1815" -[[package]] -name = "futures-executor" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10f6cb7042eda00f0049b1d2080aa4b93442997ee507eb3828e8bd7577f94c9d" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "365a1a1fb30ea1c03a830fdb2158f5236833ac81fa0ad12fe35b29cddc35cb04" - -[[package]] -name = "futures-macro" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "668c6733a182cd7deb4f1de7ba3bf2120823835b3bcfbeacf7d2c4a773c1bb8b" -dependencies = [ - "proc-macro-hack", - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "futures-sink" version = "0.3.14" @@ -1030,26 +756,12 @@ version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c144ad54d60f23927f0a6b6d816e4271278b64f005ad65e4e35291d2de9c025" dependencies = [ - "futures-channel", "futures-core", - "futures-io", - "futures-macro", - "futures-sink", "futures-task", - "memchr", "pin-project-lite", "pin-utils", - "proc-macro-hack", - "proc-macro-nested", - "slab", ] -[[package]] -name = "gcc" -version = "0.3.55" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2" - [[package]] name = "generic-array" version = "0.12.3" @@ -1093,54 +805,42 @@ dependencies = [ [[package]] name = "gimli" -version = "0.21.0" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcc8e0c9bce37868955864dbecd2b1ab2bdf967e6f28066d65aaac620444b65c" -dependencies = [ - "fallible-iterator", - "indexmap", - "stable_deref_trait", -] +checksum = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce" [[package]] -name = "gimli" -version = "0.22.0" +name = "h2" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aaf91faf136cb47367fa430cd46e37a788775e7fa104f8b4bcb3861dc389b724" +checksum = "d9f1f717ddc7b2ba36df7e871fd88db79326551d3d6f1fc406fbfd28b582ff8e" dependencies = [ - "fallible-iterator", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", "indexmap", - "stable_deref_trait", + "slab", + "tokio", + "tokio-util", + "tracing", ] -[[package]] -name = "gimli" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce" - -[[package]] -name = "glob" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" - [[package]] name = "hashbrown" version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04" -dependencies = [ - "ahash", -] [[package]] -name = "heapsize" -version = "0.4.2" +name = "hashbrown" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1679e6ea370dee694f91f1dc469bf94cf8f52051d147aec3e1f9497c6fc22461" +checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" dependencies = [ - "winapi", + "ahash", ] [[package]] @@ -1161,6 +861,12 @@ 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.2" @@ -1168,10 +874,84 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "644f9158b2f133fd50f5fb3242878846d9eb792e445c893805ff0e3824006e35" [[package]] -name = "ident_case" -version = "1.0.1" +name = "home" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2456aef2e6b6a9784192ae780c0f15bc57df0e918585282325e8c8ac27737654" +dependencies = [ + "winapi", +] + +[[package]] +name = "http" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31f4c6746584866f0feabcc69893c5b51beef3831656a968ed7ae254cdc4fd03" +dependencies = [ + "bytes", + "fnv", + "itoa 1.0.1", +] + +[[package]] +name = "http-body" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ff4f84919677303da5f147645dbea6b1881f368d03ac84e1dc09031ebd7b2c6" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acd94fdbe1d4ff688b67b04eee2e17bd50995534a61539e45adfefb45e5e5503" + +[[package]] +name = "httpdate" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" + +[[package]] +name = "hyper" +version = "0.14.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7ec3e62bdc98a2f0393a5048e4c30ef659440ea6e0e572965103e72bd836f55" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa 0.4.6", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-tls" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes", + "hyper", + "native-tls", + "tokio", + "tokio-native-tls", +] [[package]] name = "idna" @@ -1186,29 +966,22 @@ dependencies = [ [[package]] name = "impl-codec" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df170efa359aebdd5cb7fe78edcc67107748e4737bdca8a8fb40d15ea7a877ed" +checksum = "161ebdfec3c8e3b52bf61c4f3550a1eea4f9579d10dc1b936f3171ebdcd6c443" dependencies = [ "parity-scale-codec", ] [[package]] -name = "impl-rlp" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28220f89297a075ddc7245cd538076ee98b01f2a9c23a53a4f1105d5a322808" -dependencies = [ - "rlp", -] - -[[package]] -name = "impl-serde" -version = "0.3.1" +name = "impl-trait-for-tuples" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b47ca4d2b6931707a55fce5cf66aff80e2178c8b63bbb4ecb5695cbc870ddf6f" +checksum = "d5dacb10c5b3bb92d46ba347505a9041e676bb20ad220101326bffb0c93031ee" dependencies = [ - "serde", + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -1218,8 +991,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55e2e4c765aa53a0424761bf9f41aa7a6ac1efa87238f59560640e27fca028f2" dependencies = [ "autocfg", - "hashbrown", - "serde", + "hashbrown 0.9.1", ] [[package]] @@ -1232,39 +1004,39 @@ dependencies = [ ] [[package]] -name = "itoa" -version = "0.4.6" +name = "ipnet" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc6f3ad7b9d11a0c00842ff8de1b60ee58661048eb8049ed33c73594f359d7e6" +checksum = "68f2d64f2edebec4ce84ad108148e67e1064789bee435edc5b60ad398714a3a9" [[package]] -name = "jemalloc-sys" -version = "0.3.2" +name = "is_executable" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d3b9f3f5c9b31aa0f5ed3260385ac205db665baa41d49bb8338008ae94ede45" +checksum = "302d553b8abc8187beb7d663e34c065ac4570b273bc9511a50e940e99409c577" dependencies = [ - "cc", - "fs_extra", - "libc", + "winapi", ] [[package]] -name = "jemallocator" -version = "0.3.2" +name = "itoa" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43ae63fcfc45e99ab3d1b29a46782ad679e98436c3169d15a167a1108a724b69" -dependencies = [ - "jemalloc-sys", - "libc", -] +checksum = "dc6f3ad7b9d11a0c00842ff8de1b60ee58661048eb8049ed33c73594f359d7e6" [[package]] -name = "jobserver" -version = "0.1.22" +name = "itoa" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" + +[[package]] +name = "js-sys" +version = "0.3.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "972f5ae5d1cb9c6ae417789196c803205313edde988685da5e3aae0827b9e7fd" +checksum = "a38fc24e30fd564ce974c02bf1d337caddff65be6cc4735a1f7eab22a7440f04" dependencies = [ - "libc", + "wasm-bindgen", ] [[package]] @@ -1273,80 +1045,28 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" -[[package]] -name = "lazy-static-include" -version = "3.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c942ea960c2d8678d32cb14aa56d5c37f21107b54aa281c944e4d03690c55d1" -dependencies = [ - "lazy_static", - "slash-formatter", - "syn", -] - [[package]] name = "lazy_static" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - -[[package]] -name = "leb128" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3576a87f2ba00f6f106fdfcd16db1d698d648a26ad8e0573cad8537c3c362d2a" - [[package]] name = "libc" -version = "0.2.93" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9385f66bf6105b241aa65a61cb923ef20efc665cb9f9bb50ac2f0c4b7f378d41" - -[[package]] -name = "libloading" -version = "0.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "351a32417a12d5f7e82c368a66781e307834dae04c6ce0cd4456d52989229883" -dependencies = [ - "cfg-if 1.0.0", - "winapi", -] - -[[package]] -name = "libloading" -version = "0.7.0" +version = "0.2.116" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f84d96438c15fcd6c3f244c8fce01d1e2b9c6b5623e9c711dc9286d8fc92d6a" -dependencies = [ - "cfg-if 1.0.0", - "winapi", -] +checksum = "565dbd88872dbe4cc8a46e527f26483c1d1f7afa6b884a3bd6cd893d4f98da74" [[package]] -name = "librocksdb-sys" -version = "6.17.3" +name = "libz-sys" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5da125e1c0f22c7cae785982115523a0738728498547f415c9054cb17c7e89f9" +checksum = "de5435b8549c16d423ed0c03dbaafe57cf6c3344744f1242520d59c9d8ecec66" dependencies = [ - "bindgen", "cc", - "glob", "libc", -] - -[[package]] -name = "lock_api" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4da24a77a3d8a6d4862d95f72e6fdb9c09a643ecdb402d754004a557f2bec75" -dependencies = [ - "scopeguard", + "pkg-config", + "vcpkg", ] [[package]] @@ -1367,15 +1087,6 @@ dependencies = [ "cfg-if 1.0.0", ] -[[package]] -name = "mach" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa" -dependencies = [ - "libc", -] - [[package]] name = "matches" version = "0.1.8" @@ -1384,83 +1095,167 @@ checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" [[package]] name = "memchr" -version = "2.3.4" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525" +checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" [[package]] -name = "memmap" -version = "0.7.0" +name = "memory_units" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8452105ba047068f40ff7093dd1d9da90898e63dd61736462e9cdda6a90ad3c3" + +[[package]] +name = "mime" +version = "0.3.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" + +[[package]] +name = "miniz_oxide" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" +dependencies = [ + "adler", + "autocfg", +] + +[[package]] +name = "mio" +version = "0.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b" +checksum = "8067b404fe97c70829f082dec8bcf4f71225d7eaea1d8645349cb76fa06205cc" dependencies = [ "libc", + "log", + "miow", + "ntapi", "winapi", ] [[package]] -name = "memmap2" -version = "0.2.2" +name = "miow" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" +dependencies = [ + "winapi", +] + +[[package]] +name = "native-tls" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "397d1a6d6d0563c0f5462bbdae662cf6c784edf5e828e40c7257f85d82bf56dd" +checksum = "48ba9f7719b5a0f42f338907614285fb5fd70e53858141f69898a1fb7203b24d" dependencies = [ + "lazy_static", "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", ] [[package]] -name = "memoffset" -version = "0.5.6" +name = "near-account-id" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "043175f069eda7b85febe4a74abbaeff828d9f8b448515d3151a14a3542811aa" +checksum = "f5fbe33ba04b086e082aabe4167f03d8e7f5af2db4fffb5e6061226e46e7f5ff" dependencies = [ - "autocfg", + "borsh", + "serde", ] [[package]] -name = "memoffset" -version = "0.6.3" +name = "near-account-id" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83fb6581e8ed1f85fd45c116db8405483899489e38406156c25eb743554361d" +checksum = "4cd61f43cedc1bb7a7c097ef3adbab0092a51185dca0e48d5851b37818e13978" dependencies = [ - "autocfg", + "borsh", + "serde", ] [[package]] -name = "memory_units" -version = "0.4.0" +name = "near-chain-configs" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8452105ba047068f40ff7093dd1d9da90898e63dd61736462e9cdda6a90ad3c3" +checksum = "e4c229496a676c08440e3566e09d05f472dd9b3bd5885cc24b5634ffac145842" +dependencies = [ + "chrono", + "derive_more", + "near-crypto 0.5.0", + "near-primitives 0.5.0", + "num-rational", + "serde", + "serde_json", + "sha2", + "smart-default", + "tracing", +] [[package]] -name = "miniz_oxide" -version = "0.4.4" +name = "near-chain-primitives" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" +checksum = "f9ff481b515b4399b74d18f63c34f9860a843d904ebf77cd7b86f9a8323737d4" dependencies = [ - "adler", - "autocfg", + "chrono", + "failure", + "failure_derive", + "log", + "near-crypto 0.5.0", + "near-primitives 0.5.0", + "thiserror", ] [[package]] -name = "more-asserts" -version = "0.2.1" +name = "near-chunks-primitives" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbdf2e3c24a5092b58aa114120c4d533811d595461196a2e6ec05dfdedcc179d" +dependencies = [ + "near-chain-primitives", +] + +[[package]] +name = "near-client-primitives" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0debeb9fcf88823ea64d64e4a815ab1643f33127d995978e099942ce38f25238" +checksum = "8e37fedeee10f1da6d3ab854705346b7f0ad6d142c2049a4a14e76d349ad6f6a" +dependencies = [ + "actix", + "chrono", + "near-chain-configs", + "near-chain-primitives", + "near-chunks-primitives", + "near-crypto 0.5.0", + "near-network-primitives", + "near-primitives 0.5.0", + "serde", + "strum", + "thiserror", +] [[package]] name = "near-contract-standards" -version = "3.1.0" +version = "4.0.0-pre.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5837ffd278eeedc4f97104586b3851ed9e7c32449de8b54e8d752f22498588e" +checksum = "b291a51228ed563f684ed75d9e61bb3b2881e957c72e9d9868971b453d958c46" dependencies = [ "near-sdk", ] [[package]] name = "near-crypto" -version = "0.1.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb14bec070cfd808438712cda5d54703001b9cf1196c8afaeadc9514e06d00a3" +checksum = "7e44231c19aa95e0ff3b1a46209a8edb44f5e02fca8a60a19386ba38b2ee1942" dependencies = [ "arrayref", "blake2", @@ -1472,7 +1267,9 @@ dependencies = [ "ed25519-dalek", "lazy_static", "libc", + "near-account-id 0.5.0", "parity-secp256k1", + "primitive-types", "rand 0.7.3", "rand_core 0.5.1", "serde", @@ -1482,10 +1279,77 @@ dependencies = [ ] [[package]] -name = "near-metrics" +name = "near-crypto" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f68d8d55bd2a457eba5956d8c1255e288c47f394ca6fffe6184d19664bf0bc4c" +dependencies = [ + "arrayref", + "blake2", + "borsh", + "bs58", + "c2-chacha", + "curve25519-dalek", + "derive_more", + "ed25519-dalek", + "lazy_static", + "libc", + "near-account-id 0.10.0", + "parity-secp256k1", + "primitive-types", + "rand 0.7.3", + "rand_core 0.5.1", + "serde", + "serde_json", + "subtle", + "thiserror", +] + +[[package]] +name = "near-jsonrpc-client" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7b9dcbc960db15fcec85bcb29a78b57e4005b7b1a0afc70a26a97453862528e" +checksum = "daacff85a890d04b05851fcbc29feff0645634dc247a7842157aedbe377a8074" +dependencies = [ + "borsh", + "lazy_static", + "near-chain-configs", + "near-client-primitives", + "near-jsonrpc-primitives", + "near-primitives 0.5.0", + "reqwest", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "near-jsonrpc-primitives" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e47ebf93ecb3d5b2a5e4a7e7986d2772dd6d98712ec6844efd8948c25673f06f" +dependencies = [ + "actix", + "lazy_static", + "near-chain-configs", + "near-client-primitives", + "near-crypto 0.5.0", + "near-metrics", + "near-primitives 0.5.0", + "near-primitives-core 0.5.0", + "near-rpc-error-macro 0.5.0", + "serde", + "serde_json", + "thiserror", + "tracing", + "uuid", +] + +[[package]] +name = "near-metrics" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e833372067545d0bb84015f283ad05f13f5a2cdd4ec2d9bbbce76915bf9d0502" dependencies = [ "lazy_static", "log", @@ -1493,37 +1357,72 @@ dependencies = [ ] [[package]] -name = "near-pool" -version = "0.1.0-pre.1" +name = "near-network-primitives" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1629497107e6b2e003e8b90ae1ddda9f661c9030baf5c2a3d58bc589a525d752" +dependencies = [ + "actix", + "borsh", + "chrono", + "near-crypto 0.5.0", + "near-primitives 0.5.0", + "serde", + "strum", + "tokio", + "tracing", +] + +[[package]] +name = "near-primitives" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bde79472f7cfc0675733b65f79f9e50c20bfbb9806298ab2872916869a45dccd" +checksum = "78f106c7bbf2a12228daf4af2a976122b030745683ede24b5dc4514e8faaa36c" dependencies = [ + "base64 0.13.0", "borsh", - "near-crypto", - "near-primitives", + "bs58", + "byteorder", + "bytesize", + "chrono", + "derive_more", + "easy-ext", + "hex 0.4.2", + "near-crypto 0.5.0", + "near-primitives-core 0.5.0", + "near-rpc-error-macro 0.5.0", + "near-vm-errors 3.1.0", + "num-rational", + "primitive-types", "rand 0.7.3", + "reed-solomon-erasure", + "regex", + "serde", + "serde_json", + "sha2", + "smart-default", + "validator", ] [[package]] name = "near-primitives" -version = "0.1.0-pre.1" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75ed2263518ca67a3c158c144813832fd96f48ab239494bb9d7793d315f31417" +checksum = "04d93aaf84ad4f5ccf780d8a0029c6fb636a2e6c1ddb3c772dee4686529e30a8" dependencies = [ - "base64", + "base64 0.13.0", "borsh", "bs58", "byteorder", + "bytesize", "chrono", "derive_more", "easy-ext", - "hex", - "jemallocator", - "lazy_static", - "near-crypto", - "near-primitives-core", - "near-rpc-error-macro", - "near-vm-errors", + "hex 0.4.2", + "near-crypto 0.10.0", + "near-primitives-core 0.10.0", + "near-rpc-error-macro 0.10.0", + "near-vm-errors 0.10.0", "num-rational", "primitive-types", "rand 0.7.3", @@ -1538,16 +1437,36 @@ dependencies = [ [[package]] name = "near-primitives-core" -version = "0.4.0" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "108d06655885c1174823e41941fd44a82e13e850b12fa068a95194c96e247c68" +dependencies = [ + "base64 0.11.0", + "borsh", + "bs58", + "derive_more", + "hex 0.4.2", + "lazy_static", + "near-account-id 0.5.0", + "num-rational", + "serde", + "serde_json", + "sha2", +] + +[[package]] +name = "near-primitives-core" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2b3fb5acf3a494aed4e848446ef2d6ebb47dbe91c681105d4d1786c2ee63e52" +checksum = "4d88b2b0f418c1174214fb51106c90251f61ecfe4c7063f149c2e199ec2850fd" dependencies = [ - "base64", + "base64 0.11.0", "borsh", "bs58", "derive_more", - "hex", + "hex 0.4.2", "lazy_static", + "near-account-id 0.10.0", "num-rational", "serde", "serde_json", @@ -1556,24 +1475,35 @@ dependencies = [ [[package]] name = "near-rpc-error-core" -version = "0.1.0" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1db59973d0e8d8bd4be5ae508600add29f96737722d30e05cfc49e5044ded955" +dependencies = [ + "proc-macro2", + "quote", + "serde", + "syn", +] + +[[package]] +name = "near-rpc-error-core" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffa8dbf8437a28ac40fcb85859ab0d0b8385013935b000c7a51ae79631dd74d9" +checksum = "4a98c9bd7edee4dcfc293e3511e9fab826bcd6fbfbfe06124a1164b94ee60351" dependencies = [ "proc-macro2", "quote", "serde", - "serde_json", "syn", ] [[package]] name = "near-rpc-error-macro" -version = "0.1.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c6111d713e90c7c551dee937f4a06cb9ea2672243455a4454cc7566387ba2d9" +checksum = "46bde9eb491ab7ccccd48ee6d438dc07aa74318faa0ff007717c3d5b538d3951" dependencies = [ - "near-rpc-error-core", + "near-rpc-error-core 0.5.0", "proc-macro2", "quote", "serde", @@ -1582,54 +1512,44 @@ dependencies = [ ] [[package]] -name = "near-runtime" -version = "4.0.0-pre.1" +name = "near-rpc-error-macro" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e4c0a4cd2ee5ccbc1fd5d492180ebf33ac1159d721b2e0c58c11953131fb449" +checksum = "1abade92d0fc76a6c25aeb82f3e7fd97678ab5d0fd92b80149a65d1088e86505" dependencies = [ - "borsh", - "byteorder", - "ethereum-types", - "hex", - "lazy_static", - "log", - "near-crypto", - "near-metrics", - "near-primitives", - "near-runtime-utils", - "near-store", - "near-vm-errors", - "near-vm-logic", - "near-vm-runner", - "num-bigint", - "num-rational", - "num-traits", - "rand 0.7.3", + "near-rpc-error-core 0.10.0", + "proc-macro2", + "quote", "serde", "serde_json", + "syn", ] [[package]] -name = "near-runtime-utils" -version = "4.0.0-pre.1" +name = "near-sandbox-utils" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a48d80c4ca1d4cf99bc16490e1e3d49826c150dfc4410ac498918e45c7d98e07" +checksum = "51766f7cdbe34f7358f0dd2286297425ce7d57907078818b6e461b4ce83159fb" dependencies = [ - "lazy_static", - "regex", + "anyhow", + "binary-install", + "chrono", + "hex 0.3.2", + "home", ] [[package]] name = "near-sdk" -version = "3.1.0" +version = "4.0.0-pre.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7383e242d3e07bf0951e8589d6eebd7f18bb1c1fc5fbec3fad796041a6aebd1" +checksum = "8cc26331767055239c2ed7ef9e7b415fdc40f7d6c7ea66a39d2079617010ea3e" dependencies = [ - "base64", + "base64 0.13.0", "borsh", "bs58", - "near-primitives-core", + "near-primitives-core 0.10.0", "near-sdk-macros", + "near-sys", "near-vm-logic", "serde", "serde_json", @@ -1637,10 +1557,10 @@ dependencies = [ ] [[package]] -name = "near-sdk-core" -version = "3.1.0" +name = "near-sdk-macros" +version = "4.0.0-pre.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "284a78d9eb8eda58330462fa0023a6d7014c941df1f0387095e7dfd1dc0f2bce" +checksum = "f362de96b36911d93dc34c909304c90885d66aaf8c66f89e609144b0c20439df" dependencies = [ "Inflector", "proc-macro2", @@ -1649,131 +1569,103 @@ dependencies = [ ] [[package]] -name = "near-sdk-macros" -version = "3.1.0" +name = "near-sys" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6a7aa3f46fac44416d8a93d14f30a562c4d730a1c6bf14bffafab5f475c244a" + +[[package]] +name = "near-units" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2037337438f97d1ce5f7c896cf229dc56dacd5c01142d1ef95a7d778cde6ce7d" +checksum = "97a2b77f295d398589eeee51ad0887905ef1734fb12b45cb6d77bd7e401988b9" dependencies = [ - "near-sdk-core", - "proc-macro2", - "quote", - "syn", + "near-units-core", + "near-units-macro", ] [[package]] -name = "near-sdk-sim" -version = "3.1.0" +name = "near-units-core" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdedcf70a6bf5b7d9062e2ebd3dbd80955d062f63b8da7a5d81e77e685fbbc89" +checksum = "89aa2a7985de87a08ca35f28abd8d00f0f901e704257e6e029aadef981386bc6" dependencies = [ - "funty", - "lazy-static-include", - "near-crypto", - "near-pool", - "near-primitives", - "near-runtime", - "near-sdk", - "near-store", - "near-vm-logic", + "num-format", + "regex", +] + +[[package]] +name = "near-units-macro" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89ab45d066220846f9bd5c21e9ab88c47c892edd36f962ada78bf8308523171a" +dependencies = [ + "near-units-core", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "near-store" -version = "0.1.0-pre.1" +name = "near-vm-errors" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e880d1d9a4ca5a1ca1ea0366fd80e295465f90cd0c1209f45d6d0b7a443ed4" +checksum = "e781248bed1f8e4792aee0c0362cf8bc831fc9f51573bc43807b5e07e0e7db81" dependencies = [ "borsh", - "byteorder", - "cached", - "derive_more", - "elastic-array", - "lazy_static", - "near-crypto", - "near-primitives", - "num_cpus", - "rand 0.7.3", - "rocksdb", + "hex 0.4.2", + "near-account-id 0.10.0", + "near-rpc-error-macro 0.10.0", "serde", - "serde_json", - "strum", ] [[package]] name = "near-vm-errors" -version = "4.0.0-pre.1" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e281d8730ed8cb0e3e69fb689acee6b93cdb43824cd69a8ffd7e1bfcbd1177d7" +checksum = "ffec816703a13b6ca5b3dbd0005e6eb5360087058203c93e859a019dbfd88300" dependencies = [ "borsh", - "hex", - "near-rpc-error-macro", + "hex 0.4.2", + "near-account-id 0.5.0", + "near-rpc-error-macro 0.5.0", "serde", ] [[package]] name = "near-vm-logic" -version = "4.0.0-pre.1" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e11cb28a2d07f37680efdaf860f4c9802828c44fc50c08009e7884de75d982c5" +checksum = "9c06b3cb3ccf0423a9ba6908ccf07abe19c3c34319af200c733f34b7ac5af0ab" dependencies = [ - "base64", + "base64 0.13.0", "borsh", "bs58", "byteorder", - "near-primitives-core", - "near-runtime-utils", - "near-vm-errors", + "near-account-id 0.10.0", + "near-crypto 0.10.0", + "near-primitives 0.10.0", + "near-primitives-core 0.10.0", + "near-vm-errors 0.10.0", + "ripemd160", "serde", "sha2", "sha3", ] [[package]] -name = "near-vm-runner" -version = "4.0.0-pre.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93a66e94e12ec66a29674cc4efa975c280415aa0c944d7294cedbdb0c3858b48" -dependencies = [ - "anyhow", - "borsh", - "cached", - "log", - "near-primitives", - "near-vm-errors", - "near-vm-logic", - "parity-wasm", - "pwasm-utils", - "tracing", - "wasmer", - "wasmer-compiler-singlepass", - "wasmer-runtime-core-near", - "wasmer-runtime-near", - "wasmer-types", - "wasmtime", -] - -[[package]] -name = "nix" -version = "0.15.0" +name = "nodrop" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b2e0b4f3320ed72aaedb9a5ac838690a8047c7b275da22711fddff4f8a14229" -dependencies = [ - "bitflags", - "cc", - "cfg-if 0.1.10", - "libc", - "void", -] +checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" [[package]] -name = "nom" -version = "5.1.2" +name = "ntapi" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffb4262d26ed83a1c0a33a38fe2bb15797329c85770da05e6b828ddb782627af" +checksum = "3f6bb902e437b6d86e03cce10a7e2af662292c5dfef23b65899ea3ac9354ad44" dependencies = [ - "memchr", - "version_check", + "winapi", ] [[package]] @@ -1787,6 +1679,16 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-format" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bafe4179722c2894288ee77a9f044f02811c86af699344c498b0840c698a2465" +dependencies = [ + "arrayvec 0.4.12", + "itoa 0.4.6", +] + [[package]] name = "num-integer" version = "0.1.44" @@ -1829,27 +1731,6 @@ dependencies = [ "libc", ] -[[package]] -name = "object" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37fd5004feb2ce328a52b0b3d01dbf4ffff72583493900ed15f22d4111c51693" -dependencies = [ - "crc32fast", - "indexmap", - "wasmparser 0.57.0", -] - -[[package]] -name = "object" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d3b63360ec3cb337817c2dbd47ab4a0f170d285d8e5a2064600f3def1402397" -dependencies = [ - "crc32fast", - "indexmap", -] - [[package]] name = "object" version = "0.23.0" @@ -1875,27 +1756,64 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] -name = "page_size" -version = "0.4.2" +name = "openssl" +version = "0.10.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eebde548fbbf1ea81a99b128872779c437752fb99f217c45245e1a61dcd9edcd" +checksum = "0c7ae222234c30df141154f159066c5093ff73b63204dcda7121eb082fc56a95" dependencies = [ + "bitflags", + "cfg-if 1.0.0", + "foreign-types", "libc", - "winapi", + "once_cell", + "openssl-sys", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-sys" +version = "0.9.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e46109c383602735fa0a2e48dd2b7c892b048e1bf69e5c3b1d804b7d9c203cb" +dependencies = [ + "autocfg", + "cc", + "libc", + "pkg-config", + "vcpkg", ] [[package]] name = "parity-scale-codec" -version = "2.1.1" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0f518afaa5a47d0d6386229b0a6e01e86427291d643aa4cabb4992219f504f8" +checksum = "373b1a4c1338d9cd3d1fa53b3a11bdab5ab6bd80a20f7f7becd76953ae2be909" dependencies = [ "arrayvec 0.7.0", "bitvec", "byte-slice-cast", + "impl-trait-for-tuples", + "parity-scale-codec-derive", "serde", ] +[[package]] +name = "parity-scale-codec-derive" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1557010476e0595c9b568d16dcfb81b93cdeb157612726f5170d31aa707bed27" +dependencies = [ + "proc-macro-crate 1.1.0", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "parity-secp256k1" version = "0.7.0" @@ -1908,22 +1826,6 @@ dependencies = [ "rand 0.7.3", ] -[[package]] -name = "parity-wasm" -version = "0.41.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddfc878dac00da22f8f61e7af3157988424567ab01d9920b962ef7dcbd7cd865" - -[[package]] -name = "parking_lot" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3a704eb390aafdc107b0e392f56a82b668e3a71366993b5340f5833fd62505e" -dependencies = [ - "lock_api 0.3.4", - "parking_lot_core 0.7.2", -] - [[package]] name = "parking_lot" version = "0.11.1" @@ -1931,22 +1833,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d7744ac029df22dca6284efe4e898991d28e3085c706c972bcd7da4a27a15eb" dependencies = [ "instant", - "lock_api 0.4.3", - "parking_lot_core 0.8.3", -] - -[[package]] -name = "parking_lot_core" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d58c7c768d4ba344e3e8d72518ac13e259d7c7ade24167003b8488e10b6740a3" -dependencies = [ - "cfg-if 0.1.10", - "cloudabi", - "libc", - "redox_syscall 0.1.57", - "smallvec", - "winapi", + "lock_api", + "parking_lot_core", ] [[package]] @@ -1963,18 +1851,32 @@ dependencies = [ "winapi", ] -[[package]] -name = "peeking_take_while" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" - [[package]] name = "percent-encoding" version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" +[[package]] +name = "pin-project" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58ad3879ad3baf4e44784bc6a718a8698867bb991f8ce24d1bcbe2cfb4c3a75e" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "744b6f092ba29c3650faf274db506afd39944f48420f6c86b17cfe0ee1cb36bb" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "pin-project-lite" version = "0.2.6" @@ -1987,6 +1889,21 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "pkg-config" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58893f751c9b0412871a09abd62ecd2a00298c6c83befa223ef98c52aef40cbe" + +[[package]] +name = "portpicker" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be97d76faf1bfab666e1375477b23fde79eccf0276e9b63b92a39d676a889ba9" +dependencies = [ + "rand 0.8.4", +] + [[package]] name = "ppv-lite86" version = "0.2.10" @@ -1995,14 +1912,12 @@ checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" [[package]] name = "primitive-types" -version = "0.9.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2415937401cb030a2a0a4d922483f945fa068f52a7dbb22ce0fe5f2b6f6adace" +checksum = "05e4722c697a58a99d5d06a08c30821d7c082a4632198de1eaa5a6c22ef42373" dependencies = [ "fixed-hash", "impl-codec", - "impl-rlp", - "impl-serde", "uint", ] @@ -2016,41 +1931,15 @@ dependencies = [ ] [[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" +name = "proc-macro-crate" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +checksum = "1ebace6889caf889b4d3f76becee12e90353f2b8c7d875534a71e5742f8f6f83" dependencies = [ - "proc-macro2", - "quote", - "version_check", + "thiserror", + "toml", ] -[[package]] -name = "proc-macro-hack" -version = "0.5.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" - -[[package]] -name = "proc-macro-nested" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc881b2c22681370c6a780e47af9840ef841837bc98118431d4e1868bd0c1086" - [[package]] name = "proc-macro2" version = "1.0.24" @@ -2069,7 +1958,7 @@ dependencies = [ "cfg-if 1.0.0", "fnv", "lazy_static", - "parking_lot 0.11.1", + "parking_lot", "protobuf", "regex", "thiserror", @@ -2081,17 +1970,6 @@ version = "2.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b7f4a129bb3754c25a4e04032a90173c68f85168f77118ac4cb4936e7f06f92" -[[package]] -name = "pwasm-utils" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f7a12f176deee919f4ba55326ee17491c8b707d0987aed822682c821b660192" -dependencies = [ - "byteorder", - "log", - "parity-wasm", -] - [[package]] name = "quote" version = "1.0.7" @@ -2122,9 +2000,9 @@ dependencies = [ [[package]] name = "rand" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" +checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" dependencies = [ "libc", "rand_chacha 0.3.0", @@ -2188,42 +2066,6 @@ dependencies = [ "rand_core 0.6.2", ] -[[package]] -name = "raw-cpuid" -version = "7.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "beb71f708fe39b2c5e98076204c3cc094ee5a4c12c4cdb119a2b72dc34164f41" -dependencies = [ - "bitflags", - "cc", - "rustc_version", -] - -[[package]] -name = "rayon" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b0d8e0819fadc20c74ea8373106ead0600e3a67ef1fe8da56e39b9ae7275674" -dependencies = [ - "autocfg", - "crossbeam-deque", - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ab346ac5921dc62ffa9f89b7a773907511cdfa5490c572ae9be1be33e8afa4a" -dependencies = [ - "crossbeam-channel", - "crossbeam-deque", - "crossbeam-utils", - "lazy_static", - "num_cpus", -] - [[package]] name = "redox_syscall" version = "0.1.57" @@ -2240,93 +2082,118 @@ dependencies = [ ] [[package]] -name = "reed-solomon-erasure" -version = "4.0.2" +name = "redox_users" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a415a013dd7c5d4221382329a5a3482566da675737494935cbbbcdec04662f9d" +checksum = "de0737333e7a9502c789a36d7c7fa6092a49895d4faa31ca5df163857ded2e9d" dependencies = [ - "smallvec", + "getrandom 0.1.16", + "redox_syscall 0.1.57", + "rust-argon2", ] [[package]] -name = "regalloc" -version = "0.0.30" +name = "redox_users" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2041c2d34f6ff346d6f428974f03d8bf12679b0c816bb640dc5eb1d48848d8d1" +checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64" dependencies = [ - "log", - "rustc-hash", - "smallvec", + "getrandom 0.2.2", + "redox_syscall 0.2.6", ] [[package]] -name = "regalloc" -version = "0.0.31" +name = "reed-solomon-erasure" +version = "4.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "571f7f397d61c4755285cd37853fe8e03271c243424a907415909379659381c5" +checksum = "a415a013dd7c5d4221382329a5a3482566da675737494935cbbbcdec04662f9d" dependencies = [ - "log", - "rustc-hash", "smallvec", ] [[package]] name = "regex" -version = "1.4.3" +version = "1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9251239e129e16308e70d853559389de218ac275b515068abc96829d05b948a" +checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461" dependencies = [ "aho-corasick", "memchr", "regex-syntax", - "thread_local", ] [[package]] name = "regex-syntax" -version = "0.6.22" +version = "0.6.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5eb417147ba9860a96cfe72a0b93bf88fee1744b5636ec99ab20c1aa9376581" +checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" [[package]] -name = "region" -version = "2.2.0" +name = "remove_dir_all" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877e54ea2adcd70d80e9179344c97f93ef0dffd6b03e1f4529e6e83ab2fa9ae0" +checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" dependencies = [ - "bitflags", - "libc", - "mach", "winapi", ] [[package]] -name = "remove_dir_all" -version = "0.5.3" +name = "reqwest" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" +checksum = "87f242f1488a539a79bac6dbe7c8609ae43b7914b7736210f239a37cccb32525" dependencies = [ - "winapi", + "base64 0.13.0", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-tls", + "ipnet", + "js-sys", + "lazy_static", + "log", + "mime", + "native-tls", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "serde_urlencoded", + "tokio", + "tokio-native-tls", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg", ] [[package]] -name = "rlp" -version = "0.5.0" +name = "ripemd160" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e54369147e3e7796c9b885c7304db87ca3d09a0a98f72843d532868675bbfba8" +checksum = "2eca4ecc81b7f313189bf73ce724400a07da2a6dac19588b03c8bd76a2dcc251" dependencies = [ - "bytes", - "rustc-hex", + "block-buffer 0.9.0", + "digest 0.9.0", + "opaque-debug 0.3.0", ] [[package]] -name = "rocksdb" -version = "0.15.0" +name = "rust-argon2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23d83c02c429044d58474eaf5ae31e062d0de894e21125b47437ec0edc1397e6" +checksum = "4b18820d944b33caa75a71378964ac46f58517c92b6ae5f762636247c09e78fb" dependencies = [ - "libc", - "librocksdb-sys", + "base64 0.13.0", + "blake2b_simd", + "constant_time_eq", + "crossbeam-utils", ] [[package]] @@ -2335,27 +2202,12 @@ version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e3bad0ee36814ca07d7968269dd4b7ec89ec2da10c4bb613928d3077083c232" -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - [[package]] name = "rustc-hex" version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" -[[package]] -name = "rustc_version" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -dependencies = [ - "semver", -] - [[package]] name = "ryu" version = "1.0.5" @@ -2363,59 +2215,58 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" [[package]] -name = "scopeguard" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" - -[[package]] -name = "semver" -version = "0.9.0" +name = "schannel" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" +checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75" dependencies = [ - "semver-parser", + "lazy_static", + "winapi", ] [[package]] -name = "semver-parser" -version = "0.7.0" +name = "scopeguard" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] -name = "serde" -version = "1.0.117" +name = "security-framework" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b88fa983de7720629c9387e9f517353ed404164b1e482c970a90c1a4aaf7dc1a" +checksum = "23a2ac85147a3a11d77ecf1bc7166ec0b92febfa4461c37944e180f319ece467" dependencies = [ - "serde_derive", + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", ] [[package]] -name = "serde-bench" -version = "0.0.7" +name = "security-framework-sys" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d733da87e79faaac25616e33d26299a41143fd4cd42746cbb0e91d8feea243fd" +checksum = "a57321bf8bc2362081b2599912d2961fe899c0efadf1b4b2f8d48b3e253bb96c" dependencies = [ - "byteorder", - "serde", + "core-foundation-sys", + "libc", ] [[package]] -name = "serde_bytes" -version = "0.11.5" +name = "serde" +version = "1.0.136" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16ae07dd2f88a366f15bd0632ba725227018c69a1c8550a927324f8eb8368bb9" +checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789" dependencies = [ - "serde", + "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.117" +version = "1.0.136" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbd1ae72adb44aab48f325a02444a5fc079349a8d804c1fc922aed3f7454c74e" +checksum = "08597e7152fcd306f41838ed3e37be9eaeed2b61c42e2117266a554fab4662f9" dependencies = [ "proc-macro2", "quote", @@ -2424,12 +2275,24 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.60" +version = "1.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1500e84d27fe482ed1dc791a56eddc2f230046a040fa908c08bda1d9fb615779" +checksum = "d23c1ba4cf0efd44be32017709280b32d1cea5c3f1275c3b6d9e8bc54f758085" dependencies = [ "indexmap", - "itoa", + "itoa 1.0.1", + "ryu", + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa 1.0.1", "ryu", "serde", ] @@ -2461,10 +2324,13 @@ dependencies = [ ] [[package]] -name = "shlex" -version = "0.1.1" +name = "signal-hook-registry" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2" +checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" +dependencies = [ + "libc", +] [[package]] name = "signature" @@ -2473,19 +2339,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f0242b8e50dd9accdd56170e94ca1ebd223b098eb9c83539a6e367d0f36ae68" [[package]] -name = "slab" -version = "0.4.3" +name = "siphasher" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f173ac3d1a7e3b28003f40de0b5ce7fe2710f9b9dc3fc38664cebee46b3b6527" +checksum = "0b8de496cf83d4ed58b6be86c3a275b8602f6ffe98d3024a869e124147a9a3ac" [[package]] -name = "slash-formatter" -version = "3.1.1" +name = "slab" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55a065b7c425d213cbefcaaa4b62dd936183fa41c806a74767c72dd659ff4ad0" -dependencies = [ - "concat-with", -] +checksum = "f173ac3d1a7e3b28003f40de0b5ce7fe2710f9b9dc3fc38664cebee46b3b6527" [[package]] name = "smallvec" @@ -2505,10 +2368,14 @@ dependencies = [ ] [[package]] -name = "stable_deref_trait" -version = "1.2.0" +name = "socket2" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0" +dependencies = [ + "libc", + "winapi", +] [[package]] name = "static_assertions" @@ -2516,18 +2383,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" -[[package]] -name = "strsim" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c" - -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - [[package]] name = "strum" version = "0.20.0" @@ -2557,9 +2412,9 @@ checksum = "1e81da0851ada1f3e9d4312c704aa4f8806f0f9d69faaf8df2f3464b4a9437c2" [[package]] name = "syn" -version = "1.0.57" +version = "1.0.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4211ce9909eb971f111059df92c45640aad50a619cf55cd76476be803c4c68e6" +checksum = "6498a9efc342871f91cc2d0d694c674368b4ceb40f62b65a7a08c3792935e702" dependencies = [ "proc-macro2", "quote", @@ -2585,16 +2440,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] -name = "target-lexicon" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab0e7238dcc7b40a7be719a25365910f6807bd864f4cce6b2e6b873658e2b19d" - -[[package]] -name = "target-lexicon" -version = "0.11.2" +name = "tar" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "422045212ea98508ae3d28025bc5aaa2bd4a9cdaecd442a08da2ee620ee9ea95" +checksum = "4b55807c0344e1e6c04d7c965f5289c39a8d94ae23ed5c0b57aabac549f871c6" +dependencies = [ + "filetime", + "libc", + "xattr", +] [[package]] name = "tempfile" @@ -2604,7 +2458,7 @@ checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" dependencies = [ "cfg-if 1.0.0", "libc", - "rand 0.8.3", + "rand 0.8.4", "redox_syscall 0.2.6", "remove_dir_all", "winapi", @@ -2612,33 +2466,24 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.24" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0f4a65597094d4483ddaed134f409b2cb7c1beccf25201a9f73c719254fa98e" +checksum = "854babe52e4df1653706b98fcfc05843010039b406875930a70e4d9644e5c417" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.24" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7765189610d8241a44529806d6fd1f2e0a08734313a35d5b3a556f92b381f3c0" +checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b" dependencies = [ "proc-macro2", "quote", "syn", ] -[[package]] -name = "thread_local" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8018d24e04c95ac8790716a5987d0fec4f8b27249ffa0f7d33f1369bdfb88cbd" -dependencies = [ - "once_cell", -] - [[package]] name = "time" version = "0.1.43" @@ -2649,15 +2494,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "tiny-keccak" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" -dependencies = [ - "crunchy", -] - [[package]] name = "tinyvec" version = "1.2.0" @@ -2674,31 +2510,29 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] -name = "toml" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa" -dependencies = [ - "serde", -] - -[[package]] -name = "tracing" -version = "0.1.25" +name = "tokio" +version = "1.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01ebdc2bb4498ab1ab5f5b73c5803825e60199229ccba0698170e3be0e7f959f" +checksum = "0c27a64b625de6d309e8c57716ba93021dccf1b3b5c97edd6d3dd2d2135afc0a" dependencies = [ - "cfg-if 1.0.0", + "bytes", + "libc", + "memchr", + "mio", + "num_cpus", + "once_cell", + "parking_lot", "pin-project-lite", - "tracing-attributes", - "tracing-core", + "signal-hook-registry", + "tokio-macros", + "winapi", ] [[package]] -name = "tracing-attributes" -version = "0.1.15" +name = "tokio-macros" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c42e6fa53307c8a17e4ccd4dc81cf5ec38db9209f59b222210375b54ee40d1e2" +checksum = "b557f72f448c511a979e2564e55d74e6c4432fc96ff4f6241bc6bded342643b7" dependencies = [ "proc-macro2", "quote", @@ -2706,581 +2540,306 @@ dependencies = [ ] [[package]] -name = "tracing-core" -version = "0.1.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f50de3927f93d202783f4513cda820ab47ef17f624b03c096e86ef00c67e6b5f" -dependencies = [ - "lazy_static", -] - -[[package]] -name = "typenum" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33" - -[[package]] -name = "uint" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e11fe9a9348741cf134085ad57c249508345fe16411b3d7fb4ff2da2f1d6382e" -dependencies = [ - "byteorder", - "crunchy", - "hex", - "static_assertions", -] - -[[package]] -name = "unicode-bidi" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeb8be209bb1c96b7c177c7420d26e04eccacb0eeae6b980e35fcb74678107e0" -dependencies = [ - "matches", -] - -[[package]] -name = "unicode-normalization" -version = "0.1.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07fbfce1c8a97d547e8b5334978438d9d6ec8c20e38f56d4a4374d181493eaef" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-segmentation" -version = "1.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb0d2e7be6ae3a5fa87eed5fb451aff96f2573d2694942e40543ae0bbe19c796" - -[[package]] -name = "unicode-xid" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" - -[[package]] -name = "url" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ccd964113622c8e9322cfac19eb1004a07e636c545f325da085d5cdde6f1f8b" -dependencies = [ - "form_urlencoded", - "idna", - "matches", - "percent-encoding", -] - -[[package]] -name = "validator" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841d6937c33ec6039d8071bcf72933146b5bbe378d645d8fa59bdadabfc2a249" -dependencies = [ - "idna", - "lazy_static", - "regex", - "serde", - "serde_derive", - "serde_json", - "url", - "validator_types", -] - -[[package]] -name = "validator_types" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad9680608df133af2c1ddd5eaf1ddce91d60d61b6bc51494ef326458365a470a" - -[[package]] -name = "version_check" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed" - -[[package]] -name = "void" -version = "1.0.2" +name = "tokio-native-tls" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" - -[[package]] -name = "w_near" -version = "1.0.0" +checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b" dependencies = [ - "near-contract-standards", - "near-sdk", - "near-sdk-sim", + "native-tls", + "tokio", ] [[package]] -name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" - -[[package]] -name = "wasi" -version = "0.10.2+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" - -[[package]] -name = "wasmer" -version = "1.0.2" +name = "tokio-retry" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a70cfae554988d904d64ca17ab0e7cd652ee5c8a0807094819c1ea93eb9d6866" +checksum = "7f57eb36ecbe0fc510036adff84824dd3c24bb781e21bfa67b69d556aa85214f" dependencies = [ - "cfg-if 0.1.10", - "indexmap", - "more-asserts", - "target-lexicon 0.11.2", - "thiserror", - "wasmer-compiler", - "wasmer-compiler-cranelift", - "wasmer-derive", - "wasmer-engine", - "wasmer-engine-jit", - "wasmer-engine-native", - "wasmer-types", - "wasmer-vm", - "wat", - "winapi", + "pin-project", + "rand 0.8.4", + "tokio", ] [[package]] -name = "wasmer-compiler" -version = "1.0.2" +name = "tokio-util" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b7732a9cab472bd921d5a0c422f45b3d03f62fa2c40a89e0770cef6d47e383e" +checksum = "9e99e1983e5d376cd8eb4b66604d2e99e79f5bd988c3055891dcd8c9e2604cc0" dependencies = [ - "enumset", - "serde", - "serde_bytes", - "smallvec", - "target-lexicon 0.11.2", - "thiserror", - "wasmer-types", - "wasmer-vm", - "wasmparser 0.65.0", + "bytes", + "futures-core", + "futures-sink", + "log", + "pin-project-lite", + "tokio", ] [[package]] -name = "wasmer-compiler-cranelift" -version = "1.0.2" +name = "toml" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48cb9395f094e1d81534f4c5e330ed4cdb424e8df870d29ad585620284f5fddb" +checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa" dependencies = [ - "cranelift-codegen 0.68.0", - "cranelift-frontend 0.68.0", - "gimli 0.22.0", - "more-asserts", - "rayon", "serde", - "smallvec", - "tracing", - "wasmer-compiler", - "wasmer-types", - "wasmer-vm", ] [[package]] -name = "wasmer-compiler-singlepass" -version = "1.0.2" +name = "tower-service" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" + +[[package]] +name = "tracing" +version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "426ae6ef0f606ca815510f3e2ef6f520e217514bfb7a664defe180b9a9e75d07" +checksum = "01ebdc2bb4498ab1ab5f5b73c5803825e60199229ccba0698170e3be0e7f959f" dependencies = [ - "byteorder", - "dynasm", - "dynasmrt", - "lazy_static", - "more-asserts", - "rayon", - "serde", - "smallvec", - "wasmer-compiler", - "wasmer-types", - "wasmer-vm", + "cfg-if 1.0.0", + "pin-project-lite", + "tracing-attributes", + "tracing-core", ] [[package]] -name = "wasmer-derive" -version = "1.0.2" +name = "tracing-attributes" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8b86dcd2c3efdb8390728a2b56f762db07789aaa5aa872a9dc776ba3a7912ed" +checksum = "c42e6fa53307c8a17e4ccd4dc81cf5ec38db9209f59b222210375b54ee40d1e2" dependencies = [ - "proc-macro-error", "proc-macro2", "quote", "syn", ] [[package]] -name = "wasmer-engine" -version = "1.0.2" +name = "tracing-core" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efe4667d6bd888f26ae8062a63a9379fa697415b4b4e380f33832e8418fd71b5" +checksum = "1f4ed65637b8390770814083d20756f87bfa2c21bf2f110babdc5438351746e4" dependencies = [ - "backtrace", - "bincode", "lazy_static", - "memmap2", - "more-asserts", - "rustc-demangle", - "serde", - "serde_bytes", - "target-lexicon 0.11.2", - "thiserror", - "wasmer-compiler", - "wasmer-types", - "wasmer-vm", ] [[package]] -name = "wasmer-engine-jit" -version = "1.0.2" +name = "try-lock" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26770be802888011b4a3072f2a282fc2faa68aa48c71b3db6252a3937a85f3da" -dependencies = [ - "bincode", - "cfg-if 0.1.10", - "region", - "serde", - "serde_bytes", - "wasmer-compiler", - "wasmer-engine", - "wasmer-types", - "wasmer-vm", - "winapi", -] +checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] -name = "wasmer-engine-native" -version = "1.0.2" +name = "typenum" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bb4083a6c69f2cd4b000b82a80717f37c6cc2e536aee3a8ffe9af3edc276a8b" -dependencies = [ - "bincode", - "cfg-if 0.1.10", - "leb128", - "libloading 0.6.7", - "serde", - "tempfile", - "tracing", - "wasmer-compiler", - "wasmer-engine", - "wasmer-object", - "wasmer-types", - "wasmer-vm", - "which", -] +checksum = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33" [[package]] -name = "wasmer-object" -version = "1.0.2" +name = "uint" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abf8e0c12b82ff81ebecd30d7e118be5fec871d6de885a90eeb105df0a769a7b" +checksum = "e11fe9a9348741cf134085ad57c249508345fe16411b3d7fb4ff2da2f1d6382e" dependencies = [ - "object 0.22.0", - "thiserror", - "wasmer-compiler", - "wasmer-types", + "byteorder", + "crunchy", + "hex 0.4.2", + "static_assertions", ] [[package]] -name = "wasmer-runtime-core-near" -version = "0.17.1" +name = "unicode-bidi" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2390b0b8cf58615c2f8b454d9535e1aed1d14c510cc1ce1af806a1992ad53300" +checksum = "eeb8be209bb1c96b7c177c7420d26e04eccacb0eeae6b980e35fcb74678107e0" dependencies = [ - "bincode", - "blake3", - "cc", - "digest 0.8.1", - "errno", - "hex", - "indexmap", - "lazy_static", - "libc", - "nix", - "page_size", - "parking_lot 0.10.2", - "rustc_version", - "serde", - "serde-bench", - "serde_bytes", - "serde_derive", - "smallvec", - "target-lexicon 0.10.0", - "wasmparser 0.51.4", - "winapi", + "matches", ] [[package]] -name = "wasmer-runtime-near" -version = "0.17.1" +name = "unicode-normalization" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6660e86bc7697fa29bab902214d5b33d394a990826c401b10816bcd285f938f" +checksum = "07fbfce1c8a97d547e8b5334978438d9d6ec8c20e38f56d4a4374d181493eaef" dependencies = [ - "lazy_static", - "memmap", - "serde", - "serde_derive", - "wasmer-runtime-core-near", - "wasmer-singlepass-backend-near", + "tinyvec", ] [[package]] -name = "wasmer-singlepass-backend-near" -version = "0.17.1" +name = "unicode-segmentation" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0d2e7be6ae3a5fa87eed5fb451aff96f2573d2694942e40543ae0bbe19c796" + +[[package]] +name = "unicode-xid" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" + +[[package]] +name = "url" +version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3f23543ef8f59667be4945c22eb4b1a50a79ff340555f6f23354223d2695541" +checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" dependencies = [ - "bincode", - "byteorder", - "dynasm", - "dynasmrt", - "lazy_static", - "libc", - "nix", + "form_urlencoded", + "idna", + "matches", + "percent-encoding", "serde", - "serde_derive", - "smallvec", - "wasmer-runtime-core-near", ] [[package]] -name = "wasmer-types" -version = "1.0.2" +name = "uuid" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7f4ac28c2951cd792c18332f03da523ed06b170f5cf6bb5b1bdd7e36c2a8218" +checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" dependencies = [ - "cranelift-entity 0.68.0", - "serde", - "thiserror", + "getrandom 0.2.2", ] [[package]] -name = "wasmer-vm" -version = "1.0.2" +name = "validator" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7635ba0b6d2fd325f588d69a950ad9fa04dddbf6ad08b6b2a183146319bf6ae" +checksum = "841d6937c33ec6039d8071bcf72933146b5bbe378d645d8fa59bdadabfc2a249" dependencies = [ - "backtrace", - "cc", - "cfg-if 0.1.10", - "indexmap", - "libc", - "memoffset 0.6.3", - "more-asserts", - "region", + "idna", + "lazy_static", + "regex", "serde", - "thiserror", - "wasmer-types", - "winapi", + "serde_derive", + "serde_json", + "url", + "validator_types", ] [[package]] -name = "wasmparser" -version = "0.51.4" +name = "validator_types" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aeb1956b19469d1c5e63e459d29e7b5aa0f558d9f16fcef09736f8a265e6c10a" +checksum = "ad9680608df133af2c1ddd5eaf1ddce91d60d61b6bc51494ef326458365a470a" [[package]] -name = "wasmparser" -version = "0.57.0" +name = "vcpkg" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32fddd575d477c6e9702484139cf9f23dcd554b06d185ed0f56c857dd3a47aa6" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] -name = "wasmparser" -version = "0.59.0" +name = "version_check" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a950e6a618f62147fd514ff445b2a0b53120d382751960797f85f058c7eda9b9" +checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed" [[package]] -name = "wasmparser" -version = "0.65.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc2fe6350834b4e528ba0901e7aa405d78b89dc1fa3145359eb4de0e323fcf" +name = "w_near" +version = "1.0.0" +dependencies = [ + "anyhow", + "near-contract-standards", + "near-primitives 0.5.0", + "near-sdk", + "near-units", + "tokio", + "workspaces", +] [[package]] -name = "wasmtime" -version = "0.20.0" +name = "want" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "373b87ebd6721f4121e28eeaaa41943548c48bcca04ac9bb063004207e5e7d70" +checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" dependencies = [ - "anyhow", - "backtrace", - "bincode", - "cfg-if 0.1.10", - "lazy_static", - "libc", "log", - "region", - "rustc-demangle", - "serde", - "smallvec", - "target-lexicon 0.11.2", - "wasmparser 0.59.0", - "wasmtime-environ", - "wasmtime-jit", - "wasmtime-profiling", - "wasmtime-runtime", - "winapi", + "try-lock", ] [[package]] -name = "wasmtime-cranelift" -version = "0.20.0" +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40c01df908e54d40bed80326ade122825d464888991beafd950d186f1be309c2" -dependencies = [ - "cranelift-codegen 0.67.0", - "cranelift-entity 0.67.0", - "cranelift-frontend 0.67.0", - "cranelift-wasm", - "wasmtime-environ", -] +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] -name = "wasmtime-debug" -version = "0.20.0" +name = "wasi" +version = "0.10.2+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28962772f96fadb79dc7be5ade135ca55d2b0017a012f4869e2476a03abbe733" -dependencies = [ - "anyhow", - "gimli 0.21.0", - "more-asserts", - "object 0.21.1", - "target-lexicon 0.11.2", - "thiserror", - "wasmparser 0.59.0", - "wasmtime-environ", -] +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" [[package]] -name = "wasmtime-environ" -version = "0.20.0" +name = "wasm-bindgen" +version = "0.2.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c0d7401bf253b7b1f426afd70d285bb23ea9a1c7605d6af788c95db5084edf5" +checksum = "25f1af7423d8588a3d840681122e72e6a24ddbcb3f0ec385cac0d12d24256c06" dependencies = [ - "anyhow", - "cfg-if 0.1.10", - "cranelift-codegen 0.67.0", - "cranelift-entity 0.67.0", - "cranelift-wasm", - "gimli 0.21.0", - "indexmap", - "log", - "more-asserts", - "serde", - "thiserror", - "wasmparser 0.59.0", + "cfg-if 1.0.0", + "wasm-bindgen-macro", ] [[package]] -name = "wasmtime-jit" -version = "0.20.0" +name = "wasm-bindgen-backend" +version = "0.2.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c838a108318e7c5a2201addb3d3b27a6ef3d142f0eb0addc815b9c2541e5db5" +checksum = "8b21c0df030f5a177f3cba22e9bc4322695ec43e7257d865302900290bcdedca" dependencies = [ - "anyhow", - "cfg-if 0.1.10", - "cranelift-codegen 0.67.0", - "cranelift-entity 0.67.0", - "cranelift-frontend 0.67.0", - "cranelift-native", - "cranelift-wasm", - "gimli 0.21.0", + "bumpalo", + "lazy_static", "log", - "more-asserts", - "object 0.21.1", - "region", - "serde", - "target-lexicon 0.11.2", - "thiserror", - "wasmparser 0.59.0", - "wasmtime-cranelift", - "wasmtime-debug", - "wasmtime-environ", - "wasmtime-obj", - "wasmtime-profiling", - "wasmtime-runtime", - "winapi", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", ] [[package]] -name = "wasmtime-obj" -version = "0.20.0" +name = "wasm-bindgen-futures" +version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc8422b0acce519b74c3ae5db59167c611ea92220e5c334ad406e977277e0f23" +checksum = "2eb6ec270a31b1d3c7e266b999739109abce8b6c87e4b31fcfcd788b65267395" dependencies = [ - "anyhow", - "more-asserts", - "object 0.21.1", - "target-lexicon 0.11.2", - "wasmtime-debug", - "wasmtime-environ", + "cfg-if 1.0.0", + "js-sys", + "wasm-bindgen", + "web-sys", ] [[package]] -name = "wasmtime-profiling" -version = "0.20.0" +name = "wasm-bindgen-macro" +version = "0.2.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33f2689bf523f843555e57e24d59abf0c5013007366b866081d73a15e510b4b2" +checksum = "2f4203d69e40a52ee523b2529a773d5ffc1dc0071801c87b3d270b471b80ed01" dependencies = [ - "anyhow", - "cfg-if 0.1.10", - "lazy_static", - "libc", - "serde", - "target-lexicon 0.11.2", - "wasmtime-environ", - "wasmtime-runtime", + "quote", + "wasm-bindgen-macro-support", ] [[package]] -name = "wasmtime-runtime" -version = "0.20.0" +name = "wasm-bindgen-macro-support" +version = "0.2.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7353f5e79390048128e44b5ceda7255723b2066de4026df9a168b0b2593df71" +checksum = "bfa8a30d46208db204854cadbb5d4baf5fcf8071ba5bf48190c3e59937962ebc" dependencies = [ - "backtrace", - "cc", - "cfg-if 0.1.10", - "indexmap", - "lazy_static", - "libc", - "log", - "memoffset 0.5.6", - "more-asserts", - "region", - "thiserror", - "wasmtime-environ", - "winapi", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", ] [[package]] -name = "wast" -version = "35.0.2" +name = "wasm-bindgen-shared" +version = "0.2.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ef140f1b49946586078353a453a1d28ba90adfc54dde75710bc1931de204d68" -dependencies = [ - "leb128", -] +checksum = "3d958d035c4438e28c70e4321a2911302f10135ce78a9c7834c0cab4123d06a2" [[package]] -name = "wat" -version = "1.0.37" +name = "web-sys" +version = "0.3.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ec280a739b69173e0ffd12c1658507996836ba4e992ed9bc1e5385a0bd72a02" +checksum = "c060b319f29dd25724f09a2ba1418f142f539b2be99fbf4d2d5a8f7330afb8eb" dependencies = [ - "wast", + "js-sys", + "wasm-bindgen", ] [[package]] @@ -3295,16 +2854,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "which" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b55551e42cbdf2ce2bedd2203d0cc08dba002c27510f86dab6d0ce304cba3dfe" -dependencies = [ - "either", - "libc", -] - [[package]] name = "winapi" version = "0.3.9" @@ -3327,12 +2876,60 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "winreg" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0120db82e8a1e0b9fb3345a539c478767c0048d842860994d96113d5b667bd69" +dependencies = [ + "winapi", +] + +[[package]] +name = "workspaces" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f46b5b989c75d33dad4dfee4a5e402d87cae8f72129fe6d0126800883c2b83b" +dependencies = [ + "anyhow", + "async-trait", + "base64 0.13.0", + "borsh", + "chrono", + "dirs 3.0.2", + "hex 0.4.2", + "libc", + "near-account-id 0.5.0", + "near-crypto 0.5.0", + "near-jsonrpc-client", + "near-jsonrpc-primitives", + "near-primitives 0.5.0", + "near-sandbox-utils", + "portpicker", + "rand 0.8.4", + "reqwest", + "serde", + "serde_json", + "tokio", + "tokio-retry", + "url", +] + [[package]] name = "wyz" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85e60b0d1b5f99db2556934e21937020776a5d31520bf169e851ac44e6420214" +[[package]] +name = "xattr" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "244c3741f4240ef46274860397c7c74e50eb23624996930e484c16679633a54c" +dependencies = [ + "libc", +] + [[package]] name = "zeroize" version = "1.3.0" @@ -3353,3 +2950,17 @@ dependencies = [ "syn", "synstructure", ] + +[[package]] +name = "zip" +version = "0.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93ab48844d61251bb3835145c521d88aa4031d7139e8485990f60ca911fa0815" +dependencies = [ + "byteorder", + "bzip2", + "crc32fast", + "flate2", + "thiserror", + "time", +] diff --git a/w-near/Cargo.toml b/w-near/Cargo.toml index 30045e14..4218fbbc 100644 --- a/w-near/Cargo.toml +++ b/w-near/Cargo.toml @@ -5,14 +5,18 @@ authors = ["Near Inc ", "Vincent "res/w_near.wasm", - LEGACY_W_NEAR_WASM_BYTES => "res/legacy_w_near.wasm", -} +use near_sdk::{Balance, ONE_YOCTO}; +use near_units::parse_near; +use workspaces::prelude::DevAccountDeployer; +use workspaces::{Account, Contract, DevNetwork, Worker}; -const CONTRACT_ID: &str = "wrapnear"; const LEGACY_BYTE_COST: Balance = 10_000_000_000_000_000_000; const STORAGE_BALANCE: Balance = 125 * LEGACY_BYTE_COST; -// Register the given `user` with Legacy wNEAR contract -fn legacy_register_user(user: &UserAccount) { - user.call( - CONTRACT_ID.to_string(), - "storage_deposit", - &json!({ - "account_id": user.valid_account_id() - }) - .to_string() - .into_bytes(), - DEFAULT_GAS / 2, - 125 * LEGACY_BYTE_COST, // attached deposit - ) - .assert_success(); +pub async fn init_legacy(worker: &Worker) -> anyhow::Result { + let contract = worker + .dev_deploy(include_bytes!("../res/legacy_w_near.wasm").to_vec()) + .await?; + let res = contract + .call(&worker, "new") + .args_json((contract.id(),))? + .gas(300_000_000_000_000) + .transact() + .await?; + assert!(matches!(res.status, FinalExecutionStatus::SuccessValue(_))); + + Ok(contract) } -fn wrap_near(user: &UserAccount, amount: Balance) -> ExecutionResult { - user.call( - CONTRACT_ID.to_string(), - "near_deposit", - &json!({ - "account_id": user.valid_account_id() - }) - .to_string() - .into_bytes(), - DEFAULT_GAS / 2, - amount, // attached deposit - ) +pub async fn init_w_near(worker: &Worker) -> anyhow::Result { + let contract = worker + .dev_deploy(include_bytes!("../res/w_near.wasm").to_vec()) + .await?; + let res = contract + .call(&worker, "new") + .args_json((contract.id(),))? + .gas(300_000_000_000_000) + .transact() + .await?; + assert!(matches!(res.status, FinalExecutionStatus::SuccessValue(_))); + + Ok(contract) } -fn deploy_legacy() -> (UserAccount, ContractAccount) { - let root = init_simulator(None); - let w_near = deploy!( - contract: Contract, - contract_id: CONTRACT_ID.to_string(), - bytes: &LEGACY_W_NEAR_WASM_BYTES, - signer_account: root, - init_method: new() - ); - (root, w_near) +async fn legacy_register_user( + name: &str, + contract: &Contract, + worker: &Worker, +) -> anyhow::Result { + let res = contract + .as_account() + .create_subaccount(&worker, name) + .initial_balance(parse_near!("10 N")) + .transact() + .await?; + assert!(matches!( + res.details.status, + FinalExecutionStatus::SuccessValue(_) + )); + let account = res.result; + + let res = contract + .call(&worker, "storage_deposit") + .args_json((account.id(),))? + .gas(300_000_000_000_000) + .deposit(125 * LEGACY_BYTE_COST) + .transact() + .await?; + assert!(matches!(res.status, FinalExecutionStatus::SuccessValue(_))); + + Ok(account) } -fn deploy_w_near() -> (UserAccount, ContractAccount) { - let root = init_simulator(None); - let w_near = deploy!( - contract: Contract, - contract_id: CONTRACT_ID.to_string(), - bytes: &W_NEAR_WASM_BYTES, - signer_account: root, - init_method: new() - ); - (root, w_near) +async fn register_user( + name: &str, + contract: &Contract, + worker: &Worker, +) -> anyhow::Result { + let res = contract + .as_account() + .create_subaccount(&worker, name) + .initial_balance(parse_near!("10 N")) + .transact() + .await?; + assert!(matches!( + res.details.status, + FinalExecutionStatus::SuccessValue(_) + )); + let account = res.result; + + let res = contract + .call(&worker, "storage_deposit") + .args_json((account.id(), Option::::None))? + .gas(300_000_000_000_000) + .deposit(125 * LEGACY_BYTE_COST) + .transact() + .await?; + assert!(matches!(res.status, FinalExecutionStatus::SuccessValue(_))); + + Ok(account) } -#[test] -pub fn test_upgrade() { - let (root, w_near) = deploy_legacy(); - - let legacy_storage_minimum_balance: U128 = - view!(w_near.storage_minimum_balance()).unwrap_json(); - assert_eq!(legacy_storage_minimum_balance.0, STORAGE_BALANCE); - - let alice = root.create_user("alice".to_string(), to_yocto("100")); - legacy_register_user(&alice); +async fn wrap_near( + account: &Account, + contract: &Contract, + worker: &Worker, + amount: Balance, +) -> anyhow::Result { + Ok(account + .call(&worker, contract.id().clone(), "near_deposit") + .args_json((account.id(),))? + .gas(300_000_000_000_000) + .deposit(amount) + .transact() + .await? + .status) +} - wrap_near(&alice, to_yocto("10")).assert_success(); +#[tokio::test] +async fn test_upgrade() -> anyhow::Result<()> { + let worker = workspaces::sandbox(); + let contract = init_legacy(&worker).await?; - let alice_balance: U128 = view!(w_near.ft_balance_of(alice.valid_account_id())).unwrap_json(); - assert_eq!(alice_balance.0, to_yocto("10")); + let alice = legacy_register_user("alice", &contract, &worker).await?; - w_near - .user_account - .create_transaction(CONTRACT_ID.to_string()) - .deploy_contract(W_NEAR_WASM_BYTES.to_vec()) - .submit() - .assert_success(); + let legacy_storage_minimum_balance: U128 = contract + .call(&worker, "storage_minimum_balance") + .view() + .await? + .json()?; + assert_eq!(legacy_storage_minimum_balance.0, STORAGE_BALANCE); - let storage_minimum_balance: U128 = view!(w_near.storage_minimum_balance()).unwrap_json(); + let res = wrap_near(&alice, &contract, &worker, parse_near!("1 N")).await?; + assert!(matches!(res, FinalExecutionStatus::SuccessValue(_))); + + let alice_balance: U128 = contract + .call(&worker, "ft_balance_of") + .args_json((alice.id(),))? + .view() + .await? + .json()?; + assert_eq!(alice_balance.0, parse_near!("1 N")); + + let contract = contract + .as_account() + .deploy(&worker, include_bytes!("../res/w_near.wasm").to_vec()) + .await? + .result; + + let storage_minimum_balance: U128 = contract + .call(&worker, "storage_minimum_balance") + .view() + .await? + .json()?; assert_eq!(storage_minimum_balance.0, STORAGE_BALANCE); - let alice_balance: U128 = view!(w_near.ft_balance_of(alice.valid_account_id())).unwrap_json(); - assert_eq!(alice_balance.0, to_yocto("10")); - - let bob = root.create_user("bob".to_string(), to_yocto("100")); - legacy_register_user(&bob); - - wrap_near(&bob, to_yocto("15")).assert_success(); - - let bob_balance: U128 = view!(w_near.ft_balance_of(bob.valid_account_id())).unwrap_json(); - assert_eq!(bob_balance.0, to_yocto("15")); - - call!( - alice, - w_near.ft_transfer(bob.valid_account_id(), to_yocto("5").into(), None), - deposit = 1 - ) - .assert_success(); - - let bob_balance: U128 = view!(w_near.ft_balance_of(bob.valid_account_id())).unwrap_json(); - assert_eq!(bob_balance.0, to_yocto("20")); + let alice_balance: U128 = contract + .call(&worker, "ft_balance_of") + .args_json((alice.id(),))? + .view() + .await? + .json()?; + assert_eq!(alice_balance.0, parse_near!("1 N")); + + let bob = register_user("bob", &contract, &worker).await?; + + let res = wrap_near(&bob, &contract, &worker, parse_near!("1.5 N")).await?; + assert!(matches!(res, FinalExecutionStatus::SuccessValue(_))); + + let bob_balance: U128 = contract + .call(&worker, "ft_balance_of") + .args_json((bob.id(),))? + .view() + .await? + .json()?; + assert_eq!(bob_balance.0, parse_near!("1.5 N")); + + let res = alice + .call(&worker, contract.id().clone(), "ft_transfer") + .args_json(( + bob.id(), + U128::from(parse_near!("0.5 N")), + Option::::None, + ))? + .gas(300_000_000_000_000) + .deposit(ONE_YOCTO) + .transact() + .await?; + assert!(matches!(res.status, FinalExecutionStatus::SuccessValue(_))); + + let bob_balance: U128 = contract + .call(&worker, "ft_balance_of") + .args_json((bob.id(),))? + .view() + .await? + .json()?; + assert_eq!(bob_balance.0, parse_near!("2 N")); + + Ok(()) } -#[test] -pub fn test_legacy_ft_transfer() { - let (root, w_near) = deploy_legacy(); - - let alice = root.create_user("alice".to_string(), to_yocto("100")); - legacy_register_user(&alice); - - wrap_near(&alice, to_yocto("10")).assert_success(); - - let alice_balance: U128 = view!(w_near.ft_balance_of(alice.valid_account_id())).unwrap_json(); - assert_eq!(alice_balance.0, to_yocto("10")); - - let bob = root.create_user("bob".to_string(), to_yocto("100")); - legacy_register_user(&bob); - - call!( - alice, - w_near.ft_transfer(bob.valid_account_id(), to_yocto("5").into(), None), - deposit = 1 - ) - .assert_success(); - - let bob_balance: U128 = view!(w_near.ft_balance_of(bob.valid_account_id())).unwrap_json(); - assert_eq!(bob_balance.0, to_yocto("5")); +#[tokio::test] +async fn test_legacy_ft_transfer() -> anyhow::Result<()> { + let worker = workspaces::sandbox(); + let contract = init_legacy(&worker).await?; + + let alice = legacy_register_user("alice", &contract, &worker).await?; + + let res = wrap_near(&alice, &contract, &worker, parse_near!("1 N")).await?; + assert!(matches!(res, FinalExecutionStatus::SuccessValue(_))); + + let alice_balance: U128 = contract + .call(&worker, "ft_balance_of") + .args_json((alice.id(),))? + .view() + .await? + .json()?; + assert_eq!(alice_balance.0, parse_near!("1 N")); + + let bob = legacy_register_user("bob", &contract, &worker).await?; + + let res = alice + .call(&worker, contract.id().clone(), "ft_transfer") + .args_json(( + bob.id(), + U128::from(parse_near!("0.5 N")), + Option::::None, + ))? + .gas(300_000_000_000_000) + .deposit(ONE_YOCTO) + .transact() + .await?; + assert!(matches!(res.status, FinalExecutionStatus::SuccessValue(_))); + + let bob_balance: U128 = contract + .call(&worker, "ft_balance_of") + .args_json((bob.id(),))? + .view() + .await? + .json()?; + assert_eq!(bob_balance.0, parse_near!("0.5 N")); + + Ok(()) } -#[test] -pub fn test_ft_transfer() { - let (root, w_near) = deploy_w_near(); - - let alice = root.create_user("alice".to_string(), to_yocto("100")); - legacy_register_user(&alice); - - wrap_near(&alice, to_yocto("10")).assert_success(); - - let alice_balance: U128 = view!(w_near.ft_balance_of(alice.valid_account_id())).unwrap_json(); - assert_eq!(alice_balance.0, to_yocto("10")); - - let bob = root.create_user("bob".to_string(), to_yocto("100")); - legacy_register_user(&bob); - - call!( - alice, - w_near.ft_transfer(bob.valid_account_id(), to_yocto("5").into(), None), - deposit = 1 - ) - .assert_success(); - - let bob_balance: U128 = view!(w_near.ft_balance_of(bob.valid_account_id())).unwrap_json(); - assert_eq!(bob_balance.0, to_yocto("5")); +#[tokio::test] +async fn test_ft_transfer() -> anyhow::Result<()> { + let worker = workspaces::sandbox(); + let contract = init_w_near(&worker).await?; + + let alice = register_user("alice", &contract, &worker).await?; + + let res = wrap_near(&alice, &contract, &worker, parse_near!("1 N")).await?; + assert!(matches!(res, FinalExecutionStatus::SuccessValue(_))); + + let alice_balance: U128 = contract + .call(&worker, "ft_balance_of") + .args_json((alice.id(),))? + .view() + .await? + .json()?; + assert_eq!(alice_balance.0, parse_near!("1 N")); + + let bob = register_user("bob", &contract, &worker).await?; + + let res = alice + .call(&worker, contract.id().clone(), "ft_transfer") + .args_json(( + bob.id(), + U128::from(parse_near!("0.5 N")), + Option::::None, + ))? + .gas(300_000_000_000_000) + .deposit(ONE_YOCTO) + .transact() + .await?; + assert!(matches!(res.status, FinalExecutionStatus::SuccessValue(_))); + + let bob_balance: U128 = contract + .call(&worker, "ft_balance_of") + .args_json((bob.id(),))? + .view() + .await? + .json()?; + assert_eq!(bob_balance.0, parse_near!("0.5 N")); + + Ok(()) } -#[test] -pub fn test_legacy_wrap_fail() { - let (root, _w_near) = deploy_legacy(); - - let alice = root.create_user("alice".to_string(), to_yocto("100")); - - let status = wrap_near(&alice, to_yocto("10")); - assert!(!status.is_ok()) +#[tokio::test] +async fn test_legacy_wrap_fail() -> anyhow::Result<()> { + let worker = workspaces::sandbox(); + let contract = init_legacy(&worker).await?; + + // Create a user, but do not register them + let res = contract + .as_account() + .create_subaccount(&worker, "alice") + .initial_balance(parse_near!("10 N")) + .transact() + .await?; + assert!(matches!( + res.details.status, + FinalExecutionStatus::SuccessValue(_) + )); + let alice = res.result; + + let res = wrap_near(&alice, &contract, &worker, parse_near!("1 N")).await?; + assert!(matches!(res, FinalExecutionStatus::Failure(_))); + + Ok(()) } -#[test] -pub fn test_wrap_without_storage_deposit() { - let (root, w_near) = deploy_w_near(); - - let alice = root.create_user("alice".to_string(), to_yocto("100")); - - wrap_near(&alice, to_yocto("10")).assert_success(); - - let alice_balance: U128 = view!(w_near.ft_balance_of(alice.valid_account_id())).unwrap_json(); - assert_eq!(alice_balance.0, to_yocto("10") - STORAGE_BALANCE); +#[tokio::test] +async fn test_wrap_without_storage_deposit() -> anyhow::Result<()> { + let worker = workspaces::sandbox(); + let contract = init_w_near(&worker).await?; + + // Create a user, but do not register them + let res = contract + .as_account() + .create_subaccount(&worker, "alice") + .initial_balance(parse_near!("10 N")) + .transact() + .await?; + assert!(matches!( + res.details.status, + FinalExecutionStatus::SuccessValue(_) + )); + let alice = res.result; + + let res = wrap_near(&alice, &contract, &worker, parse_near!("1 N")).await?; + assert!(matches!(res, FinalExecutionStatus::SuccessValue(_))); + + let alice_balance: U128 = contract + .call(&worker, "ft_balance_of") + .args_json((alice.id(),))? + .view() + .await? + .json()?; + assert_eq!(alice_balance.0, parse_near!("1 N") - STORAGE_BALANCE); + + Ok(()) } From e76348dc35cf1d37767497fc1b7ab898101e5acd Mon Sep 17 00:00:00 2001 From: Daniyar Itegulov Date: Thu, 3 Feb 2022 11:27:30 +1100 Subject: [PATCH 2/9] add tests for `near_withdraw` --- w-near/tests/mod.rs | 76 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/w-near/tests/mod.rs b/w-near/tests/mod.rs index ac372f9b..cb9102c0 100644 --- a/w-near/tests/mod.rs +++ b/w-near/tests/mod.rs @@ -339,3 +339,79 @@ async fn test_wrap_without_storage_deposit() -> anyhow::Result<()> { Ok(()) } + +#[tokio::test] +async fn test_withdraw_near() -> anyhow::Result<()> { + let worker = workspaces::sandbox(); + let contract = init_w_near(&worker).await?; + + let alice = register_user("alice", &contract, &worker).await?; + + let res = wrap_near(&alice, &contract, &worker, parse_near!("1 N")).await?; + assert!(matches!(res, FinalExecutionStatus::SuccessValue(_))); + + let alice_balance: U128 = contract + .call(&worker, "ft_balance_of") + .args_json((alice.id(),))? + .view() + .await? + .json()?; + assert_eq!(alice_balance.0, parse_near!("1 N")); + + let res = alice + .call(&worker, contract.id().clone(), "near_withdraw") + .args_json((U128::from(parse_near!("0.5 N")),))? + .gas(300_000_000_000_000) + .deposit(ONE_YOCTO) + .transact() + .await?; + assert!(matches!(res.status, FinalExecutionStatus::SuccessValue(_))); + + let alice_balance: U128 = contract + .call(&worker, "ft_balance_of") + .args_json((alice.id(),))? + .view() + .await? + .json()?; + assert_eq!(alice_balance.0, parse_near!("0.5 N")); + + Ok(()) +} + +#[tokio::test] +async fn test_withdraw_too_much_near() -> anyhow::Result<()> { + let worker = workspaces::sandbox(); + let contract = init_w_near(&worker).await?; + + let alice = register_user("alice", &contract, &worker).await?; + + let res = wrap_near(&alice, &contract, &worker, parse_near!("1 N")).await?; + assert!(matches!(res, FinalExecutionStatus::SuccessValue(_))); + + let alice_balance: U128 = contract + .call(&worker, "ft_balance_of") + .args_json((alice.id(),))? + .view() + .await? + .json()?; + assert_eq!(alice_balance.0, parse_near!("1 N")); + + let res = alice + .call(&worker, contract.id().clone(), "near_withdraw") + .args_json((U128::from(parse_near!("1.5 N")),))? + .gas(300_000_000_000_000) + .deposit(ONE_YOCTO) + .transact() + .await?; + assert!(matches!(res.status, FinalExecutionStatus::Failure(_))); + + let alice_balance: U128 = contract + .call(&worker, "ft_balance_of") + .args_json((alice.id(),))? + .view() + .await? + .json()?; + assert_eq!(alice_balance.0, parse_near!("1 N")); + + Ok(()) +} From 69a84939ec9f675a7d03aa616e46c4160e820ea4 Mon Sep 17 00:00:00 2001 From: Daniyar Itegulov Date: Thu, 3 Feb 2022 22:14:10 +1100 Subject: [PATCH 3/9] split user creation and registration into two funs --- w-near/tests/mod.rs | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/w-near/tests/mod.rs b/w-near/tests/mod.rs index cb9102c0..2c4ea225 100644 --- a/w-near/tests/mod.rs +++ b/w-near/tests/mod.rs @@ -69,6 +69,23 @@ async fn legacy_register_user( } async fn register_user( + account: &Account, + contract: &Contract, + worker: &Worker, +) -> anyhow::Result<()> { + let res = contract + .call(&worker, "storage_deposit") + .args_json((account.id(), Option::::None))? + .gas(300_000_000_000_000) + .deposit(125 * LEGACY_BYTE_COST) + .transact() + .await?; + assert!(matches!(res.status, FinalExecutionStatus::SuccessValue(_))); + + Ok(()) +} + +async fn create_user( name: &str, contract: &Contract, worker: &Worker, @@ -85,14 +102,7 @@ async fn register_user( )); let account = res.result; - let res = contract - .call(&worker, "storage_deposit") - .args_json((account.id(), Option::::None))? - .gas(300_000_000_000_000) - .deposit(125 * LEGACY_BYTE_COST) - .transact() - .await?; - assert!(matches!(res.status, FinalExecutionStatus::SuccessValue(_))); + register_user(&account, &contract, &worker).await?; Ok(account) } @@ -159,7 +169,7 @@ async fn test_upgrade() -> anyhow::Result<()> { .json()?; assert_eq!(alice_balance.0, parse_near!("1 N")); - let bob = register_user("bob", &contract, &worker).await?; + let bob = create_user("bob", &contract, &worker).await?; let res = wrap_near(&bob, &contract, &worker, parse_near!("1.5 N")).await?; assert!(matches!(res, FinalExecutionStatus::SuccessValue(_))); @@ -245,7 +255,7 @@ async fn test_ft_transfer() -> anyhow::Result<()> { let worker = workspaces::sandbox(); let contract = init_w_near(&worker).await?; - let alice = register_user("alice", &contract, &worker).await?; + let alice = create_user("alice", &contract, &worker).await?; let res = wrap_near(&alice, &contract, &worker, parse_near!("1 N")).await?; assert!(matches!(res, FinalExecutionStatus::SuccessValue(_))); @@ -258,7 +268,7 @@ async fn test_ft_transfer() -> anyhow::Result<()> { .json()?; assert_eq!(alice_balance.0, parse_near!("1 N")); - let bob = register_user("bob", &contract, &worker).await?; + let bob = create_user("bob", &contract, &worker).await?; let res = alice .call(&worker, contract.id().clone(), "ft_transfer") @@ -345,7 +355,7 @@ async fn test_withdraw_near() -> anyhow::Result<()> { let worker = workspaces::sandbox(); let contract = init_w_near(&worker).await?; - let alice = register_user("alice", &contract, &worker).await?; + let alice = create_user("alice", &contract, &worker).await?; let res = wrap_near(&alice, &contract, &worker, parse_near!("1 N")).await?; assert!(matches!(res, FinalExecutionStatus::SuccessValue(_))); @@ -383,7 +393,7 @@ async fn test_withdraw_too_much_near() -> anyhow::Result<()> { let worker = workspaces::sandbox(); let contract = init_w_near(&worker).await?; - let alice = register_user("alice", &contract, &worker).await?; + let alice = create_user("alice", &contract, &worker).await?; let res = wrap_near(&alice, &contract, &worker, parse_near!("1 N")).await?; assert!(matches!(res, FinalExecutionStatus::SuccessValue(_))); From bd7d1016d96d490b432ec2592f9a56a4c04e15e7 Mon Sep 17 00:00:00 2001 From: Daniyar Itegulov Date: Thu, 3 Feb 2022 22:14:47 +1100 Subject: [PATCH 4/9] add defi contract for testing --- w-near/build.sh | 3 + w-near/res/w_near_defi.wasm | Bin 0 -> 129721 bytes w-near/test-w-near-defi/Cargo.lock | 1300 ++++++++++++++++++++++++++++ w-near/test-w-near-defi/Cargo.toml | 12 + w-near/test-w-near-defi/src/lib.rs | 92 ++ 5 files changed, 1407 insertions(+) create mode 100755 w-near/res/w_near_defi.wasm create mode 100644 w-near/test-w-near-defi/Cargo.lock create mode 100644 w-near/test-w-near-defi/Cargo.toml create mode 100644 w-near/test-w-near-defi/src/lib.rs diff --git a/w-near/build.sh b/w-near/build.sh index f2dc4d0b..676324e9 100755 --- a/w-near/build.sh +++ b/w-near/build.sh @@ -3,3 +3,6 @@ set -e cd "`dirname $0`" RUSTFLAGS='-C link-arg=-s' cargo build --target wasm32-unknown-unknown --release cp target/wasm32-unknown-unknown/release/w_near.wasm ./res/ +cd test-w-near-defi +RUSTFLAGS='-C link-arg=-s' cargo build --target wasm32-unknown-unknown --release +cp target/wasm32-unknown-unknown/release/w_near_defi.wasm ../res/ diff --git a/w-near/res/w_near_defi.wasm b/w-near/res/w_near_defi.wasm new file mode 100755 index 0000000000000000000000000000000000000000..b265477725843cc2b46b3d9635d201a406752c6b GIT binary patch literal 129721 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
    PIk?C2 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 Z2ni@5NTo$6f>tc_aZ5fVt(>=J{R1NcAnX7D literal 0 HcmV?d00001 diff --git a/w-near/test-w-near-defi/Cargo.lock b/w-near/test-w-near-defi/Cargo.lock new file mode 100644 index 00000000..45bd942b --- /dev/null +++ b/w-near/test-w-near-defi/Cargo.lock @@ -0,0 +1,1300 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "Inflector" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" + +[[package]] +name = "ahash" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" +dependencies = [ + "getrandom 0.2.4", + "once_cell", + "version_check", +] + +[[package]] +name = "aho-corasick" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" +dependencies = [ + "memchr", +] + +[[package]] +name = "arrayref" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" + +[[package]] +name = "arrayvec" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" + +[[package]] +name = "arrayvec" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" + +[[package]] +name = "autocfg" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" + +[[package]] +name = "base64" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b41b7ea54a0c9d92199de89e20e58d49f02f8e699814ef3fdf266f6f748d15c7" + +[[package]] +name = "base64" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" + +[[package]] +name = "bitvec" +version = "0.20.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7774144344a4faa177370406a7ff5f1da24303817368584c6206c8303eb07848" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "blake2" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a4e37d16930f5459780f5621038b6382b9bb37c19016f39fb6b5808d831f174" +dependencies = [ + "crypto-mac", + "digest", + "opaque-debug", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "block-padding", + "generic-array", +] + +[[package]] +name = "block-padding" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" + +[[package]] +name = "borsh" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c9d0958efb8301e1626692ea879cbff622ef45cf731807ec8d488b34be98cb8" +dependencies = [ + "borsh-derive", + "hashbrown", +] + +[[package]] +name = "borsh-derive" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "325164710ad57bae6d32455ce3bd384f95768464a927ce145626dc3390a7f9fe" +dependencies = [ + "borsh-derive-internal", + "borsh-schema-derive-internal", + "proc-macro-crate 0.1.5", + "proc-macro2", + "syn", +] + +[[package]] +name = "borsh-derive-internal" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f74159f43b231f4af8c4ce4967fef76e4e59725acf51706ddb9268c94348d15c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "borsh-schema-derive-internal" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99b2a77771907a820a860d200d193a0787c79a7890c8e253c462fa0f51ad58b6" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "bs58" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" + +[[package]] +name = "byte-slice-cast" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d30c751592b77c499e7bce34d99d67c2c11bdc0574e9a488ddade14150a4698" + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "bytesize" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c58ec36aac5066d5ca17df51b3e70279f5670a72102f5752cb7e7c856adfc70" + +[[package]] +name = "c2-chacha" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d27dae93fe7b1e0424dc57179ac396908c26b035a87234809f5c4dfd1b47dc80" +dependencies = [ + "cipher", + "ppv-lite86", +] + +[[package]] +name = "cc" +version = "1.0.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22a9137b95ea06864e018375b72adfb7db6e6f68cfc8df5a04d00288050485ee" + +[[package]] +name = "cfg-if" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chrono" +version = "0.4.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" +dependencies = [ + "libc", + "num-integer", + "num-traits", + "serde", + "time", + "winapi", +] + +[[package]] +name = "cipher" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12f8e7987cbd042a63249497f41aed09f8e65add917ea6566effbc56578d6801" +dependencies = [ + "generic-array", +] + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "cpufeatures" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95059428f66df56b63431fdb4e1947ed2190586af5c5a8a8b71122bdf5a7f469" +dependencies = [ + "libc", +] + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "crypto-mac" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" +dependencies = [ + "generic-array", + "subtle", +] + +[[package]] +name = "curve25519-dalek" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" +dependencies = [ + "byteorder", + "digest", + "rand_core 0.5.1", + "subtle", + "zeroize", +] + +[[package]] +name = "derive_more" +version = "0.99.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "easy-ext" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53aff6fdc1b181225acdcb5b14c47106726fd8e486707315b1b138baed68ee31" + +[[package]] +name = "ed25519" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74e1069e39f1454367eb2de793ed062fac4c35c2934b76a81d90dd9abcd28816" +dependencies = [ + "signature", +] + +[[package]] +name = "ed25519-dalek" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" +dependencies = [ + "curve25519-dalek", + "ed25519", + "rand 0.7.3", + "serde", + "sha2", + "zeroize", +] + +[[package]] +name = "fixed-hash" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcf0ed7fe52a17a03854ec54a9f76d6d84508d1c0e66bc1793301c73fc8493c" +dependencies = [ + "byteorder", + "rand 0.8.4", + "rustc-hex", + "static_assertions", +] + +[[package]] +name = "form_urlencoded" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" +dependencies = [ + "matches", + "percent-encoding", +] + +[[package]] +name = "funty" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fed34cd105917e91daa4da6b3728c47b068749d6a62c59811f06ed2ac71d9da7" + +[[package]] +name = "generic-array" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd48d33ec7f05fbfa152300fdad764757cbded343c1aa1cff2fbaf4134851803" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418d37c8b1d42553c93648be529cb70f920d3baf8ef469b74b9638df426e0b4c" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "wasi 0.10.2+wasi-snapshot-preview1", +] + +[[package]] +name = "hashbrown" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" +dependencies = [ + "ahash", +] + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "idna" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" +dependencies = [ + "matches", + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "impl-codec" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "161ebdfec3c8e3b52bf61c4f3550a1eea4f9579d10dc1b936f3171ebdcd6c443" +dependencies = [ + "parity-scale-codec", +] + +[[package]] +name = "impl-trait-for-tuples" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5dacb10c5b3bb92d46ba347505a9041e676bb20ad220101326bffb0c93031ee" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "indexmap" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282a6247722caba404c065016bbfa522806e51714c34f5dfc3e4a3a46fcb4223" +dependencies = [ + "autocfg", + "hashbrown", +] + +[[package]] +name = "itoa" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" + +[[package]] +name = "keccak" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e74d72e0f9b65b5b4ca49a346af3976df0f9c61d550727f349ecd559f251a26c" + +[[package]] +name = "matches" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" + +[[package]] +name = "memchr" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" + +[[package]] +name = "memory_units" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8452105ba047068f40ff7093dd1d9da90898e63dd61736462e9cdda6a90ad3c3" + +[[package]] +name = "near-account-id" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd61f43cedc1bb7a7c097ef3adbab0092a51185dca0e48d5851b37818e13978" +dependencies = [ + "borsh", + "serde", +] + +[[package]] +name = "near-contract-standards" +version = "4.0.0-pre.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52c4f636adbffbd9399610cb6445894c64c6c8fcf9ea4e607021f252a1e0459f" +dependencies = [ + "near-sdk", + "serde", + "serde_json", +] + +[[package]] +name = "near-crypto" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f68d8d55bd2a457eba5956d8c1255e288c47f394ca6fffe6184d19664bf0bc4c" +dependencies = [ + "arrayref", + "blake2", + "borsh", + "bs58", + "c2-chacha", + "curve25519-dalek", + "derive_more", + "ed25519-dalek", + "lazy_static", + "libc", + "near-account-id", + "parity-secp256k1", + "primitive-types", + "rand 0.7.3", + "rand_core 0.5.1", + "serde", + "serde_json", + "subtle", + "thiserror", +] + +[[package]] +name = "near-primitives" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04d93aaf84ad4f5ccf780d8a0029c6fb636a2e6c1ddb3c772dee4686529e30a8" +dependencies = [ + "base64 0.13.0", + "borsh", + "bs58", + "byteorder", + "bytesize", + "chrono", + "derive_more", + "easy-ext", + "hex", + "near-crypto", + "near-primitives-core", + "near-rpc-error-macro", + "near-vm-errors", + "num-rational", + "primitive-types", + "rand 0.7.3", + "reed-solomon-erasure", + "regex", + "serde", + "serde_json", + "sha2", + "smart-default", + "validator", +] + +[[package]] +name = "near-primitives-core" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d88b2b0f418c1174214fb51106c90251f61ecfe4c7063f149c2e199ec2850fd" +dependencies = [ + "base64 0.11.0", + "borsh", + "bs58", + "derive_more", + "hex", + "lazy_static", + "near-account-id", + "num-rational", + "serde", + "serde_json", + "sha2", +] + +[[package]] +name = "near-rpc-error-core" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a98c9bd7edee4dcfc293e3511e9fab826bcd6fbfbfe06124a1164b94ee60351" +dependencies = [ + "proc-macro2", + "quote", + "serde", + "syn", +] + +[[package]] +name = "near-rpc-error-macro" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1abade92d0fc76a6c25aeb82f3e7fd97678ab5d0fd92b80149a65d1088e86505" +dependencies = [ + "near-rpc-error-core", + "proc-macro2", + "quote", + "serde", + "serde_json", + "syn", +] + +[[package]] +name = "near-sdk" +version = "4.0.0-pre.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4f17c763e91999827a2ad30b909f79e82a56c448bf7170ed72841756397e5a3" +dependencies = [ + "base64 0.13.0", + "borsh", + "bs58", + "near-primitives-core", + "near-sdk-macros", + "near-sys", + "near-vm-logic", + "serde", + "serde_json", + "wee_alloc", +] + +[[package]] +name = "near-sdk-macros" +version = "4.0.0-pre.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d07b8d59302bf900707c41654a7ba178c5a2d8040a8812647f6b7e7e28dc5b1" +dependencies = [ + "Inflector", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "near-sys" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6a7aa3f46fac44416d8a93d14f30a562c4d730a1c6bf14bffafab5f475c244a" + +[[package]] +name = "near-vm-errors" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e781248bed1f8e4792aee0c0362cf8bc831fc9f51573bc43807b5e07e0e7db81" +dependencies = [ + "borsh", + "hex", + "near-account-id", + "near-rpc-error-macro", + "serde", +] + +[[package]] +name = "near-vm-logic" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c06b3cb3ccf0423a9ba6908ccf07abe19c3c34319af200c733f34b7ac5af0ab" +dependencies = [ + "base64 0.13.0", + "borsh", + "bs58", + "byteorder", + "near-account-id", + "near-crypto", + "near-primitives", + "near-primitives-core", + "near-vm-errors", + "ripemd160", + "serde", + "sha2", + "sha3", +] + +[[package]] +name = "num-bigint" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6f7833f2cbf2360a6cfd58cd41a53aa7a90bd4c202f5b1c7dd2ed73c57b2c3" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12ac428b1cb17fce6f731001d307d351ec70a6d202fc2e60f7d4c5e42d8f4f07" +dependencies = [ + "autocfg", + "num-bigint", + "num-integer", + "num-traits", + "serde", +] + +[[package]] +name = "num-traits" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" +dependencies = [ + "autocfg", +] + +[[package]] +name = "once_cell" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da32515d9f6e6e489d7bc9d84c71b060db7247dc035bbe44eac88cf87486d8d5" + +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + +[[package]] +name = "parity-scale-codec" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "373b1a4c1338d9cd3d1fa53b3a11bdab5ab6bd80a20f7f7becd76953ae2be909" +dependencies = [ + "arrayvec 0.7.2", + "bitvec", + "byte-slice-cast", + "impl-trait-for-tuples", + "parity-scale-codec-derive", + "serde", +] + +[[package]] +name = "parity-scale-codec-derive" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1557010476e0595c9b568d16dcfb81b93cdeb157612726f5170d31aa707bed27" +dependencies = [ + "proc-macro-crate 1.1.0", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "parity-secp256k1" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fca4f82fccae37e8bbdaeb949a4a218a1bbc485d11598f193d2a908042e5fc1" +dependencies = [ + "arrayvec 0.5.2", + "cc", + "cfg-if 0.1.10", + "rand 0.7.3", +] + +[[package]] +name = "percent-encoding" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" + +[[package]] +name = "ppv-lite86" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" + +[[package]] +name = "primitive-types" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05e4722c697a58a99d5d06a08c30821d7c082a4632198de1eaa5a6c22ef42373" +dependencies = [ + "fixed-hash", + "impl-codec", + "uint", +] + +[[package]] +name = "proc-macro-crate" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" +dependencies = [ + "toml", +] + +[[package]] +name = "proc-macro-crate" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebace6889caf889b4d3f76becee12e90353f2b8c7d875534a71e5742f8f6f83" +dependencies = [ + "thiserror", + "toml", +] + +[[package]] +name = "proc-macro2" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "quote" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "864d3e96a899863136fc6e99f3d7cae289dafe43bf2c5ac19b70df7210c0a145" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "radium" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "643f8f41a8ebc4c5dc4515c82bb8abd397b527fc20fd681b7c011c2aee5d44fb" + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", +] + +[[package]] +name = "rand" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.3", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.3", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +dependencies = [ + "getrandom 0.2.4", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "reed-solomon-erasure" +version = "4.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a415a013dd7c5d4221382329a5a3482566da675737494935cbbbcdec04662f9d" +dependencies = [ + "smallvec", +] + +[[package]] +name = "regex" +version = "1.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.6.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" + +[[package]] +name = "ripemd160" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2eca4ecc81b7f313189bf73ce724400a07da2a6dac19588b03c8bd76a2dcc251" +dependencies = [ + "block-buffer", + "digest", + "opaque-debug", +] + +[[package]] +name = "rustc-hex" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[package]] +name = "ryu" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f" + +[[package]] +name = "semver" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "568a8e6258aa33c13358f81fd834adb854c6f7c9468520910a9b1e8fac068012" + +[[package]] +name = "serde" +version = "1.0.136" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.136" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08597e7152fcd306f41838ed3e37be9eaeed2b61c42e2117266a554fab4662f9" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.78" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d23c1ba4cf0efd44be32017709280b32d1cea5c3f1275c3b6d9e8bc54f758085" +dependencies = [ + "indexmap", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer", + "cfg-if 1.0.0", + "cpufeatures", + "digest", + "opaque-debug", +] + +[[package]] +name = "sha3" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f81199417d4e5de3f04b1e871023acea7389672c4135918f05aa9cbf2f2fa809" +dependencies = [ + "block-buffer", + "digest", + "keccak", + "opaque-debug", +] + +[[package]] +name = "signature" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f054c6c1a6e95179d6f23ed974060dcefb2d9388bb7256900badad682c499de4" + +[[package]] +name = "smallvec" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83" + +[[package]] +name = "smart-default" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "133659a15339456eeeb07572eb02a91c91e9815e9cbc89566944d2c8d3efdbf6" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "subtle" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" + +[[package]] +name = "syn" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a65b3f4ffa0092e9887669db0eae07941f023991ab58ea44da8fe8e2d511c6b" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "synstructure" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "unicode-xid", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "thiserror" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "854babe52e4df1653706b98fcfc05843010039b406875930a70e4d9644e5c417" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "time" +version = "0.1.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "tinyvec" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c1c1d5a42b6245520c249549ec267180beaffcc0615401ac8e31853d4b6d8d2" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" + +[[package]] +name = "toml" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa" +dependencies = [ + "serde", +] + +[[package]] +name = "typenum" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" + +[[package]] +name = "uint" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b1b413ebfe8c2c74a69ff124699dd156a7fa41cb1d09ba6df94aa2f2b0a4a3a" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a01404663e3db436ed2746d9fefef640d868edae3cceb81c3b8d5732fda678f" + +[[package]] +name = "unicode-normalization" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-xid" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" + +[[package]] +name = "url" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" +dependencies = [ + "form_urlencoded", + "idna", + "matches", + "percent-encoding", +] + +[[package]] +name = "validator" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d6937c33ec6039d8071bcf72933146b5bbe378d645d8fa59bdadabfc2a249" +dependencies = [ + "idna", + "lazy_static", + "regex", + "serde", + "serde_derive", + "serde_json", + "url", + "validator_types", +] + +[[package]] +name = "validator_types" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad9680608df133af2c1ddd5eaf1ddce91d60d61b6bc51494ef326458365a470a" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "w_near_defi" +version = "1.0.0" +dependencies = [ + "near-contract-standards", + "near-sdk", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.10.2+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" + +[[package]] +name = "wee_alloc" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbb3b5a6b2bb17cb6ad44a2e68a43e8d2722c997da10e928665c72ec6c0a0b8e" +dependencies = [ + "cfg-if 0.1.10", + "libc", + "memory_units", + "winapi", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "wyz" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85e60b0d1b5f99db2556934e21937020776a5d31520bf169e851ac44e6420214" + +[[package]] +name = "zeroize" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c88870063c39ee00ec285a2f8d6a966e5b6fb2becc4e8dac77ed0d370ed6006" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81e8f13fef10b63c06356d65d416b070798ddabcadc10d3ece0c5be9b3c7eddb" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] diff --git a/w-near/test-w-near-defi/Cargo.toml b/w-near/test-w-near-defi/Cargo.toml new file mode 100644 index 00000000..caee9367 --- /dev/null +++ b/w-near/test-w-near-defi/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "w_near_defi" +version = "1.0.0" +authors = ["Near Inc "] +edition = "2018" + +[lib] +crate-type = ["cdylib"] + +[dependencies] +near-sdk = "4.0.0-pre.6" +near-contract-standards = "4.0.0-pre.6" diff --git a/w-near/test-w-near-defi/src/lib.rs b/w-near/test-w-near-defi/src/lib.rs new file mode 100644 index 00000000..4721c466 --- /dev/null +++ b/w-near/test-w-near-defi/src/lib.rs @@ -0,0 +1,92 @@ +/*! +Some hypothetical DeFi contract that will do smart things with the transferred tokens +*/ +use near_contract_standards::fungible_token::receiver::FungibleTokenReceiver; +use near_sdk::borsh::{self, BorshDeserialize, BorshSerialize}; +use near_sdk::json_types::U128; +use near_sdk::{ + env, ext_contract, log, near_bindgen, require, AccountId, Balance, Gas, PanicOnDefault, + PromiseOrValue, +}; + +const BASE_GAS: u64 = 5_000_000_000_000; +const PROMISE_CALL: u64 = 5_000_000_000_000; +const GAS_FOR_FT_ON_TRANSFER: Gas = Gas(BASE_GAS + PROMISE_CALL); + +const NO_DEPOSIT: Balance = 0; + +#[near_bindgen] +#[derive(BorshDeserialize, BorshSerialize, PanicOnDefault)] +pub struct DeFi { + fungible_token_account_id: AccountId, +} + +// Defining cross-contract interface. This allows to create a new promise. +#[ext_contract(ext_self)] +pub trait ValueReturnTrait { + fn value_please(&self, amount_to_return: String) -> PromiseOrValue; +} + +// Have to repeat the same trait for our own implementation. +trait ValueReturnTrait { + fn value_please(&self, amount_to_return: String) -> PromiseOrValue; +} + +#[near_bindgen] +impl DeFi { + #[init] + pub fn new(fungible_token_account_id: AccountId) -> Self { + require!(!env::state_exists(), "Already initialized"); + Self { + fungible_token_account_id: fungible_token_account_id.into(), + } + } +} + +#[near_bindgen] +impl FungibleTokenReceiver for DeFi { + /// If given `msg: "invest", immediately returns U128::From(0) + /// Otherwise, makes a cross-contract call to own `value_please` function, passing `msg` + /// value_please will attempt to parse `msg` as an integer and return a U128 version of it + fn ft_on_transfer( + &mut self, + sender_id: AccountId, + amount: U128, + msg: String, + ) -> PromiseOrValue { + // Verifying that we were called by fungible token contract that we expect. + require!( + env::predecessor_account_id() == self.fungible_token_account_id, + "Only supports the one fungible token contract" + ); + log!( + "in {} tokens from @{} ft_on_transfer, msg = {}", + amount.0, + sender_id.as_ref(), + msg + ); + match msg.as_str() { + "invest" => PromiseOrValue::Value(U128::from(0)), + _ => { + let prepaid_gas = env::prepaid_gas(); + let account_id = env::current_account_id(); + ext_self::value_please( + msg, + account_id, + NO_DEPOSIT, + prepaid_gas - GAS_FOR_FT_ON_TRANSFER, + ) + .into() + } + } + } +} + +#[near_bindgen] +impl ValueReturnTrait for DeFi { + fn value_please(&self, amount_to_return: String) -> PromiseOrValue { + log!("in value_please, amount_to_return = {}", amount_to_return); + let amount: Balance = amount_to_return.parse().expect("Not an integer"); + PromiseOrValue::Value(amount.into()) + } +} From dddb708e16902e4efcd0a168ea4c187422468338 Mon Sep 17 00:00:00 2001 From: Daniyar Itegulov Date: Thu, 3 Feb 2022 22:15:27 +1100 Subject: [PATCH 5/9] add tests for storage functions and `ft_transfer_call` --- w-near/tests/mod.rs | 415 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 415 insertions(+) diff --git a/w-near/tests/mod.rs b/w-near/tests/mod.rs index 2c4ea225..7b842345 100644 --- a/w-near/tests/mod.rs +++ b/w-near/tests/mod.rs @@ -39,6 +39,24 @@ pub async fn init_w_near(worker: &Worker) -> anyhow::Result, + contract: &Contract, +) -> anyhow::Result { + let defi_contract = worker + .dev_deploy(include_bytes!("../res/w_near_defi.wasm").to_vec()) + .await?; + let res = defi_contract + .call(&worker, "new") + .args_json((contract.id(),))? + .gas(300_000_000_000_000) + .transact() + .await?; + assert!(matches!(res.status, FinalExecutionStatus::SuccessValue(_))); + + Ok(defi_contract) +} + async fn legacy_register_user( name: &str, contract: &Contract, @@ -425,3 +443,400 @@ async fn test_withdraw_too_much_near() -> anyhow::Result<()> { Ok(()) } + +#[tokio::test] +async fn test_total_supply() -> anyhow::Result<()> { + let worker = workspaces::sandbox(); + let contract = init_w_near(&worker).await?; + + let alice = create_user("alice", &contract, &worker).await?; + + let res = wrap_near(&alice, &contract, &worker, parse_near!("1 N")).await?; + assert!(matches!(res, FinalExecutionStatus::SuccessValue(_))); + + let bob = create_user("bob", &contract, &worker).await?; + + let res = wrap_near(&bob, &contract, &worker, parse_near!("2 N")).await?; + assert!(matches!(res, FinalExecutionStatus::SuccessValue(_))); + + let total_supply: U128 = contract + .call(&worker, "ft_total_supply") + .view() + .await? + .json()?; + assert_eq!(total_supply.0, parse_near!("3 N")); + + Ok(()) +} + +#[tokio::test] +async fn test_close_account_empty_balance() -> anyhow::Result<()> { + let worker = workspaces::sandbox(); + let contract = init_w_near(&worker).await?; + + let alice = create_user("alice", &contract, &worker).await?; + + let res = alice + .call(&worker, contract.id().clone(), "storage_unregister") + .args_json((Option::::None,))? + .gas(300_000_000_000_000) + .deposit(ONE_YOCTO) + .transact() + .await?; + assert!(res.json::()?); + + Ok(()) +} + +#[tokio::test] +async fn test_close_account_non_empty_balance() -> anyhow::Result<()> { + let worker = workspaces::sandbox(); + let contract = init_w_near(&worker).await?; + + let alice = create_user("alice", &contract, &worker).await?; + + let res = wrap_near(&alice, &contract, &worker, parse_near!("1 N")).await?; + assert!(matches!(res, FinalExecutionStatus::SuccessValue(_))); + + let res = alice + .call(&worker, contract.id().clone(), "storage_unregister") + .args_json((Option::::None,))? + .gas(300_000_000_000_000) + .deposit(ONE_YOCTO) + .transact() + .await?; + assert!(format!("{:?}", res.status.as_failure()) + .contains("Can't unregister the account with the positive balance without force")); + + let res = alice + .call(&worker, contract.id().clone(), "storage_unregister") + .args_json((Some(false),))? + .gas(300_000_000_000_000) + .deposit(ONE_YOCTO) + .transact() + .await?; + assert!(format!("{:?}", res.status.as_failure()) + .contains("Can't unregister the account with the positive balance without force")); + + let res = alice + .call(&worker, contract.id().clone(), "storage_unregister") + .args_json((Some(true),))? + .gas(300_000_000_000_000) + .deposit(ONE_YOCTO) + .transact() + .await?; + assert!(res.json::()?); + + Ok(()) +} + +#[tokio::test] +async fn test_disallow_non_zero_storage_withdrawal() -> anyhow::Result<()> { + let worker = workspaces::sandbox(); + let contract = init_w_near(&worker).await?; + + let alice = create_user("alice", &contract, &worker).await?; + + let res = alice + .call(&worker, contract.id().clone(), "storage_withdraw") + .args_json((U128::from(0),))? + .gas(300_000_000_000_000) + .deposit(ONE_YOCTO) + .transact() + .await?; + assert!(matches!(res.status, FinalExecutionStatus::SuccessValue(_))); + + let res = alice + .call(&worker, contract.id().clone(), "storage_withdraw") + .args_json((U128::from(1),))? + .gas(300_000_000_000_000) + .deposit(ONE_YOCTO) + .transact() + .await?; + assert!(format!("{:?}", res.status.as_failure()) + .contains("The amount is greater than the available storage balance")); + + Ok(()) +} + +#[tokio::test] +async fn test_disallow_storage_withdrawal_for_non_registered() -> anyhow::Result<()> { + let worker = workspaces::sandbox(); + let contract = init_w_near(&worker).await?; + + let res = contract + .as_account() + .create_subaccount(&worker, "alice") + .initial_balance(parse_near!("10 N")) + .transact() + .await?; + assert!(matches!( + res.details.status, + FinalExecutionStatus::SuccessValue(_) + )); + let alice = res.result; + + let res = alice + .call(&worker, contract.id().clone(), "storage_withdraw") + .args_json((U128::from(0),))? + .gas(300_000_000_000_000) + .deposit(ONE_YOCTO) + .transact() + .await?; + assert!(format!("{:?}", res.status.as_failure()).contains("not registered")); + + Ok(()) +} + +#[tokio::test] +async fn test_double_storage_deposit() -> anyhow::Result<()> { + let worker = workspaces::sandbox(); + let contract = init_w_near(&worker).await?; + + let alice = create_user("alice", &contract, &worker).await?; + + let res = contract + .call(&worker, "storage_deposit") + .args_json((alice.id(), Option::::None))? + .gas(300_000_000_000_000) + .deposit(125 * LEGACY_BYTE_COST) + .transact() + .await?; + assert!(matches!(res.status, FinalExecutionStatus::SuccessValue(_))); + + Ok(()) +} + +#[tokio::test] +async fn test_insufficient_storage_deposit() -> anyhow::Result<()> { + let worker = workspaces::sandbox(); + let contract = init_w_near(&worker).await?; + + let res = contract + .as_account() + .create_subaccount(&worker, "alice") + .initial_balance(parse_near!("10 N")) + .transact() + .await?; + assert!(matches!( + res.details.status, + FinalExecutionStatus::SuccessValue(_) + )); + let alice = res.result; + + let res = contract + .call(&worker, "storage_deposit") + .args_json((alice.id(), Option::::None))? + .gas(300_000_000_000_000) + .deposit(125 * LEGACY_BYTE_COST - 1) + .transact() + .await?; + assert!(format!("{:?}", res.status.as_failure()) + .contains("The attached deposit is less than the minimum storage balance")); + + Ok(()) +} + +#[tokio::test] +async fn test_transfer_call_invest() -> anyhow::Result<()> { + let worker = workspaces::sandbox(); + let contract = init_w_near(&worker).await?; + let defi_contract = init_defi(&worker, &contract).await?; + + // register root & defi accounts as wNEAR accounts + register_user(&contract.as_account(), &contract, &worker).await?; + register_user(&defi_contract.as_account(), &contract, &worker).await?; + + let res = wrap_near( + contract.as_account(), + &contract, + &worker, + parse_near!("3 N"), + ) + .await?; + assert!(matches!(res, FinalExecutionStatus::SuccessValue(_))); + + // root invests in defi by calling `ft_transfer_call` + let res = contract + .call(&worker, "ft_transfer_call") + .args_json(( + defi_contract.id(), + U128::from(parse_near!("1 N")), + Option::::None, + "invest", + ))? + .gas(300_000_000_000_000) + .deposit(ONE_YOCTO) + .transact() + .await?; + assert!(matches!(res.status, FinalExecutionStatus::SuccessValue(_))); + + let root_balance = contract + .call(&worker, "ft_balance_of") + .args_json((contract.id(),))? + .view() + .await? + .json::()?; + let defi_balance = contract + .call(&worker, "ft_balance_of") + .args_json((defi_contract.id(),))? + .view() + .await? + .json::()?; + assert_eq!(root_balance.0, parse_near!("2 N")); + assert_eq!(defi_balance.0, parse_near!("1 N")); + + Ok(()) +} + +#[tokio::test] +async fn test_transfer_call_when_called_contract_not_registered_with_ft() -> anyhow::Result<()> { + let worker = workspaces::sandbox(); + let contract = init_w_near(&worker).await?; + let defi_contract = init_defi(&worker, &contract).await?; + + register_user(&contract.as_account(), &contract, &worker).await?; + + let res = wrap_near( + contract.as_account(), + &contract, + &worker, + parse_near!("3 N"), + ) + .await?; + assert!(matches!(res, FinalExecutionStatus::SuccessValue(_))); + + // call fails because defi contract is not registered as a wNEAR account + let res = contract + .call(&worker, "ft_transfer_call") + .args_json(( + defi_contract.id(), + parse_near!("1 N"), + Option::::None, + "invest", + ))? + .gas(300_000_000_000_000) + .deposit(ONE_YOCTO) + .transact() + .await?; + assert!(matches!(res.status, FinalExecutionStatus::Failure(_))); + + // balances remain unchanged + let root_balance = contract + .call(&worker, "ft_balance_of") + .args_json((contract.id(),))? + .view() + .await? + .json::()?; + let defi_balance = contract + .call(&worker, "ft_balance_of") + .args_json((defi_contract.id(),))? + .view() + .await? + .json::()?; + assert_eq!(root_balance.0, parse_near!("3 N")); + assert_eq!(defi_balance.0, 0); + + Ok(()) +} + +#[tokio::test] +async fn test_transfer_call_with_promise_and_refund() -> anyhow::Result<()> { + let worker = workspaces::sandbox(); + let contract = init_w_near(&worker).await?; + let defi_contract = init_defi(&worker, &contract).await?; + + register_user(&contract.as_account(), &contract, &worker).await?; + register_user(&defi_contract.as_account(), &contract, &worker).await?; + + let res = wrap_near( + contract.as_account(), + &contract, + &worker, + parse_near!("3 N"), + ) + .await?; + assert!(matches!(res, FinalExecutionStatus::SuccessValue(_))); + + let res = contract + .call(&worker, "ft_transfer_call") + .args_json(( + defi_contract.id(), + U128::from(parse_near!("1 N")), + Option::::None, + U128::from(parse_near!("0.5 N")), + ))? + .gas(300_000_000_000_000) + .deposit(ONE_YOCTO) + .transact() + .await?; + assert!(matches!(res.status, FinalExecutionStatus::SuccessValue(_))); + + let root_balance = contract + .call(&worker, "ft_balance_of") + .args_json((contract.id(),))? + .view() + .await? + .json::()?; + let defi_balance = contract + .call(&worker, "ft_balance_of") + .args_json((defi_contract.id(),))? + .view() + .await? + .json::()?; + assert_eq!(root_balance.0, parse_near!("2.5 N")); + assert_eq!(defi_balance.0, parse_near!("0.5 N")); + + Ok(()) +} + +#[tokio::test] +async fn test_transfer_call_promise_panics_for_a_full_refund() -> anyhow::Result<()> { + let worker = workspaces::sandbox(); + let contract = init_w_near(&worker).await?; + let defi_contract = init_defi(&worker, &contract).await?; + + register_user(&contract.as_account(), &contract, &worker).await?; + register_user(&defi_contract.as_account(), &contract, &worker).await?; + + let res = wrap_near( + contract.as_account(), + &contract, + &worker, + parse_near!("3 N"), + ) + .await?; + assert!(matches!(res, FinalExecutionStatus::SuccessValue(_))); + + let res = contract + .call(&worker, "ft_transfer_call") + .args_json(( + defi_contract.id(), + U128::from(parse_near!("1 N")), + Option::::None, + "invalid integer".to_string(), + ))? + .gas(300_000_000_000_000) + .deposit(ONE_YOCTO) + .transact() + .await?; + assert!(matches!(res.status, FinalExecutionStatus::SuccessValue(_))); + + // balances remain unchanged + let root_balance = contract + .call(&worker, "ft_balance_of") + .args_json((contract.id(),))? + .view() + .await? + .json::()?; + let defi_balance = contract + .call(&worker, "ft_balance_of") + .args_json((defi_contract.id(),))? + .view() + .await? + .json::()?; + assert_eq!(root_balance.0, parse_near!("3 N")); + assert_eq!(defi_balance.0, 0); + + Ok(()) +} From 246a30fa8ffcc5d6d6d0cf392e29cc52656007e4 Mon Sep 17 00:00:00 2001 From: Daniyar Itegulov Date: Thu, 3 Feb 2022 22:15:57 +1100 Subject: [PATCH 6/9] re-generate wasm file --- w-near/res/w_near.wasm | Bin 185235 -> 177825 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/w-near/res/w_near.wasm b/w-near/res/w_near.wasm index b01fcfaea7bd6bc8283b096c097666dac17d9503..38b9fd3775fce649faaed04b802cbdbf0124a227 100755 GIT binary patch literal 177825 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

    qs_m*+h|LPo&juX$~V3^JT+gJ^4 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

    B=j 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 QU*-C-Gt)52Tqkw^A4xKf^#A|> From fb35a447a0828be9fbde8f54de3da9e2ca31a09e Mon Sep 17 00:00:00 2001 From: Daniyar Itegulov Date: Thu, 3 Feb 2022 22:37:36 +1100 Subject: [PATCH 7/9] split tests across files for readability --- w-near/tests/mod.rs | 842 ----------------------- w-near/tests/workspaces/main.rs | 5 + w-near/tests/workspaces/test_legacy.rs | 156 +++++ w-near/tests/workspaces/test_storage.rs | 205 ++++++ w-near/tests/workspaces/test_transfer.rs | 253 +++++++ w-near/tests/workspaces/test_w_near.rs | 106 +++ w-near/tests/workspaces/utils.rs | 141 ++++ 7 files changed, 866 insertions(+), 842 deletions(-) delete mode 100644 w-near/tests/mod.rs create mode 100644 w-near/tests/workspaces/main.rs create mode 100644 w-near/tests/workspaces/test_legacy.rs create mode 100644 w-near/tests/workspaces/test_storage.rs create mode 100644 w-near/tests/workspaces/test_transfer.rs create mode 100644 w-near/tests/workspaces/test_w_near.rs create mode 100644 w-near/tests/workspaces/utils.rs diff --git a/w-near/tests/mod.rs b/w-near/tests/mod.rs deleted file mode 100644 index 7b842345..00000000 --- a/w-near/tests/mod.rs +++ /dev/null @@ -1,842 +0,0 @@ -use near_primitives::views::FinalExecutionStatus; -use near_sdk::json_types::U128; -use near_sdk::{Balance, ONE_YOCTO}; -use near_units::parse_near; -use workspaces::prelude::DevAccountDeployer; -use workspaces::{Account, Contract, DevNetwork, Worker}; - -const LEGACY_BYTE_COST: Balance = 10_000_000_000_000_000_000; - -const STORAGE_BALANCE: Balance = 125 * LEGACY_BYTE_COST; - -pub async fn init_legacy(worker: &Worker) -> anyhow::Result { - let contract = worker - .dev_deploy(include_bytes!("../res/legacy_w_near.wasm").to_vec()) - .await?; - let res = contract - .call(&worker, "new") - .args_json((contract.id(),))? - .gas(300_000_000_000_000) - .transact() - .await?; - assert!(matches!(res.status, FinalExecutionStatus::SuccessValue(_))); - - Ok(contract) -} - -pub async fn init_w_near(worker: &Worker) -> anyhow::Result { - let contract = worker - .dev_deploy(include_bytes!("../res/w_near.wasm").to_vec()) - .await?; - let res = contract - .call(&worker, "new") - .args_json((contract.id(),))? - .gas(300_000_000_000_000) - .transact() - .await?; - assert!(matches!(res.status, FinalExecutionStatus::SuccessValue(_))); - - Ok(contract) -} - -pub async fn init_defi( - worker: &Worker, - contract: &Contract, -) -> anyhow::Result { - let defi_contract = worker - .dev_deploy(include_bytes!("../res/w_near_defi.wasm").to_vec()) - .await?; - let res = defi_contract - .call(&worker, "new") - .args_json((contract.id(),))? - .gas(300_000_000_000_000) - .transact() - .await?; - assert!(matches!(res.status, FinalExecutionStatus::SuccessValue(_))); - - Ok(defi_contract) -} - -async fn legacy_register_user( - name: &str, - contract: &Contract, - worker: &Worker, -) -> anyhow::Result { - let res = contract - .as_account() - .create_subaccount(&worker, name) - .initial_balance(parse_near!("10 N")) - .transact() - .await?; - assert!(matches!( - res.details.status, - FinalExecutionStatus::SuccessValue(_) - )); - let account = res.result; - - let res = contract - .call(&worker, "storage_deposit") - .args_json((account.id(),))? - .gas(300_000_000_000_000) - .deposit(125 * LEGACY_BYTE_COST) - .transact() - .await?; - assert!(matches!(res.status, FinalExecutionStatus::SuccessValue(_))); - - Ok(account) -} - -async fn register_user( - account: &Account, - contract: &Contract, - worker: &Worker, -) -> anyhow::Result<()> { - let res = contract - .call(&worker, "storage_deposit") - .args_json((account.id(), Option::::None))? - .gas(300_000_000_000_000) - .deposit(125 * LEGACY_BYTE_COST) - .transact() - .await?; - assert!(matches!(res.status, FinalExecutionStatus::SuccessValue(_))); - - Ok(()) -} - -async fn create_user( - name: &str, - contract: &Contract, - worker: &Worker, -) -> anyhow::Result { - let res = contract - .as_account() - .create_subaccount(&worker, name) - .initial_balance(parse_near!("10 N")) - .transact() - .await?; - assert!(matches!( - res.details.status, - FinalExecutionStatus::SuccessValue(_) - )); - let account = res.result; - - register_user(&account, &contract, &worker).await?; - - Ok(account) -} - -async fn wrap_near( - account: &Account, - contract: &Contract, - worker: &Worker, - amount: Balance, -) -> anyhow::Result { - Ok(account - .call(&worker, contract.id().clone(), "near_deposit") - .args_json((account.id(),))? - .gas(300_000_000_000_000) - .deposit(amount) - .transact() - .await? - .status) -} - -#[tokio::test] -async fn test_upgrade() -> anyhow::Result<()> { - let worker = workspaces::sandbox(); - let contract = init_legacy(&worker).await?; - - let alice = legacy_register_user("alice", &contract, &worker).await?; - - let legacy_storage_minimum_balance: U128 = contract - .call(&worker, "storage_minimum_balance") - .view() - .await? - .json()?; - assert_eq!(legacy_storage_minimum_balance.0, STORAGE_BALANCE); - - let res = wrap_near(&alice, &contract, &worker, parse_near!("1 N")).await?; - assert!(matches!(res, FinalExecutionStatus::SuccessValue(_))); - - let alice_balance: U128 = contract - .call(&worker, "ft_balance_of") - .args_json((alice.id(),))? - .view() - .await? - .json()?; - assert_eq!(alice_balance.0, parse_near!("1 N")); - - let contract = contract - .as_account() - .deploy(&worker, include_bytes!("../res/w_near.wasm").to_vec()) - .await? - .result; - - let storage_minimum_balance: U128 = contract - .call(&worker, "storage_minimum_balance") - .view() - .await? - .json()?; - assert_eq!(storage_minimum_balance.0, STORAGE_BALANCE); - - let alice_balance: U128 = contract - .call(&worker, "ft_balance_of") - .args_json((alice.id(),))? - .view() - .await? - .json()?; - assert_eq!(alice_balance.0, parse_near!("1 N")); - - let bob = create_user("bob", &contract, &worker).await?; - - let res = wrap_near(&bob, &contract, &worker, parse_near!("1.5 N")).await?; - assert!(matches!(res, FinalExecutionStatus::SuccessValue(_))); - - let bob_balance: U128 = contract - .call(&worker, "ft_balance_of") - .args_json((bob.id(),))? - .view() - .await? - .json()?; - assert_eq!(bob_balance.0, parse_near!("1.5 N")); - - let res = alice - .call(&worker, contract.id().clone(), "ft_transfer") - .args_json(( - bob.id(), - U128::from(parse_near!("0.5 N")), - Option::::None, - ))? - .gas(300_000_000_000_000) - .deposit(ONE_YOCTO) - .transact() - .await?; - assert!(matches!(res.status, FinalExecutionStatus::SuccessValue(_))); - - let bob_balance: U128 = contract - .call(&worker, "ft_balance_of") - .args_json((bob.id(),))? - .view() - .await? - .json()?; - assert_eq!(bob_balance.0, parse_near!("2 N")); - - Ok(()) -} - -#[tokio::test] -async fn test_legacy_ft_transfer() -> anyhow::Result<()> { - let worker = workspaces::sandbox(); - let contract = init_legacy(&worker).await?; - - let alice = legacy_register_user("alice", &contract, &worker).await?; - - let res = wrap_near(&alice, &contract, &worker, parse_near!("1 N")).await?; - assert!(matches!(res, FinalExecutionStatus::SuccessValue(_))); - - let alice_balance: U128 = contract - .call(&worker, "ft_balance_of") - .args_json((alice.id(),))? - .view() - .await? - .json()?; - assert_eq!(alice_balance.0, parse_near!("1 N")); - - let bob = legacy_register_user("bob", &contract, &worker).await?; - - let res = alice - .call(&worker, contract.id().clone(), "ft_transfer") - .args_json(( - bob.id(), - U128::from(parse_near!("0.5 N")), - Option::::None, - ))? - .gas(300_000_000_000_000) - .deposit(ONE_YOCTO) - .transact() - .await?; - assert!(matches!(res.status, FinalExecutionStatus::SuccessValue(_))); - - let bob_balance: U128 = contract - .call(&worker, "ft_balance_of") - .args_json((bob.id(),))? - .view() - .await? - .json()?; - assert_eq!(bob_balance.0, parse_near!("0.5 N")); - - Ok(()) -} - -#[tokio::test] -async fn test_ft_transfer() -> anyhow::Result<()> { - let worker = workspaces::sandbox(); - let contract = init_w_near(&worker).await?; - - let alice = create_user("alice", &contract, &worker).await?; - - let res = wrap_near(&alice, &contract, &worker, parse_near!("1 N")).await?; - assert!(matches!(res, FinalExecutionStatus::SuccessValue(_))); - - let alice_balance: U128 = contract - .call(&worker, "ft_balance_of") - .args_json((alice.id(),))? - .view() - .await? - .json()?; - assert_eq!(alice_balance.0, parse_near!("1 N")); - - let bob = create_user("bob", &contract, &worker).await?; - - let res = alice - .call(&worker, contract.id().clone(), "ft_transfer") - .args_json(( - bob.id(), - U128::from(parse_near!("0.5 N")), - Option::::None, - ))? - .gas(300_000_000_000_000) - .deposit(ONE_YOCTO) - .transact() - .await?; - assert!(matches!(res.status, FinalExecutionStatus::SuccessValue(_))); - - let bob_balance: U128 = contract - .call(&worker, "ft_balance_of") - .args_json((bob.id(),))? - .view() - .await? - .json()?; - assert_eq!(bob_balance.0, parse_near!("0.5 N")); - - Ok(()) -} - -#[tokio::test] -async fn test_legacy_wrap_fail() -> anyhow::Result<()> { - let worker = workspaces::sandbox(); - let contract = init_legacy(&worker).await?; - - // Create a user, but do not register them - let res = contract - .as_account() - .create_subaccount(&worker, "alice") - .initial_balance(parse_near!("10 N")) - .transact() - .await?; - assert!(matches!( - res.details.status, - FinalExecutionStatus::SuccessValue(_) - )); - let alice = res.result; - - let res = wrap_near(&alice, &contract, &worker, parse_near!("1 N")).await?; - assert!(matches!(res, FinalExecutionStatus::Failure(_))); - - Ok(()) -} - -#[tokio::test] -async fn test_wrap_without_storage_deposit() -> anyhow::Result<()> { - let worker = workspaces::sandbox(); - let contract = init_w_near(&worker).await?; - - // Create a user, but do not register them - let res = contract - .as_account() - .create_subaccount(&worker, "alice") - .initial_balance(parse_near!("10 N")) - .transact() - .await?; - assert!(matches!( - res.details.status, - FinalExecutionStatus::SuccessValue(_) - )); - let alice = res.result; - - let res = wrap_near(&alice, &contract, &worker, parse_near!("1 N")).await?; - assert!(matches!(res, FinalExecutionStatus::SuccessValue(_))); - - let alice_balance: U128 = contract - .call(&worker, "ft_balance_of") - .args_json((alice.id(),))? - .view() - .await? - .json()?; - assert_eq!(alice_balance.0, parse_near!("1 N") - STORAGE_BALANCE); - - Ok(()) -} - -#[tokio::test] -async fn test_withdraw_near() -> anyhow::Result<()> { - let worker = workspaces::sandbox(); - let contract = init_w_near(&worker).await?; - - let alice = create_user("alice", &contract, &worker).await?; - - let res = wrap_near(&alice, &contract, &worker, parse_near!("1 N")).await?; - assert!(matches!(res, FinalExecutionStatus::SuccessValue(_))); - - let alice_balance: U128 = contract - .call(&worker, "ft_balance_of") - .args_json((alice.id(),))? - .view() - .await? - .json()?; - assert_eq!(alice_balance.0, parse_near!("1 N")); - - let res = alice - .call(&worker, contract.id().clone(), "near_withdraw") - .args_json((U128::from(parse_near!("0.5 N")),))? - .gas(300_000_000_000_000) - .deposit(ONE_YOCTO) - .transact() - .await?; - assert!(matches!(res.status, FinalExecutionStatus::SuccessValue(_))); - - let alice_balance: U128 = contract - .call(&worker, "ft_balance_of") - .args_json((alice.id(),))? - .view() - .await? - .json()?; - assert_eq!(alice_balance.0, parse_near!("0.5 N")); - - Ok(()) -} - -#[tokio::test] -async fn test_withdraw_too_much_near() -> anyhow::Result<()> { - let worker = workspaces::sandbox(); - let contract = init_w_near(&worker).await?; - - let alice = create_user("alice", &contract, &worker).await?; - - let res = wrap_near(&alice, &contract, &worker, parse_near!("1 N")).await?; - assert!(matches!(res, FinalExecutionStatus::SuccessValue(_))); - - let alice_balance: U128 = contract - .call(&worker, "ft_balance_of") - .args_json((alice.id(),))? - .view() - .await? - .json()?; - assert_eq!(alice_balance.0, parse_near!("1 N")); - - let res = alice - .call(&worker, contract.id().clone(), "near_withdraw") - .args_json((U128::from(parse_near!("1.5 N")),))? - .gas(300_000_000_000_000) - .deposit(ONE_YOCTO) - .transact() - .await?; - assert!(matches!(res.status, FinalExecutionStatus::Failure(_))); - - let alice_balance: U128 = contract - .call(&worker, "ft_balance_of") - .args_json((alice.id(),))? - .view() - .await? - .json()?; - assert_eq!(alice_balance.0, parse_near!("1 N")); - - Ok(()) -} - -#[tokio::test] -async fn test_total_supply() -> anyhow::Result<()> { - let worker = workspaces::sandbox(); - let contract = init_w_near(&worker).await?; - - let alice = create_user("alice", &contract, &worker).await?; - - let res = wrap_near(&alice, &contract, &worker, parse_near!("1 N")).await?; - assert!(matches!(res, FinalExecutionStatus::SuccessValue(_))); - - let bob = create_user("bob", &contract, &worker).await?; - - let res = wrap_near(&bob, &contract, &worker, parse_near!("2 N")).await?; - assert!(matches!(res, FinalExecutionStatus::SuccessValue(_))); - - let total_supply: U128 = contract - .call(&worker, "ft_total_supply") - .view() - .await? - .json()?; - assert_eq!(total_supply.0, parse_near!("3 N")); - - Ok(()) -} - -#[tokio::test] -async fn test_close_account_empty_balance() -> anyhow::Result<()> { - let worker = workspaces::sandbox(); - let contract = init_w_near(&worker).await?; - - let alice = create_user("alice", &contract, &worker).await?; - - let res = alice - .call(&worker, contract.id().clone(), "storage_unregister") - .args_json((Option::::None,))? - .gas(300_000_000_000_000) - .deposit(ONE_YOCTO) - .transact() - .await?; - assert!(res.json::()?); - - Ok(()) -} - -#[tokio::test] -async fn test_close_account_non_empty_balance() -> anyhow::Result<()> { - let worker = workspaces::sandbox(); - let contract = init_w_near(&worker).await?; - - let alice = create_user("alice", &contract, &worker).await?; - - let res = wrap_near(&alice, &contract, &worker, parse_near!("1 N")).await?; - assert!(matches!(res, FinalExecutionStatus::SuccessValue(_))); - - let res = alice - .call(&worker, contract.id().clone(), "storage_unregister") - .args_json((Option::::None,))? - .gas(300_000_000_000_000) - .deposit(ONE_YOCTO) - .transact() - .await?; - assert!(format!("{:?}", res.status.as_failure()) - .contains("Can't unregister the account with the positive balance without force")); - - let res = alice - .call(&worker, contract.id().clone(), "storage_unregister") - .args_json((Some(false),))? - .gas(300_000_000_000_000) - .deposit(ONE_YOCTO) - .transact() - .await?; - assert!(format!("{:?}", res.status.as_failure()) - .contains("Can't unregister the account with the positive balance without force")); - - let res = alice - .call(&worker, contract.id().clone(), "storage_unregister") - .args_json((Some(true),))? - .gas(300_000_000_000_000) - .deposit(ONE_YOCTO) - .transact() - .await?; - assert!(res.json::()?); - - Ok(()) -} - -#[tokio::test] -async fn test_disallow_non_zero_storage_withdrawal() -> anyhow::Result<()> { - let worker = workspaces::sandbox(); - let contract = init_w_near(&worker).await?; - - let alice = create_user("alice", &contract, &worker).await?; - - let res = alice - .call(&worker, contract.id().clone(), "storage_withdraw") - .args_json((U128::from(0),))? - .gas(300_000_000_000_000) - .deposit(ONE_YOCTO) - .transact() - .await?; - assert!(matches!(res.status, FinalExecutionStatus::SuccessValue(_))); - - let res = alice - .call(&worker, contract.id().clone(), "storage_withdraw") - .args_json((U128::from(1),))? - .gas(300_000_000_000_000) - .deposit(ONE_YOCTO) - .transact() - .await?; - assert!(format!("{:?}", res.status.as_failure()) - .contains("The amount is greater than the available storage balance")); - - Ok(()) -} - -#[tokio::test] -async fn test_disallow_storage_withdrawal_for_non_registered() -> anyhow::Result<()> { - let worker = workspaces::sandbox(); - let contract = init_w_near(&worker).await?; - - let res = contract - .as_account() - .create_subaccount(&worker, "alice") - .initial_balance(parse_near!("10 N")) - .transact() - .await?; - assert!(matches!( - res.details.status, - FinalExecutionStatus::SuccessValue(_) - )); - let alice = res.result; - - let res = alice - .call(&worker, contract.id().clone(), "storage_withdraw") - .args_json((U128::from(0),))? - .gas(300_000_000_000_000) - .deposit(ONE_YOCTO) - .transact() - .await?; - assert!(format!("{:?}", res.status.as_failure()).contains("not registered")); - - Ok(()) -} - -#[tokio::test] -async fn test_double_storage_deposit() -> anyhow::Result<()> { - let worker = workspaces::sandbox(); - let contract = init_w_near(&worker).await?; - - let alice = create_user("alice", &contract, &worker).await?; - - let res = contract - .call(&worker, "storage_deposit") - .args_json((alice.id(), Option::::None))? - .gas(300_000_000_000_000) - .deposit(125 * LEGACY_BYTE_COST) - .transact() - .await?; - assert!(matches!(res.status, FinalExecutionStatus::SuccessValue(_))); - - Ok(()) -} - -#[tokio::test] -async fn test_insufficient_storage_deposit() -> anyhow::Result<()> { - let worker = workspaces::sandbox(); - let contract = init_w_near(&worker).await?; - - let res = contract - .as_account() - .create_subaccount(&worker, "alice") - .initial_balance(parse_near!("10 N")) - .transact() - .await?; - assert!(matches!( - res.details.status, - FinalExecutionStatus::SuccessValue(_) - )); - let alice = res.result; - - let res = contract - .call(&worker, "storage_deposit") - .args_json((alice.id(), Option::::None))? - .gas(300_000_000_000_000) - .deposit(125 * LEGACY_BYTE_COST - 1) - .transact() - .await?; - assert!(format!("{:?}", res.status.as_failure()) - .contains("The attached deposit is less than the minimum storage balance")); - - Ok(()) -} - -#[tokio::test] -async fn test_transfer_call_invest() -> anyhow::Result<()> { - let worker = workspaces::sandbox(); - let contract = init_w_near(&worker).await?; - let defi_contract = init_defi(&worker, &contract).await?; - - // register root & defi accounts as wNEAR accounts - register_user(&contract.as_account(), &contract, &worker).await?; - register_user(&defi_contract.as_account(), &contract, &worker).await?; - - let res = wrap_near( - contract.as_account(), - &contract, - &worker, - parse_near!("3 N"), - ) - .await?; - assert!(matches!(res, FinalExecutionStatus::SuccessValue(_))); - - // root invests in defi by calling `ft_transfer_call` - let res = contract - .call(&worker, "ft_transfer_call") - .args_json(( - defi_contract.id(), - U128::from(parse_near!("1 N")), - Option::::None, - "invest", - ))? - .gas(300_000_000_000_000) - .deposit(ONE_YOCTO) - .transact() - .await?; - assert!(matches!(res.status, FinalExecutionStatus::SuccessValue(_))); - - let root_balance = contract - .call(&worker, "ft_balance_of") - .args_json((contract.id(),))? - .view() - .await? - .json::()?; - let defi_balance = contract - .call(&worker, "ft_balance_of") - .args_json((defi_contract.id(),))? - .view() - .await? - .json::()?; - assert_eq!(root_balance.0, parse_near!("2 N")); - assert_eq!(defi_balance.0, parse_near!("1 N")); - - Ok(()) -} - -#[tokio::test] -async fn test_transfer_call_when_called_contract_not_registered_with_ft() -> anyhow::Result<()> { - let worker = workspaces::sandbox(); - let contract = init_w_near(&worker).await?; - let defi_contract = init_defi(&worker, &contract).await?; - - register_user(&contract.as_account(), &contract, &worker).await?; - - let res = wrap_near( - contract.as_account(), - &contract, - &worker, - parse_near!("3 N"), - ) - .await?; - assert!(matches!(res, FinalExecutionStatus::SuccessValue(_))); - - // call fails because defi contract is not registered as a wNEAR account - let res = contract - .call(&worker, "ft_transfer_call") - .args_json(( - defi_contract.id(), - parse_near!("1 N"), - Option::::None, - "invest", - ))? - .gas(300_000_000_000_000) - .deposit(ONE_YOCTO) - .transact() - .await?; - assert!(matches!(res.status, FinalExecutionStatus::Failure(_))); - - // balances remain unchanged - let root_balance = contract - .call(&worker, "ft_balance_of") - .args_json((contract.id(),))? - .view() - .await? - .json::()?; - let defi_balance = contract - .call(&worker, "ft_balance_of") - .args_json((defi_contract.id(),))? - .view() - .await? - .json::()?; - assert_eq!(root_balance.0, parse_near!("3 N")); - assert_eq!(defi_balance.0, 0); - - Ok(()) -} - -#[tokio::test] -async fn test_transfer_call_with_promise_and_refund() -> anyhow::Result<()> { - let worker = workspaces::sandbox(); - let contract = init_w_near(&worker).await?; - let defi_contract = init_defi(&worker, &contract).await?; - - register_user(&contract.as_account(), &contract, &worker).await?; - register_user(&defi_contract.as_account(), &contract, &worker).await?; - - let res = wrap_near( - contract.as_account(), - &contract, - &worker, - parse_near!("3 N"), - ) - .await?; - assert!(matches!(res, FinalExecutionStatus::SuccessValue(_))); - - let res = contract - .call(&worker, "ft_transfer_call") - .args_json(( - defi_contract.id(), - U128::from(parse_near!("1 N")), - Option::::None, - U128::from(parse_near!("0.5 N")), - ))? - .gas(300_000_000_000_000) - .deposit(ONE_YOCTO) - .transact() - .await?; - assert!(matches!(res.status, FinalExecutionStatus::SuccessValue(_))); - - let root_balance = contract - .call(&worker, "ft_balance_of") - .args_json((contract.id(),))? - .view() - .await? - .json::()?; - let defi_balance = contract - .call(&worker, "ft_balance_of") - .args_json((defi_contract.id(),))? - .view() - .await? - .json::()?; - assert_eq!(root_balance.0, parse_near!("2.5 N")); - assert_eq!(defi_balance.0, parse_near!("0.5 N")); - - Ok(()) -} - -#[tokio::test] -async fn test_transfer_call_promise_panics_for_a_full_refund() -> anyhow::Result<()> { - let worker = workspaces::sandbox(); - let contract = init_w_near(&worker).await?; - let defi_contract = init_defi(&worker, &contract).await?; - - register_user(&contract.as_account(), &contract, &worker).await?; - register_user(&defi_contract.as_account(), &contract, &worker).await?; - - let res = wrap_near( - contract.as_account(), - &contract, - &worker, - parse_near!("3 N"), - ) - .await?; - assert!(matches!(res, FinalExecutionStatus::SuccessValue(_))); - - let res = contract - .call(&worker, "ft_transfer_call") - .args_json(( - defi_contract.id(), - U128::from(parse_near!("1 N")), - Option::::None, - "invalid integer".to_string(), - ))? - .gas(300_000_000_000_000) - .deposit(ONE_YOCTO) - .transact() - .await?; - assert!(matches!(res.status, FinalExecutionStatus::SuccessValue(_))); - - // balances remain unchanged - let root_balance = contract - .call(&worker, "ft_balance_of") - .args_json((contract.id(),))? - .view() - .await? - .json::()?; - let defi_balance = contract - .call(&worker, "ft_balance_of") - .args_json((defi_contract.id(),))? - .view() - .await? - .json::()?; - assert_eq!(root_balance.0, parse_near!("3 N")); - assert_eq!(defi_balance.0, 0); - - Ok(()) -} diff --git a/w-near/tests/workspaces/main.rs b/w-near/tests/workspaces/main.rs new file mode 100644 index 00000000..3cc35397 --- /dev/null +++ b/w-near/tests/workspaces/main.rs @@ -0,0 +1,5 @@ +mod test_legacy; +mod test_storage; +mod test_transfer; +mod test_w_near; +mod utils; diff --git a/w-near/tests/workspaces/test_legacy.rs b/w-near/tests/workspaces/test_legacy.rs new file mode 100644 index 00000000..7e1915b6 --- /dev/null +++ b/w-near/tests/workspaces/test_legacy.rs @@ -0,0 +1,156 @@ +use crate::utils::{create_user, init_legacy, legacy_register_user, wrap_near, STORAGE_BALANCE}; +use near_primitives::views::FinalExecutionStatus; +use near_sdk::json_types::U128; +use near_sdk::ONE_YOCTO; +use near_units::parse_near; + +#[tokio::test] +async fn test_upgrade() -> anyhow::Result<()> { + let worker = workspaces::sandbox(); + let contract = init_legacy(&worker).await?; + + let alice = legacy_register_user("alice", &contract, &worker).await?; + + let legacy_storage_minimum_balance: U128 = contract + .call(&worker, "storage_minimum_balance") + .view() + .await? + .json()?; + assert_eq!(legacy_storage_minimum_balance.0, STORAGE_BALANCE); + + let res = wrap_near(&alice, &contract, &worker, parse_near!("1 N")).await?; + assert!(matches!(res, FinalExecutionStatus::SuccessValue(_))); + + let alice_balance: U128 = contract + .call(&worker, "ft_balance_of") + .args_json((alice.id(),))? + .view() + .await? + .json()?; + assert_eq!(alice_balance.0, parse_near!("1 N")); + + let contract = contract + .as_account() + .deploy(&worker, include_bytes!("../../res/w_near.wasm").to_vec()) + .await? + .result; + + let storage_minimum_balance: U128 = contract + .call(&worker, "storage_minimum_balance") + .view() + .await? + .json()?; + assert_eq!(storage_minimum_balance.0, STORAGE_BALANCE); + + let alice_balance: U128 = contract + .call(&worker, "ft_balance_of") + .args_json((alice.id(),))? + .view() + .await? + .json()?; + assert_eq!(alice_balance.0, parse_near!("1 N")); + + let bob = create_user("bob", &contract, &worker).await?; + + let res = wrap_near(&bob, &contract, &worker, parse_near!("1.5 N")).await?; + assert!(matches!(res, FinalExecutionStatus::SuccessValue(_))); + + let bob_balance: U128 = contract + .call(&worker, "ft_balance_of") + .args_json((bob.id(),))? + .view() + .await? + .json()?; + assert_eq!(bob_balance.0, parse_near!("1.5 N")); + + let res = alice + .call(&worker, contract.id().clone(), "ft_transfer") + .args_json(( + bob.id(), + U128::from(parse_near!("0.5 N")), + Option::::None, + ))? + .gas(300_000_000_000_000) + .deposit(ONE_YOCTO) + .transact() + .await?; + assert!(matches!(res.status, FinalExecutionStatus::SuccessValue(_))); + + let bob_balance: U128 = contract + .call(&worker, "ft_balance_of") + .args_json((bob.id(),))? + .view() + .await? + .json()?; + assert_eq!(bob_balance.0, parse_near!("2 N")); + + Ok(()) +} + +#[tokio::test] +async fn test_legacy_ft_transfer() -> anyhow::Result<()> { + let worker = workspaces::sandbox(); + let contract = init_legacy(&worker).await?; + + let alice = legacy_register_user("alice", &contract, &worker).await?; + + let res = wrap_near(&alice, &contract, &worker, parse_near!("1 N")).await?; + assert!(matches!(res, FinalExecutionStatus::SuccessValue(_))); + + let alice_balance: U128 = contract + .call(&worker, "ft_balance_of") + .args_json((alice.id(),))? + .view() + .await? + .json()?; + assert_eq!(alice_balance.0, parse_near!("1 N")); + + let bob = legacy_register_user("bob", &contract, &worker).await?; + + let res = alice + .call(&worker, contract.id().clone(), "ft_transfer") + .args_json(( + bob.id(), + U128::from(parse_near!("0.5 N")), + Option::::None, + ))? + .gas(300_000_000_000_000) + .deposit(ONE_YOCTO) + .transact() + .await?; + assert!(matches!(res.status, FinalExecutionStatus::SuccessValue(_))); + + let bob_balance: U128 = contract + .call(&worker, "ft_balance_of") + .args_json((bob.id(),))? + .view() + .await? + .json()?; + assert_eq!(bob_balance.0, parse_near!("0.5 N")); + + Ok(()) +} + +#[tokio::test] +async fn test_legacy_wrap_fail() -> anyhow::Result<()> { + let worker = workspaces::sandbox(); + let contract = init_legacy(&worker).await?; + + // Create a user, but do not register them + let res = contract + .as_account() + .create_subaccount(&worker, "alice") + .initial_balance(parse_near!("10 N")) + .transact() + .await?; + assert!(matches!( + res.details.status, + FinalExecutionStatus::SuccessValue(_) + )); + let alice = res.result; + + let res = wrap_near(&alice, &contract, &worker, parse_near!("1 N")).await?; + assert!(matches!(res, FinalExecutionStatus::Failure(_))); + + Ok(()) +} diff --git a/w-near/tests/workspaces/test_storage.rs b/w-near/tests/workspaces/test_storage.rs new file mode 100644 index 00000000..d6ca4978 --- /dev/null +++ b/w-near/tests/workspaces/test_storage.rs @@ -0,0 +1,205 @@ +use crate::utils::{create_user, init_w_near, wrap_near, LEGACY_BYTE_COST, STORAGE_BALANCE}; +use near_primitives::views::FinalExecutionStatus; +use near_sdk::json_types::U128; +use near_sdk::ONE_YOCTO; +use near_units::parse_near; + +#[tokio::test] +async fn test_wrap_without_storage_deposit() -> anyhow::Result<()> { + let worker = workspaces::sandbox(); + let contract = init_w_near(&worker).await?; + + // Create a user, but do not register them + let res = contract + .as_account() + .create_subaccount(&worker, "alice") + .initial_balance(parse_near!("10 N")) + .transact() + .await?; + assert!(matches!( + res.details.status, + FinalExecutionStatus::SuccessValue(_) + )); + let alice = res.result; + + let res = wrap_near(&alice, &contract, &worker, parse_near!("1 N")).await?; + assert!(matches!(res, FinalExecutionStatus::SuccessValue(_))); + + let alice_balance: U128 = contract + .call(&worker, "ft_balance_of") + .args_json((alice.id(),))? + .view() + .await? + .json()?; + assert_eq!(alice_balance.0, parse_near!("1 N") - STORAGE_BALANCE); + + Ok(()) +} + +#[tokio::test] +async fn test_close_account_empty_balance() -> anyhow::Result<()> { + let worker = workspaces::sandbox(); + let contract = init_w_near(&worker).await?; + + let alice = create_user("alice", &contract, &worker).await?; + + let res = alice + .call(&worker, contract.id().clone(), "storage_unregister") + .args_json((Option::::None,))? + .gas(300_000_000_000_000) + .deposit(ONE_YOCTO) + .transact() + .await?; + assert!(res.json::()?); + + Ok(()) +} + +#[tokio::test] +async fn test_close_account_non_empty_balance() -> anyhow::Result<()> { + let worker = workspaces::sandbox(); + let contract = init_w_near(&worker).await?; + + let alice = create_user("alice", &contract, &worker).await?; + + let res = wrap_near(&alice, &contract, &worker, parse_near!("1 N")).await?; + assert!(matches!(res, FinalExecutionStatus::SuccessValue(_))); + + let res = alice + .call(&worker, contract.id().clone(), "storage_unregister") + .args_json((Option::::None,))? + .gas(300_000_000_000_000) + .deposit(ONE_YOCTO) + .transact() + .await?; + assert!(format!("{:?}", res.status.as_failure()) + .contains("Can't unregister the account with the positive balance without force")); + + let res = alice + .call(&worker, contract.id().clone(), "storage_unregister") + .args_json((Some(false),))? + .gas(300_000_000_000_000) + .deposit(ONE_YOCTO) + .transact() + .await?; + assert!(format!("{:?}", res.status.as_failure()) + .contains("Can't unregister the account with the positive balance without force")); + + let res = alice + .call(&worker, contract.id().clone(), "storage_unregister") + .args_json((Some(true),))? + .gas(300_000_000_000_000) + .deposit(ONE_YOCTO) + .transact() + .await?; + assert!(res.json::()?); + + Ok(()) +} + +#[tokio::test] +async fn test_disallow_non_zero_storage_withdrawal() -> anyhow::Result<()> { + let worker = workspaces::sandbox(); + let contract = init_w_near(&worker).await?; + + let alice = create_user("alice", &contract, &worker).await?; + + let res = alice + .call(&worker, contract.id().clone(), "storage_withdraw") + .args_json((U128::from(0),))? + .gas(300_000_000_000_000) + .deposit(ONE_YOCTO) + .transact() + .await?; + assert!(matches!(res.status, FinalExecutionStatus::SuccessValue(_))); + + let res = alice + .call(&worker, contract.id().clone(), "storage_withdraw") + .args_json((U128::from(1),))? + .gas(300_000_000_000_000) + .deposit(ONE_YOCTO) + .transact() + .await?; + assert!(format!("{:?}", res.status.as_failure()) + .contains("The amount is greater than the available storage balance")); + + Ok(()) +} + +#[tokio::test] +async fn test_disallow_storage_withdrawal_for_non_registered() -> anyhow::Result<()> { + let worker = workspaces::sandbox(); + let contract = init_w_near(&worker).await?; + + let res = contract + .as_account() + .create_subaccount(&worker, "alice") + .initial_balance(parse_near!("10 N")) + .transact() + .await?; + assert!(matches!( + res.details.status, + FinalExecutionStatus::SuccessValue(_) + )); + let alice = res.result; + + let res = alice + .call(&worker, contract.id().clone(), "storage_withdraw") + .args_json((U128::from(0),))? + .gas(300_000_000_000_000) + .deposit(ONE_YOCTO) + .transact() + .await?; + assert!(format!("{:?}", res.status.as_failure()).contains("not registered")); + + Ok(()) +} + +#[tokio::test] +async fn test_double_storage_deposit() -> anyhow::Result<()> { + let worker = workspaces::sandbox(); + let contract = init_w_near(&worker).await?; + + let alice = create_user("alice", &contract, &worker).await?; + + let res = contract + .call(&worker, "storage_deposit") + .args_json((alice.id(), Option::::None))? + .gas(300_000_000_000_000) + .deposit(125 * LEGACY_BYTE_COST) + .transact() + .await?; + assert!(matches!(res.status, FinalExecutionStatus::SuccessValue(_))); + + Ok(()) +} + +#[tokio::test] +async fn test_insufficient_storage_deposit() -> anyhow::Result<()> { + let worker = workspaces::sandbox(); + let contract = init_w_near(&worker).await?; + + let res = contract + .as_account() + .create_subaccount(&worker, "alice") + .initial_balance(parse_near!("10 N")) + .transact() + .await?; + assert!(matches!( + res.details.status, + FinalExecutionStatus::SuccessValue(_) + )); + let alice = res.result; + + let res = contract + .call(&worker, "storage_deposit") + .args_json((alice.id(), Option::::None))? + .gas(300_000_000_000_000) + .deposit(125 * LEGACY_BYTE_COST - 1) + .transact() + .await?; + assert!(format!("{:?}", res.status.as_failure()) + .contains("The attached deposit is less than the minimum storage balance")); + + Ok(()) +} diff --git a/w-near/tests/workspaces/test_transfer.rs b/w-near/tests/workspaces/test_transfer.rs new file mode 100644 index 00000000..515d2f23 --- /dev/null +++ b/w-near/tests/workspaces/test_transfer.rs @@ -0,0 +1,253 @@ +use crate::utils::{create_user, init_defi, init_w_near, register_user, wrap_near}; +use near_primitives::views::FinalExecutionStatus; +use near_sdk::json_types::U128; +use near_sdk::ONE_YOCTO; +use near_units::parse_near; + +#[tokio::test] +async fn test_ft_transfer() -> anyhow::Result<()> { + let worker = workspaces::sandbox(); + let contract = init_w_near(&worker).await?; + + let alice = create_user("alice", &contract, &worker).await?; + + let res = wrap_near(&alice, &contract, &worker, parse_near!("1 N")).await?; + assert!(matches!(res, FinalExecutionStatus::SuccessValue(_))); + + let alice_balance: U128 = contract + .call(&worker, "ft_balance_of") + .args_json((alice.id(),))? + .view() + .await? + .json()?; + assert_eq!(alice_balance.0, parse_near!("1 N")); + + let bob = create_user("bob", &contract, &worker).await?; + + let res = alice + .call(&worker, contract.id().clone(), "ft_transfer") + .args_json(( + bob.id(), + U128::from(parse_near!("0.5 N")), + Option::::None, + ))? + .gas(300_000_000_000_000) + .deposit(ONE_YOCTO) + .transact() + .await?; + assert!(matches!(res.status, FinalExecutionStatus::SuccessValue(_))); + + let bob_balance: U128 = contract + .call(&worker, "ft_balance_of") + .args_json((bob.id(),))? + .view() + .await? + .json()?; + assert_eq!(bob_balance.0, parse_near!("0.5 N")); + + Ok(()) +} + +#[tokio::test] +async fn test_transfer_call_invest() -> anyhow::Result<()> { + let worker = workspaces::sandbox(); + let contract = init_w_near(&worker).await?; + let defi_contract = init_defi(&worker, &contract).await?; + + // register root & defi accounts as wNEAR accounts + register_user(&contract.as_account(), &contract, &worker).await?; + register_user(&defi_contract.as_account(), &contract, &worker).await?; + + let res = wrap_near( + contract.as_account(), + &contract, + &worker, + parse_near!("3 N"), + ) + .await?; + assert!(matches!(res, FinalExecutionStatus::SuccessValue(_))); + + // root invests in defi by calling `ft_transfer_call` + let res = contract + .call(&worker, "ft_transfer_call") + .args_json(( + defi_contract.id(), + U128::from(parse_near!("1 N")), + Option::::None, + "invest", + ))? + .gas(300_000_000_000_000) + .deposit(ONE_YOCTO) + .transact() + .await?; + assert!(matches!(res.status, FinalExecutionStatus::SuccessValue(_))); + + let root_balance = contract + .call(&worker, "ft_balance_of") + .args_json((contract.id(),))? + .view() + .await? + .json::()?; + let defi_balance = contract + .call(&worker, "ft_balance_of") + .args_json((defi_contract.id(),))? + .view() + .await? + .json::()?; + assert_eq!(root_balance.0, parse_near!("2 N")); + assert_eq!(defi_balance.0, parse_near!("1 N")); + + Ok(()) +} + +#[tokio::test] +async fn test_transfer_call_when_called_contract_not_registered_with_ft() -> anyhow::Result<()> { + let worker = workspaces::sandbox(); + let contract = init_w_near(&worker).await?; + let defi_contract = init_defi(&worker, &contract).await?; + + register_user(&contract.as_account(), &contract, &worker).await?; + + let res = wrap_near( + contract.as_account(), + &contract, + &worker, + parse_near!("3 N"), + ) + .await?; + assert!(matches!(res, FinalExecutionStatus::SuccessValue(_))); + + // call fails because defi contract is not registered as a wNEAR account + let res = contract + .call(&worker, "ft_transfer_call") + .args_json(( + defi_contract.id(), + parse_near!("1 N"), + Option::::None, + "invest", + ))? + .gas(300_000_000_000_000) + .deposit(ONE_YOCTO) + .transact() + .await?; + assert!(matches!(res.status, FinalExecutionStatus::Failure(_))); + + // balances remain unchanged + let root_balance = contract + .call(&worker, "ft_balance_of") + .args_json((contract.id(),))? + .view() + .await? + .json::()?; + let defi_balance = contract + .call(&worker, "ft_balance_of") + .args_json((defi_contract.id(),))? + .view() + .await? + .json::()?; + assert_eq!(root_balance.0, parse_near!("3 N")); + assert_eq!(defi_balance.0, 0); + + Ok(()) +} + +#[tokio::test] +async fn test_transfer_call_with_promise_and_refund() -> anyhow::Result<()> { + let worker = workspaces::sandbox(); + let contract = init_w_near(&worker).await?; + let defi_contract = init_defi(&worker, &contract).await?; + + register_user(&contract.as_account(), &contract, &worker).await?; + register_user(&defi_contract.as_account(), &contract, &worker).await?; + + let res = wrap_near( + contract.as_account(), + &contract, + &worker, + parse_near!("3 N"), + ) + .await?; + assert!(matches!(res, FinalExecutionStatus::SuccessValue(_))); + + let res = contract + .call(&worker, "ft_transfer_call") + .args_json(( + defi_contract.id(), + U128::from(parse_near!("1 N")), + Option::::None, + U128::from(parse_near!("0.5 N")), + ))? + .gas(300_000_000_000_000) + .deposit(ONE_YOCTO) + .transact() + .await?; + assert!(matches!(res.status, FinalExecutionStatus::SuccessValue(_))); + + let root_balance = contract + .call(&worker, "ft_balance_of") + .args_json((contract.id(),))? + .view() + .await? + .json::()?; + let defi_balance = contract + .call(&worker, "ft_balance_of") + .args_json((defi_contract.id(),))? + .view() + .await? + .json::()?; + assert_eq!(root_balance.0, parse_near!("2.5 N")); + assert_eq!(defi_balance.0, parse_near!("0.5 N")); + + Ok(()) +} + +#[tokio::test] +async fn test_transfer_call_promise_panics_for_a_full_refund() -> anyhow::Result<()> { + let worker = workspaces::sandbox(); + let contract = init_w_near(&worker).await?; + let defi_contract = init_defi(&worker, &contract).await?; + + register_user(&contract.as_account(), &contract, &worker).await?; + register_user(&defi_contract.as_account(), &contract, &worker).await?; + + let res = wrap_near( + contract.as_account(), + &contract, + &worker, + parse_near!("3 N"), + ) + .await?; + assert!(matches!(res, FinalExecutionStatus::SuccessValue(_))); + + let res = contract + .call(&worker, "ft_transfer_call") + .args_json(( + defi_contract.id(), + U128::from(parse_near!("1 N")), + Option::::None, + "invalid integer".to_string(), + ))? + .gas(300_000_000_000_000) + .deposit(ONE_YOCTO) + .transact() + .await?; + assert!(matches!(res.status, FinalExecutionStatus::SuccessValue(_))); + + // balances remain unchanged + let root_balance = contract + .call(&worker, "ft_balance_of") + .args_json((contract.id(),))? + .view() + .await? + .json::()?; + let defi_balance = contract + .call(&worker, "ft_balance_of") + .args_json((defi_contract.id(),))? + .view() + .await? + .json::()?; + assert_eq!(root_balance.0, parse_near!("3 N")); + assert_eq!(defi_balance.0, 0); + + Ok(()) +} diff --git a/w-near/tests/workspaces/test_w_near.rs b/w-near/tests/workspaces/test_w_near.rs new file mode 100644 index 00000000..3c78476b --- /dev/null +++ b/w-near/tests/workspaces/test_w_near.rs @@ -0,0 +1,106 @@ +use crate::utils::{create_user, init_w_near, wrap_near}; +use near_primitives::views::FinalExecutionStatus; +use near_sdk::json_types::U128; +use near_sdk::ONE_YOCTO; +use near_units::parse_near; + +#[tokio::test] +async fn test_total_supply() -> anyhow::Result<()> { + let worker = workspaces::sandbox(); + let contract = init_w_near(&worker).await?; + + let alice = create_user("alice", &contract, &worker).await?; + + let res = wrap_near(&alice, &contract, &worker, parse_near!("1 N")).await?; + assert!(matches!(res, FinalExecutionStatus::SuccessValue(_))); + + let bob = create_user("bob", &contract, &worker).await?; + + let res = wrap_near(&bob, &contract, &worker, parse_near!("2 N")).await?; + assert!(matches!(res, FinalExecutionStatus::SuccessValue(_))); + + let total_supply: U128 = contract + .call(&worker, "ft_total_supply") + .view() + .await? + .json()?; + assert_eq!(total_supply.0, parse_near!("3 N")); + + Ok(()) +} + +#[tokio::test] +async fn test_withdraw_near() -> anyhow::Result<()> { + let worker = workspaces::sandbox(); + let contract = init_w_near(&worker).await?; + + let alice = create_user("alice", &contract, &worker).await?; + + let res = wrap_near(&alice, &contract, &worker, parse_near!("1 N")).await?; + assert!(matches!(res, FinalExecutionStatus::SuccessValue(_))); + + let alice_balance: U128 = contract + .call(&worker, "ft_balance_of") + .args_json((alice.id(),))? + .view() + .await? + .json()?; + assert_eq!(alice_balance.0, parse_near!("1 N")); + + let res = alice + .call(&worker, contract.id().clone(), "near_withdraw") + .args_json((U128::from(parse_near!("0.5 N")),))? + .gas(300_000_000_000_000) + .deposit(ONE_YOCTO) + .transact() + .await?; + assert!(matches!(res.status, FinalExecutionStatus::SuccessValue(_))); + + let alice_balance: U128 = contract + .call(&worker, "ft_balance_of") + .args_json((alice.id(),))? + .view() + .await? + .json()?; + assert_eq!(alice_balance.0, parse_near!("0.5 N")); + + Ok(()) +} + +#[tokio::test] +async fn test_withdraw_too_much_near() -> anyhow::Result<()> { + let worker = workspaces::sandbox(); + let contract = init_w_near(&worker).await?; + + let alice = create_user("alice", &contract, &worker).await?; + + let res = wrap_near(&alice, &contract, &worker, parse_near!("1 N")).await?; + assert!(matches!(res, FinalExecutionStatus::SuccessValue(_))); + + let alice_balance: U128 = contract + .call(&worker, "ft_balance_of") + .args_json((alice.id(),))? + .view() + .await? + .json()?; + assert_eq!(alice_balance.0, parse_near!("1 N")); + + let res = alice + .call(&worker, contract.id().clone(), "near_withdraw") + .args_json((U128::from(parse_near!("1.5 N")),))? + .gas(300_000_000_000_000) + .deposit(ONE_YOCTO) + .transact() + .await?; + assert!(matches!(res.status, FinalExecutionStatus::Failure(_))); + + let alice_balance: U128 = contract + .call(&worker, "ft_balance_of") + .args_json((alice.id(),))? + .view() + .await? + .json()?; + assert_eq!(alice_balance.0, parse_near!("1 N")); + + Ok(()) +} diff --git a/w-near/tests/workspaces/utils.rs b/w-near/tests/workspaces/utils.rs new file mode 100644 index 00000000..67814b1c --- /dev/null +++ b/w-near/tests/workspaces/utils.rs @@ -0,0 +1,141 @@ +use near_primitives::views::FinalExecutionStatus; +use near_sdk::Balance; +use near_units::parse_near; +use workspaces::prelude::DevAccountDeployer; +use workspaces::{Account, Contract, DevNetwork, Worker}; + +pub const LEGACY_BYTE_COST: Balance = 10_000_000_000_000_000_000; + +pub const STORAGE_BALANCE: Balance = 125 * LEGACY_BYTE_COST; + +pub async fn init_legacy(worker: &Worker) -> anyhow::Result { + let contract = worker + .dev_deploy(include_bytes!("../../res/legacy_w_near.wasm").to_vec()) + .await?; + let res = contract + .call(&worker, "new") + .args_json((contract.id(),))? + .gas(300_000_000_000_000) + .transact() + .await?; + assert!(matches!(res.status, FinalExecutionStatus::SuccessValue(_))); + + Ok(contract) +} + +pub async fn init_w_near(worker: &Worker) -> anyhow::Result { + let contract = worker + .dev_deploy(include_bytes!("../../res/w_near.wasm").to_vec()) + .await?; + let res = contract + .call(&worker, "new") + .args_json((contract.id(),))? + .gas(300_000_000_000_000) + .transact() + .await?; + assert!(matches!(res.status, FinalExecutionStatus::SuccessValue(_))); + + Ok(contract) +} + +pub async fn init_defi( + worker: &Worker, + contract: &Contract, +) -> anyhow::Result { + let defi_contract = worker + .dev_deploy(include_bytes!("../../res/w_near_defi.wasm").to_vec()) + .await?; + let res = defi_contract + .call(&worker, "new") + .args_json((contract.id(),))? + .gas(300_000_000_000_000) + .transact() + .await?; + assert!(matches!(res.status, FinalExecutionStatus::SuccessValue(_))); + + Ok(defi_contract) +} + +pub async fn legacy_register_user( + name: &str, + contract: &Contract, + worker: &Worker, +) -> anyhow::Result { + let res = contract + .as_account() + .create_subaccount(&worker, name) + .initial_balance(parse_near!("10 N")) + .transact() + .await?; + assert!(matches!( + res.details.status, + FinalExecutionStatus::SuccessValue(_) + )); + let account = res.result; + + let res = contract + .call(&worker, "storage_deposit") + .args_json((account.id(),))? + .gas(300_000_000_000_000) + .deposit(125 * LEGACY_BYTE_COST) + .transact() + .await?; + assert!(matches!(res.status, FinalExecutionStatus::SuccessValue(_))); + + Ok(account) +} + +pub async fn register_user( + account: &Account, + contract: &Contract, + worker: &Worker, +) -> anyhow::Result<()> { + let res = contract + .call(&worker, "storage_deposit") + .args_json((account.id(), Option::::None))? + .gas(300_000_000_000_000) + .deposit(125 * LEGACY_BYTE_COST) + .transact() + .await?; + assert!(matches!(res.status, FinalExecutionStatus::SuccessValue(_))); + + Ok(()) +} + +pub async fn create_user( + name: &str, + contract: &Contract, + worker: &Worker, +) -> anyhow::Result { + let res = contract + .as_account() + .create_subaccount(&worker, name) + .initial_balance(parse_near!("10 N")) + .transact() + .await?; + assert!(matches!( + res.details.status, + FinalExecutionStatus::SuccessValue(_) + )); + let account = res.result; + + register_user(&account, &contract, &worker).await?; + + Ok(account) +} + +pub async fn wrap_near( + account: &Account, + contract: &Contract, + worker: &Worker, + amount: Balance, +) -> anyhow::Result { + Ok(account + .call(&worker, contract.id().clone(), "near_deposit") + .args_json((account.id(),))? + .gas(300_000_000_000_000) + .deposit(amount) + .transact() + .await? + .status) +} From e0632cfdad64580d180cef12dbd1a89533fbbbef Mon Sep 17 00:00:00 2001 From: Daniyar Itegulov Date: Fri, 4 Feb 2022 13:02:50 +1100 Subject: [PATCH 8/9] add a few more corner-case tests --- w-near/tests/workspaces/test_storage.rs | 29 +++-- w-near/tests/workspaces/test_transfer.rs | 132 +++++++++++++++++++++-- 2 files changed, 145 insertions(+), 16 deletions(-) diff --git a/w-near/tests/workspaces/test_storage.rs b/w-near/tests/workspaces/test_storage.rs index d6ca4978..5958ff01 100644 --- a/w-near/tests/workspaces/test_storage.rs +++ b/w-near/tests/workspaces/test_storage.rs @@ -1,4 +1,5 @@ use crate::utils::{create_user, init_w_near, wrap_near, LEGACY_BYTE_COST, STORAGE_BALANCE}; +use near_contract_standards::storage_management::StorageBalance; use near_primitives::views::FinalExecutionStatus; use near_sdk::json_types::U128; use near_sdk::ONE_YOCTO; @@ -104,14 +105,16 @@ async fn test_disallow_non_zero_storage_withdrawal() -> anyhow::Result<()> { let alice = create_user("alice", &contract, &worker).await?; - let res = alice + let alice_storage_balance = alice .call(&worker, contract.id().clone(), "storage_withdraw") .args_json((U128::from(0),))? .gas(300_000_000_000_000) .deposit(ONE_YOCTO) .transact() - .await?; - assert!(matches!(res.status, FinalExecutionStatus::SuccessValue(_))); + .await? + .json::()?; + assert_eq!(alice_storage_balance.total.0, 125 * LEGACY_BYTE_COST); + assert_eq!(alice_storage_balance.available.0, 0); let res = alice .call(&worker, contract.id().clone(), "storage_withdraw") @@ -162,14 +165,28 @@ async fn test_double_storage_deposit() -> anyhow::Result<()> { let alice = create_user("alice", &contract, &worker).await?; - let res = contract + let alice_storage_balance = contract + .call(&worker, "storage_balance_of") + .args_json((alice.id(),))? + .gas(300_000_000_000_000) + .view() + .await? + .json::>()? + .unwrap(); + assert_eq!(alice_storage_balance.total.0, 125 * LEGACY_BYTE_COST); + assert_eq!(alice_storage_balance.available.0, 0); + + let alice_storage_balance = contract .call(&worker, "storage_deposit") .args_json((alice.id(), Option::::None))? .gas(300_000_000_000_000) .deposit(125 * LEGACY_BYTE_COST) .transact() - .await?; - assert!(matches!(res.status, FinalExecutionStatus::SuccessValue(_))); + .await? + .json::()?; + // Total storage balance remains the same + assert_eq!(alice_storage_balance.total.0, 125 * LEGACY_BYTE_COST); + assert_eq!(alice_storage_balance.available.0, 0); Ok(()) } diff --git a/w-near/tests/workspaces/test_transfer.rs b/w-near/tests/workspaces/test_transfer.rs index 515d2f23..2d5588da 100644 --- a/w-near/tests/workspaces/test_transfer.rs +++ b/w-near/tests/workspaces/test_transfer.rs @@ -10,20 +10,11 @@ async fn test_ft_transfer() -> anyhow::Result<()> { let contract = init_w_near(&worker).await?; let alice = create_user("alice", &contract, &worker).await?; + let bob = create_user("bob", &contract, &worker).await?; let res = wrap_near(&alice, &contract, &worker, parse_near!("1 N")).await?; assert!(matches!(res, FinalExecutionStatus::SuccessValue(_))); - let alice_balance: U128 = contract - .call(&worker, "ft_balance_of") - .args_json((alice.id(),))? - .view() - .await? - .json()?; - assert_eq!(alice_balance.0, parse_near!("1 N")); - - let bob = create_user("bob", &contract, &worker).await?; - let res = alice .call(&worker, contract.id().clone(), "ft_transfer") .args_json(( @@ -37,6 +28,14 @@ async fn test_ft_transfer() -> anyhow::Result<()> { .await?; assert!(matches!(res.status, FinalExecutionStatus::SuccessValue(_))); + let alice_balance: U128 = contract + .call(&worker, "ft_balance_of") + .args_json((alice.id(),))? + .view() + .await? + .json()?; + assert_eq!(alice_balance.0, parse_near!("0.5 N")); + let bob_balance: U128 = contract .call(&worker, "ft_balance_of") .args_json((bob.id(),))? @@ -48,6 +47,58 @@ async fn test_ft_transfer() -> anyhow::Result<()> { Ok(()) } +#[tokio::test] +async fn test_ft_transfer_themselves() -> anyhow::Result<()> { + let worker = workspaces::sandbox(); + let contract = init_w_near(&worker).await?; + + let alice = create_user("alice", &contract, &worker).await?; + + let res = wrap_near(&alice, &contract, &worker, parse_near!("1 N")).await?; + assert!(matches!(res, FinalExecutionStatus::SuccessValue(_))); + + let res = alice + .call(&worker, contract.id().clone(), "ft_transfer") + .args_json(( + alice.id(), + U128::from(parse_near!("0.5 N")), + Option::::None, + ))? + .gas(300_000_000_000_000) + .deposit(ONE_YOCTO) + .transact() + .await?; + assert!(format!("{:?}", res.status.as_failure()) + .contains("Sender and receiver should be different")); + + Ok(()) +} + +#[tokio::test] +async fn test_ft_transfer_zero() -> anyhow::Result<()> { + let worker = workspaces::sandbox(); + let contract = init_w_near(&worker).await?; + + let alice = create_user("alice", &contract, &worker).await?; + let bob = create_user("bob", &contract, &worker).await?; + + let res = wrap_near(&alice, &contract, &worker, parse_near!("1 N")).await?; + assert!(matches!(res, FinalExecutionStatus::SuccessValue(_))); + + let res = alice + .call(&worker, contract.id().clone(), "ft_transfer") + .args_json((bob.id(), U128::from(0), Option::::None))? + .gas(300_000_000_000_000) + .deposit(ONE_YOCTO) + .transact() + .await?; + assert!( + format!("{:?}", res.status.as_failure()).contains("The amount should be a positive number") + ); + + Ok(()) +} + #[tokio::test] async fn test_transfer_call_invest() -> anyhow::Result<()> { let worker = workspaces::sandbox(); @@ -251,3 +302,64 @@ async fn test_transfer_call_promise_panics_for_a_full_refund() -> anyhow::Result Ok(()) } + +#[tokio::test] +async fn test_ft_transfer_call_themselves() -> anyhow::Result<()> { + let worker = workspaces::sandbox(); + let contract = init_w_near(&worker).await?; + + let alice = create_user("alice", &contract, &worker).await?; + + let res = wrap_near(&alice, &contract, &worker, parse_near!("1 N")).await?; + assert!(matches!(res, FinalExecutionStatus::SuccessValue(_))); + + let res = alice + .call(&worker, contract.id().clone(), "ft_transfer_call") + .args_json(( + alice.id(), + U128::from(parse_near!("1 N")), + Option::::None, + "invest", + ))? + .gas(300_000_000_000_000) + .deposit(ONE_YOCTO) + .transact() + .await?; + assert!(format!("{:?}", res.status.as_failure()) + .contains("Sender and receiver should be different")); + + Ok(()) +} + +#[tokio::test] +async fn test_ft_transfer_call_zero() -> anyhow::Result<()> { + let worker = workspaces::sandbox(); + let contract = init_w_near(&worker).await?; + let defi_contract = init_defi(&worker, &contract).await?; + + register_user(&contract.as_account(), &contract, &worker).await?; + register_user(&defi_contract.as_account(), &contract, &worker).await?; + + let alice = create_user("alice", &contract, &worker).await?; + + let res = wrap_near(&alice, &contract, &worker, parse_near!("1 N")).await?; + assert!(matches!(res, FinalExecutionStatus::SuccessValue(_))); + + let res = alice + .call(&worker, contract.id().clone(), "ft_transfer_call") + .args_json(( + defi_contract.id(), + U128::from(0), + Option::::None, + "invest", + ))? + .gas(300_000_000_000_000) + .deposit(ONE_YOCTO) + .transact() + .await?; + assert!( + format!("{:?}", res.status.as_failure()).contains("The amount should be a positive number") + ); + + Ok(()) +} From cde367b8ee4980ec19d17d4122619f685c8bfad8 Mon Sep 17 00:00:00 2001 From: Daniyar Itegulov Date: Mon, 7 Feb 2022 17:12:21 +1100 Subject: [PATCH 9/9] bump near-sdk-rs to pre.7 --- w-near/Cargo.lock | 14 ++++++++------ w-near/Cargo.toml | 4 ++-- w-near/test-w-near-defi/Cargo.toml | 4 ++-- w-near/test-w-near-defi/src/lib.rs | 2 +- 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/w-near/Cargo.lock b/w-near/Cargo.lock index b1fa95b1..36aa01de 100644 --- a/w-near/Cargo.lock +++ b/w-near/Cargo.lock @@ -1244,11 +1244,13 @@ dependencies = [ [[package]] name = "near-contract-standards" -version = "4.0.0-pre.6" +version = "4.0.0-pre.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b291a51228ed563f684ed75d9e61bb3b2881e957c72e9d9868971b453d958c46" +checksum = "52c4f636adbffbd9399610cb6445894c64c6c8fcf9ea4e607021f252a1e0459f" dependencies = [ "near-sdk", + "serde", + "serde_json", ] [[package]] @@ -1540,9 +1542,9 @@ dependencies = [ [[package]] name = "near-sdk" -version = "4.0.0-pre.6" +version = "4.0.0-pre.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cc26331767055239c2ed7ef9e7b415fdc40f7d6c7ea66a39d2079617010ea3e" +checksum = "a4f17c763e91999827a2ad30b909f79e82a56c448bf7170ed72841756397e5a3" dependencies = [ "base64 0.13.0", "borsh", @@ -1558,9 +1560,9 @@ dependencies = [ [[package]] name = "near-sdk-macros" -version = "4.0.0-pre.6" +version = "4.0.0-pre.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f362de96b36911d93dc34c909304c90885d66aaf8c66f89e609144b0c20439df" +checksum = "1d07b8d59302bf900707c41654a7ba178c5a2d8040a8812647f6b7e7e28dc5b1" dependencies = [ "Inflector", "proc-macro2", diff --git a/w-near/Cargo.toml b/w-near/Cargo.toml index 4218fbbc..2b5a8bda 100644 --- a/w-near/Cargo.toml +++ b/w-near/Cargo.toml @@ -8,8 +8,8 @@ edition = "2018" crate-type = ["cdylib"] [dependencies] -near-sdk = "4.0.0-pre.6" -near-contract-standards = "4.0.0-pre.6" +near-sdk = "4.0.0-pre.7" +near-contract-standards = "4.0.0-pre.7" [dev-dependencies] anyhow = "1.0" diff --git a/w-near/test-w-near-defi/Cargo.toml b/w-near/test-w-near-defi/Cargo.toml index caee9367..0f4ddd9b 100644 --- a/w-near/test-w-near-defi/Cargo.toml +++ b/w-near/test-w-near-defi/Cargo.toml @@ -8,5 +8,5 @@ edition = "2018" crate-type = ["cdylib"] [dependencies] -near-sdk = "4.0.0-pre.6" -near-contract-standards = "4.0.0-pre.6" +near-sdk = "4.0.0-pre.7" +near-contract-standards = "4.0.0-pre.7" diff --git a/w-near/test-w-near-defi/src/lib.rs b/w-near/test-w-near-defi/src/lib.rs index 4721c466..b599fada 100644 --- a/w-near/test-w-near-defi/src/lib.rs +++ b/w-near/test-w-near-defi/src/lib.rs @@ -38,7 +38,7 @@ impl DeFi { pub fn new(fungible_token_account_id: AccountId) -> Self { require!(!env::state_exists(), "Already initialized"); Self { - fungible_token_account_id: fungible_token_account_id.into(), + fungible_token_account_id, } } }