From 7661aaa079271b37d8a871e5e4ce2a1035d8b1e9 Mon Sep 17 00:00:00 2001 From: Illia Polosukhin Date: Tue, 15 Jun 2021 12:37:51 -0700 Subject: [PATCH 1/3] Adding generic factory --- generic-factory/Cargo.lock | 3347 ++++++++++++++++++++++ generic-factory/Cargo.toml | 24 + generic-factory/README.md | 39 + generic-factory/build.sh | 5 + generic-factory/res/generic_factory.wasm | Bin 0 -> 188622 bytes generic-factory/src/lib.rs | 218 ++ generic-factory/tests/test_basics.rs | 44 + 7 files changed, 3677 insertions(+) create mode 100644 generic-factory/Cargo.lock create mode 100644 generic-factory/Cargo.toml create mode 100644 generic-factory/README.md create mode 100755 generic-factory/build.sh create mode 100755 generic-factory/res/generic_factory.wasm create mode 100644 generic-factory/src/lib.rs create mode 100644 generic-factory/tests/test_basics.rs diff --git a/generic-factory/Cargo.lock b/generic-factory/Cargo.lock new file mode 100644 index 00000000..4b2f4ffa --- /dev/null +++ b/generic-factory/Cargo.lock @@ -0,0 +1,3347 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "Inflector" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" + +[[package]] +name = "addr2line" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a2e47a1fbe209ee101dd6d61285226744c6c8d3c21c8dc878ba6cb9f467f3a" +dependencies = [ + "gimli 0.24.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.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" +dependencies = [ + "memchr", +] + +[[package]] +name = "anyhow" +version = "1.0.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15af2628f6890fe2609a3b91bef4c83450512802e59489f9c1cb1fa5df064a61" + +[[package]] +name = "arrayref" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" + +[[package]] +name = "arrayvec" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" + +[[package]] +name = "arrayvec" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4dc07131ffa69b8072d35f5007352af944213cde02545e2103680baed38fcd" + +[[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 = "autocfg" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" + +[[package]] +name = "backtrace" +version = "0.3.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7815ea54e4d821e791162e078acbebfd6d8c8939cd559c9335dceb1c8ca7282" +dependencies = [ + "addr2line", + "cc", + "cfg-if 1.0.0", + "libc", + "miniz_oxide", + "object 0.25.3", + "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.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bindgen" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd4865004a46a0aafb2a0a5eb19d3c9fc46ee5f063a6cfc605c69ac9ecf5263d" +dependencies = [ + "bitflags", + "cexpr", + "clang-sys", + "lazy_static", + "lazycell", + "peeking_take_while", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", +] + +[[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.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7774144344a4faa177370406a7ff5f1da24303817368584c6206c8303eb07848" +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 0.3.0", +] + +[[package]] +name = "blake3" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b64485778c4f16a6a5a9d335e80d449ac6c70cdd6a06d2af18a6f6f775a125b3" +dependencies = [ + "arrayref", + "arrayvec 0.5.2", + "cc", + "cfg-if 0.1.10", + "constant_time_eq", + "crypto-mac", + "digest 0.9.0", +] + +[[package]] +name = "block-buffer" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" +dependencies = [ + "block-padding", + "byte-tools", + "byteorder", + "generic-array 0.12.3", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array 0.14.4", +] + +[[package]] +name = "block-padding" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" +dependencies = [ + "byte-tools", +] + +[[package]] +name = "borsh" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09a7111f797cc721407885a323fb071636aee57f750b1a4ddc27397eba168a74" +dependencies = [ + "borsh-derive", + "hashbrown", +] + +[[package]] +name = "borsh-derive" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "307f3740906bac2c118a8122fe22681232b244f1369273e45f1156b45c43d2dd" +dependencies = [ + "borsh-derive-internal", + "borsh-schema-derive-internal", + "proc-macro-crate", + "proc-macro2", + "syn", +] + +[[package]] +name = "borsh-derive-internal" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2104c73179359431cc98e016998f2f23bc7a05bc53e79741bcba705f30047bc" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "borsh-schema-derive-internal" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae29eb8418fcd46f723f8691a2ac06857d31179d33d2f2d91eb13967de97c728" +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 = "byte-tools" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e6002dbb7c65a76e516625443949a8b7bb0d0845fe6a3dc39e2dd7ae39dcb9c" +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.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a72c244c1ff497a746a7e1fb3d14bd08420ecda70c8f25c7112f2781652d787" +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 = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "853eda514c284c2287f4bf20ae614f8781f40a81d32ecda6e91449304dfe077c" +dependencies = [ + "glob", + "libc", + "libloading 0.7.0", +] + +[[package]] +name = "cloudabi" +version = "0.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" +dependencies = [ + "bitflags", +] + +[[package]] +name = "constant_time_eq" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "cpufeatures" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed00c67cb5d0a7d64a44f6ad2668db7e7530311dd53ea79bcd4fb022c64911c8" +dependencies = [ + "libc", +] + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ed27e177f16d65f0f0c22a213e17c696ace5dd64b14258b52f9417ccb52db4" +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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec02e091aa634e2c3ada4a392989e7c3116673ef0ac5b72232439094d73b7fd" +dependencies = [ + "cfg-if 1.0.0", + "crossbeam-utils", + "lazy_static", + "memoffset 0.6.4", + "scopeguard", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d82cfc11ce7f2c3faef78d8a684447b40d503d9681acebed6cb728d45940c4db" +dependencies = [ + "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.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "639891fde0dbea823fc3d798a0fdf9d2f9440a42d64a78ab3488b0ca025117b3" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.5.1", + "subtle", + "zeroize", +] + +[[package]] +name = "darling" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d706e75d87e35569db781a9b5e2416cff1236a47ed380831f959382ccd5f858" +dependencies = [ + "darling_core 0.10.2", + "darling_macro 0.10.2", +] + +[[package]] +name = "darling" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f2c43f534ea4b0b049015d00269734195e6d3f0f6635cb692251aca6f9f8b3c" +dependencies = [ + "darling_core 0.12.4", + "darling_macro 0.12.4", +] + +[[package]] +name = "darling_core" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0c960ae2da4de88a91b2d920c2a7233b400bc33cb28453a2987822d8392519b" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim 0.9.3", + "syn", +] + +[[package]] +name = "darling_core" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e91455b86830a1c21799d94524df0845183fa55bafd9aa137b01c7d1065fa36" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim 0.10.0", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72" +dependencies = [ + "darling_core 0.10.2", + "quote", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29b5acf0dea37a7f66f7b25d2c5e93fd46f8f6968b1a5d7a3e02e97768afc95a" +dependencies = [ + "darling_core 0.12.4", + "quote", + "syn", +] + +[[package]] +name = "derive_more" +version = "0.99.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc7b9cef1e351660e5443924e4f43ab25fbbed3e9a5f052df3677deb4d6b320" +dependencies = [ + "convert_case", + "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.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdc2d9a5e44da60059bd38db2d05cbb478619541b8c79890547861ec1e3194f0" +dependencies = [ + "bitflags", + "byteorder", + "lazy_static", + "proc-macro-error", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "dynasmrt" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42276e3f205fe63887cca255aa9a65a63fb72764c30b9a6252a7c7e46994f689" +dependencies = [ + "byteorder", + "dynasm", + "memmap2", +] + +[[package]] +name = "easy-ext" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62473f23f4a15690bd64ea37269266ba7b273e7c26b302aef68d3968ae9262a0" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "ed25519" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d0860415b12243916284c67a9be413e044ee6668247b99ba26d94b2bc06c8f6" +dependencies = [ + "signature", +] + +[[package]] +name = "ed25519-dalek" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" +dependencies = [ + "curve25519-dalek", + "ed25519", + "rand 0.7.3", + "serde", + "sha2", + "zeroize", +] + +[[package]] +name = "either" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" + +[[package]] +name = "elastic-array" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d63720ea2bc2e1b79f7aa044d9dc0b825f9ccb6930b32120f8fb9e873aa84bc" +dependencies = [ + "heapsize", +] + +[[package]] +name = "enumset" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbd795df6708a599abf1ee10eacc72efd052b7a5f70fdf0715e4d5151a6db9c3" +dependencies = [ + "enumset_derive", +] + +[[package]] +name = "enumset_derive" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e19c52f9ec503c8a68dc04daf71a04b07e690c32ab1a8b68e33897f255269d47" +dependencies = [ + "darling 0.12.4", + "proc-macro2", + "quote", + "syn", +] + +[[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.4", + "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 = "funty" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fed34cd105917e91daa4da6b3728c47b068749d6a62c59811f06ed2ac71d9da7" + +[[package]] +name = "futures" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7e43a803dae2fa37c1f6a8fe121e1f7bf9548b4dfc0522a42f34145dadfc27" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e682a68b29a882df0545c143dc3646daefe80ba479bcdede94d5a703de2871e2" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0402f765d8a89a26043b889b26ce3c4679d268fa6bb22cd7c6aad98340e179d1" + +[[package]] +name = "futures-executor" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "badaa6a909fac9e7236d0620a2f57f7664640c56575b71a7552fbd68deafab79" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acc499defb3b348f8d8f3f66415835a9131856ff7714bf10dadfc4ec4bdb29a1" + +[[package]] +name = "futures-macro" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4c40298486cdf52cc00cd6d6987892ba502c7656a16a4192a9992b1ccedd121" +dependencies = [ + "autocfg", + "proc-macro-hack", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a57bead0ceff0d6dde8f465ecd96c9338121bb7717d3e7b108059531870c4282" + +[[package]] +name = "futures-task" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a16bef9fc1a4dddb5bee51c989e3fbba26569cbb0e31f5b303c184e3dd33dae" + +[[package]] +name = "futures-util" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "feb5c238d27e2bf94ffdfd27b2c29e3df4a68c4193bb6427384259e2bf191967" +dependencies = [ + "autocfg", + "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 = "generic-factory" +version = "0.1.0" +dependencies = [ + "near-sdk", + "near-sdk-sim", +] + +[[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.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" +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.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e4075386626662786ddb0ec9081e7c7eeb1ba31951f447ca780ef9f5d568189" + +[[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.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +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.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[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.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" +dependencies = [ + "matches", + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "impl-codec" +version = "0.5.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.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55e2e4c765aa53a0424761bf9f41aa7a6ac1efa87238f59560640e27fca028f2" +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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc6f3ad7b9d11a0c00842ff8de1b60ee58661048eb8049ed33c73594f359d7e6" + +[[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.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "972f5ae5d1cb9c6ae417789196c803205313edde988685da5e3aae0827b9e7fd" +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.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6002fe04202bdaf9e8d82929a7c9ebfcf47d027d87f671818e8cf9ccb4029908" +dependencies = [ + "lazy_static", + "manifest-dir-macros", + "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.97" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12b8adadd720df158f4d70dfe7ccc6adb0472d7c55ca83445f6a5ab3e36f8fb6" + +[[package]] +name = "libloading" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "351a32417a12d5f7e82c368a66781e307834dae04c6ce0cd4456d52989229883" +dependencies = [ + "cfg-if 1.0.0", + "winapi", +] + +[[package]] +name = "libloading" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f84d96438c15fcd6c3f244c8fce01d1e2b9c6b5623e9c711dc9286d8fc92d6a" +dependencies = [ + "cfg-if 1.0.0", + "winapi", +] + +[[package]] +name = "librocksdb-sys" +version = "6.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5da125e1c0f22c7cae785982115523a0738728498547f415c9054cb17c7e89f9" +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.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0382880606dff6d15c9476c416d18690b72742aa7b605bb6dd6ec9030fbf07eb" +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 = "manifest-dir-macros" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca7bbc41d799583acd24ed05a9c3db3c9275c93491b4e7cde0e609bb9598f2f0" +dependencies = [ + "once_cell", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "matches" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" + +[[package]] +name = "memchr" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b16bd47d9e329435e309c58469fe0791c2d0d1ba96ec0954152a5ae2b04387dc" + +[[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.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "723e3ebdcdc5c023db1df315364573789f8857c11b631a2fdfad7c00f5c046b4" +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.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59accc507f1338036a0477ef61afdae33cde60840f4dfe481319ce3ad116ddf9" +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-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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d0a3d5e207573f948a9e5376662aa743a2ea13f7c50a554d7af443a73fbfeba" +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.25.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a38f2be3697a57b4060074ff41b44c16870d916ad7877c17696e063257482bc7" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" + +[[package]] +name = "opaque-debug" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" + +[[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.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0f518afaa5a47d0d6386229b0a6e01e86427291d643aa4cabb4992219f504f8" +dependencies = [ + "arrayvec 0.7.1", + "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 0.5.2", + "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.4", + "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.8", + "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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc0e1f259c92177c30a4c9d177246edd0a3568b25756a977d0632cf8fa37e905" + +[[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.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0d8caf72986c1a598726adc988bb5984792ef84f5ee5aa50209145ee8077038" +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.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db50e77ae196458ccd3dc58a31ea1a90b0698ab1b7928d89f644c25d72070267" + +[[package]] +name = "pwasm-utils" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f7a12f176deee919f4ba55326ee17491c8b707d0987aed822682c821b660192" +dependencies = [ + "byteorder", + "log", + "parity-wasm", +] + +[[package]] +name = "quote" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37" +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.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.3", + "rand_hc 0.3.1", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.3", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +dependencies = [ + "getrandom 0.2.3", +] + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" +dependencies = [ + "rand_core 0.6.3", +] + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06aca804d41dbc8ba42dfd964f0d01334eceb64314b9ecf7c5fad5188a06d90" +dependencies = [ + "autocfg", + "crossbeam-deque", + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d78120e2c850279833f1dd3582f730c4ab53ed95aeaaaa862a2a5c71b1656d8e" +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.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "742739e41cd49414de871ea5e549afb7e2a3ac77b589bcbebe8c82fab37147fc" +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.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.6.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" + +[[package]] +name = "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.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "410f7acf3cb3a44527c5d9546bad4bf4e6c460915d5f9f2fc524498bfe8f70ce" + +[[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.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1500e84d27fe482ed1dc791a56eddc2f230046a040fa908c08bda1d9fb615779" +dependencies = [ + "indexmap", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha2" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b362ae5752fd2137731f9fa25fd4d9058af34666ca1966fb969119cc35719f12" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if 1.0.0", + "cpufeatures", + "digest 0.9.0", + "opaque-debug 0.3.0", +] + +[[package]] +name = "sha3" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd26bc0e7a2e3a7c959bc494caf58b72ee0c71d67704e9520f736ca7e4853ecf" +dependencies = [ + "block-buffer 0.7.3", + "byte-tools", + "digest 0.8.1", + "keccak", + "opaque-debug 0.2.3", +] + +[[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.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f173ac3d1a7e3b28003f40de0b5ce7fe2710f9b9dc3fc38664cebee46b3b6527" + +[[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.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.4", + "redox_syscall 0.2.8", + "remove_dir_all", + "winapi", +] + +[[package]] +name = "thiserror" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa6f76457f59514c7eeb4e59d891395fab0b2fd1d40723ae737d64153392e9c6" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a36768c0fbf1bb15eca10defa29526bda730a2376c2ab4393ccfa16fb1a318d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "time" +version = "0.1.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + +[[package]] +name = "tinyvec" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b5220f05bb7de7f3f53c7c065e1199b3172696fe2db9f9c4d8ad9b4ee74c342" +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.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09adeb8c97449311ccd28a427f96fb563e7fd31aabf994189879d9da2394b89d" +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.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9ff14f98b1a4b289c6248a023c1c2fa1491062964e9fed67ab29c4e4da4a052" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "typenum" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33" + +[[package]] +name = "uint" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e11fe9a9348741cf134085ad57c249508345fe16411b3d7fb4ff2da2f1d6382e" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eeb8be209bb1c96b7c177c7420d26e04eccacb0eeae6b980e35fcb74678107e0" +dependencies = [ + "matches", +] + +[[package]] +name = "unicode-normalization" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-segmentation" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0d2e7be6ae3a5fa87eed5fb451aff96f2573d2694942e40543ae0bbe19c796" + +[[package]] +name = "unicode-xid" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" + +[[package]] +name = "url" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" +dependencies = [ + "form_urlencoded", + "idna", + "matches", + "percent-encoding", +] + +[[package]] +name = "validator" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d6937c33ec6039d8071bcf72933146b5bbe378d645d8fa59bdadabfc2a249" +dependencies = [ + "idna", + "lazy_static", + "regex", + "serde", + "serde_derive", + "serde_json", + "url", + "validator_types", +] + +[[package]] +name = "validator_types" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad9680608df133af2c1ddd5eaf1ddce91d60d61b6bc51494ef326458365a470a" + +[[package]] +name = "version_check" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" + +[[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", +] + +[[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.4", + "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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ef140f1b49946586078353a453a1d28ba90adfc54dde75710bc1931de204d68" +dependencies = [ + "leb128", +] + +[[package]] +name = "wat" +version = "1.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ec280a739b69173e0ffd12c1658507996836ba4e992ed9bc1e5385a0bd72a02" +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 = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b55551e42cbdf2ce2bedd2203d0cc08dba002c27510f86dab6d0ce304cba3dfe" +dependencies = [ + "either", + "libc", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "wyz" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85e60b0d1b5f99db2556934e21937020776a5d31520bf169e851ac44e6420214" + +[[package]] +name = "zeroize" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4756f7db3f7b5574938c3eb1c117038b8e07f95ee6718c0efad4ac21508f1efd" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2c1e130bebaeab2f23886bf9acbaca14b092408c452543c857f66399cd6dab1" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] diff --git a/generic-factory/Cargo.toml b/generic-factory/Cargo.toml new file mode 100644 index 00000000..c98d7c91 --- /dev/null +++ b/generic-factory/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "generic-factory" +version = "0.1.0" +authors = ["Illia Polosukhin "] +edition = "2018" +publish = false + +[lib] +crate-type = ["cdylib", "rlib"] + +[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 + +[dependencies] +near-sdk = "3.1.0" + +[dev-dependencies] +near-sdk-sim = "3.1.0" diff --git a/generic-factory/README.md b/generic-factory/README.md new file mode 100644 index 00000000..fb813e2c --- /dev/null +++ b/generic-factory/README.md @@ -0,0 +1,39 @@ +# Generic Factory + +Factory contract that can deploy contract as a sub-accounts with given parameters. + +Methods: + - `store(code: )` - only owner, update code inside the factory. + - `create(name: AccountId, hash: Base58CryptoHash, args: BaseU8Vec)` - creates new contract and calls `new` with given args. + +# Deployment + +## TestNet + +### Deploy factory + +``` +> near dev-deploy --wasmFile=res/generic_factory.wasm +``` + +### Store contract + +```javascript +const accountId = ""; +const contractName = ""; +const fs = require('fs'); +const account = await near.account(accountId); +const code = fs.readFileSync("../multisig/res/multisig.wasm"); +account.signAndSendTransaction( + contractName, + [ + nearAPI.transactions.functionCall("store", code, 20000000000000, "10"), + ]); +``` + +### Create new contract from factory + +``` +> export ARGS = "" | base64 +> near call create "{\"name\": \"test\", \"hash\": \"\", \"args\": \"$ARGS\"}" +``` diff --git a/generic-factory/build.sh b/generic-factory/build.sh new file mode 100755 index 00000000..c75eac72 --- /dev/null +++ b/generic-factory/build.sh @@ -0,0 +1,5 @@ +#!/bin/bash +set -e + +RUSTFLAGS='-C link-arg=-s' cargo +stable build --target wasm32-unknown-unknown --release +cp target/wasm32-unknown-unknown/release/generic_factory.wasm ./res/ diff --git a/generic-factory/res/generic_factory.wasm b/generic-factory/res/generic_factory.wasm new file mode 100755 index 0000000000000000000000000000000000000000..f8c079198811c389a3d5373ab8e6a070d163a17e GIT binary patch literal 188622 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 DayVGL literal 0 HcmV?d00001 diff --git a/generic-factory/src/lib.rs b/generic-factory/src/lib.rs new file mode 100644 index 00000000..ad52e0e8 --- /dev/null +++ b/generic-factory/src/lib.rs @@ -0,0 +1,218 @@ +use near_sdk::borsh::{self, BorshDeserialize, BorshSerialize}; +use near_sdk::env::BLOCKCHAIN_INTERFACE; +use near_sdk::json_types::{Base58CryptoHash, Base58PublicKey, Base64VecU8, U128}; +use near_sdk::serde::{Deserialize, Serialize}; +use near_sdk::{env, near_bindgen, AccountId, Balance, CryptoHash}; + +#[global_allocator] +static ALLOC: near_sdk::wee_alloc::WeeAlloc<'_> = near_sdk::wee_alloc::WeeAlloc::INIT; + +/// This gas spent on the account creation and contract deployment, the rest goes to the `new` call. +const GAS_FOR_DEPLOY: u64 = 10_000_000_000_000; + +const BLOCKCHAIN_INTERFACE_NOT_SET_ERR: &str = "Blockchain interface not set."; + +#[near_bindgen] +#[derive(BorshSerialize, BorshDeserialize)] +pub struct GenericFactory {} + +impl Default for GenericFactory { + fn default() -> Self { + GenericFactory {} + } +} + +#[derive(Serialize, Deserialize)] +#[serde(crate = "near_sdk::serde")] +#[serde(untagged)] +pub enum AccessKey { + FullAccessKey(Base58PublicKey), + FunctionCall { + public_key: Base58PublicKey, + receiver_id: AccountId, + method_names: Vec, + allowance: U128, + }, +} + +#[near_bindgen] +impl GenericFactory { + pub fn create( + &self, + name: AccountId, + hash: Base58CryptoHash, + access_keys: Vec, + method_name: Option, + args: Option, + ) { + internal_create( + &format!("{}.{}", name, env::current_account_id()), + &CryptoHash::from(hash), + access_keys, + method_name, + args.map(|args| args.0), + ); + } +} + +/// Stores attached data into blob store and returns hash of it. +/// Implemented to avoid loading the data into WASM for optimal gas usage. +#[cfg(target_arch = "wasm32")] +#[no_mangle] +pub extern "C" fn store() { + env::setup_panic_hook(); + env::set_blockchain_interface(Box::new(near_blockchain::NearBlockchain {})); + unsafe { + BLOCKCHAIN_INTERFACE.with(|b| { + // Load input into register 0. + b.borrow() + .as_ref() + .expect(BLOCKCHAIN_INTERFACE_NOT_SET_ERR) + .input(0); + // Compute sha256 hash of register 0 and store in 1. + b.borrow() + .as_ref() + .expect(BLOCKCHAIN_INTERFACE_NOT_SET_ERR) + .sha256(u64::MAX as _, 0 as _, 1); + // Check if such blob already stored. + assert_eq!( + b.borrow() + .as_ref() + .expect(BLOCKCHAIN_INTERFACE_NOT_SET_ERR) + .storage_has_key(u64::MAX as _, 1 as _), + 0, + "ERR_ALREADY_EXISTS" + ); + // Get length of the input argument and check that enough $NEAR has been attached. + let blob_len = b + .borrow() + .as_ref() + .expect(BLOCKCHAIN_INTERFACE_NOT_SET_ERR) + .register_len(0); + let storage_cost = ((blob_len + 32) as u128) * env::storage_byte_cost(); + assert!( + env::attached_deposit() >= storage_cost, + "ERR_NOT_ENOUGH_DEPOSIT:{}", + storage_cost + ); + // Store value of register 0 into key = register 1. + b.borrow() + .as_ref() + .expect(BLOCKCHAIN_INTERFACE_NOT_SET_ERR) + .storage_write(u64::MAX as _, 1 as _, u64::MAX as _, 0 as _, 2); + // Load register 1 into blob_hash and save into LookupMap. + let blob_hash = [0u8; 32]; + b.borrow() + .as_ref() + .expect(BLOCKCHAIN_INTERFACE_NOT_SET_ERR) + .read_register(1, blob_hash.as_ptr() as _); + // Return from function value of register 1. + let blob_hash_str = near_sdk::serde_json::to_string(&Base58CryptoHash::from(blob_hash)) + .unwrap() + .into_bytes(); + b.borrow() + .as_ref() + .expect(BLOCKCHAIN_INTERFACE_NOT_SET_ERR) + .value_return(blob_hash_str.len() as _, blob_hash_str.as_ptr() as _); + }); + } +} + +pub(crate) fn internal_create( + account_id: &str, + hash: &[u8], + access_keys: Vec, + method_name: Option, + args: Option>, +) { + let attached_deposit = env::attached_deposit(); + unsafe { + BLOCKCHAIN_INTERFACE.with(|b| { + // Load input (wasm code) into register 0. + b.borrow() + .as_ref() + .expect(BLOCKCHAIN_INTERFACE_NOT_SET_ERR) + .storage_read(hash.len() as _, hash.as_ptr() as _, 0); + // todo: handle missing hash to return attached deposit. + // schedule a Promise tx to account_id + let promise_id = b + .borrow() + .as_ref() + .expect(BLOCKCHAIN_INTERFACE_NOT_SET_ERR) + .promise_batch_create(account_id.len() as _, account_id.as_ptr() as _); + // create account first. + b.borrow() + .as_ref() + .expect(BLOCKCHAIN_INTERFACE_NOT_SET_ERR) + .promise_batch_action_create_account(promise_id); + // transfer attached deposit. + b.borrow() + .as_ref() + .expect(BLOCKCHAIN_INTERFACE_NOT_SET_ERR) + .promise_batch_action_transfer(promise_id, &attached_deposit as *const u128 as _); + // deploy contract (code is taken from register 0). + b.borrow() + .as_ref() + .expect(BLOCKCHAIN_INTERFACE_NOT_SET_ERR) + .promise_batch_action_deploy_contract(promise_id, u64::MAX as _, 0); + // add access keys. + for access_key in access_keys.iter() { + match access_key { + AccessKey::FullAccessKey(public_key) => b + .borrow() + .as_ref() + .expect(BLOCKCHAIN_INTERFACE_NOT_SET_ERR) + .promise_batch_action_add_key_with_full_access( + promise_id, + public_key.0.len() as _, + public_key.0.as_ptr() as _, + 0, + ), + AccessKey::FunctionCall { + public_key, + allowance, + receiver_id, + method_names, + } => b + .borrow() + .as_ref() + .expect(BLOCKCHAIN_INTERFACE_NOT_SET_ERR) + .promise_batch_action_add_key_with_function_call( + promise_id, + public_key.0.len() as _, + public_key.0.as_ptr() as _, + 0, + &allowance.0 as *const Balance as _, + receiver_id.len() as _, + receiver_id.as_ptr() as _, + method_names.len() as _, + method_names.as_ptr() as _, + ), + } + b.borrow() + .as_ref() + .expect(BLOCKCHAIN_INTERFACE_NOT_SET_ERR) + .promise_batch_action_deploy_contract(promise_id, u64::MAX as _, 0); + } + if method_name.is_some() && args.is_some() { + // call this_contract.() with remaining gas. + let attached_gas = env::prepaid_gas() - env::used_gas() - GAS_FOR_DEPLOY; + let method_name = method_name.unwrap(); + let args = args.unwrap(); + b.borrow() + .as_ref() + .expect(BLOCKCHAIN_INTERFACE_NOT_SET_ERR) + .promise_batch_action_function_call( + promise_id, + method_name.len() as _, + method_name.as_ptr() as _, + args.len() as _, + args.as_ptr() as _, + 0, + attached_gas, + ); + // todo: add callback to handle. + } + }); + } +} diff --git a/generic-factory/tests/test_basics.rs b/generic-factory/tests/test_basics.rs new file mode 100644 index 00000000..f8adcbf2 --- /dev/null +++ b/generic-factory/tests/test_basics.rs @@ -0,0 +1,44 @@ +use near_sdk::json_types::Base64VecU8; +use near_sdk::serde_json; +use near_sdk_sim::{init_simulator, to_yocto}; + +near_sdk_sim::lazy_static_include::lazy_static_include_bytes! { + WASM_BYTES => "res/generic_factory.wasm", + MULTISIG_BYTES => "../multisig/res/multisig.wasm", +} + +#[test] +fn test_upload_create() { + let root = init_simulator(None); + let factory = root.deploy(&WASM_BYTES, "xyz".to_string(), to_yocto("10")); + let hash = root + .call( + factory.account_id.clone(), + "store", + &MULTISIG_BYTES, + near_sdk_sim::DEFAULT_GAS, + to_yocto("10"), + ) + .unwrap_json::(); + let args = serde_json::to_string(&Base64VecU8::from( + "{\"num_confirmations\": 2}".as_bytes().to_vec(), + )) + .unwrap(); + let all_args = format!( + "{{\"name\": \"test\", \"hash\": \"{}\", \"method_name\": \"new\", \"args\": {}, \"access_keys\": [\"H8qfQA4p5T4rfPSrwaerWPJEzoX5xUVRWUmQDgVJkEqz\"]}}", + hash, args + ); + println!("{}", all_args); + root.call( + factory.account_id.clone(), + "create", + all_args.as_bytes(), + near_sdk_sim::DEFAULT_GAS, + to_yocto("10"), + ) + .assert_success(); + let acc = root.borrow_runtime().view_account("test.xyz").unwrap(); + assert_eq!(acc.code_hash.to_string(), hash); + // due to contract rewards. + assert!(acc.amount > to_yocto("10")); +} From bdf72f81fde5d2c3ffaf874379b5c71bb041611d Mon Sep 17 00:00:00 2001 From: AngelBlock <80400686+AngelBlock@users.noreply.github.com> Date: Thu, 17 Jun 2021 21:03:36 +0100 Subject: [PATCH 2/3] Update README.md (#150) updated `create` example --- generic-factory/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generic-factory/README.md b/generic-factory/README.md index fb813e2c..7bd8d419 100644 --- a/generic-factory/README.md +++ b/generic-factory/README.md @@ -35,5 +35,5 @@ account.signAndSendTransaction( ``` > export ARGS = "" | base64 -> near call create "{\"name\": \"test\", \"hash\": \"\", \"args\": \"$ARGS\"}" +> near call create "{\"name\": \"test\", \"hash\": \"\", \"args\": \"ARGS\",\"access_keys\": [\"\"]}" --amount 1 ``` From 14530cfe6c4018bff8456b404937a0f4117753c5 Mon Sep 17 00:00:00 2001 From: Austin Abell Date: Mon, 27 Sep 2021 01:16:47 -0400 Subject: [PATCH 3/3] refactor(generic-factory): remove need to go through BLOCKCHAIN_INTERFACE for wasm env (#149) * improve interface and remove need to go through BLOCKCHAIN_INTERFACE for wasm32 only function * update internal create to not use BLOCKCHAIN_INTERFACE for wasm env * update to 4.0.0-pre.1 to remove duplicate code --- generic-factory/Cargo.lock | 29 ++-- generic-factory/Cargo.toml | 4 +- generic-factory/src/lib.rs | 239 +++++++++++---------------- generic-factory/tests/test_basics.rs | 2 +- 4 files changed, 105 insertions(+), 169 deletions(-) diff --git a/generic-factory/Cargo.lock b/generic-factory/Cargo.lock index 4b2f4ffa..9c139d59 100644 --- a/generic-factory/Cargo.lock +++ b/generic-factory/Cargo.lock @@ -1,5 +1,7 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +version = 3 + [[package]] name = "Inflector" version = "0.11.4" @@ -1638,9 +1640,9 @@ dependencies = [ [[package]] name = "near-sdk" -version = "3.1.0" +version = "4.0.0-pre.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7383e242d3e07bf0951e8589d6eebd7f18bb1c1fc5fbec3fad796041a6aebd1" +checksum = "ce0d4d45e3cb86eb0aa25cbfe95a6f339d4c14509bc26cb259bcfa1031fff174" dependencies = [ "base64", "borsh", @@ -1648,30 +1650,19 @@ dependencies = [ "near-primitives-core", "near-sdk-macros", "near-vm-logic", + "once_cell", "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" +version = "4.0.0-pre.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2037337438f97d1ce5f7c896cf229dc56dacd5c01142d1ef95a7d778cde6ce7d" +checksum = "111ec624bb89a182c8302fde73862b5d0d88b15a87e3822e05bfa2edc08309fb" dependencies = [ - "near-sdk-core", + "Inflector", "proc-macro2", "quote", "syn", @@ -1679,9 +1670,9 @@ dependencies = [ [[package]] name = "near-sdk-sim" -version = "3.2.0" +version = "4.0.0-pre.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f9be539455733f5cff63febaee07dcdc48c0a9940856257a1989e84a5552d7a" +checksum = "29c2bc65041adc1c2735928a3422e0ca33c70656f02e9b4da79b87babdf13b30" dependencies = [ "funty", "lazy-static-include", diff --git a/generic-factory/Cargo.toml b/generic-factory/Cargo.toml index c98d7c91..13e49e83 100644 --- a/generic-factory/Cargo.toml +++ b/generic-factory/Cargo.toml @@ -18,7 +18,7 @@ panic = "abort" overflow-checks = true [dependencies] -near-sdk = "3.1.0" +near-sdk = { version = "4.0.0-pre.1", features = ["unstable"] } [dev-dependencies] -near-sdk-sim = "3.1.0" +near-sdk-sim = "4.0.0-pre.1" diff --git a/generic-factory/src/lib.rs b/generic-factory/src/lib.rs index ad52e0e8..7d9c9524 100644 --- a/generic-factory/src/lib.rs +++ b/generic-factory/src/lib.rs @@ -1,16 +1,10 @@ use near_sdk::borsh::{self, BorshDeserialize, BorshSerialize}; -use near_sdk::env::BLOCKCHAIN_INTERFACE; -use near_sdk::json_types::{Base58CryptoHash, Base58PublicKey, Base64VecU8, U128}; +use near_sdk::json_types::{Base58CryptoHash, Base64VecU8, U128}; use near_sdk::serde::{Deserialize, Serialize}; -use near_sdk::{env, near_bindgen, AccountId, Balance, CryptoHash}; - -#[global_allocator] -static ALLOC: near_sdk::wee_alloc::WeeAlloc<'_> = near_sdk::wee_alloc::WeeAlloc::INIT; +use near_sdk::{env, near_bindgen, sys, AccountId, Balance, CryptoHash, Gas, PublicKey}; /// This gas spent on the account creation and contract deployment, the rest goes to the `new` call. -const GAS_FOR_DEPLOY: u64 = 10_000_000_000_000; - -const BLOCKCHAIN_INTERFACE_NOT_SET_ERR: &str = "Blockchain interface not set."; +const GAS_FOR_DEPLOY: Gas = Gas(10_000_000_000_000); #[near_bindgen] #[derive(BorshSerialize, BorshDeserialize)] @@ -26,9 +20,9 @@ impl Default for GenericFactory { #[serde(crate = "near_sdk::serde")] #[serde(untagged)] pub enum AccessKey { - FullAccessKey(Base58PublicKey), + FullAccessKey(PublicKey), FunctionCall { - public_key: Base58PublicKey, + public_key: PublicKey, receiver_id: AccountId, method_names: Vec, allowance: U128, @@ -61,60 +55,35 @@ impl GenericFactory { #[no_mangle] pub extern "C" fn store() { env::setup_panic_hook(); - env::set_blockchain_interface(Box::new(near_blockchain::NearBlockchain {})); unsafe { - BLOCKCHAIN_INTERFACE.with(|b| { - // Load input into register 0. - b.borrow() - .as_ref() - .expect(BLOCKCHAIN_INTERFACE_NOT_SET_ERR) - .input(0); - // Compute sha256 hash of register 0 and store in 1. - b.borrow() - .as_ref() - .expect(BLOCKCHAIN_INTERFACE_NOT_SET_ERR) - .sha256(u64::MAX as _, 0 as _, 1); - // Check if such blob already stored. - assert_eq!( - b.borrow() - .as_ref() - .expect(BLOCKCHAIN_INTERFACE_NOT_SET_ERR) - .storage_has_key(u64::MAX as _, 1 as _), - 0, - "ERR_ALREADY_EXISTS" - ); - // Get length of the input argument and check that enough $NEAR has been attached. - let blob_len = b - .borrow() - .as_ref() - .expect(BLOCKCHAIN_INTERFACE_NOT_SET_ERR) - .register_len(0); - let storage_cost = ((blob_len + 32) as u128) * env::storage_byte_cost(); - assert!( - env::attached_deposit() >= storage_cost, - "ERR_NOT_ENOUGH_DEPOSIT:{}", - storage_cost - ); - // Store value of register 0 into key = register 1. - b.borrow() - .as_ref() - .expect(BLOCKCHAIN_INTERFACE_NOT_SET_ERR) - .storage_write(u64::MAX as _, 1 as _, u64::MAX as _, 0 as _, 2); - // Load register 1 into blob_hash and save into LookupMap. - let blob_hash = [0u8; 32]; - b.borrow() - .as_ref() - .expect(BLOCKCHAIN_INTERFACE_NOT_SET_ERR) - .read_register(1, blob_hash.as_ptr() as _); - // Return from function value of register 1. - let blob_hash_str = near_sdk::serde_json::to_string(&Base58CryptoHash::from(blob_hash)) - .unwrap() - .into_bytes(); - b.borrow() - .as_ref() - .expect(BLOCKCHAIN_INTERFACE_NOT_SET_ERR) - .value_return(blob_hash_str.len() as _, blob_hash_str.as_ptr() as _); - }); + // Load input into register 0. + sys::input(0); + // Compute sha256 hash of register 0 and store in 1. + sys::sha256(u64::MAX as _, 0 as _, 1); + // Check if such blob already stored. + assert_eq!( + sys::storage_has_key(u64::MAX as _, 1 as _), + 0, + "ERR_ALREADY_EXISTS" + ); + // Get length of the input argument and check that enough $NEAR has been attached. + let blob_len = sys::register_len(0); + let storage_cost = ((blob_len + 32) as u128) * env::storage_byte_cost(); + assert!( + env::attached_deposit() >= storage_cost, + "ERR_NOT_ENOUGH_DEPOSIT:{}", + storage_cost + ); + // Store value of register 0 into key = register 1. + sys::storage_write(u64::MAX as _, 1 as _, u64::MAX as _, 0 as _, 2); + // Load register 1 into blob_hash and save into LookupMap. + let blob_hash = [0u8; 32]; + sys::read_register(1, blob_hash.as_ptr() as _); + // Return from function value of register 1. + let blob_hash_str = near_sdk::serde_json::to_string(&Base58CryptoHash::from(blob_hash)) + .unwrap() + .into_bytes(); + sys::value_return(blob_hash_str.len() as _, blob_hash_str.as_ptr() as _); } } @@ -126,93 +95,69 @@ pub(crate) fn internal_create( args: Option>, ) { let attached_deposit = env::attached_deposit(); + unsafe { - BLOCKCHAIN_INTERFACE.with(|b| { - // Load input (wasm code) into register 0. - b.borrow() - .as_ref() - .expect(BLOCKCHAIN_INTERFACE_NOT_SET_ERR) - .storage_read(hash.len() as _, hash.as_ptr() as _, 0); - // todo: handle missing hash to return attached deposit. - // schedule a Promise tx to account_id - let promise_id = b - .borrow() - .as_ref() - .expect(BLOCKCHAIN_INTERFACE_NOT_SET_ERR) - .promise_batch_create(account_id.len() as _, account_id.as_ptr() as _); - // create account first. - b.borrow() - .as_ref() - .expect(BLOCKCHAIN_INTERFACE_NOT_SET_ERR) - .promise_batch_action_create_account(promise_id); - // transfer attached deposit. - b.borrow() - .as_ref() - .expect(BLOCKCHAIN_INTERFACE_NOT_SET_ERR) - .promise_batch_action_transfer(promise_id, &attached_deposit as *const u128 as _); - // deploy contract (code is taken from register 0). - b.borrow() - .as_ref() - .expect(BLOCKCHAIN_INTERFACE_NOT_SET_ERR) - .promise_batch_action_deploy_contract(promise_id, u64::MAX as _, 0); - // add access keys. - for access_key in access_keys.iter() { - match access_key { - AccessKey::FullAccessKey(public_key) => b - .borrow() - .as_ref() - .expect(BLOCKCHAIN_INTERFACE_NOT_SET_ERR) - .promise_batch_action_add_key_with_full_access( - promise_id, - public_key.0.len() as _, - public_key.0.as_ptr() as _, - 0, - ), - AccessKey::FunctionCall { - public_key, - allowance, - receiver_id, - method_names, - } => b - .borrow() - .as_ref() - .expect(BLOCKCHAIN_INTERFACE_NOT_SET_ERR) - .promise_batch_action_add_key_with_function_call( - promise_id, - public_key.0.len() as _, - public_key.0.as_ptr() as _, - 0, - &allowance.0 as *const Balance as _, - receiver_id.len() as _, - receiver_id.as_ptr() as _, - method_names.len() as _, - method_names.as_ptr() as _, - ), + // Load input (wasm code) into register 0. + sys::storage_read(hash.len() as _, hash.as_ptr() as _, 0); + // todo: handle missing hash to return attached deposit. + // schedule a Promise tx to account_id + let promise_id = sys::promise_batch_create(account_id.len() as _, account_id.as_ptr() as _); + // create account first. + sys::promise_batch_action_create_account(promise_id); + // transfer attached deposit. + sys::promise_batch_action_transfer(promise_id, &attached_deposit as *const u128 as _); + // deploy contract (code is taken from register 0). + sys::promise_batch_action_deploy_contract(promise_id, u64::MAX as _, 0); + // add access keys. + for access_key in access_keys.iter() { + match access_key { + AccessKey::FullAccessKey(public_key) => { + let public_key = public_key.as_bytes(); + sys::promise_batch_action_add_key_with_full_access( + promise_id, + public_key.len() as _, + public_key.as_ptr() as _, + 0, + ) } - b.borrow() - .as_ref() - .expect(BLOCKCHAIN_INTERFACE_NOT_SET_ERR) - .promise_batch_action_deploy_contract(promise_id, u64::MAX as _, 0); - } - if method_name.is_some() && args.is_some() { - // call this_contract.() with remaining gas. - let attached_gas = env::prepaid_gas() - env::used_gas() - GAS_FOR_DEPLOY; - let method_name = method_name.unwrap(); - let args = args.unwrap(); - b.borrow() - .as_ref() - .expect(BLOCKCHAIN_INTERFACE_NOT_SET_ERR) - .promise_batch_action_function_call( + AccessKey::FunctionCall { + public_key, + allowance, + receiver_id, + method_names, + } => { + let receiver_id = receiver_id.as_str(); + let public_key = public_key.as_bytes(); + sys::promise_batch_action_add_key_with_function_call( promise_id, - method_name.len() as _, - method_name.as_ptr() as _, - args.len() as _, - args.as_ptr() as _, + public_key.len() as _, + public_key.as_ptr() as _, 0, - attached_gas, - ); - // todo: add callback to handle. + &allowance.0 as *const Balance as _, + receiver_id.len() as _, + receiver_id.as_ptr() as _, + method_names.len() as _, + method_names.as_ptr() as _, + ) + } } - }); + sys::promise_batch_action_deploy_contract(promise_id, u64::MAX as _, 0); + } + if method_name.is_some() && args.is_some() { + // call this_contract.() with remaining gas. + let attached_gas = env::prepaid_gas() - env::used_gas() - GAS_FOR_DEPLOY; + let method_name = method_name.unwrap(); + let args = args.unwrap(); + sys::promise_batch_action_function_call( + promise_id, + method_name.len() as _, + method_name.as_ptr() as _, + args.len() as _, + args.as_ptr() as _, + 0, + attached_gas.0, + ); + // todo: add callback to handle. + } } } diff --git a/generic-factory/tests/test_basics.rs b/generic-factory/tests/test_basics.rs index f8adcbf2..552f8459 100644 --- a/generic-factory/tests/test_basics.rs +++ b/generic-factory/tests/test_basics.rs @@ -10,7 +10,7 @@ near_sdk_sim::lazy_static_include::lazy_static_include_bytes! { #[test] fn test_upload_create() { let root = init_simulator(None); - let factory = root.deploy(&WASM_BYTES, "xyz".to_string(), to_yocto("10")); + let factory = root.deploy(&WASM_BYTES, "xyz".parse().unwrap(), to_yocto("10")); let hash = root .call( factory.account_id.clone(),