From 4f9e2c61448046b781857bbc3570f0bb869f8b85 Mon Sep 17 00:00:00 2001 From: Lord AGNUcius Date: Thu, 13 Jan 2022 15:36:24 -0800 Subject: [PATCH] contract built, deployed and initialized: https://explorer.testnet.near.org/transactions/CwXMsRmvNGo5xhBqbBWWbMmpMevzVmkQugEVW6wbP5Nh --- .cargo/config | 2 + .gitattributes | 1 + .github/workflows/test.yml | 28 + .gitignore | 31 + .gitpod.Dockerfile | 8 + .gitpod.yml | 7 + Cargo.lock | 3464 +++++++++++++++++++++++++++++++++ Cargo.toml | 29 + LICENSE | 25 + LICENSE-APACHE | 176 ++ README-Windows.md | 112 ++ README.md | 155 ++ build.bat | 6 + build.sh | 5 + ft/Cargo.toml | 12 + ft/src/lib.rs | 165 ++ res/defi.wasm | Bin 0 -> 142418 bytes res/fungible_token.wasm | Bin 0 -> 225747 bytes rustfmt.toml | 1 + test-contract-defi/Cargo.toml | 13 + test-contract-defi/src/lib.rs | 88 + tests/sim/main.rs | 3 + tests/sim/no_macros.rs | 62 + tests/sim/utils.rs | 94 + tests/sim/with_macros.rs | 264 +++ 25 files changed, 4751 insertions(+) create mode 100644 .cargo/config create mode 100644 .gitattributes create mode 100644 .github/workflows/test.yml create mode 100644 .gitignore create mode 100644 .gitpod.Dockerfile create mode 100644 .gitpod.yml create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 LICENSE create mode 100644 LICENSE-APACHE create mode 100644 README-Windows.md create mode 100644 build.bat create mode 100755 build.sh create mode 100644 ft/Cargo.toml create mode 100644 ft/src/lib.rs create mode 100755 res/defi.wasm create mode 100755 res/fungible_token.wasm create mode 100644 rustfmt.toml create mode 100644 test-contract-defi/Cargo.toml create mode 100644 test-contract-defi/src/lib.rs create mode 100644 tests/sim/main.rs create mode 100644 tests/sim/no_macros.rs create mode 100644 tests/sim/utils.rs create mode 100644 tests/sim/with_macros.rs diff --git a/.cargo/config b/.cargo/config new file mode 100644 index 0000000..9c624f7 --- /dev/null +++ b/.cargo/config @@ -0,0 +1,2 @@ +[build] +rustflags = ["-C", "link-args=-s"] \ No newline at end of file diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..383338e --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +Cargo.lock -diff diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..27ec60e --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,28 @@ +name: CI +on: push +jobs: + test: + runs-on: ubuntu-latest + env: + RUST_BACKTRACE: 1 + steps: + - name: Checkout Code + uses: actions/checkout@v2 + + - name: Install Rust + uses: actions-rs/toolchain@v1 + with: + toolchain: stable-2020-10-08 + target: wasm32-unknown-unknown + + - name: Add wasm32 target + run: rustup target add wasm32-unknown-unknown + + - name: Check that build works + run: ./build.sh + # TODO: check that files in `res` are unchanged + + - name: Test + uses: actions-rs/cargo@v1 + with: + command: test diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0812698 --- /dev/null +++ b/.gitignore @@ -0,0 +1,31 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. +# Developer note: near.gitignore will be renamed to .gitignore upon project creation +# dependencies +package-lock.json +**/node_modules +/.pnp +.pnp.js +**/out + +#keys +**/neardev + +# testing +/coverage + +# production +/build + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local +.testnet + +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +**/target diff --git a/.gitpod.Dockerfile b/.gitpod.Dockerfile new file mode 100644 index 0000000..bc2641a --- /dev/null +++ b/.gitpod.Dockerfile @@ -0,0 +1,8 @@ +FROM gitpod/workspace-full + +ENV CARGO_HOME=/home/gitpod/.cargo + +RUN bash -cl "rustup toolchain install stable && rustup target add wasm32-unknown-unknown" + +RUN bash -c ". .nvm/nvm.sh \ + && nvm install v12 && nvm alias default v12" \ No newline at end of file diff --git a/.gitpod.yml b/.gitpod.yml new file mode 100644 index 0000000..4d043d4 --- /dev/null +++ b/.gitpod.yml @@ -0,0 +1,7 @@ +image: + file: .gitpod.Dockerfile +# List the start up tasks. You can start them in parallel in multiple terminals. See https://www.gitpod.io/docs/config-start-tasks/ +tasks: + - before: echo "nvm use default" >> ~/.bashrc && npm install -g near-cli --no-optional && nvm use default + init: yarn + command: clear && echo Hey! Check out examples of how to build a NEP-21 Fungible Token in Rust. diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..55c14e0 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,3464 @@ +# 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 = "addr2line" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a55f82cfe485775d02112886f4169bde0c5894d75e79ead7eafe7e40a25e45f7" +dependencies = [ + "gimli 0.23.0", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "ahash" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "739f4a8db6605981345c5654f3a85b056ce52f37a39d34da03f25bf2151ea16e" + +[[package]] +name = "aho-corasick" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7404febffaa47dac81aa44dba71523c9d069b1bdc50a77db41195149e17f68e5" +dependencies = [ + "memchr", +] + +[[package]] +name = "ansi_term" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" +dependencies = [ + "winapi", +] + +[[package]] +name = "anyhow" +version = "1.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afddf7f520a80dbf76e6f50a35bca42a2331ef227a28b3b6dc5c2e2338d114b1" + +[[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 = "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d3a45e77e34375a7923b1e8febb049bb011f064714a8e17a1a616fef01da13d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi", + "libc", + "winapi", +] + +[[package]] +name = "autocfg" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" + +[[package]] +name = "backtrace" +version = "0.3.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d117600f438b1707d4e4ae15d3595657288f8235a0eb593e80ecc98ab34e1bc" +dependencies = [ + "addr2line", + "cfg-if 1.0.0", + "libc", + "miniz_oxide", + "object 0.23.0", + "rustc-demangle", +] + +[[package]] +name = "base64" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" + +[[package]] +name = "bincode" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d175dfa69e619905c4c3cdb7c3c203fa3bdd5d51184e3afdb2742c0280493772" +dependencies = [ + "byteorder", + "serde", +] + +[[package]] +name = "bindgen" +version = "0.54.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66c0bb6167449588ff70803f4127f0684f9063097eca5016f37eb52b92c2cf36" +dependencies = [ + "bitflags", + "cexpr", + "cfg-if 0.1.10", + "clang-sys", + "clap", + "env_logger", + "lazy_static", + "lazycell", + "log", + "peeking_take_while", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", + "which 3.1.1", +] + +[[package]] +name = "bitflags" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" + +[[package]] +name = "bitvec" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5011ffc90248764d7005b0e10c7294f5aa1bd87d9dd7248f4ad475b347c294d" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "blake2" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10a5720225ef5daecf08657f23791354e1685a8c91a4c60c7f3d3b2892f978f4" +dependencies = [ + "crypto-mac", + "digest 0.9.0", + "opaque-debug", +] + +[[package]] +name = "blake3" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9ff35b701f3914bdb8fad3368d822c766ef2858b2583198e41639b936f09d3f" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if 0.1.10", + "constant_time_eq", + "crypto-mac", + "digest 0.9.0", +] + +[[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 0.14.4", +] + +[[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.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5a26c53ddf60281f18e7a29b20db7ba3db82a9d81b9650bfaa02d646f50d364" +dependencies = [ + "borsh-derive", + "hashbrown", +] + +[[package]] +name = "borsh-derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b637a47728b78a78cd7f4b85bf06d71ef4221840e059a38f048be2422bf673b2" +dependencies = [ + "borsh-derive-internal", + "borsh-schema-derive-internal", + "proc-macro-crate", + "proc-macro2", + "syn", +] + +[[package]] +name = "borsh-derive-internal" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d813fa25eb0bed78c36492cff4415f38c760d6de833d255ba9095bd8ebb7d725" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "borsh-schema-derive-internal" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf78ee4a98c8cb9eba1bac3d3e2a1ea3d7673c719ce691e67b5cbafc472d3b7" +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.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65c1bf4a04a88c54f589125563643d773f3254b5c38571395e2b591c693bbc81" + +[[package]] +name = "byteorder" +version = "1.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de" + +[[package]] +name = "bytes" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b700ce4376041dcd0a327fd0097c41095743c4c8af8887265942faf1100bd040" + +[[package]] +name = "c2-chacha" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb6b83fa00a7c53f420893670940c8fdfaa89f9dd9adb52062cca39482a31ab6" +dependencies = [ + "cipher", + "ppv-lite86", +] + +[[package]] +name = "cached" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e2afe73808fbaac302e39c9754bfc3c4b4d0f99c9c240b9f4e4efc841ad1b74" +dependencies = [ + "async-mutex", + "async-trait", + "cached_proc_macro", + "cached_proc_macro_types", + "futures", + "hashbrown", + "once_cell", +] + +[[package]] +name = "cached_proc_macro" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf857ae42d910aede5c5186e62684b0d7a597ce2fe3bd14448ab8f7ef439848c" +dependencies = [ + "async-mutex", + "cached_proc_macro_types", + "darling 0.10.2", + "quote", + "syn", +] + +[[package]] +name = "cached_proc_macro_types" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a4f925191b4367301851c6d99b09890311d74b0d43f274c0b34c86d308a3663" + +[[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" +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 0.14.4", +] + +[[package]] +name = "clang-sys" +version = "0.29.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe6837df1d5cba2397b835c8530f51723267e16abbf83892e9e5af4f0e5dd10a" +dependencies = [ + "glob", + "libc", + "libloading 0.5.2", +] + +[[package]] +name = "clap" +version = "2.33.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37e58ac78573c40708d45522f0d80fa2f01cc4f9b4e2bf749807255454312002" +dependencies = [ + "ansi_term", + "atty", + "bitflags", + "strsim 0.8.0", + "textwrap", + "unicode-width", + "vec_map", +] + +[[package]] +name = "cloudabi" +version = "0.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" +dependencies = [ + "bitflags", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" + +[[package]] +name = "cpuid-bool" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8aebca1129a03dc6dc2b127edd729435bbc4a37e1d5f4d7513165089ceb02634" + +[[package]] +name = "cranelift-bforest" +version = "0.67.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f065f6889758f817f61a230220d1811ba99a9762af2fb69ae23048314f75ff2" +dependencies = [ + "cranelift-entity 0.67.0", +] + +[[package]] +name = "cranelift-bforest" +version = "0.68.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9221545c0507dc08a62b2d8b5ffe8e17ac580b0a74d1813b496b8d70b070fbd0" +dependencies = [ + "cranelift-entity 0.68.0", +] + +[[package]] +name = "cranelift-codegen" +version = "0.67.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "510aa2ab4307644100682b94e449940a0ea15c5887f1d4b9678b8dd5ef31e736" +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", +] + +[[package]] +name = "cranelift-codegen" +version = "0.68.0" +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", +] + +[[package]] +name = "cranelift-codegen-meta" +version = "0.67.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4cb0c7e87c60d63b35f9670c15479ee4a5e557dd127efab88b2f9b2ca83c9a0" +dependencies = [ + "cranelift-codegen-shared 0.67.0", + "cranelift-entity 0.67.0", +] + +[[package]] +name = "cranelift-codegen-meta" +version = "0.68.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ef2b2768568306540f4c8db3acce9105534d34c4a1e440529c1e702d7f8c8d7" +dependencies = [ + "cranelift-codegen-shared 0.68.0", + "cranelift-entity 0.68.0", +] + +[[package]] +name = "cranelift-codegen-shared" +version = "0.67.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60636227098693e06de8d6d88beea2a7d32ecf8a8030dacdb57c68e06f381826" + +[[package]] +name = "cranelift-codegen-shared" +version = "0.68.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6759012d6d19c4caec95793f052613e9d4113e925e7f14154defbac0f1d4c938" + +[[package]] +name = "cranelift-entity" +version = "0.67.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6156db73e0c9f65f80c512988d63ec736be0dee3dd66bf951e3e28aed9dc02d3" +dependencies = [ + "serde", +] + +[[package]] +name = "cranelift-entity" +version = "0.68.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86badbce14e15f52a45b666b38abe47b204969dd7f8fb7488cb55dd46b361fa6" +dependencies = [ + "serde", +] + +[[package]] +name = "cranelift-frontend" +version = "0.67.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e09cd158c9a820a4cc14a34076811da225cce1d31dc6d03c5ef85b91aef560b9" +dependencies = [ + "cranelift-codegen 0.67.0", + "log", + "smallvec", + "target-lexicon 0.11.2", +] + +[[package]] +name = "cranelift-frontend" +version = "0.68.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b608bb7656c554d0a4cf8f50c7a10b857e80306f6ff829ad6d468a7e2323c8d8" +dependencies = [ + "cranelift-codegen 0.68.0", + "log", + "smallvec", + "target-lexicon 0.11.2", +] + +[[package]] +name = "cranelift-native" +version = "0.67.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7054533ae1fc2048c1a6110bdf8f4314b77c60329ec6a7df79d2cfb84e3dcc1c" +dependencies = [ + "cranelift-codegen 0.67.0", + "raw-cpuid", + "target-lexicon 0.11.2", +] + +[[package]] +name = "cranelift-wasm" +version = "0.67.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aee0e0b68eba99f99a4923212d97aca9e44655ca8246f07fffe11236109b0d0" +dependencies = [ + "cranelift-codegen 0.67.0", + "cranelift-entity 0.67.0", + "cranelift-frontend 0.67.0", + "log", + "serde", + "thiserror", + "wasmparser 0.59.0", +] + +[[package]] +name = "crc32fast" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" +dependencies = [ + "cfg-if 1.0.0", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dca26ee1f8d361640700bde38b2c37d8c22b3ce2d360e1fc1c74ea4b0aa7d775" +dependencies = [ + "cfg-if 1.0.0", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94af6efb46fef72616855b036a624cf27ba656ffc9be1b9a3c931cfc7749a9a9" +dependencies = [ + "cfg-if 1.0.0", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2584f639eb95fea8c798496315b297cf81b9b58b6d30ab066a75455333cf4b12" +dependencies = [ + "cfg-if 1.0.0", + "crossbeam-utils", + "lazy_static", + "memoffset 0.6.1", + "scopeguard", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7e9d99fa91428effe99c5c6d4634cdeba32b8cf784fc428a2a687f61a952c49" +dependencies = [ + "autocfg", + "cfg-if 1.0.0", + "lazy_static", +] + +[[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 0.14.4", + "subtle", +] + +[[package]] +name = "curve25519-dalek" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f627126b946c25a4638eec0ea634fc52506dea98db118aae985118ce7c3d723f" +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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06d4a9551359071d1890820e3571252b91229e0712e7c36b08940e603c5a8fc" +dependencies = [ + "darling_core 0.12.2", + "darling_macro 0.12.2", +] + +[[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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b443e5fb0ddd56e0c9bfa47dc060c5306ee500cb731f2b91432dd65589a77684" +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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0220073ce504f12a70efc4e7cdaea9e9b1b324872e7ad96a208056d7a638b81" +dependencies = [ + "darling_core 0.12.2", + "quote", + "syn", +] + +[[package]] +name = "defi" +version = "0.0.1" +dependencies = [ + "near-contract-standards", + "near-sdk", +] + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80581ee1c96b68c603eee514af47f075b39829304bde1a04381c826f3e06a9b4" +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.2", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "env_logger" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" +dependencies = [ + "atty", + "humantime", + "log", + "regex", + "termcolor", +] + +[[package]] +name = "errno" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa68f2fb9cae9d37c9b2b3584aba698a2e97f72d7aef7b9f7aa71d8b54ce46fe" +dependencies = [ + "errno-dragonfly", + "libc", + "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "779864b9c7f7ead1f092972c3257496c6a84b46dba2ce131dd8a282cb2cc5972" +dependencies = [ + "crunchy", + "fixed-hash", + "impl-rlp", + "impl-serde", + "tiny-keccak", +] + +[[package]] +name = "ethereum-types" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f64b5df66a228d85e4b17e5d6c6aa43b0310898ffe8a85988c4c032357aaabfd" +dependencies = [ + "ethbloom", + "fixed-hash", + "impl-rlp", + "impl-serde", + "primitive-types", + "uint", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" + +[[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.3", + "rustc-hex", + "static_assertions", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[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 = "fs_extra" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2022715d62ab30faffd124d40b76f4134a550a87792276512b18d63272333394" + +[[package]] +name = "fungible-token" +version = "1.0.0" +dependencies = [ + "near-contract-standards", + "near-sdk", +] + +[[package]] +name = "fungible-token-wrapper" +version = "0.0.1" +dependencies = [ + "defi", + "fungible-token", + "near-sdk", + "near-sdk-sim", +] + +[[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.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f55667319111d593ba876406af7c409c0ebb44dc4be6132a783ccf163ea14c1" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c2dd2df839b57db9ab69c2c9d8f3e8c81984781937fe2807dc6dcf3b2ad2939" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15496a72fabf0e62bdc3df11a59a3787429221dd0710ba8ef163d6f7a9112c94" + +[[package]] +name = "futures-executor" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891a4b7b96d84d5940084b2a37632dd65deeae662c114ceaa2c879629c9c0ad1" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71c2c65c57704c32f5241c1223167c2c3294fd34ac020c807ddbe6db287ba59" + +[[package]] +name = "futures-macro" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea405816a5139fb39af82c2beb921d52143f556038378d6db21183a5c37fbfb7" +dependencies = [ + "proc-macro-hack", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85754d98985841b7d4f5e8e6fbfa4a4ac847916893ec511a2917ccd8525b8bb3" + +[[package]] +name = "futures-task" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa189ef211c15ee602667a6fcfe1c1fd9e07d42250d2156382820fba33c9df80" + +[[package]] +name = "futures-util" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1812c7ab8aedf8d6f2701a43e1243acdbcc2b36ab26e2ad421eb99ac963d96d1" +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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c68f0274ae0e023facc3c97b2e00f076be70e254bc851d972503b328db79b2ec" +dependencies = [ + "typenum", +] + +[[package]] +name = "generic-array" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817" +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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "wasi 0.10.2+wasi-snapshot-preview1", +] + +[[package]] +name = "gimli" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcc8e0c9bce37868955864dbecd2b1ab2bdf967e6f28066d65aaac620444b65c" +dependencies = [ + "fallible-iterator", + "indexmap", + "stable_deref_trait", +] + +[[package]] +name = "gimli" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aaf91faf136cb47367fa430cd46e37a788775e7fa104f8b4bcb3861dc389b724" +dependencies = [ + "fallible-iterator", + "indexmap", + "stable_deref_trait", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1679e6ea370dee694f91f1dc469bf94cf8f52051d147aec3e1f9497c6fc22461" +dependencies = [ + "winapi", +] + +[[package]] +name = "heck" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cbf45460356b7deeb5e3415b5563308c0a9b057c85e12b06ad551f98d0a6ac" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "hermit-abi" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "322f4de77956e22ed0e5032c359a0f1273f1f7f0d79bfa3b8ffbc730d7fbcc5c" +dependencies = [ + "libc", +] + +[[package]] +name = "hex" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "644f9158b2f133fd50f5fb3242878846d9eb792e445c893805ff0e3824006e35" + +[[package]] +name = "humantime" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" +dependencies = [ + "quick-error", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89829a5d69c23d348314a7ac337fe39173b61149a9864deabd260983aed48c21" +dependencies = [ + "matches", + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "impl-codec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df170efa359aebdd5cb7fe78edcc67107748e4737bdca8a8fb40d15ea7a877ed" +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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b47ca4d2b6931707a55fce5cf66aff80e2178c8b63bbb4ecb5695cbc870ddf6f" +dependencies = [ + "serde", +] + +[[package]] +name = "indexmap" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb1fa934250de4de8aef298d81c729a7d33d8c239daa3a7575e6b92bfc7313b" +dependencies = [ + "autocfg", + "hashbrown", + "serde", +] + +[[package]] +name = "instant" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61124eeebbd69b8190558df225adf7e4caafce0d743919e5d6b19652314ec5ec" +dependencies = [ + "cfg-if 1.0.0", +] + +[[package]] +name = "itoa" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" + +[[package]] +name = "jemalloc-sys" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d3b9f3f5c9b31aa0f5ed3260385ac205db665baa41d49bb8338008ae94ede45" +dependencies = [ + "cc", + "fs_extra", + "libc", +] + +[[package]] +name = "jemallocator" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43ae63fcfc45e99ab3d1b29a46782ad679e98436c3169d15a167a1108a724b69" +dependencies = [ + "jemalloc-sys", + "libc", +] + +[[package]] +name = "jobserver" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c71313ebb9439f74b00d9d2dcec36440beaf57a6aa0623068441dd7cd81a7f2" +dependencies = [ + "libc", +] + +[[package]] +name = "keccak" +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.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7282d924be3275cec7f6756ff4121987bc6481325397dde6ba3e7802b1a8b1c" + +[[package]] +name = "libloading" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2b111a074963af1d37a139918ac6d49ad1d0d5e47f72fd55388619691a7d753" +dependencies = [ + "cc", + "winapi", +] + +[[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 = "librocksdb-sys" +version = "6.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb5b56f651c204634b936be2f92dbb42c36867e00ff7fe2405591f3b9fa66f09" +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", +] + +[[package]] +name = "lock_api" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd96ffd135b2fd7b973ac026d28085defbe8983df057ced3eb4f2130b0831312" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" +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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" + +[[package]] +name = "memchr" +version = "2.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525" + +[[package]] +name = "memmap" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "memmap2" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04e3e85b970d650e2ae6d70592474087051c11c54da7f7b4949725c5735fbcc6" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "043175f069eda7b85febe4a74abbaeff828d9f8b448515d3151a14a3542811aa" +dependencies = [ + "autocfg", +] + +[[package]] +name = "memoffset" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "157b4208e3059a8f9e78d559edc658e13df41410cb3ae03979c83130067fdd87" +dependencies = [ + "autocfg", +] + +[[package]] +name = "memory_units" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8452105ba047068f40ff7093dd1d9da90898e63dd61736462e9cdda6a90ad3c3" + +[[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 = "more-asserts" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0debeb9fcf88823ea64d64e4a815ab1643f33127d995978e099942ce38f25238" + +[[package]] +name = "near-contract-standards" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7421d0a5c7aeb57b37a0cf3a71a7aefbbdc7727f9811d9dd86fa55e4f0de4d3" +dependencies = [ + "near-sdk", +] + +[[package]] +name = "near-crypto" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb14bec070cfd808438712cda5d54703001b9cf1196c8afaeadc9514e06d00a3" +dependencies = [ + "arrayref", + "blake2", + "borsh", + "bs58", + "c2-chacha", + "curve25519-dalek", + "derive_more", + "ed25519-dalek", + "lazy_static", + "libc", + "parity-secp256k1", + "rand 0.7.3", + "rand_core 0.5.1", + "serde", + "serde_json", + "subtle", + "thiserror", +] + +[[package]] +name = "near-metrics" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7b9dcbc960db15fcec85bcb29a78b57e4005b7b1a0afc70a26a97453862528e" +dependencies = [ + "lazy_static", + "log", + "prometheus", +] + +[[package]] +name = "near-pool" +version = "0.1.0-pre.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bde79472f7cfc0675733b65f79f9e50c20bfbb9806298ab2872916869a45dccd" +dependencies = [ + "borsh", + "near-crypto", + "near-primitives", + "rand 0.7.3", +] + +[[package]] +name = "near-primitives" +version = "0.1.0-pre.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75ed2263518ca67a3c158c144813832fd96f48ab239494bb9d7793d315f31417" +dependencies = [ + "base64", + "borsh", + "bs58", + "byteorder", + "chrono", + "derive_more", + "easy-ext", + "hex", + "jemallocator", + "lazy_static", + "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.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2b3fb5acf3a494aed4e848446ef2d6ebb47dbe91c681105d4d1786c2ee63e52" +dependencies = [ + "base64", + "borsh", + "bs58", + "derive_more", + "hex", + "lazy_static", + "num-rational", + "serde", + "serde_json", + "sha2", +] + +[[package]] +name = "near-rpc-error-core" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffa8dbf8437a28ac40fcb85859ab0d0b8385013935b000c7a51ae79631dd74d9" +dependencies = [ + "proc-macro2", + "quote", + "serde", + "serde_json", + "syn", +] + +[[package]] +name = "near-rpc-error-macro" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c6111d713e90c7c551dee937f4a06cb9ea2672243455a4454cc7566387ba2d9" +dependencies = [ + "near-rpc-error-core", + "proc-macro2", + "quote", + "serde", + "serde_json", + "syn", +] + +[[package]] +name = "near-runtime" +version = "4.0.0-pre.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e4c0a4cd2ee5ccbc1fd5d492180ebf33ac1159d721b2e0c58c11953131fb449" +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", + "serde", + "serde_json", +] + +[[package]] +name = "near-runtime-utils" +version = "4.0.0-pre.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a48d80c4ca1d4cf99bc16490e1e3d49826c150dfc4410ac498918e45c7d98e07" +dependencies = [ + "lazy_static", + "regex", +] + +[[package]] +name = "near-sdk" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7383e242d3e07bf0951e8589d6eebd7f18bb1c1fc5fbec3fad796041a6aebd1" +dependencies = [ + "base64", + "borsh", + "bs58", + "near-primitives-core", + "near-sdk-macros", + "near-vm-logic", + "serde", + "serde_json", + "wee_alloc", +] + +[[package]] +name = "near-sdk-core" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "284a78d9eb8eda58330462fa0023a6d7014c941df1f0387095e7dfd1dc0f2bce" +dependencies = [ + "Inflector", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "near-sdk-macros" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2037337438f97d1ce5f7c896cf229dc56dacd5c01142d1ef95a7d778cde6ce7d" +dependencies = [ + "near-sdk-core", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "near-sdk-sim" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f9be539455733f5cff63febaee07dcdc48c0a9940856257a1989e84a5552d7a" +dependencies = [ + "funty", + "lazy-static-include", + "near-crypto", + "near-pool", + "near-primitives", + "near-runtime", + "near-sdk", + "near-store", + "near-vm-logic", +] + +[[package]] +name = "near-store" +version = "0.1.0-pre.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e880d1d9a4ca5a1ca1ea0366fd80e295465f90cd0c1209f45d6d0b7a443ed4" +dependencies = [ + "borsh", + "byteorder", + "cached", + "derive_more", + "elastic-array", + "lazy_static", + "near-crypto", + "near-primitives", + "num_cpus", + "rand 0.7.3", + "rocksdb", + "serde", + "serde_json", + "strum", +] + +[[package]] +name = "near-vm-errors" +version = "4.0.0-pre.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e281d8730ed8cb0e3e69fb689acee6b93cdb43824cd69a8ffd7e1bfcbd1177d7" +dependencies = [ + "borsh", + "hex", + "near-rpc-error-macro", + "serde", +] + +[[package]] +name = "near-vm-logic" +version = "4.0.0-pre.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e11cb28a2d07f37680efdaf860f4c9802828c44fc50c08009e7884de75d982c5" +dependencies = [ + "base64", + "borsh", + "bs58", + "byteorder", + "near-primitives-core", + "near-runtime-utils", + "near-vm-errors", + "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b2e0b4f3320ed72aaedb9a5ac838690a8047c7b275da22711fddff4f8a14229" +dependencies = [ + "bitflags", + "cc", + "cfg-if 0.1.10", + "libc", + "void", +] + +[[package]] +name = "nom" +version = "5.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffb4262d26ed83a1c0a33a38fe2bb15797329c85770da05e6b828ddb782627af" +dependencies = [ + "memchr", + "version_check", +] + +[[package]] +name = "num-bigint" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e9a41747ae4633fce5adffb4d2e81ffc5e89593cb19917f8fb2cc5ff76507bf" +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 = "num_cpus" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" +dependencies = [ + "hermit-abi", + "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9a7ab5d64814df0fe4a4b5ead45ed6c5f181ee3ff04ba344313a6c80446c5d4" + +[[package]] +name = "once_cell" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10acf907b94fc1b1a152d08ef97e7759650268cf986bf127f387e602b02c7e5a" + +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + +[[package]] +name = "page_size" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eebde548fbbf1ea81a99b128872779c437752fb99f217c45245e1a61dcd9edcd" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "parity-scale-codec" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cd3dab59b5cf4bc81069ade0fc470341a1ef3ad5fa73e5a8943bed2ec12b2e8" +dependencies = [ + "arrayvec", + "bitvec", + "byte-slice-cast", + "serde", +] + +[[package]] +name = "parity-secp256k1" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fca4f82fccae37e8bbdaeb949a4a218a1bbc485d11598f193d2a908042e5fc1" +dependencies = [ + "arrayvec", + "cc", + "cfg-if 0.1.10", + "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d7744ac029df22dca6284efe4e898991d28e3085c706c972bcd7da4a27a15eb" +dependencies = [ + "instant", + "lock_api 0.4.2", + "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", +] + +[[package]] +name = "parking_lot_core" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7a782938e745763fe6907fc6ba86946d72f49fe7e21de074e08128a99fb018" +dependencies = [ + "cfg-if 1.0.0", + "instant", + "libc", + "redox_syscall 0.2.5", + "smallvec", + "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-lite" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439697af366c49a6d0a010c56a0d97685bc140ce0d377b13a2ea2aa42d64a827" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "ppv-lite86" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" + +[[package]] +name = "primitive-types" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2415937401cb030a2a0a4d922483f945fa068f52a7dbb22ce0fe5f2b6f6adace" +dependencies = [ + "fixed-hash", + "impl-codec", + "impl-rlp", + "impl-serde", + "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-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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "prometheus" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8425533e7122f0c3cc7a37e6244b16ad3a2cc32ae7ac6276e2a75da0d9c200d" +dependencies = [ + "cfg-if 1.0.0", + "fnv", + "lazy_static", + "parking_lot 0.11.1", + "protobuf", + "regex", + "thiserror", +] + +[[package]] +name = "protobuf" +version = "2.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f72884896d22e0da0e5b266cb9a780b791f6c3b2f5beab6368d6cd4f0dbb86" + +[[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 = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[package]] +name = "quote" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" +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 0.2.0", +] + +[[package]] +name = "rand" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" +dependencies = [ + "libc", + "rand_chacha 0.3.0", + "rand_core 0.6.2", + "rand_hc 0.3.0", +] + +[[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.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.2", +] + +[[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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7" +dependencies = [ + "getrandom 0.2.2", +] + +[[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 = "rand_hc" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73" +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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" + +[[package]] +name = "redox_syscall" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94341e4e44e24f6b591b59e47a8a027df12e008d73fd5672dbea9cc22f4507d9" +dependencies = [ + "bitflags", +] + +[[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 = "regalloc" +version = "0.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2041c2d34f6ff346d6f428974f03d8bf12679b0c816bb640dc5eb1d48848d8d1" +dependencies = [ + "log", + "rustc-hash", + "smallvec", +] + +[[package]] +name = "regalloc" +version = "0.0.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "571f7f397d61c4755285cd37853fe8e03271c243424a907415909379659381c5" +dependencies = [ + "log", + "rustc-hash", + "smallvec", +] + +[[package]] +name = "regex" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9251239e129e16308e70d853559389de218ac275b515068abc96829d05b948a" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", + "thread_local", +] + +[[package]] +name = "regex-syntax" +version = "0.6.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5eb417147ba9860a96cfe72a0b93bf88fee1744b5636ec99ab20c1aa9376581" + +[[package]] +name = "region" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877e54ea2adcd70d80e9179344c97f93ef0dffd6b03e1f4529e6e83ab2fa9ae0" +dependencies = [ + "bitflags", + "libc", + "mach", + "winapi", +] + +[[package]] +name = "remove_dir_all" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" +dependencies = [ + "winapi", +] + +[[package]] +name = "rlp" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e54369147e3e7796c9b885c7304db87ca3d09a0a98f72843d532868675bbfba8" +dependencies = [ + "bytes", + "rustc-hex", +] + +[[package]] +name = "rocksdb" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23d83c02c429044d58474eaf5ae31e062d0de894e21125b47437ec0edc1397e6" +dependencies = [ + "libc", + "librocksdb-sys", +] + +[[package]] +name = "rustc-demangle" +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" +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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver-parser" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" + +[[package]] +name = "serde" +version = "1.0.118" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06c64263859d87aa2eb554587e2d23183398d617427327cf2b3d0ed8c69e4800" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-bench" +version = "0.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d733da87e79faaac25616e33d26299a41143fd4cd42746cbb0e91d8feea243fd" +dependencies = [ + "byteorder", + "serde", +] + +[[package]] +name = "serde_bytes" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16ae07dd2f88a366f15bd0632ba725227018c69a1c8550a927324f8eb8368bb9" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_derive" +version = "1.0.118" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c84d3526699cd55261af4b941e4e725444df67aa4f9e6a3564f18030d12672df" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799e97dc9fdae36a5c8b8f2cae9ce2ee9fdce2058c57a93e6099d919fd982f79" +dependencies = [ + "indexmap", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha2" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa827a14b29ab7f44778d14a88d3cb76e949c45083f7dbfa507d0cb699dc12de" +dependencies = [ + "block-buffer", + "cfg-if 1.0.0", + "cpuid-bool", + "digest 0.9.0", + "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 0.9.0", + "keccak", + "opaque-debug", +] + +[[package]] +name = "shlex" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2" + +[[package]] +name = "signature" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f0242b8e50dd9accdd56170e94ca1ebd223b098eb9c83539a6e367d0f36ae68" + +[[package]] +name = "slab" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" + +[[package]] +name = "slash-formatter" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55a065b7c425d213cbefcaaa4b62dd936183fa41c806a74767c72dd659ff4ad0" +dependencies = [ + "concat-with", +] + +[[package]] +name = "smallvec" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" + +[[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 = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strsim" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7318c509b5ba57f18533982607f24070a55d353e90d4cae30c467cdb2ad5ac5c" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee8bc6b87a5112aeeab1f4a9f7ab634fe6cbefc4850006df31267f4cfb9e3149" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "subtle" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e81da0851ada1f3e9d4312c704aa4f8806f0f9d69faaf8df2f3464b4a9437c2" + +[[package]] +name = "syn" +version = "1.0.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4211ce9909eb971f111059df92c45640aad50a619cf55cd76476be803c4c68e6" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "synstructure" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b834f2d66f734cb897113e34aaff2f1ab4719ca946f9a7358dba8f8064148701" +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 = "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "422045212ea98508ae3d28025bc5aaa2bd4a9cdaecd442a08da2ee620ee9ea95" + +[[package]] +name = "tempfile" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "rand 0.8.3", + "redox_syscall 0.2.5", + "remove_dir_all", + "winapi", +] + +[[package]] +name = "termcolor" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dfed899f0eb03f32ee8c6a0aabdb8a7949659e3466561fc0adf54e26d88c5f4" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "textwrap" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +dependencies = [ + "unicode-width", +] + +[[package]] +name = "thiserror" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0f4a65597094d4483ddaed134f409b2cb7c1beccf25201a9f73c719254fa98e" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7765189610d8241a44529806d6fd1f2e0a08734313a35d5b3a556f92b381f3c0" +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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" +dependencies = [ + "libc", + "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.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "317cca572a0e89c3ce0ca1f1bdc9369547fe318a683418e42ac8f59d14701023" +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 = "tracing" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01ebdc2bb4498ab1ab5f5b73c5803825e60199229ccba0698170e3be0e7f959f" +dependencies = [ + "cfg-if 1.0.0", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c42e6fa53307c8a17e4ccd4dc81cf5ec38db9209f59b222210375b54ee40d1e2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[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.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" +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-width" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3" + +[[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 = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a70cfae554988d904d64ca17ab0e7cd652ee5c8a0807094819c1ea93eb9d6866" +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", +] + +[[package]] +name = "wasmer-compiler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b7732a9cab472bd921d5a0c422f45b3d03f62fa2c40a89e0770cef6d47e383e" +dependencies = [ + "enumset", + "serde", + "serde_bytes", + "smallvec", + "target-lexicon 0.11.2", + "thiserror", + "wasmer-types", + "wasmer-vm", + "wasmparser 0.65.0", +] + +[[package]] +name = "wasmer-compiler-cranelift" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48cb9395f094e1d81534f4c5e330ed4cdb424e8df870d29ad585620284f5fddb" +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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "426ae6ef0f606ca815510f3e2ef6f520e217514bfb7a664defe180b9a9e75d07" +dependencies = [ + "byteorder", + "dynasm", + "dynasmrt", + "lazy_static", + "more-asserts", + "rayon", + "serde", + "smallvec", + "wasmer-compiler", + "wasmer-types", + "wasmer-vm", +] + +[[package]] +name = "wasmer-derive" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b86dcd2c3efdb8390728a2b56f762db07789aaa5aa872a9dc776ba3a7912ed" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "wasmer-engine" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efe4667d6bd888f26ae8062a63a9379fa697415b4b4e380f33832e8418fd71b5" +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" +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", +] + +[[package]] +name = "wasmer-engine-native" +version = "1.0.2" +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 4.0.2", +] + +[[package]] +name = "wasmer-object" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abf8e0c12b82ff81ebecd30d7e118be5fec871d6de885a90eeb105df0a769a7b" +dependencies = [ + "object 0.22.0", + "thiserror", + "wasmer-compiler", + "wasmer-types", +] + +[[package]] +name = "wasmer-runtime-core-near" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2390b0b8cf58615c2f8b454d9535e1aed1d14c510cc1ce1af806a1992ad53300" +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", +] + +[[package]] +name = "wasmer-runtime-near" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6660e86bc7697fa29bab902214d5b33d394a990826c401b10816bcd285f938f" +dependencies = [ + "lazy_static", + "memmap", + "serde", + "serde_derive", + "wasmer-runtime-core-near", + "wasmer-singlepass-backend-near", +] + +[[package]] +name = "wasmer-singlepass-backend-near" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3f23543ef8f59667be4945c22eb4b1a50a79ff340555f6f23354223d2695541" +dependencies = [ + "bincode", + "byteorder", + "dynasm", + "dynasmrt", + "lazy_static", + "libc", + "nix", + "serde", + "serde_derive", + "smallvec", + "wasmer-runtime-core-near", +] + +[[package]] +name = "wasmer-types" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7f4ac28c2951cd792c18332f03da523ed06b170f5cf6bb5b1bdd7e36c2a8218" +dependencies = [ + "cranelift-entity 0.68.0", + "serde", + "thiserror", +] + +[[package]] +name = "wasmer-vm" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7635ba0b6d2fd325f588d69a950ad9fa04dddbf6ad08b6b2a183146319bf6ae" +dependencies = [ + "backtrace", + "cc", + "cfg-if 0.1.10", + "indexmap", + "libc", + "memoffset 0.6.1", + "more-asserts", + "region", + "serde", + "thiserror", + "wasmer-types", + "winapi", +] + +[[package]] +name = "wasmparser" +version = "0.51.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aeb1956b19469d1c5e63e459d29e7b5aa0f558d9f16fcef09736f8a265e6c10a" + +[[package]] +name = "wasmparser" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32fddd575d477c6e9702484139cf9f23dcd554b06d185ed0f56c857dd3a47aa6" + +[[package]] +name = "wasmparser" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a950e6a618f62147fd514ff445b2a0b53120d382751960797f85f058c7eda9b9" + +[[package]] +name = "wasmparser" +version = "0.65.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc2fe6350834b4e528ba0901e7aa405d78b89dc1fa3145359eb4de0e323fcf" + +[[package]] +name = "wasmtime" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "373b87ebd6721f4121e28eeaaa41943548c48bcca04ac9bb063004207e5e7d70" +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", +] + +[[package]] +name = "wasmtime-cranelift" +version = "0.20.0" +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", +] + +[[package]] +name = "wasmtime-debug" +version = "0.20.0" +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", +] + +[[package]] +name = "wasmtime-environ" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c0d7401bf253b7b1f426afd70d285bb23ea9a1c7605d6af788c95db5084edf5" +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", +] + +[[package]] +name = "wasmtime-jit" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c838a108318e7c5a2201addb3d3b27a6ef3d142f0eb0addc815b9c2541e5db5" +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", + "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", +] + +[[package]] +name = "wasmtime-obj" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc8422b0acce519b74c3ae5db59167c611ea92220e5c334ad406e977277e0f23" +dependencies = [ + "anyhow", + "more-asserts", + "object 0.21.1", + "target-lexicon 0.11.2", + "wasmtime-debug", + "wasmtime-environ", +] + +[[package]] +name = "wasmtime-profiling" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33f2689bf523f843555e57e24d59abf0c5013007366b866081d73a15e510b4b2" +dependencies = [ + "anyhow", + "cfg-if 0.1.10", + "lazy_static", + "libc", + "serde", + "target-lexicon 0.11.2", + "wasmtime-environ", + "wasmtime-runtime", +] + +[[package]] +name = "wasmtime-runtime" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7353f5e79390048128e44b5ceda7255723b2066de4026df9a168b0b2593df71" +dependencies = [ + "backtrace", + "cc", + "cfg-if 0.1.10", + "indexmap", + "lazy_static", + "libc", + "log", + "memoffset 0.5.6", + "more-asserts", + "region", + "thiserror", + "wasmtime-environ", + "winapi", +] + +[[package]] +name = "wast" +version = "35.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db5ae96da18bb5926341516fd409b5a8ce4e4714da7f0a1063d3b20ac9f9a1e1" +dependencies = [ + "leb128", +] + +[[package]] +name = "wat" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b0fa059022c5dabe129f02b429d67086400deb8277f89c975555dacc1dadbcc" +dependencies = [ + "wast", +] + +[[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 = "which" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d011071ae14a2f6671d0b74080ae0cd8ebf3a6f8c9589a2cd45f23126fe29724" +dependencies = [ + "libc", +] + +[[package]] +name = "which" +version = "4.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87c14ef7e1b8b8ecfc75d5eca37949410046e66f15d185c01d70824f1f8111ef" +dependencies = [ + "libc", + "thiserror", +] + +[[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-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + +[[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.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81a974bcdd357f0dca4d41677db03436324d45a4c9ed2d0b873a5a360ce41c36" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f369ddb18862aba61aa49bf31e74d29f0f162dec753063200e1dc084345d16" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..db976ed --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,29 @@ +[package] +name = "fungible-token-wrapper" +version = "0.0.1" +authors = ["Near Inc "] +edition = "2018" + +[dev-dependencies] +near-sdk = "3.1.0" +near-sdk-sim = "3.1.1" + +# remember to include a line for each contract +fungible-token = { path = "./ft" } +defi = { path = "./test-contract-defi" } + +[profile.release] +codegen-units = 1 +# Tell `rustc` to optimize for small code size. +opt-level = "z" +lto = true +debug = false +panic = "abort" +overflow-checks = true + +[workspace] +# remember to include a member for each contract +members = [ + "ft", + "test-contract-defi", +] diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..5f49e39 --- /dev/null +++ b/LICENSE @@ -0,0 +1,25 @@ +Copyright 2020 NEAR Inc + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/LICENSE-APACHE b/LICENSE-APACHE new file mode 100644 index 0000000..1b5ec8b --- /dev/null +++ b/LICENSE-APACHE @@ -0,0 +1,176 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS diff --git a/README-Windows.md b/README-Windows.md new file mode 100644 index 0000000..c73c261 --- /dev/null +++ b/README-Windows.md @@ -0,0 +1,112 @@ +Fungible Token (FT) +=================== + +Example implementation of a [Fungible Token] contract which uses [near-contract-standards] and [simulation] tests. This is a contract-only example. + +**Note**: this README is specific to Windows and this example. For development on OS X or Linux, please see [README.md](README.md). + + [Fungible Token]: https://nomicon.io/Standards/Tokens/FungibleTokenCore.html + [near-contract-standards]: https://github.com/near/near-sdk-rs/tree/master/near-contract-standards + [simulation]: https://github.com/near/near-sdk-rs/tree/master/near-sdk-sim + +Prerequisites +============= + +If you're using Gitpod, you can skip this step. + +1. Make sure Rust is installed per the prerequisites in [`near-sdk-rs`](https://github.com/near/near-sdk-rs#pre-requisites) +2. Ensure `near-cli` is installed by running `near --version`. If not installed, install with: `npm install --global near-cli` + +## Building + +To build run in CMD: +```bash +build.bat +``` + +Using this contract +=================== + +This smart contract will get deployed to your NEAR account. For this example, please create a new NEAR account. Because NEAR allows the ability to upgrade contracts on the same account, initialization functions must be cleared. If you'd like to run this example on a NEAR account that has had prior contracts deployed, please use the `near-cli` command `near delete`, and then recreate it in Wallet. To create (or recreate) an account, please follow the directions on [NEAR Wallet](https://wallet.near.org/). + +Switch to `mainnet`. You can skip this step to use `testnet` as a default network. + + set NEAR_ENV=mainnet + +In the project root, log in to your newly created account with `near-cli` by following the instructions after this command: + + near login + +To make this tutorial easier to copy/paste, we're going to set an environment variable for your account id. In the below command, replace `MY_ACCOUNT_NAME` with the account name you just logged in with, including the `.near`: + + set ID=MY_ACCOUNT_NAME + +You can tell if the environment variable is set correctly if your command line prints the account name after this command: + + echo %ID% + +Now we can deploy the compiled contract in this example to your account: + + near deploy --wasmFile res/fungible_token.wasm --accountId %ID% + +FT contract should be initialized before usage. You can read more about metadata at ['nomicon.io'](https://nomicon.io/Standards/FungibleToken/Metadata.html#reference-level-explanation). Modify the parameters and create a token: + + near call %ID% new "{\"owner_id\": \""%ID%"\", \"total_supply\": \"1000000000000000\", \"metadata\": { \"spec\": \"ft-1.0.0\", \"name\": \"Example Token Name\", \"symbol\": \"EXLT\", \"decimals\": 8 }}" --accountId %ID% + +Get metadata: + + near view %ID% ft_metadata + + +Transfer Example +--------------- + +Let's set up an account to transfer some tokens to. These account will be a sub-account of the NEAR account you logged in with. + + near create-account bob.%ID% --masterAccount %ID% --initialBalance 1 + +Add storage deposit for Bob's account: + + near call %ID% storage_deposit '' --accountId bob.%ID% --amount 0.00125 + +Check balance of Bob's account, it should be `0` for now: + + near view %ID% ft_balance_of "{\"account_id\": \""bob.%ID%"\"}" + +Transfer tokens to Bob from the contract that minted these fungible tokens, exactly 1 yoctoNEAR of deposit should be attached: + + near call %ID% ft_transfer "{\"receiver_id\": \""bob.%ID%"\", \"amount\": \"19\"}" --accountId %ID% --amount 0.000000000000000000000001 + + +Check the balance of Bob again with the command from before and it will now return `19`. + +## Testing + +As with many Rust libraries and contracts, there are tests in the main fungible token implementation at `ft/src/lib.rs`. + +Additionally, this project has [simulation] tests in `tests/sim`. Simulation tests allow testing cross-contract calls, which is crucial to ensuring that the `ft_transfer_call` function works properly. These simulation tests are the reason this project has the file structure it does. Note that the root project has a `Cargo.toml` which sets it up as a workspace. `ft` and `test-contract-defi` are both small & focused contract projects, the latter only existing for simulation tests. The root project imports `near-sdk-sim` and tests interaction between these contracts. + +You can run all these tests with one command: + +```bash +cargo test +``` + +If you want to run only simulation tests, you can use `cargo test simulate`, since all the simulation tests include "simulate" in their names. + + +## Notes + + - The maximum balance value is limited by U128 (`2**128 - 1`). + - JSON calls should pass U128 as a base-10 string. E.g. "100". + - This does not include escrow functionality, as `ft_transfer_call` provides a superior approach. An escrow system can, of course, be added as a separate contract or additional functionality within this contract. + +## No AssemblyScript? + +[near-contract-standards] is currently Rust-only. We strongly suggest using this library to create your own Fungible Token contract to ensure it works as expected. + +Someday NEAR core or community contributors may provide a similar library for AssemblyScript, at which point this example will be updated to include both a Rust and AssemblyScript version. + +## Contributing + +When making changes to the files in `ft` or `test-contract-defi`, remember to use `./build.sh` to compile all contracts and copy the output to the `res` folder. If you forget this, **the simulation tests will not use the latest versions**. diff --git a/README.md b/README.md index 0247883..329f3e5 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,157 @@ # earthChange A fungible coin limited in issuance by the total_M² of land **being considered for purchase**, and limited in circulation by the total_M² of land **held under these terms**. eC does not represent property ownership and conveys no rights of governance. + +======= + +This `Smart Contract` is based on the example implementation of NEP-141 at https://github.com/near-examples/FT + +This implementation of a [Fungible Token] contract uses [near-contract-standards] and [simulation] tests. This is a contract-only example. + + [Fungible Token]: https://nomicon.io/Standards/FungibleToken/Core.html + [near-contract-standards]: https://github.com/near/near-sdk-rs/tree/master/near-contract-standards + [simulation]: https://github.com/near/near-sdk-rs/tree/master/near-sdk-sim + + +Prerequisites +============= + +If you're using Gitpod, you can skip this step. +1. Make sure Rust is installed per the prerequisites in [`near-sdk-rs`](https://github.com/near/near-sdk-rs#pre-requisites) +2. Ensure `near-cli` is installed by running `near --version`. If not installed, install with: `npm install -g near-cli` + +## Building + +To build run: +```bash +./build.sh +``` + +Using this contract +=================== + +### Quickest deploy + +You can build and deploy this smart contract to a development account. [Dev Accounts](https://docs.near.org/docs/concepts/account#dev-accounts) are auto-generated accounts to assist in developing and testing smart contracts. Please see the [Standard deploy](#standard-deploy) section for creating a more personalized account to deploy to. + +```bash +near dev-deploy --wasmFile res/fungible_token.wasm --helperUrl https://near-contract-helper.onrender.com +``` + +Behind the scenes, this is creating an account and deploying a contract to it. On the console, notice a message like: + +>Done deploying to dev-1234567890123 + +In this instance, the account is `dev-1234567890123`. A file has been created containing a key pair to +the account, located at `neardev/dev-account`. To make the next few steps easier, we're going to set an +environment variable containing this development account id and use that when copy/pasting commands. +Run this command to the environment variable: + +```bash +source neardev/dev-account.env +``` + +You can tell if the environment variable is set correctly if your command line prints the account name after this command: +```bash +echo $CONTRACT_NAME +``` + +The next command will initialize the contract using the `new` method: + +```bash +near call $CONTRACT_NAME new '{"owner_id": "'$CONTRACT_NAME'", "total_supply": "1000000000000000", "metadata": { "spec": "ft-1.0.0", "name": "Example Token Name", "symbol": "EXLT", "decimals": 8 }}' --accountId $CONTRACT_NAME +``` + +To get the fungible token metadata: + +```bash +near view $CONTRACT_NAME ft_metadata +``` + +### Standard deploy + +This smart contract will get deployed to your NEAR account. For this example, please create a new NEAR account. Because NEAR allows the ability to upgrade contracts on the same account, initialization functions must be cleared. If you'd like to run this example on a NEAR account that has had prior contracts deployed, please use the `near-cli` command `near delete`, and then recreate it in Wallet. To create (or recreate) an account, please follow the directions on [NEAR Wallet](https://wallet.near.org/). + +Switch to `mainnet`. You can skip this step to use `testnet` as a default network. + + export NEAR_ENV=mainnet + +In the project root, log in to your newly created account with `near-cli` by following the instructions after this command: + + near login + +To make this tutorial easier to copy/paste, we're going to set an environment variable for your account id. In the below command, replace `MY_ACCOUNT_NAME` with the account name you just logged in with, including the `.near`: + + ID=MY_ACCOUNT_NAME + +You can tell if the environment variable is set correctly if your command line prints the account name after this command: + + echo $ID + +Now we can deploy the compiled contract in this example to your account: + + near deploy --wasmFile res/fungible_token.wasm --accountId $ID + +FT contract should be initialized before usage. You can read more about metadata at ['nomicon.io'](https://nomicon.io/Standards/FungibleToken/Metadata.html#reference-level-explanation). Modify the parameters and create a token: + + near call $ID new '{"owner_id": "'$ID'", "total_supply": "1000000000000000", "metadata": { "spec": "ft-1.0.0", "name": "Example Token Name", "symbol": "EXLT", "decimals": 8 }}' --accountId $ID + +Get metadata: + + near view $ID ft_metadata + + +Transfer Example +--------------- + +Let's set up an account to transfer some tokens to. These account will be a sub-account of the NEAR account you logged in with. + + near create-account bob.$ID --masterAccount $ID --initialBalance 1 + +Add storage deposit for Bob's account: + + near call $ID storage_deposit '' --accountId bob.$ID --amount 0.00125 + + +Check balance of Bob's account, it should be `0` for now: + + near view $ID ft_balance_of '{"account_id": "'bob.$ID'"}' + +Transfer tokens to Bob from the contract that minted these fungible tokens, exactly 1 yoctoNEAR of deposit should be attached: + + near call $ID ft_transfer '{"receiver_id": "'bob.$ID'", "amount": "19"}' --accountId $ID --amount 0.000000000000000000000001 + + +Check the balance of Bob again with the command from before and it will now return `19`. + +## Testing + +As with many Rust libraries and contracts, there are tests in the main fungible token implementation at `ft/src/lib.rs`. + +Additionally, this project has [simulation] tests in `tests/sim`. Simulation tests allow testing cross-contract calls, which is crucial to ensuring that the `ft_transfer_call` function works properly. These simulation tests are the reason this project has the file structure it does. Note that the root project has a `Cargo.toml` which sets it up as a workspace. `ft` and `test-contract-defi` are both small & focused contract projects, the latter only existing for simulation tests. The root project imports `near-sdk-sim` and tests interaction between these contracts. + +You can run all these tests with one command: + +```bash +cargo test +``` + +If you want to run only simulation tests, you can use `cargo test simulate`, since all the simulation tests include "simulate" in their names. + + +## Notes + + - The maximum balance value is limited by U128 (`2**128 - 1`). + - JSON calls should pass U128 as a base-10 string. E.g. "100". + - This does not include escrow functionality, as `ft_transfer_call` provides a superior approach. An escrow system can, of course, be added as a separate contract or additional functionality within this contract. + +## No AssemblyScript? + +[near-contract-standards] is currently Rust-only. We strongly suggest using this library to create your own Fungible Token contract to ensure it works as expected. + +Someday NEAR core or community contributors may provide a similar library for AssemblyScript, at which point this example will be updated to include both a Rust and AssemblyScript version. + +## Contributing + +When making changes to the files in `ft` or `test-contract-defi`, remember to use `./build.sh` to compile all contracts and copy the output to the `res` folder. If you forget this, **the simulation tests will not use the latest versions**. + +Note that if the `rust-toolchain` file in this repository changes, please make sure to update the `.gitpod.Dockerfile` to explicitly specify using that as default as well. diff --git a/build.bat b/build.bat new file mode 100644 index 0000000..675baa1 --- /dev/null +++ b/build.bat @@ -0,0 +1,6 @@ +@echo off + +title FT build +cargo build --all --target wasm32-unknown-unknown --release +xcopy %CD%\target\wasm32-unknown-unknown\release\*.wasm %CD%\res /Y +pause \ No newline at end of file diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..4b34dd8 --- /dev/null +++ b/build.sh @@ -0,0 +1,5 @@ +#!/bin/bash +set -e +cd "`dirname $0`" +cargo build --all --target wasm32-unknown-unknown --release +cp target/wasm32-unknown-unknown/release/*.wasm ./res/ diff --git a/ft/Cargo.toml b/ft/Cargo.toml new file mode 100644 index 0000000..149d1b2 --- /dev/null +++ b/ft/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "fungible-token" +version = "1.0.0" +authors = ["Near Inc "] +edition = "2018" + +[lib] +crate-type = ["cdylib", "rlib"] + +[dependencies] +near-sdk = "3.1.0" +near-contract-standards = "3.1.1" diff --git a/ft/src/lib.rs b/ft/src/lib.rs new file mode 100644 index 0000000..0fd4517 --- /dev/null +++ b/ft/src/lib.rs @@ -0,0 +1,165 @@ +/*! +Fungible Token implementation with JSON serialization. +NOTES: + - The maximum balance value is limited by U128 (2**128 - 1). + - JSON calls should pass U128 as a base-10 string. E.g. "100". + - The contract optimizes the inner trie structure by hashing account IDs. It will prevent some + abuse of deep tries. Shouldn't be an issue, once NEAR clients implement full hashing of keys. + - The contract tracks the change in storage before and after the call. If the storage increases, + the contract requires the caller of the contract to attach enough deposit to the function call + to cover the storage cost. + This is done to prevent a denial of service attack on the contract by taking all available storage. + If the storage decreases, the contract will issue a refund for the cost of the released storage. + The unused tokens from the attached deposit are also refunded, so it's safe to + attach more deposit than required. + - To prevent the deployed contract from being modified or deleted, it should not have any access + keys on its account. +*/ +use near_contract_standards::fungible_token::metadata::{ + FungibleTokenMetadata, FungibleTokenMetadataProvider, FT_METADATA_SPEC, +}; +// https://nomicon.io/Standards/FungibleToken/Core.html +use near_contract_standards::fungible_token::FungibleToken; +use near_sdk::borsh::{self, BorshDeserialize, BorshSerialize}; +use near_sdk::collections::LazyOption; +use near_sdk::json_types::{ValidAccountId, U128}; +use near_sdk::{env, log, near_bindgen, AccountId, Balance, PanicOnDefault, PromiseOrValue}; + +near_sdk::setup_alloc!(); + +#[near_bindgen] +#[derive(BorshDeserialize, BorshSerialize, PanicOnDefault)] +pub struct Contract { + token: FungibleToken, + metadata: LazyOption, +} + +const DATA_IMAGE_SVG_EC_ICON: &str = "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 288 288'%3E%3Cg id='l' data-name='l'%3E%3Cpath d='M187.58,79.81l-30.1,44.69a3.2,3.2,0,0,0,4.75,4.2L191.86,103a1.2,1.2,0,0,1,2,.91v80.46a1.2,1.2,0,0,1-2.12.77L102.18,77.93A15.35,15.35,0,0,0,90.47,72.5H87.34A15.34,15.34,0,0,0,72,87.84V201.16A15.34,15.34,0,0,0,87.34,216.5h0a15.35,15.35,0,0,0,13.08-7.31l30.1-44.69a3.2,3.2,0,0,0-4.75-4.2L96.14,186a1.2,1.2,0,0,1-2-.91V104.61a1.2,1.2,0,0,1,2.12-.77l89.55,107.23a15.35,15.35,0,0,0,11.71,5.43h3.13A15.34,15.34,0,0,0,216,201.16V87.84A15.34,15.34,0,0,0,200.66,72.5h0A15.35,15.35,0,0,0,187.58,79.81Z'/%3E%3C/g%3E%3C/svg%3E"; + +#[near_bindgen] +impl Contract { + /// Initializes the contract with the given total supply owned by the given `owner_id` with + /// default metadata (for example purposes only). + #[init] + pub fn new_default_meta(owner_id: ValidAccountId, total_supply: U128) -> Self { + Self::new( + owner_id, + total_supply, + FungibleTokenMetadata { + spec: FT_METADATA_SPEC.to_string(), + name: "earthChange".to_string(), + symbol: "EARTHCHANGE".to_string(), + icon: Some(DATA_IMAGE_SVG_EC_ICON.to_string()), + reference: None, + reference_hash: None, + decimals: 24, + }, + ) + } + + /// Initializes the contract with the given total supply owned by the given `owner_id` with + /// the given fungible token metadata. + #[init] + pub fn new( + owner_id: ValidAccountId, + total_supply: U128, + metadata: FungibleTokenMetadata, + ) -> Self { + assert!(!env::state_exists(), "Already initialized"); + metadata.assert_valid(); + let mut this = Self { + token: FungibleToken::new(b"a".to_vec()), + metadata: LazyOption::new(b"m".to_vec(), Some(&metadata)), + }; + this.token.internal_register_account(owner_id.as_ref()); + this.token.internal_deposit(owner_id.as_ref(), total_supply.into()); + this + } + + fn on_account_closed(&mut self, account_id: AccountId, balance: Balance) { + log!("Closed @{} with {}", account_id, balance); + } + + fn on_tokens_burned(&mut self, account_id: AccountId, amount: Balance) { + log!("Account @{} burned {}", account_id, amount); + } +} + +near_contract_standards::impl_fungible_token_core!(Contract, token, on_tokens_burned); +near_contract_standards::impl_fungible_token_storage!(Contract, token, on_account_closed); + +#[near_bindgen] +impl FungibleTokenMetadataProvider for Contract { + fn ft_metadata(&self) -> FungibleTokenMetadata { + self.metadata.get().unwrap() + } +} + +#[cfg(all(test, not(target_arch = "wasm32")))] +mod tests { + use near_sdk::test_utils::{accounts, VMContextBuilder}; + use near_sdk::MockedBlockchain; + use near_sdk::{testing_env, Balance}; + + use super::*; + // 150 Trillion is the approximate total square Meters of land on Earth. + const TOTAL_SUPPLY: Balance = 150_000_000_000_000; + + fn get_context(predecessor_account_id: ValidAccountId) -> VMContextBuilder { + let mut builder = VMContextBuilder::new(); + builder + .current_account_id(accounts(0)) + .signer_account_id(predecessor_account_id.clone()) + .predecessor_account_id(predecessor_account_id); + builder + } + + #[test] + fn test_new() { + let mut context = get_context(accounts(1)); + testing_env!(context.build()); + let contract = Contract::new_default_meta(accounts(1).into(), TOTAL_SUPPLY.into()); + testing_env!(context.is_view(true).build()); + assert_eq!(contract.ft_total_supply().0, TOTAL_SUPPLY); + assert_eq!(contract.ft_balance_of(accounts(1)).0, TOTAL_SUPPLY); + } + + #[test] + #[should_panic(expected = "The contract is not initialized")] + fn test_default() { + let context = get_context(accounts(1)); + testing_env!(context.build()); + let _contract = Contract::default(); + } + + #[test] + fn test_transfer() { + let mut context = get_context(accounts(2)); + testing_env!(context.build()); + let mut contract = Contract::new_default_meta(accounts(2).into(), TOTAL_SUPPLY.into()); + testing_env!(context + .storage_usage(env::storage_usage()) + .attached_deposit(contract.storage_balance_bounds().min.into()) + .predecessor_account_id(accounts(1)) + .build()); + // Paying for account registration, aka storage deposit + contract.storage_deposit(None, None); + + testing_env!(context + .storage_usage(env::storage_usage()) + .attached_deposit(1) + .predecessor_account_id(accounts(2)) + .build()); + let transfer_amount = TOTAL_SUPPLY / 3; + contract.ft_transfer(accounts(1), transfer_amount.into(), None); + + testing_env!(context + .storage_usage(env::storage_usage()) + .account_balance(env::account_balance()) + .is_view(true) + .attached_deposit(0) + .build()); + assert_eq!(contract.ft_balance_of(accounts(2)).0, (TOTAL_SUPPLY - transfer_amount)); + assert_eq!(contract.ft_balance_of(accounts(1)).0, transfer_amount); + } +} diff --git a/res/defi.wasm b/res/defi.wasm new file mode 100755 index 0000000000000000000000000000000000000000..a8350d930e5afc8f066d658cbe03ff261ab7b1ba GIT binary patch literal 142418 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

