diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 5bf501a4e..977470c52 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -114,6 +114,7 @@ jobs: "examples/simple_user_accounts", "examples/stable_memory", "examples/stable_structures", + "examples/stdlib", "examples/timers", "examples/tuple_types", "examples/update" @@ -162,13 +163,18 @@ jobs: uses: actions/setup-node@v3 with: node-version: 18 - - if: ${{ needs.release-candidate-deploy.outputs.should_run_tests }} - run: DFX_VERSION=0.13.1 sh -ci "$(curl -fsSL https://sdk.dfinity.org/install.sh)" # Find latest dfx version at https://raw.githubusercontent.com/dfinity/sdk/public-manifest/manifest.json - if: ${{ needs.release-candidate-deploy.outputs.should_run_tests }} uses: actions/cache@v3 with: path: ~/.config/kybra key: kybra-cargo-${{ hashFiles('kybra/cargotoml.py') }} + - if: ${{ needs.release-candidate-deploy.outputs.should_run_tests }} + uses: actions/cache@v3 + with: + path: ~/.cache/dfinity + key: kybra-dfx-0.13.1 + - if: ${{ needs.release-candidate-deploy.outputs.should_run_tests }} + run: DFX_VERSION=0.13.1 sh -ci "$(curl -fsSL https://sdk.dfinity.org/install.sh)" # Find latest dfx version at https://raw.githubusercontent.com/dfinity/sdk/public-manifest/manifest.json - if: ${{ needs.release-candidate-deploy.outputs.should_run_tests }} working-directory: ${{ matrix.example_directories }} run: curl https://pyenv.run | bash diff --git a/.gitignore b/.gitignore index 1fc532b64..16aa78ab0 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ .editorconfig .vscode/* dist +kybra/compiler/kybra_post_install/src/Lib target build kybra.egg-info diff --git a/Cargo.lock b/Cargo.lock index 992b20fba..3f563a555 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -23,12 +23,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" -[[package]] -name = "adler32" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" - [[package]] name = "ahash" version = "0.7.6" @@ -73,6 +67,12 @@ version = "1.0.65" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98161a4e3e2184da77bb14f02184cdd111e83bbbcc9979dfee3c44b9a85f5602" +[[package]] +name = "arrayvec" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" + [[package]] name = "ascii" version = "1.1.0" @@ -88,15 +88,6 @@ dependencies = [ "term", ] -[[package]] -name = "atomic" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b88d82667eca772c4aa12f0f1348b3ae643424c8876448f3f7bd5787032e234c" -dependencies = [ - "autocfg", -] - [[package]] name = "atty" version = "0.2.14" @@ -130,10 +121,10 @@ dependencies = [ ] [[package]] -name = "base64" -version = "0.13.1" +name = "beef" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" +checksum = "3a8241f3ebb85c056b509d4327ad0358fbbba6ffb340bf388f26350aeda225b1" [[package]] name = "bincode" @@ -144,6 +135,29 @@ dependencies = [ "serde", ] +[[package]] +name = "binread" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16598dfc8e6578e9b597d9910ba2e73618385dc9f4b1d43dd92c349d6be6418f" +dependencies = [ + "binread_derive", + "lazy_static", + "rustversion", +] + +[[package]] +name = "binread_derive" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d9672209df1714ee804b1f4d4f68c8eb2a90b1f7a07acf472f88ce198ef1fed" +dependencies = [ + "either", + "proc-macro2", + "quote", + "syn 1.0.99", +] + [[package]] name = "bit-set" version = "0.5.3" @@ -165,15 +179,6 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" -[[package]] -name = "blake2" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" -dependencies = [ - "digest", -] - [[package]] name = "block-buffer" version = "0.10.4" @@ -196,9 +201,95 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.12.1" +version = "3.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c6ed94e98ecff0c12dd1b04c15ec0d7d9458ca8fe806cea6f12954efe74c63b" + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "candid" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "244005a1917bb7614cd775ca8a5d59efeb5ac74397bb14ba29a19347ebd78591" +dependencies = [ + "anyhow", + "binread", + "byteorder", + "candid_derive 0.5.0", + "codespan-reporting", + "crc32fast", + "data-encoding", + "hex", + "lalrpop", + "lalrpop-util", + "leb128", + "logos", + "num-bigint", + "num-traits", + "num_enum", + "paste", + "pretty", + "serde", + "serde_bytes", + "sha2", + "thiserror", +] + +[[package]] +name = "candid" +version = "0.9.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b1ce199063694f33ffb7dd4e0ee620741495c32833cde5aa08f02a0bf96f0c8" +checksum = "2ee0d6ee2234fc18021430aad8c6125f6856407014f2c2e8baf74c236427dbfc" +dependencies = [ + "anyhow", + "binread", + "byteorder", + "candid_derive 0.6.0", + "codespan-reporting", + "crc32fast", + "data-encoding", + "hex", + "leb128", + "num-bigint", + "num-traits", + "num_enum", + "paste", + "pretty", + "serde", + "serde_bytes", + "sha2", + "stacker", + "thiserror", +] + +[[package]] +name = "candid_derive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58f1f4db7c7d04b87b70b3a35c5dc5c2c9dd73cef8bdf6760e2f18a0d45350dd" +dependencies = [ + "lazy_static", + "proc-macro2", + "quote", + "syn 1.0.99", +] + +[[package]] +name = "candid_derive" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34df46ac8b0a44de9b243d9dd21e608838183be20de408c934993ed6a4a8e4c1" +dependencies = [ + "lazy_static", + "proc-macro2", + "quote", + "syn 1.0.99", +] [[package]] name = "caseless" @@ -229,7 +320,7 @@ dependencies = [ [[package]] name = "cdk_framework" version = "0.0.0" -source = "git+https://github.com/demergent-labs/cdk_framework?rev=e53bda541935be8c8c81073351e0c533ca57647e#e53bda541935be8c8c81073351e0c533ca57647e" +source = "git+https://github.com/demergent-labs/cdk_framework?rev=e6023d9d9c58e0042c6e7249a2fe06c6ee0248fa#e6023d9d9c58e0042c6e7249a2fe06c6ee0248fa" dependencies = [ "proc-macro2", "quote", @@ -248,12 +339,10 @@ version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" dependencies = [ - "js-sys", "libc", "num-integer", "num-traits", "time", - "wasm-bindgen", "winapi", ] @@ -284,21 +373,15 @@ dependencies = [ ] [[package]] -name = "core-foundation" -version = "0.9.3" +name = "codespan-reporting" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" dependencies = [ - "core-foundation-sys", - "libc", + "termcolor", + "unicode-width", ] -[[package]] -name = "core-foundation-sys" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" - [[package]] name = "cpufeatures" version = "0.2.7" @@ -343,13 +426,10 @@ dependencies = [ ] [[package]] -name = "csv-core" -version = "0.1.10" +name = "data-encoding" +version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90" -dependencies = [ - "memchr", -] +checksum = "23d8666cb01533c39dde32bcbab8e227b4ed6679b2c925eba05feabea39508fb" [[package]] name = "diff" @@ -365,7 +445,15 @@ checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" dependencies = [ "block-buffer", "crypto-common", - "subtle", +] + +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys", ] [[package]] @@ -379,34 +467,28 @@ dependencies = [ ] [[package]] -name = "dirs-sys-next" -version = "0.1.2" +name = "dirs-sys" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" dependencies = [ "libc", + "option-ext", "redox_users", - "winapi", + "windows-sys 0.48.0", ] [[package]] -name = "dns-lookup" -version = "1.0.8" +name = "dirs-sys-next" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53ecafc952c4528d9b51a458d1a8904b81783feff9fde08ab6ed2545ff396872" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" dependencies = [ - "cfg-if", "libc", - "socket2", + "redox_users", "winapi", ] -[[package]] -name = "dyn-clone" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68b0cf012f1230e43cd00ebb729c6bb58707ecfa8ad08b52ef3a4ccd2697fc30" - [[package]] name = "either" version = "1.8.0" @@ -503,14 +585,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] -name = "flate2" -version = "1.0.25" +name = "fnv" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8a2db397cb1c8772f31494cb8917e48cd1e64f0fa7efac59fbd741a0a8ce841" -dependencies = [ - "crc32fast", - "miniz_oxide", -] +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" [[package]] name = "generic-array" @@ -522,16 +606,6 @@ dependencies = [ "version_check", ] -[[package]] -name = "gethostname" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1ebd34e35c46e00bb73e81363248d627782724609fe1b6396f553f68fe3862e" -dependencies = [ - "libc", - "winapi", -] - [[package]] name = "getrandom" version = "0.2.7" @@ -539,10 +613,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" dependencies = [ "cfg-if", - "js-sys", "libc", "wasi 0.11.0+wasi-snapshot-preview1", - "wasm-bindgen", ] [[package]] @@ -611,6 +683,59 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" +[[package]] +name = "ic-cdk" +version = "0.8.0-beta.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "229a2796b731794363b45ab7b3a8ae28dc4220256997709e52746887425c5135" +dependencies = [ + "candid 0.9.0-beta.3", + "ic-cdk-macros 0.8.0-beta.0", + "ic0", + "serde", + "serde_bytes", +] + +[[package]] +name = "ic-cdk-macros" +version = "0.6.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebf50458685a0fc6b0e414cdba487610aeb199ac94db52d9fd76270565debee7" +dependencies = [ + "candid 0.8.4", + "proc-macro2", + "quote", + "serde", + "serde_tokenstream", + "syn 1.0.99", +] + +[[package]] +name = "ic-cdk-macros" +version = "0.8.0-beta.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8ed566a9a45e97f8dd7eed3db58c95875272dbf053f0d94a965319cbffdb9e0" +dependencies = [ + "candid 0.9.0-beta.3", + "proc-macro2", + "quote", + "serde", + "serde_tokenstream", + "syn 1.0.99", +] + +[[package]] +name = "ic-stable-structures" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4e026318236de13568edafd85534ad29910908bf08cdcf177d4403fd4a5f6c4" + +[[package]] +name = "ic0" +version = "0.18.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978b91fc78de9d2eb0144db717839cde3b35470199ea51aca362cb6310e93dfd" + [[package]] name = "indexmap" version = "1.9.3" @@ -675,24 +800,6 @@ dependencies = [ "either", ] -[[package]] -name = "js-sys" -version = "0.3.61" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "keccak" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3afef3b6eff9ce9d8ff9b3601125eec7f0c8cbac7abd14f355d053fa56c98768" -dependencies = [ - "cpufeatures", -] - [[package]] name = "kybra-vm-value-derive" version = "0.0.0" @@ -703,38 +810,52 @@ dependencies = [ "syn 1.0.99", ] +[[package]] +name = "kybra_deployer" +version = "0.0.0" +dependencies = [ + "hex", + "ic-cdk", + "ic-cdk-macros 0.6.10", + "ic-stable-structures", + "sha2", + "shared_utils", +] + [[package]] name = "kybra_generate" version = "0.0.0" dependencies = [ "annotate-snippets", "backtrace", - "cdk_framework 0.0.0 (git+https://github.com/demergent-labs/cdk_framework?rev=e53bda541935be8c8c81073351e0c533ca57647e)", + "cdk_framework 0.0.0 (git+https://github.com/demergent-labs/cdk_framework?rev=e6023d9d9c58e0042c6e7249a2fe06c6ee0248fa)", "num-bigint", "proc-macro2", "quote", "regex", "rustpython-parser 0.1.2", + "shared_utils", "syn 1.0.99", ] [[package]] -name = "kybra_modules_init" +name = "kybra_post_install" version = "0.0.0" dependencies = [ + "dirs", + "fs_extra", + "hex", "rustpython", - "rustpython-derive", - "rustpython-pylib", - "rustpython-stdlib", "rustpython-vm", + "sha2", "tempfile", ] [[package]] name = "lalrpop" -version = "0.19.10" +version = "0.19.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ada7ece1f5bc6d36eec2a4dc204135f14888209b3773df8fefcfe990fd4cbc" +checksum = "f34313ec00c2eb5c3c87ca6732ea02dcf3af99c3ff7a8fb622ffb99c9d860a87" dependencies = [ "ascii-canvas", "bit-set", @@ -768,6 +889,12 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +[[package]] +name = "leb128" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" + [[package]] name = "lexical-parse-float" version = "0.8.5" @@ -804,17 +931,6 @@ version = "0.2.142" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a987beff54b60ffa6d51982e1aa1146bc42f19bd26be28b0586f252fccf5317" -[[package]] -name = "libsqlite3-sys" -version = "0.25.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29f835d03d717946d28b1d1ed632eb6f0e24a299388ee623d0c23118d3e8a7fa" -dependencies = [ - "cc", - "pkg-config", - "vcpkg", -] - [[package]] name = "linux-raw-sys" version = "0.3.4" @@ -841,22 +957,35 @@ dependencies = [ ] [[package]] -name = "lz4_flex" -version = "0.9.5" +name = "logos" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a8cbbb2831780bc3b9c15a41f5b49222ef756b6730a95f3decfdd15903eb5a3" +checksum = "bf8b031682c67a8e3d5446840f9573eb7fe26efe7ec8d195c9ac4c0647c502f1" dependencies = [ - "twox-hash", + "logos-derive", ] [[package]] -name = "mac_address" -version = "1.1.4" +name = "logos-derive" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b238e3235c8382b7653c6408ed1b08dd379bdb9fdf990fb0bbae3db2cc0ae963" +checksum = "a1d849148dbaf9661a6151d1ca82b13bb4c4c128146a88d05253b38d4e2f496c" dependencies = [ - "nix 0.23.2", - "winapi", + "beef", + "fnv", + "proc-macro2", + "quote", + "regex-syntax", + "syn 1.0.99", +] + +[[package]] +name = "lz4_flex" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a8cbbb2831780bc3b9c15a41f5b49222ef756b6730a95f3decfdd15903eb5a3" +dependencies = [ + "twox-hash", ] [[package]] @@ -871,30 +1000,12 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" -[[package]] -name = "md-5" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6365506850d44bff6e2fbcb5176cf63650e48bd45ef2fe2665ae1570e0f4b9ca" -dependencies = [ - "digest", -] - [[package]] name = "memchr" version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" -[[package]] -name = "memmap2" -version = "0.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" -dependencies = [ - "libc", -] - [[package]] name = "memoffset" version = "0.6.5" @@ -922,15 +1033,6 @@ dependencies = [ "adler", ] -[[package]] -name = "mt19937" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12ca7f22ed370d5991a9caec16a83187e865bc8a532f889670337d5a5689e3a1" -dependencies = [ - "rand_core", -] - [[package]] name = "new_debug_unreachable" version = "1.0.4" @@ -946,19 +1048,6 @@ dependencies = [ "smallvec", ] -[[package]] -name = "nix" -version = "0.23.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f3790c00a0150112de0f4cd161e3d7fc4b2d8a5542ffc35f099a2562aecb35c" -dependencies = [ - "bitflags", - "cc", - "cfg-if", - "libc", - "memoffset 0.6.5", -] - [[package]] name = "nix" version = "0.26.2" @@ -1073,20 +1162,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e82dad04139b71a90c080c8463fe0dc7902db5192d939bd0950f074d014339e1" [[package]] -name = "optional" -version = "0.5.0" +name = "option-ext" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978aa494585d3ca4ad74929863093e87cac9790d81fe7aba2b3dc2890643a0fc" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" [[package]] -name = "page_size" -version = "0.4.2" +name = "optional" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eebde548fbbf1ea81a99b128872779c437752fb99f217c45245e1a61dcd9edcd" -dependencies = [ - "libc", - "winapi", -] +checksum = "978aa494585d3ca4ad74929863093e87cac9790d81fe7aba2b3dc2890643a0fc" [[package]] name = "parking_lot" @@ -1205,9 +1290,9 @@ dependencies = [ [[package]] name = "pico-args" -version = "0.5.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" +checksum = "db8bcd96cb740d03149cbad5518db9fd87126a10ab519c011893b1754134c468" [[package]] name = "pin-utils" @@ -1215,12 +1300,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" -[[package]] -name = "pkg-config" -version = "0.3.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" - [[package]] name = "pmutil" version = "0.5.3" @@ -1244,6 +1323,16 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" +[[package]] +name = "pretty" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad9940b913ee56ddd94aec2d3cd179dd47068236f42a1a6415ccf9d880ce2a61" +dependencies = [ + "arrayvec", + "typed-arena", +] + [[package]] name = "proc-macro-crate" version = "1.3.1" @@ -1264,10 +1353,13 @@ dependencies = [ ] [[package]] -name = "puruspe" -version = "0.1.5" +name = "psm" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b7e158a385023d209d6d5f2585c4b468f6dcb3dd5aca9b75c4f1678c05bb375" +checksum = "5787f7cda34e3033a72192c018bc5883100330f362ef279a8cbccfce8bb4e874" +dependencies = [ + "cc", +] [[package]] name = "quote" @@ -1436,7 +1528,7 @@ dependencies = [ [[package]] name = "rustpython" version = "0.2.0" -source = "git+https://github.com/RustPython/RustPython?rev=c9546c2419f2e4db7e2987f30f0508dc29b30035#c9546c2419f2e4db7e2987f30f0508dc29b30035" +source = "git+https://github.com/demergent-labs/RustPython?rev=b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874#b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874" dependencies = [ "atty", "cfg-if", @@ -1447,8 +1539,6 @@ dependencies = [ "log", "rustpython-compiler", "rustpython-parser 0.2.0", - "rustpython-pylib", - "rustpython-stdlib", "rustpython-vm", "rustyline", ] @@ -1465,7 +1555,7 @@ dependencies = [ [[package]] name = "rustpython-ast" version = "0.2.0" -source = "git+https://github.com/RustPython/RustPython?rev=c9546c2419f2e4db7e2987f30f0508dc29b30035#c9546c2419f2e4db7e2987f30f0508dc29b30035" +source = "git+https://github.com/demergent-labs/RustPython?rev=b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874#b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874" dependencies = [ "num-bigint", "rustpython-common", @@ -1475,7 +1565,7 @@ dependencies = [ [[package]] name = "rustpython-codegen" version = "0.2.0" -source = "git+https://github.com/RustPython/RustPython?rev=c9546c2419f2e4db7e2987f30f0508dc29b30035#c9546c2419f2e4db7e2987f30f0508dc29b30035" +source = "git+https://github.com/demergent-labs/RustPython?rev=b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874#b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874" dependencies = [ "ahash", "bitflags", @@ -1491,7 +1581,7 @@ dependencies = [ [[package]] name = "rustpython-common" version = "0.2.0" -source = "git+https://github.com/RustPython/RustPython?rev=c9546c2419f2e4db7e2987f30f0508dc29b30035#c9546c2419f2e4db7e2987f30f0508dc29b30035" +source = "git+https://github.com/demergent-labs/RustPython?rev=b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874#b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874" dependencies = [ "ascii", "bitflags", @@ -1517,7 +1607,7 @@ dependencies = [ [[package]] name = "rustpython-compiler" version = "0.2.0" -source = "git+https://github.com/RustPython/RustPython?rev=c9546c2419f2e4db7e2987f30f0508dc29b30035#c9546c2419f2e4db7e2987f30f0508dc29b30035" +source = "git+https://github.com/demergent-labs/RustPython?rev=b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874#b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874" dependencies = [ "rustpython-codegen", "rustpython-compiler-core 0.2.0", @@ -1544,7 +1634,7 @@ dependencies = [ [[package]] name = "rustpython-compiler-core" version = "0.2.0" -source = "git+https://github.com/RustPython/RustPython?rev=c9546c2419f2e4db7e2987f30f0508dc29b30035#c9546c2419f2e4db7e2987f30f0508dc29b30035" +source = "git+https://github.com/demergent-labs/RustPython?rev=b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874#b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874" dependencies = [ "bitflags", "bstr", @@ -1557,7 +1647,7 @@ dependencies = [ [[package]] name = "rustpython-derive" version = "0.2.0" -source = "git+https://github.com/RustPython/RustPython?rev=c9546c2419f2e4db7e2987f30f0508dc29b30035#c9546c2419f2e4db7e2987f30f0508dc29b30035" +source = "git+https://github.com/demergent-labs/RustPython?rev=b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874#b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874" dependencies = [ "rustpython-compiler", "rustpython-derive-impl", @@ -1567,7 +1657,7 @@ dependencies = [ [[package]] name = "rustpython-derive-impl" version = "0.2.0" -source = "git+https://github.com/RustPython/RustPython?rev=c9546c2419f2e4db7e2987f30f0508dc29b30035#c9546c2419f2e4db7e2987f30f0508dc29b30035" +source = "git+https://github.com/demergent-labs/RustPython?rev=b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874#b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874" dependencies = [ "indexmap", "itertools", @@ -1616,7 +1706,7 @@ dependencies = [ [[package]] name = "rustpython-parser" version = "0.2.0" -source = "git+https://github.com/RustPython/RustPython?rev=c9546c2419f2e4db7e2987f30f0508dc29b30035#c9546c2419f2e4db7e2987f30f0508dc29b30035" +source = "git+https://github.com/demergent-labs/RustPython?rev=b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874#b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874" dependencies = [ "ahash", "anyhow", @@ -1637,87 +1727,10 @@ dependencies = [ "unicode_names2 0.6.0", ] -[[package]] -name = "rustpython-pylib" -version = "0.2.0" -source = "git+https://github.com/RustPython/RustPython?rev=c9546c2419f2e4db7e2987f30f0508dc29b30035#c9546c2419f2e4db7e2987f30f0508dc29b30035" -dependencies = [ - "glob", - "rustpython-compiler-core 0.2.0", - "rustpython-derive", -] - -[[package]] -name = "rustpython-stdlib" -version = "0.2.0" -source = "git+https://github.com/RustPython/RustPython?rev=c9546c2419f2e4db7e2987f30f0508dc29b30035#c9546c2419f2e4db7e2987f30f0508dc29b30035" -dependencies = [ - "adler32", - "ahash", - "ascii", - "base64", - "blake2", - "cfg-if", - "crc32fast", - "crossbeam-utils", - "csv-core", - "digest", - "dns-lookup", - "dyn-clone", - "flate2", - "gethostname", - "hex", - "itertools", - "libc", - "libsqlite3-sys", - "mac_address", - "md-5", - "memchr", - "memmap2", - "mt19937", - "nix 0.26.2", - "num-bigint", - "num-complex", - "num-integer", - "num-rational", - "num-traits", - "num_enum", - "once_cell", - "page_size", - "parking_lot", - "paste", - "puruspe", - "rand", - "rand_core", - "rustpython-common", - "rustpython-derive", - "rustpython-vm", - "schannel", - "sha-1", - "sha2", - "sha3", - "socket2", - "system-configuration", - "termios", - "ucd", - "unic-char-property", - "unic-normal", - "unic-ucd-age", - "unic-ucd-bidi", - "unic-ucd-category", - "unic-ucd-ident", - "unicode-casing", - "unicode_names2 0.6.0", - "uuid", - "widestring", - "winapi", - "xml-rs", -] - [[package]] name = "rustpython-vm" version = "0.2.0" -source = "git+https://github.com/RustPython/RustPython?rev=c9546c2419f2e4db7e2987f30f0508dc29b30035#c9546c2419f2e4db7e2987f30f0508dc29b30035" +source = "git+https://github.com/demergent-labs/RustPython?rev=b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874#b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874" dependencies = [ "ahash", "ascii", @@ -1740,7 +1753,7 @@ dependencies = [ "log", "memchr", "memoffset 0.6.5", - "nix 0.26.2", + "nix", "num-bigint", "num-complex", "num-integer", @@ -1805,7 +1818,7 @@ dependencies = [ "libc", "log", "memchr", - "nix 0.26.2", + "nix", "radix_trie", "scopeguard", "unicode-segmentation", @@ -1844,6 +1857,15 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "serde_bytes" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "416bda436f9aab92e02c8e10d49a15ddd339cea90b6e340fe51ed97abb548294" +dependencies = [ + "serde", +] + [[package]] name = "serde_derive" version = "1.0.160" @@ -1856,14 +1878,14 @@ dependencies = [ ] [[package]] -name = "sha-1" -version = "0.10.1" +name = "serde_tokenstream" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5058ada175748e33390e40e872bd0fe59a19f265d0158daa551c5a88a76009c" +checksum = "797ba1d80299b264f3aac68ab5d12e5825a561749db4df7cd7c8083900c5d4e9" dependencies = [ - "cfg-if", - "cpufeatures", - "digest", + "proc-macro2", + "serde", + "syn 1.0.99", ] [[package]] @@ -1878,14 +1900,8 @@ dependencies = [ ] [[package]] -name = "sha3" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54c2bb1a323307527314a36bfb73f24febb08ce2b8a554bf4ffd6f51ad15198c" -dependencies = [ - "digest", - "keccak", -] +name = "shared_utils" +version = "0.0.0" [[package]] name = "siphasher" @@ -1899,16 +1915,6 @@ version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" -[[package]] -name = "socket2" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" -dependencies = [ - "libc", - "winapi", -] - [[package]] name = "sre-engine" version = "0.4.1" @@ -1920,6 +1926,19 @@ dependencies = [ "optional", ] +[[package]] +name = "stacker" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c886bd4480155fd3ef527d45e9ac8dd7118a898a46530b7b94c3e21866259fce" +dependencies = [ + "cc", + "cfg-if", + "libc", + "psm", + "winapi", +] + [[package]] name = "static_assertions" version = "1.1.0" @@ -1970,12 +1989,6 @@ dependencies = [ "syn 1.0.99", ] -[[package]] -name = "subtle" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" - [[package]] name = "syn" version = "1.0.99" @@ -2007,27 +2020,6 @@ dependencies = [ "syn 1.0.99", ] -[[package]] -name = "system-configuration" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75182f12f490e953596550b65ee31bda7c8e043d9386174b353bda50838c3fd" -dependencies = [ - "bitflags", - "core-foundation", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "tempfile" version = "3.5.0" @@ -2061,15 +2053,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "termios" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "411c5bf740737c7918b8b1fe232dca4dc9f8e754b8ad5e20966814001ed0ac6b" -dependencies = [ - "libc", -] - [[package]] name = "textwrap" version = "0.11.0" @@ -2184,16 +2167,16 @@ dependencies = [ ] [[package]] -name = "typenum" -version = "1.16.0" +name = "typed-arena" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" +checksum = "6af6ae20167a9ece4bcb41af5b80f8a1f1df981f6391189ce00fd257af04126a" [[package]] -name = "ucd" -version = "0.1.1" +name = "typenum" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe4fa6e588762366f1eb4991ce59ad1b93651d0b769dfb4e4d1c5c4b943d1159" +checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" [[package]] name = "uname" @@ -2236,26 +2219,6 @@ dependencies = [ "unic-ucd-version", ] -[[package]] -name = "unic-normal" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f09d64d33589a94628bc2aeb037f35c2e25f3f049c7348b5aa5580b48e6bba62" -dependencies = [ - "unic-ucd-normal", -] - -[[package]] -name = "unic-ucd-age" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8cfdfe71af46b871dc6af2c24fcd360e2f3392ee4c5111877f2947f311671c" -dependencies = [ - "unic-char-property", - "unic-char-range", - "unic-ucd-version", -] - [[package]] name = "unic-ucd-bidi" version = "0.9.0" @@ -2279,15 +2242,6 @@ dependencies = [ "unic-ucd-version", ] -[[package]] -name = "unic-ucd-hangul" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb1dc690e19010e1523edb9713224cba5ef55b54894fe33424439ec9a40c0054" -dependencies = [ - "unic-ucd-version", -] - [[package]] name = "unic-ucd-ident" version = "0.9.0" @@ -2299,18 +2253,6 @@ dependencies = [ "unic-ucd-version", ] -[[package]] -name = "unic-ucd-normal" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86aed873b8202d22b13859dda5fe7c001d271412c31d411fd9b827e030569410" -dependencies = [ - "unic-char-property", - "unic-char-range", - "unic-ucd-hangul", - "unic-ucd-version", -] - [[package]] name = "unic-ucd-version" version = "0.9.0" @@ -2379,35 +2321,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" -[[package]] -name = "uuid" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b55a3fef2a1e3b3a00ce878640918820d3c51081576ac657d23af9fc7928fdb" -dependencies = [ - "atomic", - "getrandom", - "rand", - "uuid-macro-internal", -] - -[[package]] -name = "uuid-macro-internal" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20e8a505384e9309dc842520c6c9348f4b141dee06aaa845522727b1b99ca235" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.15", -] - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - [[package]] name = "vec_map" version = "0.8.2" @@ -2440,9 +2353,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.84" +version = "0.2.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" +checksum = "5b6cb788c4e39112fbe1822277ef6fb3c55cd86b95cb3d3c4c1c9597e4ac74b4" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -2450,24 +2363,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.84" +version = "0.2.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" +checksum = "35e522ed4105a9d626d885b35d62501b30d9666283a5c8be12c14a8bdafe7822" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 1.0.99", + "syn 2.0.15", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.84" +version = "0.2.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" +checksum = "358a79a0cb89d21db8120cbfb91392335913e4890665b1a7981d9e956903b434" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2475,22 +2388,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.84" +version = "0.2.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" +checksum = "4783ce29f09b9d93134d41297aded3a712b7b979e9c6f28c32cb88c973a94869" dependencies = [ "proc-macro2", "quote", - "syn 1.0.99", + "syn 2.0.15", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.84" +version = "0.2.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" +checksum = "a901d592cafaa4d711bc324edfaff879ac700b19c3dfd60058d2b445be2691eb" [[package]] name = "which" @@ -2732,9 +2645,9 @@ checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "winnow" -version = "0.4.1" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae8970b36c66498d8ff1d66685dc86b91b29db0c7739899012f63a63814b4b28" +checksum = "61de7bac303dc551fe038e2b3cef0f571087a47571ea6e79a87692ac99b99699" dependencies = [ "memchr", ] @@ -2747,9 +2660,3 @@ checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" dependencies = [ "winapi", ] - -[[package]] -name = "xml-rs" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2d7d3948613f75c98fd9328cfdcc45acc4d360655289d0a7d4ec931392200a3" diff --git a/Cargo.toml b/Cargo.toml index b120fd655..abf9c7f0f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,7 +2,8 @@ members = [ "kybra/compiler/kybra_generate", "kybra/compiler/kybra_vm_value_derive", - "kybra/compiler/kybra_modules_init" + "kybra/compiler/kybra_post_install", + "kybra/compiler/kybra_deployer" ] exclude = ["examples"] edition = "2018" diff --git a/examples/annotated_tests/src/main.py b/examples/annotated_tests/src/main.py index 85355acfd..176a1489e 100644 --- a/examples/annotated_tests/src/main.py +++ b/examples/annotated_tests/src/main.py @@ -3,7 +3,7 @@ stable_map0: StableBTreeMap[nat8, str] = StableBTreeMap[nat8, str]( - memory_id=0, max_key_size=100, max_value_size=100 + memory_id=3, max_key_size=100, max_value_size=100 ) diff --git a/examples/annotated_tests/test/package.json b/examples/annotated_tests/test/package.json index 9ac036219..9947e296c 100644 --- a/examples/annotated_tests/test/package.json +++ b/examples/annotated_tests/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.11.1", diff --git a/examples/audio_recorder/src/main.py b/examples/audio_recorder/src/main.py index d74221fe4..eac9843ad 100644 --- a/examples/audio_recorder/src/main.py +++ b/examples/audio_recorder/src/main.py @@ -32,10 +32,10 @@ class Recording(Record): users = StableBTreeMap[Principal, User]( - memory_id=0, max_key_size=38, max_value_size=100_000 + memory_id=3, max_key_size=38, max_value_size=100_000 ) recordings = StableBTreeMap[Principal, Recording]( - memory_id=1, max_key_size=38, max_value_size=5_000_000 + memory_id=4, max_key_size=38, max_value_size=5_000_000 ) diff --git a/examples/audio_recorder/test/package.json b/examples/audio_recorder/test/package.json index 9ac036219..9947e296c 100644 --- a/examples/audio_recorder/test/package.json +++ b/examples/audio_recorder/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.11.1", diff --git a/examples/bitcoin/test/package.json b/examples/bitcoin/test/package.json index 06a01ad51..7c40da0e3 100644 --- a/examples/bitcoin/test/package.json +++ b/examples/bitcoin/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.14.1", diff --git a/examples/blob_array/test/package-lock.json b/examples/blob_array/test/package-lock.json index 12f7a0434..87c08d8b5 100644 --- a/examples/blob_array/test/package-lock.json +++ b/examples/blob_array/test/package-lock.json @@ -1256,7 +1256,7 @@ }, "azle": { "version": "git+ssh://git@github.com/demergent-labs/azle.git#65fdc9cd1b52960974bd79f4ebf0dfa70e6ee3e7", - "from": "azle@https://github.com/demergent-labs/azle", + "from": "azle@github:demergent-labs/azle", "requires": { "@dfinity/principal": "0.11.2", "@swc/core": "1.2.151", diff --git a/examples/blob_array/test/package.json b/examples/blob_array/test/package.json index 9ac036219..9947e296c 100644 --- a/examples/blob_array/test/package.json +++ b/examples/blob_array/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.11.1", diff --git a/examples/bytes/test/package.json b/examples/bytes/test/package.json index 9ac036219..9947e296c 100644 --- a/examples/bytes/test/package.json +++ b/examples/bytes/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.11.1", diff --git a/examples/call_raw/test/package.json b/examples/call_raw/test/package.json index 9ac036219..9947e296c 100644 --- a/examples/call_raw/test/package.json +++ b/examples/call_raw/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.11.1", diff --git a/examples/candid_encoding/test/package.json b/examples/candid_encoding/test/package.json index 9ac036219..9947e296c 100644 --- a/examples/candid_encoding/test/package.json +++ b/examples/candid_encoding/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.11.1", diff --git a/examples/complex_init/dfx.json b/examples/complex_init/dfx.json index b41e40a0a..3c679bce1 100644 --- a/examples/complex_init/dfx.json +++ b/examples/complex_init/dfx.json @@ -12,4 +12,4 @@ } } } -} \ No newline at end of file +} diff --git a/examples/complex_init/test/package.json b/examples/complex_init/test/package.json index 06a01ad51..7c40da0e3 100644 --- a/examples/complex_init/test/package.json +++ b/examples/complex_init/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.14.1", diff --git a/examples/complex_types/test/package.json b/examples/complex_types/test/package.json index 9ac036219..9947e296c 100644 --- a/examples/complex_types/test/package.json +++ b/examples/complex_types/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.11.1", diff --git a/examples/composite_queries/test/package-lock.json b/examples/composite_queries/test/package-lock.json index 8f3b3b208..5a4297aae 100644 --- a/examples/composite_queries/test/package-lock.json +++ b/examples/composite_queries/test/package-lock.json @@ -1588,7 +1588,7 @@ }, "azle": { "version": "git+ssh://git@github.com/demergent-labs/azle.git#65fdc9cd1b52960974bd79f4ebf0dfa70e6ee3e7", - "from": "azle@https://github.com/demergent-labs/azle", + "from": "azle@github:demergent-labs/azle", "requires": { "@dfinity/principal": "0.11.2", "@swc/core": "1.2.151", diff --git a/examples/composite_queries/test/package.json b/examples/composite_queries/test/package.json index 06a01ad51..7c40da0e3 100644 --- a/examples/composite_queries/test/package.json +++ b/examples/composite_queries/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.14.1", diff --git a/examples/counter/test/package.json b/examples/counter/test/package.json index 9ac036219..9947e296c 100644 --- a/examples/counter/test/package.json +++ b/examples/counter/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.11.1", diff --git a/examples/cross_canister_calls/test/package.json b/examples/cross_canister_calls/test/package.json index 9ac036219..9947e296c 100644 --- a/examples/cross_canister_calls/test/package.json +++ b/examples/cross_canister_calls/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.11.1", diff --git a/examples/cycles/test/package.json b/examples/cycles/test/package.json index 9ac036219..9947e296c 100644 --- a/examples/cycles/test/package.json +++ b/examples/cycles/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.11.1", diff --git a/examples/date/src/main.did b/examples/date/src/main.did index e8b62160b..04dbf6cdf 100644 --- a/examples/date/src/main.did +++ b/examples/date/src/main.did @@ -1,4 +1,12 @@ service : () -> { - get_strftime : () -> (text) query; - get_time : () -> (float64) query; + get_date : (text) -> (int) query; + get_day : (text) -> (int) query; + get_full_year : (text) -> (int) query; + get_hours : (text) -> (int) query; + get_milliseconds : (text) -> (int) query; + get_minutes : (text) -> (int) query; + get_month : (text) -> (int) query; + get_seconds : (text) -> (int) query; + get_time : (text) -> (int) query; + get_timezone_offset : (text) -> (int) query; } \ No newline at end of file diff --git a/examples/date/src/main.py b/examples/date/src/main.py index f3a3becb6..5acbb29a5 100644 --- a/examples/date/src/main.py +++ b/examples/date/src/main.py @@ -1,13 +1,60 @@ -# TODO Update this example to match the Azle date example more closely once we can support datetime +from datetime import datetime +from kybra import query -from kybra import float64, query -from time import gmtime, strftime, time +@query +def get_date(isoString: str) -> int: + return datetime.fromisoformat(isoString).day + @query -def get_time() -> float64: - return time() +def get_day(isoString: str) -> int: + return datetime.fromisoformat(isoString).weekday() + @query -def get_strftime() -> str: - return strftime("%a %b %d %Y", gmtime()) +def get_full_year(isoString: str) -> int: + return datetime.fromisoformat(isoString).year + + +@query +def get_hours(isoString: str) -> int: + return datetime.fromisoformat(isoString).hour + + +@query +def get_milliseconds(isoString: str) -> int: + dt = datetime.fromisoformat(isoString) + return dt.microsecond // 1000 + + +@query +def get_minutes(isoString: str) -> int: + return datetime.fromisoformat(isoString).minute + + +@query +def get_month(isoString: str) -> int: + return datetime.fromisoformat(isoString).month + + +@query +def get_seconds(isoString: str) -> int: + return datetime.fromisoformat(isoString).second + + +@query +def get_time(isoString: str) -> int: + dt = datetime.fromisoformat(isoString) + return int(dt.timestamp() * 1000) + + +@query +def get_timezone_offset(isoString: str) -> int: + dt = datetime.fromisoformat(isoString) + utcoffset = dt.utcoffset() + + if utcoffset is None: + return 0 + else: + return int(utcoffset.total_seconds() / 60) if dt.tzinfo else 0 diff --git a/examples/date/test/package-lock.json b/examples/date/test/package-lock.json index d23a58f03..f531f5a88 100644 --- a/examples/date/test/package-lock.json +++ b/examples/date/test/package-lock.json @@ -1256,7 +1256,7 @@ }, "azle": { "version": "git+ssh://git@github.com/demergent-labs/azle.git#65fdc9cd1b52960974bd79f4ebf0dfa70e6ee3e7", - "from": "azle@https://github.com/demergent-labs/azle", + "from": "azle@github:demergent-labs/azle", "requires": { "@dfinity/principal": "0.11.2", "@swc/core": "1.2.151", diff --git a/examples/date/test/package.json b/examples/date/test/package.json index 9ac036219..9947e296c 100644 --- a/examples/date/test/package.json +++ b/examples/date/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.11.1", diff --git a/examples/date/test/pretest.ts b/examples/date/test/pretest.ts index 2128aba37..93e77f85a 100644 --- a/examples/date/test/pretest.ts +++ b/examples/date/test/pretest.ts @@ -2,15 +2,12 @@ import { execSync } from 'child_process'; async function pretest() { await new Promise((resolve) => setTimeout(resolve, 5000)); - execSync(`dfx canister uninstall-code date || true`, { stdio: 'inherit' }); - execSync(`dfx deploy`, { stdio: 'inherit' }); - execSync(`dfx generate`, { stdio: 'inherit' }); diff --git a/examples/date/test/test.ts b/examples/date/test/test.ts index 8fb4842ed..de30d1a3e 100644 --- a/examples/date/test/test.ts +++ b/examples/date/test/test.ts @@ -1,6 +1,6 @@ -import { createSnakeCaseProxy, runTests, Test } from 'azle/test'; -import { getTests } from 'azle/examples/date/test/tests'; +import { runTests, Test } from 'azle/test'; import { createActor } from './dfx_generated/date'; +import { getTests } from './tests'; const dateCanister = createActor('rrkah-fqaaa-aaaaa-aaaaq-cai', { agentOptions: { @@ -8,32 +8,6 @@ const dateCanister = createActor('rrkah-fqaaa-aaaaa-aaaaq-cai', { } }); -const tests: Test[] = [ - // ...getTests(createSnakeCaseProxy(dateCanister)), - { - name: 'get_time', - test: async () => { - const result = await dateCanister.get_time(); - - const seconds = new Date().getTime() / 1_000; - - return { - Ok: seconds - result < 10 - }; - } - }, - { - name: 'get_strftime', - test: async () => { - const result = await dateCanister.get_strftime(); - - const now = new Date().toDateString(); - - return { - Ok: result === now - }; - } - } -]; +const tests: Test[] = getTests(dateCanister); runTests(tests); diff --git a/examples/date/test/tests.ts b/examples/date/test/tests.ts new file mode 100644 index 000000000..08d69cfec --- /dev/null +++ b/examples/date/test/tests.ts @@ -0,0 +1,119 @@ +import { Test } from 'azle/test'; +import { _SERVICE } from './dfx_generated/date/date.did.d'; +import { ActorSubclass } from '@dfinity/agent'; + +export function getTests(dateCanister: ActorSubclass<_SERVICE>): Test[] { + return [ + { + name: 'test_get_date', + test: async () => { + const result = await dateCanister.get_date( + '2023-06-26T00:00:00.000' + ); + return { + Ok: result === 26n + }; + } + }, + { + name: 'test_get_day', + test: async () => { + const result = await dateCanister.get_day( + '2023-06-26T00:00:00.000' + ); + return { + Ok: result === 0n + }; + } + }, + { + name: 'test_get_full_year', + test: async () => { + const result = await dateCanister.get_full_year( + '2023-06-26T00:00:00.000' + ); + return { + Ok: result === 2023n + }; + } + }, + { + name: 'test_get_hours', + test: async () => { + const result = await dateCanister.get_hours( + '2023-06-26T12:34:56.789' + ); + return { + Ok: result === 12n + }; + } + }, + { + name: 'test_get_milliseconds', + test: async () => { + const result = await dateCanister.get_milliseconds( + '2023-06-26T12:34:56.789' + ); + return { + Ok: result === 789n + }; + } + }, + { + name: 'test_get_minutes', + test: async () => { + const result = await dateCanister.get_minutes( + '2023-06-26T12:34:56.789' + ); + return { + Ok: result === 34n + }; + } + }, + { + name: 'test_get_month', + test: async () => { + const result = await dateCanister.get_month( + '2023-06-26T12:34:56.789' + ); + return { + Ok: result === 6n + }; + } + }, + { + name: 'test_get_seconds', + test: async () => { + const result = await dateCanister.get_seconds( + '2023-06-26T12:34:56.789' + ); + return { + Ok: result === 56n + }; + } + }, + { + name: 'test_get_time', + test: async () => { + const result = await dateCanister.get_time( + '1970-01-01T00:00:01.000' + ); + return { + Ok: result === 1000n + }; + } + }, + { + name: 'test_get_timezone_offset', + test: async () => { + // Assuming the server is set to UTC + const result = await dateCanister.get_timezone_offset( + '2023-06-26T12:34:56.789' + ); + return { + Ok: result === 0n + }; + } + } + ]; +} diff --git a/examples/ethereum_json_rpc/src/main.py b/examples/ethereum_json_rpc/src/main.py index 4b04de34f..339564823 100644 --- a/examples/ethereum_json_rpc/src/main.py +++ b/examples/ethereum_json_rpc/src/main.py @@ -21,7 +21,7 @@ stable_storage = StableBTreeMap[str, str]( - memory_id=0, max_key_size=20, max_value_size=1_000 + memory_id=3, max_key_size=20, max_value_size=1_000 ) diff --git a/examples/ethereum_json_rpc/test/package.json b/examples/ethereum_json_rpc/test/package.json index 2a4afa9eb..8aebb1573 100644 --- a/examples/ethereum_json_rpc/test/package.json +++ b/examples/ethereum_json_rpc/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ETHEREUM_URL=https://rpc.ankr.com/eth ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ETHEREUM_URL=https://rpc.ankr.com/eth ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && ETHEREUM_URL=https://rpc.ankr.com/eth KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && ETHEREUM_URL=https://rpc.ankr.com/eth KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.14.1", diff --git a/examples/func_types/src/func_types/main.py b/examples/func_types/src/func_types/main.py index b084f2233..398385185 100644 --- a/examples/func_types/src/func_types/main.py +++ b/examples/func_types/src/func_types/main.py @@ -49,7 +49,7 @@ class GetNotifierFromNotifiersCanisterResult(Variant, total=False): stable_storage = StableBTreeMap[str, StableFunc]( - memory_id=0, max_key_size=25, max_value_size=1_000 + memory_id=3, max_key_size=25, max_value_size=1_000 ) diff --git a/examples/func_types/test/package.json b/examples/func_types/test/package.json index 9ac036219..9947e296c 100644 --- a/examples/func_types/test/package.json +++ b/examples/func_types/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.11.1", diff --git a/examples/generators/test/package.json b/examples/generators/test/package.json index 9ac036219..9947e296c 100644 --- a/examples/generators/test/package.json +++ b/examples/generators/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.11.1", diff --git a/examples/guard_functions/test/package.json b/examples/guard_functions/test/package.json index 06a01ad51..7c40da0e3 100644 --- a/examples/guard_functions/test/package.json +++ b/examples/guard_functions/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.14.1", diff --git a/examples/guard_functions/test/test.ts b/examples/guard_functions/test/test.ts index 7bf0d7bdd..3a3a8ab25 100644 --- a/examples/guard_functions/test/test.ts +++ b/examples/guard_functions/test/test.ts @@ -12,6 +12,7 @@ const functionGuardCanister = createActor('rrkah-fqaaa-aaaaa-aaaaq-cai', { let tests: Test[] = [ ...getTests(createSnakeCaseProxy(functionGuardCanister)).filter((value) => { return ( + value.name !== 'heartbeat guard' && value.name !== 'callExpressionWithEmptyOptionsObject' && value.name !== 'looselyGuardedWithGuardOptionKeyAsString' && value.name !== 'invalidReturnTypeGuarded' && @@ -20,6 +21,26 @@ let tests: Test[] = [ value.name !== 'nonStringErrValueGuarded' ); }), + { + name: 'heartbeat guard', + test: async () => { + const initialState = await functionGuardCanister.get_state(); + console.log( + `Value at initial check was: ${initialState.heartbeat_tick}` + ); + await sleep(20_000); + const stateAfterRest = await functionGuardCanister.get_state(); + console.log( + `Value after 15s delay was: ${stateAfterRest.heartbeat_tick}` + ); + + return { + Ok: + initialState.heartbeat_tick <= 20 && + stateAfterRest.heartbeat_tick === 20 + }; + } + }, { name: 'invalid_return_type_guarded', test: async () => { @@ -106,3 +127,7 @@ let tests: Test[] = [ ]; runTests(tests); + +function sleep(ms: number) { + return new Promise((resolve) => setTimeout(resolve, ms)); +} diff --git a/examples/heartbeat/test/package.json b/examples/heartbeat/test/package.json index 9ac036219..9947e296c 100644 --- a/examples/heartbeat/test/package.json +++ b/examples/heartbeat/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.11.1", diff --git a/examples/ic_api/test/package.json b/examples/ic_api/test/package.json index 06a01ad51..7c40da0e3 100644 --- a/examples/ic_api/test/package.json +++ b/examples/ic_api/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.14.1", diff --git a/examples/imports/requirements.txt b/examples/imports/requirements.txt index 319896499..2e1e50beb 100644 --- a/examples/imports/requirements.txt +++ b/examples/imports/requirements.txt @@ -1 +1,2 @@ kybra==0.4.0 +boltons==23.0.0 diff --git a/examples/imports/src/main.did b/examples/imports/src/main.did index f6e148c28..9d8d2e3c4 100644 --- a/examples/imports/src/main.did +++ b/examples/imports/src/main.did @@ -1,4 +1,5 @@ service : () -> { + boltons_floor : (float64) -> (int) query; get_math_message : () -> (int) query; get_one : () -> (text) query; get_three : () -> (text) query; diff --git a/examples/imports/src/main.py b/examples/imports/src/main.py index fd51cd234..8bd040c72 100644 --- a/examples/imports/src/main.py +++ b/examples/imports/src/main.py @@ -1,10 +1,12 @@ -from kybra import query +import hashlib +import math + +import boltons.mathutils +from kybra import float64, query + import import1 import import2 import import2.import3 -import math -# from sample_adds.add import add_one #type: ignore TODO add an externally installed pip library in the future -import hashlib @query @@ -31,7 +33,7 @@ def sha224_hash(message: str) -> str: def get_math_message() -> int: return math.ceil(10.4) -# TODO add an externally installed pip library in the future -# @query -# def get_external_module_message() -> int: -# return add_one(1, 2) #type: ignore + +@query +def boltons_floor(number: float64) -> int: + return boltons.mathutils.floor(number) # type: ignore diff --git a/examples/imports/test/package-lock.json b/examples/imports/test/package-lock.json index 6261696e4..d1b579a43 100644 --- a/examples/imports/test/package-lock.json +++ b/examples/imports/test/package-lock.json @@ -1256,7 +1256,7 @@ }, "azle": { "version": "git+ssh://git@github.com/demergent-labs/azle.git#65fdc9cd1b52960974bd79f4ebf0dfa70e6ee3e7", - "from": "azle@https://github.com/demergent-labs/azle", + "from": "azle@github:demergent-labs/azle", "requires": { "@dfinity/principal": "0.11.2", "@swc/core": "1.2.151", diff --git a/examples/imports/test/package.json b/examples/imports/test/package.json index 9ac036219..9947e296c 100644 --- a/examples/imports/test/package.json +++ b/examples/imports/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.11.1", diff --git a/examples/imports/test/pretest.ts b/examples/imports/test/pretest.ts index ce36e3449..b59d0058b 100644 --- a/examples/imports/test/pretest.ts +++ b/examples/imports/test/pretest.ts @@ -3,6 +3,10 @@ import { execSync } from 'child_process'; async function pretest() { await new Promise((resolve) => setTimeout(resolve, 5000)); + execSync(`pip install boltons==23.0.0`, { + stdio: 'inherit' + }); + execSync(`dfx canister uninstall-code imports || true`, { stdio: 'inherit' }); diff --git a/examples/imports/test/test.ts b/examples/imports/test/test.ts index 68f0ace78..724cf8b10 100644 --- a/examples/imports/test/test.ts +++ b/examples/imports/test/test.ts @@ -1,4 +1,4 @@ -import { createSnakeCaseProxy, runTests, Test } from 'azle/test'; +import { createSnakeCaseProxy, runTests } from 'azle/test'; import { getTests } from 'azle/examples/imports/test/tests'; import { createActor } from './dfx_generated/imports'; @@ -8,16 +8,16 @@ const importsCanister = createActor('rrkah-fqaaa-aaaaa-aaaaq-cai', { } }); -// TODO add a test like this back in once we have a pip installable package to test on -// { -// name: 'get_external_module_message', -// test: async () => { -// const result = await imports_canister.get_external_module_message(); +runTests([ + ...getTests(createSnakeCaseProxy(importsCanister)), + { + name: 'boltons_floor', + test: async () => { + const result = await importsCanister.boltons_floor(456.76); -// return { -// ok: result === 3n -// }; -// } -// } - -runTests(getTests(createSnakeCaseProxy(importsCanister))); + return { + Ok: result === 456n + }; + } + } +]); diff --git a/examples/init/test/package.json b/examples/init/test/package.json index 9ac036219..9947e296c 100644 --- a/examples/init/test/package.json +++ b/examples/init/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.11.1", diff --git a/examples/inspect_message/test/package.json b/examples/inspect_message/test/package.json index 9ac036219..9947e296c 100644 --- a/examples/inspect_message/test/package.json +++ b/examples/inspect_message/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.11.1", diff --git a/examples/key_value_store/test/package.json b/examples/key_value_store/test/package.json index 9ac036219..9947e296c 100644 --- a/examples/key_value_store/test/package.json +++ b/examples/key_value_store/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.11.1", diff --git a/examples/keywords/test/package.json b/examples/keywords/test/package.json index fc776444c..4d72cc1be 100644 --- a/examples/keywords/test/package.json +++ b/examples/keywords/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.14.1", diff --git a/examples/ledger_canister/test/package.json b/examples/ledger_canister/test/package.json index 9ac036219..9947e296c 100644 --- a/examples/ledger_canister/test/package.json +++ b/examples/ledger_canister/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.11.1", diff --git a/examples/ledger_canister/test/pretest.ts b/examples/ledger_canister/test/pretest.ts index 24ab8b563..bbd9546da 100644 --- a/examples/ledger_canister/test/pretest.ts +++ b/examples/ledger_canister/test/pretest.ts @@ -16,7 +16,7 @@ async function pretest(icp_ledger_path: string) { }); execSync( - `cd ${icp_ledger_path} && curl -o ledger.wasm.gz https://download.dfinity.systems/ic/dfdba729414d3639b2a6c269600bbbd689b35385/canisters/ledger-canister_notify-method.wasm.gz`, + `cd ${icp_ledger_path} && curl -o ledger.wasm.gz https://download.dfinity.systems/ic/149b6208cbbb61e8142a069dd7a046d349beaf7a/canisters/ledger-canister_notify-method.wasm.gz`, { stdio: 'inherit' } diff --git a/examples/list_of_lists/test/package.json b/examples/list_of_lists/test/package.json index 483745e0f..081f36e40 100644 --- a/examples/list_of_lists/test/package.json +++ b/examples/list_of_lists/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.14.1", diff --git a/examples/management_canister/test/package.json b/examples/management_canister/test/package.json index 0adc61d01..5f1885eef 100644 --- a/examples/management_canister/test/package.json +++ b/examples/management_canister/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.11.1", diff --git a/examples/manual_reply/test/package.json b/examples/manual_reply/test/package.json index e25e1a41c..6e0ecda5d 100644 --- a/examples/manual_reply/test/package.json +++ b/examples/manual_reply/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "ts-node": "10.7.0", diff --git a/examples/motoko_examples/calc/test/package.json b/examples/motoko_examples/calc/test/package.json index 06a01ad51..7c40da0e3 100644 --- a/examples/motoko_examples/calc/test/package.json +++ b/examples/motoko_examples/calc/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.14.1", diff --git a/examples/motoko_examples/counter/test/package.json b/examples/motoko_examples/counter/test/package.json index 06a01ad51..7c40da0e3 100644 --- a/examples/motoko_examples/counter/test/package.json +++ b/examples/motoko_examples/counter/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.14.1", diff --git a/examples/motoko_examples/echo/test/package.json b/examples/motoko_examples/echo/test/package.json index 06a01ad51..7c40da0e3 100644 --- a/examples/motoko_examples/echo/test/package.json +++ b/examples/motoko_examples/echo/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.14.1", diff --git a/examples/motoko_examples/factorial/test/package.json b/examples/motoko_examples/factorial/test/package.json index 06a01ad51..7c40da0e3 100644 --- a/examples/motoko_examples/factorial/test/package.json +++ b/examples/motoko_examples/factorial/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.14.1", diff --git a/examples/motoko_examples/hello-world/test/package.json b/examples/motoko_examples/hello-world/test/package.json index 06a01ad51..7c40da0e3 100644 --- a/examples/motoko_examples/hello-world/test/package.json +++ b/examples/motoko_examples/hello-world/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.14.1", diff --git a/examples/motoko_examples/hello/test/package.json b/examples/motoko_examples/hello/test/package.json index 06a01ad51..7c40da0e3 100644 --- a/examples/motoko_examples/hello/test/package.json +++ b/examples/motoko_examples/hello/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.14.1", diff --git a/examples/motoko_examples/http_counter/src/main.py b/examples/motoko_examples/http_counter/src/main.py index 1aa0feeb6..1bd683c85 100644 --- a/examples/motoko_examples/http_counter/src/main.py +++ b/examples/motoko_examples/http_counter/src/main.py @@ -57,7 +57,7 @@ class HttpRequest(Record): stable_storage = StableBTreeMap[str, nat]( - memory_id=0, max_key_size=15, max_value_size=1_000 + memory_id=3, max_key_size=15, max_value_size=1_000 ) stable_storage.insert("counter", 0) diff --git a/examples/motoko_examples/http_counter/test/package-lock.json b/examples/motoko_examples/http_counter/test/package-lock.json index c3e2dd18d..f7511ef99 100644 --- a/examples/motoko_examples/http_counter/test/package-lock.json +++ b/examples/motoko_examples/http_counter/test/package-lock.json @@ -1588,7 +1588,7 @@ }, "azle": { "version": "git+ssh://git@github.com/demergent-labs/azle.git#65fdc9cd1b52960974bd79f4ebf0dfa70e6ee3e7", - "from": "azle@https://github.com/demergent-labs/azle", + "from": "azle@github:demergent-labs/azle", "requires": { "@dfinity/principal": "0.11.2", "@swc/core": "1.2.151", diff --git a/examples/motoko_examples/http_counter/test/package.json b/examples/motoko_examples/http_counter/test/package.json index 06a01ad51..7c40da0e3 100644 --- a/examples/motoko_examples/http_counter/test/package.json +++ b/examples/motoko_examples/http_counter/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.14.1", diff --git a/examples/motoko_examples/persistent-storage/src/main.py b/examples/motoko_examples/persistent-storage/src/main.py index 56418811a..ac0c79b4a 100644 --- a/examples/motoko_examples/persistent-storage/src/main.py +++ b/examples/motoko_examples/persistent-storage/src/main.py @@ -1,7 +1,7 @@ from kybra import init, nat, query, StableBTreeMap, update, void stable_storage = StableBTreeMap[str, nat]( - memory_id=0, max_key_size=15, max_value_size=1_000) + memory_id=3, max_key_size=15, max_value_size=1_000) @init diff --git a/examples/motoko_examples/persistent-storage/test/package.json b/examples/motoko_examples/persistent-storage/test/package.json index 06a01ad51..7c40da0e3 100644 --- a/examples/motoko_examples/persistent-storage/test/package.json +++ b/examples/motoko_examples/persistent-storage/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.14.1", diff --git a/examples/motoko_examples/phone-book/test/package.json b/examples/motoko_examples/phone-book/test/package.json index 06a01ad51..7c40da0e3 100644 --- a/examples/motoko_examples/phone-book/test/package.json +++ b/examples/motoko_examples/phone-book/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.14.1", diff --git a/examples/motoko_examples/quicksort/test/package.json b/examples/motoko_examples/quicksort/test/package.json index 06a01ad51..7c40da0e3 100644 --- a/examples/motoko_examples/quicksort/test/package.json +++ b/examples/motoko_examples/quicksort/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.14.1", diff --git a/examples/motoko_examples/simple-to-do/test/package.json b/examples/motoko_examples/simple-to-do/test/package.json index 06a01ad51..7c40da0e3 100644 --- a/examples/motoko_examples/simple-to-do/test/package.json +++ b/examples/motoko_examples/simple-to-do/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.14.1", diff --git a/examples/motoko_examples/superheroes/test/package.json b/examples/motoko_examples/superheroes/test/package.json index 06a01ad51..7c40da0e3 100644 --- a/examples/motoko_examples/superheroes/test/package.json +++ b/examples/motoko_examples/superheroes/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.14.1", diff --git a/examples/motoko_examples/threshold_ecdsa/test/package-lock.json b/examples/motoko_examples/threshold_ecdsa/test/package-lock.json index ecb59527c..2c728b5d0 100644 --- a/examples/motoko_examples/threshold_ecdsa/test/package-lock.json +++ b/examples/motoko_examples/threshold_ecdsa/test/package-lock.json @@ -1256,7 +1256,7 @@ }, "azle": { "version": "git+ssh://git@github.com/demergent-labs/azle.git#65fdc9cd1b52960974bd79f4ebf0dfa70e6ee3e7", - "from": "azle@https://github.com/demergent-labs/azle", + "from": "azle@github:demergent-labs/azle", "requires": { "@dfinity/principal": "0.11.2", "@swc/core": "1.2.151", diff --git a/examples/motoko_examples/threshold_ecdsa/test/package.json b/examples/motoko_examples/threshold_ecdsa/test/package.json index 0adc61d01..5f1885eef 100644 --- a/examples/motoko_examples/threshold_ecdsa/test/package.json +++ b/examples/motoko_examples/threshold_ecdsa/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.11.1", diff --git a/examples/motoko_examples/whoami/src/main.py b/examples/motoko_examples/whoami/src/main.py index db5410bca..7029a17c1 100644 --- a/examples/motoko_examples/whoami/src/main.py +++ b/examples/motoko_examples/whoami/src/main.py @@ -64,6 +64,9 @@ def post_upgrade_(somebody: Principal) -> void: someone = somebody +# Note that the installer in Kybra is the canister itself +# This is because of Kybra's deployment canister approach +# to allowing large Wasm binaries @query def installer() -> Principal: return install diff --git a/examples/motoko_examples/whoami/test/package-lock.json b/examples/motoko_examples/whoami/test/package-lock.json index ba4febcac..c266d4186 100644 --- a/examples/motoko_examples/whoami/test/package-lock.json +++ b/examples/motoko_examples/whoami/test/package-lock.json @@ -2274,7 +2274,7 @@ }, "azle": { "version": "git+ssh://git@github.com/demergent-labs/azle.git#65fdc9cd1b52960974bd79f4ebf0dfa70e6ee3e7", - "from": "azle@https://github.com/demergent-labs/azle", + "from": "azle@github:demergent-labs/azle", "requires": { "@dfinity/principal": "0.11.2", "@swc/core": "1.2.151", diff --git a/examples/motoko_examples/whoami/test/package.json b/examples/motoko_examples/whoami/test/package.json index 64d1ee989..1ac435195 100644 --- a/examples/motoko_examples/whoami/test/package.json +++ b/examples/motoko_examples/whoami/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "dependencies": { "@dfinity/identity": "0.14.1", diff --git a/examples/motoko_examples/whoami/test/test.ts b/examples/motoko_examples/whoami/test/test.ts index fb5f69251..4529ac87f 100644 --- a/examples/motoko_examples/whoami/test/test.ts +++ b/examples/motoko_examples/whoami/test/test.ts @@ -4,6 +4,7 @@ import { canisterId, getTests } from 'azle/examples/motoko_examples/whoami/test/tests'; +import { execSync } from 'child_process'; import { createActor } from './dfx_generated/whoami'; const whoamiCanister = createActor(canisterId, { @@ -13,4 +14,23 @@ const whoamiCanister = createActor(canisterId, { } }); -runTests(getTests(createSnakeCaseProxy(whoamiCanister), 'whoami')); +runTests( + getTests(createSnakeCaseProxy(whoamiCanister), 'whoami').map((test) => { + if (test.name === 'installer') { + return { + name: 'installer', + test: async () => { + const result = await whoamiCanister.installer(); + + return { + Ok: + result.toString() === + execSync(`dfx canister id whoami`).toString().trim() + }; + } + }; + } + + return test; + }) +); diff --git a/examples/notify_raw/test/package.json b/examples/notify_raw/test/package.json index 9ac036219..9947e296c 100644 --- a/examples/notify_raw/test/package.json +++ b/examples/notify_raw/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.11.1", diff --git a/examples/null_example/test/package.json b/examples/null_example/test/package.json index 9ac036219..9947e296c 100644 --- a/examples/null_example/test/package.json +++ b/examples/null_example/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.11.1", diff --git a/examples/optional_types/test/package.json b/examples/optional_types/test/package.json index 9ac036219..9947e296c 100644 --- a/examples/optional_types/test/package.json +++ b/examples/optional_types/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.11.1", diff --git a/examples/outgoing_http_requests/test/package.json b/examples/outgoing_http_requests/test/package.json index fe16fdb42..f4bd9092a 100644 --- a/examples/outgoing_http_requests/test/package.json +++ b/examples/outgoing_http_requests/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.14.1", diff --git a/examples/pre_and_post_upgrade/src/main.py b/examples/pre_and_post_upgrade/src/main.py index e41121297..eebb7f506 100644 --- a/examples/pre_and_post_upgrade/src/main.py +++ b/examples/pre_and_post_upgrade/src/main.py @@ -24,7 +24,7 @@ class Entry(Record): stable_storage = StableBTreeMap[str, Vec[Entry]]( - memory_id=0, max_key_size=100, max_value_size=100 + memory_id=3, max_key_size=100, max_value_size=100 ) entries: dict[str, nat64] = {} diff --git a/examples/pre_and_post_upgrade/test/package-lock.json b/examples/pre_and_post_upgrade/test/package-lock.json index 6261696e4..d1b579a43 100644 --- a/examples/pre_and_post_upgrade/test/package-lock.json +++ b/examples/pre_and_post_upgrade/test/package-lock.json @@ -1256,7 +1256,7 @@ }, "azle": { "version": "git+ssh://git@github.com/demergent-labs/azle.git#65fdc9cd1b52960974bd79f4ebf0dfa70e6ee3e7", - "from": "azle@https://github.com/demergent-labs/azle", + "from": "azle@github:demergent-labs/azle", "requires": { "@dfinity/principal": "0.11.2", "@swc/core": "1.2.151", diff --git a/examples/pre_and_post_upgrade/test/package.json b/examples/pre_and_post_upgrade/test/package.json index 9ac036219..9947e296c 100644 --- a/examples/pre_and_post_upgrade/test/package.json +++ b/examples/pre_and_post_upgrade/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.11.1", diff --git a/examples/primitive_types/test/package.json b/examples/primitive_types/test/package.json index 9ac036219..9947e296c 100644 --- a/examples/primitive_types/test/package.json +++ b/examples/primitive_types/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.11.1", diff --git a/examples/principal/test/package-lock.json b/examples/principal/test/package-lock.json index 65fd9ca0d..0330fb71b 100644 --- a/examples/principal/test/package-lock.json +++ b/examples/principal/test/package-lock.json @@ -1588,7 +1588,7 @@ }, "azle": { "version": "git+ssh://git@github.com/demergent-labs/azle.git#65fdc9cd1b52960974bd79f4ebf0dfa70e6ee3e7", - "from": "azle@https://github.com/demergent-labs/azle", + "from": "azle@github:demergent-labs/azle", "requires": { "@dfinity/principal": "0.11.2", "@swc/core": "1.2.151", diff --git a/examples/principal/test/package.json b/examples/principal/test/package.json index 06a01ad51..7c40da0e3 100644 --- a/examples/principal/test/package.json +++ b/examples/principal/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.14.1", diff --git a/examples/query/test/package-lock.json b/examples/query/test/package-lock.json index 6261696e4..d1b579a43 100644 --- a/examples/query/test/package-lock.json +++ b/examples/query/test/package-lock.json @@ -1256,7 +1256,7 @@ }, "azle": { "version": "git+ssh://git@github.com/demergent-labs/azle.git#65fdc9cd1b52960974bd79f4ebf0dfa70e6ee3e7", - "from": "azle@https://github.com/demergent-labs/azle", + "from": "azle@github:demergent-labs/azle", "requires": { "@dfinity/principal": "0.11.2", "@swc/core": "1.2.151", diff --git a/examples/query/test/package.json b/examples/query/test/package.json index 9ac036219..9947e296c 100644 --- a/examples/query/test/package.json +++ b/examples/query/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.11.1", diff --git a/examples/randomness/dfx.json b/examples/randomness/dfx.json index 12d07579e..58695041e 100644 --- a/examples/randomness/dfx.json +++ b/examples/randomness/dfx.json @@ -12,4 +12,4 @@ } } } -} \ No newline at end of file +} diff --git a/examples/randomness/src/main.py b/examples/randomness/src/main.py index 532b77cb2..551e44bc6 100644 --- a/examples/randomness/src/main.py +++ b/examples/randomness/src/main.py @@ -1,8 +1,8 @@ -import _random +import random from kybra import float64, update @update def random_number() -> float64: - return _random.Random().random() + return random.random() diff --git a/examples/randomness/test/package-lock.json b/examples/randomness/test/package-lock.json index a3581dceb..298f7de53 100644 --- a/examples/randomness/test/package-lock.json +++ b/examples/randomness/test/package-lock.json @@ -1256,7 +1256,7 @@ }, "azle": { "version": "git+ssh://git@github.com/demergent-labs/azle.git#65fdc9cd1b52960974bd79f4ebf0dfa70e6ee3e7", - "from": "azle@https://github.com/demergent-labs/azle", + "from": "azle@github:demergent-labs/azle", "requires": { "@dfinity/principal": "0.11.2", "@swc/core": "1.2.151", diff --git a/examples/randomness/test/package.json b/examples/randomness/test/package.json index 0adc61d01..5f1885eef 100644 --- a/examples/randomness/test/package.json +++ b/examples/randomness/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.11.1", diff --git a/examples/rejections/test/package.json b/examples/rejections/test/package.json index 9ac036219..9947e296c 100644 --- a/examples/rejections/test/package.json +++ b/examples/rejections/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.11.1", diff --git a/examples/service/test/package.json b/examples/service/test/package.json index 9ac036219..9947e296c 100644 --- a/examples/service/test/package.json +++ b/examples/service/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.11.1", diff --git a/examples/simple_erc20/test/package.json b/examples/simple_erc20/test/package.json index 9ac036219..9947e296c 100644 --- a/examples/simple_erc20/test/package.json +++ b/examples/simple_erc20/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.11.1", diff --git a/examples/simple_user_accounts/test/package.json b/examples/simple_user_accounts/test/package.json index 9ac036219..9947e296c 100644 --- a/examples/simple_user_accounts/test/package.json +++ b/examples/simple_user_accounts/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.11.1", diff --git a/examples/stable_memory/dfx.json b/examples/stable_memory/dfx.json index 357383912..bb4e23944 100644 --- a/examples/stable_memory/dfx.json +++ b/examples/stable_memory/dfx.json @@ -12,4 +12,4 @@ } } } -} \ No newline at end of file +} diff --git a/examples/stable_memory/test/package.json b/examples/stable_memory/test/package.json index 9ac036219..9947e296c 100644 --- a/examples/stable_memory/test/package.json +++ b/examples/stable_memory/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.11.1", diff --git a/examples/stable_memory/test/test.ts b/examples/stable_memory/test/test.ts index cb8eac0c0..35a4adaaf 100644 --- a/examples/stable_memory/test/test.ts +++ b/examples/stable_memory/test/test.ts @@ -15,7 +15,7 @@ runTests([ const result = await stableMemoryCanister.stable_size(); return { - Ok: result === 129 + Ok: result === 897 }; } }, @@ -25,7 +25,7 @@ runTests([ const result = await stableMemoryCanister.stable64_size(); return { - Ok: result === 129n + Ok: result === 897n }; } }, @@ -33,7 +33,7 @@ runTests([ return ( test.name !== 'stable size' && test.name !== 'stable64 size' && - test.name !== 'stable bytes' // TODO I believe this test now hits the cycle limit because we store a value at memory id 254 to distinguis between init/post_upgrade + test.name !== 'stable bytes' // TODO I believe this test now hits the cycle limit because we store a value at memory id 254 to distinguish between init/post_upgrade ); }) ]); diff --git a/examples/stable_structures/src/canister1/stable_map_00.py b/examples/stable_structures/src/canister1/stable_map_00.py index 81688a324..0a7437103 100644 --- a/examples/stable_structures/src/canister1/stable_map_00.py +++ b/examples/stable_structures/src/canister1/stable_map_00.py @@ -11,7 +11,7 @@ stable_map0 = StableBTreeMap[nat8, str]( - memory_id=0, max_key_size=100, max_value_size=100 + memory_id=3, max_key_size=100, max_value_size=100 ) diff --git a/examples/stable_structures/src/canister1/stable_map_01.py b/examples/stable_structures/src/canister1/stable_map_01.py index fc0534b8d..270a1ec96 100644 --- a/examples/stable_structures/src/canister1/stable_map_01.py +++ b/examples/stable_structures/src/canister1/stable_map_01.py @@ -11,7 +11,7 @@ stable_map1 = StableBTreeMap[nat16, blob]( - memory_id=1, max_key_size=100, max_value_size=1_000 + memory_id=4, max_key_size=100, max_value_size=1_000 ) diff --git a/examples/stable_structures/src/canister1/stable_map_02.py b/examples/stable_structures/src/canister1/stable_map_02.py index e5566da21..288f79463 100644 --- a/examples/stable_structures/src/canister1/stable_map_02.py +++ b/examples/stable_structures/src/canister1/stable_map_02.py @@ -10,7 +10,7 @@ stable_map2 = StableBTreeMap[nat32, nat]( - memory_id=2, max_key_size=100, max_value_size=1_000 + memory_id=5, max_key_size=100, max_value_size=1_000 ) diff --git a/examples/stable_structures/src/canister1/stable_map_03.py b/examples/stable_structures/src/canister1/stable_map_03.py index 8f702299a..22cab74c2 100644 --- a/examples/stable_structures/src/canister1/stable_map_03.py +++ b/examples/stable_structures/src/canister1/stable_map_03.py @@ -17,7 +17,7 @@ class Reaction(Variant): stable_map3 = StableBTreeMap[Reaction, int]( - memory_id=3, max_key_size=100, max_value_size=1_000 + memory_id=6, max_key_size=100, max_value_size=1_000 ) diff --git a/examples/stable_structures/src/canister1/stable_map_04.py b/examples/stable_structures/src/canister1/stable_map_04.py index a6271db3f..c68b06c22 100644 --- a/examples/stable_structures/src/canister1/stable_map_04.py +++ b/examples/stable_structures/src/canister1/stable_map_04.py @@ -21,7 +21,7 @@ class User(Record): stable_map4 = StableBTreeMap[User, float32]( - memory_id=4, max_key_size=100, max_value_size=1_000 + memory_id=7, max_key_size=100, max_value_size=1_000 ) diff --git a/examples/stable_structures/test/package-lock.json b/examples/stable_structures/test/package-lock.json index 93bed1532..16f94af0e 100644 --- a/examples/stable_structures/test/package-lock.json +++ b/examples/stable_structures/test/package-lock.json @@ -1546,7 +1546,7 @@ }, "azle": { "version": "git+ssh://git@github.com/demergent-labs/azle.git#65fdc9cd1b52960974bd79f4ebf0dfa70e6ee3e7", - "from": "azle@https://github.com/demergent-labs/azle", + "from": "azle@github:demergent-labs/azle", "requires": { "@dfinity/principal": "0.11.2", "@swc/core": "1.2.151", diff --git a/examples/stable_structures/test/package.json b/examples/stable_structures/test/package.json index e25e1a41c..6e0ecda5d 100644 --- a/examples/stable_structures/test/package.json +++ b/examples/stable_structures/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "ts-node": "10.7.0", diff --git a/examples/stdlib/.gitignore b/examples/stdlib/.gitignore new file mode 100644 index 000000000..cba0b56d1 --- /dev/null +++ b/examples/stdlib/.gitignore @@ -0,0 +1,4 @@ +.dfx +.kybra +dfx_generated +venv diff --git a/examples/stdlib/dfx.json b/examples/stdlib/dfx.json new file mode 100644 index 000000000..6c0e9b9bc --- /dev/null +++ b/examples/stdlib/dfx.json @@ -0,0 +1,15 @@ +{ + "canisters": { + "stdlib": { + "type": "custom", + "build": "python -m kybra stdlib src/main.py src/main.did", + "post_install": ".kybra/stdlib/post_install.sh", + "candid": "src/main.did", + "wasm": ".kybra/stdlib/stdlib.wasm.gz", + "declarations": { + "output": "test/dfx_generated/stdlib", + "node_compatibility": true + } + } + } +} diff --git a/examples/stdlib/requirements.txt b/examples/stdlib/requirements.txt new file mode 100644 index 000000000..319896499 --- /dev/null +++ b/examples/stdlib/requirements.txt @@ -0,0 +1 @@ +kybra==0.4.0 diff --git a/examples/stdlib/src/main.did b/examples/stdlib/src/main.did new file mode 100644 index 000000000..f68a8f690 --- /dev/null +++ b/examples/stdlib/src/main.did @@ -0,0 +1,11 @@ +service : () -> { + test_base64 : () -> (vec nat8) query; + test_collections : () -> (text) query; + test_datetime : () -> (text) query; + test_itertools : () -> (vec text) query; + test_json : () -> (text) query; + test_random : () -> (float64); + test_string : () -> (text) query; + test_urllib : () -> (text) query; + test_uuid : () -> (text); +} \ No newline at end of file diff --git a/examples/stdlib/src/main.py b/examples/stdlib/src/main.py new file mode 100644 index 000000000..c0e002609 --- /dev/null +++ b/examples/stdlib/src/main.py @@ -0,0 +1,52 @@ +import base64 +import collections +import datetime +import itertools +import json +import random +import string +import urllib.parse +import uuid + +from kybra import blob, float64, query, update, Vec + +@query +def test_base64() -> blob: + return base64.b64encode(b'Hello there sir') + +@query +def test_collections() -> str: + counter = collections.Counter(["apple", "banana", "orange", "apple", "banana", "apple"]) + return counter.most_common(1)[0][0] + +@query +def test_datetime() -> str: + return str(datetime.datetime.now()) + +@query +def test_itertools() -> Vec[str]: + perms = itertools.permutations("abcd", 2) + result = ["".join(p) for p in perms] + return result + +@query +def test_json() -> str: + return json.dumps({ + "hello": "world" + }) + +@update +def test_random() -> float64: + return random.random() + +@query +def test_string() -> str: + return string.ascii_letters + +@query +def test_urllib() -> str: + return urllib.parse.unquote("https%3A%2F%2Fwww.example.com%2Fsearch%3Fquery%3Dtest%26page%3D1") + +@update +def test_uuid() -> str: + return str(uuid.uuid4()) \ No newline at end of file diff --git a/examples/stdlib/test/package-lock.json b/examples/stdlib/test/package-lock.json new file mode 100644 index 000000000..2c728b5d0 --- /dev/null +++ b/examples/stdlib/test/package-lock.json @@ -0,0 +1,1662 @@ +{ + "name": "test", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "dependencies": { + "azle": "github:demergent-labs/azle" + }, + "devDependencies": { + "@dfinity/agent": "0.11.1", + "ts-node": "10.7.0", + "typescript": "4.6.3" + } + }, + "node_modules/@cspotcode/source-map-consumer": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", + "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz", + "integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==", + "dependencies": { + "@cspotcode/source-map-consumer": "0.8.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@dfinity/agent": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/@dfinity/agent/-/agent-0.11.1.tgz", + "integrity": "sha512-Z1zw8l3d+AG3uu7d8G/Rd9Q5MWT9gB+Cori/Rqb6IjSEribRhL36ulCSkDYZJU/dhqSUp1VlvX5u51+wgv+MLg==", + "dev": true, + "dependencies": { + "base64-arraybuffer": "^0.2.0", + "bignumber.js": "^9.0.0", + "borc": "^2.1.1", + "js-sha256": "0.9.0", + "simple-cbor": "^0.4.1" + }, + "peerDependencies": { + "@dfinity/candid": "^0.11.1", + "@dfinity/principal": "^0.11.1" + } + }, + "node_modules/@dfinity/candid": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/@dfinity/candid/-/candid-0.11.3.tgz", + "integrity": "sha512-xX7xNj2lLt7SIlvy0sqNp4fpcTD/xnwEu9APj0tnIF64cnsxIiS12T1Z8jl9g80jCQ1CbRPQf4cfsOfS3Cd2OA==", + "dev": true, + "peer": true + }, + "node_modules/@dfinity/principal": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/@dfinity/principal/-/principal-0.11.3.tgz", + "integrity": "sha512-+AJGDJ+RsveybSdxuTQFr2DPNZFpPfXnyixAOFWWdElVniSwnO/SwqQChR0AWvJdy/fKqoAXK+ZzyLG0uqSetA==", + "dev": true, + "peer": true + }, + "node_modules/@swc/core": { + "version": "1.2.151", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.2.151.tgz", + "integrity": "sha512-oHgqKwK/Djv765zUHPiGqfMCaKIxXTgQyyCUBKLBQfAJwe/7FVobQ2fghBp4FsZA/NE1LZBmMPpRZNQwlGjeHw==", + "bin": { + "swcx": "run_swcx.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-android-arm-eabi": "1.2.151", + "@swc/core-android-arm64": "1.2.151", + "@swc/core-darwin-arm64": "1.2.151", + "@swc/core-darwin-x64": "1.2.151", + "@swc/core-freebsd-x64": "1.2.151", + "@swc/core-linux-arm-gnueabihf": "1.2.151", + "@swc/core-linux-arm64-gnu": "1.2.151", + "@swc/core-linux-arm64-musl": "1.2.151", + "@swc/core-linux-x64-gnu": "1.2.151", + "@swc/core-linux-x64-musl": "1.2.151", + "@swc/core-win32-arm64-msvc": "1.2.151", + "@swc/core-win32-ia32-msvc": "1.2.151", + "@swc/core-win32-x64-msvc": "1.2.151" + } + }, + "node_modules/@swc/core-android-arm-eabi": { + "version": "1.2.151", + "resolved": "https://registry.npmjs.org/@swc/core-android-arm-eabi/-/core-android-arm-eabi-1.2.151.tgz", + "integrity": "sha512-Suk3IcHdha33K4hq9tfBCwkXJsENh7kjXCseLqL8Yvy8QobqkXjf1fcoJxX9BdCmPwsKmIw0ZgCBYR+Hl83M2w==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-android-arm64": { + "version": "1.2.151", + "resolved": "https://registry.npmjs.org/@swc/core-android-arm64/-/core-android-arm64-1.2.151.tgz", + "integrity": "sha512-HZVy69dVWT5RgrMJMRK5aiicPmhzkyCHAexApYAHYLgAIhsxL7uoAIPmuRKRkrKNJjrwsWL7H27bBH5bddRDvg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.2.151", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.2.151.tgz", + "integrity": "sha512-Ql7rXMu+IC76TemRtkt+opl5iSpX2ApAXVSfvf6afNVTrfTKLpDwiR3ySRRlG0FnNIv6TfOCJpHf655xp01S/g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.2.151", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.2.151.tgz", + "integrity": "sha512-N1OBIB7xatR5eybLo91ZhvMJMxT0zxRQURV/a9I8o5CyP4iLd1k8gmrYvBbtj08ohS8F9z7k/dFjxk/9ve5Drw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-freebsd-x64": { + "version": "1.2.151", + "resolved": "https://registry.npmjs.org/@swc/core-freebsd-x64/-/core-freebsd-x64-1.2.151.tgz", + "integrity": "sha512-WVIRiDzuz+/W7BMjVtg1Cmk1+zmDT18Qq+Ygr9J6aFQ1JQUkLEE1pvtkGD3JIEa6Jhz/VwM6AFHtY5o1CrZ21w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.2.151", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.2.151.tgz", + "integrity": "sha512-pfBrIUwu3cR/M7DzDCUJAw9jFKXvJ/Ge8auFk07lRb+JcDnPm0XxLyrLqGvNQWdcHgXeXfmnS4fMQxdb9GUN1w==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.2.151", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.2.151.tgz", + "integrity": "sha512-M+BTkTdPY7gteM+0dYz9wrU/j9taL4ccqPEHkDEKP21lS24y99UtuKsvdBLzDm/6ShBVLFAkgIBPu5cEb7y6ig==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.2.151", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.2.151.tgz", + "integrity": "sha512-7A+yTtSvPJVwO8X1cxUbD/PVCx8G9MKn83G9pH/r+9sQMBXqxyw6/NR0DG6nMMiyOmJkmYWgh5mO47BN7WC4dQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.2.151", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.2.151.tgz", + "integrity": "sha512-ORlbN3wf1w0IQGjGToYYC/hV/Vwfcs88Ohfxc4X+IQaw/VxKG6/XT65c0btK640F2TVhvhH1MbYFJJlsycsW7g==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.2.151", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.2.151.tgz", + "integrity": "sha512-r6odKE3+9+ReVdnNTZnICt5tscyFFtP4GFcmPQzBSlVoD9LZX6O4WeOlFXn77rVK/+205n2ag/KkKgZH+vdPuQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.2.151", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.2.151.tgz", + "integrity": "sha512-jnjJTNHpLhBaPwRgiKv1TdrMljL88ePqMCdVMantyd7yl4lP0D2e5/xR9ysR9S4EGcUnOyo9w8WUYhx/TioMZw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.2.151", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.2.151.tgz", + "integrity": "sha512-hSCxAiyDDXKvdUExj4jSIhzWFePqoqak1qdNUjlhEhEinDG8T8PTRCLalyW6fqZDcLf6Tqde7H79AqbfhRlYGQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.2.151", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.2.151.tgz", + "integrity": "sha512-HOkqcJWCChps83Maj0M5kifPDuZ2sGPqpLM67poawspTFkBh0QJ9TMmxW1doQw+74cqsTpRi1ewr/KhsN18i5g==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==" + }, + "node_modules/@types/node": { + "version": "18.11.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.17.tgz", + "integrity": "sha512-HJSUJmni4BeDHhfzn6nF0sVmd1SMezP7/4F0Lq+aXzmp2xm9O7WXrUtHW/CHlYVtZUbByEvWidHqRtcJXGF2Ng==", + "peer": true + }, + "node_modules/acorn": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" + }, + "node_modules/azle": { + "version": "0.15.0", + "resolved": "git+ssh://git@github.com/demergent-labs/azle.git#65fdc9cd1b52960974bd79f4ebf0dfa70e6ee3e7", + "license": "MIT", + "dependencies": { + "@dfinity/principal": "0.11.2", + "@swc/core": "1.2.151", + "azle-syn": "0.0.0", + "esbuild": "0.14.25", + "fs-extra": "10.0.1", + "js-sha256": "0.9.0", + "ts-node": "10.3.1", + "typescript": "4.4.4" + }, + "bin": { + "azle": "bin.js" + } + }, + "node_modules/azle-syn": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/azle-syn/-/azle-syn-0.0.0.tgz", + "integrity": "sha512-fWExJb5/hOEJOuBQ8hMMHRs9WryYeLLa9/ydqPWxbwjMEpE8RKdU1dTK6mdZtzNMhbeHdyne2pU1iVKiKmImGw==" + }, + "node_modules/azle/node_modules/@dfinity/principal": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/@dfinity/principal/-/principal-0.11.2.tgz", + "integrity": "sha512-vReWruqIl16yQeKOrCLDLDf2aTEJsXcKeW9qbwVfmV0kwLNE3B2Z6tbRjYbY7s+KwpysD5B1b48ZbIwI00BeyQ==" + }, + "node_modules/azle/node_modules/ts-node": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.3.1.tgz", + "integrity": "sha512-Yw3W2mYzhHfCHOICGNJqa0i+rbL0rAyg7ZIHxU+K4pgY8gd2Lh1j+XbHCusJMykbj6RZMJVOY0MlHVd+GOivcw==", + "dependencies": { + "@cspotcode/source-map-support": "0.7.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/azle/node_modules/typescript": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz", + "integrity": "sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/base64-arraybuffer": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.2.0.tgz", + "integrity": "sha512-7emyCsu1/xiBXgQZrscw/8KPRT44I4Yq9Pe6EGs3aPRTsWuggML1/1DTuZUuIaJPIm1FTDUVXl4x/yW8s0kQDQ==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bignumber.js": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", + "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/borc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/borc/-/borc-2.1.2.tgz", + "integrity": "sha512-Sy9eoUi4OiKzq7VovMn246iTo17kzuyHJKomCfpWMlI6RpfN1gk95w7d7gH264nApVLg0HZfcpz62/g4VH1Y4w==", + "dev": true, + "dependencies": { + "bignumber.js": "^9.0.0", + "buffer": "^5.5.0", + "commander": "^2.15.0", + "ieee754": "^1.1.13", + "iso-url": "~0.4.7", + "json-text-sequence": "~0.1.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" + }, + "node_modules/delimit-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/delimit-stream/-/delimit-stream-0.1.0.tgz", + "integrity": "sha512-a02fiQ7poS5CnjiJBAsjGLPp5EwVoGHNeu9sziBd9huppRfsAFIpv5zNLv0V1gbop53ilngAf5Kf331AwcoRBQ==", + "dev": true + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/esbuild": { + "version": "0.14.25", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.25.tgz", + "integrity": "sha512-4JHEIOMNFvK09ziiL+iVmldIhLbn49V4NAVo888tcGFKedEZY/Y8YapfStJ6zSE23tzYPKxqKwQBnQoIO0BI/Q==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "esbuild-android-64": "0.14.25", + "esbuild-android-arm64": "0.14.25", + "esbuild-darwin-64": "0.14.25", + "esbuild-darwin-arm64": "0.14.25", + "esbuild-freebsd-64": "0.14.25", + "esbuild-freebsd-arm64": "0.14.25", + "esbuild-linux-32": "0.14.25", + "esbuild-linux-64": "0.14.25", + "esbuild-linux-arm": "0.14.25", + "esbuild-linux-arm64": "0.14.25", + "esbuild-linux-mips64le": "0.14.25", + "esbuild-linux-ppc64le": "0.14.25", + "esbuild-linux-riscv64": "0.14.25", + "esbuild-linux-s390x": "0.14.25", + "esbuild-netbsd-64": "0.14.25", + "esbuild-openbsd-64": "0.14.25", + "esbuild-sunos-64": "0.14.25", + "esbuild-windows-32": "0.14.25", + "esbuild-windows-64": "0.14.25", + "esbuild-windows-arm64": "0.14.25" + } + }, + "node_modules/esbuild-android-64": { + "version": "0.14.25", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.25.tgz", + "integrity": "sha512-L5vCUk7TzFbBnoESNoXjU3x9+/+7TDIE/1mTfy/erAfvZAqC+S3sp/Qa9wkypFMcFvN9FzvESkTlpeQDolREtQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-android-arm64": { + "version": "0.14.25", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.25.tgz", + "integrity": "sha512-4jv5xPjM/qNm27T5j3ZEck0PvjgQtoMHnz4FzwF5zNP56PvY2CT0WStcAIl6jNlsuDdN63rk2HRBIsO6xFbcFw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-64": { + "version": "0.14.25", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.25.tgz", + "integrity": "sha512-TGp8tuudIxOyWd1+8aYPxQmC1ZQyvij/AfNBa35RubixD0zJ1vkKHVAzo0Zao1zcG6pNqiSyzfPto8vmg0s7oA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-arm64": { + "version": "0.14.25", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.25.tgz", + "integrity": "sha512-oTcDgdm0MDVEmw2DWu8BV68pYuImpFgvWREPErBZmNA4MYKGuBRaCiJqq6jZmBR1x+3y1DWCjez+5uLtuAm6mw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-64": { + "version": "0.14.25", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.25.tgz", + "integrity": "sha512-ueAqbnMZ8arnuLH8tHwTCQYeptnHOUV7vA6px6j4zjjQwDx7TdP7kACPf3TLZLdJQ3CAD1XCvQ2sPhX+8tacvQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-arm64": { + "version": "0.14.25", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.25.tgz", + "integrity": "sha512-+ZVWud2HKh+Ob6k/qiJWjBtUg4KmJGGmbvEXXW1SNKS7hW7HU+Zq2ZCcE1akFxOPkVB+EhOty/sSek30tkCYug==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-32": { + "version": "0.14.25", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.25.tgz", + "integrity": "sha512-3OP/lwV3kCzEz45tobH9nj+uE4ubhGsfx+tn0L26WAGtUbmmcRpqy7XRG/qK7h1mClZ+eguIANcQntYMdYklfw==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-64": { + "version": "0.14.25", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.25.tgz", + "integrity": "sha512-+aKHdHZmX9qwVlQmu5xYXh7GsBFf4TWrePgeJTalhXHOG7NNuUwoHmketGiZEoNsWyyqwH9rE5BC+iwcLY30Ug==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm": { + "version": "0.14.25", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.25.tgz", + "integrity": "sha512-aTLcE2VBoLydL943REcAcgnDi3bHtmULSXWLbjtBdtykRatJVSxKMjK9YlBXUZC4/YcNQfH7AxwVeQr9fNxPhw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm64": { + "version": "0.14.25", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.25.tgz", + "integrity": "sha512-UxfenPx/wSZx55gScCImPtXekvZQLI2GW3qe5dtlmU7luiqhp5GWPzGeQEbD3yN3xg/pHc671m5bma5Ns7lBHw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-mips64le": { + "version": "0.14.25", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.25.tgz", + "integrity": "sha512-wLWYyqVfYx9Ur6eU5RT92yJVsaBGi5RdkoWqRHOqcJ38Kn60QMlcghsKeWfe9jcYut8LangYZ98xO1LxIoSXrQ==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-ppc64le": { + "version": "0.14.25", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.25.tgz", + "integrity": "sha512-0dR6Csl6Zas3g4p9ULckEl8Mo8IInJh33VCJ3eaV1hj9+MHGdmDOakYMN8MZP9/5nl+NU/0ygpd14cWgy8uqRw==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-riscv64": { + "version": "0.14.25", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.25.tgz", + "integrity": "sha512-J4d20HDmTrgvhR0bdkDhvvJGaikH3LzXQnNaseo8rcw9Yqby9A90gKUmWpfwqLVNRILvNnAmKLfBjCKU9ajg8w==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-s390x": { + "version": "0.14.25", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.25.tgz", + "integrity": "sha512-YI2d5V6nTE73ZnhEKQD7MtsPs1EtUZJ3obS21oxQxGbbRw1G+PtJKjNyur+3t6nzHP9oTg6GHQ3S3hOLLmbDIQ==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-netbsd-64": { + "version": "0.14.25", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.25.tgz", + "integrity": "sha512-TKIVgNWLUOkr+Exrye70XTEE1lJjdQXdM4tAXRzfHE9iBA7LXWcNtVIuSnphTqpanPzTDFarF0yqq4kpbC6miA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-openbsd-64": { + "version": "0.14.25", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.25.tgz", + "integrity": "sha512-QgFJ37A15D7NIXBTYEqz29+uw3nNBOIyog+3kFidANn6kjw0GHZ0lEYQn+cwjyzu94WobR+fes7cTl/ZYlHb1A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-sunos-64": { + "version": "0.14.25", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.25.tgz", + "integrity": "sha512-rmWfjUItYIVlqr5EnTH1+GCxXiBOC42WBZ3w++qh7n2cS9Xo0lO5pGSG2N+huOU2fX5L+6YUuJ78/vOYvefeFw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-32": { + "version": "0.14.25", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.25.tgz", + "integrity": "sha512-HGAxVUofl3iUIz9W10Y9XKtD0bNsK9fBXv1D55N/ljNvkrAYcGB8YCm0v7DjlwtyS6ws3dkdQyXadbxkbzaKOA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-64": { + "version": "0.14.25", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.25.tgz", + "integrity": "sha512-TirEohRkfWU9hXLgoDxzhMQD1g8I2mOqvdQF2RS9E/wbkORTAqJHyh7wqGRCQAwNzdNXdg3JAyhQ9/177AadWA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-arm64": { + "version": "0.14.25", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.25.tgz", + "integrity": "sha512-4ype9ERiI45rSh+R8qUoBtaj6kJvUOI7oVLhKqPEpcF4Pa5PpT3hm/mXAyotJHREkHpM87PAJcA442mLnbtlNA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/fs-extra": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz", + "integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/iso-url": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/iso-url/-/iso-url-0.4.7.tgz", + "integrity": "sha512-27fFRDnPAMnHGLq36bWTpKET+eiXct3ENlCcdcMdk+mjXrb2kw3mhBUg1B7ewAC0kVzlOPhADzQgz1SE6Tglog==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/js-sha256": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz", + "integrity": "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==" + }, + "node_modules/json-text-sequence": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/json-text-sequence/-/json-text-sequence-0.1.1.tgz", + "integrity": "sha512-L3mEegEWHRekSHjc7+sc8eJhba9Clq1PZ8kMkzf8OxElhXc8O4TS5MwcVlj9aEbm5dr81N90WHC5nAz3UO971w==", + "dev": true, + "dependencies": { + "delimit-stream": "0.1.0" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-cbor": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/simple-cbor/-/simple-cbor-0.4.1.tgz", + "integrity": "sha512-rijcxtwx2b4Bje3sqeIqw5EeW7UlOIC4YfOdwqIKacpvRQ/D78bWg/4/0m5e0U91oKvlGh7LlJuZCu07ISCC7w==", + "dev": true + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/ts-node": { + "version": "10.7.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.7.0.tgz", + "integrity": "sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "0.7.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.0", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/typescript": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", + "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "engines": { + "node": ">=6" + } + } + }, + "dependencies": { + "@cspotcode/source-map-consumer": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", + "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==" + }, + "@cspotcode/source-map-support": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz", + "integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==", + "requires": { + "@cspotcode/source-map-consumer": "0.8.0" + } + }, + "@dfinity/agent": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/@dfinity/agent/-/agent-0.11.1.tgz", + "integrity": "sha512-Z1zw8l3d+AG3uu7d8G/Rd9Q5MWT9gB+Cori/Rqb6IjSEribRhL36ulCSkDYZJU/dhqSUp1VlvX5u51+wgv+MLg==", + "dev": true, + "requires": { + "base64-arraybuffer": "^0.2.0", + "bignumber.js": "^9.0.0", + "borc": "^2.1.1", + "js-sha256": "0.9.0", + "simple-cbor": "^0.4.1" + } + }, + "@dfinity/candid": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/@dfinity/candid/-/candid-0.11.3.tgz", + "integrity": "sha512-xX7xNj2lLt7SIlvy0sqNp4fpcTD/xnwEu9APj0tnIF64cnsxIiS12T1Z8jl9g80jCQ1CbRPQf4cfsOfS3Cd2OA==", + "dev": true, + "peer": true + }, + "@dfinity/principal": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/@dfinity/principal/-/principal-0.11.3.tgz", + "integrity": "sha512-+AJGDJ+RsveybSdxuTQFr2DPNZFpPfXnyixAOFWWdElVniSwnO/SwqQChR0AWvJdy/fKqoAXK+ZzyLG0uqSetA==", + "dev": true, + "peer": true + }, + "@swc/core": { + "version": "1.2.151", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.2.151.tgz", + "integrity": "sha512-oHgqKwK/Djv765zUHPiGqfMCaKIxXTgQyyCUBKLBQfAJwe/7FVobQ2fghBp4FsZA/NE1LZBmMPpRZNQwlGjeHw==", + "requires": { + "@swc/core-android-arm-eabi": "1.2.151", + "@swc/core-android-arm64": "1.2.151", + "@swc/core-darwin-arm64": "1.2.151", + "@swc/core-darwin-x64": "1.2.151", + "@swc/core-freebsd-x64": "1.2.151", + "@swc/core-linux-arm-gnueabihf": "1.2.151", + "@swc/core-linux-arm64-gnu": "1.2.151", + "@swc/core-linux-arm64-musl": "1.2.151", + "@swc/core-linux-x64-gnu": "1.2.151", + "@swc/core-linux-x64-musl": "1.2.151", + "@swc/core-win32-arm64-msvc": "1.2.151", + "@swc/core-win32-ia32-msvc": "1.2.151", + "@swc/core-win32-x64-msvc": "1.2.151" + } + }, + "@swc/core-android-arm-eabi": { + "version": "1.2.151", + "resolved": "https://registry.npmjs.org/@swc/core-android-arm-eabi/-/core-android-arm-eabi-1.2.151.tgz", + "integrity": "sha512-Suk3IcHdha33K4hq9tfBCwkXJsENh7kjXCseLqL8Yvy8QobqkXjf1fcoJxX9BdCmPwsKmIw0ZgCBYR+Hl83M2w==", + "optional": true + }, + "@swc/core-android-arm64": { + "version": "1.2.151", + "resolved": "https://registry.npmjs.org/@swc/core-android-arm64/-/core-android-arm64-1.2.151.tgz", + "integrity": "sha512-HZVy69dVWT5RgrMJMRK5aiicPmhzkyCHAexApYAHYLgAIhsxL7uoAIPmuRKRkrKNJjrwsWL7H27bBH5bddRDvg==", + "optional": true + }, + "@swc/core-darwin-arm64": { + "version": "1.2.151", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.2.151.tgz", + "integrity": "sha512-Ql7rXMu+IC76TemRtkt+opl5iSpX2ApAXVSfvf6afNVTrfTKLpDwiR3ySRRlG0FnNIv6TfOCJpHf655xp01S/g==", + "optional": true + }, + "@swc/core-darwin-x64": { + "version": "1.2.151", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.2.151.tgz", + "integrity": "sha512-N1OBIB7xatR5eybLo91ZhvMJMxT0zxRQURV/a9I8o5CyP4iLd1k8gmrYvBbtj08ohS8F9z7k/dFjxk/9ve5Drw==", + "optional": true + }, + "@swc/core-freebsd-x64": { + "version": "1.2.151", + "resolved": "https://registry.npmjs.org/@swc/core-freebsd-x64/-/core-freebsd-x64-1.2.151.tgz", + "integrity": "sha512-WVIRiDzuz+/W7BMjVtg1Cmk1+zmDT18Qq+Ygr9J6aFQ1JQUkLEE1pvtkGD3JIEa6Jhz/VwM6AFHtY5o1CrZ21w==", + "optional": true + }, + "@swc/core-linux-arm-gnueabihf": { + "version": "1.2.151", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.2.151.tgz", + "integrity": "sha512-pfBrIUwu3cR/M7DzDCUJAw9jFKXvJ/Ge8auFk07lRb+JcDnPm0XxLyrLqGvNQWdcHgXeXfmnS4fMQxdb9GUN1w==", + "optional": true + }, + "@swc/core-linux-arm64-gnu": { + "version": "1.2.151", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.2.151.tgz", + "integrity": "sha512-M+BTkTdPY7gteM+0dYz9wrU/j9taL4ccqPEHkDEKP21lS24y99UtuKsvdBLzDm/6ShBVLFAkgIBPu5cEb7y6ig==", + "optional": true + }, + "@swc/core-linux-arm64-musl": { + "version": "1.2.151", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.2.151.tgz", + "integrity": "sha512-7A+yTtSvPJVwO8X1cxUbD/PVCx8G9MKn83G9pH/r+9sQMBXqxyw6/NR0DG6nMMiyOmJkmYWgh5mO47BN7WC4dQ==", + "optional": true + }, + "@swc/core-linux-x64-gnu": { + "version": "1.2.151", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.2.151.tgz", + "integrity": "sha512-ORlbN3wf1w0IQGjGToYYC/hV/Vwfcs88Ohfxc4X+IQaw/VxKG6/XT65c0btK640F2TVhvhH1MbYFJJlsycsW7g==", + "optional": true + }, + "@swc/core-linux-x64-musl": { + "version": "1.2.151", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.2.151.tgz", + "integrity": "sha512-r6odKE3+9+ReVdnNTZnICt5tscyFFtP4GFcmPQzBSlVoD9LZX6O4WeOlFXn77rVK/+205n2ag/KkKgZH+vdPuQ==", + "optional": true + }, + "@swc/core-win32-arm64-msvc": { + "version": "1.2.151", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.2.151.tgz", + "integrity": "sha512-jnjJTNHpLhBaPwRgiKv1TdrMljL88ePqMCdVMantyd7yl4lP0D2e5/xR9ysR9S4EGcUnOyo9w8WUYhx/TioMZw==", + "optional": true + }, + "@swc/core-win32-ia32-msvc": { + "version": "1.2.151", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.2.151.tgz", + "integrity": "sha512-hSCxAiyDDXKvdUExj4jSIhzWFePqoqak1qdNUjlhEhEinDG8T8PTRCLalyW6fqZDcLf6Tqde7H79AqbfhRlYGQ==", + "optional": true + }, + "@swc/core-win32-x64-msvc": { + "version": "1.2.151", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.2.151.tgz", + "integrity": "sha512-HOkqcJWCChps83Maj0M5kifPDuZ2sGPqpLM67poawspTFkBh0QJ9TMmxW1doQw+74cqsTpRi1ewr/KhsN18i5g==", + "optional": true + }, + "@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==" + }, + "@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==" + }, + "@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" + }, + "@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==" + }, + "@types/node": { + "version": "18.11.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.17.tgz", + "integrity": "sha512-HJSUJmni4BeDHhfzn6nF0sVmd1SMezP7/4F0Lq+aXzmp2xm9O7WXrUtHW/CHlYVtZUbByEvWidHqRtcJXGF2Ng==", + "peer": true + }, + "acorn": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==" + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==" + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" + }, + "azle": { + "version": "git+ssh://git@github.com/demergent-labs/azle.git#65fdc9cd1b52960974bd79f4ebf0dfa70e6ee3e7", + "from": "azle@github:demergent-labs/azle", + "requires": { + "@dfinity/principal": "0.11.2", + "@swc/core": "1.2.151", + "azle-syn": "0.0.0", + "esbuild": "0.14.25", + "fs-extra": "10.0.1", + "js-sha256": "0.9.0", + "ts-node": "10.3.1", + "typescript": "4.4.4" + }, + "dependencies": { + "@dfinity/principal": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/@dfinity/principal/-/principal-0.11.2.tgz", + "integrity": "sha512-vReWruqIl16yQeKOrCLDLDf2aTEJsXcKeW9qbwVfmV0kwLNE3B2Z6tbRjYbY7s+KwpysD5B1b48ZbIwI00BeyQ==" + }, + "ts-node": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.3.1.tgz", + "integrity": "sha512-Yw3W2mYzhHfCHOICGNJqa0i+rbL0rAyg7ZIHxU+K4pgY8gd2Lh1j+XbHCusJMykbj6RZMJVOY0MlHVd+GOivcw==", + "requires": { + "@cspotcode/source-map-support": "0.7.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "yn": "3.1.1" + } + }, + "typescript": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz", + "integrity": "sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==" + } + } + }, + "azle-syn": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/azle-syn/-/azle-syn-0.0.0.tgz", + "integrity": "sha512-fWExJb5/hOEJOuBQ8hMMHRs9WryYeLLa9/ydqPWxbwjMEpE8RKdU1dTK6mdZtzNMhbeHdyne2pU1iVKiKmImGw==" + }, + "base64-arraybuffer": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.2.0.tgz", + "integrity": "sha512-7emyCsu1/xiBXgQZrscw/8KPRT44I4Yq9Pe6EGs3aPRTsWuggML1/1DTuZUuIaJPIm1FTDUVXl4x/yW8s0kQDQ==", + "dev": true + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "bignumber.js": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", + "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==", + "dev": true + }, + "borc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/borc/-/borc-2.1.2.tgz", + "integrity": "sha512-Sy9eoUi4OiKzq7VovMn246iTo17kzuyHJKomCfpWMlI6RpfN1gk95w7d7gH264nApVLg0HZfcpz62/g4VH1Y4w==", + "dev": true, + "requires": { + "bignumber.js": "^9.0.0", + "buffer": "^5.5.0", + "commander": "^2.15.0", + "ieee754": "^1.1.13", + "iso-url": "~0.4.7", + "json-text-sequence": "~0.1.0", + "readable-stream": "^3.6.0" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" + }, + "delimit-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/delimit-stream/-/delimit-stream-0.1.0.tgz", + "integrity": "sha512-a02fiQ7poS5CnjiJBAsjGLPp5EwVoGHNeu9sziBd9huppRfsAFIpv5zNLv0V1gbop53ilngAf5Kf331AwcoRBQ==", + "dev": true + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==" + }, + "esbuild": { + "version": "0.14.25", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.25.tgz", + "integrity": "sha512-4JHEIOMNFvK09ziiL+iVmldIhLbn49V4NAVo888tcGFKedEZY/Y8YapfStJ6zSE23tzYPKxqKwQBnQoIO0BI/Q==", + "requires": { + "esbuild-android-64": "0.14.25", + "esbuild-android-arm64": "0.14.25", + "esbuild-darwin-64": "0.14.25", + "esbuild-darwin-arm64": "0.14.25", + "esbuild-freebsd-64": "0.14.25", + "esbuild-freebsd-arm64": "0.14.25", + "esbuild-linux-32": "0.14.25", + "esbuild-linux-64": "0.14.25", + "esbuild-linux-arm": "0.14.25", + "esbuild-linux-arm64": "0.14.25", + "esbuild-linux-mips64le": "0.14.25", + "esbuild-linux-ppc64le": "0.14.25", + "esbuild-linux-riscv64": "0.14.25", + "esbuild-linux-s390x": "0.14.25", + "esbuild-netbsd-64": "0.14.25", + "esbuild-openbsd-64": "0.14.25", + "esbuild-sunos-64": "0.14.25", + "esbuild-windows-32": "0.14.25", + "esbuild-windows-64": "0.14.25", + "esbuild-windows-arm64": "0.14.25" + } + }, + "esbuild-android-64": { + "version": "0.14.25", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.25.tgz", + "integrity": "sha512-L5vCUk7TzFbBnoESNoXjU3x9+/+7TDIE/1mTfy/erAfvZAqC+S3sp/Qa9wkypFMcFvN9FzvESkTlpeQDolREtQ==", + "optional": true + }, + "esbuild-android-arm64": { + "version": "0.14.25", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.25.tgz", + "integrity": "sha512-4jv5xPjM/qNm27T5j3ZEck0PvjgQtoMHnz4FzwF5zNP56PvY2CT0WStcAIl6jNlsuDdN63rk2HRBIsO6xFbcFw==", + "optional": true + }, + "esbuild-darwin-64": { + "version": "0.14.25", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.25.tgz", + "integrity": "sha512-TGp8tuudIxOyWd1+8aYPxQmC1ZQyvij/AfNBa35RubixD0zJ1vkKHVAzo0Zao1zcG6pNqiSyzfPto8vmg0s7oA==", + "optional": true + }, + "esbuild-darwin-arm64": { + "version": "0.14.25", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.25.tgz", + "integrity": "sha512-oTcDgdm0MDVEmw2DWu8BV68pYuImpFgvWREPErBZmNA4MYKGuBRaCiJqq6jZmBR1x+3y1DWCjez+5uLtuAm6mw==", + "optional": true + }, + "esbuild-freebsd-64": { + "version": "0.14.25", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.25.tgz", + "integrity": "sha512-ueAqbnMZ8arnuLH8tHwTCQYeptnHOUV7vA6px6j4zjjQwDx7TdP7kACPf3TLZLdJQ3CAD1XCvQ2sPhX+8tacvQ==", + "optional": true + }, + "esbuild-freebsd-arm64": { + "version": "0.14.25", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.25.tgz", + "integrity": "sha512-+ZVWud2HKh+Ob6k/qiJWjBtUg4KmJGGmbvEXXW1SNKS7hW7HU+Zq2ZCcE1akFxOPkVB+EhOty/sSek30tkCYug==", + "optional": true + }, + "esbuild-linux-32": { + "version": "0.14.25", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.25.tgz", + "integrity": "sha512-3OP/lwV3kCzEz45tobH9nj+uE4ubhGsfx+tn0L26WAGtUbmmcRpqy7XRG/qK7h1mClZ+eguIANcQntYMdYklfw==", + "optional": true + }, + "esbuild-linux-64": { + "version": "0.14.25", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.25.tgz", + "integrity": "sha512-+aKHdHZmX9qwVlQmu5xYXh7GsBFf4TWrePgeJTalhXHOG7NNuUwoHmketGiZEoNsWyyqwH9rE5BC+iwcLY30Ug==", + "optional": true + }, + "esbuild-linux-arm": { + "version": "0.14.25", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.25.tgz", + "integrity": "sha512-aTLcE2VBoLydL943REcAcgnDi3bHtmULSXWLbjtBdtykRatJVSxKMjK9YlBXUZC4/YcNQfH7AxwVeQr9fNxPhw==", + "optional": true + }, + "esbuild-linux-arm64": { + "version": "0.14.25", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.25.tgz", + "integrity": "sha512-UxfenPx/wSZx55gScCImPtXekvZQLI2GW3qe5dtlmU7luiqhp5GWPzGeQEbD3yN3xg/pHc671m5bma5Ns7lBHw==", + "optional": true + }, + "esbuild-linux-mips64le": { + "version": "0.14.25", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.25.tgz", + "integrity": "sha512-wLWYyqVfYx9Ur6eU5RT92yJVsaBGi5RdkoWqRHOqcJ38Kn60QMlcghsKeWfe9jcYut8LangYZ98xO1LxIoSXrQ==", + "optional": true + }, + "esbuild-linux-ppc64le": { + "version": "0.14.25", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.25.tgz", + "integrity": "sha512-0dR6Csl6Zas3g4p9ULckEl8Mo8IInJh33VCJ3eaV1hj9+MHGdmDOakYMN8MZP9/5nl+NU/0ygpd14cWgy8uqRw==", + "optional": true + }, + "esbuild-linux-riscv64": { + "version": "0.14.25", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.25.tgz", + "integrity": "sha512-J4d20HDmTrgvhR0bdkDhvvJGaikH3LzXQnNaseo8rcw9Yqby9A90gKUmWpfwqLVNRILvNnAmKLfBjCKU9ajg8w==", + "optional": true + }, + "esbuild-linux-s390x": { + "version": "0.14.25", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.25.tgz", + "integrity": "sha512-YI2d5V6nTE73ZnhEKQD7MtsPs1EtUZJ3obS21oxQxGbbRw1G+PtJKjNyur+3t6nzHP9oTg6GHQ3S3hOLLmbDIQ==", + "optional": true + }, + "esbuild-netbsd-64": { + "version": "0.14.25", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.25.tgz", + "integrity": "sha512-TKIVgNWLUOkr+Exrye70XTEE1lJjdQXdM4tAXRzfHE9iBA7LXWcNtVIuSnphTqpanPzTDFarF0yqq4kpbC6miA==", + "optional": true + }, + "esbuild-openbsd-64": { + "version": "0.14.25", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.25.tgz", + "integrity": "sha512-QgFJ37A15D7NIXBTYEqz29+uw3nNBOIyog+3kFidANn6kjw0GHZ0lEYQn+cwjyzu94WobR+fes7cTl/ZYlHb1A==", + "optional": true + }, + "esbuild-sunos-64": { + "version": "0.14.25", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.25.tgz", + "integrity": "sha512-rmWfjUItYIVlqr5EnTH1+GCxXiBOC42WBZ3w++qh7n2cS9Xo0lO5pGSG2N+huOU2fX5L+6YUuJ78/vOYvefeFw==", + "optional": true + }, + "esbuild-windows-32": { + "version": "0.14.25", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.25.tgz", + "integrity": "sha512-HGAxVUofl3iUIz9W10Y9XKtD0bNsK9fBXv1D55N/ljNvkrAYcGB8YCm0v7DjlwtyS6ws3dkdQyXadbxkbzaKOA==", + "optional": true + }, + "esbuild-windows-64": { + "version": "0.14.25", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.25.tgz", + "integrity": "sha512-TirEohRkfWU9hXLgoDxzhMQD1g8I2mOqvdQF2RS9E/wbkORTAqJHyh7wqGRCQAwNzdNXdg3JAyhQ9/177AadWA==", + "optional": true + }, + "esbuild-windows-arm64": { + "version": "0.14.25", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.25.tgz", + "integrity": "sha512-4ype9ERiI45rSh+R8qUoBtaj6kJvUOI7oVLhKqPEpcF4Pa5PpT3hm/mXAyotJHREkHpM87PAJcA442mLnbtlNA==", + "optional": true + }, + "fs-extra": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz", + "integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "iso-url": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/iso-url/-/iso-url-0.4.7.tgz", + "integrity": "sha512-27fFRDnPAMnHGLq36bWTpKET+eiXct3ENlCcdcMdk+mjXrb2kw3mhBUg1B7ewAC0kVzlOPhADzQgz1SE6Tglog==", + "dev": true + }, + "js-sha256": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz", + "integrity": "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==" + }, + "json-text-sequence": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/json-text-sequence/-/json-text-sequence-0.1.1.tgz", + "integrity": "sha512-L3mEegEWHRekSHjc7+sc8eJhba9Clq1PZ8kMkzf8OxElhXc8O4TS5MwcVlj9aEbm5dr81N90WHC5nAz3UO971w==", + "dev": true, + "requires": { + "delimit-stream": "0.1.0" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "simple-cbor": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/simple-cbor/-/simple-cbor-0.4.1.tgz", + "integrity": "sha512-rijcxtwx2b4Bje3sqeIqw5EeW7UlOIC4YfOdwqIKacpvRQ/D78bWg/4/0m5e0U91oKvlGh7LlJuZCu07ISCC7w==", + "dev": true + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "ts-node": { + "version": "10.7.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.7.0.tgz", + "integrity": "sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==", + "dev": true, + "requires": { + "@cspotcode/source-map-support": "0.7.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.0", + "yn": "3.1.1" + } + }, + "typescript": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", + "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", + "dev": true + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==" + } + } +} diff --git a/examples/stdlib/test/package.json b/examples/stdlib/test/package.json new file mode 100644 index 000000000..5f1885eef --- /dev/null +++ b/examples/stdlib/test/package.json @@ -0,0 +1,14 @@ +{ + "scripts": { + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" + }, + "devDependencies": { + "@dfinity/agent": "0.11.1", + "ts-node": "10.7.0", + "typescript": "4.6.3" + }, + "dependencies": { + "azle": "github:demergent-labs/azle" + } +} diff --git a/examples/stdlib/test/pretest.ts b/examples/stdlib/test/pretest.ts new file mode 100644 index 000000000..f6d476e47 --- /dev/null +++ b/examples/stdlib/test/pretest.ts @@ -0,0 +1,19 @@ +import { execSync } from 'child_process'; + +async function pretest() { + await new Promise((resolve) => setTimeout(resolve, 5000)); + + execSync(`dfx canister uninstall-code stdlib || true`, { + stdio: 'inherit' + }); + + execSync(`dfx deploy stdlib`, { + stdio: 'inherit' + }); + + execSync(`dfx generate stdlib`, { + stdio: 'inherit' + }); +} + +pretest(); diff --git a/examples/stdlib/test/test.ts b/examples/stdlib/test/test.ts new file mode 100644 index 000000000..829cfca78 --- /dev/null +++ b/examples/stdlib/test/test.ts @@ -0,0 +1,11 @@ +import { runTests } from 'azle/test'; +import { createActor } from './dfx_generated/stdlib'; +import { getTests } from './tests'; + +const stdlibCanister = createActor('rrkah-fqaaa-aaaaa-aaaaq-cai', { + agentOptions: { + host: 'http://127.0.0.1:8000' + } +}); + +runTests(getTests(stdlibCanister)); diff --git a/examples/stdlib/test/tests.ts b/examples/stdlib/test/tests.ts new file mode 100644 index 000000000..cc3617a1d --- /dev/null +++ b/examples/stdlib/test/tests.ts @@ -0,0 +1,129 @@ +import { Test } from 'azle/test'; +import { _SERVICE } from './dfx_generated/stdlib/stdlib.did'; +import { ActorSubclass } from '@dfinity/agent'; + +export function getTests(actor: ActorSubclass<_SERVICE>): Test[] { + return [ + { + name: 'test_base64', + test: async () => { + const result = await actor.test_base64(); + const base64String = Buffer.from(result).toString(); + const decodedString = Buffer.from( + base64String, + 'base64' + ).toString(); + + return { + Ok: decodedString === 'Hello there sir' + }; + } + }, + { + name: 'test_collections', + test: async () => { + const result = await actor.test_collections(); + return { + Ok: result === 'apple' + }; + } + }, + { + name: 'test_datetime', + test: async () => { + const result = await actor.test_datetime(); + return { + Ok: !isNaN(Date.parse(result)) + }; + } + }, + { + name: 'test_itertools', + test: async () => { + const result = await actor.test_itertools(); + const expected = [ + 'ab', + 'ac', + 'ad', + 'ba', + 'bc', + 'bd', + 'ca', + 'cb', + 'cd', + 'da', + 'db', + 'dc' + ]; + return { + Ok: arrayEquals(result, expected) + }; + } + }, + { + name: 'test_json', + test: async () => { + const result = await actor.test_json(); + return { + Ok: JSON.parse(result)['hello'] === 'world' + }; + } + }, + { + name: 'test_random', + test: async () => { + const result = await actor.test_random(); + return { + Ok: result >= 0 && result <= 1 + }; + } + }, + { + name: 'test_string', + test: async () => { + const result = await actor.test_string(); + return { + Ok: + result === + 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' + }; + } + }, + { + name: 'test_urllib', + test: async () => { + const result = await actor.test_urllib(); + return { + Ok: + result === + 'https://www.example.com/search?query=test&page=1' + }; + } + }, + { + name: 'test_uuid', + test: async () => { + const result = await actor.test_uuid(); + return { + Ok: validateUUID(result) + }; + } + } + ]; +} + +function arrayEquals(a: any[], b: any[]): boolean { + return a.length === b.length && a.every((item, index) => item === b[index]); +} + +function compareUint8Arrays(a: Uint8Array, b: Uint8Array): boolean { + if (a.byteLength !== b.byteLength) return false; + return a.every((val, i) => val === b[i]); +} + +function validateUUID(uuid: string): boolean { + // This regular expression checks if the string is a valid v4 UUID + const pattern = + /^([0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})$/i; + return pattern.test(uuid); +} diff --git a/examples/stdlib/test/tsconfig.json b/examples/stdlib/test/tsconfig.json new file mode 100644 index 000000000..2638f0d8b --- /dev/null +++ b/examples/stdlib/test/tsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "strict": true, + "target": "ES2020", + "moduleResolution": "node", + "allowJs": true, + "outDir": "HACK_BECAUSE_OF_ALLOW_JS" + } +} diff --git a/examples/timers/test/package.json b/examples/timers/test/package.json index 0adc61d01..5f1885eef 100644 --- a/examples/timers/test/package.json +++ b/examples/timers/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.11.1", diff --git a/examples/token_length/src/wip/wip.py b/examples/token_length/src/wip/wip.py index 87669b336..7b01cc62d 100644 --- a/examples/token_length/src/wip/wip.py +++ b/examples/token_length/src/wip/wip.py @@ -50,7 +50,7 @@ class GetNotifierFromNotifiersCanisterResult(Variant, total=False): stable_storage = StableBTreeMap[str, StableFunc]( - memory_id=0, max_key_size=25, max_value_size=1_000 + memory_id=3, max_key_size=25, max_value_size=1_000 ) diff --git a/examples/tuple_types/test/package.json b/examples/tuple_types/test/package.json index 9ac036219..9947e296c 100644 --- a/examples/tuple_types/test/package.json +++ b/examples/tuple_types/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.11.1", diff --git a/examples/update/test/package.json b/examples/update/test/package.json index 9ac036219..9947e296c 100644 --- a/examples/update/test/package.json +++ b/examples/update/test/package.json @@ -1,7 +1,7 @@ { "scripts": { - "pretest": "cd .. && ts-node --transpile-only --ignore=false test/pretest.ts", - "test": "cd .. && ts-node --transpile-only --ignore=false test/test.ts" + "pretest": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/pretest.ts", + "test": "cd .. && KYBRA_REBUILD=true ts-node --transpile-only --ignore=false test/test.ts" }, "devDependencies": { "@dfinity/agent": "0.11.1", diff --git a/kybra/__main__.py b/kybra/__main__.py index 3b77e9d03..5ad12349a 100644 --- a/kybra/__main__.py +++ b/kybra/__main__.py @@ -10,11 +10,12 @@ from typing import Any, Callable import kybra +from kybra.build_wasm_binary_or_exit import build_wasm_binary_or_exit +from kybra.cargotoml import generate_cargo_toml, generate_cargo_lock from kybra.colors import red, yellow, green, dim +from kybra.run_kybra_generate_or_exit import run_kybra_generate_or_exit from kybra.timed import timed, timed_inline from kybra.types import Args, Paths -from kybra.cargotoml import generate_cargo_toml, generate_cargo_lock -from kybra.candid import generate_candid_file # type: ignore @timed @@ -54,7 +55,7 @@ def main(): create_file(f"{paths['canister']}/Cargo.lock", generate_cargo_lock()) create_file( f"{paths['canister']}/post_install.sh", - generate_post_install_script(canister_name, kybra.__rust_version__), + generate_post_install_script(canister_name, kybra.__rust_version__, is_verbose), ) os.system(f"chmod +x {paths['canister']}/post_install.sh") @@ -66,6 +67,9 @@ def main(): "RUSTUP_HOME": paths["global_kybra_rust_dir"], } + if not os.path.exists(paths["global_kybra_bin_dir"]): + os.makedirs(paths["global_kybra_bin_dir"]) + compile_python_or_exit( paths, cargo_env, verbose=is_verbose, label="[1/3] šŸ”Ø Compiling Python..." ) @@ -89,24 +93,30 @@ def main(): print(f"\nšŸŽ‰ Built canister {green(canister_name)} at {dim(paths['gzipped_wasm'])}") -def generate_post_install_script(canister_name: str, rust_version: str) -> str: +def generate_post_install_script( + canister_name: str, rust_version: str, is_verbose: bool +) -> str: + main_command = f"KYBRA_VERSION={kybra.__version__} cargo run --manifest-path=.kybra/{canister_name}/kybra_post_install/Cargo.toml {canister_name}" + main_command_not_verbose = f'exec 3>&1; output=$({main_command} 2>&1 1>&3 3>&-); exit_code=$?; exec 3>&-; if [ $exit_code -ne 0 ]; then echo "$output"; exit $exit_code; fi' + return f"""#!/bin/bash rust_version="{rust_version}" global_kybra_config_dir=~/.config/kybra -global_kybra_rust_dir="$global_kybra_config_dir"/"$rust_version" -global_kybra_bin_dir="$global_kybra_rust_dir"/bin +global_kybra_rust_dir="$global_kybra_config_dir"/rust/"$rust_version" +global_kybra_rust_bin_dir="$global_kybra_rust_dir"/bin global_kybra_logs_dir="$global_kybra_rust_dir"/logs -global_kybra_cargo_bin="$global_kybra_bin_dir"/cargo -global_kybra_rustup_bin="$global_kybra_bin_dir"/rustup +global_kybra_cargo_bin="$global_kybra_rust_bin_dir"/cargo +global_kybra_rustup_bin="$global_kybra_rust_bin_dir"/rustup -export CARGO_TARGET_DIR="$global_kybra_config_dir"/target +export CARGO_TARGET_DIR="$global_kybra_config_dir"/rust/target export CARGO_HOME="$global_kybra_rust_dir" export RUSTUP_HOME="$global_kybra_rust_dir" -touch .kybra/{canister_name}/kybra_modules_init/src/main.rs -cargo run --manifest-path=.kybra/{canister_name}/kybra_modules_init/Cargo.toml {canister_name} &> "$global_kybra_logs_dir"/kybra_modules_init +echo "\nPreparing canister binaries for upload...\n" + +{main_command if is_verbose else main_command_not_verbose} """ @@ -122,7 +132,7 @@ def parse_args_or_exit(args: list[str]) -> Args: sys.exit(0) if len(args) != 3: - print(red("\nšŸ’£ wrong number of arguments\n")) + print(red("\nšŸ’£ Kybra error: wrong number of arguments\n")) print("Usage: kybra [-v|--verbose] ") print("\nšŸ’€ Build failed!") sys.exit(1) @@ -178,9 +188,10 @@ def create_paths(args: Args) -> Paths: home_dir = os.path.expanduser("~") global_kybra_config_dir = f"{home_dir}/.config/kybra" - global_kybra_rust_dir = f"{global_kybra_config_dir}/{kybra.__rust_version__}" - global_kybra_bin_dir = f"{global_kybra_rust_dir}/bin" - global_kybra_target_dir = f"{global_kybra_config_dir}/target" + global_kybra_rust_dir = f"{global_kybra_config_dir}/rust/{kybra.__rust_version__}" + global_kybra_rust_bin_dir = f"{global_kybra_rust_dir}/bin" + global_kybra_target_dir = f"{global_kybra_config_dir}/rust/target" + global_kybra_bin_dir = f"{global_kybra_config_dir}/{kybra.__version__}/bin" return { "py_entry_file": py_entry_file_path, @@ -197,8 +208,9 @@ def create_paths(args: Args) -> Paths: "custom_modules": custom_modules_path, "global_kybra_config_dir": global_kybra_config_dir, "global_kybra_rust_dir": global_kybra_rust_dir, - "global_kybra_bin_dir": global_kybra_bin_dir, + "global_kybra_rust_bin_dir": global_kybra_rust_bin_dir, "global_kybra_target_dir": global_kybra_target_dir, + "global_kybra_bin_dir": global_kybra_bin_dir, } @@ -260,6 +272,7 @@ def bundle_python_code(paths: Paths): node.packagepath[0], # type: ignore f"{python_source_path}/{node.identifier}", # type: ignore dirs_exist_ok=True, + ignore=ignore_specific_dir, ) if type(node) == modulegraph.modulegraph.NamespacePackage: # type: ignore @@ -267,11 +280,12 @@ def bundle_python_code(paths: Paths): node.packagepath[0], # type: ignore f"{python_source_path}/{node.identifier}", # type: ignore dirs_exist_ok=True, + ignore=ignore_specific_dir, ) py_file_names = list( # type: ignore filter( - lambda filename: filename is not None, # type: ignore + lambda filename: filename is not None and filename.endswith(".py"), # type: ignore map( lambda node: node.filename, # type: ignore filter( @@ -286,33 +300,11 @@ def bundle_python_code(paths: Paths): create_file(paths["py_file_names_file"], ",".join(py_file_names)) # type: ignore -def run_kybra_generate_or_exit(paths: Paths, cargo_env: dict[str, str], verbose: bool): - # Generate the Rust code - kybra_generate_result = subprocess.run( - [ - f"{paths['global_kybra_bin_dir']}/cargo", - "run", - f"--manifest-path={paths['canister']}/kybra_generate/Cargo.toml", - paths["py_file_names_file"], - paths["py_entry_module_name"], - paths["lib"], - ], - capture_output=not verbose, - env=cargo_env, - ) - - if kybra_generate_result.returncode != 0: - print( - red("\nšŸ’£ Something about your Python code violates Kybra's requirements\n") - ) - print(parse_kybra_generate_error(kybra_generate_result.stderr)) - print( - "\nIf you are unable to decipher the error above, reach out in the #typescript" - ) - print("channel of the DFINITY DEV OFFICIAL discord:") - print("\nhttps://discord.com/channels/748416164832608337/1019372359775440988\n") - print("šŸ’€ Build failed") - sys.exit(1) +def ignore_specific_dir(dirname: str, filenames: list[str]) -> list[str]: + if "kybra_post_install/src/Lib" in dirname: + return filenames + else: + return [] def parse_kybra_generate_error(stdout: bytes) -> str: @@ -328,10 +320,7 @@ def parse_kybra_generate_error(stdout: bytes) -> str: i for i, v in enumerate(std_err_lines) if "', src/" in v ) except: - return ( - "The underlying cause is likely at the bottom of the following output:\n\n" - + err - ) + return err err_lines = std_err_lines[ line_where_error_message_starts : line_where_error_message_ends + 1 @@ -344,17 +333,17 @@ def parse_kybra_generate_error(stdout: bytes) -> str: def run_rustfmt_or_exit(paths: Paths, cargo_env: dict[str, str], verbose: bool = False): rustfmt_result = subprocess.run( - [f"{paths['global_kybra_bin_dir']}/rustfmt", "--edition=2018", paths["lib"]], + [ + f"{paths['global_kybra_rust_bin_dir']}/rustfmt", + "--edition=2018", + paths["lib"], + ], capture_output=not verbose, env=cargo_env, ) if rustfmt_result.returncode != 0: - print( - red( - "\nšŸ’£ Kybra has experienced an internal error while trying to\n format your generated rust canister" - ) - ) + print(red("\nšŸ’£ Kybra error: internal Rust formatting")) print( f'\nPlease open an issue at https://github.com/demergent-labs/kybra/issues/new\nincluding this message and the following error:\n\n {red(rustfmt_result.stderr.decode("utf-8"))}' ) @@ -362,72 +351,45 @@ def run_rustfmt_or_exit(paths: Paths, cargo_env: dict[str, str], verbose: bool = sys.exit(1) -@timed_inline -def build_wasm_binary_or_exit( - paths: Paths, canister_name: str, cargo_env: dict[str, str], verbose: bool = False -): - # Compile the generated Rust code - cargo_build_result = subprocess.run( - [ - f"{paths['global_kybra_bin_dir']}/cargo", - "build", - f"--manifest-path={paths['canister']}/Cargo.toml", - "--target=wasm32-unknown-unknown", - f"--package={canister_name}", - "--release", - ], - capture_output=not verbose, - env=cargo_env, - ) - - if cargo_build_result.returncode != 0: - print(red("\nšŸ’£ Error building Wasm binary:")) - print(cargo_build_result.stderr.decode("utf-8")) - print("šŸ’€ Build failed") - sys.exit(1) - - shutil.copy( - f"{paths['global_kybra_target_dir']}/wasm32-unknown-unknown/release/{canister_name}.wasm", - paths["wasm"], - ) - - candid_file = generate_candid_file(paths) - create_file(paths["did"], candid_file) - - @timed_inline def optimize_wasm_binary_or_exit( paths: Paths, canister_name: str, cargo_env: dict[str, str], verbose: bool = False ): - # Optimize the Wasm binary optimization_result = subprocess.run( [ - f"{paths['global_kybra_bin_dir']}/ic-cdk-optimizer", - paths["wasm"], - f"-o={paths['wasm']}", + f"{paths['global_kybra_rust_bin_dir']}/ic-wasm", + f"{paths['canister']}/{canister_name}_app.wasm", + "-o", + f"{paths['canister']}/{canister_name}_app.wasm", + "shrink", + "--optimize", + "Oz", ], capture_output=not verbose, ) if optimization_result.returncode != 0: - print(red("\nšŸ’£ Error optimizing generated Wasm:")) + print(red("\nšŸ’£ Kybra error: optimizing generated Wasm")) print(optimization_result.stderr.decode("utf-8")) print("šŸ’€ Build failed") sys.exit(1) - add_metadata_to_wasm_or_exit(paths, verbose=verbose) + add_metadata_to_wasm_or_exit(paths, canister_name, verbose=verbose) # gzip the Wasm binary os.system(f"gzip -9 -f -k {paths['wasm']}") + os.system(f"gzip -9 -f -k {paths['canister']}/{canister_name}_app.wasm") -def add_metadata_to_wasm_or_exit(paths: Paths, verbose: bool = False): +def add_metadata_to_wasm_or_exit( + paths: Paths, canister_name: str, verbose: bool = False +): add_candid_to_wasm_result = subprocess.run( [ - f"{paths['global_kybra_bin_dir']}/ic-wasm", - paths["wasm"], + f"{paths['global_kybra_rust_bin_dir']}/ic-wasm", + f"{paths['canister']}/{canister_name}_app.wasm", "-o", - paths["wasm"], + f"{paths['canister']}/{canister_name}_app.wasm", "metadata", "candid:service", "-f", @@ -439,17 +401,17 @@ def add_metadata_to_wasm_or_exit(paths: Paths, verbose: bool = False): ) if add_candid_to_wasm_result.returncode != 0: - print(red("\nšŸ’£ Error adding candid to Wasm:")) + print(red("\nšŸ’£ Kybra error: adding candid to Wasm")) print(add_candid_to_wasm_result.stderr.decode("utf-8")) print("šŸ’€ Build failed") sys.exit(1) add_cdk_info_to_wasm_result = subprocess.run( [ - f"{paths['global_kybra_bin_dir']}/ic-wasm", - paths["wasm"], + f"{paths['global_kybra_rust_bin_dir']}/ic-wasm", + f"{paths['canister']}/{canister_name}_app.wasm", "-o", - paths["wasm"], + f"{paths['canister']}/{canister_name}_app.wasm", "metadata", "cdk", "-d", @@ -461,7 +423,7 @@ def add_metadata_to_wasm_or_exit(paths: Paths, verbose: bool = False): ) if add_cdk_info_to_wasm_result.returncode != 0: - print(red("\nšŸ’£ Error adding cdk name/version to Wasm:")) + print(red("\nšŸ’£ Kybra error: adding cdk name/version to Wasm")) print(add_cdk_info_to_wasm_result.stderr.decode("utf-8")) print("šŸ’€ Build failed") sys.exit(1) diff --git a/kybra/build_wasm_binary_or_exit.py b/kybra/build_wasm_binary_or_exit.py new file mode 100644 index 000000000..9162d8f83 --- /dev/null +++ b/kybra/build_wasm_binary_or_exit.py @@ -0,0 +1,135 @@ +import os +import shutil +import subprocess +import sys + +from kybra.candid import generate_candid_file # type: ignore +from kybra.colors import red +from kybra.timed import timed_inline +from kybra.types import Paths + + +@timed_inline +def build_wasm_binary_or_exit( + paths: Paths, canister_name: str, cargo_env: dict[str, str], verbose: bool = False +): + compile_generated_rust_code(paths, canister_name, cargo_env, verbose) + copy_wasm_to_dev_location(paths, canister_name) + generate_and_create_candid_file(paths, canister_name) + run_wasi2ic_on_app_wasm(paths, canister_name, cargo_env, verbose) + handle_deployer_wasm(paths, canister_name, cargo_env, verbose) + + +def compile_generated_rust_code( + paths: Paths, canister_name: str, cargo_env: dict[str, str], verbose: bool +): + run_subprocess( + [ + f"{paths['global_kybra_rust_bin_dir']}/cargo", + "build", + f"--manifest-path={paths['canister']}/Cargo.toml", + "--target=wasm32-wasi", + f"--package={canister_name}", + "--release", + ], + verbose, + cargo_env, + ) + + +def copy_wasm_to_dev_location(paths: Paths, canister_name: str): + copy_file( + f"{paths['global_kybra_target_dir']}/wasm32-wasi/release/{canister_name}.wasm", + f"{paths['canister']}/{canister_name}_app.wasm", + ) + + +def generate_and_create_candid_file(paths: Paths, canister_name: str): + candid_file = generate_candid_file(paths, canister_name) + create_file(paths["did"], candid_file) + + +def run_wasi2ic_on_app_wasm( + paths: Paths, canister_name: str, cargo_env: dict[str, str], verbose: bool +): + run_subprocess( + [ + f"{paths['global_kybra_rust_bin_dir']}/wasi2ic", + f"{paths['canister']}/{canister_name}_app.wasm", + f"{paths['canister']}/{canister_name}_app.wasm", + ], + verbose, + cargo_env, + ) + + +def handle_deployer_wasm( + paths: Paths, canister_name: str, cargo_env: dict[str, str], verbose: bool +): + should_rebuild = get_should_rebuild(paths) + if should_rebuild: + copy_existing_deployer_wasm(paths, canister_name) + else: + build_and_copy_new_deployer_wasm(paths, canister_name, cargo_env, verbose) + + +def copy_existing_deployer_wasm(paths: Paths, canister_name: str): + copy_file( + f"{paths['global_kybra_bin_dir']}/deployer.wasm", + f"{paths['canister']}/{canister_name}.wasm", + ) + + +def build_and_copy_new_deployer_wasm( + paths: Paths, canister_name: str, cargo_env: dict[str, str], verbose: bool +): + run_subprocess( + [ + f"{paths['global_kybra_rust_bin_dir']}/cargo", + "build", + f"--manifest-path={paths['canister']}/kybra_deployer/Cargo.toml", + "--target=wasm32-unknown-unknown", + f"--package=kybra_deployer", + "--release", + ], + verbose, + cargo_env, + ) + + copy_file( + f"{paths['global_kybra_target_dir']}/wasm32-unknown-unknown/release/kybra_deployer.wasm", + f"{paths['canister']}/{canister_name}.wasm", + ) + + copy_file( + f"{paths['canister']}/{canister_name}.wasm", + f"{paths['global_kybra_bin_dir']}/deployer.wasm", + ) + + +def get_should_rebuild(paths: Paths) -> bool: + return os.environ.get("KYBRA_REBUILD") != "true" and os.path.exists( + f"{paths['global_kybra_bin_dir']}/deployer.wasm" + ) + + +def run_subprocess(args: list[str], verbose: bool, env: dict[str, str]): + result = subprocess.run(args, capture_output=not verbose, env=env) + if result.returncode != 0: + print_error_and_exit(result) + + +def copy_file(source: str, destination: str): + shutil.copy(source, destination) + + +def create_file(path: str, content: str): + with open(path, "w") as f: + f.write(content) + + +def print_error_and_exit(result: subprocess.CompletedProcess[bytes]): + print(red("\nšŸ’£ Kybra error: building Wasm binary")) + print(result.stderr.decode("utf-8")) + print("šŸ’€ Build failed") + sys.exit(1) diff --git a/kybra/candid.py b/kybra/candid.py index 87c2cc7a7..81cdcc60e 100644 --- a/kybra/candid.py +++ b/kybra/candid.py @@ -1,10 +1,18 @@ # type: ignore -from wasmer import Store, Module, Instance, ImportObject, Function, FunctionType, Type +from wasmer import ( + Store, + Module, + Instance, + Function, + FunctionType, + Type, + wasi, +) -def generate_candid_file(paths) -> str: - file = open(paths["wasm"], "rb") +def generate_candid_file(paths, canister_name) -> str: + file = open(f"{paths['canister']}/{canister_name}_app.wasm", "rb") wasm_buffer = file.read() file.close() @@ -12,66 +20,116 @@ def generate_candid_file(paths) -> str: module = Module(store, wasm_buffer) - import_object = ImportObject() + wasi_env = wasi.StateBuilder(paths["wasm"]).finalize() + import_object = wasi_env.generate_import_object(store, wasi.Version.LATEST) import_object.register( "ic0", { - "msg_reply": Function(store, lambda _: _, FunctionType([], [])), - "stable_size": Function(store, lambda _: _, FunctionType([], [Type.I32])), - "stable64_size": Function(store, lambda _: _, FunctionType([], [Type.I64])), + "msg_reply": Function( + store, lambda *args, **kwargs: None, FunctionType([], []) + ), + "stable_size": Function( + store, + lambda *args, **kwargs: 0, + FunctionType([], [Type.I32]), + ), + "stable64_size": Function( + store, + lambda *args, **kwargs: 0, + FunctionType([], [Type.I64]), + ), "stable_write": Function( - store, lambda _: _, FunctionType([Type.I32, Type.I32, Type.I32], []) + store, + lambda *args, **kwargs: None, + FunctionType([Type.I32, Type.I32, Type.I32], []), ), "stable_read": Function( - store, lambda _: _, FunctionType([Type.I32, Type.I32, Type.I32], []) + store, + lambda *args, **kwargs: None, + FunctionType([Type.I32, Type.I32, Type.I32], []), ), "debug_print": Function( - store, lambda _: _, FunctionType([Type.I32, Type.I32], []) + store, + lambda *args, **kwargs: None, + FunctionType([Type.I32, Type.I32], []), ), "trap": Function( - store, lambda _: _, FunctionType([Type.I32, Type.I32], []) + store, + lambda *args, **kwargs: None, + FunctionType([Type.I32, Type.I32], []), + ), + "time": Function( + store, + lambda *args, **kwargs: 0, + FunctionType([], [Type.I64]), ), - "time": Function(store, lambda _: _, FunctionType([], [Type.I64])), "msg_caller_size": Function( - store, lambda _: _, FunctionType([], [Type.I32]) + store, + lambda *args, **kwargs: 0, + FunctionType([], [Type.I32]), ), "msg_caller_copy": Function( - store, lambda _: _, FunctionType([Type.I32, Type.I32, Type.I32], []) + store, + lambda *args, **kwargs: None, + FunctionType([Type.I32, Type.I32, Type.I32], []), ), "canister_self_size": Function( - store, lambda _: _, FunctionType([], [Type.I32]) + store, + lambda *args, **kwargs: 0, + FunctionType([], [Type.I32]), ), "canister_self_copy": Function( - store, lambda _: _, FunctionType([Type.I32, Type.I32, Type.I32], []) + store, + lambda *args, **kwargs: None, + FunctionType([Type.I32, Type.I32, Type.I32], []), ), "canister_cycle_balance": Function( - store, lambda _: _, FunctionType([], [Type.I64]) + store, + lambda *args, **kwargs: 0, + FunctionType([], [Type.I64]), ), "canister_cycle_balance128": Function( - store, lambda _: _, FunctionType([Type.I32], []) + store, lambda *args, **kwargs: None, FunctionType([Type.I32], []) + ), + "canister_version": Function( + store, + lambda *args, **kwargs: 0, + FunctionType([], [Type.I64]), ), "certified_data_set": Function( - store, lambda _: _, FunctionType([Type.I32, Type.I32], []) + store, + lambda *args, **kwargs: None, + FunctionType([Type.I32, Type.I32], []), ), "data_certificate_present": Function( - store, lambda _: _, FunctionType([], [Type.I32]) + store, + lambda *args, **kwargs: 0, + FunctionType([], [Type.I32]), ), "data_certificate_size": Function( - store, lambda _: _, FunctionType([], [Type.I32]) + store, + lambda *args, **kwargs: 0, + FunctionType([], [Type.I32]), ), "data_certificate_copy": Function( - store, lambda _: _, FunctionType([Type.I32, Type.I32, Type.I32], []) + store, + lambda *args, **kwargs: None, + FunctionType([Type.I32, Type.I32, Type.I32], []), ), "msg_reply_data_append": Function( - store, lambda _: _, FunctionType([Type.I32, Type.I32], []) + store, + lambda *args, **kwargs: None, + FunctionType([Type.I32, Type.I32], []), ), "call_cycles_add128": Function( - store, lambda _: _, FunctionType([Type.I64, Type.I64], []) + store, + lambda *args, **kwargs: None, + FunctionType([Type.I64, Type.I64], []), ), "call_new": Function( store, - lambda _: _, + lambda *args, **kwargs: None, FunctionType( [ Type.I32, @@ -87,75 +145,121 @@ def generate_candid_file(paths) -> str: ), ), "call_data_append": Function( - store, lambda _: _, FunctionType([Type.I32, Type.I32], []) + store, + lambda *args, **kwargs: None, + FunctionType([Type.I32, Type.I32], []), + ), + "call_perform": Function( + store, + lambda *args, **kwargs: 0, + FunctionType([], [Type.I32]), ), - "call_perform": Function(store, lambda _: _, FunctionType([], [Type.I32])), "call_cycles_add": Function( - store, lambda _: _, FunctionType([Type.I64], []) + store, lambda *args, **kwargs: None, FunctionType([Type.I64], []) ), "call_on_cleanup": Function( - store, lambda _: _, FunctionType([Type.I32, Type.I32], []) + store, + lambda *args, **kwargs: None, + FunctionType([Type.I32, Type.I32], []), ), "msg_reject_code": Function( - store, lambda _: _, FunctionType([], [Type.I32]) + store, + lambda *args, **kwargs: 0, + FunctionType([], [Type.I32]), ), "msg_reject_msg_size": Function( - store, lambda _: _, FunctionType([], [Type.I32]) + store, + lambda *args, **kwargs: 0, + FunctionType([], [Type.I32]), ), "msg_reject_msg_copy": Function( - store, lambda _: _, FunctionType([Type.I32, Type.I32, Type.I32], []) + store, + lambda *args, **kwargs: None, + FunctionType([Type.I32, Type.I32, Type.I32], []), ), "msg_reject": Function( - store, lambda _: _, FunctionType([Type.I32, Type.I32], []) + store, + lambda *args, **kwargs: None, + FunctionType([Type.I32, Type.I32], []), ), "msg_cycles_available": Function( - store, lambda _: _, FunctionType([], [Type.I64]) + store, + lambda *args, **kwargs: 0, + FunctionType([], [Type.I64]), ), "msg_cycles_available128": Function( - store, lambda _: _, FunctionType([Type.I32], []) + store, lambda *args, **kwargs: None, FunctionType([Type.I32], []) ), "msg_cycles_refunded": Function( - store, lambda _: _, FunctionType([], [Type.I64]) + store, + lambda *args, **kwargs: 0, + FunctionType([], [Type.I64]), ), "msg_cycles_refunded128": Function( - store, lambda _: _, FunctionType([Type.I32], []) + store, lambda *args, **kwargs: None, FunctionType([Type.I32], []) ), "msg_cycles_accept": Function( - store, lambda _: _, FunctionType([Type.I64], [Type.I64]) + store, + lambda *args, **kwargs: 0, + FunctionType([Type.I64], [Type.I64]), ), "msg_cycles_accept128": Function( - store, lambda _: _, FunctionType([Type.I64, Type.I64, Type.I32], []) + store, + lambda *args, **kwargs: None, + FunctionType([Type.I64, Type.I64, Type.I32], []), ), "msg_arg_data_size": Function( - store, lambda _: _, FunctionType([], [Type.I32]) + store, + lambda *args, **kwargs: 0, + FunctionType([], [Type.I32]), ), "msg_arg_data_copy": Function( - store, lambda _: _, FunctionType([Type.I32, Type.I32, Type.I32], []) + store, + lambda *args, **kwargs: None, + FunctionType([Type.I32, Type.I32, Type.I32], []), + ), + "accept_message": Function( + store, lambda *args, **kwargs: None, FunctionType([], []) ), - "accept_message": Function(store, lambda _: _, FunctionType([], [])), "msg_method_name_size": Function( - store, lambda _: _, FunctionType([], [Type.I32]) + store, + lambda *args, **kwargs: 0, + FunctionType([], [Type.I32]), ), "msg_method_name_copy": Function( - store, lambda _: _, FunctionType([Type.I32, Type.I32, Type.I32], []) + store, + lambda *args, **kwargs: None, + FunctionType([Type.I32, Type.I32, Type.I32], []), ), "performance_counter": Function( - store, lambda _: _, FunctionType([Type.I32], [Type.I64]) + store, + lambda *args, **kwargs: 0, + FunctionType([Type.I32], [Type.I64]), ), "stable_grow": Function( - store, lambda _: _, FunctionType([Type.I32], [Type.I32]) + store, + lambda *args, **kwargs: 0, + FunctionType([Type.I32], [Type.I32]), ), "stable64_grow": Function( - store, lambda _: _, FunctionType([Type.I64], [Type.I64]) + store, + lambda *args, **kwargs: 0, + FunctionType([Type.I64], [Type.I64]), ), "stable64_write": Function( - store, lambda _: _, FunctionType([Type.I64, Type.I64, Type.I64], []) + store, + lambda *args, **kwargs: None, + FunctionType([Type.I64, Type.I64, Type.I64], []), ), "stable64_read": Function( - store, lambda _: _, FunctionType([Type.I64, Type.I64, Type.I64], []) + store, + lambda *args, **kwargs: None, + FunctionType([Type.I64, Type.I64, Type.I64], []), ), "global_timer_set": Function( - store, lambda _: _, FunctionType([Type.I64], [Type.I64]) + store, + lambda *args, **kwargs: 0, + FunctionType([Type.I64], [Type.I64]), ), }, ) diff --git a/kybra/cargotoml.py b/kybra/cargotoml.py index 29e73adef..58852ecfb 100644 --- a/kybra/cargotoml.py +++ b/kybra/cargotoml.py @@ -7,26 +7,31 @@ def generate_cargo_toml(canister_name: str) -> str: [profile.release] opt-level = 'z' -# codegen-units = 1 -# lto = true +codegen-units = 1 +lto = "fat" [lib] crate-type = ["cdylib"] [dependencies] -ic-cdk = "0.8.0-beta" +ic-cdk = "=0.8.0-beta.0" ic-cdk-macros = "0.6.10" ic-cdk-timers = "0.1.2" candid = {{ version = "0.9.0-beta.2", features = ["parser"] }} kybra-vm-value-derive = {{ path = "./kybra_vm_value_derive" }} -# TODO add this back once we support the full stdlib: https://github.com/demergent-labs/kybra/issues/12 -# rustpython = {{ git = "https://github.com/demergent-labs/RustPython", rev = "b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874", default-features = false, features = ["stdlib", "freeze-stdlib"] }} -rustpython = {{ git = "https://github.com/demergent-labs/RustPython", rev = "b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874", default-features = false, features = ["stdlib"] }} + +rustpython = {{ git = "https://github.com/demergent-labs/RustPython", rev = "b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874", default-features = false, features = ["stdlib", "encodings"] }} rustpython-vm = {{ git = "https://github.com/demergent-labs/RustPython", rev = "b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874", default-features = false, features = ["ic"] }} rustpython-stdlib = {{ git = "https://github.com/demergent-labs/RustPython", rev = "b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874", default-features = false, features = [] }} rustpython-derive = {{ git = "https://github.com/demergent-labs/RustPython", rev = "b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874", default-features = false, features = [] }} rustpython-compiler-core = {{ git = "https://github.com/demergent-labs/RustPython", rev = "b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874", default-features = false, features = [] }} -# rustpython-pylib = {{ git = "https://github.com/demergent-labs/RustPython", rev = "b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874", default-features = false, features = ["freeze-stdlib"] }} + +# rustpython = {{ path = "/home/lastmjs/development/RustPython", default-features = false, features = ["stdlib", "encodings"] }} +# rustpython-vm = {{ path = "/home/lastmjs/development/RustPython/vm", default-features = false, features = ["ic"] }} +# rustpython-stdlib = {{ path = "/home/lastmjs/development/RustPython/stdlib", default-features = false, features = [] }} +# rustpython-derive = {{ path = "/home/lastmjs/development/RustPython/derive", default-features = false, features = [] }} +# rustpython-compiler-core = {{ path = "/home/lastmjs/development/RustPython/compiler/core", default-features = false, features = [] }} + # rustpython = {{ path = "/home/RustPython", default-features = false, features = ["stdlib"] }} # rustpython-vm = {{ path = "/home/RustPython/vm", default-features = false, features = ["ic"] }} # rustpython-stdlib = {{ path = "/home/RustPython/stdlib", default-features = false, features = [] }} @@ -34,12 +39,16 @@ def generate_cargo_toml(canister_name: str) -> str: # TODO add this back once we support the full stdlib: https://github.com/demergent-labs/kybra/issues/12 # rustpython-pylib = {{ git = "https://github.com/demergent-labs/RustPython", rev = "b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874", default-features = false, features = ["freeze-stdlib"] }} # rustpython = {{ path = "../../../../../../RustPython", default-features = false, features = [] }} -getrandom = {{ version = "0.2.3", features = ["custom"] }} -serde = "1.0.137" +serde = {{ version = "1.0.137", default-features = false, features = [] }} async-recursion = "1.0.0" ic-stable-structures = "0.5.2" slotmap = "1.0.6" -rand = "0.8.5" +ic-wasi-polyfill = {{ git = "https://github.com/demergent-labs/ic-wasi-polyfill", rev = "9b039919427ccd76bf452f012bdbfe3695e549a6" }} +# ic-wasi-polyfill = {{ git = "https://github.com/wasm-forge/ic-wasi-polyfill", rev = "5e986cb3b95a58fbbf9386582f5c48847f22dcca" }} +# ic-wasi-polyfill = {{ path = "/home/lastmjs/development/ic-wasi-polyfill", features = ["transient", "report_wasi_calls"] }} + +[patch.crates-io] +num-bigint = {{ git = "https://github.com/rust-num/num-bigint" }} """ @@ -80,9 +89,9 @@ def generate_cargo_lock() -> str: [[package]] name = "aho-corasick" -version = "0.7.20" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" +checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" dependencies = [ "memchr", ] @@ -98,9 +107,9 @@ def generate_cargo_lock() -> str: [[package]] name = "anyhow" -version = "1.0.70" +version = "1.0.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7de8ce5e0f9f8d88245311066a578d72b7af3e7088f32783804676302df237e4" +checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8" [[package]] name = "arrayvec" @@ -131,17 +140,14 @@ def generate_cargo_lock() -> str: dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.18", ] [[package]] name = "atomic" -version = "0.5.1" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b88d82667eca772c4aa12f0f1348b3ae643424c8876448f3f7bd5787032e234c" -dependencies = [ - "autocfg", -] +checksum = "c59bdb34bc650a32731b31bd8f0829cc15d24a708ee31559e0bb34f2bc320cba" [[package]] name = "atty" @@ -216,6 +222,12 @@ def generate_cargo_lock() -> str: source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitflags" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbe3c979c178231552ecba20214a8272df4e09f232a87aef4320cf06539aded" + [[package]] name = "blake2" version = "0.10.6" @@ -247,9 +259,9 @@ def generate_cargo_lock() -> str: [[package]] name = "bumpalo" -version = "3.12.0" +version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" +checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" [[package]] name = "byteorder" @@ -288,14 +300,14 @@ def generate_cargo_lock() -> str: [[package]] name = "candid" -version = "0.9.0-beta.3" +version = "0.9.0-beta.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ee0d6ee2234fc18021430aad8c6125f6856407014f2c2e8baf74c236427dbfc" +checksum = "3005be607a05b449b5a5a144839c5731699af5c309ce20eb5c812f889683601e" dependencies = [ "anyhow", "binread", "byteorder", - "candid_derive 0.6.0", + "candid_derive 0.6.1", "codespan-reporting", "crc32fast", "data-encoding", @@ -330,9 +342,9 @@ def generate_cargo_lock() -> str: [[package]] name = "candid_derive" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34df46ac8b0a44de9b243d9dd21e608838183be20de408c934993ed6a4a8e4c1" +checksum = "041ce1020740a400035899b2909a6f4f275b79c8db502cbd59ace9b2cc88af58" dependencies = [ "lazy_static", "proc-macro2", @@ -359,7 +371,7 @@ def generate_cargo_lock() -> str: [[package]] name = "cdk_framework" version = "0.0.0" -source = "git+https://github.com/demergent-labs/cdk_framework?rev=08a74a4077d0981acde2b0fc714e877bba659b9e#08a74a4077d0981acde2b0fc714e877bba659b9e" +source = "git+https://github.com/demergent-labs/cdk_framework?rev=13c4abdd72bdcfa6a5b1ddf7f08a4fd83eacb419#13c4abdd72bdcfa6a5b1ddf7f08a4fd83eacb419" dependencies = [ "proc-macro2", "quote", @@ -385,6 +397,33 @@ def generate_cargo_lock() -> str: "winapi", ] +[[package]] +name = "ciborium" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "effd91f6c78e5a4ace8a5d3c0b6bfaec9e2baaef55f3efc00e45fb2e477ee926" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdf919175532b369853f5d5e20b26b43112613fd6fe7aee757e35f7a44642656" + +[[package]] +name = "ciborium-ll" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defaa24ecc093c77630e6c15e17c51f5e187bf35ee514f4e2d67baaa96dae22b" +dependencies = [ + "ciborium-io", + "half", +] + [[package]] name = "clap" version = "2.34.0" @@ -393,7 +432,7 @@ def generate_cargo_lock() -> str: dependencies = [ "ansi_term", "atty", - "bitflags", + "bitflags 1.3.2", "strsim", "textwrap 0.11.0", "unicode-width", @@ -421,6 +460,27 @@ def generate_cargo_lock() -> str: "unicode-width", ] +[[package]] +name = "complex_init" +version = "0.0.0" +dependencies = [ + "async-recursion", + "candid 0.9.0-beta.4", + "ic-cdk 0.8.0-beta.0", + "ic-cdk-macros 0.6.10", + "ic-cdk-timers", + "ic-stable-structures", + "ic-wasi-polyfill", + "kybra-vm-value-derive", + "rustpython", + "rustpython-compiler-core", + "rustpython-derive", + "rustpython-stdlib", + "rustpython-vm", + "serde", + "slotmap", +] + [[package]] name = "core-foundation" version = "0.9.3" @@ -439,9 +499,9 @@ def generate_cargo_lock() -> str: [[package]] name = "cpufeatures" -version = "0.2.6" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "280a9f2d8b3a38871a3c8a46fb80db65e5e5ed97da80c4d08bf27fb63e35e181" +checksum = "03e69e28e9f7f77debdedbaafa2866e1de9ba56df55a8bd7cfc724c25a09987c" dependencies = [ "libc", ] @@ -457,9 +517,9 @@ def generate_cargo_lock() -> str: [[package]] name = "crossbeam-utils" -version = "0.8.15" +version = "0.8.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b" +checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" dependencies = [ "cfg-if", ] @@ -491,9 +551,9 @@ def generate_cargo_lock() -> str: [[package]] name = "data-encoding" -version = "2.3.3" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23d8666cb01533c39dde32bcbab8e227b4ed6679b2c925eba05feabea39508fb" +checksum = "c2e66c9d817f1720209181c316d28635c050fa304f9c79e47a520882661b7308" [[package]] name = "diff" @@ -503,9 +563,9 @@ def generate_cargo_lock() -> str: [[package]] name = "digest" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "crypto-common", @@ -639,9 +699,9 @@ def generate_cargo_lock() -> str: [[package]] name = "flate2" -version = "1.0.25" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8a2db397cb1c8772f31494cb8917e48cd1e64f0fa7efac59fbd741a0a8ce841" +checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" dependencies = [ "crc32fast", "miniz_oxide", @@ -653,6 +713,21 @@ def generate_cargo_lock() -> str: source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "function_name" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1ab577a896d09940b5fe12ec5ae71f9d8211fff62c919c03a3750a9901e98a7" +dependencies = [ + "function_name-proc-macro", +] + +[[package]] +name = "function_name-proc-macro" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "673464e1e314dd67a0fd9544abc99e8eb28d0c7e3b69b033bcff9b2d00b87333" + [[package]] name = "futures" version = "0.3.28" @@ -709,7 +784,7 @@ def generate_cargo_lock() -> str: dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.18", ] [[package]] @@ -764,9 +839,9 @@ def generate_cargo_lock() -> str: [[package]] name = "getrandom" -version = "0.2.9" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c85e1d9ab2eadba7e5040d4e09cbd6d072b76a557ad64e797c2cb9d4da21d7e4" +checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" dependencies = [ "cfg-if", "libc", @@ -852,7 +927,7 @@ def generate_cargo_lock() -> str: source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "229a2796b731794363b45ab7b3a8ae28dc4220256997709e52746887425c5135" dependencies = [ - "candid 0.9.0-beta.3", + "candid 0.9.0-beta.4", "ic-cdk-macros 0.8.0-beta.0", "ic0", "serde", @@ -879,7 +954,7 @@ def generate_cargo_lock() -> str: source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8ed566a9a45e97f8dd7eed3db58c95875272dbf053f0d94a965319cbffdb9e0" dependencies = [ - "candid 0.9.0-beta.3", + "candid 0.9.0-beta.4", "proc-macro2", "quote", "serde", @@ -903,15 +978,27 @@ def generate_cargo_lock() -> str: [[package]] name = "ic-stable-structures" -version = "0.5.2" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d43ba7c5067d1360860e2234d93411d2126c8eac788467966ed1383161f91fc" +checksum = "b4e026318236de13568edafd85534ad29910908bf08cdcf177d4403fd4a5f6c4" + +[[package]] +name = "ic-wasi-polyfill" +version = "0.3.9" +source = "git+https://github.com/demergent-labs/ic-wasi-polyfill?rev=9b039919427ccd76bf452f012bdbfe3695e549a6#9b039919427ccd76bf452f012bdbfe3695e549a6" +dependencies = [ + "function_name", + "ic-cdk 0.8.0-beta.0", + "ic-stable-structures", + "rand", + "stable-fs", +] [[package]] name = "ic0" -version = "0.18.9" +version = "0.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978b91fc78de9d2eb0144db717839cde3b35470199ea51aca362cb6310e93dfd" +checksum = "187fa0cecf46628330b7a390a1a65fb0637ea00d3a1121aa847ecbebc0f3ff79" [[package]] name = "indexmap" @@ -925,9 +1012,9 @@ def generate_cargo_lock() -> str: [[package]] name = "io-lifetimes" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" dependencies = [ "hermit-abi 0.3.1", "libc", @@ -970,9 +1057,9 @@ def generate_cargo_lock() -> str: [[package]] name = "keccak" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3afef3b6eff9ce9d8ff9b3601125eec7f0c8cbac7abd14f355d053fa56c98768" +checksum = "8f6d5ed8676d904364de097082f4e7d240b571b67989ced0240f08b7f966f940" dependencies = [ "cpufeatures", ] @@ -989,9 +1076,9 @@ def generate_cargo_lock() -> str: [[package]] name = "lalrpop" -version = "0.19.9" +version = "0.19.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f34313ec00c2eb5c3c87ca6732ea02dcf3af99c3ff7a8fb622ffb99c9d860a87" +checksum = "0a1cbf952127589f2851ab2046af368fd20645491bb4b376f04b7f94d7a9837b" dependencies = [ "ascii-canvas", "bit-set", @@ -1001,9 +1088,8 @@ def generate_cargo_lock() -> str: "itertools", "lalrpop-util", "petgraph", - "pico-args", "regex", - "regex-syntax", + "regex-syntax 0.6.29", "string_cache", "term", "tiny-keccak", @@ -1012,9 +1098,9 @@ def generate_cargo_lock() -> str: [[package]] name = "lalrpop-util" -version = "0.19.9" +version = "0.19.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5c1f7869c94d214466c5fd432dfed12c379fd87786768d36455892d46b18edd" +checksum = "d3c48237b9604c5a4702de6b824e02006c3214327564636aef27c1028a8fa0ed" dependencies = [ "regex", ] @@ -1063,9 +1149,9 @@ def generate_cargo_lock() -> str: [[package]] name = "libc" -version = "0.2.141" +version = "0.2.146" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3304a64d199bb964be99741b7a14d26972741915b3649639149b2479bb46f4b5" +checksum = "f92be4933c13fd498862a9e02a3055f8a8d9c039ce33db97306fd5a6caa7f29b" [[package]] name = "libsqlite3-sys" @@ -1080,15 +1166,15 @@ def generate_cargo_lock() -> str: [[package]] name = "linux-raw-sys" -version = "0.3.1" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d59d8c75012853d2e872fb56bc8a2e53718e2cafe1a4c823143141c6d90c322f" +checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" [[package]] name = "lock_api" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" +checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" dependencies = [ "autocfg", "scopeguard", @@ -1096,12 +1182,9 @@ def generate_cargo_lock() -> str: [[package]] name = "log" -version = "0.4.17" +version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if", -] +checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" [[package]] name = "logos" @@ -1122,7 +1205,7 @@ def generate_cargo_lock() -> str: "fnv", "proc-macro2", "quote", - "regex-syntax", + "regex-syntax 0.6.29", "syn 1.0.109", ] @@ -1137,9 +1220,9 @@ def generate_cargo_lock() -> str: [[package]] name = "mac_address" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b238e3235c8382b7653c6408ed1b08dd379bdb9fdf990fb0bbae3db2cc0ae963" +checksum = "4863ee94f19ed315bf3bc00299338d857d4b5bc856af375cc97d237382ad3856" dependencies = [ "nix 0.23.2", "winapi", @@ -1201,9 +1284,9 @@ def generate_cargo_lock() -> str: [[package]] name = "miniz_oxide" -version = "0.6.2" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" dependencies = [ "adler", ] @@ -1238,7 +1321,7 @@ def generate_cargo_lock() -> str: source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f3790c00a0150112de0f4cd161e3d7fc4b2d8a5542ffc35f099a2562aecb35c" dependencies = [ - "bitflags", + "bitflags 1.3.2", "cc", "cfg-if", "libc", @@ -1251,7 +1334,7 @@ def generate_cargo_lock() -> str: source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfdda3d196821d6af13126e40375cdf7da646a96114af134d5f417a9a1dc8e1a" dependencies = [ - "bitflags", + "bitflags 1.3.2", "cfg-if", "libc", "memoffset 0.7.1", @@ -1262,8 +1345,7 @@ def generate_cargo_lock() -> str: [[package]] name = "num-bigint" version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" +source = "git+https://github.com/rust-num/num-bigint#6f2b8e0fc218dbd0f49bebb8db2d1a771fe6bafa" dependencies = [ "autocfg", "num-integer", @@ -1344,9 +1426,9 @@ def generate_cargo_lock() -> str: [[package]] name = "once_cell" -version = "1.17.1" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[package]] name = "optional" @@ -1376,15 +1458,15 @@ def generate_cargo_lock() -> str: [[package]] name = "parking_lot_core" -version = "0.9.7" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" +checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.3.5", "smallvec", - "windows-sys 0.45.0", + "windows-targets", ] [[package]] @@ -1450,12 +1532,6 @@ def generate_cargo_lock() -> str: "siphasher", ] -[[package]] -name = "pico-args" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db8bcd96cb740d03149cbad5518db9fd87126a10ab519c011893b1754134c468" - [[package]] name = "pin-project-lite" version = "0.2.9" @@ -1470,9 +1546,9 @@ def generate_cargo_lock() -> str: [[package]] name = "pkg-config" -version = "0.3.26" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" +checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" [[package]] name = "pmutil" @@ -1519,9 +1595,9 @@ def generate_cargo_lock() -> str: [[package]] name = "proc-macro2" -version = "1.0.56" +version = "1.0.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" +checksum = "dec2b086b7a862cf4de201096214fa870344cf922b2b30c167badb3af3195406" dependencies = [ "unicode-ident", ] @@ -1541,32 +1617,11 @@ def generate_cargo_lock() -> str: source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b7e158a385023d209d6d5f2585c4b468f6dcb3dd5aca9b75c4f1678c05bb375" -[[package]] -name = "query" -version = "0.0.0" -dependencies = [ - "async-recursion", - "candid 0.9.0-beta.3", - "getrandom", - "ic-cdk 0.8.0-beta.0", - "ic-cdk-macros 0.6.10", - "ic-cdk-timers", - "ic-stable-structures", - "kybra-vm-value-derive", - "rand", - "rustpython", - "rustpython-derive", - "rustpython-stdlib", - "rustpython-vm", - "serde", - "slotmap", -] - [[package]] name = "quote" -version = "1.0.26" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" +checksum = "1b9ab9c7eadfd8df19006f1cf1a4aed13540ed5cbc047010ece5826e10825488" dependencies = [ "proc-macro2", ] @@ -1623,7 +1678,16 @@ def generate_cargo_lock() -> str: source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" dependencies = [ - "bitflags", + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +dependencies = [ + "bitflags 1.3.2", ] [[package]] @@ -1633,19 +1697,19 @@ def generate_cargo_lock() -> str: checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" dependencies = [ "getrandom", - "redox_syscall", + "redox_syscall 0.2.16", "thiserror", ] [[package]] name = "regex" -version = "1.7.3" +version = "1.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b1f693b24f6ac912f4893ef08244d70b6067480d2f1a46e950c9691e6749d1d" +checksum = "d0ab3ca65655bb1e41f2a8c8cd662eb4fb035e67c3f78da1d61dffe89d07300f" dependencies = [ "aho-corasick", "memchr", - "regex-syntax", + "regex-syntax 0.7.2", ] [[package]] @@ -1660,6 +1724,12 @@ def generate_cargo_lock() -> str: source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" +[[package]] +name = "regex-syntax" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436b050e76ed2903236f032a59761c1eb99e1b0aead2c257922771dab1fc8c78" + [[package]] name = "result-like" version = "0.4.6" @@ -1699,11 +1769,11 @@ def generate_cargo_lock() -> str: [[package]] name = "rustix" -version = "0.37.11" +version = "0.37.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85597d61f83914ddeba6a47b3b8ffe7365107221c2e557ed94426489fefb5f77" +checksum = "b96e891d04aa506a6d1f318d2771bcb1c7dfda84e126660ace067c9b474bb2c0" dependencies = [ - "bitflags", + "bitflags 1.3.2", "errno", "io-lifetimes", "libc", @@ -1714,7 +1784,7 @@ def generate_cargo_lock() -> str: [[package]] name = "rustpython" version = "0.2.0" -source = "git+https://github.com/demergent-labs/RustPython?rev=7483ff7959103d7c4b2a15d718d4f7ad9b57b459#7483ff7959103d7c4b2a15d718d4f7ad9b57b459" +source = "git+https://github.com/demergent-labs/RustPython?rev=b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874#b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874" dependencies = [ "atty", "cfg-if", @@ -1734,7 +1804,7 @@ def generate_cargo_lock() -> str: [[package]] name = "rustpython-ast" version = "0.2.0" -source = "git+https://github.com/demergent-labs/RustPython?rev=7483ff7959103d7c4b2a15d718d4f7ad9b57b459#7483ff7959103d7c4b2a15d718d4f7ad9b57b459" +source = "git+https://github.com/demergent-labs/RustPython?rev=b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874#b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874" dependencies = [ "num-bigint", "rustpython-common", @@ -1744,10 +1814,10 @@ def generate_cargo_lock() -> str: [[package]] name = "rustpython-codegen" version = "0.2.0" -source = "git+https://github.com/demergent-labs/RustPython?rev=7483ff7959103d7c4b2a15d718d4f7ad9b57b459#7483ff7959103d7c4b2a15d718d4f7ad9b57b459" +source = "git+https://github.com/demergent-labs/RustPython?rev=b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874#b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874" dependencies = [ "ahash", - "bitflags", + "bitflags 1.3.2", "indexmap", "itertools", "log", @@ -1760,10 +1830,10 @@ def generate_cargo_lock() -> str: [[package]] name = "rustpython-common" version = "0.2.0" -source = "git+https://github.com/demergent-labs/RustPython?rev=7483ff7959103d7c4b2a15d718d4f7ad9b57b459#7483ff7959103d7c4b2a15d718d4f7ad9b57b459" +source = "git+https://github.com/demergent-labs/RustPython?rev=b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874#b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874" dependencies = [ "ascii", - "bitflags", + "bitflags 1.3.2", "bstr", "cfg-if", "hexf-parse", @@ -1786,7 +1856,7 @@ def generate_cargo_lock() -> str: [[package]] name = "rustpython-compiler" version = "0.2.0" -source = "git+https://github.com/demergent-labs/RustPython?rev=7483ff7959103d7c4b2a15d718d4f7ad9b57b459#7483ff7959103d7c4b2a15d718d4f7ad9b57b459" +source = "git+https://github.com/demergent-labs/RustPython?rev=b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874#b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874" dependencies = [ "rustpython-codegen", "rustpython-compiler-core", @@ -1796,9 +1866,9 @@ def generate_cargo_lock() -> str: [[package]] name = "rustpython-compiler-core" version = "0.2.0" -source = "git+https://github.com/demergent-labs/RustPython?rev=7483ff7959103d7c4b2a15d718d4f7ad9b57b459#7483ff7959103d7c4b2a15d718d4f7ad9b57b459" +source = "git+https://github.com/demergent-labs/RustPython?rev=b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874#b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874" dependencies = [ - "bitflags", + "bitflags 1.3.2", "bstr", "itertools", "lz4_flex", @@ -1809,7 +1879,7 @@ def generate_cargo_lock() -> str: [[package]] name = "rustpython-derive" version = "0.2.0" -source = "git+https://github.com/demergent-labs/RustPython?rev=7483ff7959103d7c4b2a15d718d4f7ad9b57b459#7483ff7959103d7c4b2a15d718d4f7ad9b57b459" +source = "git+https://github.com/demergent-labs/RustPython?rev=b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874#b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874" dependencies = [ "rustpython-compiler", "rustpython-derive-impl", @@ -1819,7 +1889,7 @@ def generate_cargo_lock() -> str: [[package]] name = "rustpython-derive-impl" version = "0.2.0" -source = "git+https://github.com/demergent-labs/RustPython?rev=7483ff7959103d7c4b2a15d718d4f7ad9b57b459#7483ff7959103d7c4b2a15d718d4f7ad9b57b459" +source = "git+https://github.com/demergent-labs/RustPython?rev=b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874#b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874" dependencies = [ "indexmap", "itertools", @@ -1845,7 +1915,7 @@ def generate_cargo_lock() -> str: [[package]] name = "rustpython-parser" version = "0.2.0" -source = "git+https://github.com/demergent-labs/RustPython?rev=7483ff7959103d7c4b2a15d718d4f7ad9b57b459#7483ff7959103d7c4b2a15d718d4f7ad9b57b459" +source = "git+https://github.com/demergent-labs/RustPython?rev=b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874#b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874" dependencies = [ "ahash", "anyhow", @@ -1869,7 +1939,7 @@ def generate_cargo_lock() -> str: [[package]] name = "rustpython-pylib" version = "0.2.0" -source = "git+https://github.com/demergent-labs/RustPython?rev=7483ff7959103d7c4b2a15d718d4f7ad9b57b459#7483ff7959103d7c4b2a15d718d4f7ad9b57b459" +source = "git+https://github.com/demergent-labs/RustPython?rev=b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874#b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874" dependencies = [ "glob", "rustpython-compiler-core", @@ -1879,7 +1949,7 @@ def generate_cargo_lock() -> str: [[package]] name = "rustpython-stdlib" version = "0.2.0" -source = "git+https://github.com/demergent-labs/RustPython?rev=7483ff7959103d7c4b2a15d718d4f7ad9b57b459#7483ff7959103d7c4b2a15d718d4f7ad9b57b459" +source = "git+https://github.com/demergent-labs/RustPython?rev=b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874#b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874" dependencies = [ "adler32", "ahash", @@ -1946,12 +2016,12 @@ def generate_cargo_lock() -> str: [[package]] name = "rustpython-vm" version = "0.2.0" -source = "git+https://github.com/demergent-labs/RustPython?rev=7483ff7959103d7c4b2a15d718d4f7ad9b57b459#7483ff7959103d7c4b2a15d718d4f7ad9b57b459" +source = "git+https://github.com/demergent-labs/RustPython?rev=b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874#b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874" dependencies = [ "ahash", "ascii", "atty", - "bitflags", + "bitflags 1.3.2", "bstr", "caseless", "cfg-if", @@ -2027,7 +2097,7 @@ def generate_cargo_lock() -> str: source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5dfc8644681285d1fb67a467fb3021bfea306b99b4146b166a1fe3ada965eece" dependencies = [ - "bitflags", + "bitflags 1.3.2", "cfg-if", "clipboard-win", "dirs-next", @@ -2067,9 +2137,9 @@ def generate_cargo_lock() -> str: [[package]] name = "serde" -version = "1.0.160" +version = "1.0.164" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c" +checksum = "9e8c8cf938e98f769bc164923b06dce91cea1751522f46f8466461af04c9027d" dependencies = [ "serde_derive", ] @@ -2085,13 +2155,13 @@ def generate_cargo_lock() -> str: [[package]] name = "serde_derive" -version = "1.0.160" +version = "1.0.164" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df" +checksum = "d9735b638ccc51c28bf6914d90a2e9725b377144fc612c49a611fddd1b631d68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.18", ] [[package]] @@ -2118,9 +2188,9 @@ def generate_cargo_lock() -> str: [[package]] name = "sha2" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" dependencies = [ "cfg-if", "cpufeatures", @@ -2129,9 +2199,9 @@ def generate_cargo_lock() -> str: [[package]] name = "sha3" -version = "0.10.7" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54c2bb1a323307527314a36bfb73f24febb08ce2b8a554bf4ffd6f51ad15198c" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" dependencies = [ "digest", "keccak", @@ -2183,11 +2253,24 @@ def generate_cargo_lock() -> str: source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a490c5c46c35dba9a6f5e7ee8e4d67e775eb2d2da0f115750b8d10e1c1ac2d28" dependencies = [ - "bitflags", + "bitflags 1.3.2", "num_enum", "optional", ] +[[package]] +name = "stable-fs" +version = "0.1.8" +source = "git+https://github.com/demergent-labs/stable-fs?rev=f85a7919c7468552ec6aa123f80634ebf168093c#f85a7919c7468552ec6aa123f80634ebf168093c" +dependencies = [ + "bitflags 2.3.2", + "ciborium", + "ic-cdk 0.8.0-beta.0", + "ic-stable-structures", + "serde", + "serde_bytes", +] + [[package]] name = "stacker" version = "0.1.15" @@ -2253,9 +2336,9 @@ def generate_cargo_lock() -> str: [[package]] name = "subtle" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "syn" @@ -2270,9 +2353,9 @@ def generate_cargo_lock() -> str: [[package]] name = "syn" -version = "2.0.15" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822" +checksum = "32d41677bcbe24c20c52e7c70b0d8db04134c5d1066bf98662e2871ad200ea3e" dependencies = [ "proc-macro2", "quote", @@ -2290,11 +2373,11 @@ def generate_cargo_lock() -> str: [[package]] name = "system-configuration" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75182f12f490e953596550b65ee31bda7c8e043d9386174b353bda50838c3fd" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" dependencies = [ - "bitflags", + "bitflags 1.3.2", "core-foundation", "system-configuration-sys", ] @@ -2370,7 +2453,7 @@ def generate_cargo_lock() -> str: dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.18", ] [[package]] @@ -2426,15 +2509,15 @@ def generate_cargo_lock() -> str: [[package]] name = "toml_datetime" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ab8ed2edee10b50132aed5f331333428b011c99402b5a534154ed15746f9622" +checksum = "5a76a9312f5ba4c2dec6b9161fdf25d87ad8a09256ccea5a556fef03c706a10f" [[package]] name = "toml_edit" -version = "0.19.8" +version = "0.19.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "239410c8609e8125456927e6707163a3b1fdb40561e4b803bc041f466ccfdc13" +checksum = "2380d56e8670370eee6566b0bfd4265f65b3f432e8c6d85623f728d4fa31f739" dependencies = [ "indexmap", "toml_datetime", @@ -2602,9 +2685,9 @@ def generate_cargo_lock() -> str: [[package]] name = "unicode-ident" -version = "1.0.8" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" +checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0" [[package]] name = "unicode-normalization" @@ -2649,9 +2732,9 @@ def generate_cargo_lock() -> str: [[package]] name = "uuid" -version = "1.3.1" +version = "1.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b55a3fef2a1e3b3a00ce878640918820d3c51081576ac657d23af9fc7928fdb" +checksum = "0fa2982af2eec27de306107c027578ff7f423d65f7250e40ce0fea8f45248b81" dependencies = [ "atomic", "getrandom", @@ -2661,13 +2744,13 @@ def generate_cargo_lock() -> str: [[package]] name = "uuid-macro-internal" -version = "1.3.1" +version = "1.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20e8a505384e9309dc842520c6c9348f4b141dee06aaa845522727b1b99ca235" +checksum = "7da8500be15217da76379f13cfb1a9e351ccc2b0959c7bc8ea64ac4302ba4de4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.18", ] [[package]] @@ -2708,9 +2791,9 @@ def generate_cargo_lock() -> str: [[package]] name = "wasm-bindgen" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" +checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -2718,24 +2801,24 @@ def generate_cargo_lock() -> str: [[package]] name = "wasm-bindgen-backend" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" +checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.18", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" +checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2743,22 +2826,22 @@ def generate_cargo_lock() -> str: [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" +checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.18", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" +checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" [[package]] name = "which" @@ -2836,37 +2919,13 @@ def generate_cargo_lock() -> str: "windows_x86_64_msvc 0.42.2", ] -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets 0.42.2", -] - [[package]] name = "windows-sys" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets 0.48.0", -] - -[[package]] -name = "windows-targets" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", + "windows-targets", ] [[package]] @@ -3000,9 +3059,9 @@ def generate_cargo_lock() -> str: [[package]] name = "winnow" -version = "0.4.1" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae8970b36c66498d8ff1d66685dc86b91b29db0c7739899012f63a63814b4b28" +checksum = "ca0ace3845f0d96209f0375e6d367e3eb87eb65d27d445bdc9f1843a26f39448" dependencies = [ "memchr", ] @@ -3018,7 +3077,7 @@ def generate_cargo_lock() -> str: [[package]] name = "xml-rs" -version = "0.8.4" +version = "0.8.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2d7d3948613f75c98fd9328cfdcc45acc4d360655289d0a7d4ec931392200a3" +checksum = "52839dc911083a8ef63efa4d039d1f58b5e409f923e44c80828f206f66e5541c" """ diff --git a/kybra/compiler/custom_modules/principal.py b/kybra/compiler/custom_modules/principal.py index 938ecd3f8..1c73370cf 100644 --- a/kybra/compiler/custom_modules/principal.py +++ b/kybra/compiler/custom_modules/principal.py @@ -1,4 +1,3 @@ - # The Principal code is taken from https://github.com/rocklabs-io/ic-py/blob/main/ic/principal.py # MIT License @@ -27,25 +26,27 @@ import zlib import math -# import base64 # TODO we probably need to remove this -import binascii +import base64 import hashlib +from enum import Enum + from typing import Union -# from enum import Enum # TODO we probably need to remove this CRC_LENGTH_IN_BYTES = 4 HASH_LENGTH_IN_BYTES = 28 MAX_LENGTH_IN_BYTES = 29 -# class PrincipalClass(Enum): -# OpaqueId = 1 -# SelfAuthenticating = 2 -# DerivedId = 3 -# Anonymous = 4 -# # Unassigned + +class PrincipalClass(Enum): + OpaqueId = 1 + SelfAuthenticating = 2 + DerivedId = 3 + Anonymous = 4 + # Unassigned + class Principal: - def __init__(self, bytes: bytes = b''): + def __init__(self, bytes: bytes = b""): self._len = len(bytes) self._bytes = bytes self.hex = str(self._bytes.hex()).upper() @@ -60,12 +61,12 @@ def self_authenticating(pubkey: Union[str, bytes]): if isinstance(pubkey, str): pubkey = bytes.fromhex(pubkey) hash_ = hashlib.sha224(pubkey).digest() - hash_ += bytes([2]) - return Principal(bytes = hash_) + hash_ += bytes([PrincipalClass.SelfAuthenticating.value]) + return Principal(bytes=hash_) @staticmethod def anonymous(): - return Principal(bytes = b'\x04') + return Principal(bytes=b"\x04") @property def len(self): @@ -81,12 +82,12 @@ def isPrincipal(self): @staticmethod def from_str(s: str): - s1 = s.replace('-', '') + s1 = s.replace("-", "") pad_len = math.ceil(len(s1) / 8) * 8 - len(s1) - b = b32decode(s1.upper().encode() + b'=' * pad_len) + b = base64.b32decode(s1.upper().encode() + b"=" * pad_len) if len(b) < CRC_LENGTH_IN_BYTES: raise Exception("principal length error") - p = Principal(bytes = b[CRC_LENGTH_IN_BYTES:]) + p = Principal(bytes=b[CRC_LENGTH_IN_BYTES:]) if not p.to_str() == s: raise Exception("principal format error") return p @@ -97,14 +98,14 @@ def from_hex(s: str): def to_str(self): checksum = zlib.crc32(self._bytes) & 0xFFFFFFFF - b = b'' - b += checksum.to_bytes(CRC_LENGTH_IN_BYTES, byteorder='big') + b = b"" + b += checksum.to_bytes(CRC_LENGTH_IN_BYTES, byteorder="big") b += self.bytes - s = b32encode(b).decode('utf-8').lower().replace('=', '') - ret = '' + s = base64.b32encode(b).decode("utf-8").lower().replace("=", "") + ret = "" while len(s) > 5: ret += s[:5] - ret += '-' + ret += "-" s = s[5:] ret += s return ret @@ -118,13 +119,14 @@ def __repr__(self): def __str__(self): return self.to_str() + class AccountIdentifier: def __init__(self, hash: bytes) -> None: assert len(hash) == 32 self._hash = hash def to_str(self): - return '0x' + self._hash.hex() + return "0x" + self._hash.hex() def __repr__(self): return "Account(" + self.to_str() + ")" @@ -139,140 +141,12 @@ def bytes(self) -> bytes: @staticmethod def new(principal: Principal, sub_account: int = 0): sha224 = hashlib.sha224() - sha224.update(b'\x0Aaccount-id') + sha224.update(b"\x0Aaccount-id") sha224.update(principal.bytes) - sub_account = sub_account.to_bytes(32, byteorder='big') - sha224.update(sub_account) + sub_account = sub_account.to_bytes(32, byteorder="big") # type: ignore + sha224.update(sub_account) # type: ignore hash = sha224.digest() checksum = zlib.crc32(hash) & 0xFFFFFFFF - account = checksum.to_bytes(CRC_LENGTH_IN_BYTES, byteorder='big') + hash + account = checksum.to_bytes(CRC_LENGTH_IN_BYTES, byteorder="big") + hash return AccountIdentifier(account) - -# Everything below taken from RustPython/Lib/base64.py - -# These functions have been modified from the RustPython code, which was most likely created mostly from the CPython code -# The license to CPython can be found here: kybra/licenses/CPYTHON_LICENSE -# The license to RustPython can be found here: kybra/licenses/RUST_PYTHON_LICENSE - -# Base32 encoding/decoding must be done in Python -_b32alphabet = b'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567' -_b32tab2 = None -_b32rev = None - -bytes_types = (bytes, bytearray) # Types acceptable as binary data - -def b32encode(s): - """Encode the bytes-like object s using Base32 and return a bytes object. - """ - global _b32tab2 - # Delay the initialization of the table to not waste memory - # if the function is never called - if _b32tab2 is None: - b32tab = [bytes((i,)) for i in _b32alphabet] - _b32tab2 = [a + b for a in b32tab for b in b32tab] - b32tab = None - - if not isinstance(s, bytes_types): - s = memoryview(s).tobytes() - leftover = len(s) % 5 - # Pad the last quantum with zero bits if necessary - if leftover: - s = s + b'\0' * (5 - leftover) # Don't use += ! - encoded = bytearray() - from_bytes = int.from_bytes - b32tab2 = _b32tab2 - for i in range(0, len(s), 5): - c = from_bytes(s[i: i + 5], 'big') - encoded += (b32tab2[c >> 30] + # bits 1 - 10 - b32tab2[(c >> 20) & 0x3ff] + # bits 11 - 20 - b32tab2[(c >> 10) & 0x3ff] + # bits 21 - 30 - b32tab2[c & 0x3ff] # bits 31 - 40 - ) - # Adjust for any leftover partial quanta - if leftover == 1: - encoded[-6:] = b'======' - elif leftover == 2: - encoded[-4:] = b'====' - elif leftover == 3: - encoded[-3:] = b'===' - elif leftover == 4: - encoded[-1:] = b'=' - return bytes(encoded) - -def b32decode(s, casefold=False, map01=None): - """Decode the Base32 encoded bytes-like object or ASCII string s. - - Optional casefold is a flag specifying whether a lowercase alphabet is - acceptable as input. For security purposes, the default is False. - - RFC 3548 allows for optional mapping of the digit 0 (zero) to the - letter O (oh), and for optional mapping of the digit 1 (one) to - either the letter I (eye) or letter L (el). The optional argument - map01 when not None, specifies which letter the digit 1 should be - mapped to (when map01 is not None, the digit 0 is always mapped to - the letter O). For security purposes the default is None, so that - 0 and 1 are not allowed in the input. - - The result is returned as a bytes object. A binascii.Error is raised if - the input is incorrectly padded or if there are non-alphabet - characters present in the input. - """ - global _b32rev - # Delay the initialization of the table to not waste memory - # if the function is never called - if _b32rev is None: - _b32rev = {v: k for k, v in enumerate(_b32alphabet)} - s = _bytes_from_decode_data(s) - if len(s) % 8: - raise binascii.Error('Incorrect padding') - # Handle section 2.4 zero and one mapping. The flag map01 will be either - # False, or the character to map the digit 1 (one) to. It should be - # either L (el) or I (eye). - if map01 is not None: - map01 = _bytes_from_decode_data(map01) - assert len(map01) == 1, repr(map01) - s = s.translate(bytes.maketrans(b'01', b'O' + map01)) - if casefold: - s = s.upper() - # Strip off pad characters from the right. We need to count the pad - # characters because this will tell us how many null bytes to remove from - # the end of the decoded string. - l = len(s) - s = s.rstrip(b'=') - padchars = l - len(s) - # Now decode the full quanta - decoded = bytearray() - b32rev = _b32rev - for i in range(0, len(s), 8): - quanta = s[i: i + 8] - acc = 0 - try: - for c in quanta: - acc = (acc << 5) + b32rev[c] - except KeyError: - raise binascii.Error('Non-base32 digit found') from None - decoded += acc.to_bytes(5, 'big') - # Process the last, partial quanta - if l % 8 or padchars not in {0, 1, 3, 4, 6}: - raise binascii.Error('Incorrect padding') - if padchars and decoded: - acc <<= 5 * padchars - last = acc.to_bytes(5, 'big') - leftover = (43 - 5 * padchars) // 8 # 1: 4, 3: 3, 4: 2, 6: 1 - decoded[-5:] = last[:leftover] - return bytes(decoded) - -def _bytes_from_decode_data(s): - if isinstance(s, str): - try: - return s.encode('ascii') - except UnicodeEncodeError: - raise ValueError('string argument should contain only ASCII characters') - if isinstance(s, bytes_types): - return s - try: - return memoryview(s).tobytes() - except TypeError: - raise TypeError("argument should be a bytes-like object or ASCII " - "string, not %r" % s.__class__.__name__) from None diff --git a/kybra/compiler/custom_modules/typing.py b/kybra/compiler/custom_modules/typing.py deleted file mode 100644 index 89da12713..000000000 --- a/kybra/compiler/custom_modules/typing.py +++ /dev/null @@ -1,156 +0,0 @@ -# type: ignore - -# This file has been modified from the RustPython code, which was most likely created mostly from the CPython code -# The license to CPython can be found here: kybra/licenses/CPYTHON_LICENSE -# The license to RustPython can be found here: kybra/licenses/RUST_PYTHON_LICENSE - -import sys - -class Annotated(): - def __class_getitem__(cls, x): - return cls - -class Optional(): - def __class_getitem__(cls, x): - return cls - -class Callable(): - def __class_getitem__(cls, x): - return True - -class Generator(): - def __class_getitem__(cls, x): - return cls - -class Generic(): - def __class_getitem__(cls, x): - return cls - -class Union(): - def __class_getitem__(cls, x): - return cls - -def TypeAlias(self, parameters): - raise TypeError(f"{self} is not subscriptable") - -def TypeVar(x): - pass - -def ParamSpec(x): - pass - -Type = type - -def Any(self, parameters): - raise TypeError(f"{self} is not subscriptable") - -def NoReturn(self, parameters): - raise TypeError(f"{self} is not subscriptable") - -def _type_check(arg, msg, is_argument=True, module=None, *, allow_special_forms=False): - return True - -class _TypedDictMeta(type): - def __new__(cls, name, bases, ns, total=True): - for base in bases: - if type(base) is not _TypedDictMeta: - raise TypeError('cannot inherit from both a TypedDict type ' - 'and a non-TypedDict base class') - tp_dict = type.__new__(_TypedDictMeta, name, (dict,), ns) - - annotations = {} - own_annotations = ns.get('__annotations__', {}) - own_annotation_keys = set(own_annotations.keys()) - msg = "TypedDict('Name', {f0: t0, f1: t1, ...}); each t must be a type" - own_annotations = { - n: _type_check(tp, msg, module=tp_dict.__module__) - for n, tp in own_annotations.items() - } - required_keys = set() - optional_keys = set() - - for base in bases: - annotations.update(base.__dict__.get('__annotations__', {})) - required_keys.update(base.__dict__.get('__required_keys__', ())) - optional_keys.update(base.__dict__.get('__optional_keys__', ())) - - annotations.update(own_annotations) - if total: - required_keys.update(own_annotation_keys) - else: - optional_keys.update(own_annotation_keys) - - tp_dict.__annotations__ = annotations - tp_dict.__required_keys__ = frozenset(required_keys) - tp_dict.__optional_keys__ = frozenset(optional_keys) - if not hasattr(tp_dict, '__total__'): - tp_dict.__total__ = total - return tp_dict - - __call__ = dict # static method - - def __subclasscheck__(cls, other): - # Typed dicts are only for static structural subtyping. - raise TypeError('TypedDict does not support instance and class checks') - - __instancecheck__ = __subclasscheck__ - -def TypedDict(typename, fields=None, /, *, total=True, **kwargs): - """A simple typed namespace. At runtime it is equivalent to a plain dict. - - TypedDict creates a dictionary type that expects all of its - instances to have a certain set of keys, where each key is - associated with a value of a consistent type. This expectation - is not checked at runtime but is only enforced by type checkers. - Usage:: - - class Point2D(TypedDict): - x: int - y: int - label: str - - a: Point2D = {'x': 1, 'y': 2, 'label': 'good'} # OK - b: Point2D = {'z': 3, 'label': 'bad'} # Fails type check - - assert Point2D(x=1, y=2, label='first') == dict(x=1, y=2, label='first') - - The type info can be accessed via the Point2D.__annotations__ dict, and - the Point2D.__required_keys__ and Point2D.__optional_keys__ frozensets. - TypedDict supports two additional equivalent forms:: - - Point2D = TypedDict('Point2D', x=int, y=int, label=str) - Point2D = TypedDict('Point2D', {'x': int, 'y': int, 'label': str}) - - By default, all keys must be present in a TypedDict. It is possible - to override this by specifying totality. - Usage:: - - class point2D(TypedDict, total=False): - x: int - y: int - - This means that a point2D TypedDict can have any of the keys omitted.A type - checker is only expected to support a literal False or True as the value of - the total argument. True is the default, and makes all items defined in the - class body be required. - - The class syntax is only supported in Python 3.6+, while two other - syntax forms work for Python 2.7 and 3.2+ - """ - if fields is None: - fields = kwargs - elif kwargs: - raise TypeError("TypedDict takes either a dict or keyword arguments," - " but not both") - - ns = {'__annotations__': dict(fields)} - try: - # Setting correct module is necessary to make typed dict classes pickleable. - ns['__module__'] = sys._getframe(1).f_globals.get('__name__', '__main__') - except (AttributeError, ValueError): - pass - - return _TypedDictMeta(typename, (), ns, total=total) - -_TypedDict = type.__new__(_TypedDictMeta, 'TypedDict', (), {}) -TypedDict.__mro_entries__ = lambda bases: (_TypedDict,) diff --git a/kybra/compiler/install_rust_dependencies.sh b/kybra/compiler/install_rust_dependencies.sh index a99686271..bd85fc5d7 100755 --- a/kybra/compiler/install_rust_dependencies.sh +++ b/kybra/compiler/install_rust_dependencies.sh @@ -1,38 +1,36 @@ #!/bin/bash # TODO If we want to save a little bit of time we might be able to instruct rustup to not install some components initially, like clippy and docs -# TODO we might want to implement all of this in Node.js in the future for platform-independence etc -# TODO once ic-cdk-optimizer and ic-wasm are no longer required, we can probably just check for the wasm32-unknown-unknown target being installed: $global_kybra_rustup_bin target list | grep -q "wasm32-unknown-unknown (installed)" +# TODO we might want to implement all of this in Python/Rust in the future for platform-independence etc +# TODO once ic-wasm is no longer required, we can probably just check for the wasm32-wasi target being installed: $global_kybra_rustup_bin target list | grep -q "wasm32-wasi (installed)" kybra_version="$1" rust_version="$2" global_kybra_config_dir=~/.config/kybra -global_kybra_rust_dir="$global_kybra_config_dir"/"$rust_version" -global_kybra_bin_dir="$global_kybra_rust_dir"/bin +global_kybra_rust_dir="$global_kybra_config_dir"/rust/"$rust_version" +global_kybra_rust_bin_dir="$global_kybra_rust_dir"/bin global_kybra_logs_dir="$global_kybra_rust_dir"/logs -global_kybra_cargo_bin="$global_kybra_bin_dir"/cargo -global_kybra_rustup_bin="$global_kybra_bin_dir"/rustup +global_kybra_cargo_bin="$global_kybra_rust_bin_dir"/cargo +global_kybra_rustup_bin="$global_kybra_rust_bin_dir"/rustup -export CARGO_TARGET_DIR="$global_kybra_config_dir"/target +export CARGO_TARGET_DIR="$global_kybra_config_dir"/rust/target export CARGO_HOME="$global_kybra_rust_dir" export RUSTUP_HOME="$global_kybra_rust_dir" function run() { - ic_wasm_already_installed=$(test -e "$global_kybra_bin_dir"/ic-wasm; echo $?) - ic_cdk_optimizer_already_installed=$(test -e "$global_kybra_bin_dir"/ic-cdk-optimizer; echo $?) + ic_wasm_already_installed=$(test -e "$global_kybra_rust_bin_dir"/ic-wasm; echo $?) - if [ "$ic_wasm_already_installed" -eq 1 ] || [ "$ic_cdk_optimizer_already_installed" -eq 1 ]; then + if [ "$ic_wasm_already_installed" -eq 1 ]; then echo -e "\nKybra "$kybra_version" prerequisite installation (this may take a few minutes)\n" mkdir -p "$global_kybra_rust_dir" mkdir -p "$global_kybra_logs_dir" install_rustup - install_wasm32_unknown_unknown + install_wasm32 + install_wasi2ic install_ic_wasm "$ic_wasm_already_installed" - install_ic_cdk_optimizer "$ic_cdk_optimizer_already_installed" - echo -e "\n" else update_rustup fi @@ -41,32 +39,31 @@ function run() { function install_rustup() { echo -e "1/4) Installing Rust" - curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- --no-modify-path -y --default-toolchain="$rust_version" &> "$global_kybra_logs_dir"/step_1_rust + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- --no-modify-path -y --default-toolchain="$rust_version" &> "$global_kybra_logs_dir"/install_rustup } function update_rustup() { "$global_kybra_rustup_bin" update "$rust_version" &> "$global_kybra_logs_dir"/rustup_update } -function install_wasm32_unknown_unknown() { - echo -e "2/4) Installing wasm32-unknown-unknown" +function install_wasm32() { + echo -e "2/4) Installing wasm32" - "$global_kybra_rustup_bin" target add wasm32-unknown-unknown &> "$global_kybra_logs_dir"/step_2_wasm32_unknown_unknown + "$global_kybra_rustup_bin" target add wasm32-wasi &> "$global_kybra_logs_dir"/install_wasm32_wasi + "$global_kybra_rustup_bin" target add wasm32-unknown-unknown &> "$global_kybra_logs_dir"/install_wasm32_unknown_unknown } -function install_ic_wasm() { - echo -e "3/4) Installing ic-wasm" +function install_wasi2ic() { + echo -e "3/4) Installing wasi2ic" - if [ "$1" -eq 1 ]; then - "$global_kybra_cargo_bin" install ic-wasm --version 0.3.0 &> "$global_kybra_logs_dir"/step_3_ic_wasm - fi + "$global_kybra_cargo_bin" install --git https://github.com/wasm-forge/wasi2ic --rev 7418e0bd1a7810c8e9c55cc0155c921503a793b8 &> "$global_kybra_logs_dir"/install_wasi2ic } -function install_ic_cdk_optimizer() { - echo -e "4/4) Installing ic-cdk-optimizer" +function install_ic_wasm() { + echo -e "4/4) Installing ic-wasm" if [ "$1" -eq 1 ]; then - "$global_kybra_cargo_bin" install ic-cdk-optimizer --version 0.3.4 &> "$global_kybra_logs_dir"/step_4_ic_cdk_optimizer + "$global_kybra_cargo_bin" install ic-wasm --version 0.3.6 &> "$global_kybra_logs_dir"/install_ic_wasm fi } diff --git a/kybra/compiler/kybra_deployer/Cargo.toml b/kybra/compiler/kybra_deployer/Cargo.toml new file mode 100644 index 000000000..7f47d11ab --- /dev/null +++ b/kybra/compiler/kybra_deployer/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "kybra_deployer" +version = "0.0.0" +edition = "2018" + +[lib] +crate-type = ["cdylib"] + +[dependencies] +ic-cdk = "0.8.0-beta" +ic-cdk-macros = "0.6.10" +ic-stable-structures = "0.5.4" +sha2 = "0.10.6" +hex = "0.4.3" +shared_utils = { path = "../shared_utils" } diff --git a/kybra/compiler/kybra_deployer/src/errors.rs b/kybra/compiler/kybra_deployer/src/errors.rs new file mode 100644 index 000000000..c0e3e85b2 --- /dev/null +++ b/kybra/compiler/kybra_deployer/src/errors.rs @@ -0,0 +1,57 @@ +pub trait UnwrapOrTrap { + fn unwrap_or_trap(self) -> T; +} + +impl UnwrapOrTrap for Result { + fn unwrap_or_trap(self) -> T { + match self { + Ok(ok) => ok, + Err(err) => ic_cdk::trap(&init_error_to_string(&err)), + } + } +} + +pub fn call_result_error_to_string(err: &(ic_cdk::api::call::RejectionCode, String)) -> String { + let rejection_code_string = rejection_code_to_string(&err.0); + let message = &err.1; + + format!("{rejection_code_string}, {message}") +} + +pub fn rejection_code_to_string(err: &ic_cdk::api::call::RejectionCode) -> String { + match err { + ic_cdk::api::call::RejectionCode::NoError => "RejectionCode: NoError".to_string(), + ic_cdk::api::call::RejectionCode::SysFatal => "RejectionCode: SysFatal".to_string(), + ic_cdk::api::call::RejectionCode::SysTransient => "RejectionCode: SysTransient".to_string(), + ic_cdk::api::call::RejectionCode::DestinationInvalid => { + "RejectionCode: DestinationInvalid".to_string() + } + ic_cdk::api::call::RejectionCode::CanisterReject => { + "RejectionCode: CanisterReject".to_string() + } + ic_cdk::api::call::RejectionCode::CanisterError => { + "RejectionCode: CanisterError".to_string() + } + ic_cdk::api::call::RejectionCode::Unknown => "RejectionCode: Unknown".to_string(), + } +} + +pub fn value_error_to_string(err: &ic_stable_structures::cell::ValueError) -> String { + match err { + ic_stable_structures::cell::ValueError::ValueTooLarge { value_size } => { + format!("ValueError: ValueTooLarge {value_size}") + } + } +} + +fn init_error_to_string(err: &ic_stable_structures::cell::InitError) -> String { + match err { + ic_stable_structures::cell::InitError::IncompatibleVersion { + last_supported_version, + decoded_version, + } => format!("InitError: IncompatibleVersion, last_supported_version {last_supported_version}, decoded_version {decoded_version}"), + ic_stable_structures::cell::InitError::ValueTooLarge { value_size } => { + format!("InitError: ValueTooLarge {value_size}") + } + } +} diff --git a/kybra/compiler/kybra_deployer/src/lib.rs b/kybra/compiler/kybra_deployer/src/lib.rs new file mode 100644 index 000000000..7eb825493 --- /dev/null +++ b/kybra/compiler/kybra_deployer/src/lib.rs @@ -0,0 +1,189 @@ +// TODO Once we upgrade to ic-cdk 0.8.1 and dfx >= 14 something +// TODO then I think we can use the new ic_cdk::api::is_controller check +// TODO and get rid of INSTALLER_REF_CELL + +use errors::{ + call_result_error_to_string, rejection_code_to_string, value_error_to_string, UnwrapOrTrap, +}; +use ic_cdk::{ + api::{call, management_canister}, + export::Principal, +}; +use ic_cdk_macros::{init, post_upgrade, query, update}; +use ic_stable_structures::{ + cell::Cell, + memory_manager::{MemoryId, MemoryManager, VirtualMemory}, + DefaultMemoryImpl, +}; +use sha2::{Digest, Sha256}; +use shared_utils::{PYTHON_STDLIB_MEMORY_ID, RANDOMNESS_MEMORY_ID}; +use std::cell::RefCell; + +mod errors; + +thread_local! { + static WASM_REF_CELL: RefCell> = RefCell::new(vec![]); + static INSTALLER_REF_CELL: RefCell> = RefCell::new(None); + static ARG_DATA_RAW_REF_CELL: RefCell> = RefCell::new(vec![]); + static PYTHON_STDLIB_REF_CELL: RefCell> = RefCell::new(vec![]); + + static RANDOMNESS_STABLE_REF_CELL: RefCell, VirtualMemory>> + = RefCell::new(Cell::init(MEMORY_MANAGER_REF_CELL.with(|m| m.borrow().get(MemoryId::new(RANDOMNESS_MEMORY_ID))), vec![]).unwrap_or_trap()); + + static PYTHON_STDLIB_STABLE_REF_CELL: RefCell, VirtualMemory>> + = RefCell::new(Cell::init(MEMORY_MANAGER_REF_CELL.with(|m| m.borrow().get(MemoryId::new(PYTHON_STDLIB_MEMORY_ID))), vec![]).unwrap_or_trap()); + + static MEMORY_MANAGER_REF_CELL: RefCell> + = RefCell::new(MemoryManager::init(DefaultMemoryImpl::default())); +} + +#[init] +pub fn init() { + initialize() +} + +#[post_upgrade] +pub fn post_upgrade() { + initialize() +} + +fn initialize() { + INSTALLER_REF_CELL.with(|installer_ref_cell| { + let mut installer_ref_mut = installer_ref_cell.borrow_mut(); + *installer_ref_mut = Some(ic_cdk::caller().to_string()); + }); + + ARG_DATA_RAW_REF_CELL.with(|arg_data_raw_ref_cell| { + let mut arg_data_ref_mut = arg_data_raw_ref_cell.borrow_mut(); + *arg_data_ref_mut = call::arg_data_raw(); + }); +} + +#[update(guard = "installer_guard")] +pub fn upload_wasm_chunk(bytes: Vec) { + WASM_REF_CELL.with(|wasm_ref_cell| { + let mut wasm_ref_mut = wasm_ref_cell.borrow_mut(); + wasm_ref_mut.extend(bytes); + }); +} + +#[update(guard = "installer_guard")] +pub fn upload_python_stdlib_chunk(bytes: Vec) { + PYTHON_STDLIB_REF_CELL.with(|python_stdlib_ref_cell| { + let mut python_stdlib_ref_mut = python_stdlib_ref_cell.borrow_mut(); + python_stdlib_ref_mut.extend(bytes); + }); +} + +#[query(guard = "installer_guard")] +pub fn get_python_stdlib_hash() -> String { + PYTHON_STDLIB_STABLE_REF_CELL.with(|python_stdlib_stable_ref_cell| { + let python_stdlib_stable_ref = python_stdlib_stable_ref_cell.borrow(); + let python_stdlib_bytes = python_stdlib_stable_ref.get(); + + if python_stdlib_bytes.len() == 0 { + "".to_string() + } else { + hash(python_stdlib_bytes) + } + }) +} + +#[update(guard = "installer_guard")] +pub async fn install_wasm() -> Result<(), String> { + stable_store_randomness().await?; + stable_store_python_stdlib()?; + install_code().map_err(|err| rejection_code_to_string(&err)) +} + +async fn stable_store_randomness() -> Result<(), String> { + let randomness_result = management_canister::main::raw_rand().await; + let randomness = randomness_result + .map_err(|err| call_result_error_to_string(&err))? + .0; + + RANDOMNESS_STABLE_REF_CELL.with(|randomness_stable_ref_cell| { + let mut randomness_stable_ref_mut = randomness_stable_ref_cell.borrow_mut(); + randomness_stable_ref_mut + .set(randomness) + .map_err(|err| value_error_to_string(&err)) + })?; + + Ok(()) +} + +fn stable_store_python_stdlib() -> Result<(), String> { + PYTHON_STDLIB_STABLE_REF_CELL.with(|python_stdlib_stable_ref_cell| { + let mut python_stdlib_stable_ref_mut = python_stdlib_stable_ref_cell.borrow_mut(); + + let python_stdlib_bytes = PYTHON_STDLIB_REF_CELL + .with(|python_stdlib_ref_cell| python_stdlib_ref_cell.borrow().clone()); + + if python_stdlib_bytes.len() != 0 { + return python_stdlib_stable_ref_mut + .set(python_stdlib_bytes) + .map_err(|err| value_error_to_string(&err)); + } + + Ok(vec![]) + })?; + + Ok(()) +} + +fn install_code() -> Result<(), ic_cdk::api::call::RejectionCode> { + let wasm_module = WASM_REF_CELL.with(|wasm_ref_cell| wasm_ref_cell.borrow().clone()); + call::notify( + Principal::management_canister(), + "install_code", + (management_canister::main::InstallCodeArgument { + mode: management_canister::main::CanisterInstallMode::Upgrade, + canister_id: ic_cdk::api::id(), + wasm_module, + arg: ARG_DATA_RAW_REF_CELL + .with(|arg_data_raw_ref_cell| arg_data_raw_ref_cell.borrow().clone()), + },), + ) + + // TODO we think that the response trying to execute a callback on a different Wasm binary + // TODO may be causing problems, thus we are testing out notify + // let result = ic_cdk::api::management_canister::main::install_code( + // ic_cdk::api::management_canister::main::InstallCodeArgument { + // mode: ic_cdk::api::management_canister::main::CanisterInstallMode::Upgrade, + // canister_id: ic_cdk::api::id(), + // wasm_module, + // arg: ARG_DATA_RAW_REF_CELL + // .with(|arg_data_raw_ref_cell| arg_data_raw_ref_cell.borrow().clone()), + // }, + // ) + // .await; + + // If install_code succeeds this will never be reached because + // the install_code call returns to a different Wasm binary + // and the callback no longer exists + // If there is an error in the cross-canister call this will be reached + // result.map_err(|err| call_result_error_to_string(&err)) +} + +fn installer_guard() -> Result<(), String> { + let installer_option = + INSTALLER_REF_CELL.with(|installer_ref_cell| installer_ref_cell.borrow().clone()); + + if let Some(installer) = installer_option { + if installer == ic_cdk::caller().to_string() { + return Ok(()); + } + } + + Err("Not authorized".to_string()) +} + +fn hash(bytes: &Vec) -> String { + let mut hasher = Sha256::new(); + + hasher.update(bytes); + + let result = hasher.finalize(); + + hex::encode(result) +} diff --git a/kybra/compiler/kybra_generate/Cargo.toml b/kybra/compiler/kybra_generate/Cargo.toml index 1ffcb0ef8..69c9c05a7 100644 --- a/kybra/compiler/kybra_generate/Cargo.toml +++ b/kybra/compiler/kybra_generate/Cargo.toml @@ -13,7 +13,8 @@ annotate-snippets = "0.9.1" num-bigint = "0.4.3" backtrace = "0.3.67" # The package isn't strickly neccesary. std::backtrace::Backtrace might be able to do what we need, but it isn't clonable and backtrace::Backtrace is, so we are using to avoid adding a buch of lifetime code # rustpython = { path = "../../../../RustPython", default-features = false, features = [] } -cdk_framework = { git = "https://github.com/demergent-labs/cdk_framework", rev = "e53bda541935be8c8c81073351e0c533ca57647e" } +cdk_framework = { git = "https://github.com/demergent-labs/cdk_framework", rev = "e6023d9d9c58e0042c6e7249a2fe06c6ee0248fa" } # cdk_framework = { path = "/home/cdk_framework" } # For local rust-analyzer uncomment this line and comment out the line above. # Update path/to/local to be the path to your local cdk_framework repo +shared_utils = { path = "../shared_utils" } diff --git a/kybra/compiler/kybra_generate/src/body/mod.rs b/kybra/compiler/kybra_generate/src/body/mod.rs index f5b777bc8..66a37871f 100644 --- a/kybra/compiler/kybra_generate/src/body/mod.rs +++ b/kybra/compiler/kybra_generate/src/body/mod.rs @@ -1,11 +1,10 @@ use cdk_framework::act::node::{ candid::Service, canister_method::{QueryMethod, UpdateMethod}, - Param, }; use proc_macro2::TokenStream; -use crate::{ic_object, kybra_modules_init, stable_b_tree_map_nodes::rust, StableBTreeMapNode}; +use crate::{ic_object, stable_b_tree_map_nodes::rust, StableBTreeMapNode}; mod async_result_handler; mod call_global_python_function; @@ -17,10 +16,6 @@ pub fn generate( query_methods: &Vec, services: &Vec, stable_b_tree_map_nodes: &Vec, - entry_module_name: &String, - init_params: &Vec, - call_init_py_function: TokenStream, - call_post_upgrade_py_function: TokenStream, ) -> TokenStream { let ic_object = ic_object::generate( update_methods, @@ -31,12 +26,6 @@ pub fn generate( let unwrap_rust_python_result = unwrap_rust_python_result::generate(); let async_result_handler = async_result_handler::generate(&services); let stable_b_tree_map = rust::generate(stable_b_tree_map_nodes); - let kybra_modules_init = kybra_modules_init::generate( - entry_module_name, - init_params, - call_init_py_function, - call_post_upgrade_py_function, - ); let utils = utils::generate(); let call_global_python_function = call_global_python_function::generate(); @@ -45,7 +34,6 @@ pub fn generate( #unwrap_rust_python_result #async_result_handler #stable_b_tree_map - #kybra_modules_init #utils #call_global_python_function } diff --git a/kybra/compiler/kybra_generate/src/body/unwrap_rust_python_result.rs b/kybra/compiler/kybra_generate/src/body/unwrap_rust_python_result.rs index dd40df00c..64edc612b 100644 --- a/kybra/compiler/kybra_generate/src/body/unwrap_rust_python_result.rs +++ b/kybra/compiler/kybra_generate/src/body/unwrap_rust_python_result.rs @@ -9,7 +9,7 @@ pub fn generate() -> TokenStream { impl UnwrapOrTrapWithMessage for Option { fn unwrap_or_trap(self, err_message: &str) -> T { match self { - Some(some) => return some, + Some(some) => some, None => { ic_cdk::trap(err_message) } @@ -24,7 +24,7 @@ pub fn generate() -> TokenStream { impl UnwrapOrTrap for Result { fn unwrap_or_trap(self) -> T { match self { - Ok(ok) => return ok, + Ok(ok) => ok, Err(err) => ic_cdk::trap(&err.0) } } @@ -33,12 +33,34 @@ pub fn generate() -> TokenStream { impl UnwrapOrTrap for Result { fn unwrap_or_trap(self) -> T { match self { - Ok(ok) => return ok, + Ok(ok) => ok, Err(err) => ic_cdk::trap(&err.0) } } } + impl UnwrapOrTrap for Result { + fn unwrap_or_trap(self) -> T { + match self { + Ok(ok) => ok, + Err(err) => ic_cdk::trap(&match err { + ic_stable_structures::cell::ValueError::ValueTooLarge { value_size } => { + format!("ValueError: ValueTooLarge {value_size}") + } + }), + } + } + } + + impl UnwrapOrTrap for Result { + fn unwrap_or_trap(self) -> T { + match self { + Ok(ok) => ok, + Err(err) => ic_cdk::trap(&init_error_to_string(&err)), + } + } + } + pub trait UnwrapOrTrapWithVm { fn unwrap_or_trap(self, vm: &rustpython::vm::VirtualMachine) -> T; } @@ -61,5 +83,17 @@ pub fn generate() -> TokenStream { } } } + + fn init_error_to_string(err: &ic_stable_structures::cell::InitError) -> String { + match err { + ic_stable_structures::cell::InitError::IncompatibleVersion { + last_supported_version, + decoded_version, + } => format!("InitError: IncompatibleVersion, last_supported_version {last_supported_version}, decoded_version {decoded_version}"), + ic_stable_structures::cell::InitError::ValueTooLarge { value_size } => { + format!("InitError: ValueTooLarge {value_size}") + } + } + } } } diff --git a/kybra/compiler/kybra_generate/src/candid_type/func/mod.rs b/kybra/compiler/kybra_generate/src/candid_type/func/mod.rs index 71cdae923..d7c42a965 100644 --- a/kybra/compiler/kybra_generate/src/candid_type/func/mod.rs +++ b/kybra/compiler/kybra_generate/src/candid_type/func/mod.rs @@ -104,7 +104,7 @@ impl SourceMapped<&Located> { }) .collect(), match mode { - Mode::Query => Ok(CandidType::Primitive(Primitive::Void)), + Mode::Oneway => Ok(CandidType::Primitive(Primitive::Void)), _ => SourceMapped::new(func.returns, self.source_map.clone()) .to_candid_type(), }, diff --git a/kybra/compiler/kybra_generate/src/canister_method/init_method/build.rs b/kybra/compiler/kybra_generate/src/canister_method/init_method/build.rs index ef9187757..104d522ab 100644 --- a/kybra/compiler/kybra_generate/src/canister_method/init_method/build.rs +++ b/kybra/compiler/kybra_generate/src/canister_method/init_method/build.rs @@ -1,13 +1,8 @@ use super::rust; use cdk_framework::{ - act::node::{ - canister_method::{CanisterMethodType, InitMethod}, - Param, - }, + act::node::canister_method::{CanisterMethodType, InitMethod}, traits::CollectResults, }; -use proc_macro2::TokenStream; -use quote::quote; use rustpython_parser::ast::{Located, StmtKind}; use crate::{ @@ -23,7 +18,7 @@ use crate::{ }; impl PyAst { - pub fn build_init_method(&self) -> Result<(InitMethod, Vec, TokenStream), Vec> { + pub fn build_init_method(&self) -> Result> { let init_function_defs = self.get_canister_stmt_of_type(CanisterMethodType::Init); let init_methods = build_init_methods(&init_function_defs); @@ -46,16 +41,15 @@ impl PyAst { fn build_init_method( init_function_def: Option<&SourceMapped<&Located>>, -) -> Result<(InitMethod, Vec, TokenStream), Vec> { +) -> Result> { match init_function_def { Some(init_function_def) => { - let (guard_function_name, params, return_type, call_to_py) = ( + let (guard_function_name, params, return_type) = ( init_function_def .get_guard_function_name() .map_err(Error::into), init_function_def.build_params(InternalOrExternal::Internal), init_function_def.build_return_type(), - init_function_def.generate_call_to_py_function(), ) .collect_results()?; @@ -67,31 +61,23 @@ fn build_init_method( .into()); } - Ok(( - InitMethod { - params: params.clone(), - body: rust::generate(¶ms), - guard_function_name, - }, - params, - call_to_py, - )) + Ok(InitMethod { + params: params.clone(), + body: rust::generate(), + guard_function_name, + }) } - None => Ok(( - InitMethod { - params: vec![], - body: rust::generate(&vec![]), - guard_function_name: None, - }, - vec![], - quote!(), - )), + None => Ok(InitMethod { + params: vec![], + body: rust::generate(), + guard_function_name: None, + }), } } fn build_init_methods( init_function_defs: &Vec>>, -) -> Result, TokenStream)>, Vec> { +) -> Result, Vec> { init_function_defs .iter() .map(|init_function_def| build_init_method(Some(init_function_def))) diff --git a/kybra/compiler/kybra_generate/src/canister_method/init_method/rust.rs b/kybra/compiler/kybra_generate/src/canister_method/init_method/rust.rs index 28bec6aa4..91219fb89 100644 --- a/kybra/compiler/kybra_generate/src/canister_method/init_method/rust.rs +++ b/kybra/compiler/kybra_generate/src/canister_method/init_method/rust.rs @@ -1,19 +1,12 @@ -use cdk_framework::{act::node::Param, traits::ToIdent}; +// TODO currently init is never called because of our deployer infrastructure +// TODO in the future once dfx can automatically chunk upload any size binary +// TODO the hope is that we can use the regular init flow again +// TODO init should look almost identical to post_upgrade +// TODO but it should call the developer's init function defined in Python + use proc_macro2::TokenStream; use quote::quote; -pub fn generate(params: &Vec) -> TokenStream { - let params_initializations = params.iter().map(|param| { - let param_name = format!("_cdk_user_defined_{}", param.name).to_ident(); - let init_param_name = format!("INIT_PARAM_{}", param.name).to_ident(); - - quote! { - #init_param_name.with(|x| *x.borrow_mut() = Some(#param_name)); - } - }); - - // TODO I think we will want to put some permissions on this, like the original installer - quote! { - #(#params_initializations)* - } +pub fn generate() -> TokenStream { + quote! {} } diff --git a/kybra/compiler/kybra_generate/src/canister_method/inspect_message_method/rust.rs b/kybra/compiler/kybra_generate/src/canister_method/inspect_message_method/rust.rs index a87d448d6..0d943b9e9 100644 --- a/kybra/compiler/kybra_generate/src/canister_method/inspect_message_method/rust.rs +++ b/kybra/compiler/kybra_generate/src/canister_method/inspect_message_method/rust.rs @@ -10,12 +10,6 @@ pub fn generate( inspect_method_function_def.generate_call_to_py_function()?; Ok(quote::quote! { - // TODO is this a security vulnerability? - if unsafe { INTERPRETER_OPTION.is_none() } { - ic_cdk::api::call::accept_message(); - return; - } - #call_to_inspect_message_py_function }) } diff --git a/kybra/compiler/kybra_generate/src/canister_method/post_upgrade_method/build.rs b/kybra/compiler/kybra_generate/src/canister_method/post_upgrade_method/build.rs index d8e107b16..409c3331a 100644 --- a/kybra/compiler/kybra_generate/src/canister_method/post_upgrade_method/build.rs +++ b/kybra/compiler/kybra_generate/src/canister_method/post_upgrade_method/build.rs @@ -1,9 +1,12 @@ use cdk_framework::{ - act::node::canister_method::{CanisterMethodType, PostUpgradeMethod}, + act::node::{ + canister_method::{CanisterMethodType, PostUpgradeMethod}, + Param, + }, traits::CollectResults, }; use proc_macro2::TokenStream; -use quote::quote; +use rustpython_parser::ast::{Located, StmtKind}; use super::rust; use crate::{ @@ -13,64 +16,127 @@ use crate::{ }, method_utils::params::InternalOrExternal, py_ast::PyAst, + source_map::SourceMapped, Error, }; impl PyAst { - pub fn build_post_upgrade_method( - &self, - ) -> Result<(PostUpgradeMethod, TokenStream), Vec> { + /// To get around the Wasm binary limit we have adopted a deploy system with a chunk + /// uploading process. As part of this process we only use `post_upgrade` and do not + /// have an `init` that executes in Rust on the application canister. Because of this, + /// our `post_upgrade` function must call the developer's `init` function. If the developer + /// defines an `init` but does not define a `post_upgrade` function, then we must use + /// that `init` function's parameters as our Rust `post_upgrade` function's parameters. + pub fn build_post_upgrade_method(&self) -> Result> { + let init_function_defs = self.get_canister_stmt_of_type(CanisterMethodType::Init); let post_upgrade_function_defs = self.get_canister_stmt_of_type(CanisterMethodType::PostUpgrade); + let (init_params, (post_upgrade_params, guard_function_name), post_upgrade_method_body) = ( + build_init_params(&init_function_defs), + build_post_upgrade_info(&post_upgrade_function_defs), + generate_post_upgrade_method_body( + &self.entry_module_name, + init_function_defs.get(0), + post_upgrade_function_defs.get(0), + ), + ) + .collect_results()?; + let post_upgrade_method_params = + select_post_upgrade_method_params(init_params, post_upgrade_params); + + Ok(PostUpgradeMethod { + params: post_upgrade_method_params, + body: post_upgrade_method_body, + guard_function_name, + }) + } +} + +fn build_init_params( + init_function_defs: &Vec>>, +) -> Result, Vec> { + ensure_zero_or_one_function_defs(init_function_defs, CanisterMethodType::Init)?; + + match init_function_defs.get(0) { + Some(init_function_def) => init_function_def.build_params(InternalOrExternal::Internal), + None => Ok(vec![]), + } +} + +fn build_post_upgrade_info( + post_upgrade_function_defs: &Vec>>, +) -> Result<(Vec, Option), Vec> { + ensure_zero_or_one_function_defs(post_upgrade_function_defs, CanisterMethodType::PostUpgrade)?; - if post_upgrade_function_defs.len() > 1 { - return Err(MultipleSystemMethods::err_from_stmt( - &post_upgrade_function_defs, - CanisterMethodType::Heartbeat, - ) - .into()); + match post_upgrade_function_defs.get(0) { + Some(post_upgrade_function_def) => { + build_post_upgrade_params_and_guard_name(post_upgrade_function_def) } + None => Ok((vec![], None)), + } +} - let post_upgrade_function_def_option = post_upgrade_function_defs.get(0); +fn build_post_upgrade_params_and_guard_name( + post_upgrade_function_def: &SourceMapped<&Located>, +) -> Result<(Vec, Option), Vec> { + let (post_upgrade_params, guard_function_name, _) = ( + post_upgrade_function_def.build_params(InternalOrExternal::Internal), + post_upgrade_function_def + .get_guard_function_name() + .map_err(Error::into), + validate_post_upgrade_return_type(post_upgrade_function_def), + ) + .collect_results()?; - let (params, guard_function_name) = - if let Some(post_upgrade_function_def) = post_upgrade_function_def_option { - let (guard_function_name, params, return_type) = ( - post_upgrade_function_def - .get_guard_function_name() - .map_err(Error::into), - post_upgrade_function_def.build_params(InternalOrExternal::Internal), - post_upgrade_function_def.build_return_type(), - ) - .collect_results()?; + Ok((post_upgrade_params, guard_function_name)) +} - if !canister_method::is_void(return_type) { - return Err(ReturnTypeMustBeVoid::err_from_stmt( - post_upgrade_function_def, - CanisterMethodType::PostUpgrade, - ) - .into()); - } +fn select_post_upgrade_method_params( + init_params: Vec, + post_upgrade_params: Vec, +) -> Vec { + if post_upgrade_params.is_empty() { + init_params + } else { + post_upgrade_params + } +} - (params, guard_function_name) - } else { - (vec![], None) - }; +fn generate_post_upgrade_method_body( + entry_module_name: &String, + init_function_def: Option<&SourceMapped<&Located>>, + post_upgrade_function_def: Option<&SourceMapped<&Located>>, +) -> Result> { + rust::generate( + init_function_def, + post_upgrade_function_def, + entry_module_name, + ) +} + +fn ensure_zero_or_one_function_defs( + function_defs: &Vec>>, + canister_method_type: CanisterMethodType, +) -> Result<(), Vec> { + if function_defs.len() > 1 { + Err(MultipleSystemMethods::err_from_stmt(&function_defs, canister_method_type).into()) + } else { + Ok(()) + } +} - let call_to_post_upgrade_py_function = match &post_upgrade_function_def_option { - Some(post_upgrade_function_def) => { - post_upgrade_function_def.generate_call_to_py_function()? - } - None => quote!(), - }; +fn validate_post_upgrade_return_type( + post_upgrade_function_def: &SourceMapped<&Located>, +) -> Result<(), Vec> { + let return_type = post_upgrade_function_def.build_return_type()?; - Ok(( - PostUpgradeMethod { - params: params.clone(), - body: rust::generate(¶ms), - guard_function_name, - }, - call_to_post_upgrade_py_function, - )) + if !canister_method::is_void(return_type) { + Err(ReturnTypeMustBeVoid::err_from_stmt( + post_upgrade_function_def, + CanisterMethodType::PostUpgrade, + ) + .into()) + } else { + Ok(()) } } diff --git a/kybra/compiler/kybra_generate/src/canister_method/post_upgrade_method/mod.rs b/kybra/compiler/kybra_generate/src/canister_method/post_upgrade_method/mod.rs index 4120e04e9..1c2489a80 100644 --- a/kybra/compiler/kybra_generate/src/canister_method/post_upgrade_method/mod.rs +++ b/kybra/compiler/kybra_generate/src/canister_method/post_upgrade_method/mod.rs @@ -1,2 +1,17 @@ +use proc_macro2::TokenStream; +use quote::quote; +use rustpython_parser::ast::{Located, StmtKind}; + +use crate::{source_map::SourceMapped, Error}; + pub mod build; mod rust; + +pub fn generate_call( + function_def_option: &Option<&SourceMapped<&Located>>, +) -> Result> { + match &function_def_option { + Some(function_def) => function_def.generate_call_to_py_function(), + None => Ok(quote!()), + } +} diff --git a/kybra/compiler/kybra_generate/src/canister_method/post_upgrade_method/rust.rs b/kybra/compiler/kybra_generate/src/canister_method/post_upgrade_method/rust.rs index 28bec6aa4..6d4955ff4 100644 --- a/kybra/compiler/kybra_generate/src/canister_method/post_upgrade_method/rust.rs +++ b/kybra/compiler/kybra_generate/src/canister_method/post_upgrade_method/rust.rs @@ -1,19 +1,121 @@ -use cdk_framework::{act::node::Param, traits::ToIdent}; +use cdk_framework::traits::CollectResults; use proc_macro2::TokenStream; use quote::quote; +use rustpython_parser::ast::{Located, StmtKind}; -pub fn generate(params: &Vec) -> TokenStream { - let params_initializations = params.iter().map(|param| { - let param_name = format!("_cdk_user_defined_{}", param.name).to_ident(); - let init_param_name = format!("INIT_PARAM_{}", param.name).to_ident(); +use super::generate_call; +use crate::{source_map::SourceMapped, Error}; - quote! { - #init_param_name.with(|x| *x.borrow_mut() = Some(#param_name)); +pub fn generate( + init_function_def_option: Option<&SourceMapped<&Located>>, + post_upgrade_function_def_option: Option<&SourceMapped<&Located>>, + entry_module_name: &String, +) -> Result> { + let (call_to_init_py_function, call_to_post_upgrade_py_function) = ( + generate_call(&init_function_def_option), + generate_call(&post_upgrade_function_def_option), + ) + .collect_results()?; + + let randomness = generate_randomness(); + let interpreter_init = generate_interpreter_init(); + let ic_object_init = generate_ic_object_init(); + let code_init = generate_code_init(entry_module_name); + let save_global_interpreter = generate_save_global_interpreter(); + let call_to_user_init_or_post_upgrade = generate_call_to_user_init_or_post_upgrade( + &call_to_init_py_function, + &call_to_post_upgrade_py_function, + ); + + Ok(quote! { + #randomness + + unsafe { ic_wasi_polyfill::init(&randomness); }; + + #interpreter_init + + #ic_object_init + + #code_init + + #save_global_interpreter + + #call_to_user_init_or_post_upgrade + }) +} + +fn generate_randomness() -> TokenStream { + quote! { + let randomness = RANDOMNESS_STABLE_REF_CELL.with(|randomness_stable_ref_cell| randomness_stable_ref_cell.borrow().get().clone()); + + if randomness.len() == 0 { + ic_cdk::trap("Post Upgrade Error: randomness cannot have length 0"); } - }); + } +} + +fn generate_interpreter_init() -> TokenStream { + quote! { + let interpreter = rustpython_vm::Interpreter::with_init(Default::default(), |vm| { + vm.add_native_modules(rustpython_stdlib::get_module_inits()); + vm.add_frozen(rustpython_vm::py_freeze!(dir = "python_source")); + + PYTHON_STDLIB_STABLE_REF_CELL.with(|python_stdlib_stable_ref_cell| { + let mut python_stdlib_stable_ref = python_stdlib_stable_ref_cell.borrow(); - // TODO I think we will want to put some permissions on this, like the original installer + // TODO why is this necessary? It would be great to just pass in the bytes to FrozenLib::from_ref + let python_stdlib_bytes_reference: &'static [u8] = python_stdlib_stable_ref.get().clone().leak(); + vm.add_frozen(rustpython_compiler_core::frozen_lib::FrozenLib::from_ref(python_stdlib_bytes_reference)); + }); + }); + let scope = interpreter.enter(|vm| vm.new_scope_with_builtins()); + let vm = &interpreter.vm; + } +} + +fn generate_ic_object_init() -> TokenStream { quote! { - #(#params_initializations)* + Ic::make_class(&vm.ctx); + vm.builtins.set_attr("_kybra_ic", vm.new_pyobj(Ic {}), vm).unwrap_or_trap(vm); + } +} + +fn generate_code_init(entry_module_name: &str) -> TokenStream { + quote! { + vm.run_code_string( + scope.clone(), + &format!("from {} import *", #entry_module_name), + "".to_owned(), + ).unwrap_or_trap(vm); + } +} + +fn generate_save_global_interpreter() -> TokenStream { + quote! { + unsafe { + INTERPRETER_OPTION = Some(interpreter); + SCOPE_OPTION = Some(scope); + }; + } +} + +fn generate_call_to_user_init_or_post_upgrade( + call_to_init_py_function: &TokenStream, + call_to_post_upgrade_py_function: &TokenStream, +) -> TokenStream { + quote! { + // This is here so that the py function calls below have access to the vm + // The vm ownership is transferred above, thus we do this for now + let interpreter = unsafe { INTERPRETER_OPTION.as_mut() }.unwrap_or_trap("SystemError: missing python interpreter"); + let vm = &interpreter.vm; + + if CANISTER_INITIALIZED_REF_CELL.with(|canister_initialized_ref_cell| *canister_initialized_ref_cell.borrow().get()) == 0 { + #call_to_init_py_function + } + else { + #call_to_post_upgrade_py_function + } + + CANISTER_INITIALIZED_REF_CELL.with(|canister_initialized_ref_cell| canister_initialized_ref_cell.borrow_mut().set(1).unwrap_or_trap()); } } diff --git a/kybra/compiler/kybra_generate/src/guard_function/guard_function.rs b/kybra/compiler/kybra_generate/src/guard_function/guard_function.rs index d2d4d0fed..b549879a6 100644 --- a/kybra/compiler/kybra_generate/src/guard_function/guard_function.rs +++ b/kybra/compiler/kybra_generate/src/guard_function/guard_function.rs @@ -3,11 +3,6 @@ use quote::quote; pub fn generate(function_name: &String) -> TokenStream { quote! { - // TODO is this a security vulnerability? - if unsafe { INTERPRETER_OPTION.is_none() } { - return Ok(()); - } - call_global_python_function_sync(#function_name, ())? } } diff --git a/kybra/compiler/kybra_generate/src/header/ref_cells.rs b/kybra/compiler/kybra_generate/src/header/ref_cells.rs index 0f83b34e9..51ea9e088 100644 --- a/kybra/compiler/kybra_generate/src/header/ref_cells.rs +++ b/kybra/compiler/kybra_generate/src/header/ref_cells.rs @@ -1,6 +1,48 @@ use proc_macro2::TokenStream; use quote::quote; +use shared_utils::{CANISTER_INITIALIZED_MEMORY_ID, PYTHON_STDLIB_MEMORY_ID, RANDOMNESS_MEMORY_ID}; pub fn generate() -> TokenStream { - quote! {} + quote! { + thread_local! { + static PYTHON_STDLIB_STABLE_REF_CELL: std::cell::RefCell< + ic_stable_structures::cell::Cell< + Vec, + ic_stable_structures::memory_manager::VirtualMemory< + ic_stable_structures::DefaultMemoryImpl + > + > + > = std::cell::RefCell::new( + ic_stable_structures::cell::Cell::init( + MEMORY_MANAGER_REF_CELL.with(|m| m.borrow().get(ic_stable_structures::memory_manager::MemoryId::new(#PYTHON_STDLIB_MEMORY_ID))), vec![] + ).unwrap_or_trap() + ); + + static CANISTER_INITIALIZED_REF_CELL: std::cell::RefCell< + ic_stable_structures::cell::Cell< + u8, + ic_stable_structures::memory_manager::VirtualMemory< + ic_stable_structures::DefaultMemoryImpl + > + > + > = std::cell::RefCell::new( + ic_stable_structures::cell::Cell::init( + MEMORY_MANAGER_REF_CELL.with(|m| m.borrow().get(ic_stable_structures::memory_manager::MemoryId::new(#CANISTER_INITIALIZED_MEMORY_ID))), 0 + ).unwrap_or_trap() + ); + + static RANDOMNESS_STABLE_REF_CELL: std::cell::RefCell< + ic_stable_structures::cell::Cell< + Vec, + ic_stable_structures::memory_manager::VirtualMemory< + ic_stable_structures::DefaultMemoryImpl + > + > + > = std::cell::RefCell::new( + ic_stable_structures::cell::Cell::init( + MEMORY_MANAGER_REF_CELL.with(|m| m.borrow().get(ic_stable_structures::memory_manager::MemoryId::new(#RANDOMNESS_MEMORY_ID))), vec![] + ).unwrap_or_trap() + ); + } + } } diff --git a/kybra/compiler/kybra_generate/src/header/use_statements.rs b/kybra/compiler/kybra_generate/src/header/use_statements.rs index 27db61c02..1be65f8a2 100644 --- a/kybra/compiler/kybra_generate/src/header/use_statements.rs +++ b/kybra/compiler/kybra_generate/src/header/use_statements.rs @@ -4,7 +4,6 @@ pub fn generate() -> TokenStream { quote::quote! { use candid::{Decode, Encode}; use kybra_vm_value_derive::{CdkActTryIntoVmValue, CdkActTryFromVmValue}; - use rand::Rng as _KybraTraitRng; use rustpython_vm::{ class::PyClassImpl as _KybraTraitPyClassImpl, convert::ToPyObject as _KybraTraitToPyObject, diff --git a/kybra/compiler/kybra_generate/src/kybra_modules_init/mod.rs b/kybra/compiler/kybra_generate/src/kybra_modules_init/mod.rs deleted file mode 100644 index 9674274f6..000000000 --- a/kybra/compiler/kybra_generate/src/kybra_modules_init/mod.rs +++ /dev/null @@ -1,149 +0,0 @@ -// TODO this still needs a lot of cleanup and stuff - -// TODO we still need to do chunk uploads - -// TODO create init functions that can dynamically receive frozen python module bytecode -// TODO this should probably be more general-purpose so that we can simply upload any module -// TODO and hook it into the vm. This will open the path for numpy etc -use cdk_framework::{ - act::{ - node::{context::Context, Param}, - ToTypeAnnotation, - }, - traits::ToIdent, -}; -use proc_macro2::TokenStream; -use quote::quote; - -pub fn generate( - entry_module_name: &String, - init_params: &Vec, - call_to_init_py_function: TokenStream, - call_to_post_upgrade_py_function: TokenStream, -) -> TokenStream { - let params_ref_cells = init_params.iter().map(|param| { - let init_param_name = format!("INIT_PARAM_{}", param.name).to_ident(); - let init_param_type_annotation = param.to_type_annotation( - &Context { - keyword_list: crate::keywords::get_python_keywords(), - cdk_name: "kybra".to_string(), - }, - "_init".to_string(), - ); - - quote! { - static #init_param_name: std::cell::RefCell> - = std::cell::RefCell::new(None); - } - }); - - let params_initializations = init_params.iter().map(|param| { - let raw_param_name = ¶m.name; - let param_name = format!("_cdk_user_defined_{}", param.name).to_ident(); - let init_param_name = format!("INIT_PARAM_{}", param.name).to_ident(); - - quote! { - let #param_name = #init_param_name.with(|x| { - (*x.borrow()).clone().unwrap_or_else(|| { - ic_cdk::trap( - format!( - "SystemError: unable to retrieve init param \"{}\" from stable storage", - #raw_param_name - ) - .as_str(), - ) - }) - }); - } - }); - - quote::quote! { - thread_local! { - static INITIALIZED_MAP_REF_CELL: std::cell::RefCell< - ic_stable_structures::cell::Cell< - u8, - ic_stable_structures::memory_manager::VirtualMemory< - ic_stable_structures::DefaultMemoryImpl - > - > - > = std::cell::RefCell::new( - ic_stable_structures::cell::Cell::init( - MEMORY_MANAGER_REF_CELL.with(|m| { - m.borrow().get(ic_stable_structures::memory_manager::MemoryId::new(254)) - }), - 0 - ).unwrap_or_else(|_| { - ic_cdk::trap( - "SystemError: unable to set \"initialized\" flag in stable storage" - ) - }) - ); - - #(#params_ref_cells)* - - // static PYTHON_SOURCE_BYTECODE_REF_CELL: std::cell::RefCell> - // = std::cell::RefCell::new(vec![]); - // static NATIVE_STDLIB_BYTECODE_REF_CELL: std::cell::RefCell> - // = std::cell::RefCell::new(vec![]); - // static PYTHON_STDLIB_BYTECODE_REF_CELL: std::cell::RefCell> - // = std::cell::RefCell::new(vec![]); - } - - #[ic_cdk_macros::update] - pub fn create_python_source_module(bytes: Vec) { - unsafe { - #(#params_initializations)* - - // TODO why is this necessary? It would be great to just - // pass in the bytes to FrozenLib::from_ref - let bytes_reference: &'static [u8] = bytes.leak(); - - let interpreter = rustpython_vm::Interpreter::with_init(Default::default(), |vm| { - vm.add_native_modules(rustpython_stdlib::get_module_inits()); - vm.add_frozen( - rustpython_compiler_core::frozen_lib::FrozenLib::from_ref(bytes_reference) - ); - }); - - let scope = interpreter.enter(|vm| vm.new_scope_with_builtins()); - - interpreter.enter(|vm| { - Ic::make_class(&vm.ctx); - vm.builtins.set_attr("_kybra_ic", vm.new_pyobj(Ic {}), vm).unwrap_or_trap(vm); - - vm.run_code_string( - scope.clone(), - &format!("from {} import *", #entry_module_name), - "".to_owned(), - ).unwrap_or_trap(vm) - }); - - INTERPRETER_OPTION = Some(interpreter); - SCOPE_OPTION = Some(scope); - - let interpreter = INTERPRETER_OPTION - .as_mut() - .unwrap_or_trap("SystemError: missing python interpreter"); - let vm = &interpreter.vm; - - if INITIALIZED_MAP_REF_CELL - .with(|initialized_map_ref_cell| *initialized_map_ref_cell.borrow().get()) - == 0 - { - #call_to_init_py_function; - - INITIALIZED_MAP_REF_CELL - .with(|initialized_map_ref_cell| initialized_map_ref_cell - .borrow_mut() - .set(1) - ); - } - else { - #call_to_post_upgrade_py_function - } - - ic_cdk_timers::set_timer(core::time::Duration::new(0, 0), rng_seed); - } - } - } -} diff --git a/kybra/compiler/kybra_generate/src/lib.rs b/kybra/compiler/kybra_generate/src/lib.rs index ed8feea2d..d3cc02243 100644 --- a/kybra/compiler/kybra_generate/src/lib.rs +++ b/kybra/compiler/kybra_generate/src/lib.rs @@ -14,7 +14,6 @@ pub mod guard_function; pub mod header; pub mod ic_object; pub mod keywords; -pub mod kybra_modules_init; pub mod method_utils; pub mod py_ast; pub mod source_map; diff --git a/kybra/compiler/kybra_generate/src/py_ast/to_act.rs b/kybra/compiler/kybra_generate/src/py_ast/to_act.rs index 9fea10879..7be07b0dc 100644 --- a/kybra/compiler/kybra_generate/src/py_ast/to_act.rs +++ b/kybra/compiler/kybra_generate/src/py_ast/to_act.rs @@ -1,9 +1,8 @@ use cdk_framework::{ - act::{node::Param, CandidTypes, CanisterMethods, VmValueConversion}, + act::{CandidTypes, CanisterMethods, VmValueConversion}, traits::CollectResults, AbstractCanisterTree, }; -use proc_macro2::TokenStream; use super::PyAst; use crate::{ @@ -14,7 +13,7 @@ use crate::{ impl PyAst { pub fn to_act(&self) -> Result> { - let (candid_types, canister_methods_tuple, guard_functions, stable_b_tree_map_nodes) = ( + let (candid_types, canister_methods, guard_functions, stable_b_tree_map_nodes) = ( self.create_candid_types(), self.create_canister_methods(), self.build_guard_functions(), @@ -22,13 +21,6 @@ impl PyAst { ) .collect_results()?; - let ( - canister_methods, - init_params, - call_to_init_py_function, - call_to_post_upgrade_py_function, - ) = canister_methods_tuple; - let vm_value_conversion = VmValueConversion { try_from_vm_value_impls: try_into_vm_value_impls::generate(), try_into_vm_value_impls: try_from_vm_value_impls::generate(), @@ -42,10 +34,6 @@ impl PyAst { &canister_methods.query_methods, &candid_types.services, &stable_b_tree_map_nodes, - &self.entry_module_name, - &init_params, - call_to_init_py_function, - call_to_post_upgrade_py_function, ), candid_types, canister_methods, @@ -76,14 +64,12 @@ impl PyAst { }) } - pub fn create_canister_methods( - &self, - ) -> Result<(CanisterMethods, Vec, TokenStream, TokenStream), Vec> { + pub fn create_canister_methods(&self) -> Result> { let ( heartbeat_method, - (init_method, init_params, call_to_init_py_function), + init_method, inspect_message_method, - (post_upgrade_method, call_to_post_upgrade_py_function), + post_upgrade_method, pre_upgrade_method, query_methods, update_methods, @@ -98,19 +84,14 @@ impl PyAst { ) .collect_results()?; - Ok(( - CanisterMethods { - heartbeat_method, - init_method: Some(init_method), - inspect_message_method, - post_upgrade_method: Some(post_upgrade_method), - pre_upgrade_method, - query_methods, - update_methods, - }, - init_params, - call_to_init_py_function, - call_to_post_upgrade_py_function, - )) + Ok(CanisterMethods { + heartbeat_method, + init_method: Some(init_method), + inspect_message_method, + post_upgrade_method: Some(post_upgrade_method), + pre_upgrade_method, + query_methods, + update_methods, + }) } } diff --git a/kybra/compiler/kybra_modules_init/Cargo.toml b/kybra/compiler/kybra_modules_init/Cargo.toml deleted file mode 100644 index aa964d3e9..000000000 --- a/kybra/compiler/kybra_modules_init/Cargo.toml +++ /dev/null @@ -1,12 +0,0 @@ -[package] -name = "kybra_modules_init" -version = "0.0.0" -edition = "2018" - -[dependencies] -rustpython = { git = "https://github.com/RustPython/RustPython", rev = "c9546c2419f2e4db7e2987f30f0508dc29b30035", default-features = false, features = ["stdlib"] } -rustpython-vm = { git = "https://github.com/RustPython/RustPython", rev = "c9546c2419f2e4db7e2987f30f0508dc29b30035", default-features = false, features = [] } -rustpython-stdlib = { git = "https://github.com/RustPython/RustPython", rev = "c9546c2419f2e4db7e2987f30f0508dc29b30035", default-features = false, features = [] } -rustpython-derive = { git = "https://github.com/RustPython/RustPython", rev = "c9546c2419f2e4db7e2987f30f0508dc29b30035", default-features = false, features = [] } -rustpython-pylib = { git = "https://github.com/RustPython/RustPython", rev = "c9546c2419f2e4db7e2987f30f0508dc29b30035", default-features = false, features = ["freeze-stdlib"] } -tempfile = "3.5.0" \ No newline at end of file diff --git a/kybra/compiler/kybra_modules_init/src/main.rs b/kybra/compiler/kybra_modules_init/src/main.rs deleted file mode 100644 index b4297b482..000000000 --- a/kybra/compiler/kybra_modules_init/src/main.rs +++ /dev/null @@ -1,76 +0,0 @@ -use std::io::Write; -use std::process::Command; -use tempfile::NamedTempFile; - -fn main() { - let args: Vec = std::env::args().collect(); - - let canister_name = &args[1]; - - let max_chunk_size = 2 * 1_000 * 1_000; // 2 MB - - let python_source_modules = rustpython_vm::py_freeze!(dir = "../python_source"); - let python_source_bytecode = python_source_modules.bytes.to_vec(); - let python_source_bytecode_chunks = split_into_chunks(python_source_bytecode, max_chunk_size); - - // TODO we still need to upload the python stdlib - let python_stdlib_modules = rustpython_pylib::FROZEN_STDLIB; - let python_stdlib_bytecode = python_stdlib_modules.bytes.to_vec(); - let python_stdlib_bytecode_chunks = split_into_chunks(python_stdlib_bytecode, max_chunk_size); - - let python_source_bytecode_chunk = &python_source_bytecode_chunks[0]; - let blob_string = vec_u8_to_blob_string(python_source_bytecode_chunk); - - let mut temp_file = NamedTempFile::new().expect("Failed to create temporary file"); - temp_file - .write_all(blob_string.as_bytes()) - .expect("Failed to write data to temporary file"); - - let output = Command::new("dfx") - .arg("canister") - .arg("call") - .arg(canister_name) - .arg("create_python_source_module") - .arg("--argument-file") - .arg(temp_file.path()) - .output() - .expect("Failed to execute the dfx command"); - - if output.status.success() { - println!("Output: {:?}", String::from_utf8_lossy(&output.stdout)); - } else { - eprintln!("Error: {:?}", String::from_utf8_lossy(&output.stderr)); - } -} - -fn split_into_chunks(data: Vec, chunk_size: usize) -> Vec> { - let mut chunks = Vec::new(); - let mut start = 0; - let data_len = data.len(); - - while start < data_len { - let end = usize::min(start + chunk_size, data_len); - chunks.push(data[start..end].to_vec()); - start = end; - } - - chunks -} - -fn vec_u8_to_blob_string(data: &[u8]) -> String { - let mut result = String::from("(blob \""); - for &byte in data { - // if byte.is_ascii_graphic() && byte != b'\\' { - // result.push(byte as char); - // } else { - result.push_str(&format!("\\{:02X}", byte)); - // } - } - result.push_str("\")"); - result -} - -// fn vec_u8_to_blob_string(data: &[u8]) -> String { -// let hex_encoded = data.iter().map(|byte| format!("{:02X}", byte)).collect::(); -// format!("(blob \"{}\")", hex_encoded) -// } diff --git a/kybra/compiler/kybra_post_install/Cargo.toml b/kybra/compiler/kybra_post_install/Cargo.toml new file mode 100644 index 000000000..0f4dd6ba7 --- /dev/null +++ b/kybra/compiler/kybra_post_install/Cargo.toml @@ -0,0 +1,26 @@ +[package] +name = "kybra_post_install" +version = "0.0.0" +edition = "2018" +build = "build.rs" + +[profile.dev] +opt-level = 0 # Minimal optimization, prioritize compilation speed +debug = false # Disable debug information +incremental = true # Enable incremental compilation +codegen-units = 16 # Increase parallel code generation units +lto = false # Disable link-time optimization +panic = 'unwind' # Unwind the stack upon a panic (default, you may also use 'abort' for slightly faster builds) + +[dependencies] +tempfile = "3.5.0" +dirs = "5.0.1" +rustpython = { git = "https://github.com/demergent-labs/RustPython", rev = "b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874", default-features = false, features = [] } +rustpython-vm = { git = "https://github.com/demergent-labs/RustPython", rev = "b7b0a4994d7871bf1e21fedb6bd0f0e5639fa874", default-features = false, features = [] } +sha2 = "0.10.6" +hex = "0.4.3" + +[build-dependencies] +dirs = "5.0.1" +tempfile = "3.5.0" +fs_extra = "1.3.0" diff --git a/kybra/compiler/kybra_post_install/build.rs b/kybra/compiler/kybra_post_install/build.rs new file mode 100644 index 000000000..8edefc459 --- /dev/null +++ b/kybra/compiler/kybra_post_install/build.rs @@ -0,0 +1,155 @@ +use fs_extra::dir::{copy, CopyOptions}; +use std::path::Path; +use std::process::Command; +use tempfile::tempdir; + +static ERROR_PREFIX: &str = "Kybra Post Install Build Error"; + +fn main() -> Result<(), String> { + let ic_build = get_and_set_ic_build(); + + if ic_build == false { + return Ok(()); + } + + let kybra_version = get_kybra_version()?; + let home_dir = dirs::home_dir().ok_or(create_error_string("Home directory not found"))?; + + let python_stdlib_binary_path = + home_dir.join(format!(".config/kybra/{kybra_version}/bin/python_stdlib")); + handle_python_stdlib_exists(&python_stdlib_binary_path); + + let kybra_post_install_src_lib_path = Path::new("src/Lib"); + + if kybra_post_install_src_lib_path.exists() { + clean_kybra_post_install_src_lib(&kybra_post_install_src_lib_path)?; + } + + let python_stdlib_src_path = home_dir.join(format!(".config/kybra/{kybra_version}/Lib")); + + if python_stdlib_src_path.exists() { + copy_from_python_stdlib_src_to_kybra_post_install_src( + &python_stdlib_src_path, + &kybra_post_install_src_lib_path, + )?; + + return Ok(()); + } + + let github_repo = "https://github.com/RustPython/RustPython.git"; + let commit_hash = "f12875027ce425297c07cbccb9be77514ed46157"; + + let temp_dir = tempdir().map_err(|e| error_to_string(&e))?; + git_clone(github_repo, &temp_dir)?; + git_checkout(commit_hash, &temp_dir)?; + + let git_repo_lib_dir = temp_dir.path().join("Lib"); + copy_directory(&git_repo_lib_dir, &python_stdlib_src_path)?; + copy_directory(&python_stdlib_src_path, &kybra_post_install_src_lib_path)?; + + temp_dir.close().map_err(|e| error_to_string(&e))?; + + Ok(()) +} + +fn get_kybra_version() -> Result { + std::env::var("KYBRA_VERSION") + .map_err(|_| create_error_string("KYBRA_VERSION environment variable is not present")) +} + +fn handle_python_stdlib_exists(python_stdlib_binary_path: &Path) { + if python_stdlib_binary_path.exists() { + println!("cargo:rustc-cfg=python_stdlib_exists"); + } +} + +fn clean_kybra_post_install_src_lib(kybra_post_install_src_lib_path: &Path) -> Result<(), String> { + fs_extra::dir::remove(kybra_post_install_src_lib_path).map_err(|e| error_to_string(&e))?; + Ok(()) +} + +fn copy_from_python_stdlib_src_to_kybra_post_install_src( + python_stdlib_src_path: &Path, + kybra_post_install_src_lib_path: &Path, +) -> Result { + copy( + python_stdlib_src_path, + kybra_post_install_src_lib_path, + &CopyOptions { + copy_inside: true, + ..Default::default() + }, + ) + .map_err(|e| error_to_string(&e)) +} + +fn git_clone(github_repo: &str, temp_dir: &tempfile::TempDir) -> Result<(), String> { + let status = Command::new("git") + .args(&[ + "clone", + github_repo, + temp_dir + .path() + .to_str() + .ok_or(create_error_string("Could not convert path to &str"))?, + ]) + .status() + .map_err(|e| error_to_string(&e))?; + + if status.success() { + Ok(()) + } else { + Err(create_error_string("Failed to clone the repository")) + } +} + +fn git_checkout(commit_hash: &str, temp_dir: &tempfile::TempDir) -> Result<(), String> { + let status = Command::new("git") + .current_dir(temp_dir.path()) + .args(&["checkout", commit_hash]) + .status() + .map_err(|e| error_to_string(&e))?; + + if status.success() { + Ok(()) + } else { + Err(create_error_string( + "Could not checkout the specific commit", + )) + } +} + +fn copy_directory(src: &Path, dst: &Path) -> Result { + copy( + src, + dst, + &CopyOptions { + copy_inside: true, + ..Default::default() + }, + ) + .map_err(|e| error_to_string(&e)) +} + +fn error_to_string(e: &dyn std::error::Error) -> String { + format!("{ERROR_PREFIX}: {}", e.to_string()) +} + +fn create_error_string(message: &str) -> String { + format!("{ERROR_PREFIX}: {message}") +} + +// This attempts to detect when the code is being compiled in a non-ic environment +// such as Rust Analyzer. The problem is that this build script and the main.rs +// are run by Rust Analyzer, and because the network requests, file IO, and compilation +// can be quite heavy, it makes local debugging very slow +// This is an attempt to allow Rust Analyzer to run quickly +fn get_and_set_ic_build() -> bool { + match (std::env::var("KYBRA_VERSION"), std::env::var("DFX_NETWORK")) { + (Ok(_), Ok(_)) => { + println!("cargo:rustc-cfg=ic_build"); + true + } + _ => false, + } +} diff --git a/kybra/compiler/kybra_post_install/src/dfx.rs b/kybra/compiler/kybra_post_install/src/dfx.rs new file mode 100644 index 000000000..2973f7275 --- /dev/null +++ b/kybra/compiler/kybra_post_install/src/dfx.rs @@ -0,0 +1,24 @@ +use std::process::Command; + +use crate::error::create_error_string; + +pub fn dfx( + command: &str, + subcommand: &str, + args: &Vec<&str>, +) -> Result { + let dfx_network = std::env::var("DFX_NETWORK") + .map_err(|_| create_error_string("DFX_NETWORK environment variable not present"))?; + + let mut dfx_command = Command::new("dfx"); + dfx_command.arg(command); + dfx_command.arg(subcommand); + dfx_command.arg("--network"); + dfx_command.arg(dfx_network); + + for arg in args { + dfx_command.arg(arg); + } + + dfx_command.output().map_err(|e| e.to_string()) +} diff --git a/kybra/compiler/kybra_post_install/src/error.rs b/kybra/compiler/kybra_post_install/src/error.rs new file mode 100644 index 000000000..3be63fa58 --- /dev/null +++ b/kybra/compiler/kybra_post_install/src/error.rs @@ -0,0 +1,9 @@ +use crate::ERROR_PREFIX; + +pub fn error_to_string(e: &dyn std::error::Error) -> String { + format!("{ERROR_PREFIX}: {}", e.to_string()) +} + +pub fn create_error_string(message: &str) -> String { + format!("{ERROR_PREFIX}: {message}") +} diff --git a/kybra/compiler/kybra_post_install/src/install_app_canister.rs b/kybra/compiler/kybra_post_install/src/install_app_canister.rs new file mode 100644 index 000000000..7815a5f8b --- /dev/null +++ b/kybra/compiler/kybra_post_install/src/install_app_canister.rs @@ -0,0 +1,42 @@ +use crate::{ + dfx::dfx, + error::create_error_string, + permissions::{add_permissions, remove_permissions}, +}; + +pub fn install_app_canister(canister_name: &str) -> Result<(), String> { + println!("\nFinalizing...\n"); + + let (canister_id, canister_already_its_own_controller_before_post_install) = + add_permissions(canister_name)?; + + let install_output = dfx("canister", "call", &vec![canister_name, "install_wasm"])?; + + remove_permissions( + canister_name, + &canister_id, + canister_already_its_own_controller_before_post_install, + )?; + + if !install_output.status.success() { + handle_install_app_canister_failure(&install_output)?; + } + + Ok(()) +} + +fn handle_install_app_canister_failure( + install_output: &std::process::Output, +) -> Result<(), String> { + let error_message = String::from_utf8_lossy(&install_output.stderr); + + if !error_message.contains("did not reply to the call") + && !error_message.contains("function invocation does not match its signature") + { + return Err(create_error_string(&String::from_utf8_lossy( + &install_output.stderr, + ))); + } + + Ok(()) +} diff --git a/kybra/compiler/kybra_post_install/src/main.rs b/kybra/compiler/kybra_post_install/src/main.rs new file mode 100644 index 000000000..6671fd03d --- /dev/null +++ b/kybra/compiler/kybra_post_install/src/main.rs @@ -0,0 +1,37 @@ +// TODO share with DFINITY how I'm doing this, maybe they can build that into dfx to overcome some of the Wasm binary limitations temporarily +// TODO a future version of dfx should take care of all of this chunk uploading for us +use std::{thread, time::Duration}; + +use error::create_error_string; +use install_app_canister::install_app_canister; +use upload_app_canister::upload_app_canister; +use upload_python_stdlib::upload_python_stdlib; + +mod dfx; +mod error; +mod install_app_canister; +mod permissions; +mod upload_app_canister; +mod upload_chunk; +mod upload_python_stdlib; + +pub static ERROR_PREFIX: &str = "Kybra Post Install Error"; + +fn main() -> Result<(), String> { + let args: Vec = std::env::args().collect(); + let canister_name = args + .get(1) + .ok_or(create_error_string("Canister name argument not present"))?; + let max_chunk_size = 2 * 1_000 * 1_000; // 2 MB message size limit currently on the Internet Computer + + upload_app_canister(canister_name, max_chunk_size)?; + upload_python_stdlib(canister_name, max_chunk_size)?; + install_app_canister(canister_name)?; + + // TODO this is here because of some complications with the install_code self-referential cross-canister call + // TODO the call is a notify and thus won't wait for the canister's post_upgrade function to complete + // TODO we wait here to make sure that the canister is most likely initialized before ending the post_install script + thread::sleep(Duration::from_secs(5)); + + Ok(()) +} diff --git a/kybra/compiler/kybra_post_install/src/permissions.rs b/kybra/compiler/kybra_post_install/src/permissions.rs new file mode 100644 index 000000000..af5e66bfd --- /dev/null +++ b/kybra/compiler/kybra_post_install/src/permissions.rs @@ -0,0 +1,83 @@ +use crate::{dfx::dfx, error::create_error_string}; + +pub fn add_permissions(canister_name: &str) -> Result<(String, bool), String> { + let canister_id = get_canister_id(canister_name)?; + let canister_already_its_own_controller = + get_canister_already_its_own_controller(canister_name, &canister_id)?; + + if !canister_already_its_own_controller { + add_controller(canister_name, &canister_id)?; + } + + Ok((canister_id, canister_already_its_own_controller)) +} + +fn get_canister_id(canister_name: &str) -> Result { + let canister_id_output = dfx("canister", "id", &vec![canister_name])?; + + let canister_id = String::from_utf8_lossy(&canister_id_output.stdout) + .trim() + .to_string(); + + Ok(canister_id) +} + +fn get_canister_already_its_own_controller( + canister_name: &str, + canister_id: &str, +) -> Result { + let current_controllers_output = dfx("canister", "info", &vec![canister_name])?; + + if !current_controllers_output.status.success() { + return Err(create_error_string(&String::from_utf8_lossy( + ¤t_controllers_output.stderr, + ))); + } + + let canister_already_its_own_controller = + String::from_utf8_lossy(¤t_controllers_output.stdout) + .to_string() + .contains(&canister_id); + + Ok(canister_already_its_own_controller) +} + +fn add_controller(canister_name: &str, canister_id: &str) -> Result<(), String> { + let add_controller_output = dfx( + "canister", + "update-settings", + &vec!["--add-controller", canister_id, canister_name], + )?; + + if !add_controller_output.status.success() { + return Err(create_error_string(&String::from_utf8_lossy( + &add_controller_output.stderr, + ))); + } + + Ok(()) +} + +pub fn remove_permissions( + canister_name: &str, + canister_id: &str, + canister_already_its_own_controller: bool, +) -> Result<(), String> { + if canister_already_its_own_controller { + return Ok(()); + } + + let remove_controller_output = dfx( + "canister", + "update-settings", + &vec!["--remove-controller", canister_id, canister_name], + )?; + + if !remove_controller_output.status.success() { + return Err(create_error_string(&String::from_utf8_lossy( + &remove_controller_output.stderr, + ))); + } + + Ok(()) +} diff --git a/kybra/compiler/kybra_post_install/src/upload_app_canister.rs b/kybra/compiler/kybra_post_install/src/upload_app_canister.rs new file mode 100644 index 000000000..b70dff370 --- /dev/null +++ b/kybra/compiler/kybra_post_install/src/upload_app_canister.rs @@ -0,0 +1,26 @@ +use crate::{ + error::error_to_string, + upload_chunk::{split_into_chunks, upload_chunk}, +}; + +pub fn upload_app_canister(canister_name: &str, max_chunk_size: usize) -> Result<(), String> { + let wasm = std::fs::read(format!( + ".kybra/{canister_name}/{canister_name}_app.wasm.gz" + )) + .map_err(|e| error_to_string(&e))?; + + let wasm_chunks = split_into_chunks(wasm, max_chunk_size); + + for (index, wasm_chunk) in wasm_chunks.iter().enumerate() { + upload_chunk( + &format!("{canister_name} wasm"), + canister_name, + wasm_chunk, + "upload_wasm_chunk", + index, + wasm_chunks.len(), + )?; + } + + Ok(()) +} diff --git a/kybra/compiler/kybra_post_install/src/upload_chunk.rs b/kybra/compiler/kybra_post_install/src/upload_chunk.rs new file mode 100644 index 000000000..d644877ae --- /dev/null +++ b/kybra/compiler/kybra_post_install/src/upload_chunk.rs @@ -0,0 +1,72 @@ +use std::io::Write; +use tempfile::NamedTempFile; + +use crate::{dfx::dfx, error::create_error_string}; + +pub fn upload_chunk( + name: &str, + canister_name: &str, + bytecode_chunk: &Vec, + canister_method_name: &str, + chunk_number: usize, + chunk_total: usize, +) -> Result<(), String> { + let blob_string = vec_u8_to_blob_string(bytecode_chunk); + + let mut temp_file = + NamedTempFile::new().map_err(|_| create_error_string("Failed to create temporary file"))?; + temp_file + .write_all(blob_string.as_bytes()) + .map_err(|_| create_error_string("Failed to write data to temporary file"))?; + + let output = dfx( + "canister", + "call", + &vec![ + canister_name, + canister_method_name, + "--argument-file", + temp_file.path().to_str().ok_or(create_error_string( + "temp_file path could not be converted to &str", + ))?, + ], + )?; + + let chunk_number = chunk_number + 1; + + if output.status.success() { + println!( + "{}", + format!("Uploading {name} chunk {chunk_number}/{chunk_total}") + ); + } else { + return Err(create_error_string(&String::from_utf8_lossy( + &output.stderr, + ))); + } + + Ok(()) +} + +pub fn split_into_chunks(data: Vec, chunk_size: usize) -> Vec> { + let mut chunks = Vec::new(); + let mut start = 0; + let data_len = data.len(); + + while start < data_len { + let end = usize::min(start + chunk_size, data_len); + chunks.push(data[start..end].to_vec()); + start = end; + } + + chunks +} + +fn vec_u8_to_blob_string(data: &[u8]) -> String { + let mut result = String::from("(blob \""); + for &byte in data { + result.push_str(&format!("\\{:02X}", byte)); + } + result.push_str("\")"); + result +} diff --git a/kybra/compiler/kybra_post_install/src/upload_python_stdlib.rs b/kybra/compiler/kybra_post_install/src/upload_python_stdlib.rs new file mode 100644 index 000000000..731b687c6 --- /dev/null +++ b/kybra/compiler/kybra_post_install/src/upload_python_stdlib.rs @@ -0,0 +1,110 @@ +use sha2::{Digest, Sha256}; + +use crate::{ + dfx::dfx, + error::create_error_string, + upload_chunk::{split_into_chunks, upload_chunk}, +}; + +#[cfg(all(python_stdlib_exists, ic_build))] +use crate::error::error_to_string; + +pub fn upload_python_stdlib(canister_name: &str, max_chunk_size: usize) -> Result<(), String> { + let python_stdlib_bytecode = get_python_stdlib_bytecode()?; + + let local_python_stdlib_bytecode_hash = + get_local_python_stdlib_bytecode_hash(&python_stdlib_bytecode); + + let remote_python_stdlib_bytecode_hash = get_remote_python_stdlib_bytecode_hash(canister_name)?; + + let hashes_do_not_match = + format!("(\"{local_python_stdlib_bytecode_hash}\")") != remote_python_stdlib_bytecode_hash; + + if hashes_do_not_match { + handle_python_stdlib_hashes_do_not_match( + canister_name, + python_stdlib_bytecode, + max_chunk_size, + )?; + } + + Ok(()) +} + +fn get_local_python_stdlib_bytecode_hash(python_stdlib_bytecode: &Vec) -> String { + let mut hasher = Sha256::new(); + hasher.update(python_stdlib_bytecode); + let result = hasher.finalize(); + hex::encode(result) +} + +fn get_remote_python_stdlib_bytecode_hash(canister_name: &str) -> Result { + let remote_python_stdlib_hash_output = dfx( + "canister", + "call", + &vec![canister_name, "get_python_stdlib_hash"], + )?; + + if !remote_python_stdlib_hash_output.status.success() { + return Err(create_error_string(&String::from_utf8_lossy( + &remote_python_stdlib_hash_output.stderr, + ))); + } + + let remote_python_stdlib_bytecode_hash = + String::from_utf8_lossy(&remote_python_stdlib_hash_output.stdout) + .trim() + .to_string(); + + Ok(remote_python_stdlib_bytecode_hash) +} + +fn handle_python_stdlib_hashes_do_not_match( + canister_name: &str, + python_stdlib_bytecode: Vec, + max_chunk_size: usize, +) -> Result<(), String> { + let python_stdlib_bytecode_chunks = split_into_chunks(python_stdlib_bytecode, max_chunk_size); + + for (index, python_stdlib_bytecode_chunk) in python_stdlib_bytecode_chunks.iter().enumerate() { + upload_chunk( + "Python stdlib", + canister_name, + python_stdlib_bytecode_chunk, + "upload_python_stdlib_chunk", + index, + python_stdlib_bytecode_chunks.len(), + )?; + } + + Ok(()) +} + +fn get_python_stdlib_bytecode() -> Result, String> { + #[cfg(ic_build)] + let kybra_version = std::env::var("KYBRA_VERSION") + .map_err(|_| create_error_string("KYBRA_VERSION environment variable not present"))?; + + #[cfg(ic_build)] + let python_stdlib_path = dirs::home_dir() + .ok_or(create_error_string("Home directory not found"))? + .join(format!(".config/kybra/{kybra_version}/bin/python_stdlib")); + + #[cfg(all(not(python_stdlib_exists), ic_build))] + let python_stdlib_modules = rustpython_vm::py_freeze!(dir = "src/Lib"); + + #[cfg(all(not(python_stdlib_exists), ic_build))] + let python_stdlib_bytecode = python_stdlib_modules.bytes.to_vec(); + + #[cfg(all(not(python_stdlib_exists), ic_build))] + std::fs::write(python_stdlib_path, &python_stdlib_bytecode).map_err(|e| error_to_string(&e))?; + + #[cfg(all(python_stdlib_exists, ic_build))] + let python_stdlib_bytecode = + std::fs::read(python_stdlib_path).map_err(|e| error_to_string(&e))?; + + #[cfg(not(ic_build))] + let python_stdlib_bytecode = vec![]; + + Ok(python_stdlib_bytecode) +} diff --git a/kybra/compiler/shared_utils/Cargo.toml b/kybra/compiler/shared_utils/Cargo.toml new file mode 100644 index 000000000..5f2664879 --- /dev/null +++ b/kybra/compiler/shared_utils/Cargo.toml @@ -0,0 +1,4 @@ +[package] +name = "shared_utils" +version = "0.0.0" +edition = "2018" diff --git a/kybra/compiler/shared_utils/src/lib.rs b/kybra/compiler/shared_utils/src/lib.rs new file mode 100644 index 000000000..49beb306b --- /dev/null +++ b/kybra/compiler/shared_utils/src/lib.rs @@ -0,0 +1,3 @@ +pub const CANISTER_INITIALIZED_MEMORY_ID: u8 = 254; +pub const PYTHON_STDLIB_MEMORY_ID: u8 = 253; +pub const RANDOMNESS_MEMORY_ID: u8 = 252; diff --git a/kybra/run_kybra_generate_or_exit.py b/kybra/run_kybra_generate_or_exit.py new file mode 100644 index 000000000..7b2e9e8d5 --- /dev/null +++ b/kybra/run_kybra_generate_or_exit.py @@ -0,0 +1,130 @@ +import os +import re +import shutil +import subprocess +import sys +from typing import Callable + +import kybra +from kybra.colors import red +from kybra.types import Paths + + +def run_kybra_generate_or_exit(paths: Paths, cargo_env: dict[str, str], verbose: bool): + bin_path, bin_path_debug = construct_bin_paths(paths) + should_rebuild = check_rebuild(bin_path) + if should_rebuild: + run_build(bin_path, bin_path_debug, paths, cargo_env, verbose) + run_kybra_generate(bin_path, paths, cargo_env, verbose) + + +def construct_bin_paths(paths: Paths) -> tuple[str, str]: + bin_path = ( + f"{paths['global_kybra_config_dir']}/{kybra.__version__}/bin/kybra_generate" + ) + bin_path_debug = f"{paths['global_kybra_target_dir']}/debug/kybra_generate" + return bin_path, bin_path_debug + + +def check_rebuild(bin_path: str) -> bool: + return not os.path.exists(bin_path) or os.environ.get("KYBRA_REBUILD") == "true" + + +def run_build( + bin_path: str, + bin_path_debug: str, + paths: Paths, + cargo_env: dict[str, str], + verbose: bool, +): + build_result = execute_build_process(paths, cargo_env, verbose) + validate_process(build_result, parse_kybra_generate_error) + copy_file(bin_path_debug, bin_path) + + +def execute_build_process( + paths: Paths, cargo_env: dict[str, str], verbose: bool +) -> subprocess.CompletedProcess[bytes]: + return subprocess.run( + [ + f"{paths['global_kybra_rust_bin_dir']}/cargo", + "build", + f"--manifest-path={paths['canister']}/kybra_generate/Cargo.toml", + ], + capture_output=not verbose, + env=cargo_env, + ) + + +def copy_file(source: str, destination: str): + shutil.copy(source, destination) + + +def run_kybra_generate( + bin_path: str, paths: Paths, cargo_env: dict[str, str], verbose: bool +): + generate_result = execute_generate_process(bin_path, paths, cargo_env, verbose) + validate_process(generate_result, parse_kybra_generate_error) + + +def execute_generate_process( + bin_path: str, paths: Paths, cargo_env: dict[str, str], verbose: bool +) -> subprocess.CompletedProcess[bytes]: + return subprocess.run( + [ + bin_path, + paths["py_file_names_file"], + paths["py_entry_module_name"], + paths["lib"], + ], + capture_output=not verbose, + env=cargo_env, + ) + + +def validate_process( + result: subprocess.CompletedProcess[bytes], error_parser: Callable[[bytes], str] +) -> None: + if result.returncode != 0: + print_error_and_exit_kybra_generate(result, error_parser) + + +def print_error_and_exit_kybra_generate( + result: subprocess.CompletedProcess[bytes], error_parser: Callable[[bytes], str] +) -> None: + print(red("\nšŸ’£ Kybra error: compilation\n")) + print(error_parser(result.stderr)) + print_help_message() + sys.exit(1) + + +def print_help_message(): + print( + "\nFor help reach out in the #python channel of the ICP Developer Community discord:" + ) + print("\nhttps://discord.com/channels/748416164832608337/1019372359775440988\n") + print("šŸ’€ Build failed") + + +def parse_kybra_generate_error(stdout: bytes) -> str: + err = stdout.decode("utf-8") + std_err_lines = err.splitlines() + try: + line_where_error_message_starts = next( + i + for i, v in enumerate(std_err_lines) + if v.startswith("thread 'main' panicked at '") + ) + line_where_error_message_ends = next( + i for i, v in enumerate(std_err_lines) if "', src/" in v + ) + except: + return err + + err_lines = std_err_lines[ + line_where_error_message_starts : line_where_error_message_ends + 1 + ] + err_lines[0] = err_lines[0].replace("thread 'main' panicked at '", "") + err_lines[-1] = re.sub("', src/.*", "", err_lines[-1]) + + return red("\n".join(err_lines)) diff --git a/kybra/types.py b/kybra/types.py index 72fb03236..8d0c7cacb 100644 --- a/kybra/types.py +++ b/kybra/types.py @@ -28,5 +28,6 @@ class Paths(TypedDict): custom_modules: str global_kybra_config_dir: str global_kybra_rust_dir: str + global_kybra_rust_bin_dir: str global_kybra_bin_dir: str global_kybra_target_dir: str diff --git a/scripts/add_test_delay.py b/scripts/add_test_delay.py new file mode 100644 index 000000000..de62cf546 --- /dev/null +++ b/scripts/add_test_delay.py @@ -0,0 +1,25 @@ +import os + +# Define the directory to search +directory = 'examples' + +# Walk through all directories and files in the specified directory +for root, dirs, files in os.walk(directory): + for file in files: + # Find all 'pretest.ts' files + if file == 'pretest.ts': + file_path = os.path.join(root, file) + with open(file_path, 'r') as f: + lines = f.readlines() + # Look for the 'dfx deploy' command line + for i, line in enumerate(lines): + if 'dfx deploy' in line: + # Find the closing brace of this execSync statement + while not '});' in lines[i]: + i += 1 + # Add new line after the closing brace of the 'dfx deploy' command + lines.insert(i+1, '\n await new Promise((resolve) => setTimeout(resolve, 10_000));\n') + break + # Write changes back to file + with open(file_path, 'w') as f: + f.writelines(lines) diff --git a/setup.py b/setup.py index 35317044c..6169a4a5b 100644 --- a/setup.py +++ b/setup.py @@ -1,6 +1,6 @@ from kybra import __version__ from pathlib import Path -from setuptools import setup +from setuptools import setup # type: ignore setup( name="kybra",