diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e08e634 --- /dev/null +++ b/.gitignore @@ -0,0 +1,142 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +.env.test +.env.production + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +# random +.DS_STORE + +# Generated by Cargo +# will have compiled files and executables +debug/ +target/ + +# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries +# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html +Cargo.lock + +# These are backup files generated by rustfmt +**/*.rs.bk + +# MSVC Windows builds of rustc generate these, which store debugging information +*.pdb + + +# dfx +.dfx/ +scripts/ +canister_ids.json diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..c9d3354 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,9 @@ +[workspace] +members = [ + "src/ic_loot_rs", +] + +[profile.release] +lto = true +opt-level = 'z' +codegen-units = 1 \ No newline at end of file diff --git a/dfx.json b/dfx.json new file mode 100644 index 0000000..4b3bc94 --- /dev/null +++ b/dfx.json @@ -0,0 +1,34 @@ +{ + "version": 1, + "canisters": { + "ic_loot_rs": { + "type": "custom", + "candid": "src/ic_loot_rs/ic_loot.did", + "wasm": "target/wasm32-unknown-unknown/release/ic_loot_rs.wasm", + "build": "cargo build --target wasm32-unknown-unknown --release --package ic_loot_rs" + }, + "ic_loot_assets": { + "dependencies": [ + "ic_loot_rs" + ], + "frontend": { + "entrypoint": "dist/index.html" + }, + "source": [ + "dist/" + ], + "type": "assets" + } + }, + "dfx": "0.8.1", + "defaults": { + "build": { + "output": "canisters/" + }, + "start": { + "address": "127.0.0.1", + "port": 8000, + "serve_root": "canisters/eeoo/assets" + } + } +} diff --git a/index.html b/index.html new file mode 100644 index 0000000..a5abcf5 --- /dev/null +++ b/index.html @@ -0,0 +1,47 @@ + + + + + + + IC DRIP + + + + + + + + + + + + + + + + +
+ + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..2f669f6 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1501 @@ +{ + "name": "ic_loot", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@antfu/utils": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.2.4.tgz", + "integrity": "sha512-2bZNkVfL9IZESmvE26UKi8SzyvSoaIsGXDcnbHFMtmGMqUiB1fXpAJ1ijGf+tSqKRQ5yagck2U1Qk0p+705/kw==", + "dev": true, + "requires": { + "@types/throttle-debounce": "^2.1.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==" + }, + "@babel/parser": { + "version": "7.15.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.5.tgz", + "integrity": "sha512-2hQstc6I7T6tQsWzlboMh3SgMRPaS4H6H7cPQsJkdzTzEGqQrpLDsE2BGASU5sBPoEQyHzeqU6C8uKbFeEk6sg==" + }, + "@babel/types": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.4.tgz", + "integrity": "sha512-0f1HJFuGmmbrKTCZtbm3cU+b/AqdEYk5toj5iQur58xkVMlS0JWaKxTBSmCXd47uiN7vbcozAupm6Mvs80GNhw==", + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + }, + "@dfinity/agent": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@dfinity/agent/-/agent-0.10.0.tgz", + "integrity": "sha512-wRXZ54spejA6K74Gn5g0sdtf2nSi6B2gTpx+D/WxqQKDvZbtkp8AOT+zhH5o+UQILrchZgq40pCzOWpy2W01mQ==", + "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/auth-client": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@dfinity/auth-client/-/auth-client-0.10.0.tgz", + "integrity": "sha512-Po6TLXWOmytH7t9wuzeJ+FiM7rUmRGStCDAnbhpSAGstTtOh2HheTXIVgpwv3XFbUgkdOjpI3lNsG+G1kNm/1Q==" + }, + "@dfinity/candid": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@dfinity/candid/-/candid-0.10.0.tgz", + "integrity": "sha512-APU9Qefk6fhTVsKaltxDP1tlg5Gy41XlCMZWbDGHH7UTKJdmEEpylUWgSwn/AzMZCMWoF3PXt2kyq7OijVy01g==" + }, + "@dfinity/identity": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@dfinity/identity/-/identity-0.10.0.tgz", + "integrity": "sha512-0KUAcP/s5j/3q8uWXAFbE5dWuxf9xSack6OYkSa5LGGdJ/s3DCwrgb0bPzYEX2CeIqNUG3x8/YwUZrMNWBxvNQ==", + "requires": { + "borc": "^2.1.1", + "js-sha256": "^0.9.0", + "secp256k1": "^4.0.2", + "tweetnacl": "^1.0.1" + } + }, + "@dfinity/principal": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@dfinity/principal/-/principal-0.10.0.tgz", + "integrity": "sha512-SvlsLDLpqDQFqmTWttLWKR1D5XODmT7BmTN9QdEx+Q8x9Zxcm9K5EJevuXhe9bAAAorwgRK+vg5riF4+hW7fAw==" + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@trust/keyto": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/@trust/keyto/-/keyto-0.3.7.tgz", + "integrity": "sha512-t5kWWCTkPgg24JWVuCTPMx7l13F7YHdxBeJkT1vmoHjROgiOIEAN8eeY+iRmP1Hwsx+S7U55HyuqSsECr08a8A==", + "requires": { + "asn1.js": "^5.0.1", + "base64url": "^3.0.1", + "elliptic": "^6.4.1" + } + }, + "@trust/webcrypto": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@trust/webcrypto/-/webcrypto-0.9.2.tgz", + "integrity": "sha512-5iMAVcGYKhqLJGjefB1nzuQSqUJTru0nG4CytpBT/GGp1Piz/MVnj2jORdYf4JBYzggCIa8WZUr2rchP2Ngn/w==", + "requires": { + "@trust/keyto": "^0.3.4", + "base64url": "^3.0.0", + "elliptic": "^6.4.0", + "node-rsa": "^0.4.0", + "text-encoding": "^0.6.1" + } + }, + "@types/estree": { + "version": "0.0.48", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.48.tgz", + "integrity": "sha512-LfZwXoGUDo0C3me81HXgkBg5CTQYb6xzEl+fNmbO4JdRiSKQ8A0GD1OBBvKAIsbCUgoyAty7m99GqqMQe784ew==" + }, + "@types/throttle-debounce": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/throttle-debounce/-/throttle-debounce-2.1.0.tgz", + "integrity": "sha512-5eQEtSCoESnh2FsiLTxE121IiE60hnMqcb435fShf4bpLRjEu1Eoekht23y6zXS9Ts3l+Szu3TARnTsA0GkOkQ==", + "dev": true + }, + "@vitejs/plugin-vue": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-1.6.1.tgz", + "integrity": "sha512-tX2Ju8fOyEtfstfmwjfSJcstTFXwzdFAUbYJ5bWWifvKIgbe6B0FbM8l3Wb7wOaaxKn4FYkii7WQnAPcsTqaIA==" + }, + "@vue/compiler-core": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.9.tgz", + "integrity": "sha512-smi76K+pg1LeltWSLoOI9GqXdH1oK13sd+SrO/XTdyfvf2dOQn5zE0o+C4B4Wj9M8Jd66Z5dEfGEldvcOutixQ==", + "requires": { + "@babel/parser": "^7.15.0", + "@babel/types": "^7.15.0", + "@vue/shared": "3.2.9", + "estree-walker": "^2.0.2", + "source-map": "^0.6.1" + } + }, + "@vue/compiler-dom": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.9.tgz", + "integrity": "sha512-7GAMoCyBGMzMsbzxxFFCQMdblg10NRXkgFFhkjLJ4djItL0hyeO8t9wSLmaDaJejo1xjK8lm+4xPAUwvHuC8cA==", + "requires": { + "@vue/compiler-core": "3.2.9", + "@vue/shared": "3.2.9" + } + }, + "@vue/compiler-sfc": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.9.tgz", + "integrity": "sha512-egQCUOvb+3fz7sNx5F85ysPslbbtHiw0l2hOlqSGx5S7vQ8nzPvhxjy/VATYbd4lHZGQltA/3U090ncZu8M6hQ==", + "requires": { + "@babel/parser": "^7.15.0", + "@babel/types": "^7.15.0", + "@types/estree": "^0.0.48", + "@vue/compiler-core": "3.2.9", + "@vue/compiler-dom": "3.2.9", + "@vue/compiler-ssr": "3.2.9", + "@vue/ref-transform": "3.2.9", + "@vue/shared": "3.2.9", + "consolidate": "^0.16.0", + "estree-walker": "^2.0.2", + "hash-sum": "^2.0.0", + "lru-cache": "^5.1.1", + "magic-string": "^0.25.7", + "merge-source-map": "^1.1.0", + "postcss": "^8.1.10", + "postcss-modules": "^4.0.0", + "postcss-selector-parser": "^6.0.4", + "source-map": "^0.6.1" + } + }, + "@vue/compiler-ssr": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.9.tgz", + "integrity": "sha512-3QhSnpmMKvM67VQeUttDVy6+BeWlpo1mTqSnEl2x1bIEXNfZ6aIWeV42YmItXfiJ0j+JZI/29sDiEl3QLhAHow==", + "requires": { + "@vue/compiler-dom": "3.2.9", + "@vue/shared": "3.2.9" + } + }, + "@vue/reactivity": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.9.tgz", + "integrity": "sha512-V0me78KlETt/9u3S9BoViEZNCFr/fDWodLq/KqYbFj+YySnCDD0clmjgBSQvIM63D+z3iUXftJyv08vAjlWrvw==", + "requires": { + "@vue/shared": "3.2.9" + } + }, + "@vue/ref-transform": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/@vue/ref-transform/-/ref-transform-3.2.9.tgz", + "integrity": "sha512-sKNJZlVWW9s0+Xy8WVaGZTX8jVXvkY85ooDTv21ryAS0gzQ4PzHUvqQFQSgtZSbszU2/Qpi13u2h5oZBBYFm8g==", + "requires": { + "@babel/parser": "^7.15.0", + "@vue/compiler-core": "3.2.9", + "@vue/shared": "3.2.9", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7" + } + }, + "@vue/runtime-core": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.9.tgz", + "integrity": "sha512-CaSjy/kBrSFtSwyW2sY7RTN5YGmcDg8xLzKmFmIrkI9AXv/YjViQjSKUNHTAhnGq0K739vhFO4r3meBNEWqiOw==", + "requires": { + "@vue/reactivity": "3.2.9", + "@vue/shared": "3.2.9" + } + }, + "@vue/runtime-dom": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.9.tgz", + "integrity": "sha512-Vi8eOaP7/8NYSWIl8/klPtkiI+IQq/gPAI77U7PVoJ22tTcK/+9IIrMEN2TD+jUkHTRRIymMECEv+hWQT1Mo1g==", + "requires": { + "@vue/runtime-core": "3.2.9", + "@vue/shared": "3.2.9", + "csstype": "^2.6.8" + } + }, + "@vue/shared": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.9.tgz", + "integrity": "sha512-+CifxkLVhjKT14g/LMZil8//SdCzkMkS8VfRX0cqNJiFKK4AWvxj0KV1dhbr8czikY0DZUGQew3tRMRRChMGtA==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", + "dev": true + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" + }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "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==" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "base64url": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", + "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==" + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + }, + "bignumber.js": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", + "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==" + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "borc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/borc/-/borc-2.1.2.tgz", + "integrity": "sha512-Sy9eoUi4OiKzq7VovMn246iTo17kzuyHJKomCfpWMlI6RpfN1gk95w7d7gH264nApVLg0HZfcpz62/g4VH1Y4w==", + "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" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "cac": { + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.3.tgz", + "integrity": "sha512-ECVqVZh74qgSuZG9YOt2OJPI3wGcf+EwwuF/XIOYqZBD0KZYLtgPWqFPxmDPQ6joxI1nOlvVgRV6VT53Ooyocg==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "colorette": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.3.0.tgz", + "integrity": "sha512-ecORCqbSFP7Wm8Y6lyqMJjexBQqXSF7SSeaTyGGphogUjBlFP9m9o08wy86HL2uB7fMTxtOUzLMk7ogKcxMg1w==" + }, + "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==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "consolidate": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.16.0.tgz", + "integrity": "sha512-Nhl1wzCslqXYTJVDyJCu3ODohy9OfBMB5uD2BiBTzd7w+QY0lBzafkR8y8755yMYHAaMD4NuzbAw03/xzfw+eQ==", + "requires": { + "bluebird": "^3.7.2" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" + }, + "csstype": { + "version": "2.6.17", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.17.tgz", + "integrity": "sha512-u1wmTI1jJGzCJzWndZo8mk4wnPTZd1eOIYTYvuEyOQGfmDl3TrabCCfKnOC86FZwW/9djqTl933UF/cS425i9A==" + }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "delimit-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/delimit-stream/-/delimit-stream-0.1.0.tgz", + "integrity": "sha1-m4MZR3wOX4rrPONXrjBfwl6hzSs=" + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "requires": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" + }, + "esbuild": { + "version": "0.12.25", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.12.25.tgz", + "integrity": "sha512-woie0PosbRSoN8gQytrdCzUbS2ByKgO8nD1xCZkEup3D9q92miCze4PqEI9TZDYAuwn6CruEnQpJxgTRWdooAg==" + }, + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fastq": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.12.0.tgz", + "integrity": "sha512-VNX0QkHK3RsXVKr9KrlUv/FoTa0NdbYoHHl7uXHv2rzyHSlxjdNAKug2twd9luJxpcyNeAgf5iPPMutJO67Dfg==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "generic-names": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-2.0.1.tgz", + "integrity": "sha512-kPCHWa1m9wGG/OwQpeweTwM/PYiQLrUIxXbt/P4Nic3LbGjCP0YwrALHW1uNLKZ0LIMg+RF+XRlj2ekT9ZlZAQ==", + "requires": { + "loader-utils": "^1.1.0" + } + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "hash-sum": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz", + "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==" + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, + "icss-replace-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", + "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=" + }, + "icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==" + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + }, + "import-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz", + "integrity": "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==", + "dev": true, + "requires": { + "import-from": "^3.0.0" + } + }, + "import-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz", + "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.6.0.tgz", + "integrity": "sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ==", + "requires": { + "has": "^1.0.3" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "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==" + }, + "jiti": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.11.0.tgz", + "integrity": "sha512-/2c7e61hxxTIN34UeHBB0LCJ5Tq64kgJDV7GR+++e8XRxCKRIKmB8tH6ww1W+Z6Kgd6By+C3RSCu1lXjbPT68A==", + "dev": true + }, + "joycon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.0.1.tgz", + "integrity": "sha512-SJcJNBg32dGgxhPtM0wQqxqV0ax9k/9TaUskGDSJkSFSQOEWWvQ3zzWdGQRIUry2j1zA5+ReH13t0Mf3StuVZA==", + "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": "sha1-py8hfcSvxGKf/1/rME3BvVGi89I=", + "requires": { + "delimit-stream": "0.1.0" + } + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "lilconfig": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.3.tgz", + "integrity": "sha512-EHKqr/+ZvdKCifpNrJCKxBTgk5XupZA3y/aCPY9mxfgBzmgh93Mt/WqjjQ38oMxXuvDokaKiM3lAgvSH2sjtHg==", + "dev": true + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, + "magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, + "merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "requires": { + "source-map": "^0.6.1" + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "requires": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "nanoid": { + "version": "3.1.25", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz", + "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==" + }, + "node-addon-api": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" + }, + "node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" + }, + "node-gyp-build": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.2.3.tgz", + "integrity": "sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg==" + }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true + }, + "node-rsa": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/node-rsa/-/node-rsa-0.4.2.tgz", + "integrity": "sha1-1jkXKewWqDDtWjgEKzFX0tXXJTA=", + "requires": { + "asn1": "0.2.3" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true + }, + "pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "dev": true, + "requires": { + "node-modules-regexp": "^1.0.0" + } + }, + "postcss": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.6.tgz", + "integrity": "sha512-wG1cc/JhRgdqB6WHEuyLTedf3KIRuD0hG6ldkFEZNCjRxiC+3i6kkWUUbiJQayP28iwG35cEmAbe98585BYV0A==", + "requires": { + "colorette": "^1.2.2", + "nanoid": "^3.1.23", + "source-map-js": "^0.6.2" + } + }, + "postcss-load-config": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.0.tgz", + "integrity": "sha512-ipM8Ds01ZUophjDTQYSVP70slFSYg3T0/zyfII5vzhN6V57YSxMgG5syXuwi5VtS8wSf3iL30v0uBdoIVx4Q0g==", + "dev": true, + "requires": { + "import-cwd": "^3.0.0", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + } + }, + "postcss-modules": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/postcss-modules/-/postcss-modules-4.2.2.tgz", + "integrity": "sha512-/H08MGEmaalv/OU8j6bUKi/kZr2kqGF6huAW8m9UAgOLWtpFdhA14+gPBoymtqyv+D4MLsmqaF2zvIegdCxJXg==", + "requires": { + "generic-names": "^2.0.1", + "icss-replace-symbols": "^1.1.0", + "lodash.camelcase": "^4.3.0", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "string-hash": "^1.1.1" + } + }, + "postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==" + }, + "postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "requires": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "requires": { + "postcss-selector-parser": "^6.0.4" + } + }, + "postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "requires": { + "icss-utils": "^5.0.0" + } + }, + "postcss-selector-parser": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", + "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==" + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "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==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rollup": { + "version": "2.56.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.56.3.tgz", + "integrity": "sha512-Au92NuznFklgQCUcV96iXlxUbHuB1vQMaH76DHl5M11TotjOHwqk9CwcrT78+Tnv4FN9uTBxq6p4EJoYkpyekg==", + "requires": { + "fsevents": "~2.3.2" + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "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==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "secp256k1": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.2.tgz", + "integrity": "sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg==", + "requires": { + "elliptic": "^6.5.2", + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "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==" + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", + "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==" + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" + }, + "string-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", + "integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=" + }, + "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==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "sucrase": { + "version": "3.20.1", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.20.1.tgz", + "integrity": "sha512-BIG59HaJOxNct9Va6KvT5yzBA/rcMGetzvZyTx0ZdCcspIbpJTPS64zuAfYlJuOj+3WaI5JOdA+F0bJQQi8ZiQ==", + "dev": true, + "requires": { + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "dependencies": { + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true + } + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "text-encoding": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz", + "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=" + }, + "thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "requires": { + "any-promise": "^1.0.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", + "dev": true, + "requires": { + "thenify": ">= 3.1.0 < 4" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true + }, + "ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, + "tsup": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/tsup/-/tsup-4.14.0.tgz", + "integrity": "sha512-77rWdzhikTP9mQ34XMRzK83tw++LF6f4ox/HNERlgesB7g6g5VQ1iJlueG9O0P9HAZGVKavUwyoZv0+322p6rg==", + "dev": true, + "requires": { + "cac": "^6.7.2", + "chalk": "^4.1.0", + "chokidar": "^3.5.1", + "debug": "^4.3.1", + "esbuild": "^0.12.9", + "execa": "^5.0.0", + "globby": "^11.0.3", + "joycon": "^3.0.1", + "postcss-load-config": "^3.0.1", + "resolve-from": "^5.0.0", + "rollup": "^2.56.1", + "sucrase": "^3.18.1", + "tree-kill": "^1.2.2" + } + }, + "tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "vite": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-2.5.3.tgz", + "integrity": "sha512-1wMDnjflvtTTkMov8O/Xb5+w1/VW/Gw8oCf8f6dqgHn8lMOEqq0SaPtFEQeikFcOKCfSbiU0nEi0LDIx6DNsaQ==", + "requires": { + "esbuild": "^0.12.17", + "fsevents": "~2.3.2", + "postcss": "^8.3.6", + "resolve": "^1.20.0", + "rollup": "^2.38.5" + } + }, + "vite-plugin-windicss": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/vite-plugin-windicss/-/vite-plugin-windicss-1.4.1.tgz", + "integrity": "sha512-LLWipPvTexLSF0RRFhfNuPiCifKQsfLuyd3y7z27gSBtDPmHOOXwpfEWrAv9oUnMQzXfG93RJ1HVnjk1hUo77Q==", + "dev": true, + "requires": { + "@windicss/plugin-utils": "1.4.1", + "chalk": "^4.1.2", + "debug": "^4.3.2", + "windicss": "^3.1.7" + }, + "dependencies": { + "@windicss/config": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@windicss/config/-/config-1.4.1.tgz", + "integrity": "sha512-4jWG8sajwfV1pa+igFTwEcJgcrqHqcuxRI96IXIt6SuET3vSkwjP8X+4rBfns7QcR+Thxy6K/kBL0xvZNrJsPQ==", + "dev": true, + "requires": { + "debug": "^4.3.2", + "jiti": "^1.11.0", + "tsup": "^4.14.0", + "windicss": "^3.1.7" + } + }, + "@windicss/plugin-utils": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@windicss/plugin-utils/-/plugin-utils-1.4.1.tgz", + "integrity": "sha512-7gfGroXHH3iHxG6cUakvTjO9ZytxhxUsscc4P++p2Q0KGTh29NnlJci9AQpvO2h+b6+z8VqsDLv1/8ob6hd42g==", + "dev": true, + "requires": { + "@antfu/utils": "^0.2.4", + "@windicss/config": "1.4.1", + "debug": "^4.3.2", + "fast-glob": "^3.2.7", + "magic-string": "^0.25.7", + "micromatch": "^4.0.4", + "windicss": "^3.1.7" + } + } + } + }, + "vue": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.9.tgz", + "integrity": "sha512-mqRzh3Qp0Jg66foZz9F70e6xoe/mIjegyPKjC8gXBBfTP3gt4QxA3b8pXtKJRlXk894CteUIhkFnHU8xcobrXA==", + "requires": { + "@vue/compiler-dom": "3.2.9", + "@vue/runtime-dom": "3.2.9", + "@vue/shared": "3.2.9" + } + }, + "vue-analytics": { + "version": "5.22.1", + "resolved": "https://registry.npmjs.org/vue-analytics/-/vue-analytics-5.22.1.tgz", + "integrity": "sha512-HPKQMN7gfcUqS5SxoO0VxqLRRSPkG1H1FqglsHccz6BatBatNtm/Vyy8brApktZxNCfnAkrSVDpxg3/FNDeOgQ==" + }, + "vue-gtag-next": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/vue-gtag-next/-/vue-gtag-next-1.14.0.tgz", + "integrity": "sha512-iJl+cOG2GU5NuxqzSSIpt03WVOvZqyKB9TOy7d55KiuvRklcnb2nlqxW5B/a3/sbIt7fla+XEkRyMCcoz0zAHw==" + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "windicss": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/windicss/-/windicss-3.1.7.tgz", + "integrity": "sha512-Q/HQ9j+r2R0fdt85zAjccdo11kHWzQmpkuwIUQIO6PSypyDmBTfN14aAy4szLrpgo2woyuHM7Y+kir4IG4qnKQ==", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..a54efce --- /dev/null +++ b/package.json @@ -0,0 +1,33 @@ +{ + "name": "ic_loot", + "version": "1.0.0", + "description": "", + "author": "", + "scripts": { + "build": "vite build", + "dev": "vite", + "dfx:install": "dfx canister install --all --mode reinstall", + "dfx:rebuild": "dfx build && npm run dfx:install", + "dfx:setup": "dfx canister create --all && dfx build && npm run dfx:install" + }, + "main": "index.js", + "dependencies": { + "@dfinity/agent": "^0.10.0", + "@dfinity/auth-client": "^0.10.0-beta.1", + "@dfinity/candid": "^0.10.0", + "@dfinity/identity": "^0.10.0", + "@dfinity/principal": "^0.10.0", + "@trust/webcrypto": "^0.9.2", + "@vitejs/plugin-vue": "^1.6.1", + "@vue/compiler-sfc": "^3.2.9", + "node-fetch": "^2.3.0", + "vite": "^2.5.3", + "vue": "^3.0.5", + "vue-gtag-next": "^1.14.0" + }, + "devDependencies": { + "vite-plugin-windicss": "^1.4.1", + "windicss": "^3.1.7" + }, + "license": "ISC" +} diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..037fe5b Binary files /dev/null and b/public/favicon.ico differ diff --git a/public/ic_drip.png b/public/ic_drip.png new file mode 100644 index 0000000..71f6854 Binary files /dev/null and b/public/ic_drip.png differ diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..f2e9a70 --- /dev/null +++ b/readme.md @@ -0,0 +1,25 @@ +# IC LOOT + +An [Internet Computer](https://internetcomputer.org/) version of [Loot Project](https://www.lootproject.com/) + + +## Projects +---- +### [IC Drip](http://icdrip.io/) +IC Drip are randomly generated meta-commerce shopping carts for outfits +and personas stored on chain. Stats, images, and other functionality are +intentionally omitted for others to interpret. Feel free to use IC Drip in +any way you want. + + +## Getting Started + +1. Install + + ``` + npm i + dfx start + npm run dfx:setup + ``` + +2. [http://rrkah-fqaaa-aaaaa-aaaaq-cai.localhost:8000/?tokenId=100](http://rrkah-fqaaa-aaaaa-aaaaq-cai.localhost:8000/?tokenId=100) \ No newline at end of file diff --git a/src/ic_loot_assets/App.vue b/src/ic_loot_assets/App.vue new file mode 100644 index 0000000..3ae7e7a --- /dev/null +++ b/src/ic_loot_assets/App.vue @@ -0,0 +1,68 @@ + + + + + + + diff --git a/src/ic_loot_assets/main.js b/src/ic_loot_assets/main.js new file mode 100644 index 0000000..9a5584c --- /dev/null +++ b/src/ic_loot_assets/main.js @@ -0,0 +1,19 @@ +import { createApp } from "vue"; +import App from "./App.vue"; +import "virtual:windi.css"; +import VueGtag from "vue-gtag-next"; + +/** + * @dfinity/agent requires this. Can be removed once it's fixed + */ +window.global = window; + +const app = createApp(App); + +app.use(VueGtag, { + property: { + id: "G-KE88EVJHWW", + }, +}); + +app.mount("#app"); diff --git a/src/ic_loot_rs/Cargo.toml b/src/ic_loot_rs/Cargo.toml new file mode 100644 index 0000000..ca11896 --- /dev/null +++ b/src/ic_loot_rs/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "ic_loot_rs" +version = "0.1.0" +authors = ["Rick Porter "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[lib] +path = "lib.rs" +crate-type = ["cdylib"] + +[dependencies] +ic-types = "0.2.1" +ic-cdk = "0.2.4" +base64 = "0.13.0" +ic-cdk-macros = "0.3.0" +ic-certified-map = "0.1.0" +libflate = "1" +num-traits = "0.2.14" +serde = "1.0.116" +serde_cbor = "0.11" +serde_bytes = "0.11" +serde_with = "1.6.2" \ No newline at end of file diff --git a/src/ic_loot_rs/address.rs b/src/ic_loot_rs/address.rs new file mode 100644 index 0000000..d72853a --- /dev/null +++ b/src/ic_loot_rs/address.rs @@ -0,0 +1,102 @@ + + +use ic_cdk::export::{candid::{CandidType, Deserialize}, Principal}; +use std::collections::BTreeMap; + +#[derive(Clone, Debug, Default, CandidType, Deserialize)] +pub struct AddressBook { + pub total_supply: u64, + pub tokens: BTreeMap, + pub controllers: Vec, + pub claim_index: u64, + pub token_seeds: BTreeMap +} + + +impl AddressBook { + + pub fn user_tokens(&self, user: &Principal) -> Vec { + let mut results: Vec = Vec::new(); + for (token_id, user_id) in &self.tokens { + if user_id == user { + results.push(*token_id); + } + } + return results; + } + + pub fn owner_of(&self, token_id: &u64) -> Option { + match self.tokens.get(token_id) { + Some(owner_id) => return Some(owner_id.clone()), + None => { + return None; + } + } + } + + pub fn is_owner_of(&self, user: Principal, token_id: &u64) -> bool { + match self.owner_of(&token_id) { + Some(owner_id) => return user == owner_id, + None => { + return false; + } + } + } + + pub fn is_controller(&self, user: &Principal) -> bool { + return self.controllers.contains(user); + } + + pub fn add_controller(&mut self, user: &Principal) -> bool { + if !self.is_controller(user) { + self.controllers.push(user.clone()); + return true; + } + return false; + } + + pub fn remove_controller(&mut self, user: &Principal) -> bool { + if self.is_controller(user) { + let index = self.controllers.iter().position(|x| x == user).unwrap(); + self.controllers.remove(index); + return true; + } + return false; + } + + pub fn transfer_to(&mut self, user: Principal, token_id: u64) -> bool { + if let Some(token_owner) = self.tokens.get(&token_id) { + if token_owner == &ic_cdk::caller() { + self.tokens.insert(token_id, user); + return true; + } + } + return false; + } + + pub fn remaining(&self) -> u64 { + return self.total_supply - self.claim_index; + } + + pub fn is_claimed(&self, token_id: &u64) -> bool { + return self.tokens.contains_key(token_id); + } + + pub fn claim(&mut self, user_id: Principal) -> Result { + + if self.claim_index > self.total_supply { + return Err("No more claims left".to_string()); + } + + self.claim_index += 1; + + match self.tokens.get(&self.claim_index) { + Some(_) => return Err("Already claimed".to_string()), + None => { + self.token_seeds.insert(self.claim_index, ic_cdk::api::time() as u64); + self.tokens.insert(self.claim_index, user_id); + return Ok(self.claim_index); + } + } + } +} \ No newline at end of file diff --git a/src/ic_loot_rs/ic_loot.did b/src/ic_loot_rs/ic_loot.did new file mode 100644 index 0000000..ad124f7 --- /dev/null +++ b/src/ic_loot_rs/ic_loot.did @@ -0,0 +1,49 @@ +type HeaderField = record { text; text; }; + +type HttpRequest = record { + method: text; + url: text; + headers: vec HeaderField; + body: blob; +}; + +type HttpResponse = record { + status_code: nat16; + headers: vec HeaderField; + body: blob; +}; + +type AddressBook = record { + total_supply: nat64; + tokens: vec record { nat64; principal}; + controllers: vec principal; + claim_index: nat64; + token_seeds: vec record { nat64; nat64}; +}; + +type ClaimResult = variant { + Ok : nat64; + Err: text; +}; + +service : { + http_request: (request: HttpRequest) -> (HttpResponse) query; + + get_address_book: () -> (AddressBook) query; + get_token_properties: (nat64) -> (vec record { text; text}) query; + + get_airdrops: () -> (vec record { nat64; bool }) query; + add_airdrops: (vec principal) -> (bool); + name: () -> (text) query; + symbol: () -> (text) query; + user_tokens: (principal) -> (vec nat64) query; + owner_of: (nat64) -> (opt principal) query; + transfer_to: (principal, nat64) -> (bool); + claim: () -> (ClaimResult); + remaining: () -> (nat64); + supply: () -> (nat64); + + get_controllers: () -> (vec principal) query; + add_controller: (principal) -> (bool); + remove_controller: (principal) -> (bool); +} diff --git a/src/ic_loot_rs/lib.rs b/src/ic_loot_rs/lib.rs new file mode 100644 index 0000000..d2e664f --- /dev/null +++ b/src/ic_loot_rs/lib.rs @@ -0,0 +1,724 @@ +use ic_cdk::export::{candid::{CandidType, Deserialize}, Principal}; +use ic_cdk::storage; +use ic_cdk_macros::*; +use serde_bytes::{ByteBuf}; +use std::collections::BTreeMap; + +mod loot; +mod rand; +mod address; + +use crate::address::AddressBook; +use crate::loot::Loot; + + +#[init] +fn init() { + ic_cdk::println!("Init {:?}", ic_cdk::api::time()); + + let address_book = storage::get_mut::(); + address_book.total_supply = 8000; + + //needs to be a way to pass this into init + let owner_id = Principal::from_text( + "2c22g-lboam-nseoa-i5al6-o7k6f-o2fwz-huoua-be63r-oi3k2-wy7uq-zae" + ).unwrap(); + address_book.add_controller(&owner_id); + + init_loot(); +} + +fn init_loot() -> () { + + let loot = storage::get_mut::(); + + loot.weapons = vec![ + "Cellphone", + "Laptop", + "Purse", + "Cat", + "Golf Club", + "Spoon", + "Beggar Cup", + "Wine Glass", + "Fidget Spinner", + "Massager", + "Beer Mug", + "TV Controller", + "Pillow", + "Blanket", + "Wand", + "Waifu Pillow", + "Microphone", + "Guitar", + "Trumpet", + "Banjo", + "Cane", + "Yo-yo", + "Tennis Racket", + "Record Player", + "Video Game Console", + "Umbrella", + "Surf Board", + "Whip", + "Scissors", + "Key", + "Pen", + "Paintbrush", + "Megaphone", + "Dog Leash", + "Book", + "Pocket Watch", + "Wrench", + ].iter().map(|s| s.to_string()).collect(); + + loot.chest = vec![ + "Robe", + "Shirt", + "Hoodie", + "Fishnet Shirt", + "Plastic Shirt", + "Polyester Shirt", + "Hawaiian Shirt", + "Polo Shirt", + "Ring Mail", + "Blazer", + "Vest", + "Tank Top", + "Button Up", + "Bowling Shirt", + "Shawl", + "Cardigan", + "Wind Breaker", + "Rain Coat", + "Sports Bra", + "Graphic Tee", + "Body Paint", + "Tunic", + "Corset", + "Sweater", + "Crop Top", + "Cardigan", + "Safari Jacket", + "Bandeau Top", + "Bra", + "Bikini Top", + "Dress", + "Puffer Jacket", + "Dinner Jacket", + "Smoking Jacket", + "Waist Coat", + "Tailcoat", + "Tuxedo Jacket", + "Parka", + "Overcoat", + "Turtle Neck", + "Bomber Jacket", + "Trench Coat", + "Cape", + "Kimono", + ].iter().map(|s| s.to_string()).collect(); + + loot.head = vec![ + "Fedora", + "Sombrero", + "Sun Hat", + "Viking Helm", + "Silk Hood", + "Hood", + "Top Hat", + "Bucket Hat", + "Baseball Cap", + "Beret", + "Doo Rag", + "Cowboy", + "Flat Cap", + "Porkpie Hat", + "Panama Hat", + "Sailors Bonet", + "Beanie", + "Headband", + "Captain Hat", + "Equestrian Helm", + "Visor", + "Turban", + "Wedding Veil", + "Feather Hat", + "Propeller Hat", + "Cat Ears", + "Headphones", + "Helmet", + "Wizard Hat", + "Safari Hat", + "Pith Helmet", + "Tiara", + "Flower Crown", + "Crown", + "Bandana", + "Umbrella Hat", + "Motorcycle Helmet", + "Peaked Cap", + "Golf Visor", + "Bowler Hat", + "Bow Hat", + "Dunce Cap", + "Towel", + "Jewelry Headpiece", + "Cheese Head", + "Yarmulke", + "Bald Cap", + "Coonskin Cap", + "Balaclava", + "Bonnet", + "Fez", + "Space Helmet", + ].iter().map(|s| s.to_string()).collect(); + + loot.waist = vec![ + "Fanny Pack", + "Fish Belt", + "Studded Belt", + "Belt", + "Leather Belt", + "Chrome Belt", + "Platinum Belt", + "Belt", + "Bat Belt", + "Shoelace Belt", + "Suspenders", + "Rope", + "Jeweled Belt", + ].iter().map(|s| s.to_string()).collect(); + + loot.foot = vec![ + "Slippers", + "Hightops", + "Boat shoes", + "Studded Boots", + "Leather Boots", + "Linen Shoes", + "Shoes", + "Dress Shoe", + "Ballet Shoe", + "Riding Boots", + "Slides", + "Roller Skates", + "Ice Skates", + "Socks", + "Flip Flops", + "Platform Boots", + "Stilletos", + "Pumps", + "Sandals", + "Sneakers", + "Cowboy Boots", + "Snow Boots", + "Ski Boots", + "Fins", + "High Heel Sandals", + "Jeweled Sandals", + "Wedge", + "Rain Boots", + "Cleats", + "Brogues", + "Derby Shoes", + "Moccasins", + "Espadrilles", + "Loafers", + ].iter().map(|s| s.to_string()).collect(); + + loot.underwear = vec![ + "Thong", + "Boxers", + "Boxer Briefs", + "Panties", + "Jockstrap", + "Tighty-whities", + "Trunks", + "Bikini", + "Midway Briefs", + "Boy Shorts", + "String Bikini", + "G-String", + "Granny Panties", + "Diaper", + "Garter", + ].iter().map(|s| s.to_string()).collect(); + + loot.accessory = vec![ + "Necklace", + "Amulet", + "Pendant", + "Chain", + "Choker", + "Cross Necklace", + "Ear Buds", + "Hoops", + "Neck Tie", + "Bow Tie", + "Exclusive Pass", + "Scarf", + "Feather Boa", + "Neck Pillow", + "Ascot", + "Hope Diamond", + "Snake", + "Stethoscope", + "Shades", + "Heart Glasses", + "Nerd Glasses", + "Goggles", + "Ski Goggle", + "Contact Lenses", + "Monocle", + "Green Contacts", + "3D Glasses", + "Sunglasses", + "Blindfold", + "VR Goggles", + "Cyclops Glasses", + "Aviator Sunglasses", + "Spectacles", + "Purse", + "Backpack", + "Tote Bag", + "Grocery Bag", + "Briefcase", + "Suitcase", + "Messenger Bag", + "Wallet", + "Crossbody Bag", + "Hat Bag", + "Golf Bag", + "Portfolio Bag", + "Tackle Box", + "Tennis Bag", + "Steamer Trunk", + "Tool Box", + "Guitar Case", + "Watch", + "Smart Watch", + "Casio Watch", + "Atomic Watch", + "Festival Wristband", + "Engagement Ring", + "Antique Watch", + "Wristband", + "Scrunchie", + "Bracelet", + "Kandi Bracelet", + ].iter().map(|s| s.to_string()).collect(); + + loot.pants = vec![ + "Shorts", + "Skirt", + "Jeans", + "Skort", + "Sweat Pants", + "Yoga Pants", + "Kilt", + "Track Pants", + "Cargo Shorts", + "Skinny Jeans", + "Cargo Pants", + "Riding Pants", + "Cutoff Pants", + "Baggy Pants", + "Tights", + "Dress Pants", + "Bell Bottoms", + "Karate Pants", + "Miniskirt", + "Tennis Skirt", + "Chaps", + "Leggings", + "Crop Pants", + "Trousers", + "Hot Pants", + "Swim Trunks", + "Capri Pants", + ].iter().map(|s| s.to_string()).collect(); + + loot.prefixes = vec![ + "Second Hand", + "Aged", + "Worn Out", + "Brand New", + "Used", + "Old", + "2yr Old", + "5yr Old", + "3yr Old", + "2021", + "1980s", + "1990s", + "1970s", + "1960s", + "1950s", + "1920s", + "1800s", + "Medieval", + "Futuristic", + "Vintage", + "Retro", + "Victorian", + ].iter().map(|s| s.to_string()).collect(); + + loot.name_prefixes = vec![ + "Gold", + "Shiny", + "Psychedelic", + "Blazing", + "Cheetah Print", + "Leopard Print", + "Rainbow", + "Camo", + "Neon", + "Flashing", + "Hot Pink", + "Checkered", + "Pinstripe", + "Icy", + "Silver", + "Tie Dye", + "Steampunk", + "Sparkly", + "Plaid", + "Anime", + "Colorful", + "Floral", + "8 Bit", + "Blood Red", + "Icy Blue", + "Forest Green", + "Bright Yellow", + "Mystic Purple", + "Night Black", + "Cloud White", + "Glittery", + "Goth", + "Emo", + "Punk", + "Preppy", + "Electric Swirl", + "Fruit Print", + "Paisley", + "Crunchy", + "Aesthetic", + "Boho", + "Military", + "Velour", + ].iter().map(|s| s.to_string()).collect(); + + loot.name_suffixes = vec![ + "Dirty", + "Clean", + "Designer", + "Synthetic", + "Wet", + "Alien", + "Organic", + "Vegan", + "Kawaii", + "Badass", + "Cute", + "Sexy", + "Beautiful", + "Ugly", + "Fire", + "Cruelty Free", + "Collectors Edition", + "Limited Edition", + "Drippin", + "Stylin", + "Custom", + "Imaginary", + "Knockoff", + "Fake", + "Signed", + "Cheap", + "Expensive", + "Hip", + "Chic", + "Trendy", + "Casual", + "Formal", + "Monogramed", + "Haute Couture", + ].iter().map(|s| s.to_string()).collect(); +} + +#[query] +fn user_tokens(user: Principal) -> Vec { + return storage::get::().user_tokens(&user); +} + +#[query] +fn supply() -> u64 { + return storage::get::().total_supply; +} + +#[query] +fn remaining() -> u64 { + return storage::get::().remaining(); +} + +#[query] +fn owner_of(token_id: u64) -> Option { + return storage::get::().owner_of(&token_id); +} + +#[update] +fn transfer_to(user: Principal, token_id: u64) -> bool { + return storage::get_mut::().transfer_to(user, token_id); +} + +#[update] +fn claim() -> Result { + return Err("No claims for this NFT type (IC DRIP)".to_string()); + //return storage::get_mut::().claim(ic_cdk::caller()); +} + +//Allow the original airdrop to always exists for future references +//where sites can use this to know if the person transferred their NFT or not. +#[query] +fn get_airdrops() -> Vec<(u64, bool)> { + let airdroppers = storage::get_mut::>>(); + let address_book = storage::get_mut::(); + match airdroppers.get(&ic_cdk::caller()) { + Some(tokens) => { + let mut results: Vec<(u64, bool)> = Vec::new(); + for token in tokens { + results.push(( + token.clone(), + address_book.is_owner_of(ic_cdk::caller(), token) + )); + } + return results; + }, + None => Vec::new() + } +} + +//Save list of airdrops for other platforms to use. +fn update_airdroppers(user: Principal, token_id: u64) -> () { + let airdroppers = storage::get_mut::>>(); + match airdroppers.get_mut(&user) { + Some(tokens) => tokens.push(token_id), + None => { + airdroppers.insert(user, vec![token_id]); + } + } +} + +#[update(guard = "is_controller")] +fn add_airdrops(users: Vec) -> bool { + let address_book = storage::get_mut::(); + for id in users { + match address_book.claim(id) { + Ok(token_id) => update_airdroppers(id, token_id), + Err(_) => return false + } + } + return true; +} + +#[update(guard = "is_controller")] +fn add_controller(user: Principal) -> bool { + return storage::get_mut::().add_controller(&user); +} + +#[update(guard = "is_controller")] +fn remove_controller(user: Principal) -> bool { + return storage::get_mut::().remove_controller(&user); +} + +#[update(guard = "is_controller")] +fn get_controllers() -> Vec { + return storage::get::().controllers.clone(); +} + +#[query] +fn name() -> String { + return "IC_DRIP".to_string(); +} + +#[query] +fn symbol() -> String { + return "IC_DRIP".to_string(); +} + +#[query] +fn get_address_book() -> AddressBook { + return storage::get::().clone(); +} + +type HeaderField = (String, String); + +#[derive(Clone, Debug, CandidType, Deserialize)] +struct HttpRequest { + method: String, + url: String, + headers: Vec<(String, String)>, + body: ByteBuf, +} + +#[derive(Clone, Debug, CandidType, Deserialize)] +struct HttpResponse { + status_code: u16, + headers: Vec, + body: Vec, +} + + +#[query] +async fn http_request(req: HttpRequest) -> HttpResponse { + + let parts: Vec<&str> = req.url.split('?').collect(); + + let token_param: Vec<&str> = parts[1].split('=').collect(); + let token_id = token_param[1].parse::().unwrap(); + + let address_book = storage::get_mut::(); + + if token_id <= 0 || token_id > address_book.total_supply || !address_book.is_claimed(&token_id) { + return HttpResponse { + status_code: 404, + headers: Vec::new(), + body: Vec::new(), + } + } + + let loot = storage::get_mut::(); + + let seed = address_book.token_seeds.get(&token_id).unwrap(); + + let data = loot.generate(token_id.clone() + seed.clone()); + + let results = data.as_bytes(); + + let mut headers: Vec = Vec::new(); + headers.push(("content-type".to_string(), "image/svg+xml".to_string())); + headers.push(("cache-control".to_string(), "public, max-age=604800, immutable".to_string())); + return HttpResponse { + status_code: 200, + headers, + body: results.to_vec(), + } +} + +#[query] +fn get_token_properties(token_id: u64) -> Vec<(String, String)> { + + let address_book = storage::get_mut::(); + if token_id <= 0 || token_id > address_book.total_supply || !address_book.is_claimed(&token_id) { + return Vec::new(); + } + + let loot = storage::get_mut::(); + return loot.get_properties(token_id); +} + + +//this is not working correctly. +#[query(name = "__get_candid_interface_tmp_hack")] +fn export_candid() -> String { + return r#" +type HeaderField = record { text; text; }; + +type HttpRequest = record { + method: text; + url: text; + headers: vec HeaderField; + body: blob; +}; + +type HttpResponse = record { + status_code: nat16; + headers: vec HeaderField; + body: blob; +}; + +type AddressBook = record { + total_supply: nat64; + tokens: vec record { nat64; principal}; + controllers: vec principal; + claim_index: nat64; + token_seeds: vec record { nat64; nat64}; +}; + +type ClaimResult = variant { + Ok : nat64; + Err: text; +}; + +service : { + http_request: (request: HttpRequest) -> (HttpResponse) query; + + get_address_book: () -> (AddressBook) query; + get_token_properties: (nat64) -> (vec record { text; text}) query; + + get_airdrops: () -> (vec record { nat64; bool }) query; + add_airdrops: (vec principal) -> (bool); + name: () -> (text) query; + symbol: () -> (text) query; + user_tokens: (principal) -> (vec nat64) query; + owner_of: (nat64) -> (opt principal) query; + transfer_to: (principal, nat64) -> (bool); + claim: () -> (ClaimResult); + remaining: () -> (nat64); + + get_controllers: () -> (vec principal) query; + add_controller: (principal) -> (bool); + remove_controller: (principal) -> (bool); + supply: () -> (nat64); +} + "#.to_string(); +} + +#[derive(CandidType, Deserialize)] +struct StableStorage { + address_book: AddressBook, + airdroppers: BTreeMap> +} + + +#[pre_upgrade] +fn pre_upgrade() { + + let stable = StableStorage { + address_book: storage::get::().clone(), + airdroppers: storage::get::>>().clone(), + }; + + match storage::stable_save((stable,)) { + Ok(_) => (), + Err(candid_err) => { + ic_cdk::trap(&format!( + "An error occurred when saving to stable memory (pre_upgrade): {}", + candid_err + )); + } + }; +} + +#[post_upgrade] +fn post_upgrade() { + init(); + if let Ok((storage,)) = storage::stable_restore::<(StableStorage,)>() { + + let address_book = storage::get_mut::(); + *address_book = storage.address_book; + + let airdroppers = storage::get_mut::>>(); + *airdroppers = storage.airdroppers; + } +} + +fn is_controller() -> Result<(), String> { + if storage::get::().is_controller(&ic_cdk::caller()) { + Ok(()) + } else { + Err("Only the controller can call this method.".to_string()) + } +} diff --git a/src/ic_loot_rs/loot.rs b/src/ic_loot_rs/loot.rs new file mode 100644 index 0000000..82c2f5f --- /dev/null +++ b/src/ic_loot_rs/loot.rs @@ -0,0 +1,146 @@ + +use ic_cdk::export::{candid::{CandidType, Deserialize}}; +use crate::rand::Rand; + + +#[derive(Clone, Debug, Default, CandidType, Deserialize)] +pub struct Loot { + pub weapons: Vec, + pub chest: Vec, + pub head: Vec, + pub waist: Vec, + pub foot: Vec, + pub underwear: Vec, + pub accessory: Vec, + pub pants: Vec, + + pub prefixes: Vec, + pub suffixes: Vec, + pub name_prefixes: Vec, + pub name_suffixes: Vec, +} + +impl Loot { + + pub fn get_weapon(&self, token_id: u64) -> String { + self.compute(&self.weapons, 1, token_id) + } + + pub fn get_chest(&self, token_id: u64) -> String { + self.compute(&self.chest, 222, token_id) + } + + pub fn get_head(&self, token_id: u64) -> String { + self.compute(&self.head, 333, token_id) + } + + pub fn get_waist(&self, token_id: u64) -> String { + self.compute(&self.waist, 4444, token_id) + } + + pub fn get_foot(&self, token_id: u64) -> String { + self.compute(&self.foot, 55555, token_id) + } + + pub fn get_underwear(&self, token_id: u64) -> String { + self.compute(&self.underwear, 666666, token_id) + } + + pub fn get_accessory(&self, token_id: u64) -> String { + self.compute(&self.accessory, 7777777, token_id) + } + + pub fn get_pants(&self, token_id: u64) -> String { + self.compute(&self.pants, 88888888, token_id) + } + + pub fn get_prefix(&self, rand: u64) -> String { + return self.prefixes[rand as usize % &self.prefixes.len()].clone(); + } + + pub fn get_name_prefix(&self, rand: u64) -> String { + return self.name_prefixes[rand as usize % &self.name_prefixes.len()].clone(); + } + + pub fn get_name_suffix(&self, rand: u64) -> String { + return self.name_suffixes[rand as usize % &self.name_suffixes.len()].clone(); + } + + pub fn compute(&self, items: &Vec, offset: u64, token_id: u64) -> String { + let rand = Rand::new(token_id + offset).rand(); + let item_index = rand as usize % items.len(); + + let mut output = items[item_index].clone(); + + let greatness = rand % 21; + + if greatness > 14 { + output = format!("{} {}",self.get_prefix(rand), output); + } + if greatness > 19 { + if greatness == 19 { + output = format!("\"{}\" {} ({})", self.get_name_prefix(rand), self.get_name_suffix(rand), output); + } else { + output = format!("\"{}\" {} ({}) 🔥", self.get_name_prefix(rand), output, self.get_name_suffix(rand)); + } + } + return output; + } + + pub fn get_properties(&self, token_id: u64) -> Vec<(String, String)> { + return vec![ + ("hand".to_string(), self.get_weapon(token_id)), + ("shirt".to_string(), self.get_chest(token_id)), + ("head".to_string(), self.get_head(token_id)), + ("waist".to_string(), self.get_waist(token_id)), + ("foot".to_string(), self.get_foot(token_id)), + ("pants".to_string(), self.get_pants(token_id)), + ("underwear".to_string(), self.get_underwear(token_id)), + ("accessory".to_string(), self.get_accessory(token_id)), + ] + } + + pub fn generate(&self, token_id: u64) -> String { + return format!(r#" + + + + + {} + + + {} + + + {} + + + {} + + + {} + + + {} + + + {} + + + {} + + + "#, + self.get_weapon(token_id), + self.get_chest(token_id), + self.get_head(token_id), + self.get_waist(token_id), + self.get_foot(token_id), + self.get_underwear(token_id), + self.get_accessory(token_id), + self.get_pants(token_id), + ); + } +} \ No newline at end of file diff --git a/src/ic_loot_rs/rand.rs b/src/ic_loot_rs/rand.rs new file mode 100644 index 0000000..54d0629 --- /dev/null +++ b/src/ic_loot_rs/rand.rs @@ -0,0 +1,32 @@ +const KX: u64 = 123456789; +const KY: u64 = 362436069; +const KZ: u64 = 521288629; +const KW: u64 = 88675123; + +pub struct Rand { + x: u64, + y: u64, + z: u64, + w: u64, +} + +impl Rand { + pub fn new(seed: u64) -> Rand { + Rand { + x: KX ^ seed, + y: KY ^ seed, + z: KZ, + w: KW, + } + } + + // Xorshift 128, taken from German Wikipedia + pub fn rand(&mut self) -> u64 { + let t = self.x ^ self.x.wrapping_shl(11); + self.x = self.y; + self.y = self.z; + self.z = self.w; + self.w ^= self.w.wrapping_shr(19) ^ t ^ t.wrapping_shr(8); + return self.w; + } +} \ No newline at end of file diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000..fe3119e --- /dev/null +++ b/vite.config.js @@ -0,0 +1,77 @@ +import { defineConfig } from "vite"; +import vue from "@vitejs/plugin-vue"; +import path from "path"; +import dfxJson from "./dfx.json"; +import WindiCSS from 'vite-plugin-windicss' + +let localCanisters, prodCanisters, canisters; + +function initCanisterIds() { + try { + localCanisters = require(path.resolve( + ".dfx", + "local", + "canister_ids.json" + )); + } catch (error) { + console.log("No local canister_ids.json found. Continuing production"); + } + try { + prodCanisters = require(path.resolve("canister_ids.json")); + } catch (error) { + console.log("No production canister_ids.json found. Continuing with local"); + } + + const network = process.env.DFX_NETWORK || "local"; + + canisters = network === "local" ? localCanisters : prodCanisters; + + for (const canister in canisters) { + process.env["VITE_APP_" + canister.toUpperCase() + "_CANISTER_ID"] = + canisters[canister][network]; + } +} +initCanisterIds(); + +// List of all aliases for canisters +const aliases = Object.entries(dfxJson.canisters).reduce( + (acc, [name, _value]) => { + // Get the network name, or `local` by default. + const networkName = process.env["DFX_NETWORK"] || "local"; + const outputRoot = path.join( + __dirname, + ".dfx", + networkName, + "canisters", + name + ); + + return { + ...acc, + ["dfx-generated/" + name]: path.join(outputRoot, name + ".did.js"), + }; + }, + {} +); + +//https://vitejs.dev/config/ +export default defineConfig({ + plugins: [vue(), WindiCSS()], + resolve: { + alias: { + ...aliases, + }, + }, + define: { + "process.env": process.env, + }, + server: { + proxy: { + "/api": { + target: "http://localhost:8000", + changeOrigin: true, + rewrite: (path) => path.replace(/^\/api/, "/api"), + }, + }, + }, +});