07AmX9wzjFVSlFWCNl5T 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 z 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 Jwl<%8{{&(|S%Clm literal 0 HcmV?d00001 diff --git a/rustfmt.toml b/rustfmt.toml new file mode 100644 index 0000000..2a35f02 --- /dev/null +++ b/rustfmt.toml @@ -0,0 +1 @@ +use_small_heuristics = "Max" diff --git a/test-contract-defi/Cargo.toml b/test-contract-defi/Cargo.toml new file mode 100644 index 0000000..dccb222 --- /dev/null +++ b/test-contract-defi/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "defi" +version = "0.0.1" +authors = ["Near Inc "] +edition = "2018" + +[lib] +crate-type = ["cdylib", "rlib"] + +[dependencies] +near-sdk = "3.1.0" +near-contract-standards = "3.1.1" + diff --git a/test-contract-defi/src/lib.rs b/test-contract-defi/src/lib.rs new file mode 100644 index 0000000..0ebdaa9 --- /dev/null +++ b/test-contract-defi/src/lib.rs @@ -0,0 +1,88 @@ +/*! +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::{ValidAccountId, U128}; +use near_sdk::{ + env, ext_contract, log, near_bindgen, setup_alloc, AccountId, Balance, Gas, PanicOnDefault, + PromiseOrValue, +}; + +setup_alloc!(); + +const BASE_GAS: Gas = 5_000_000_000_000; +const PROMISE_CALL: Gas = 5_000_000_000_000; +const GAS_FOR_FT_ON_TRANSFER: 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: ValidAccountId) -> Self { + assert!(!env::state_exists(), "Already initialized"); + Self { fungible_token_account_id: fungible_token_account_id.into() } + } +} + +#[near_bindgen] +impl FungibleTokenReceiver for DeFi { + /// If given `msg: "take-my-money", 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: ValidAccountId, + amount: U128, + msg: String, + ) -> PromiseOrValue { + // Verifying that we were called by fungible token contract that we expect. + assert_eq!( + &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() { + "take-my-money" => 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()) + } +} diff --git a/tests/sim/main.rs b/tests/sim/main.rs new file mode 100644 index 0000000..4db435b --- /dev/null +++ b/tests/sim/main.rs @@ -0,0 +1,3 @@ +mod no_macros; +mod utils; +mod with_macros; diff --git a/tests/sim/no_macros.rs b/tests/sim/no_macros.rs new file mode 100644 index 0000000..02f8afa --- /dev/null +++ b/tests/sim/no_macros.rs @@ -0,0 +1,62 @@ +use near_sdk::json_types::U128; +use near_sdk::serde_json::json; +use near_sdk_sim::{to_yocto, DEFAULT_GAS}; + +use crate::utils::init_no_macros as init; + +#[test] +fn simulate_total_supply() { + let initial_balance = to_yocto("100"); + let (_, ft, _) = init(initial_balance); + + let total_supply: U128 = ft.view(ft.account_id(), "ft_total_supply", b"").unwrap_json(); + + assert_eq!(initial_balance, total_supply.0); +} + +#[test] +fn simulate_simple_transfer() { + let transfer_amount = to_yocto("100"); + let initial_balance = to_yocto("100000"); + let (root, ft, alice) = init(initial_balance); + + // Transfer from root to alice. + root.call( + ft.account_id(), + "ft_transfer", + &json!({ + "receiver_id": alice.valid_account_id(), + "amount": U128::from(transfer_amount) + }) + .to_string() + .into_bytes(), + DEFAULT_GAS, + 1, // deposit + ) + .assert_success(); + + let root_balance: U128 = root + .view( + ft.account_id(), + "ft_balance_of", + &json!({ + "account_id": root.valid_account_id() + }) + .to_string() + .into_bytes(), + ) + .unwrap_json(); + let alice_balance: U128 = alice + .view( + ft.account_id(), + "ft_balance_of", + &json!({ + "account_id": alice.valid_account_id() + }) + .to_string() + .into_bytes(), + ) + .unwrap_json(); + assert_eq!(initial_balance - transfer_amount, root_balance.0); + assert_eq!(transfer_amount, alice_balance.0); +} diff --git a/tests/sim/utils.rs b/tests/sim/utils.rs new file mode 100644 index 0000000..f207e1e --- /dev/null +++ b/tests/sim/utils.rs @@ -0,0 +1,94 @@ +use defi::DeFiContract; +use fungible_token::ContractContract as FtContract; + +use near_sdk::json_types::U128; +use near_sdk::serde_json::json; +use near_sdk_sim::{ + deploy, init_simulator, to_yocto, ContractAccount, UserAccount, DEFAULT_GAS, STORAGE_AMOUNT, +}; + +// Load in contract bytes at runtime +near_sdk_sim::lazy_static_include::lazy_static_include_bytes! { + FT_WASM_BYTES => "res/fungible_token.wasm", + DEFI_WASM_BYTES => "res/defi.wasm", +} + +const FT_ID: &str = "ft"; +const DEFI_ID: &str = "defi"; + +// Register the given `user` with FT contract +pub fn register_user(user: &near_sdk_sim::UserAccount) { + user.call( + FT_ID.to_string(), + "storage_deposit", + &json!({ + "account_id": user.valid_account_id() + }) + .to_string() + .into_bytes(), + near_sdk_sim::DEFAULT_GAS / 2, + near_sdk::env::storage_byte_cost() * 125, // attached deposit + ) + .assert_success(); +} + +pub fn init_no_macros(initial_balance: u128) -> (UserAccount, UserAccount, UserAccount) { + let root = init_simulator(None); + + let ft = root.deploy(&FT_WASM_BYTES, FT_ID.into(), STORAGE_AMOUNT); + + ft.call( + FT_ID.into(), + "new_default_meta", + &json!({ + "owner_id": root.valid_account_id(), + "total_supply": U128::from(initial_balance), + }) + .to_string() + .into_bytes(), + DEFAULT_GAS / 2, + 0, // attached deposit + ) + .assert_success(); + + let alice = root.create_user("alice".to_string(), to_yocto("100")); + register_user(&alice); + + (root, ft, alice) +} + +pub fn init_with_macros( + initial_balance: u128, +) -> (UserAccount, ContractAccount, ContractAccount, UserAccount) { + let root = init_simulator(None); + // uses default values for deposit and gas + let ft = deploy!( + // Contract Proxy + contract: FtContract, + // Contract account id + contract_id: FT_ID, + // Bytes of contract + bytes: &FT_WASM_BYTES, + // User deploying the contract, + signer_account: root, + // init method + init_method: new_default_meta( + root.valid_account_id(), + initial_balance.into() + ) + ); + let alice = root.create_user("alice".to_string(), to_yocto("100")); + register_user(&alice); + + let defi = deploy!( + contract: DeFiContract, + contract_id: DEFI_ID, + bytes: &DEFI_WASM_BYTES, + signer_account: root, + init_method: new( + ft.valid_account_id() + ) + ); + + (root, ft, defi, alice) +} diff --git a/tests/sim/with_macros.rs b/tests/sim/with_macros.rs new file mode 100644 index 0000000..8f8ae49 --- /dev/null +++ b/tests/sim/with_macros.rs @@ -0,0 +1,264 @@ +use near_sdk::json_types::U128; +use near_sdk::serde_json::json; +use near_sdk_sim::{call, to_yocto, transaction::ExecutionStatus, view, DEFAULT_GAS}; + +use crate::utils::{init_with_macros as init, register_user}; + +#[test] +fn simulate_total_supply() { + let initial_balance = to_yocto("100"); + let (_, ft, _, _) = init(initial_balance); + + let total_supply: U128 = view!(ft.ft_total_supply()).unwrap_json(); + + assert_eq!(initial_balance, total_supply.0); +} + +#[test] +fn simulate_simple_transfer() { + let transfer_amount = to_yocto("100"); + let initial_balance = to_yocto("100000"); + let (root, ft, _, alice) = init(initial_balance); + + // Transfer from root to alice. + // Uses default gas amount, `near_sdk_sim::DEFAULT_GAS` + call!( + root, + ft.ft_transfer(alice.valid_account_id(), transfer_amount.into(), None), + deposit = 1 + ) + .assert_success(); + + let root_balance: U128 = view!(ft.ft_balance_of(root.valid_account_id())).unwrap_json(); + let alice_balance: U128 = view!(ft.ft_balance_of(alice.valid_account_id())).unwrap_json(); + assert_eq!(initial_balance - transfer_amount, root_balance.0); + assert_eq!(transfer_amount, alice_balance.0); +} + +#[test] +fn simulate_close_account_empty_balance() { + let initial_balance = to_yocto("100000"); + let (_root, ft, _, alice) = init(initial_balance); + + let outcome = call!(alice, ft.storage_unregister(None), deposit = 1); + outcome.assert_success(); + let result: bool = outcome.unwrap_json(); + assert!(result); +} + +#[test] +fn simulate_close_account_non_empty_balance() { + let initial_balance = to_yocto("100000"); + let (root, ft, _, _alice) = init(initial_balance); + + let outcome = call!(root, ft.storage_unregister(None), deposit = 1); + assert!(!outcome.is_ok(), "Should panic"); + assert!(format!("{:?}", outcome.status()) + .contains("Can't unregister the account with the positive balance without force")); + + let outcome = call!(root, ft.storage_unregister(Some(false)), deposit = 1); + assert!(!outcome.is_ok(), "Should panic"); + assert!(format!("{:?}", outcome.status()) + .contains("Can't unregister the account with the positive balance without force")); +} + +#[test] +fn simulate_close_account_force_non_empty_balance() { + let initial_balance = to_yocto("100000"); + let (root, ft, _, _alice) = init(initial_balance); + + let outcome = call!(root, ft.storage_unregister(Some(true)), deposit = 1); + assert_eq!( + outcome.logs()[0], + format!("Closed @{} with {}", root.valid_account_id(), initial_balance) + ); + outcome.assert_success(); + let result: bool = outcome.unwrap_json(); + assert!(result); + + let total_supply: U128 = view!(ft.ft_total_supply()).unwrap_json(); + + assert_eq!(total_supply.0, 0); +} + +#[test] +fn simulate_transfer_call_with_burned_amount() { + let transfer_amount = to_yocto("100"); + let initial_balance = to_yocto("1000"); + let (root, ft, defi, _alice) = init(initial_balance); + + // defi contract must be registered as a FT account + register_user(&defi.user_account); + + // root invests in defi by calling `ft_transfer_call` + let outcome = root + .create_transaction(ft.account_id()) + .function_call( + "ft_transfer_call".to_string(), + json!({ + "receiver_id": defi.valid_account_id(), + "amount": transfer_amount.to_string(), + "msg": "10", + }) + .to_string() + .into_bytes(), + DEFAULT_GAS / 2, + 1, + ) + .function_call( + "storage_unregister".to_string(), + json!({ + "force": true + }) + .to_string() + .into_bytes(), + DEFAULT_GAS / 2, + 1, + ) + .submit(); + + assert_eq!( + outcome.logs()[1], + format!("Closed @{} with {}", root.valid_account_id(), initial_balance - transfer_amount) + ); + + let result: bool = outcome.unwrap_json(); + assert!(result); + + let callback_outcome = outcome.get_receipt_results().remove(1).unwrap(); + + assert_eq!(callback_outcome.logs()[0], "The account of the sender was deleted"); + assert_eq!( + callback_outcome.logs()[1], + format!("Account @{} burned {}", root.valid_account_id(), 10) + ); + + let used_amount: U128 = callback_outcome.unwrap_json(); + // Sender deleted the account. Even though the returned amount was 10, it was not refunded back + // to the sender, but was taken out of the receiver's balance and was burned. + assert_eq!(used_amount.0, transfer_amount); + + let total_supply: U128 = view!(ft.ft_total_supply()).unwrap_json(); + + assert_eq!(total_supply.0, transfer_amount - 10); + + let defi_balance: U128 = view!(ft.ft_balance_of(defi.valid_account_id())).unwrap_json(); + assert_eq!(defi_balance.0, transfer_amount - 10); +} + +#[test] +fn simulate_transfer_call_with_immediate_return_and_no_refund() { + let transfer_amount = to_yocto("100"); + let initial_balance = to_yocto("1000"); + let (root, ft, defi, _alice) = init(initial_balance); + + // defi contract must be registered as a FT account + register_user(&defi.user_account); + + // root invests in defi by calling `ft_transfer_call` + call!( + root, + ft.ft_transfer_call( + defi.valid_account_id(), + transfer_amount.into(), + None, + "take-my-money".into() + ), + deposit = 1 + ) + .assert_success(); + + let root_balance: U128 = view!(ft.ft_balance_of(root.valid_account_id())).unwrap_json(); + let defi_balance: U128 = view!(ft.ft_balance_of(defi.valid_account_id())).unwrap_json(); + assert_eq!(initial_balance - transfer_amount, root_balance.0); + assert_eq!(transfer_amount, defi_balance.0); +} + +#[test] +fn simulate_transfer_call_when_called_contract_not_registered_with_ft() { + let transfer_amount = to_yocto("100"); + let initial_balance = to_yocto("1000"); + let (root, ft, defi, _alice) = init(initial_balance); + + // call fails because DEFI contract is not registered as FT user + call!( + root, + ft.ft_transfer_call( + defi.valid_account_id(), + transfer_amount.into(), + None, + "take-my-money".into() + ), + deposit = 1 + ); + + // balances remain unchanged + let root_balance: U128 = view!(ft.ft_balance_of(root.valid_account_id())).unwrap_json(); + let defi_balance: U128 = view!(ft.ft_balance_of(defi.valid_account_id())).unwrap_json(); + assert_eq!(initial_balance, root_balance.0); + assert_eq!(0, defi_balance.0); +} + +#[test] +fn simulate_transfer_call_with_promise_and_refund() { + let transfer_amount = to_yocto("100"); + let refund_amount = to_yocto("50"); + let initial_balance = to_yocto("1000"); + let (root, ft, defi, _alice) = init(initial_balance); + + register_user(&defi.user_account); + + call!( + root, + ft.ft_transfer_call( + defi.valid_account_id(), + transfer_amount.into(), + None, + refund_amount.to_string() + ), + deposit = 1 + ); + + let root_balance: U128 = view!(ft.ft_balance_of(root.valid_account_id())).unwrap_json(); + let defi_balance: U128 = view!(ft.ft_balance_of(defi.valid_account_id())).unwrap_json(); + assert_eq!(initial_balance - transfer_amount + refund_amount, root_balance.0); + assert_eq!(transfer_amount - refund_amount, defi_balance.0); +} + +#[test] +fn simulate_transfer_call_promise_panics_for_a_full_refund() { + let transfer_amount = to_yocto("100"); + let initial_balance = to_yocto("1000"); + let (root, ft, defi, _alice) = init(initial_balance); + + // defi contract must be registered as a FT account + register_user(&defi.user_account); + + // root invests in defi by calling `ft_transfer_call` + let res = call!( + root, + ft.ft_transfer_call( + defi.valid_account_id(), + transfer_amount.into(), + None, + "no parsey as integer big panic oh no".to_string() + ), + deposit = 1 + ); + assert!(res.is_ok()); + + assert_eq!(res.promise_errors().len(), 1); + + if let ExecutionStatus::Failure(execution_error) = + &res.promise_errors().remove(0).unwrap().outcome().status + { + assert!(execution_error.to_string().contains("ParseIntError")); + } else { + unreachable!(); + } + + let root_balance: U128 = view!(ft.ft_balance_of(root.valid_account_id())).unwrap_json(); + let defi_balance: U128 = view!(ft.ft_balance_of(defi.valid_account_id())).unwrap_json(); + assert_eq!(initial_balance, root_balance.0); + assert_eq!(0, defi_balance.0); +}