diff --git a/airdrop/frontend/.gitattributes b/airdrop/frontend/.gitattributes
new file mode 100644
index 00000000..156f0507
--- /dev/null
+++ b/airdrop/frontend/.gitattributes
@@ -0,0 +1,4 @@
+* text=auto eol=lf
+*.[cC][mM][dD] text eol=crlf
+*.[bB][aA][tT] text eol=crlf
+*.[pP][sS]1 text eol=crlf
\ No newline at end of file
diff --git a/airdrop/frontend/.gitignore b/airdrop/frontend/.gitignore
new file mode 100644
index 00000000..6849a44a
--- /dev/null
+++ b/airdrop/frontend/.gitignore
@@ -0,0 +1,32 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
+
+# generated files
+
+build
+coverage
+__snapshots__
+*.test.ts.snap
+analyse.html
diff --git a/airdrop/frontend/.prettierrc b/airdrop/frontend/.prettierrc
new file mode 100644
index 00000000..1f9e19f7
--- /dev/null
+++ b/airdrop/frontend/.prettierrc
@@ -0,0 +1,23 @@
+{
+ "semi": true,
+ "trailingComma": "all",
+ "singleQuote": true,
+ "jsxSingleQuote": true,
+ "useTabs": true,
+ "printWidth": 80,
+ "tabWidth": 4,
+ "singleAttributePerLine": true,
+ "arrowParens": "always",
+ "endOfLine": "crlf",
+ "overrides": [
+ {
+ "files": "*.json",
+ "options": {
+ "semi": false,
+ "singleAttributePerLine": false,
+ "trailingComma": "all",
+ "bracketSameLine": true
+ }
+ }
+ ]
+}
diff --git a/airdrop/frontend/docs/ccd-explorer-page.png b/airdrop/frontend/docs/ccd-explorer-page.png
new file mode 100644
index 00000000..f1b2ba85
Binary files /dev/null and b/airdrop/frontend/docs/ccd-explorer-page.png differ
diff --git a/airdrop/frontend/docs/ccd-transaction-init.png b/airdrop/frontend/docs/ccd-transaction-init.png
new file mode 100644
index 00000000..fc761caa
Binary files /dev/null and b/airdrop/frontend/docs/ccd-transaction-init.png differ
diff --git a/airdrop/frontend/docs/claim-page-error.png b/airdrop/frontend/docs/claim-page-error.png
new file mode 100644
index 00000000..2513966b
Binary files /dev/null and b/airdrop/frontend/docs/claim-page-error.png differ
diff --git a/airdrop/frontend/docs/claim-page-success.png b/airdrop/frontend/docs/claim-page-success.png
new file mode 100644
index 00000000..38fe527d
Binary files /dev/null and b/airdrop/frontend/docs/claim-page-success.png differ
diff --git a/airdrop/frontend/docs/claim-page.png b/airdrop/frontend/docs/claim-page.png
new file mode 100644
index 00000000..e707d92b
Binary files /dev/null and b/airdrop/frontend/docs/claim-page.png differ
diff --git a/airdrop/frontend/docs/create-page-metadata.png b/airdrop/frontend/docs/create-page-metadata.png
new file mode 100644
index 00000000..61e7750f
Binary files /dev/null and b/airdrop/frontend/docs/create-page-metadata.png differ
diff --git a/airdrop/frontend/docs/create-page-success.png b/airdrop/frontend/docs/create-page-success.png
new file mode 100644
index 00000000..3330663f
Binary files /dev/null and b/airdrop/frontend/docs/create-page-success.png differ
diff --git a/airdrop/frontend/docs/create-page.png b/airdrop/frontend/docs/create-page.png
new file mode 100644
index 00000000..52f8f515
Binary files /dev/null and b/airdrop/frontend/docs/create-page.png differ
diff --git a/airdrop/frontend/docs/find-page.png b/airdrop/frontend/docs/find-page.png
new file mode 100644
index 00000000..ac6883ef
Binary files /dev/null and b/airdrop/frontend/docs/find-page.png differ
diff --git a/airdrop/frontend/docs/home-page.png b/airdrop/frontend/docs/home-page.png
new file mode 100644
index 00000000..f20674ed
Binary files /dev/null and b/airdrop/frontend/docs/home-page.png differ
diff --git a/airdrop/frontend/docs/settings-page.png b/airdrop/frontend/docs/settings-page.png
new file mode 100644
index 00000000..37c1a985
Binary files /dev/null and b/airdrop/frontend/docs/settings-page.png differ
diff --git a/airdrop/frontend/docs/transactions-page-claim.png b/airdrop/frontend/docs/transactions-page-claim.png
new file mode 100644
index 00000000..66f73b10
Binary files /dev/null and b/airdrop/frontend/docs/transactions-page-claim.png differ
diff --git a/airdrop/frontend/docs/transactions-page-init.png b/airdrop/frontend/docs/transactions-page-init.png
new file mode 100644
index 00000000..de5d6b12
Binary files /dev/null and b/airdrop/frontend/docs/transactions-page-init.png differ
diff --git a/airdrop/frontend/index.html b/airdrop/frontend/index.html
new file mode 100644
index 00000000..cb89be8f
--- /dev/null
+++ b/airdrop/frontend/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Airdrop
+
+
+
+
+
+
diff --git a/airdrop/frontend/package-lock.json b/airdrop/frontend/package-lock.json
new file mode 100644
index 00000000..ec4b9c0c
--- /dev/null
+++ b/airdrop/frontend/package-lock.json
@@ -0,0 +1,7843 @@
+{
+ "name": "rc-airdop",
+ "version": "1.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "rc-airdop",
+ "version": "1.0.0",
+ "dependencies": {
+ "@concordium/react-components": "^0.3.0",
+ "@heroicons/react": "^2.0.18",
+ "@types/crypto-js": "^4.1.1",
+ "axios": "^1.4.0",
+ "classnames": "^2.3.2",
+ "ipfs-http-client": "^60.0.1",
+ "merkletreejs": "^0.3.10",
+ "moment": "^2.29.4",
+ "prettier": "^2.8.8",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
+ "react-hook-form": "^7.44.1",
+ "react-router-dom": "^6.11.2",
+ "vite-plugin-wasm": "^3.2.2",
+ "zustand": "^4.3.8"
+ },
+ "devDependencies": {
+ "@types/react": "^18.0.28",
+ "@types/react-dom": "^18.0.11",
+ "@typescript-eslint/eslint-plugin": "^5.57.1",
+ "@typescript-eslint/parser": "^5.57.1",
+ "@vitejs/plugin-react": "^4.0.0",
+ "@vitest/coverage-c8": "^0.31.1",
+ "@vitest/coverage-istanbul": "^0.31.1",
+ "autoprefixer": "^10.4.14",
+ "eslint": "^8.38.0",
+ "eslint-plugin-react-hooks": "^4.6.0",
+ "eslint-plugin-react-refresh": "^0.3.4",
+ "postcss": "^8.4.23",
+ "tailwindcss": "^3.3.2",
+ "typescript": "^5.0.2",
+ "vite": "^4.3.9",
+ "vite-tsconfig-paths": "^4.2.0",
+ "vitest": "^0.31.1"
+ }
+ },
+ "node_modules/@alloc/quick-lru": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
+ "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@ampproject/remapping": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz",
+ "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.0",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.21.4",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz",
+ "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/highlight": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.21.9",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.9.tgz",
+ "integrity": "sha512-FUGed8kfhyWvbYug/Un/VPJD41rDIgoVVcR+FuzhzOYyRz5uED+Gd3SLZml0Uw2l2aHFb7ZgdW5mGA3G2cCCnQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.21.8",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.8.tgz",
+ "integrity": "sha512-YeM22Sondbo523Sz0+CirSPnbj9bG3P0CdHcBZdqUuaeOaYEFbOLoGU7lebvGP6P5J/WE9wOn7u7C4J9HvS1xQ==",
+ "dev": true,
+ "dependencies": {
+ "@ampproject/remapping": "^2.2.0",
+ "@babel/code-frame": "^7.21.4",
+ "@babel/generator": "^7.21.5",
+ "@babel/helper-compilation-targets": "^7.21.5",
+ "@babel/helper-module-transforms": "^7.21.5",
+ "@babel/helpers": "^7.21.5",
+ "@babel/parser": "^7.21.8",
+ "@babel/template": "^7.20.7",
+ "@babel/traverse": "^7.21.5",
+ "@babel/types": "^7.21.5",
+ "convert-source-map": "^1.7.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.2",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/core/node_modules/semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.21.9",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.9.tgz",
+ "integrity": "sha512-F3fZga2uv09wFdEjEQIJxXALXfz0+JaOb7SabvVMmjHxeVTuGW8wgE8Vp1Hd7O+zMTYtcfEISGRzPkeiaPPsvg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.21.5",
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "@jridgewell/trace-mapping": "^0.3.17",
+ "jsesc": "^2.5.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.21.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz",
+ "integrity": "sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w==",
+ "dev": true,
+ "dependencies": {
+ "@babel/compat-data": "^7.21.5",
+ "@babel/helper-validator-option": "^7.21.0",
+ "browserslist": "^4.21.3",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/helper-environment-visitor": {
+ "version": "7.21.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz",
+ "integrity": "sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-function-name": {
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz",
+ "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/template": "^7.20.7",
+ "@babel/types": "^7.21.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-hoist-variables": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz",
+ "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.21.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz",
+ "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.21.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.21.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz",
+ "integrity": "sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-environment-visitor": "^7.21.5",
+ "@babel/helper-module-imports": "^7.21.4",
+ "@babel/helper-simple-access": "^7.21.5",
+ "@babel/helper-split-export-declaration": "^7.18.6",
+ "@babel/helper-validator-identifier": "^7.19.1",
+ "@babel/template": "^7.20.7",
+ "@babel/traverse": "^7.21.5",
+ "@babel/types": "^7.21.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.21.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz",
+ "integrity": "sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-simple-access": {
+ "version": "7.21.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz",
+ "integrity": "sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.21.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-split-export-declaration": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz",
+ "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.21.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz",
+ "integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.19.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz",
+ "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz",
+ "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.21.5",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.5.tgz",
+ "integrity": "sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/template": "^7.20.7",
+ "@babel/traverse": "^7.21.5",
+ "@babel/types": "^7.21.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/highlight": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz",
+ "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.18.6",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.21.9",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.9.tgz",
+ "integrity": "sha512-q5PNg/Bi1OpGgx5jYlvWZwAorZepEudDMCLtj967aeS7WMont7dUZI46M2XwcIQqvUlMxWfdLFu4S/qSxeUu5g==",
+ "dev": true,
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-self": {
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.21.0.tgz",
+ "integrity": "sha512-f/Eq+79JEu+KUANFks9UZCcvydOOGMgF7jBrcwjHa5jTZD8JivnhCJYvmlhR/WTXBWonDExPoW0eO/CR4QJirA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.20.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-source": {
+ "version": "7.19.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.19.6.tgz",
+ "integrity": "sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.19.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.21.9",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.21.9.tgz",
+ "integrity": "sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.21.4",
+ "@babel/parser": "^7.21.9",
+ "@babel/types": "^7.21.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.21.5",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.5.tgz",
+ "integrity": "sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.21.4",
+ "@babel/generator": "^7.21.5",
+ "@babel/helper-environment-visitor": "^7.21.5",
+ "@babel/helper-function-name": "^7.21.0",
+ "@babel/helper-hoist-variables": "^7.18.6",
+ "@babel/helper-split-export-declaration": "^7.18.6",
+ "@babel/parser": "^7.21.5",
+ "@babel/types": "^7.21.5",
+ "debug": "^4.1.0",
+ "globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.21.5",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.5.tgz",
+ "integrity": "sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.21.5",
+ "@babel/helper-validator-identifier": "^7.19.1",
+ "to-fast-properties": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@bcoe/v8-coverage": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz",
+ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
+ "dev": true
+ },
+ "node_modules/@chainsafe/is-ip": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@chainsafe/is-ip/-/is-ip-2.0.1.tgz",
+ "integrity": "sha512-nqSJ8u2a1Rv9FYbyI8qpDhTYujaKEyLknNrTejLYoSWmdeg+2WB7R6BZqPZYfrJzDxVi3rl6ZQuoaEvpKRZWgQ=="
+ },
+ "node_modules/@chainsafe/netmask": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@chainsafe/netmask/-/netmask-2.0.0.tgz",
+ "integrity": "sha512-I3Z+6SWUoaljh3TBzCnCxjlUyN8tA+NAk5L6m9IxvCf1BENQTePzPMis97CoN/iMW1St3WN+AWCCRp+TTBRiDg==",
+ "dependencies": {
+ "@chainsafe/is-ip": "^2.0.1"
+ }
+ },
+ "node_modules/@concordium/browser-wallet-api-helpers": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@concordium/browser-wallet-api-helpers/-/browser-wallet-api-helpers-2.5.0.tgz",
+ "integrity": "sha512-rQRkLX0JhpjnwOItaXoUQN5fYj6KaZ9hR2jEUvOPIeMAIj61zPehT+Cf52zAo97jiYt0YoWibkgsu/M81/jueQ==",
+ "dependencies": {
+ "@concordium/web-sdk": "^3.4.2"
+ }
+ },
+ "node_modules/@concordium/common-sdk": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/@concordium/common-sdk/-/common-sdk-6.5.0.tgz",
+ "integrity": "sha512-6gRb5erLT+VRsMqCtLNpudTZOq0ILbatdhOVYpCb3ys78SkflBRgERrRLximvtEJoxhxzUQ80ROQGXBIStSvbQ==",
+ "dependencies": {
+ "@concordium/rust-bindings": "0.11.1",
+ "@grpc/grpc-js": "^1.3.4",
+ "@noble/ed25519": "^1.7.1",
+ "@protobuf-ts/runtime-rpc": "^2.8.2",
+ "@scure/bip39": "^1.1.0",
+ "bs58check": "^2.1.2",
+ "buffer": "^6.0.3",
+ "cross-fetch": "3.1.5",
+ "hash.js": "^1.1.7",
+ "iso-3166-1": "^2.1.1",
+ "json-bigint": "^1.0.0",
+ "uuid": "^8.3.2"
+ },
+ "engines": {
+ "node": ">=14.16.0"
+ }
+ },
+ "node_modules/@concordium/react-components": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/@concordium/react-components/-/react-components-0.3.0.tgz",
+ "integrity": "sha512-ov/UtajCxlR1K8h+dEUagfBkcTFBJkotUvFwNG6WpqgTSjy1zG9AHzXQeOG30pURAMn3KWIh0B+xNjxB3pl16g==",
+ "dependencies": {
+ "@concordium/wallet-connectors": "^0.3.1"
+ },
+ "peerDependencies": {
+ "react": "^18"
+ }
+ },
+ "node_modules/@concordium/rust-bindings": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/@concordium/rust-bindings/-/rust-bindings-0.11.1.tgz",
+ "integrity": "sha512-FElhfj5LhsL+xCVsg1Gj9T2FhDVq/HmTCCPg9Np2MW5AlXccYI1FXLtO7Lchv83GexnKu/w2q3LqbOrKO19r6Q==",
+ "engines": {
+ "node": ">=14.16.0"
+ }
+ },
+ "node_modules/@concordium/wallet-connectors": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@concordium/wallet-connectors/-/wallet-connectors-0.3.1.tgz",
+ "integrity": "sha512-W5svXuHz0hFKYmnhGCOGcOp0Nh2XzSM25fwBLGVu9+mx3E0Pkz4FYFyiRYArf09+A5lEptcSEawMZmAExi9GBA==",
+ "dependencies": {
+ "@concordium/browser-wallet-api-helpers": "^2.5.0",
+ "@walletconnect/qrcode-modal": "^1.8.0",
+ "@walletconnect/sign-client": "^2.1.4"
+ }
+ },
+ "node_modules/@concordium/web-sdk": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/@concordium/web-sdk/-/web-sdk-3.5.0.tgz",
+ "integrity": "sha512-YEdu459ZrFSGqMCoQdogS7ooC/lBqoLoOPbhahfE2hOotNRwor/V07ST3w9/6vHSrskphsAbybQB8Legk69caQ==",
+ "dependencies": {
+ "@concordium/common-sdk": "6.5.0",
+ "@concordium/rust-bindings": "0.11.1",
+ "@grpc/grpc-js": "^1.3.4",
+ "@protobuf-ts/grpcweb-transport": "^2.8.2",
+ "buffer": "^6.0.3",
+ "process": "^0.11.10"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.17.19",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz",
+ "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==",
+ "cpu": [
+ "arm"
+ ],
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.17.19",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz",
+ "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.17.19",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz",
+ "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.17.19",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz",
+ "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.17.19",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz",
+ "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.17.19",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz",
+ "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.17.19",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz",
+ "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.17.19",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz",
+ "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==",
+ "cpu": [
+ "arm"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.17.19",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz",
+ "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.17.19",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz",
+ "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.17.19",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz",
+ "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==",
+ "cpu": [
+ "loong64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.17.19",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz",
+ "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==",
+ "cpu": [
+ "mips64el"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.17.19",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz",
+ "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==",
+ "cpu": [
+ "ppc64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.17.19",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz",
+ "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.17.19",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz",
+ "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==",
+ "cpu": [
+ "s390x"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.17.19",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz",
+ "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.17.19",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz",
+ "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.17.19",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz",
+ "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.17.19",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz",
+ "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.17.19",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz",
+ "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.17.19",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz",
+ "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==",
+ "cpu": [
+ "ia32"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.17.19",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz",
+ "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
+ "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==",
+ "dev": true,
+ "dependencies": {
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.5.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz",
+ "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==",
+ "dev": true,
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz",
+ "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.5.2",
+ "globals": "^13.19.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/globals": {
+ "version": "13.20.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
+ "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "8.41.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.41.0.tgz",
+ "integrity": "sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@grpc/grpc-js": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.0.tgz",
+ "integrity": "sha512-H8+iZh+kCE6VR/Krj6W28Y/ZlxoZ1fOzsNt77nrdE3knkbSelW1Uus192xOFCxHyeszLj8i4APQkSIXjAoOxXg==",
+ "dependencies": {
+ "@grpc/proto-loader": "^0.7.0",
+ "@types/node": ">=12.12.47"
+ },
+ "engines": {
+ "node": "^8.13.0 || >=10.10.0"
+ }
+ },
+ "node_modules/@grpc/proto-loader": {
+ "version": "0.7.8",
+ "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.8.tgz",
+ "integrity": "sha512-GU12e2c8dmdXb7XUlOgYWZ2o2i+z9/VeACkxTA/zzAe2IjclC5PnVL0lpgjhrqfpDYHzM8B1TF6pqWegMYAzlA==",
+ "dependencies": {
+ "@types/long": "^4.0.1",
+ "lodash.camelcase": "^4.3.0",
+ "long": "^4.0.0",
+ "protobufjs": "^7.2.4",
+ "yargs": "^17.7.2"
+ },
+ "bin": {
+ "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/@heroicons/react": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-2.0.18.tgz",
+ "integrity": "sha512-7TyMjRrZZMBPa+/5Y8lN0iyvUU/01PeMGX2+RE7cQWpEUIcb4QotzUObFkJDejj/HUH4qjP/eQ0gzzKs2f+6Yw==",
+ "peerDependencies": {
+ "react": ">= 16"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array": {
+ "version": "0.11.8",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz",
+ "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==",
+ "dev": true,
+ "dependencies": {
+ "@humanwhocodes/object-schema": "^1.2.1",
+ "debug": "^4.1.1",
+ "minimatch": "^3.0.5"
+ },
+ "engines": {
+ "node": ">=10.10.0"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/object-schema": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
+ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
+ "dev": true
+ },
+ "node_modules/@ipld/dag-cbor": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/@ipld/dag-cbor/-/dag-cbor-9.0.1.tgz",
+ "integrity": "sha512-tImDka4akO7cuD24+nRLOU1kYXoai3VZ1cMeWCFUzwhKrRXyOLfVd9RZGI6aTsE/PYvHmkFobKvTeK9NPVtajA==",
+ "dependencies": {
+ "cborg": "^1.10.0",
+ "multiformats": "^11.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/@ipld/dag-cbor/node_modules/multiformats": {
+ "version": "11.0.2",
+ "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-11.0.2.tgz",
+ "integrity": "sha512-b5mYMkOkARIuVZCpvijFj9a6m5wMVLC7cf/jIPd5D/ARDOfLC5+IFkbgDXQgcU2goIsTD/O9NY4DI/Mt4OGvlg==",
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/@ipld/dag-json": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/@ipld/dag-json/-/dag-json-10.1.0.tgz",
+ "integrity": "sha512-2rSvzDyGxx1NC24IsqKFTSXzAfUBlniZQRT15PEN+i177KEBsCXPfxuN/DweGIfmj3YceNyR8XOJT47pRZu7Cg==",
+ "dependencies": {
+ "cborg": "^1.10.0",
+ "multiformats": "^11.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/@ipld/dag-json/node_modules/multiformats": {
+ "version": "11.0.2",
+ "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-11.0.2.tgz",
+ "integrity": "sha512-b5mYMkOkARIuVZCpvijFj9a6m5wMVLC7cf/jIPd5D/ARDOfLC5+IFkbgDXQgcU2goIsTD/O9NY4DI/Mt4OGvlg==",
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/@ipld/dag-pb": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@ipld/dag-pb/-/dag-pb-4.0.3.tgz",
+ "integrity": "sha512-bOe+Z2ZJs9pmP/aIUBYMTdXq0i5z1x71qXeOIIhZvnKFLuzTIbbW0u5b7OfTGzUEbSv1dkUZBIXa7G/+OA8dnA==",
+ "dependencies": {
+ "multiformats": "^11.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/@ipld/dag-pb/node_modules/multiformats": {
+ "version": "11.0.2",
+ "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-11.0.2.tgz",
+ "integrity": "sha512-b5mYMkOkARIuVZCpvijFj9a6m5wMVLC7cf/jIPd5D/ARDOfLC5+IFkbgDXQgcU2goIsTD/O9NY4DI/Mt4OGvlg==",
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/@istanbuljs/schema": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
+ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
+ "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/set-array": "^1.0.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
+ "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/set-array": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
+ "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.4.15",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
+ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
+ "dev": true
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.18",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz",
+ "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/resolve-uri": "3.1.0",
+ "@jridgewell/sourcemap-codec": "1.4.14"
+ }
+ },
+ "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.4.14",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
+ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
+ "dev": true
+ },
+ "node_modules/@libp2p/interface-connection": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@libp2p/interface-connection/-/interface-connection-4.0.0.tgz",
+ "integrity": "sha512-6xx/NmEc84HX7QmsjSC3hHredQYjHv4Dkf4G27adAPf+qN+vnPxmQ7gaTnk243a0++DOFTbZ2gKX/15G2B6SRg==",
+ "dependencies": {
+ "@libp2p/interface-peer-id": "^2.0.0",
+ "@libp2p/interfaces": "^3.0.0",
+ "@multiformats/multiaddr": "^12.0.0",
+ "it-stream-types": "^1.0.4",
+ "uint8arraylist": "^2.1.2"
+ },
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/@libp2p/interface-connection/node_modules/@multiformats/multiaddr": {
+ "version": "12.1.3",
+ "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.1.3.tgz",
+ "integrity": "sha512-rNcS3njkkSwuGF4x58L47jGH5kBXBfJPNsWnrt0gujhNYn6ReDt1je7vEU5/ddrVj0TStgxw+Hm+TkYDK0b60w==",
+ "dependencies": {
+ "@chainsafe/is-ip": "^2.0.1",
+ "@chainsafe/netmask": "^2.0.0",
+ "@libp2p/interfaces": "^3.3.1",
+ "dns-over-http-resolver": "^2.1.0",
+ "multiformats": "^11.0.0",
+ "uint8arrays": "^4.0.2",
+ "varint": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/@libp2p/interface-connection/node_modules/multiformats": {
+ "version": "11.0.2",
+ "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-11.0.2.tgz",
+ "integrity": "sha512-b5mYMkOkARIuVZCpvijFj9a6m5wMVLC7cf/jIPd5D/ARDOfLC5+IFkbgDXQgcU2goIsTD/O9NY4DI/Mt4OGvlg==",
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/@libp2p/interface-connection/node_modules/uint8arrays": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-4.0.4.tgz",
+ "integrity": "sha512-AOoA66e/A7zoXm1mgzQjGmkWDTvCrS3ttWXLHFtlVAwMobLcaOA7G7WRNNAcyfjjYdFDtkEK6njRDX7hZLIO9Q==",
+ "dependencies": {
+ "multiformats": "^11.0.0"
+ }
+ },
+ "node_modules/@libp2p/interface-keychain": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@libp2p/interface-keychain/-/interface-keychain-2.0.5.tgz",
+ "integrity": "sha512-mb7QNgn9fIvC7CaJCi06GJ+a6DN6RVT9TmEi0NmedZGATeCArPeWWG7r7IfxNVXb9cVOOE1RzV1swK0ZxEJF9Q==",
+ "dependencies": {
+ "@libp2p/interface-peer-id": "^2.0.0",
+ "multiformats": "^11.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/@libp2p/interface-keychain/node_modules/multiformats": {
+ "version": "11.0.2",
+ "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-11.0.2.tgz",
+ "integrity": "sha512-b5mYMkOkARIuVZCpvijFj9a6m5wMVLC7cf/jIPd5D/ARDOfLC5+IFkbgDXQgcU2goIsTD/O9NY4DI/Mt4OGvlg==",
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/@libp2p/interface-peer-id": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/@libp2p/interface-peer-id/-/interface-peer-id-2.0.2.tgz",
+ "integrity": "sha512-9pZp9zhTDoVwzRmp0Wtxw0Yfa//Yc0GqBCJi3EznBDE6HGIAVvppR91wSh2knt/0eYg0AQj7Y35VSesUTzMCUg==",
+ "dependencies": {
+ "multiformats": "^11.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/@libp2p/interface-peer-id/node_modules/multiformats": {
+ "version": "11.0.2",
+ "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-11.0.2.tgz",
+ "integrity": "sha512-b5mYMkOkARIuVZCpvijFj9a6m5wMVLC7cf/jIPd5D/ARDOfLC5+IFkbgDXQgcU2goIsTD/O9NY4DI/Mt4OGvlg==",
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/@libp2p/interface-peer-info": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/@libp2p/interface-peer-info/-/interface-peer-info-1.0.10.tgz",
+ "integrity": "sha512-HQlo8NwQjMyamCHJrnILEZz+YwEOXCB2sIIw3slIrhVUYeYlTaia1R6d9umaAeLHa255Zmdm4qGH8rJLRqhCcg==",
+ "dependencies": {
+ "@libp2p/interface-peer-id": "^2.0.0",
+ "@multiformats/multiaddr": "^12.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/@libp2p/interface-peer-info/node_modules/@multiformats/multiaddr": {
+ "version": "12.1.3",
+ "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.1.3.tgz",
+ "integrity": "sha512-rNcS3njkkSwuGF4x58L47jGH5kBXBfJPNsWnrt0gujhNYn6ReDt1je7vEU5/ddrVj0TStgxw+Hm+TkYDK0b60w==",
+ "dependencies": {
+ "@chainsafe/is-ip": "^2.0.1",
+ "@chainsafe/netmask": "^2.0.0",
+ "@libp2p/interfaces": "^3.3.1",
+ "dns-over-http-resolver": "^2.1.0",
+ "multiformats": "^11.0.0",
+ "uint8arrays": "^4.0.2",
+ "varint": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/@libp2p/interface-peer-info/node_modules/multiformats": {
+ "version": "11.0.2",
+ "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-11.0.2.tgz",
+ "integrity": "sha512-b5mYMkOkARIuVZCpvijFj9a6m5wMVLC7cf/jIPd5D/ARDOfLC5+IFkbgDXQgcU2goIsTD/O9NY4DI/Mt4OGvlg==",
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/@libp2p/interface-peer-info/node_modules/uint8arrays": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-4.0.4.tgz",
+ "integrity": "sha512-AOoA66e/A7zoXm1mgzQjGmkWDTvCrS3ttWXLHFtlVAwMobLcaOA7G7WRNNAcyfjjYdFDtkEK6njRDX7hZLIO9Q==",
+ "dependencies": {
+ "multiformats": "^11.0.0"
+ }
+ },
+ "node_modules/@libp2p/interface-pubsub": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/@libp2p/interface-pubsub/-/interface-pubsub-3.0.7.tgz",
+ "integrity": "sha512-+c74EVUBTfw2sx1GE/z/IjsYO6dhur+ukF0knAppeZsRQ1Kgg6K5R3eECtT28fC6dBWLjFpAvW/7QGfiDAL4RA==",
+ "dependencies": {
+ "@libp2p/interface-connection": "^4.0.0",
+ "@libp2p/interface-peer-id": "^2.0.0",
+ "@libp2p/interfaces": "^3.0.0",
+ "it-pushable": "^3.0.0",
+ "uint8arraylist": "^2.1.2"
+ },
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/@libp2p/interfaces": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/@libp2p/interfaces/-/interfaces-3.3.2.tgz",
+ "integrity": "sha512-p/M7plbrxLzuQchvNwww1Was7ZeGE2NaOFulMaZBYIihU8z3fhaV+a033OqnC/0NTX/yhfdNOG7znhYq3XoR/g==",
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/@libp2p/logger": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/@libp2p/logger/-/logger-2.1.1.tgz",
+ "integrity": "sha512-2UbzDPctg3cPupF6jrv6abQnAUTrbLybNOj0rmmrdGm1cN2HJ1o/hBu0sXuq4KF9P1h/eVRn1HIRbVIEKnEJrA==",
+ "dependencies": {
+ "@libp2p/interface-peer-id": "^2.0.2",
+ "@multiformats/multiaddr": "^12.1.3",
+ "debug": "^4.3.4",
+ "interface-datastore": "^8.2.0",
+ "multiformats": "^11.0.2"
+ },
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/@libp2p/logger/node_modules/@multiformats/multiaddr": {
+ "version": "12.1.3",
+ "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.1.3.tgz",
+ "integrity": "sha512-rNcS3njkkSwuGF4x58L47jGH5kBXBfJPNsWnrt0gujhNYn6ReDt1je7vEU5/ddrVj0TStgxw+Hm+TkYDK0b60w==",
+ "dependencies": {
+ "@chainsafe/is-ip": "^2.0.1",
+ "@chainsafe/netmask": "^2.0.0",
+ "@libp2p/interfaces": "^3.3.1",
+ "dns-over-http-resolver": "^2.1.0",
+ "multiformats": "^11.0.0",
+ "uint8arrays": "^4.0.2",
+ "varint": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/@libp2p/logger/node_modules/multiformats": {
+ "version": "11.0.2",
+ "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-11.0.2.tgz",
+ "integrity": "sha512-b5mYMkOkARIuVZCpvijFj9a6m5wMVLC7cf/jIPd5D/ARDOfLC5+IFkbgDXQgcU2goIsTD/O9NY4DI/Mt4OGvlg==",
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/@libp2p/logger/node_modules/uint8arrays": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-4.0.4.tgz",
+ "integrity": "sha512-AOoA66e/A7zoXm1mgzQjGmkWDTvCrS3ttWXLHFtlVAwMobLcaOA7G7WRNNAcyfjjYdFDtkEK6njRDX7hZLIO9Q==",
+ "dependencies": {
+ "multiformats": "^11.0.0"
+ }
+ },
+ "node_modules/@libp2p/peer-id": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@libp2p/peer-id/-/peer-id-2.0.3.tgz",
+ "integrity": "sha512-eZX+5ByUAzh8DrfjCan0spZGpvF7SxEBz4tOPoBMBCuKJJLr+8EokBO/5E3ceIw04f5+lAcD3CO3bccuKomp3Q==",
+ "dependencies": {
+ "@libp2p/interface-peer-id": "^2.0.0",
+ "@libp2p/interfaces": "^3.2.0",
+ "multiformats": "^11.0.0",
+ "uint8arrays": "^4.0.2"
+ },
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/@libp2p/peer-id/node_modules/multiformats": {
+ "version": "11.0.2",
+ "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-11.0.2.tgz",
+ "integrity": "sha512-b5mYMkOkARIuVZCpvijFj9a6m5wMVLC7cf/jIPd5D/ARDOfLC5+IFkbgDXQgcU2goIsTD/O9NY4DI/Mt4OGvlg==",
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/@libp2p/peer-id/node_modules/uint8arrays": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-4.0.4.tgz",
+ "integrity": "sha512-AOoA66e/A7zoXm1mgzQjGmkWDTvCrS3ttWXLHFtlVAwMobLcaOA7G7WRNNAcyfjjYdFDtkEK6njRDX7hZLIO9Q==",
+ "dependencies": {
+ "multiformats": "^11.0.0"
+ }
+ },
+ "node_modules/@multiformats/multiaddr": {
+ "version": "11.6.1",
+ "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-11.6.1.tgz",
+ "integrity": "sha512-doST0+aB7/3dGK9+U5y3mtF3jq85KGbke1QiH0KE1F5mGQ9y56mFebTeu2D9FNOm+OT6UHb8Ss8vbSnpGjeLNw==",
+ "dependencies": {
+ "@chainsafe/is-ip": "^2.0.1",
+ "dns-over-http-resolver": "^2.1.0",
+ "err-code": "^3.0.1",
+ "multiformats": "^11.0.0",
+ "uint8arrays": "^4.0.2",
+ "varint": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/@multiformats/multiaddr-to-uri": {
+ "version": "9.0.7",
+ "resolved": "https://registry.npmjs.org/@multiformats/multiaddr-to-uri/-/multiaddr-to-uri-9.0.7.tgz",
+ "integrity": "sha512-i3ldtPMN6XJt+MCi34hOl0wGuGEHfWWMw6lmNag5BpckPwPTf9XGOOFMmh7ed/uO3Vjah/g173iOe61HTQVoBA==",
+ "dependencies": {
+ "@multiformats/multiaddr": "^12.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/@multiformats/multiaddr-to-uri/node_modules/@multiformats/multiaddr": {
+ "version": "12.1.3",
+ "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.1.3.tgz",
+ "integrity": "sha512-rNcS3njkkSwuGF4x58L47jGH5kBXBfJPNsWnrt0gujhNYn6ReDt1je7vEU5/ddrVj0TStgxw+Hm+TkYDK0b60w==",
+ "dependencies": {
+ "@chainsafe/is-ip": "^2.0.1",
+ "@chainsafe/netmask": "^2.0.0",
+ "@libp2p/interfaces": "^3.3.1",
+ "dns-over-http-resolver": "^2.1.0",
+ "multiformats": "^11.0.0",
+ "uint8arrays": "^4.0.2",
+ "varint": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/@multiformats/multiaddr-to-uri/node_modules/multiformats": {
+ "version": "11.0.2",
+ "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-11.0.2.tgz",
+ "integrity": "sha512-b5mYMkOkARIuVZCpvijFj9a6m5wMVLC7cf/jIPd5D/ARDOfLC5+IFkbgDXQgcU2goIsTD/O9NY4DI/Mt4OGvlg==",
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/@multiformats/multiaddr-to-uri/node_modules/uint8arrays": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-4.0.4.tgz",
+ "integrity": "sha512-AOoA66e/A7zoXm1mgzQjGmkWDTvCrS3ttWXLHFtlVAwMobLcaOA7G7WRNNAcyfjjYdFDtkEK6njRDX7hZLIO9Q==",
+ "dependencies": {
+ "multiformats": "^11.0.0"
+ }
+ },
+ "node_modules/@multiformats/multiaddr/node_modules/multiformats": {
+ "version": "11.0.2",
+ "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-11.0.2.tgz",
+ "integrity": "sha512-b5mYMkOkARIuVZCpvijFj9a6m5wMVLC7cf/jIPd5D/ARDOfLC5+IFkbgDXQgcU2goIsTD/O9NY4DI/Mt4OGvlg==",
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/@multiformats/multiaddr/node_modules/uint8arrays": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-4.0.4.tgz",
+ "integrity": "sha512-AOoA66e/A7zoXm1mgzQjGmkWDTvCrS3ttWXLHFtlVAwMobLcaOA7G7WRNNAcyfjjYdFDtkEK6njRDX7hZLIO9Q==",
+ "dependencies": {
+ "multiformats": "^11.0.0"
+ }
+ },
+ "node_modules/@noble/ed25519": {
+ "version": "1.7.3",
+ "resolved": "https://registry.npmjs.org/@noble/ed25519/-/ed25519-1.7.3.tgz",
+ "integrity": "sha512-iR8GBkDt0Q3GyaVcIu7mSsVIqnFbkbRzGLWlvhwunacoLwt4J3swfKhfaM6rN6WY+TBGoYT1GtT1mIh2/jGbRQ==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ]
+ },
+ "node_modules/@noble/hashes": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz",
+ "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==",
+ "engines": {
+ "node": ">= 16"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/@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,
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@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,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@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,
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@protobuf-ts/grpcweb-transport": {
+ "version": "2.9.1",
+ "resolved": "https://registry.npmjs.org/@protobuf-ts/grpcweb-transport/-/grpcweb-transport-2.9.1.tgz",
+ "integrity": "sha512-42bvBX312qhPlosMNTZE9XI+lt58ISM5vEJKv/wOx2Fu70J0TdlLa4Bjz8xcuRlv4Pq1CA+94DC1IgNxNRsQdg==",
+ "dependencies": {
+ "@protobuf-ts/runtime": "^2.9.1",
+ "@protobuf-ts/runtime-rpc": "^2.9.1"
+ }
+ },
+ "node_modules/@protobuf-ts/runtime": {
+ "version": "2.9.1",
+ "resolved": "https://registry.npmjs.org/@protobuf-ts/runtime/-/runtime-2.9.1.tgz",
+ "integrity": "sha512-ZTc8b+pQ6bwxZa3qg9/IO/M/brRkvr0tic9cSGgAsDByfPrtatT2300wTIRLDk8X9WTW1tT+FhyqmcrbMHTeww=="
+ },
+ "node_modules/@protobuf-ts/runtime-rpc": {
+ "version": "2.9.1",
+ "resolved": "https://registry.npmjs.org/@protobuf-ts/runtime-rpc/-/runtime-rpc-2.9.1.tgz",
+ "integrity": "sha512-pzO20J6s07LTWcj8hKAXh/dAacU5HIVir6SANKXXH8G0pn0VIIB4FFECq5Hbv25/8PQoOGZ7iApq/DMHaSjGhg==",
+ "dependencies": {
+ "@protobuf-ts/runtime": "^2.9.1"
+ }
+ },
+ "node_modules/@protobufjs/aspromise": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
+ "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="
+ },
+ "node_modules/@protobufjs/base64": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
+ "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="
+ },
+ "node_modules/@protobufjs/codegen": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
+ "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg=="
+ },
+ "node_modules/@protobufjs/eventemitter": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz",
+ "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q=="
+ },
+ "node_modules/@protobufjs/fetch": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz",
+ "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==",
+ "dependencies": {
+ "@protobufjs/aspromise": "^1.1.1",
+ "@protobufjs/inquire": "^1.1.0"
+ }
+ },
+ "node_modules/@protobufjs/float": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
+ "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ=="
+ },
+ "node_modules/@protobufjs/inquire": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
+ "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q=="
+ },
+ "node_modules/@protobufjs/path": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
+ "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA=="
+ },
+ "node_modules/@protobufjs/pool": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
+ "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw=="
+ },
+ "node_modules/@protobufjs/utf8": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
+ "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="
+ },
+ "node_modules/@remix-run/router": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.6.2.tgz",
+ "integrity": "sha512-LzqpSrMK/3JBAVBI9u3NWtOhWNw5AMQfrUFYB0+bDHTSw17z++WJLsPsxAuK+oSddsxk4d7F/JcdDPM1M5YAhA==",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@scure/base": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz",
+ "integrity": "sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ]
+ },
+ "node_modules/@scure/bip39": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.1.tgz",
+ "integrity": "sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==",
+ "dependencies": {
+ "@noble/hashes": "~1.3.0",
+ "@scure/base": "~1.1.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/@stablelib/aead": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@stablelib/aead/-/aead-1.0.1.tgz",
+ "integrity": "sha512-q39ik6sxGHewqtO0nP4BuSe3db5G1fEJE8ukvngS2gLkBXyy6E7pLubhbYgnkDFv6V8cWaxcE4Xn0t6LWcJkyg=="
+ },
+ "node_modules/@stablelib/binary": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@stablelib/binary/-/binary-1.0.1.tgz",
+ "integrity": "sha512-ClJWvmL6UBM/wjkvv/7m5VP3GMr9t0osr4yVgLZsLCOz4hGN9gIAFEqnJ0TsSMAN+n840nf2cHZnA5/KFqHC7Q==",
+ "dependencies": {
+ "@stablelib/int": "^1.0.1"
+ }
+ },
+ "node_modules/@stablelib/bytes": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@stablelib/bytes/-/bytes-1.0.1.tgz",
+ "integrity": "sha512-Kre4Y4kdwuqL8BR2E9hV/R5sOrUj6NanZaZis0V6lX5yzqC3hBuVSDXUIBqQv/sCpmuWRiHLwqiT1pqqjuBXoQ=="
+ },
+ "node_modules/@stablelib/chacha": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@stablelib/chacha/-/chacha-1.0.1.tgz",
+ "integrity": "sha512-Pmlrswzr0pBzDofdFuVe1q7KdsHKhhU24e8gkEwnTGOmlC7PADzLVxGdn2PoNVBBabdg0l/IfLKg6sHAbTQugg==",
+ "dependencies": {
+ "@stablelib/binary": "^1.0.1",
+ "@stablelib/wipe": "^1.0.1"
+ }
+ },
+ "node_modules/@stablelib/chacha20poly1305": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@stablelib/chacha20poly1305/-/chacha20poly1305-1.0.1.tgz",
+ "integrity": "sha512-MmViqnqHd1ymwjOQfghRKw2R/jMIGT3wySN7cthjXCBdO+qErNPUBnRzqNpnvIwg7JBCg3LdeCZZO4de/yEhVA==",
+ "dependencies": {
+ "@stablelib/aead": "^1.0.1",
+ "@stablelib/binary": "^1.0.1",
+ "@stablelib/chacha": "^1.0.1",
+ "@stablelib/constant-time": "^1.0.1",
+ "@stablelib/poly1305": "^1.0.1",
+ "@stablelib/wipe": "^1.0.1"
+ }
+ },
+ "node_modules/@stablelib/constant-time": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@stablelib/constant-time/-/constant-time-1.0.1.tgz",
+ "integrity": "sha512-tNOs3uD0vSJcK6z1fvef4Y+buN7DXhzHDPqRLSXUel1UfqMB1PWNsnnAezrKfEwTLpN0cGH2p9NNjs6IqeD0eg=="
+ },
+ "node_modules/@stablelib/ed25519": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@stablelib/ed25519/-/ed25519-1.0.3.tgz",
+ "integrity": "sha512-puIMWaX9QlRsbhxfDc5i+mNPMY+0TmQEskunY1rZEBPi1acBCVQAhnsk/1Hk50DGPtVsZtAWQg4NHGlVaO9Hqg==",
+ "dependencies": {
+ "@stablelib/random": "^1.0.2",
+ "@stablelib/sha512": "^1.0.1",
+ "@stablelib/wipe": "^1.0.1"
+ }
+ },
+ "node_modules/@stablelib/hash": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@stablelib/hash/-/hash-1.0.1.tgz",
+ "integrity": "sha512-eTPJc/stDkdtOcrNMZ6mcMK1e6yBbqRBaNW55XA1jU8w/7QdnCF0CmMmOD1m7VSkBR44PWrMHU2l6r8YEQHMgg=="
+ },
+ "node_modules/@stablelib/hkdf": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@stablelib/hkdf/-/hkdf-1.0.1.tgz",
+ "integrity": "sha512-SBEHYE16ZXlHuaW5RcGk533YlBj4grMeg5TooN80W3NpcHRtLZLLXvKyX0qcRFxf+BGDobJLnwkvgEwHIDBR6g==",
+ "dependencies": {
+ "@stablelib/hash": "^1.0.1",
+ "@stablelib/hmac": "^1.0.1",
+ "@stablelib/wipe": "^1.0.1"
+ }
+ },
+ "node_modules/@stablelib/hmac": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@stablelib/hmac/-/hmac-1.0.1.tgz",
+ "integrity": "sha512-V2APD9NSnhVpV/QMYgCVMIYKiYG6LSqw1S65wxVoirhU/51ACio6D4yDVSwMzuTJXWZoVHbDdINioBwKy5kVmA==",
+ "dependencies": {
+ "@stablelib/constant-time": "^1.0.1",
+ "@stablelib/hash": "^1.0.1",
+ "@stablelib/wipe": "^1.0.1"
+ }
+ },
+ "node_modules/@stablelib/int": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@stablelib/int/-/int-1.0.1.tgz",
+ "integrity": "sha512-byr69X/sDtDiIjIV6m4roLVWnNNlRGzsvxw+agj8CIEazqWGOQp2dTYgQhtyVXV9wpO6WyXRQUzLV/JRNumT2w=="
+ },
+ "node_modules/@stablelib/keyagreement": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@stablelib/keyagreement/-/keyagreement-1.0.1.tgz",
+ "integrity": "sha512-VKL6xBwgJnI6l1jKrBAfn265cspaWBPAPEc62VBQrWHLqVgNRE09gQ/AnOEyKUWrrqfD+xSQ3u42gJjLDdMDQg==",
+ "dependencies": {
+ "@stablelib/bytes": "^1.0.1"
+ }
+ },
+ "node_modules/@stablelib/poly1305": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@stablelib/poly1305/-/poly1305-1.0.1.tgz",
+ "integrity": "sha512-1HlG3oTSuQDOhSnLwJRKeTRSAdFNVB/1djy2ZbS35rBSJ/PFqx9cf9qatinWghC2UbfOYD8AcrtbUQl8WoxabA==",
+ "dependencies": {
+ "@stablelib/constant-time": "^1.0.1",
+ "@stablelib/wipe": "^1.0.1"
+ }
+ },
+ "node_modules/@stablelib/random": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@stablelib/random/-/random-1.0.2.tgz",
+ "integrity": "sha512-rIsE83Xpb7clHPVRlBj8qNe5L8ISQOzjghYQm/dZ7VaM2KHYwMW5adjQjrzTZCchFnNCNhkwtnOBa9HTMJCI8w==",
+ "dependencies": {
+ "@stablelib/binary": "^1.0.1",
+ "@stablelib/wipe": "^1.0.1"
+ }
+ },
+ "node_modules/@stablelib/sha256": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@stablelib/sha256/-/sha256-1.0.1.tgz",
+ "integrity": "sha512-GIIH3e6KH+91FqGV42Kcj71Uefd/QEe7Dy42sBTeqppXV95ggCcxLTk39bEr+lZfJmp+ghsR07J++ORkRELsBQ==",
+ "dependencies": {
+ "@stablelib/binary": "^1.0.1",
+ "@stablelib/hash": "^1.0.1",
+ "@stablelib/wipe": "^1.0.1"
+ }
+ },
+ "node_modules/@stablelib/sha512": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@stablelib/sha512/-/sha512-1.0.1.tgz",
+ "integrity": "sha512-13gl/iawHV9zvDKciLo1fQ8Bgn2Pvf7OV6amaRVKiq3pjQ3UmEpXxWiAfV8tYjUpeZroBxtyrwtdooQT/i3hzw==",
+ "dependencies": {
+ "@stablelib/binary": "^1.0.1",
+ "@stablelib/hash": "^1.0.1",
+ "@stablelib/wipe": "^1.0.1"
+ }
+ },
+ "node_modules/@stablelib/wipe": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@stablelib/wipe/-/wipe-1.0.1.tgz",
+ "integrity": "sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg=="
+ },
+ "node_modules/@stablelib/x25519": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@stablelib/x25519/-/x25519-1.0.3.tgz",
+ "integrity": "sha512-KnTbKmUhPhHavzobclVJQG5kuivH+qDLpe84iRqX3CLrKp881cF160JvXJ+hjn1aMyCwYOKeIZefIH/P5cJoRw==",
+ "dependencies": {
+ "@stablelib/keyagreement": "^1.0.1",
+ "@stablelib/random": "^1.0.2",
+ "@stablelib/wipe": "^1.0.1"
+ }
+ },
+ "node_modules/@types/bn.js": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz",
+ "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/chai": {
+ "version": "4.3.5",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz",
+ "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==",
+ "dev": true
+ },
+ "node_modules/@types/chai-subset": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz",
+ "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==",
+ "dev": true,
+ "dependencies": {
+ "@types/chai": "*"
+ }
+ },
+ "node_modules/@types/crypto-js": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/@types/crypto-js/-/crypto-js-4.1.1.tgz",
+ "integrity": "sha512-BG7fQKZ689HIoc5h+6D2Dgq1fABRa0RbBWKBd9SP/MVRVXROflpm5fhwyATX5duFmbStzyzyycPB8qUYKDH3NA=="
+ },
+ "node_modules/@types/istanbul-lib-coverage": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz",
+ "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==",
+ "dev": true
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.11",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz",
+ "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==",
+ "dev": true
+ },
+ "node_modules/@types/long": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz",
+ "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA=="
+ },
+ "node_modules/@types/minimatch": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz",
+ "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ=="
+ },
+ "node_modules/@types/node": {
+ "version": "20.2.3",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.2.3.tgz",
+ "integrity": "sha512-pg9d0yC4rVNWQzX8U7xb4olIOFuuVL9za3bzMT2pu2SU0SNEi66i2qrvhE2qt0HvkhuCaWJu7pLNOt/Pj8BIrw=="
+ },
+ "node_modules/@types/pbkdf2": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz",
+ "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/prop-types": {
+ "version": "15.7.5",
+ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz",
+ "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==",
+ "dev": true
+ },
+ "node_modules/@types/react": {
+ "version": "18.2.7",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.7.tgz",
+ "integrity": "sha512-ojrXpSH2XFCmHm7Jy3q44nXDyN54+EYKP2lBhJ2bqfyPj6cIUW/FZW/Csdia34NQgq7KYcAlHi5184m4X88+yw==",
+ "dev": true,
+ "dependencies": {
+ "@types/prop-types": "*",
+ "@types/scheduler": "*",
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/@types/react-dom": {
+ "version": "18.2.4",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.4.tgz",
+ "integrity": "sha512-G2mHoTMTL4yoydITgOGwWdWMVd8sNgyEP85xVmMKAPUBwQWm9wBPQUmvbeF4V3WBY1P7mmL4BkjQ0SqUpf1snw==",
+ "dev": true,
+ "dependencies": {
+ "@types/react": "*"
+ }
+ },
+ "node_modules/@types/scheduler": {
+ "version": "0.16.3",
+ "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz",
+ "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==",
+ "dev": true
+ },
+ "node_modules/@types/secp256k1": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz",
+ "integrity": "sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/semver": {
+ "version": "7.5.0",
+ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz",
+ "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==",
+ "dev": true
+ },
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "5.59.7",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.7.tgz",
+ "integrity": "sha512-BL+jYxUFIbuYwy+4fF86k5vdT9lT0CNJ6HtwrIvGh0PhH8s0yy5rjaKH2fDCrz5ITHy07WCzVGNvAmjJh4IJFA==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.4.0",
+ "@typescript-eslint/scope-manager": "5.59.7",
+ "@typescript-eslint/type-utils": "5.59.7",
+ "@typescript-eslint/utils": "5.59.7",
+ "debug": "^4.3.4",
+ "grapheme-splitter": "^1.0.4",
+ "ignore": "^5.2.0",
+ "natural-compare-lite": "^1.4.0",
+ "semver": "^7.3.7",
+ "tsutils": "^3.21.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^5.0.0",
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "5.59.7",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.7.tgz",
+ "integrity": "sha512-VhpsIEuq/8i5SF+mPg9jSdIwgMBBp0z9XqjiEay+81PYLJuroN+ET1hM5IhkiYMJd9MkTz8iJLt7aaGAgzWUbQ==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "5.59.7",
+ "@typescript-eslint/types": "5.59.7",
+ "@typescript-eslint/typescript-estree": "5.59.7",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "5.59.7",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.7.tgz",
+ "integrity": "sha512-FL6hkYWK9zBGdxT2wWEd2W8ocXMu3K94i3gvMrjXpx+koFYdYV7KprKfirpgY34vTGzEPPuKoERpP8kD5h7vZQ==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "5.59.7",
+ "@typescript-eslint/visitor-keys": "5.59.7"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "5.59.7",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.7.tgz",
+ "integrity": "sha512-ozuz/GILuYG7osdY5O5yg0QxXUAEoI4Go3Do5xeu+ERH9PorHBPSdvD3Tjp2NN2bNLh1NJQSsQu2TPu/Ly+HaQ==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/typescript-estree": "5.59.7",
+ "@typescript-eslint/utils": "5.59.7",
+ "debug": "^4.3.4",
+ "tsutils": "^3.21.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "*"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "5.59.7",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.7.tgz",
+ "integrity": "sha512-UnVS2MRRg6p7xOSATscWkKjlf/NDKuqo5TdbWck6rIRZbmKpVNTLALzNvcjIfHBE7736kZOFc/4Z3VcZwuOM/A==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "5.59.7",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.7.tgz",
+ "integrity": "sha512-4A1NtZ1I3wMN2UGDkU9HMBL+TIQfbrh4uS0WDMMpf3xMRursDbqEf1ahh6vAAe3mObt8k3ZATnezwG4pdtWuUQ==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "5.59.7",
+ "@typescript-eslint/visitor-keys": "5.59.7",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-glob": "^4.0.3",
+ "semver": "^7.3.7",
+ "tsutils": "^3.21.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "5.59.7",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.7.tgz",
+ "integrity": "sha512-yCX9WpdQKaLufz5luG4aJbOpdXf/fjwGMcLFXZVPUz3QqLirG5QcwwnIHNf8cjLjxK4qtzTO8udUtMQSAToQnQ==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@types/json-schema": "^7.0.9",
+ "@types/semver": "^7.3.12",
+ "@typescript-eslint/scope-manager": "5.59.7",
+ "@typescript-eslint/types": "5.59.7",
+ "@typescript-eslint/typescript-estree": "5.59.7",
+ "eslint-scope": "^5.1.1",
+ "semver": "^7.3.7"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "5.59.7",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.7.tgz",
+ "integrity": "sha512-tyN+X2jvMslUszIiYbF0ZleP+RqQsFVpGrKI6e0Eet1w8WmhsAtmzaqm8oM8WJQ1ysLwhnsK/4hYHJjOgJVfQQ==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "5.59.7",
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@vitejs/plugin-react": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.0.0.tgz",
+ "integrity": "sha512-HX0XzMjL3hhOYm+0s95pb0Z7F8O81G7joUHgfDd/9J/ZZf5k4xX6QAMFkKsHFxaHlf6X7GD7+XuaZ66ULiJuhQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/core": "^7.21.4",
+ "@babel/plugin-transform-react-jsx-self": "^7.21.0",
+ "@babel/plugin-transform-react-jsx-source": "^7.19.6",
+ "react-refresh": "^0.14.0"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "vite": "^4.2.0"
+ }
+ },
+ "node_modules/@vitest/coverage-c8": {
+ "version": "0.31.1",
+ "resolved": "https://registry.npmjs.org/@vitest/coverage-c8/-/coverage-c8-0.31.1.tgz",
+ "integrity": "sha512-6TkjQpmgYez7e3dbAUoYdRXxWN81BojCmUILJwgCy39uZFG33DsQ0rSRSZC9beAEdCZTpxR63nOvd9hxDQcJ0g==",
+ "dev": true,
+ "dependencies": {
+ "@ampproject/remapping": "^2.2.1",
+ "c8": "^7.13.0",
+ "magic-string": "^0.30.0",
+ "picocolors": "^1.0.0",
+ "std-env": "^3.3.2"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ },
+ "peerDependencies": {
+ "vitest": ">=0.30.0 <1"
+ }
+ },
+ "node_modules/@vitest/coverage-istanbul": {
+ "version": "0.31.1",
+ "resolved": "https://registry.npmjs.org/@vitest/coverage-istanbul/-/coverage-istanbul-0.31.1.tgz",
+ "integrity": "sha512-wLVROukTxWflIub4QUT5TenA2zx2ypUjRp636yiMTidN5hvRhnUNEEkRavJMEpYuWYYMN23E7EmAxo/MzRRmIA==",
+ "dev": true,
+ "dependencies": {
+ "istanbul-lib-coverage": "^3.2.0",
+ "istanbul-lib-instrument": "^5.2.1",
+ "istanbul-lib-report": "^3.0.0",
+ "istanbul-lib-source-maps": "^4.0.1",
+ "istanbul-reports": "^3.1.5",
+ "test-exclude": "^6.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ },
+ "peerDependencies": {
+ "vitest": ">=0.30.0 <1"
+ }
+ },
+ "node_modules/@vitest/expect": {
+ "version": "0.31.1",
+ "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.31.1.tgz",
+ "integrity": "sha512-BV1LyNvhnX+eNYzJxlHIGPWZpwJFZaCcOIzp2CNG0P+bbetenTupk6EO0LANm4QFt0TTit+yqx7Rxd1qxi/SQA==",
+ "dev": true,
+ "dependencies": {
+ "@vitest/spy": "0.31.1",
+ "@vitest/utils": "0.31.1",
+ "chai": "^4.3.7"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/runner": {
+ "version": "0.31.1",
+ "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.31.1.tgz",
+ "integrity": "sha512-imWuc82ngOtxdCUpXwtEzZIuc1KMr+VlQ3Ondph45VhWoQWit5yvG/fFcldbnCi8DUuFi+NmNx5ehMUw/cGLUw==",
+ "dev": true,
+ "dependencies": {
+ "@vitest/utils": "0.31.1",
+ "concordance": "^5.0.4",
+ "p-limit": "^4.0.0",
+ "pathe": "^1.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/runner/node_modules/p-limit": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz",
+ "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==",
+ "dev": true,
+ "dependencies": {
+ "yocto-queue": "^1.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@vitest/runner/node_modules/yocto-queue": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz",
+ "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@vitest/snapshot": {
+ "version": "0.31.1",
+ "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-0.31.1.tgz",
+ "integrity": "sha512-L3w5uU9bMe6asrNzJ8WZzN+jUTX4KSgCinEJPXyny0o90fG4FPQMV0OWsq7vrCWfQlAilMjDnOF9nP8lidsJ+g==",
+ "dev": true,
+ "dependencies": {
+ "magic-string": "^0.30.0",
+ "pathe": "^1.1.0",
+ "pretty-format": "^27.5.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/spy": {
+ "version": "0.31.1",
+ "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.31.1.tgz",
+ "integrity": "sha512-1cTpt2m9mdo3hRLDyCG2hDQvRrePTDgEJBFQQNz1ydHHZy03EiA6EpFxY+7ODaY7vMRCie+WlFZBZ0/dQWyssQ==",
+ "dev": true,
+ "dependencies": {
+ "tinyspy": "^2.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/utils": {
+ "version": "0.31.1",
+ "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.31.1.tgz",
+ "integrity": "sha512-yFyRD5ilwojsZfo3E0BnH72pSVSuLg2356cN1tCEe/0RtDzxTPYwOomIC+eQbot7m6DRy4tPZw+09mB7NkbMmA==",
+ "dev": true,
+ "dependencies": {
+ "concordance": "^5.0.4",
+ "loupe": "^2.3.6",
+ "pretty-format": "^27.5.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@walletconnect/browser-utils": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/@walletconnect/browser-utils/-/browser-utils-1.8.0.tgz",
+ "integrity": "sha512-Wcqqx+wjxIo9fv6eBUFHPsW1y/bGWWRboni5dfD8PtOmrihrEpOCmvRJe4rfl7xgJW8Ea9UqKEaq0bIRLHlK4A==",
+ "dependencies": {
+ "@walletconnect/safe-json": "1.0.0",
+ "@walletconnect/types": "^1.8.0",
+ "@walletconnect/window-getters": "1.0.0",
+ "@walletconnect/window-metadata": "1.0.0",
+ "detect-browser": "5.2.0"
+ }
+ },
+ "node_modules/@walletconnect/core": {
+ "version": "2.9.2",
+ "resolved": "https://registry.npmjs.org/@walletconnect/core/-/core-2.9.2.tgz",
+ "integrity": "sha512-VARMPAx8sIgodeyngDHbealP3B621PQqjqKsByFUTOep8ZI1/R/20zU+cmq6j9RCrL+kLKZcrZqeVzs8Z7OlqQ==",
+ "dependencies": {
+ "@walletconnect/heartbeat": "1.2.1",
+ "@walletconnect/jsonrpc-provider": "1.0.13",
+ "@walletconnect/jsonrpc-types": "1.0.3",
+ "@walletconnect/jsonrpc-utils": "1.0.8",
+ "@walletconnect/jsonrpc-ws-connection": "1.0.13",
+ "@walletconnect/keyvaluestorage": "^1.0.2",
+ "@walletconnect/logger": "^2.0.1",
+ "@walletconnect/relay-api": "^1.0.9",
+ "@walletconnect/relay-auth": "^1.0.4",
+ "@walletconnect/safe-json": "^1.0.2",
+ "@walletconnect/time": "^1.0.2",
+ "@walletconnect/types": "2.9.2",
+ "@walletconnect/utils": "2.9.2",
+ "events": "^3.3.0",
+ "lodash.isequal": "4.5.0",
+ "uint8arrays": "^3.1.0"
+ }
+ },
+ "node_modules/@walletconnect/core/node_modules/@walletconnect/safe-json": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@walletconnect/safe-json/-/safe-json-1.0.2.tgz",
+ "integrity": "sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA==",
+ "dependencies": {
+ "tslib": "1.14.1"
+ }
+ },
+ "node_modules/@walletconnect/core/node_modules/@walletconnect/types": {
+ "version": "2.9.2",
+ "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-2.9.2.tgz",
+ "integrity": "sha512-7Rdn30amnJEEal4hk83cdwHUuxI1SWQ+K7fFFHBMqkuHLGi3tpMY6kpyfDxnUScYEZXqgRps4Jo5qQgnRqVM7A==",
+ "dependencies": {
+ "@walletconnect/events": "^1.0.1",
+ "@walletconnect/heartbeat": "1.2.1",
+ "@walletconnect/jsonrpc-types": "1.0.3",
+ "@walletconnect/keyvaluestorage": "^1.0.2",
+ "@walletconnect/logger": "^2.0.1",
+ "events": "^3.3.0"
+ }
+ },
+ "node_modules/@walletconnect/environment": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@walletconnect/environment/-/environment-1.0.1.tgz",
+ "integrity": "sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg==",
+ "dependencies": {
+ "tslib": "1.14.1"
+ }
+ },
+ "node_modules/@walletconnect/events": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@walletconnect/events/-/events-1.0.1.tgz",
+ "integrity": "sha512-NPTqaoi0oPBVNuLv7qPaJazmGHs5JGyO8eEAk5VGKmJzDR7AHzD4k6ilox5kxk1iwiOnFopBOOMLs86Oa76HpQ==",
+ "dependencies": {
+ "keyvaluestorage-interface": "^1.0.0",
+ "tslib": "1.14.1"
+ }
+ },
+ "node_modules/@walletconnect/heartbeat": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@walletconnect/heartbeat/-/heartbeat-1.2.1.tgz",
+ "integrity": "sha512-yVzws616xsDLJxuG/28FqtZ5rzrTA4gUjdEMTbWB5Y8V1XHRmqq4efAxCw5ie7WjbXFSUyBHaWlMR+2/CpQC5Q==",
+ "dependencies": {
+ "@walletconnect/events": "^1.0.1",
+ "@walletconnect/time": "^1.0.2",
+ "tslib": "1.14.1"
+ }
+ },
+ "node_modules/@walletconnect/jsonrpc-provider": {
+ "version": "1.0.13",
+ "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-provider/-/jsonrpc-provider-1.0.13.tgz",
+ "integrity": "sha512-K73EpThqHnSR26gOyNEL+acEex3P7VWZe6KE12ZwKzAt2H4e5gldZHbjsu2QR9cLeJ8AXuO7kEMOIcRv1QEc7g==",
+ "dependencies": {
+ "@walletconnect/jsonrpc-utils": "^1.0.8",
+ "@walletconnect/safe-json": "^1.0.2",
+ "tslib": "1.14.1"
+ }
+ },
+ "node_modules/@walletconnect/jsonrpc-provider/node_modules/@walletconnect/safe-json": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@walletconnect/safe-json/-/safe-json-1.0.2.tgz",
+ "integrity": "sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA==",
+ "dependencies": {
+ "tslib": "1.14.1"
+ }
+ },
+ "node_modules/@walletconnect/jsonrpc-types": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.3.tgz",
+ "integrity": "sha512-iIQ8hboBl3o5ufmJ8cuduGad0CQm3ZlsHtujv9Eu16xq89q+BG7Nh5VLxxUgmtpnrePgFkTwXirCTkwJH1v+Yw==",
+ "dependencies": {
+ "keyvaluestorage-interface": "^1.0.0",
+ "tslib": "1.14.1"
+ }
+ },
+ "node_modules/@walletconnect/jsonrpc-utils": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.8.tgz",
+ "integrity": "sha512-vdeb03bD8VzJUL6ZtzRYsFMq1eZQcM3EAzT0a3st59dyLfJ0wq+tKMpmGH7HlB7waD858UWgfIcudbPFsbzVdw==",
+ "dependencies": {
+ "@walletconnect/environment": "^1.0.1",
+ "@walletconnect/jsonrpc-types": "^1.0.3",
+ "tslib": "1.14.1"
+ }
+ },
+ "node_modules/@walletconnect/jsonrpc-ws-connection": {
+ "version": "1.0.13",
+ "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-ws-connection/-/jsonrpc-ws-connection-1.0.13.tgz",
+ "integrity": "sha512-mfOM7uFH4lGtQxG+XklYuFBj6dwVvseTt5/ahOkkmpcAEgz2umuzu7fTR+h5EmjQBdrmYyEBOWADbeaFNxdySg==",
+ "dependencies": {
+ "@walletconnect/jsonrpc-utils": "^1.0.6",
+ "@walletconnect/safe-json": "^1.0.2",
+ "events": "^3.3.0",
+ "tslib": "1.14.1",
+ "ws": "^7.5.1"
+ }
+ },
+ "node_modules/@walletconnect/jsonrpc-ws-connection/node_modules/@walletconnect/safe-json": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@walletconnect/safe-json/-/safe-json-1.0.2.tgz",
+ "integrity": "sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA==",
+ "dependencies": {
+ "tslib": "1.14.1"
+ }
+ },
+ "node_modules/@walletconnect/keyvaluestorage": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.0.2.tgz",
+ "integrity": "sha512-U/nNG+VLWoPFdwwKx0oliT4ziKQCEoQ27L5Hhw8YOFGA2Po9A9pULUYNWhDgHkrb0gYDNt//X7wABcEWWBd3FQ==",
+ "dependencies": {
+ "safe-json-utils": "^1.1.1",
+ "tslib": "1.14.1"
+ },
+ "peerDependencies": {
+ "@react-native-async-storage/async-storage": "1.x",
+ "lokijs": "1.x"
+ },
+ "peerDependenciesMeta": {
+ "@react-native-async-storage/async-storage": {
+ "optional": true
+ },
+ "lokijs": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@walletconnect/logger": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@walletconnect/logger/-/logger-2.0.1.tgz",
+ "integrity": "sha512-SsTKdsgWm+oDTBeNE/zHxxr5eJfZmE9/5yp/Ku+zJtcTAjELb3DXueWkDXmE9h8uHIbJzIb5wj5lPdzyrjT6hQ==",
+ "dependencies": {
+ "pino": "7.11.0",
+ "tslib": "1.14.1"
+ }
+ },
+ "node_modules/@walletconnect/mobile-registry": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@walletconnect/mobile-registry/-/mobile-registry-1.4.0.tgz",
+ "integrity": "sha512-ZtKRio4uCZ1JUF7LIdecmZt7FOLnX72RPSY7aUVu7mj7CSfxDwUn6gBuK6WGtH+NZCldBqDl5DenI5fFSvkKYw==",
+ "deprecated": "Deprecated in favor of dynamic registry available from: https://github.com/walletconnect/walletconnect-registry"
+ },
+ "node_modules/@walletconnect/qrcode-modal": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/@walletconnect/qrcode-modal/-/qrcode-modal-1.8.0.tgz",
+ "integrity": "sha512-BueaFefaAi8mawE45eUtztg3ZFbsAH4DDXh1UNwdUlsvFMjqcYzLUG0xZvDd6z2eOpbgDg2N3bl6gF0KONj1dg==",
+ "deprecated": "WalletConnect's v1 SDKs are now deprecated. Please upgrade to a v2 SDK. For details see: https://docs.walletconnect.com/",
+ "dependencies": {
+ "@walletconnect/browser-utils": "^1.8.0",
+ "@walletconnect/mobile-registry": "^1.4.0",
+ "@walletconnect/types": "^1.8.0",
+ "copy-to-clipboard": "^3.3.1",
+ "preact": "10.4.1",
+ "qrcode": "1.4.4"
+ }
+ },
+ "node_modules/@walletconnect/relay-api": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/@walletconnect/relay-api/-/relay-api-1.0.9.tgz",
+ "integrity": "sha512-Q3+rylJOqRkO1D9Su0DPE3mmznbAalYapJ9qmzDgK28mYF9alcP3UwG/og5V7l7CFOqzCLi7B8BvcBUrpDj0Rg==",
+ "dependencies": {
+ "@walletconnect/jsonrpc-types": "^1.0.2",
+ "tslib": "1.14.1"
+ }
+ },
+ "node_modules/@walletconnect/relay-auth": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@walletconnect/relay-auth/-/relay-auth-1.0.4.tgz",
+ "integrity": "sha512-kKJcS6+WxYq5kshpPaxGHdwf5y98ZwbfuS4EE/NkQzqrDFm5Cj+dP8LofzWvjrrLkZq7Afy7WrQMXdLy8Sx7HQ==",
+ "dependencies": {
+ "@stablelib/ed25519": "^1.0.2",
+ "@stablelib/random": "^1.0.1",
+ "@walletconnect/safe-json": "^1.0.1",
+ "@walletconnect/time": "^1.0.2",
+ "tslib": "1.14.1",
+ "uint8arrays": "^3.0.0"
+ }
+ },
+ "node_modules/@walletconnect/relay-auth/node_modules/@walletconnect/safe-json": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@walletconnect/safe-json/-/safe-json-1.0.2.tgz",
+ "integrity": "sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA==",
+ "dependencies": {
+ "tslib": "1.14.1"
+ }
+ },
+ "node_modules/@walletconnect/safe-json": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@walletconnect/safe-json/-/safe-json-1.0.0.tgz",
+ "integrity": "sha512-QJzp/S/86sUAgWY6eh5MKYmSfZaRpIlmCJdi5uG4DJlKkZrHEF7ye7gA+VtbVzvTtpM/gRwO2plQuiooIeXjfg=="
+ },
+ "node_modules/@walletconnect/sign-client": {
+ "version": "2.9.2",
+ "resolved": "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.9.2.tgz",
+ "integrity": "sha512-anRwnXKlR08lYllFMEarS01hp1gr6Q9XUgvacr749hoaC/AwGVlxYFdM8+MyYr3ozlA+2i599kjbK/mAebqdXg==",
+ "dependencies": {
+ "@walletconnect/core": "2.9.2",
+ "@walletconnect/events": "^1.0.1",
+ "@walletconnect/heartbeat": "1.2.1",
+ "@walletconnect/jsonrpc-utils": "1.0.8",
+ "@walletconnect/logger": "^2.0.1",
+ "@walletconnect/time": "^1.0.2",
+ "@walletconnect/types": "2.9.2",
+ "@walletconnect/utils": "2.9.2",
+ "events": "^3.3.0"
+ }
+ },
+ "node_modules/@walletconnect/sign-client/node_modules/@walletconnect/types": {
+ "version": "2.9.2",
+ "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-2.9.2.tgz",
+ "integrity": "sha512-7Rdn30amnJEEal4hk83cdwHUuxI1SWQ+K7fFFHBMqkuHLGi3tpMY6kpyfDxnUScYEZXqgRps4Jo5qQgnRqVM7A==",
+ "dependencies": {
+ "@walletconnect/events": "^1.0.1",
+ "@walletconnect/heartbeat": "1.2.1",
+ "@walletconnect/jsonrpc-types": "1.0.3",
+ "@walletconnect/keyvaluestorage": "^1.0.2",
+ "@walletconnect/logger": "^2.0.1",
+ "events": "^3.3.0"
+ }
+ },
+ "node_modules/@walletconnect/time": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@walletconnect/time/-/time-1.0.2.tgz",
+ "integrity": "sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g==",
+ "dependencies": {
+ "tslib": "1.14.1"
+ }
+ },
+ "node_modules/@walletconnect/types": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-1.8.0.tgz",
+ "integrity": "sha512-Cn+3I0V0vT9ghMuzh1KzZvCkiAxTq+1TR2eSqw5E5AVWfmCtECFkVZBP6uUJZ8YjwLqXheI+rnjqPy7sVM4Fyg==",
+ "deprecated": "WalletConnect's v1 SDKs are now deprecated. Please upgrade to a v2 SDK. For details see: https://docs.walletconnect.com/"
+ },
+ "node_modules/@walletconnect/utils": {
+ "version": "2.9.2",
+ "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.9.2.tgz",
+ "integrity": "sha512-D44hwXET/8JhhIjqljY6qxSu7xXnlPrf63UN/Qfl98vDjWlYVcDl2+JIQRxD9GPastw0S8XZXdRq59XDXLuZBg==",
+ "dependencies": {
+ "@stablelib/chacha20poly1305": "1.0.1",
+ "@stablelib/hkdf": "1.0.1",
+ "@stablelib/random": "^1.0.2",
+ "@stablelib/sha256": "1.0.1",
+ "@stablelib/x25519": "^1.0.3",
+ "@walletconnect/relay-api": "^1.0.9",
+ "@walletconnect/safe-json": "^1.0.2",
+ "@walletconnect/time": "^1.0.2",
+ "@walletconnect/types": "2.9.2",
+ "@walletconnect/window-getters": "^1.0.1",
+ "@walletconnect/window-metadata": "^1.0.1",
+ "detect-browser": "5.3.0",
+ "query-string": "7.1.3",
+ "uint8arrays": "^3.1.0"
+ }
+ },
+ "node_modules/@walletconnect/utils/node_modules/@walletconnect/safe-json": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@walletconnect/safe-json/-/safe-json-1.0.2.tgz",
+ "integrity": "sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA==",
+ "dependencies": {
+ "tslib": "1.14.1"
+ }
+ },
+ "node_modules/@walletconnect/utils/node_modules/@walletconnect/types": {
+ "version": "2.9.2",
+ "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-2.9.2.tgz",
+ "integrity": "sha512-7Rdn30amnJEEal4hk83cdwHUuxI1SWQ+K7fFFHBMqkuHLGi3tpMY6kpyfDxnUScYEZXqgRps4Jo5qQgnRqVM7A==",
+ "dependencies": {
+ "@walletconnect/events": "^1.0.1",
+ "@walletconnect/heartbeat": "1.2.1",
+ "@walletconnect/jsonrpc-types": "1.0.3",
+ "@walletconnect/keyvaluestorage": "^1.0.2",
+ "@walletconnect/logger": "^2.0.1",
+ "events": "^3.3.0"
+ }
+ },
+ "node_modules/@walletconnect/utils/node_modules/@walletconnect/window-getters": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@walletconnect/window-getters/-/window-getters-1.0.1.tgz",
+ "integrity": "sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q==",
+ "dependencies": {
+ "tslib": "1.14.1"
+ }
+ },
+ "node_modules/@walletconnect/utils/node_modules/@walletconnect/window-metadata": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@walletconnect/window-metadata/-/window-metadata-1.0.1.tgz",
+ "integrity": "sha512-9koTqyGrM2cqFRW517BPY/iEtUDx2r1+Pwwu5m7sJ7ka79wi3EyqhqcICk/yDmv6jAS1rjKgTKXlEhanYjijcA==",
+ "dependencies": {
+ "@walletconnect/window-getters": "^1.0.1",
+ "tslib": "1.14.1"
+ }
+ },
+ "node_modules/@walletconnect/utils/node_modules/detect-browser": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/detect-browser/-/detect-browser-5.3.0.tgz",
+ "integrity": "sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w=="
+ },
+ "node_modules/@walletconnect/window-getters": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@walletconnect/window-getters/-/window-getters-1.0.0.tgz",
+ "integrity": "sha512-xB0SQsLaleIYIkSsl43vm8EwETpBzJ2gnzk7e0wMF3ktqiTGS6TFHxcprMl5R44KKh4tCcHCJwolMCaDSwtAaA=="
+ },
+ "node_modules/@walletconnect/window-metadata": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@walletconnect/window-metadata/-/window-metadata-1.0.0.tgz",
+ "integrity": "sha512-9eFvmJxIKCC3YWOL97SgRkKhlyGXkrHwamfechmqszbypFspaSk+t2jQXAEU7YClHF6Qjw5eYOmy1//zFi9/GA==",
+ "dependencies": {
+ "@walletconnect/window-getters": "^1.0.0"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.8.2",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz",
+ "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.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==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/any-promise": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+ "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
+ "dev": true
+ },
+ "node_modules/any-signal": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/any-signal/-/any-signal-3.0.1.tgz",
+ "integrity": "sha512-xgZgJtKEa9YmDqXodIgl7Fl1C8yNXr8w6gXjqK3LW4GcEiYT+6AQfJSE/8SPsEpLLmcvbv8YU+qet94UewHxqg=="
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dev": true,
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/arg": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
+ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
+ "dev": true
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "node_modules/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,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/assertion-error": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
+ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+ },
+ "node_modules/atomic-sleep": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz",
+ "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==",
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/autoprefixer": {
+ "version": "10.4.14",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz",
+ "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/autoprefixer"
+ }
+ ],
+ "dependencies": {
+ "browserslist": "^4.21.5",
+ "caniuse-lite": "^1.0.30001464",
+ "fraction.js": "^4.2.0",
+ "normalize-range": "^0.1.2",
+ "picocolors": "^1.0.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "bin": {
+ "autoprefixer": "bin/autoprefixer"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/axios": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz",
+ "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==",
+ "dependencies": {
+ "follow-redirects": "^1.15.0",
+ "form-data": "^4.0.0",
+ "proxy-from-env": "^1.1.0"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+ },
+ "node_modules/base-x": {
+ "version": "3.0.9",
+ "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz",
+ "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==",
+ "dependencies": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "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==",
+ "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==",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/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,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/blakejs": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz",
+ "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ=="
+ },
+ "node_modules/blob-to-it": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/blob-to-it/-/blob-to-it-2.0.3.tgz",
+ "integrity": "sha512-Z3CAVpJMwB9B/lp+hOGEyD+6Rx690v1EBj37Wf/eF7ltXZEu2ppd2H9w/FFNGlx36PW5tsoynTNt2HwkgNV9hw==",
+ "dependencies": {
+ "browser-readablestream-to-it": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/blueimp-md5": {
+ "version": "2.19.0",
+ "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.19.0.tgz",
+ "integrity": "sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==",
+ "dev": true
+ },
+ "node_modules/bn.js": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz",
+ "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ=="
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "dependencies": {
+ "fill-range": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/brorand": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
+ "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w=="
+ },
+ "node_modules/browser-readablestream-to-it": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/browser-readablestream-to-it/-/browser-readablestream-to-it-2.0.3.tgz",
+ "integrity": "sha512-kFLXH4FWJNZbbIEeqZMCYfVPQx6glf3e1mReo3bB3xbn1o/YWbHsYpxIGo2rfNsmPqv7I+Fg4qObvtvbAq4DbA==",
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/browserify-aes": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
+ "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
+ "dependencies": {
+ "buffer-xor": "^1.0.3",
+ "cipher-base": "^1.0.0",
+ "create-hash": "^1.1.0",
+ "evp_bytestokey": "^1.0.3",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.21.5",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz",
+ "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ }
+ ],
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001449",
+ "electron-to-chromium": "^1.4.284",
+ "node-releases": "^2.0.8",
+ "update-browserslist-db": "^1.0.10"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/bs58": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz",
+ "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==",
+ "dependencies": {
+ "base-x": "^3.0.2"
+ }
+ },
+ "node_modules/bs58check": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz",
+ "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==",
+ "dependencies": {
+ "bs58": "^4.0.0",
+ "create-hash": "^1.1.0",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "node_modules/buffer": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
+ "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
+ "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.2.1"
+ }
+ },
+ "node_modules/buffer-alloc": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz",
+ "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==",
+ "dependencies": {
+ "buffer-alloc-unsafe": "^1.1.0",
+ "buffer-fill": "^1.0.0"
+ }
+ },
+ "node_modules/buffer-alloc-unsafe": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz",
+ "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg=="
+ },
+ "node_modules/buffer-fill": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz",
+ "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ=="
+ },
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
+ },
+ "node_modules/buffer-reverse": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/buffer-reverse/-/buffer-reverse-1.0.1.tgz",
+ "integrity": "sha512-M87YIUBsZ6N924W57vDwT/aOu8hw7ZgdByz6ijksLjmHJELBASmYTTlNHRgjE+pTsT9oJXGaDSgqqwfdHotDUg=="
+ },
+ "node_modules/buffer-xor": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
+ "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ=="
+ },
+ "node_modules/busboy": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
+ "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
+ "dependencies": {
+ "streamsearch": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=10.16.0"
+ }
+ },
+ "node_modules/c8": {
+ "version": "7.13.0",
+ "resolved": "https://registry.npmjs.org/c8/-/c8-7.13.0.tgz",
+ "integrity": "sha512-/NL4hQTv1gBL6J6ei80zu3IiTrmePDKXKXOTLpHvcIWZTVYQlDhVWjjWvkhICylE8EwwnMVzDZugCvdx0/DIIA==",
+ "dev": true,
+ "dependencies": {
+ "@bcoe/v8-coverage": "^0.2.3",
+ "@istanbuljs/schema": "^0.1.3",
+ "find-up": "^5.0.0",
+ "foreground-child": "^2.0.0",
+ "istanbul-lib-coverage": "^3.2.0",
+ "istanbul-lib-report": "^3.0.0",
+ "istanbul-reports": "^3.1.4",
+ "rimraf": "^3.0.2",
+ "test-exclude": "^6.0.0",
+ "v8-to-istanbul": "^9.0.0",
+ "yargs": "^16.2.0",
+ "yargs-parser": "^20.2.9"
+ },
+ "bin": {
+ "c8": "bin/c8.js"
+ },
+ "engines": {
+ "node": ">=10.12.0"
+ }
+ },
+ "node_modules/c8/node_modules/cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "node_modules/c8/node_modules/yargs": {
+ "version": "16.2.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "dev": true,
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/c8/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/cac": {
+ "version": "6.7.14",
+ "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
+ "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camelcase-css": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
+ "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001489",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001489.tgz",
+ "integrity": "sha512-x1mgZEXK8jHIfAxm+xgdpHpk50IN3z3q3zP261/WS+uvePxW8izXuCu6AHz0lkuYTlATDehiZ/tNyYBdSQsOUQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ]
+ },
+ "node_modules/cborg": {
+ "version": "1.10.2",
+ "resolved": "https://registry.npmjs.org/cborg/-/cborg-1.10.2.tgz",
+ "integrity": "sha512-b3tFPA9pUr2zCUiCfRd2+wok2/LBSNUMKOuRRok+WlvvAgEt/PlbgPTsZUcwCOs53IJvLgTp0eotwtosE6njug==",
+ "bin": {
+ "cborg": "cli.js"
+ }
+ },
+ "node_modules/chai": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz",
+ "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==",
+ "dev": true,
+ "dependencies": {
+ "assertion-error": "^1.1.0",
+ "check-error": "^1.0.2",
+ "deep-eql": "^4.1.2",
+ "get-func-name": "^2.0.0",
+ "loupe": "^2.3.1",
+ "pathval": "^1.1.1",
+ "type-detect": "^4.0.5"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/check-error": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
+ "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.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"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/chokidar/node_modules/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,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/cipher-base": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
+ "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/classnames": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz",
+ "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw=="
+ },
+ "node_modules/cliui": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.1",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/commander": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
+ },
+ "node_modules/concordance": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/concordance/-/concordance-5.0.4.tgz",
+ "integrity": "sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==",
+ "dev": true,
+ "dependencies": {
+ "date-time": "^3.1.0",
+ "esutils": "^2.0.3",
+ "fast-diff": "^1.2.0",
+ "js-string-escape": "^1.0.1",
+ "lodash": "^4.17.15",
+ "md5-hex": "^3.0.1",
+ "semver": "^7.3.2",
+ "well-known-symbols": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10.18.0 <11 || >=12.14.0 <13 || >=14"
+ }
+ },
+ "node_modules/convert-source-map": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
+ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
+ "dev": true
+ },
+ "node_modules/copy-to-clipboard": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz",
+ "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==",
+ "dependencies": {
+ "toggle-selection": "^1.0.6"
+ }
+ },
+ "node_modules/create-hash": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
+ "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
+ "dependencies": {
+ "cipher-base": "^1.0.1",
+ "inherits": "^2.0.1",
+ "md5.js": "^1.3.4",
+ "ripemd160": "^2.0.1",
+ "sha.js": "^2.4.0"
+ }
+ },
+ "node_modules/create-hmac": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
+ "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
+ "dependencies": {
+ "cipher-base": "^1.0.3",
+ "create-hash": "^1.1.0",
+ "inherits": "^2.0.1",
+ "ripemd160": "^2.0.0",
+ "safe-buffer": "^5.0.1",
+ "sha.js": "^2.4.8"
+ }
+ },
+ "node_modules/cross-fetch": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz",
+ "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==",
+ "dependencies": {
+ "node-fetch": "2.6.7"
+ }
+ },
+ "node_modules/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,
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/crypto-js": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.3.0.tgz",
+ "integrity": "sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q=="
+ },
+ "node_modules/cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "dev": true,
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/csstype": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz",
+ "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==",
+ "dev": true
+ },
+ "node_modules/dag-jose": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/dag-jose/-/dag-jose-4.0.0.tgz",
+ "integrity": "sha512-tw595L3UYoOUT9dSJPbBEG/qpRpw24kRZxa5SLRnlnr+g5L7O8oEs1d3W5TiVA1oJZbthVsf0Vi3zFN66qcEBA==",
+ "dependencies": {
+ "@ipld/dag-cbor": "^9.0.0",
+ "multiformats": "^11.0.0"
+ }
+ },
+ "node_modules/dag-jose/node_modules/multiformats": {
+ "version": "11.0.2",
+ "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-11.0.2.tgz",
+ "integrity": "sha512-b5mYMkOkARIuVZCpvijFj9a6m5wMVLC7cf/jIPd5D/ARDOfLC5+IFkbgDXQgcU2goIsTD/O9NY4DI/Mt4OGvlg==",
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/date-time": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/date-time/-/date-time-3.1.0.tgz",
+ "integrity": "sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==",
+ "dev": true,
+ "dependencies": {
+ "time-zone": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/decode-uri-component": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz",
+ "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==",
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/deep-eql": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz",
+ "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==",
+ "dev": true,
+ "dependencies": {
+ "type-detect": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/detect-browser": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/detect-browser/-/detect-browser-5.2.0.tgz",
+ "integrity": "sha512-tr7XntDAu50BVENgQfajMLzacmSe34D+qZc4zjnniz0ZVuw/TZcLcyxHQjYpJTM36sGEkZZlYLnIM1hH7alTMA=="
+ },
+ "node_modules/didyoumean": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
+ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
+ "dev": true
+ },
+ "node_modules/dijkstrajs": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.3.tgz",
+ "integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA=="
+ },
+ "node_modules/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,
+ "dependencies": {
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/dlv": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
+ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
+ "dev": true
+ },
+ "node_modules/dns-over-http-resolver": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/dns-over-http-resolver/-/dns-over-http-resolver-2.1.1.tgz",
+ "integrity": "sha512-Lm/eXB7yAQLJ5WxlBGwYfBY7utduXPZykcSmcG6K7ozM0wrZFvxZavhT6PqI0kd/5CUTfev/RrEFQqyU4CGPew==",
+ "dependencies": {
+ "debug": "^4.3.1",
+ "native-fetch": "^4.0.2",
+ "receptacle": "^1.3.2",
+ "undici": "^5.12.0"
+ },
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/duplexify": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz",
+ "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==",
+ "dependencies": {
+ "end-of-stream": "^1.4.1",
+ "inherits": "^2.0.3",
+ "readable-stream": "^3.1.1",
+ "stream-shift": "^1.0.0"
+ }
+ },
+ "node_modules/electron-fetch": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/electron-fetch/-/electron-fetch-1.9.1.tgz",
+ "integrity": "sha512-M9qw6oUILGVrcENMSRRefE1MbHPIz0h79EKIeJWK9v563aT9Qkh8aEHPO1H5vi970wPirNY+jO9OpFoLiMsMGA==",
+ "dependencies": {
+ "encoding": "^0.1.13"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.4.405",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.405.tgz",
+ "integrity": "sha512-JdDgnwU69FMZURoesf9gNOej2Cms1XJFfLk24y1IBtnAdhTcJY/mXnokmpmxHN59PcykBP4bgUU98vLY44Lhuw==",
+ "dev": true
+ },
+ "node_modules/elliptic": {
+ "version": "6.5.4",
+ "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz",
+ "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==",
+ "dependencies": {
+ "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"
+ }
+ },
+ "node_modules/elliptic/node_modules/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=="
+ },
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+ },
+ "node_modules/encoding": {
+ "version": "0.1.13",
+ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
+ "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
+ "dependencies": {
+ "iconv-lite": "^0.6.2"
+ }
+ },
+ "node_modules/end-of-stream": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+ "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+ "dependencies": {
+ "once": "^1.4.0"
+ }
+ },
+ "node_modules/err-code": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/err-code/-/err-code-3.0.1.tgz",
+ "integrity": "sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA=="
+ },
+ "node_modules/esbuild": {
+ "version": "0.17.19",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz",
+ "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==",
+ "hasInstallScript": true,
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "@esbuild/android-arm": "0.17.19",
+ "@esbuild/android-arm64": "0.17.19",
+ "@esbuild/android-x64": "0.17.19",
+ "@esbuild/darwin-arm64": "0.17.19",
+ "@esbuild/darwin-x64": "0.17.19",
+ "@esbuild/freebsd-arm64": "0.17.19",
+ "@esbuild/freebsd-x64": "0.17.19",
+ "@esbuild/linux-arm": "0.17.19",
+ "@esbuild/linux-arm64": "0.17.19",
+ "@esbuild/linux-ia32": "0.17.19",
+ "@esbuild/linux-loong64": "0.17.19",
+ "@esbuild/linux-mips64el": "0.17.19",
+ "@esbuild/linux-ppc64": "0.17.19",
+ "@esbuild/linux-riscv64": "0.17.19",
+ "@esbuild/linux-s390x": "0.17.19",
+ "@esbuild/linux-x64": "0.17.19",
+ "@esbuild/netbsd-x64": "0.17.19",
+ "@esbuild/openbsd-x64": "0.17.19",
+ "@esbuild/sunos-x64": "0.17.19",
+ "@esbuild/win32-arm64": "0.17.19",
+ "@esbuild/win32-ia32": "0.17.19",
+ "@esbuild/win32-x64": "0.17.19"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "8.41.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.41.0.tgz",
+ "integrity": "sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.4.0",
+ "@eslint/eslintrc": "^2.0.3",
+ "@eslint/js": "8.41.0",
+ "@humanwhocodes/config-array": "^0.11.8",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@nodelib/fs.walk": "^1.2.8",
+ "ajv": "^6.10.0",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
+ "doctrine": "^3.0.0",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^7.2.0",
+ "eslint-visitor-keys": "^3.4.1",
+ "espree": "^9.5.2",
+ "esquery": "^1.4.2",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "globals": "^13.19.0",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.0.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "is-path-inside": "^3.0.3",
+ "js-yaml": "^4.1.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.1",
+ "strip-ansi": "^6.0.1",
+ "strip-json-comments": "^3.1.0",
+ "text-table": "^0.2.0"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-plugin-react-hooks": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz",
+ "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0"
+ }
+ },
+ "node_modules/eslint-plugin-react-refresh": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.3.5.tgz",
+ "integrity": "sha512-61qNIsc7fo9Pp/mju0J83kzvLm0Bsayu7OQSLEoJxLDCBjIIyb87bkzufoOvdDxLkSlMfkF7UxomC4+eztUBSA==",
+ "dev": true,
+ "peerDependencies": {
+ "eslint": ">=7"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "3.4.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz",
+ "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint/node_modules/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,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/eslint/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/eslint/node_modules/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,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/eslint/node_modules/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
+ },
+ "node_modules/eslint/node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/eslint-scope": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz",
+ "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint/node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/eslint/node_modules/globals": {
+ "version": "13.20.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
+ "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/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,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint/node_modules/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,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/espree": {
+ "version": "9.5.2",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz",
+ "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.8.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.4.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
+ "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esquery/node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esrecurse/node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ethereum-bloom-filters": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz",
+ "integrity": "sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==",
+ "dependencies": {
+ "js-sha3": "^0.8.0"
+ }
+ },
+ "node_modules/ethereum-cryptography": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz",
+ "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==",
+ "dependencies": {
+ "@types/pbkdf2": "^3.0.0",
+ "@types/secp256k1": "^4.0.1",
+ "blakejs": "^1.1.0",
+ "browserify-aes": "^1.2.0",
+ "bs58check": "^2.1.2",
+ "create-hash": "^1.2.0",
+ "create-hmac": "^1.1.7",
+ "hash.js": "^1.1.7",
+ "keccak": "^3.0.0",
+ "pbkdf2": "^3.0.17",
+ "randombytes": "^2.1.0",
+ "safe-buffer": "^5.1.2",
+ "scrypt-js": "^3.0.0",
+ "secp256k1": "^4.0.1",
+ "setimmediate": "^1.0.5"
+ }
+ },
+ "node_modules/ethereumjs-util": {
+ "version": "7.1.5",
+ "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz",
+ "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==",
+ "dependencies": {
+ "@types/bn.js": "^5.1.0",
+ "bn.js": "^5.1.2",
+ "create-hash": "^1.1.2",
+ "ethereum-cryptography": "^0.1.3",
+ "rlp": "^2.2.4"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/ethjs-unit": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz",
+ "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==",
+ "dependencies": {
+ "bn.js": "4.11.6",
+ "number-to-bn": "1.7.0"
+ },
+ "engines": {
+ "node": ">=6.5.0",
+ "npm": ">=3"
+ }
+ },
+ "node_modules/ethjs-unit/node_modules/bn.js": {
+ "version": "4.11.6",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz",
+ "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA=="
+ },
+ "node_modules/events": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
+ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+ "engines": {
+ "node": ">=0.8.x"
+ }
+ },
+ "node_modules/evp_bytestokey": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
+ "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
+ "dependencies": {
+ "md5.js": "^1.3.4",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
+ },
+ "node_modules/fast-diff": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz",
+ "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==",
+ "dev": true
+ },
+ "node_modules/fast-fifo": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.2.0.tgz",
+ "integrity": "sha512-NcvQXt7Cky1cNau15FWy64IjuO8X0JijhTBBrJj1YlxlDfRkJXNaK9RFUjwpfDPzMdv7wB38jr53l9tkNLxnWg=="
+ },
+ "node_modules/fast-glob": {
+ "version": "3.2.12",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz",
+ "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==",
+ "dev": true,
+ "dependencies": {
+ "@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"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-glob/node_modules/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,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true
+ },
+ "node_modules/fast-redact": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.3.0.tgz",
+ "integrity": "sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/fastq": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
+ "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
+ "dev": true,
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "dev": true,
+ "dependencies": {
+ "flat-cache": "^3.0.4"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/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,
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/filter-obj": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz",
+ "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+ "dev": true,
+ "dependencies": {
+ "flatted": "^3.1.0",
+ "rimraf": "^3.0.2"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz",
+ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==",
+ "dev": true
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.15.2",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
+ "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/foreground-child": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz",
+ "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==",
+ "dev": true,
+ "dependencies": {
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/form-data": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+ "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fraction.js": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz",
+ "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "type": "patreon",
+ "url": "https://www.patreon.com/infusion"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "dev": true
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+ "dev": true
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/get-func-name": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
+ "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/get-iterator": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/get-iterator/-/get-iterator-1.0.2.tgz",
+ "integrity": "sha512-v+dm9bNVfOYsY1OrhaCrmyOcYoSeVvbt+hHZ0Au+T+p1y+0Uyj9aMaGIeUTT6xdpRbWzDeYKvfOslPhggQMcsg=="
+ },
+ "node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "dev": true,
+ "dependencies": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/globrex": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz",
+ "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==",
+ "dev": true
+ },
+ "node_modules/grapheme-splitter": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz",
+ "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==",
+ "dev": true
+ },
+ "node_modules/graphemer": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+ "dev": true
+ },
+ "node_modules/has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/hash-base": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz",
+ "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==",
+ "dependencies": {
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.6.0",
+ "safe-buffer": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/hash.js": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
+ "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "minimalistic-assert": "^1.0.1"
+ }
+ },
+ "node_modules/hmac-drbg": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
+ "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==",
+ "dependencies": {
+ "hash.js": "^1.0.3",
+ "minimalistic-assert": "^1.0.0",
+ "minimalistic-crypto-utils": "^1.0.1"
+ }
+ },
+ "node_modules/html-escaper": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
+ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
+ "dev": true
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "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/ignore": {
+ "version": "5.2.4",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
+ "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "dev": true,
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "dev": true,
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "node_modules/interface-datastore": {
+ "version": "8.2.3",
+ "resolved": "https://registry.npmjs.org/interface-datastore/-/interface-datastore-8.2.3.tgz",
+ "integrity": "sha512-5U6BfK7cR4oSngm4pqYZBBAX7tpLI4YCOa3Ifz/EJEaEV2mmlloH5qP8ADWCVFk6vP1MPT925JJkt3kFIi7iWQ==",
+ "dependencies": {
+ "interface-store": "^5.0.0",
+ "nanoid": "^4.0.0",
+ "uint8arrays": "^4.0.2"
+ },
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/interface-datastore/node_modules/multiformats": {
+ "version": "11.0.2",
+ "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-11.0.2.tgz",
+ "integrity": "sha512-b5mYMkOkARIuVZCpvijFj9a6m5wMVLC7cf/jIPd5D/ARDOfLC5+IFkbgDXQgcU2goIsTD/O9NY4DI/Mt4OGvlg==",
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/interface-datastore/node_modules/nanoid": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.2.tgz",
+ "integrity": "sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "bin": {
+ "nanoid": "bin/nanoid.js"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18"
+ }
+ },
+ "node_modules/interface-datastore/node_modules/uint8arrays": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-4.0.4.tgz",
+ "integrity": "sha512-AOoA66e/A7zoXm1mgzQjGmkWDTvCrS3ttWXLHFtlVAwMobLcaOA7G7WRNNAcyfjjYdFDtkEK6njRDX7hZLIO9Q==",
+ "dependencies": {
+ "multiformats": "^11.0.0"
+ }
+ },
+ "node_modules/interface-store": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/interface-store/-/interface-store-5.1.2.tgz",
+ "integrity": "sha512-q2sLoqC+UdaWnjwGyghsH0jwqqVk226lsG207e3QwPB8sAZYmYIWUnJwJH3JjFNNRV9e6CUTmm+gDO0Xg4KRiw==",
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/ipfs-core-types": {
+ "version": "0.14.1",
+ "resolved": "https://registry.npmjs.org/ipfs-core-types/-/ipfs-core-types-0.14.1.tgz",
+ "integrity": "sha512-4ujF8NlM9bYi2I6AIqPP9wfGGX0x/gRCkMoFdOQfxxrFg6HcAdfS+0/irK8mp4e7znOHWReOHeWqCGw+dAPwsw==",
+ "deprecated": "js-IPFS has been deprecated in favour of Helia - please see https://github.com/ipfs/js-ipfs/issues/4336 for details",
+ "dependencies": {
+ "@ipld/dag-pb": "^4.0.0",
+ "@libp2p/interface-keychain": "^2.0.0",
+ "@libp2p/interface-peer-id": "^2.0.0",
+ "@libp2p/interface-peer-info": "^1.0.2",
+ "@libp2p/interface-pubsub": "^3.0.0",
+ "@multiformats/multiaddr": "^11.1.5",
+ "@types/node": "^18.0.0",
+ "interface-datastore": "^7.0.0",
+ "ipfs-unixfs": "^9.0.0",
+ "multiformats": "^11.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/ipfs-core-types/node_modules/@types/node": {
+ "version": "18.16.16",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.16.tgz",
+ "integrity": "sha512-NpaM49IGQQAUlBhHMF82QH80J08os4ZmyF9MkpCzWAGuOHqE4gTEbhzd7L3l5LmWuZ6E0OiC1FweQ4tsiW35+g=="
+ },
+ "node_modules/ipfs-core-types/node_modules/interface-datastore": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/interface-datastore/-/interface-datastore-7.0.4.tgz",
+ "integrity": "sha512-Q8LZS/jfFFHz6XyZazLTAc078SSCoa27ZPBOfobWdpDiFO7FqPA2yskitUJIhaCgxNK8C+/lMBUTBNfVIDvLiw==",
+ "dependencies": {
+ "interface-store": "^3.0.0",
+ "nanoid": "^4.0.0",
+ "uint8arrays": "^4.0.2"
+ },
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/ipfs-core-types/node_modules/interface-store": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/interface-store/-/interface-store-3.0.4.tgz",
+ "integrity": "sha512-OjHUuGXbH4eXSBx1TF1tTySvjLldPLzRSYYXJwrEQI+XfH5JWYZofr0gVMV4F8XTwC+4V7jomDYkvGRmDSRKqQ==",
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/ipfs-core-types/node_modules/multiformats": {
+ "version": "11.0.2",
+ "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-11.0.2.tgz",
+ "integrity": "sha512-b5mYMkOkARIuVZCpvijFj9a6m5wMVLC7cf/jIPd5D/ARDOfLC5+IFkbgDXQgcU2goIsTD/O9NY4DI/Mt4OGvlg==",
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/ipfs-core-types/node_modules/nanoid": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.2.tgz",
+ "integrity": "sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "bin": {
+ "nanoid": "bin/nanoid.js"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18"
+ }
+ },
+ "node_modules/ipfs-core-types/node_modules/uint8arrays": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-4.0.4.tgz",
+ "integrity": "sha512-AOoA66e/A7zoXm1mgzQjGmkWDTvCrS3ttWXLHFtlVAwMobLcaOA7G7WRNNAcyfjjYdFDtkEK6njRDX7hZLIO9Q==",
+ "dependencies": {
+ "multiformats": "^11.0.0"
+ }
+ },
+ "node_modules/ipfs-core-utils": {
+ "version": "0.18.1",
+ "resolved": "https://registry.npmjs.org/ipfs-core-utils/-/ipfs-core-utils-0.18.1.tgz",
+ "integrity": "sha512-P7jTpdfvlyBG3JR4o+Th3QJADlmXmwMxbkjszXry6VAjfSfLIIqXsdeYPoVRkV69GFEeQozuz2k/jR+U8cUH/Q==",
+ "deprecated": "js-IPFS has been deprecated in favour of Helia - please see https://github.com/ipfs/js-ipfs/issues/4336 for details",
+ "dependencies": {
+ "@libp2p/logger": "^2.0.5",
+ "@multiformats/multiaddr": "^11.1.5",
+ "@multiformats/multiaddr-to-uri": "^9.0.1",
+ "any-signal": "^3.0.0",
+ "blob-to-it": "^2.0.0",
+ "browser-readablestream-to-it": "^2.0.0",
+ "err-code": "^3.0.1",
+ "ipfs-core-types": "^0.14.1",
+ "ipfs-unixfs": "^9.0.0",
+ "ipfs-utils": "^9.0.13",
+ "it-all": "^2.0.0",
+ "it-map": "^2.0.0",
+ "it-peekable": "^2.0.0",
+ "it-to-stream": "^1.0.0",
+ "merge-options": "^3.0.4",
+ "multiformats": "^11.0.0",
+ "nanoid": "^4.0.0",
+ "parse-duration": "^1.0.0",
+ "timeout-abort-controller": "^3.0.0",
+ "uint8arrays": "^4.0.2"
+ },
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/ipfs-core-utils/node_modules/multiformats": {
+ "version": "11.0.2",
+ "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-11.0.2.tgz",
+ "integrity": "sha512-b5mYMkOkARIuVZCpvijFj9a6m5wMVLC7cf/jIPd5D/ARDOfLC5+IFkbgDXQgcU2goIsTD/O9NY4DI/Mt4OGvlg==",
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/ipfs-core-utils/node_modules/nanoid": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.2.tgz",
+ "integrity": "sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "bin": {
+ "nanoid": "bin/nanoid.js"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18"
+ }
+ },
+ "node_modules/ipfs-core-utils/node_modules/uint8arrays": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-4.0.4.tgz",
+ "integrity": "sha512-AOoA66e/A7zoXm1mgzQjGmkWDTvCrS3ttWXLHFtlVAwMobLcaOA7G7WRNNAcyfjjYdFDtkEK6njRDX7hZLIO9Q==",
+ "dependencies": {
+ "multiformats": "^11.0.0"
+ }
+ },
+ "node_modules/ipfs-http-client": {
+ "version": "60.0.1",
+ "resolved": "https://registry.npmjs.org/ipfs-http-client/-/ipfs-http-client-60.0.1.tgz",
+ "integrity": "sha512-amwM5TNuf077J+/q27jPHfatC05vJuIbX6ZnlYLjc2QsjOCKsORNBqV3brNw7l+fPrijV1yrwEDLG3JEnKsfMw==",
+ "deprecated": "js-IPFS has been deprecated in favour of Helia - please see https://github.com/ipfs/js-ipfs/issues/4336 for details",
+ "dependencies": {
+ "@ipld/dag-cbor": "^9.0.0",
+ "@ipld/dag-json": "^10.0.0",
+ "@ipld/dag-pb": "^4.0.0",
+ "@libp2p/logger": "^2.0.5",
+ "@libp2p/peer-id": "^2.0.0",
+ "@multiformats/multiaddr": "^11.1.5",
+ "any-signal": "^3.0.0",
+ "dag-jose": "^4.0.0",
+ "err-code": "^3.0.1",
+ "ipfs-core-types": "^0.14.1",
+ "ipfs-core-utils": "^0.18.1",
+ "ipfs-utils": "^9.0.13",
+ "it-first": "^2.0.0",
+ "it-last": "^2.0.0",
+ "merge-options": "^3.0.4",
+ "multiformats": "^11.0.0",
+ "parse-duration": "^1.0.0",
+ "stream-to-it": "^0.2.2",
+ "uint8arrays": "^4.0.2"
+ },
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/ipfs-http-client/node_modules/multiformats": {
+ "version": "11.0.2",
+ "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-11.0.2.tgz",
+ "integrity": "sha512-b5mYMkOkARIuVZCpvijFj9a6m5wMVLC7cf/jIPd5D/ARDOfLC5+IFkbgDXQgcU2goIsTD/O9NY4DI/Mt4OGvlg==",
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/ipfs-http-client/node_modules/uint8arrays": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-4.0.4.tgz",
+ "integrity": "sha512-AOoA66e/A7zoXm1mgzQjGmkWDTvCrS3ttWXLHFtlVAwMobLcaOA7G7WRNNAcyfjjYdFDtkEK6njRDX7hZLIO9Q==",
+ "dependencies": {
+ "multiformats": "^11.0.0"
+ }
+ },
+ "node_modules/ipfs-unixfs": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/ipfs-unixfs/-/ipfs-unixfs-9.0.1.tgz",
+ "integrity": "sha512-jh2CbXyxID+v3jLml9CqMwjdSS9ZRnsGfQGGPOfem0/hT/L48xUeTPvh7qLFWkZcIMhZtG+fnS1teei8x5uGBg==",
+ "dependencies": {
+ "err-code": "^3.0.1",
+ "protobufjs": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/ipfs-utils": {
+ "version": "9.0.14",
+ "resolved": "https://registry.npmjs.org/ipfs-utils/-/ipfs-utils-9.0.14.tgz",
+ "integrity": "sha512-zIaiEGX18QATxgaS0/EOQNoo33W0islREABAcxXE8n7y2MGAlB+hdsxXn4J0hGZge8IqVQhW8sWIb+oJz2yEvg==",
+ "dependencies": {
+ "any-signal": "^3.0.0",
+ "browser-readablestream-to-it": "^1.0.0",
+ "buffer": "^6.0.1",
+ "electron-fetch": "^1.7.2",
+ "err-code": "^3.0.1",
+ "is-electron": "^2.2.0",
+ "iso-url": "^1.1.5",
+ "it-all": "^1.0.4",
+ "it-glob": "^1.0.1",
+ "it-to-stream": "^1.0.0",
+ "merge-options": "^3.0.4",
+ "nanoid": "^3.1.20",
+ "native-fetch": "^3.0.0",
+ "node-fetch": "^2.6.8",
+ "react-native-fetch-api": "^3.0.0",
+ "stream-to-it": "^0.2.2"
+ },
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/ipfs-utils/node_modules/browser-readablestream-to-it": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/browser-readablestream-to-it/-/browser-readablestream-to-it-1.0.3.tgz",
+ "integrity": "sha512-+12sHB+Br8HIh6VAMVEG5r3UXCyESIgDW7kzk3BjIXa43DVqVwL7GC5TW3jeh+72dtcH99pPVpw0X8i0jt+/kw=="
+ },
+ "node_modules/ipfs-utils/node_modules/it-all": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/it-all/-/it-all-1.0.6.tgz",
+ "integrity": "sha512-3cmCc6Heqe3uWi3CVM/k51fa/XbMFpQVzFoDsV0IZNHSQDyAXl3c4MjHkFX5kF3922OGj7Myv1nSEUgRtcuM1A=="
+ },
+ "node_modules/ipfs-utils/node_modules/native-fetch": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/native-fetch/-/native-fetch-3.0.0.tgz",
+ "integrity": "sha512-G3Z7vx0IFb/FQ4JxvtqGABsOTIqRWvgQz6e+erkB+JJD6LrszQtMozEHI4EkmgZQvnGHrpLVzUWk7t4sJCIkVw==",
+ "peerDependencies": {
+ "node-fetch": "*"
+ }
+ },
+ "node_modules/ipfs-utils/node_modules/node-fetch": {
+ "version": "2.6.11",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz",
+ "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==",
+ "dependencies": {
+ "whatwg-url": "^5.0.0"
+ },
+ "engines": {
+ "node": "4.x || >=6.0.0"
+ },
+ "peerDependencies": {
+ "encoding": "^0.1.0"
+ },
+ "peerDependenciesMeta": {
+ "encoding": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/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,
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.12.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz",
+ "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==",
+ "dev": true,
+ "dependencies": {
+ "has": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-electron": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/is-electron/-/is-electron-2.2.2.tgz",
+ "integrity": "sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg=="
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-hex-prefixed": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz",
+ "integrity": "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==",
+ "engines": {
+ "node": ">=6.5.0",
+ "npm": ">=3"
+ }
+ },
+ "node_modules/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,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-path-inside": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-plain-obj": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
+ "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true
+ },
+ "node_modules/iso-3166-1": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/iso-3166-1/-/iso-3166-1-2.1.1.tgz",
+ "integrity": "sha512-RZxXf8cw5Y8LyHZIwIRvKw8sWTIHh2/txBT+ehO0QroesVfnz3JNFFX4i/OC/Yuv2bDIVYrHna5PMvjtpefq5w=="
+ },
+ "node_modules/iso-url": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/iso-url/-/iso-url-1.2.1.tgz",
+ "integrity": "sha512-9JPDgCN4B7QPkLtYAAOrEuAWvP9rWvR5offAr0/SeF046wIkglqH3VXgYYP6NcsKslH80UIVgmPqNe3j7tG2ng==",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/istanbul-lib-coverage": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz",
+ "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-instrument": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz",
+ "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/core": "^7.12.3",
+ "@babel/parser": "^7.14.7",
+ "@istanbuljs/schema": "^0.1.2",
+ "istanbul-lib-coverage": "^3.2.0",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-instrument/node_modules/semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/istanbul-lib-report": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
+ "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==",
+ "dev": true,
+ "dependencies": {
+ "istanbul-lib-coverage": "^3.0.0",
+ "make-dir": "^3.0.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-report/node_modules/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,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-report/node_modules/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,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-source-maps": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz",
+ "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.1.1",
+ "istanbul-lib-coverage": "^3.0.0",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/istanbul-reports": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz",
+ "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==",
+ "dev": true,
+ "dependencies": {
+ "html-escaper": "^2.0.0",
+ "istanbul-lib-report": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/it-all": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/it-all/-/it-all-2.0.1.tgz",
+ "integrity": "sha512-9UuJcCRZsboz+HBQTNOau80Dw+ryGaHYFP/cPYzFBJBFcfDathMYnhHk4t52en9+fcyDGPTdLB+lFc1wzQIroA==",
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/it-first": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/it-first/-/it-first-2.0.1.tgz",
+ "integrity": "sha512-noC1oEQcWZZMUwq7VWxHNLML43dM+5bviZpfmkxkXlvBe60z7AFRqpZSga9uQBo792jKv9otnn1IjA4zwgNARw==",
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/it-glob": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/it-glob/-/it-glob-1.0.2.tgz",
+ "integrity": "sha512-Ch2Dzhw4URfB9L/0ZHyY+uqOnKvBNeS/SMcRiPmJfpHiM0TsUZn+GkpcZxAoF3dJVdPm/PuIk3A4wlV7SUo23Q==",
+ "dependencies": {
+ "@types/minimatch": "^3.0.4",
+ "minimatch": "^3.0.4"
+ }
+ },
+ "node_modules/it-last": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/it-last/-/it-last-2.0.1.tgz",
+ "integrity": "sha512-uVMedYW0wa2Cx0TAmcOCLbfuLLII7+vyURmhKa8Zovpd+aBTMsmINtsta2n364wJ5qsEDBH+akY1sUtAkaYBlg==",
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/it-map": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/it-map/-/it-map-2.0.1.tgz",
+ "integrity": "sha512-a2GcYDHiAh/eSU628xlvB56LA98luXZnniH2GlD0IdBzf15shEq9rBeb0Rg3o1SWtNILUAwqmQxEXcewGCdvmQ==",
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/it-peekable": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/it-peekable/-/it-peekable-2.0.1.tgz",
+ "integrity": "sha512-fJ/YTU9rHRhGJOM2hhQKKEfRM6uKB9r4yGGFLBHqp72ACC8Yi6+7/FhuBAMG8cpN6mLoj9auVX7ZJ3ul6qFpTA==",
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/it-pushable": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/it-pushable/-/it-pushable-3.1.3.tgz",
+ "integrity": "sha512-f50iQ85HISS6DaWCyrqf9QJ6G/kQtKIMf9xZkgZgyOvxEQDfn8OfYcLXXquCqgoLboxQtAW1ZFZyFIAsLHDtJw==",
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/it-stream-types": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/it-stream-types/-/it-stream-types-1.0.5.tgz",
+ "integrity": "sha512-I88Ka1nHgfX62e5mi5LLL+oueqz7Ltg0bUdtsUKDe9SoUqbQPf2Mp5kxDTe9pNhHQGs4pvYPAINwuZ1HAt42TA==",
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/it-to-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/it-to-stream/-/it-to-stream-1.0.0.tgz",
+ "integrity": "sha512-pLULMZMAB/+vbdvbZtebC0nWBTbG581lk6w8P7DfIIIKUfa8FbY7Oi0FxZcFPbxvISs7A9E+cMpLDBc1XhpAOA==",
+ "dependencies": {
+ "buffer": "^6.0.3",
+ "fast-fifo": "^1.0.0",
+ "get-iterator": "^1.0.2",
+ "p-defer": "^3.0.0",
+ "p-fifo": "^1.0.0",
+ "readable-stream": "^3.6.0"
+ }
+ },
+ "node_modules/jiti": {
+ "version": "1.18.2",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.18.2.tgz",
+ "integrity": "sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==",
+ "dev": true,
+ "bin": {
+ "jiti": "bin/jiti.js"
+ }
+ },
+ "node_modules/js-sha3": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz",
+ "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q=="
+ },
+ "node_modules/js-string-escape": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz",
+ "integrity": "sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+ },
+ "node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/jsesc": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+ "dev": true,
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/json-bigint": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz",
+ "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==",
+ "dependencies": {
+ "bignumber.js": "^9.0.0"
+ }
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dev": true,
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/jsonc-parser": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz",
+ "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==",
+ "dev": true
+ },
+ "node_modules/keccak": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.3.tgz",
+ "integrity": "sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ==",
+ "hasInstallScript": true,
+ "dependencies": {
+ "node-addon-api": "^2.0.0",
+ "node-gyp-build": "^4.2.0",
+ "readable-stream": "^3.6.0"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/keyvaluestorage-interface": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/keyvaluestorage-interface/-/keyvaluestorage-interface-1.0.0.tgz",
+ "integrity": "sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g=="
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/lilconfig": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
+ "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "dev": true
+ },
+ "node_modules/local-pkg": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz",
+ "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true
+ },
+ "node_modules/lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="
+ },
+ "node_modules/lodash.isequal": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
+ "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ=="
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true
+ },
+ "node_modules/long": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
+ "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="
+ },
+ "node_modules/loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "dependencies": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "loose-envify": "cli.js"
+ }
+ },
+ "node_modules/loupe": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz",
+ "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==",
+ "dev": true,
+ "dependencies": {
+ "get-func-name": "^2.0.0"
+ }
+ },
+ "node_modules/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==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "node_modules/magic-string": {
+ "version": "0.30.0",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz",
+ "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.4.13"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/make-dir": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+ "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "dev": true,
+ "dependencies": {
+ "semver": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/make-dir/node_modules/semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/md5-hex": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-3.0.1.tgz",
+ "integrity": "sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==",
+ "dev": true,
+ "dependencies": {
+ "blueimp-md5": "^2.10.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/md5.js": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
+ "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
+ "dependencies": {
+ "hash-base": "^3.0.0",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "node_modules/merge-options": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-3.0.4.tgz",
+ "integrity": "sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==",
+ "dependencies": {
+ "is-plain-obj": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/merkletreejs": {
+ "version": "0.3.10",
+ "resolved": "https://registry.npmjs.org/merkletreejs/-/merkletreejs-0.3.10.tgz",
+ "integrity": "sha512-lin42tKfRdkW+6iE5pjtQ9BnH+1Hk3sJ5Fn9hUUSjcXRcJbSISHgPCfYvMNEXiNqZPhz/TyRPEV30qgnujsQ7A==",
+ "dependencies": {
+ "bignumber.js": "^9.0.1",
+ "buffer-reverse": "^1.0.1",
+ "crypto-js": "^3.1.9-1",
+ "treeify": "^1.1.0",
+ "web3-utils": "^1.3.4"
+ },
+ "engines": {
+ "node": ">= 7.6.0"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+ "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+ "dev": true,
+ "dependencies": {
+ "braces": "^3.0.2",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/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=="
+ },
+ "node_modules/minimalistic-crypto-utils": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
+ "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg=="
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/mlly": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.3.0.tgz",
+ "integrity": "sha512-HT5mcgIQKkOrZecOjOX3DJorTikWXwsBfpcr/MGBkhfWcjiqvnaL/9ppxvIUXfjT6xt4DVIAsN9fMUz1ev4bIw==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.8.2",
+ "pathe": "^1.1.0",
+ "pkg-types": "^1.0.3",
+ "ufo": "^1.1.2"
+ }
+ },
+ "node_modules/moment": {
+ "version": "2.29.4",
+ "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz",
+ "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ },
+ "node_modules/multiformats": {
+ "version": "9.9.0",
+ "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz",
+ "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg=="
+ },
+ "node_modules/mz": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+ "dev": true,
+ "dependencies": {
+ "any-promise": "^1.0.0",
+ "object-assign": "^4.0.1",
+ "thenify-all": "^1.0.0"
+ }
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
+ "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/native-fetch": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/native-fetch/-/native-fetch-4.0.2.tgz",
+ "integrity": "sha512-4QcVlKFtv2EYVS5MBgsGX5+NWKtbDbIECdUXDBGDMAZXq3Jkv9zf+y8iS7Ub8fEdga3GpYeazp9gauNqXHJOCg==",
+ "peerDependencies": {
+ "undici": "*"
+ }
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true
+ },
+ "node_modules/natural-compare-lite": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz",
+ "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==",
+ "dev": true
+ },
+ "node_modules/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_modules/node-fetch": {
+ "version": "2.6.7",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
+ "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
+ "dependencies": {
+ "whatwg-url": "^5.0.0"
+ },
+ "engines": {
+ "node": "4.x || >=6.0.0"
+ },
+ "peerDependencies": {
+ "encoding": "^0.1.0"
+ },
+ "peerDependenciesMeta": {
+ "encoding": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/node-gyp-build": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz",
+ "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==",
+ "bin": {
+ "node-gyp-build": "bin.js",
+ "node-gyp-build-optional": "optional.js",
+ "node-gyp-build-test": "build-test.js"
+ }
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.12",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz",
+ "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==",
+ "dev": true
+ },
+ "node_modules/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,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/normalize-range": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+ "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/number-to-bn": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz",
+ "integrity": "sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==",
+ "dependencies": {
+ "bn.js": "4.11.6",
+ "strip-hex-prefix": "1.0.0"
+ },
+ "engines": {
+ "node": ">=6.5.0",
+ "npm": ">=3"
+ }
+ },
+ "node_modules/number-to-bn/node_modules/bn.js": {
+ "version": "4.11.6",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz",
+ "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA=="
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-hash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
+ "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/on-exit-leak-free": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-0.2.0.tgz",
+ "integrity": "sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg=="
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
+ "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+ "dev": true,
+ "dependencies": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.3"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/p-defer": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-3.0.0.tgz",
+ "integrity": "sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/p-fifo": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-fifo/-/p-fifo-1.0.0.tgz",
+ "integrity": "sha512-IjoCxXW48tqdtDFz6fqo5q1UfFVjjVZe8TC1QRflvNUJtNfCUhxOUw6MOVZhDPjqhSzc26xKdugsO17gmzd5+A==",
+ "dependencies": {
+ "fast-fifo": "^1.0.0",
+ "p-defer": "^3.0.0"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parse-duration": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/parse-duration/-/parse-duration-1.1.0.tgz",
+ "integrity": "sha512-z6t9dvSJYaPoQq7quMzdEagSFtpGu+utzHqqxmpVWNNZRIXnvqyCvn9XsTdh7c/w0Bqmdz3RB3YnRaKtpRtEXQ=="
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/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,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/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==",
+ "dev": true
+ },
+ "node_modules/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,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pathe": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.0.tgz",
+ "integrity": "sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==",
+ "dev": true
+ },
+ "node_modules/pathval": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz",
+ "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/pbkdf2": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz",
+ "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==",
+ "dependencies": {
+ "create-hash": "^1.1.2",
+ "create-hmac": "^1.1.4",
+ "ripemd160": "^2.0.1",
+ "safe-buffer": "^5.0.1",
+ "sha.js": "^2.4.8"
+ },
+ "engines": {
+ "node": ">=0.12"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/pino": {
+ "version": "7.11.0",
+ "resolved": "https://registry.npmjs.org/pino/-/pino-7.11.0.tgz",
+ "integrity": "sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==",
+ "dependencies": {
+ "atomic-sleep": "^1.0.0",
+ "fast-redact": "^3.0.0",
+ "on-exit-leak-free": "^0.2.0",
+ "pino-abstract-transport": "v0.5.0",
+ "pino-std-serializers": "^4.0.0",
+ "process-warning": "^1.0.0",
+ "quick-format-unescaped": "^4.0.3",
+ "real-require": "^0.1.0",
+ "safe-stable-stringify": "^2.1.0",
+ "sonic-boom": "^2.2.1",
+ "thread-stream": "^0.15.1"
+ },
+ "bin": {
+ "pino": "bin.js"
+ }
+ },
+ "node_modules/pino-abstract-transport": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-0.5.0.tgz",
+ "integrity": "sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==",
+ "dependencies": {
+ "duplexify": "^4.1.2",
+ "split2": "^4.0.0"
+ }
+ },
+ "node_modules/pino-std-serializers": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-4.0.0.tgz",
+ "integrity": "sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q=="
+ },
+ "node_modules/pirates": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz",
+ "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/pkg-types": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz",
+ "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==",
+ "dev": true,
+ "dependencies": {
+ "jsonc-parser": "^3.2.0",
+ "mlly": "^1.2.0",
+ "pathe": "^1.1.0"
+ }
+ },
+ "node_modules/pngjs": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz",
+ "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==",
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.4.23",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz",
+ "integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "nanoid": "^3.3.6",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/postcss-import": {
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
+ "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
+ "dev": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.0.0",
+ "read-cache": "^1.0.0",
+ "resolve": "^1.1.7"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.0.0"
+ }
+ },
+ "node_modules/postcss-js": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
+ "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
+ "dev": true,
+ "dependencies": {
+ "camelcase-css": "^2.0.1"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >= 16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.21"
+ }
+ },
+ "node_modules/postcss-load-config": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz",
+ "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==",
+ "dev": true,
+ "dependencies": {
+ "lilconfig": "^2.0.5",
+ "yaml": "^2.1.1"
+ },
+ "engines": {
+ "node": ">= 14"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": ">=8.0.9",
+ "ts-node": ">=9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "postcss": {
+ "optional": true
+ },
+ "ts-node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/postcss-nested": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz",
+ "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==",
+ "dev": true,
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.11"
+ },
+ "engines": {
+ "node": ">=12.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.14"
+ }
+ },
+ "node_modules/postcss-selector-parser": {
+ "version": "6.0.13",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz",
+ "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==",
+ "dev": true,
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+ "dev": true
+ },
+ "node_modules/preact": {
+ "version": "10.4.1",
+ "resolved": "https://registry.npmjs.org/preact/-/preact-10.4.1.tgz",
+ "integrity": "sha512-WKrRpCSwL2t3tpOOGhf2WfTpcmbpxaWtDbdJdKdjd0aEiTkvOmS4NBkG6kzlaAHI9AkQ3iVqbFWM3Ei7mZ4o1Q==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/preact"
+ }
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/prettier": {
+ "version": "2.8.8",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz",
+ "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
+ "bin": {
+ "prettier": "bin-prettier.js"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
+ "node_modules/pretty-format": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz",
+ "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^17.0.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/pretty-format/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/process": {
+ "version": "0.11.10",
+ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+ "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
+ "engines": {
+ "node": ">= 0.6.0"
+ }
+ },
+ "node_modules/process-warning": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-1.0.0.tgz",
+ "integrity": "sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q=="
+ },
+ "node_modules/protobufjs": {
+ "version": "7.2.4",
+ "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.4.tgz",
+ "integrity": "sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==",
+ "hasInstallScript": true,
+ "dependencies": {
+ "@protobufjs/aspromise": "^1.1.2",
+ "@protobufjs/base64": "^1.1.2",
+ "@protobufjs/codegen": "^2.0.4",
+ "@protobufjs/eventemitter": "^1.1.0",
+ "@protobufjs/fetch": "^1.1.0",
+ "@protobufjs/float": "^1.0.2",
+ "@protobufjs/inquire": "^1.1.0",
+ "@protobufjs/path": "^1.1.2",
+ "@protobufjs/pool": "^1.1.0",
+ "@protobufjs/utf8": "^1.1.0",
+ "@types/node": ">=13.7.0",
+ "long": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/protobufjs/node_modules/long": {
+ "version": "5.2.3",
+ "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz",
+ "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q=="
+ },
+ "node_modules/proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
+ },
+ "node_modules/punycode": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
+ "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/qrcode": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.4.4.tgz",
+ "integrity": "sha512-oLzEC5+NKFou9P0bMj5+v6Z40evexeE29Z9cummZXZ9QXyMr3lphkURzxjXgPJC5azpxcshoDWV1xE46z+/c3Q==",
+ "dependencies": {
+ "buffer": "^5.4.3",
+ "buffer-alloc": "^1.2.0",
+ "buffer-from": "^1.1.1",
+ "dijkstrajs": "^1.0.1",
+ "isarray": "^2.0.1",
+ "pngjs": "^3.3.0",
+ "yargs": "^13.2.4"
+ },
+ "bin": {
+ "qrcode": "bin/qrcode"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/qrcode/node_modules/ansi-regex": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
+ "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/qrcode/node_modules/buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "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/qrcode/node_modules/cliui": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
+ "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
+ "dependencies": {
+ "string-width": "^3.1.0",
+ "strip-ansi": "^5.2.0",
+ "wrap-ansi": "^5.1.0"
+ }
+ },
+ "node_modules/qrcode/node_modules/emoji-regex": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
+ "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA=="
+ },
+ "node_modules/qrcode/node_modules/find-up": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+ "dependencies": {
+ "locate-path": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/qrcode/node_modules/is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/qrcode/node_modules/locate-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+ "dependencies": {
+ "p-locate": "^3.0.0",
+ "path-exists": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/qrcode/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/qrcode/node_modules/p-locate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+ "dependencies": {
+ "p-limit": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/qrcode/node_modules/path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/qrcode/node_modules/string-width": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+ "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+ "dependencies": {
+ "emoji-regex": "^7.0.1",
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/qrcode/node_modules/strip-ansi": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+ "dependencies": {
+ "ansi-regex": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/qrcode/node_modules/wrap-ansi": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
+ "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
+ "dependencies": {
+ "ansi-styles": "^3.2.0",
+ "string-width": "^3.0.0",
+ "strip-ansi": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/qrcode/node_modules/y18n": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
+ "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ=="
+ },
+ "node_modules/qrcode/node_modules/yargs": {
+ "version": "13.3.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
+ "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
+ "dependencies": {
+ "cliui": "^5.0.0",
+ "find-up": "^3.0.0",
+ "get-caller-file": "^2.0.1",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^2.0.0",
+ "set-blocking": "^2.0.0",
+ "string-width": "^3.0.0",
+ "which-module": "^2.0.0",
+ "y18n": "^4.0.0",
+ "yargs-parser": "^13.1.2"
+ }
+ },
+ "node_modules/qrcode/node_modules/yargs-parser": {
+ "version": "13.1.2",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
+ "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
+ "dependencies": {
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
+ }
+ },
+ "node_modules/query-string": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz",
+ "integrity": "sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==",
+ "dependencies": {
+ "decode-uri-component": "^0.2.2",
+ "filter-obj": "^1.1.0",
+ "split-on-first": "^1.0.0",
+ "strict-uri-encode": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/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,
+ "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/quick-format-unescaped": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz",
+ "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg=="
+ },
+ "node_modules/randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "dependencies": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "node_modules/react": {
+ "version": "18.2.0",
+ "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
+ "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "18.2.0",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz",
+ "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==",
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "scheduler": "^0.23.0"
+ },
+ "peerDependencies": {
+ "react": "^18.2.0"
+ }
+ },
+ "node_modules/react-hook-form": {
+ "version": "7.44.1",
+ "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.44.1.tgz",
+ "integrity": "sha512-ZVmDuQQCq6agpVE2eoGjH3ZMDgo/aFV4JVobUQGOQ0/tgfcY/WY30mBSVnxmFOpzS+iSqD2ax7hw9Thg5F931A==",
+ "engines": {
+ "node": ">=12.22.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/react-hook-form"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17 || ^18"
+ }
+ },
+ "node_modules/react-is": {
+ "version": "17.0.2",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
+ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
+ "dev": true
+ },
+ "node_modules/react-native-fetch-api": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/react-native-fetch-api/-/react-native-fetch-api-3.0.0.tgz",
+ "integrity": "sha512-g2rtqPjdroaboDKTsJCTlcmtw54E25OjyaunUP0anOZn4Fuo2IKs8BVfe02zVggA/UysbmfSnRJIqtNkAgggNA==",
+ "dependencies": {
+ "p-defer": "^3.0.0"
+ }
+ },
+ "node_modules/react-refresh": {
+ "version": "0.14.0",
+ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz",
+ "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-router": {
+ "version": "6.11.2",
+ "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.11.2.tgz",
+ "integrity": "sha512-74z9xUSaSX07t3LM+pS6Un0T55ibUE/79CzfZpy5wsPDZaea1F8QkrsiyRnA2YQ7LwE/umaydzXZV80iDCPkMg==",
+ "dependencies": {
+ "@remix-run/router": "1.6.2"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "react": ">=16.8"
+ }
+ },
+ "node_modules/react-router-dom": {
+ "version": "6.11.2",
+ "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.11.2.tgz",
+ "integrity": "sha512-JNbKtAeh1VSJQnH6RvBDNhxNwemRj7KxCzc5jb7zvDSKRnPWIFj9pO+eXqjM69gQJ0r46hSz1x4l9y0651DKWw==",
+ "dependencies": {
+ "@remix-run/router": "1.6.2",
+ "react-router": "6.11.2"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "react": ">=16.8",
+ "react-dom": ">=16.8"
+ }
+ },
+ "node_modules/read-cache": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
+ "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
+ "dev": true,
+ "dependencies": {
+ "pify": "^2.3.0"
+ }
+ },
+ "node_modules/readable-stream": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/real-require": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.1.0.tgz",
+ "integrity": "sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==",
+ "engines": {
+ "node": ">= 12.13.0"
+ }
+ },
+ "node_modules/receptacle": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/receptacle/-/receptacle-1.3.2.tgz",
+ "integrity": "sha512-HrsFvqZZheusncQRiEE7GatOAETrARKV/lnfYicIm8lbvp/JQOdADOfhjBd2DajvoszEyxSM6RlAAIZgEoeu/A==",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/require-main-filename": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
+ },
+ "node_modules/resolve": {
+ "version": "1.22.2",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz",
+ "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==",
+ "dev": true,
+ "dependencies": {
+ "is-core-module": "^2.11.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/retimer": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/retimer/-/retimer-3.0.0.tgz",
+ "integrity": "sha512-WKE0j11Pa0ZJI5YIk0nflGI7SQsfl2ljihVy7ogh7DeQSeYAUi0ubZ/yEueGtDfUPk6GH5LRw1hBdLq4IwUBWA=="
+ },
+ "node_modules/reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "dev": true,
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/ripemd160": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
+ "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
+ "dependencies": {
+ "hash-base": "^3.0.0",
+ "inherits": "^2.0.1"
+ }
+ },
+ "node_modules/rlp": {
+ "version": "2.2.7",
+ "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz",
+ "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==",
+ "dependencies": {
+ "bn.js": "^5.2.0"
+ },
+ "bin": {
+ "rlp": "bin/rlp"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "3.23.0",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.23.0.tgz",
+ "integrity": "sha512-h31UlwEi7FHihLe1zbk+3Q7z1k/84rb9BSwmBSr/XjOCEaBJ2YyedQDuM0t/kfOS0IxM+vk1/zI9XxYj9V+NJQ==",
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=14.18.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/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,
+ "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": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "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==",
+ "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/safe-json-utils": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/safe-json-utils/-/safe-json-utils-1.1.1.tgz",
+ "integrity": "sha512-SAJWGKDs50tAbiDXLf89PDwt9XYkWyANFWVzn4dTXl5QyI8t2o/bW5/OJl3lvc2WVU4MEpTo9Yz5NVFNsp+OJQ=="
+ },
+ "node_modules/safe-stable-stringify": {
+ "version": "2.4.3",
+ "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz",
+ "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+ },
+ "node_modules/scheduler": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz",
+ "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ }
+ },
+ "node_modules/scrypt-js": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz",
+ "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA=="
+ },
+ "node_modules/secp256k1": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz",
+ "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==",
+ "hasInstallScript": true,
+ "dependencies": {
+ "elliptic": "^6.5.4",
+ "node-addon-api": "^2.0.0",
+ "node-gyp-build": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/semver": {
+ "version": "7.5.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz",
+ "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/semver/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/semver/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ },
+ "node_modules/set-blocking": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="
+ },
+ "node_modules/setimmediate": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
+ "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA=="
+ },
+ "node_modules/sha.js": {
+ "version": "2.4.11",
+ "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
+ "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ },
+ "bin": {
+ "sha.js": "bin.js"
+ }
+ },
+ "node_modules/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,
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/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,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/siginfo": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz",
+ "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==",
+ "dev": true
+ },
+ "node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true
+ },
+ "node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/sonic-boom": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-2.8.0.tgz",
+ "integrity": "sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==",
+ "dependencies": {
+ "atomic-sleep": "^1.0.0"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
+ "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/split-on-first": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz",
+ "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/split2": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz",
+ "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==",
+ "engines": {
+ "node": ">= 10.x"
+ }
+ },
+ "node_modules/stackback": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz",
+ "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==",
+ "dev": true
+ },
+ "node_modules/std-env": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.3.tgz",
+ "integrity": "sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==",
+ "dev": true
+ },
+ "node_modules/stream-shift": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz",
+ "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ=="
+ },
+ "node_modules/stream-to-it": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/stream-to-it/-/stream-to-it-0.2.4.tgz",
+ "integrity": "sha512-4vEbkSs83OahpmBybNJXlJd7d6/RxzkkSdT3I0mnGt79Xd2Kk+e1JqbvAvsQfCeKj3aKb0QIWkyK3/n0j506vQ==",
+ "dependencies": {
+ "get-iterator": "^1.0.2"
+ }
+ },
+ "node_modules/streamsearch": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
+ "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==",
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/strict-uri-encode": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz",
+ "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "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==",
+ "dependencies": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-hex-prefix": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz",
+ "integrity": "sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==",
+ "dependencies": {
+ "is-hex-prefixed": "1.0.0"
+ },
+ "engines": {
+ "node": ">=6.5.0",
+ "npm": ">=3"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/strip-literal": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.0.1.tgz",
+ "integrity": "sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.8.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/sucrase": {
+ "version": "3.32.0",
+ "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.32.0.tgz",
+ "integrity": "sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "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"
+ },
+ "bin": {
+ "sucrase": "bin/sucrase",
+ "sucrase-node": "bin/sucrase-node"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/sucrase/node_modules/glob": {
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+ "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "dev": true,
+ "dependencies": {
+ "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"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/tailwindcss": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.2.tgz",
+ "integrity": "sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==",
+ "dev": true,
+ "dependencies": {
+ "@alloc/quick-lru": "^5.2.0",
+ "arg": "^5.0.2",
+ "chokidar": "^3.5.3",
+ "didyoumean": "^1.2.2",
+ "dlv": "^1.1.3",
+ "fast-glob": "^3.2.12",
+ "glob-parent": "^6.0.2",
+ "is-glob": "^4.0.3",
+ "jiti": "^1.18.2",
+ "lilconfig": "^2.1.0",
+ "micromatch": "^4.0.5",
+ "normalize-path": "^3.0.0",
+ "object-hash": "^3.0.0",
+ "picocolors": "^1.0.0",
+ "postcss": "^8.4.23",
+ "postcss-import": "^15.1.0",
+ "postcss-js": "^4.0.1",
+ "postcss-load-config": "^4.0.1",
+ "postcss-nested": "^6.0.1",
+ "postcss-selector-parser": "^6.0.11",
+ "postcss-value-parser": "^4.2.0",
+ "resolve": "^1.22.2",
+ "sucrase": "^3.32.0"
+ },
+ "bin": {
+ "tailwind": "lib/cli.js",
+ "tailwindcss": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/test-exclude": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
+ "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
+ "dev": true,
+ "dependencies": {
+ "@istanbuljs/schema": "^0.1.2",
+ "glob": "^7.1.4",
+ "minimatch": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
+ "dev": true
+ },
+ "node_modules/thenify": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
+ "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
+ "dev": true,
+ "dependencies": {
+ "any-promise": "^1.0.0"
+ }
+ },
+ "node_modules/thenify-all": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+ "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
+ "dev": true,
+ "dependencies": {
+ "thenify": ">= 3.1.0 < 4"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/thread-stream": {
+ "version": "0.15.2",
+ "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-0.15.2.tgz",
+ "integrity": "sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==",
+ "dependencies": {
+ "real-require": "^0.1.0"
+ }
+ },
+ "node_modules/time-zone": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/time-zone/-/time-zone-1.0.0.tgz",
+ "integrity": "sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/timeout-abort-controller": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/timeout-abort-controller/-/timeout-abort-controller-3.0.0.tgz",
+ "integrity": "sha512-O3e+2B8BKrQxU2YRyEjC/2yFdb33slI22WRdUaDx6rvysfi9anloNZyR2q0l6LnePo5qH7gSM7uZtvvwZbc2yA==",
+ "dependencies": {
+ "retimer": "^3.0.0"
+ }
+ },
+ "node_modules/tinybench": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.0.tgz",
+ "integrity": "sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==",
+ "dev": true
+ },
+ "node_modules/tinypool": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.5.0.tgz",
+ "integrity": "sha512-paHQtnrlS1QZYKF/GnLoOM/DN9fqaGOFbCbxzAhwniySnzl9Ebk8w73/dd34DAhe/obUbPAOldTyYXQZxnPBPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/tinyspy": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.1.0.tgz",
+ "integrity": "sha512-7eORpyqImoOvkQJCSkL0d0mB4NHHIFAy4b1u8PHdDa7SjGS2njzl6/lyGoZLm+eyYEtlUmFGE0rFj66SWxZgQQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/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,
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/toggle-selection": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz",
+ "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ=="
+ },
+ "node_modules/tr46": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
+ },
+ "node_modules/treeify": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/treeify/-/treeify-1.1.0.tgz",
+ "integrity": "sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==",
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/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
+ },
+ "node_modules/tsconfck": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-2.1.1.tgz",
+ "integrity": "sha512-ZPCkJBKASZBmBUNqGHmRhdhM8pJYDdOXp4nRgj/O0JwUwsMq50lCDRQP/M5GBNAA0elPrq4gAeu4dkaVCuKWww==",
+ "dev": true,
+ "bin": {
+ "tsconfck": "bin/tsconfck.js"
+ },
+ "engines": {
+ "node": "^14.13.1 || ^16 || >=18"
+ },
+ "peerDependencies": {
+ "typescript": "^4.3.5 || ^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+ },
+ "node_modules/tsutils": {
+ "version": "3.21.0",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
+ "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "^1.8.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ },
+ "peerDependencies": {
+ "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta"
+ }
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/type-detect": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz",
+ "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==",
+ "dev": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=12.20"
+ }
+ },
+ "node_modules/ufo": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.1.2.tgz",
+ "integrity": "sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ==",
+ "dev": true
+ },
+ "node_modules/uint8arraylist": {
+ "version": "2.4.3",
+ "resolved": "https://registry.npmjs.org/uint8arraylist/-/uint8arraylist-2.4.3.tgz",
+ "integrity": "sha512-oEVZr4/GrH87K0kjNce6z8pSCzLEPqHNLNR5sj8cJOySrTP8Vb/pMIbZKLJGhQKxm1TiZ31atNrpn820Pyqpow==",
+ "dependencies": {
+ "uint8arrays": "^4.0.2"
+ },
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/uint8arraylist/node_modules/multiformats": {
+ "version": "11.0.2",
+ "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-11.0.2.tgz",
+ "integrity": "sha512-b5mYMkOkARIuVZCpvijFj9a6m5wMVLC7cf/jIPd5D/ARDOfLC5+IFkbgDXQgcU2goIsTD/O9NY4DI/Mt4OGvlg==",
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/uint8arraylist/node_modules/uint8arrays": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-4.0.4.tgz",
+ "integrity": "sha512-AOoA66e/A7zoXm1mgzQjGmkWDTvCrS3ttWXLHFtlVAwMobLcaOA7G7WRNNAcyfjjYdFDtkEK6njRDX7hZLIO9Q==",
+ "dependencies": {
+ "multiformats": "^11.0.0"
+ }
+ },
+ "node_modules/uint8arrays": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz",
+ "integrity": "sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==",
+ "dependencies": {
+ "multiformats": "^9.4.2"
+ }
+ },
+ "node_modules/undici": {
+ "version": "5.22.1",
+ "resolved": "https://registry.npmjs.org/undici/-/undici-5.22.1.tgz",
+ "integrity": "sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==",
+ "dependencies": {
+ "busboy": "^1.6.0"
+ },
+ "engines": {
+ "node": ">=14.0"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz",
+ "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "escalade": "^3.1.1",
+ "picocolors": "^1.0.0"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/use-sync-external-store": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz",
+ "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==",
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/utf8": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz",
+ "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ=="
+ },
+ "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=="
+ },
+ "node_modules/uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/v8-to-istanbul": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz",
+ "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.12",
+ "@types/istanbul-lib-coverage": "^2.0.1",
+ "convert-source-map": "^1.6.0"
+ },
+ "engines": {
+ "node": ">=10.12.0"
+ }
+ },
+ "node_modules/varint": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz",
+ "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg=="
+ },
+ "node_modules/vite": {
+ "version": "4.3.9",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.9.tgz",
+ "integrity": "sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==",
+ "dependencies": {
+ "esbuild": "^0.17.5",
+ "postcss": "^8.4.23",
+ "rollup": "^3.21.0"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ },
+ "peerDependencies": {
+ "@types/node": ">= 14",
+ "less": "*",
+ "sass": "*",
+ "stylus": "*",
+ "sugarss": "*",
+ "terser": "^5.4.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vite-node": {
+ "version": "0.31.1",
+ "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.31.1.tgz",
+ "integrity": "sha512-BajE/IsNQ6JyizPzu9zRgHrBwczkAs0erQf/JRpgTIESpKvNj9/Gd0vxX905klLkb0I0SJVCKbdrl5c6FnqYKA==",
+ "dev": true,
+ "dependencies": {
+ "cac": "^6.7.14",
+ "debug": "^4.3.4",
+ "mlly": "^1.2.0",
+ "pathe": "^1.1.0",
+ "picocolors": "^1.0.0",
+ "vite": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "vite-node": "vite-node.mjs"
+ },
+ "engines": {
+ "node": ">=v14.18.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/vite-plugin-wasm": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/vite-plugin-wasm/-/vite-plugin-wasm-3.2.2.tgz",
+ "integrity": "sha512-cdbBUNR850AEoMd5nvLmnyeq63CSfoP1ctD/L2vLk/5+wsgAPlAVAzUK5nGKWO/jtehNlrSSHLteN+gFQw7VOA==",
+ "peerDependencies": {
+ "vite": "^2 || ^3 || ^4"
+ }
+ },
+ "node_modules/vite-tsconfig-paths": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.2.0.tgz",
+ "integrity": "sha512-jGpus0eUy5qbbMVGiTxCL1iB9ZGN6Bd37VGLJU39kTDD6ZfULTTb1bcc5IeTWqWJKiWV5YihCaibeASPiGi8kw==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.1.1",
+ "globrex": "^0.1.2",
+ "tsconfck": "^2.1.0"
+ },
+ "peerDependencies": {
+ "vite": "*"
+ },
+ "peerDependenciesMeta": {
+ "vite": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vitest": {
+ "version": "0.31.1",
+ "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.31.1.tgz",
+ "integrity": "sha512-/dOoOgzoFk/5pTvg1E65WVaobknWREN15+HF+0ucudo3dDG/vCZoXTQrjIfEaWvQXmqScwkRodrTbM/ScMpRcQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/chai": "^4.3.5",
+ "@types/chai-subset": "^1.3.3",
+ "@types/node": "*",
+ "@vitest/expect": "0.31.1",
+ "@vitest/runner": "0.31.1",
+ "@vitest/snapshot": "0.31.1",
+ "@vitest/spy": "0.31.1",
+ "@vitest/utils": "0.31.1",
+ "acorn": "^8.8.2",
+ "acorn-walk": "^8.2.0",
+ "cac": "^6.7.14",
+ "chai": "^4.3.7",
+ "concordance": "^5.0.4",
+ "debug": "^4.3.4",
+ "local-pkg": "^0.4.3",
+ "magic-string": "^0.30.0",
+ "pathe": "^1.1.0",
+ "picocolors": "^1.0.0",
+ "std-env": "^3.3.2",
+ "strip-literal": "^1.0.1",
+ "tinybench": "^2.5.0",
+ "tinypool": "^0.5.0",
+ "vite": "^3.0.0 || ^4.0.0",
+ "vite-node": "0.31.1",
+ "why-is-node-running": "^2.2.2"
+ },
+ "bin": {
+ "vitest": "vitest.mjs"
+ },
+ "engines": {
+ "node": ">=v14.18.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ },
+ "peerDependencies": {
+ "@edge-runtime/vm": "*",
+ "@vitest/browser": "*",
+ "@vitest/ui": "*",
+ "happy-dom": "*",
+ "jsdom": "*",
+ "playwright": "*",
+ "safaridriver": "*",
+ "webdriverio": "*"
+ },
+ "peerDependenciesMeta": {
+ "@edge-runtime/vm": {
+ "optional": true
+ },
+ "@vitest/browser": {
+ "optional": true
+ },
+ "@vitest/ui": {
+ "optional": true
+ },
+ "happy-dom": {
+ "optional": true
+ },
+ "jsdom": {
+ "optional": true
+ },
+ "playwright": {
+ "optional": true
+ },
+ "safaridriver": {
+ "optional": true
+ },
+ "webdriverio": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/web3-utils": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.0.tgz",
+ "integrity": "sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg==",
+ "dependencies": {
+ "bn.js": "^5.2.1",
+ "ethereum-bloom-filters": "^1.0.6",
+ "ethereumjs-util": "^7.1.0",
+ "ethjs-unit": "0.1.6",
+ "number-to-bn": "1.7.0",
+ "randombytes": "^2.1.0",
+ "utf8": "3.0.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/webidl-conversions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
+ },
+ "node_modules/well-known-symbols": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/well-known-symbols/-/well-known-symbols-2.0.0.tgz",
+ "integrity": "sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/whatwg-url": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+ "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+ "dependencies": {
+ "tr46": "~0.0.3",
+ "webidl-conversions": "^3.0.0"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/which-module": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz",
+ "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ=="
+ },
+ "node_modules/why-is-node-running": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz",
+ "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==",
+ "dev": true,
+ "dependencies": {
+ "siginfo": "^2.0.0",
+ "stackback": "0.0.2"
+ },
+ "bin": {
+ "why-is-node-running": "cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/word-wrap": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/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==",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/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=="
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
+ },
+ "node_modules/ws": {
+ "version": "7.5.9",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz",
+ "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==",
+ "engines": {
+ "node": ">=8.3.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": "^5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "dev": true
+ },
+ "node_modules/yaml": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.0.tgz",
+ "integrity": "sha512-8/1wgzdKc7bc9E6my5wZjmdavHLvO/QOmLG1FBugblEvY4IXrLjlViIOmL24HthU042lWTDRO90Fz1Yp66UnMw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 14",
+ "npm": ">= 7"
+ }
+ },
+ "node_modules/yargs": {
+ "version": "17.7.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+ "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+ "dependencies": {
+ "cliui": "^8.0.1",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.3",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^21.1.1"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "21.1.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/zustand": {
+ "version": "4.3.8",
+ "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.3.8.tgz",
+ "integrity": "sha512-4h28KCkHg5ii/wcFFJ5Fp+k1J3gJoasaIbppdgZFO4BPJnsNxL0mQXBSFgOgAdCdBj35aDTPvdAJReTMntFPGg==",
+ "dependencies": {
+ "use-sync-external-store": "1.2.0"
+ },
+ "engines": {
+ "node": ">=12.7.0"
+ },
+ "peerDependencies": {
+ "immer": ">=9.0",
+ "react": ">=16.8"
+ },
+ "peerDependenciesMeta": {
+ "immer": {
+ "optional": true
+ },
+ "react": {
+ "optional": true
+ }
+ }
+ }
+ }
+}
diff --git a/airdrop/frontend/package.json b/airdrop/frontend/package.json
new file mode 100644
index 00000000..bb2b4303
--- /dev/null
+++ b/airdrop/frontend/package.json
@@ -0,0 +1,53 @@
+{
+ "name": "rc-airdop",
+ "private": true,
+ "version": "1.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "tsc && vite build",
+ "lint": "eslint src",
+ "lint:fix": "eslint src --fix",
+ "preview": "vite preview",
+ "test": "vitest",
+ "coverage": "vitest run --coverage",
+ "prettier": "prettier src --check",
+ "prettier:fix": "prettier src --write"
+ },
+ "dependencies": {
+ "@concordium/react-components": "^0.3.0",
+ "@heroicons/react": "^2.0.18",
+ "@types/crypto-js": "^4.1.1",
+ "axios": "^1.4.0",
+ "classnames": "^2.3.2",
+ "ipfs-http-client": "^60.0.1",
+ "merkletreejs": "^0.3.10",
+ "moment": "^2.29.4",
+ "prettier": "^2.8.8",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
+ "react-hook-form": "^7.44.1",
+ "react-router-dom": "^6.11.2",
+ "vite-plugin-wasm": "^3.2.2",
+ "zustand": "^4.3.8"
+ },
+ "devDependencies": {
+ "@types/react": "^18.0.28",
+ "@types/react-dom": "^18.0.11",
+ "@typescript-eslint/eslint-plugin": "^5.57.1",
+ "@typescript-eslint/parser": "^5.57.1",
+ "@vitejs/plugin-react": "^4.0.0",
+ "@vitest/coverage-c8": "^0.31.1",
+ "@vitest/coverage-istanbul": "^0.31.1",
+ "autoprefixer": "^10.4.14",
+ "eslint": "^8.38.0",
+ "eslint-plugin-react-hooks": "^4.6.0",
+ "eslint-plugin-react-refresh": "^0.3.4",
+ "postcss": "^8.4.23",
+ "tailwindcss": "^3.3.2",
+ "typescript": "^5.0.2",
+ "vite": "^4.3.9",
+ "vite-tsconfig-paths": "^4.2.0",
+ "vitest": "^0.31.1"
+ }
+}
diff --git a/airdrop/frontend/postcss.config.js b/airdrop/frontend/postcss.config.js
new file mode 100644
index 00000000..2e7af2b7
--- /dev/null
+++ b/airdrop/frontend/postcss.config.js
@@ -0,0 +1,6 @@
+export default {
+ plugins: {
+ tailwindcss: {},
+ autoprefixer: {},
+ },
+}
diff --git a/airdrop/frontend/public/airdrop-icon.svg b/airdrop/frontend/public/airdrop-icon.svg
new file mode 100644
index 00000000..9878b00b
--- /dev/null
+++ b/airdrop/frontend/public/airdrop-icon.svg
@@ -0,0 +1,18 @@
+
+
+
diff --git a/airdrop/frontend/public/nft.png b/airdrop/frontend/public/nft.png
new file mode 100644
index 00000000..4d8114ec
Binary files /dev/null and b/airdrop/frontend/public/nft.png differ
diff --git a/airdrop/frontend/public/vite.svg b/airdrop/frontend/public/vite.svg
new file mode 100644
index 00000000..e7b8dfb1
--- /dev/null
+++ b/airdrop/frontend/public/vite.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/airdrop/frontend/readme.md b/airdrop/frontend/readme.md
new file mode 100644
index 00000000..c3a92c32
--- /dev/null
+++ b/airdrop/frontend/readme.md
@@ -0,0 +1,121 @@
+# Airdrop Web Application
+Actual version
+you can find on https://rc-airdrop.vercel.app
+Example dApp for showcasing how to integrate with a smart contract on the Concordium blockchain.
+The project was bootstrapped with Vite.
+
+## Install
+Run installation in the root of the project.
+```bash
+npm install
+```
+
+## Run
+Run the app in development mode with
+```bash
+npm run dev
+```
+This spins up a server which serves the app on http://localhost:5173.
+
+Linting errors will appear in the console.
+
+Changes to the source code will cause the page to refresh automatically.
+
+## Build
+Build the app for production using
+```bash
+npm run build
+```
+This will drop an optimized and minified bundle in the build folder that is ready to be deployed.
+
+See the section about deployment for more information.
+
+## test
+Run unit tests
+```bash
+npm run test
+```
+
+## About Web Application
+The application provides a simple functionality to create and use airdrops.
+
+On the main page you can download examples of metadata.json that are required to create an airdrop
+
+To interact with the application you need the concordium wallet web extension
+
+### Create
+
+
+
+On the Create page you will find everything you need to create an airdrop using fields such as:
+- METADATA - (select the metadata file (you can use the examples from the homepage)). After a successful upload, you will see information about your NFT.
+- WHITELIST - (select an account whitelist file). The file is a set of wallet addresses that can pick up the airdrop. The "," is used as a delimiter. For example "4n...QA,3b...KB,5g...SL".
+- NFT LIMIT - maximum number of NFTs in this airdrop.
+- RESERVE - The number of NFTs to whitelist. Only whitelist accounts can pick up these tokens.
+- NFT LIMIT PER ADDRESS - the maximum number of NFTs that one account will be able to pick up.
+- NFT TIME LIMIT - the date and time that the airdrop is closed. Once closed, NFTs cannot be picked up.
+
+
+
+After you click on the drop button, an extension will open with the transaction.
+
+
+If you confirm it, you will see a loader with a link to [concordium explorer](https://dashboard.testnet.concordium.com/lookup/b44658c583b978abfc950dc9d92d5d42c610b04d7db3af4b9437c08827c26375) where you can get more information about the transaction.
+
+
+
+If the transaction was successful, you will see a green check mark in the loader and a link to the claim page.
+
+
+
+If the transaction failed, you will see a red cross and an error message in the loader.
+
+### Find
+
+On this page, you can find airdrops that interest you.
+
+- INDEX - set the contract index that was reported when the airdrop was created
+- SUBINDEX - set to 0
+
+
+
+### Claim
+
+On this page you can claim airdrops.
+
+- AMOUNT OF NFTs - number of NFTs to claim
+
+
+
+_base claim page_
+
+
+
+_success claim page_
+
+
+
+_error claim page_
+
+### Transactions
+
+On this page you can view all created transactions
+
+
+
+_transactions init (create)_
+
+
+
+_transactions claim_
+
+### Settings
+
+On this page you can view all created transactions
+
+
+
+### Other
+
+The application only supports the Concordium browser wallet.
+Concordium mobile wallets are not supported.
diff --git a/airdrop/frontend/src/app/app.tsx b/airdrop/frontend/src/app/app.tsx
new file mode 100644
index 00000000..a5ca2f6b
--- /dev/null
+++ b/airdrop/frontend/src/app/app.tsx
@@ -0,0 +1,13 @@
+import { Router } from './providers/router/ui/router.tsx';
+import { AirdropHeader } from 'widgets/header';
+
+function App() {
+ return (
+
+ );
+}
+
+export default App;
diff --git a/airdrop/frontend/src/app/providers/concordium-provider/hooks/use-concordium-props.ts b/airdrop/frontend/src/app/providers/concordium-provider/hooks/use-concordium-props.ts
new file mode 100644
index 00000000..aa0d1266
--- /dev/null
+++ b/airdrop/frontend/src/app/providers/concordium-provider/hooks/use-concordium-props.ts
@@ -0,0 +1,26 @@
+import { useConnection } from '@concordium/react-components/dist/useConnection';
+import { useConnect } from '@concordium/react-components';
+import { useMemo } from 'react';
+import { WalletConnectionProps } from '@concordium/react-components/dist/WithWalletConnector';
+import { ConcordiumContextProps } from 'shared/config/concordium-context.ts';
+
+export function useConcordiumProps(
+ walletConnectionPropsDefault: WalletConnectionProps,
+): ConcordiumContextProps {
+ const { connectedAccounts, genesisHashes, activeConnector } =
+ walletConnectionPropsDefault;
+
+ const connection = useConnection(connectedAccounts, genesisHashes);
+
+ const connect = useConnect(activeConnector, connection.setConnection);
+
+ return useMemo(
+ (): ConcordiumContextProps => ({
+ ...walletConnectionPropsDefault,
+ ...connection,
+ ...connect,
+ }),
+
+ [walletConnectionPropsDefault, connection, connect],
+ );
+}
diff --git a/airdrop/frontend/src/app/providers/concordium-provider/index.ts b/airdrop/frontend/src/app/providers/concordium-provider/index.ts
new file mode 100644
index 00000000..ba63aa9d
--- /dev/null
+++ b/airdrop/frontend/src/app/providers/concordium-provider/index.ts
@@ -0,0 +1 @@
+export { WalletConnectorWrapper } from './ui/wallet-connector-wrapper';
diff --git a/airdrop/frontend/src/app/providers/concordium-provider/ui/concordium-provider.tsx b/airdrop/frontend/src/app/providers/concordium-provider/ui/concordium-provider.tsx
new file mode 100644
index 00000000..8833347e
--- /dev/null
+++ b/airdrop/frontend/src/app/providers/concordium-provider/ui/concordium-provider.tsx
@@ -0,0 +1,22 @@
+import { FC, ReactNode } from 'react';
+import { WalletConnectionProps } from '@concordium/react-components/dist/WithWalletConnector';
+import { ConcordiumContext } from 'shared/config/concordium-context.ts';
+import { useConcordiumProps } from '../hooks/use-concordium-props.ts';
+
+interface ConcordiumProviderProps {
+ walletConnectionPropsDefault: WalletConnectionProps;
+ children: ReactNode;
+}
+
+export const ConcordiumProvider: FC = ({
+ walletConnectionPropsDefault,
+ children,
+}) => {
+ const defaultProps = useConcordiumProps(walletConnectionPropsDefault);
+
+ return (
+
+ {children}
+
+ );
+};
diff --git a/airdrop/frontend/src/app/providers/concordium-provider/ui/wallet-connector-wrapper.tsx b/airdrop/frontend/src/app/providers/concordium-provider/ui/wallet-connector-wrapper.tsx
new file mode 100644
index 00000000..251515d1
--- /dev/null
+++ b/airdrop/frontend/src/app/providers/concordium-provider/ui/wallet-connector-wrapper.tsx
@@ -0,0 +1,18 @@
+import { FC, PropsWithChildren } from 'react';
+import { WithWalletConnector } from '@concordium/react-components/dist/WithWalletConnector';
+import { ConcordiumProvider } from './concordium-provider.tsx';
+import { TESTNET } from '@concordium/react-components';
+
+export const WalletConnectorWrapper: FC = ({ children }) => {
+ return (
+
+ {(props) => {
+ return (
+
+ {children}
+
+ );
+ }}
+
+ );
+};
diff --git a/airdrop/frontend/src/app/providers/router/config/route-pages.tsx b/airdrop/frontend/src/app/providers/router/config/route-pages.tsx
new file mode 100644
index 00000000..e2f57dc6
--- /dev/null
+++ b/airdrop/frontend/src/app/providers/router/config/route-pages.tsx
@@ -0,0 +1,40 @@
+import { RouteProps } from 'react-router-dom';
+import { AppRoutes, RoutePath } from 'shared/config/route';
+import { Find } from 'pages/find';
+import { Home } from 'pages/home';
+import { Create } from 'pages/create';
+import { Claim } from 'pages/claim';
+import { NotFound } from 'pages/not-found';
+import { Transactions } from 'pages/transactions';
+import { Settings } from 'pages/settings';
+
+export const routeConfig: Record = {
+ [AppRoutes.HOME]: {
+ path: RoutePath[AppRoutes.HOME],
+ element: ,
+ },
+ [AppRoutes.SETTINGS]: {
+ path: RoutePath[AppRoutes.SETTINGS],
+ element: ,
+ },
+ [AppRoutes.CREATE]: {
+ path: RoutePath[AppRoutes.CREATE],
+ element: ,
+ },
+ [AppRoutes.FIND]: {
+ path: RoutePath[AppRoutes.FIND],
+ element: ,
+ },
+ [AppRoutes.TRANSACTIONS]: {
+ path: RoutePath[AppRoutes.TRANSACTIONS],
+ element: ,
+ },
+ [AppRoutes.CLAIM]: {
+ path: `${RoutePath[AppRoutes.CLAIM]}/:index/:subindex`,
+ element: ,
+ },
+ [AppRoutes.NOT_FOUNT]: {
+ path: RoutePath[AppRoutes.NOT_FOUNT],
+ element: ,
+ },
+};
diff --git a/airdrop/frontend/src/app/providers/router/ui/router.tsx b/airdrop/frontend/src/app/providers/router/ui/router.tsx
new file mode 100644
index 00000000..1d49c72b
--- /dev/null
+++ b/airdrop/frontend/src/app/providers/router/ui/router.tsx
@@ -0,0 +1,22 @@
+import { FC, Suspense } from 'react';
+import { Route, Routes } from 'react-router-dom';
+import { routeConfig } from 'app/providers/router/config/route-pages.tsx';
+import { PageLoader } from 'widgets/page-loader';
+
+export const Router: FC = () => {
+ return (
+
+ {Object.values(routeConfig).map(({ path, element }) => (
+ }>
+ {element}
+
+ }
+ />
+ ))}
+
+ );
+};
diff --git a/airdrop/frontend/src/app/styles/index.css b/airdrop/frontend/src/app/styles/index.css
new file mode 100644
index 00000000..1ab1058b
--- /dev/null
+++ b/airdrop/frontend/src/app/styles/index.css
@@ -0,0 +1,39 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+:root {
+ --foreground-rgb: 0, 0, 0;
+ --background-start-rgb: 214, 219, 220;
+ --background-end-rgb: 255, 255, 255;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --foreground-rgb: 255, 255, 255;
+ --background-start-rgb: 0, 0, 0;
+ --background-end-rgb: 0, 0, 0;
+ }
+}
+
+body {
+ color: rgb(var(--foreground-rgb));
+ background: linear-gradient(
+ to bottom,
+ transparent,
+ rgb(var(--background-end-rgb))
+ )
+ rgb(var(--background-start-rgb));
+ @apply dark:bg-gray-800;
+}
+
+.app {
+ min-height: 100vh;
+}
+
+.page-wrapper {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ min-height: 100%;
+}
diff --git a/airdrop/frontend/src/app/styles/reset.css b/airdrop/frontend/src/app/styles/reset.css
new file mode 100644
index 00000000..a4ede217
--- /dev/null
+++ b/airdrop/frontend/src/app/styles/reset.css
@@ -0,0 +1,80 @@
+* {
+ padding: 0;
+ margin: 0;
+ border: 0;
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+}
+
+:focus,
+:active {
+ outline: none;
+}
+
+a,
+a:visited,
+a:hover {
+ text-decoration: none;
+}
+
+a:focus,
+a:active {
+ outline: none;
+}
+
+nav,
+footer,
+header,
+aside {
+ display: block;
+}
+
+html,
+body {
+ height: 100%;
+ width: 100%;
+ line-height: 1;
+ font-size: 14px;
+ text-size-adjust: 100%;
+}
+
+input,
+button,
+textarea {
+ font-family: inherit;
+}
+
+input::-ms-clear {
+ display: none;
+}
+
+button {
+ cursor: pointer;
+}
+
+button::-moz-focus-inner {
+ padding: 0;
+ border: 0;
+}
+
+ul li {
+ list-style: none;
+}
+
+img {
+ vertical-align: top;
+}
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ font-size: inherit;
+ font-weight: inherit;
+}
diff --git a/airdrop/frontend/src/app/types/vite-env.d.ts b/airdrop/frontend/src/app/types/vite-env.d.ts
new file mode 100644
index 00000000..11f02fe2
--- /dev/null
+++ b/airdrop/frontend/src/app/types/vite-env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/airdrop/frontend/src/entities/nft-card/index.ts b/airdrop/frontend/src/entities/nft-card/index.ts
new file mode 100644
index 00000000..6450c706
--- /dev/null
+++ b/airdrop/frontend/src/entities/nft-card/index.ts
@@ -0,0 +1,2 @@
+export { NftCard } from './ui/nft-card.tsx';
+export { NftCardSkeleton } from './ui/nft-card-skeleton.tsx';
diff --git a/airdrop/frontend/src/entities/nft-card/ui/nft-card-skeleton.tsx b/airdrop/frontend/src/entities/nft-card/ui/nft-card-skeleton.tsx
new file mode 100644
index 00000000..57a57955
--- /dev/null
+++ b/airdrop/frontend/src/entities/nft-card/ui/nft-card-skeleton.tsx
@@ -0,0 +1,29 @@
+import { FC } from 'react';
+import cls from './nft-card.module.css';
+import classNames from 'classnames';
+
+interface NftCardSkeletonProps {
+ isLoading?: boolean;
+ className?: string;
+}
+
+export const NftCardSkeleton: FC = (props) => {
+ const { className, isLoading } = props;
+ return (
+
+ );
+};
diff --git a/airdrop/frontend/src/entities/nft-card/ui/nft-card.module.css b/airdrop/frontend/src/entities/nft-card/ui/nft-card.module.css
new file mode 100644
index 00000000..55026847
--- /dev/null
+++ b/airdrop/frontend/src/entities/nft-card/ui/nft-card.module.css
@@ -0,0 +1,45 @@
+.nftCard {
+ @apply bg-cover;
+ @apply rounded-[2rem];
+ @apply h-[512px] w-[512px];
+ @apply flex flex-col justify-end;
+ @apply border-8 border-gray-700;
+}
+.info {
+ @apply font-bold text-white text-xl;
+ @apply px-4 py-2 m-4;
+ @apply flex flex-col gap-2;
+ @apply bg-black bg-opacity-20 backdrop-blur-2xl shadow-xl;
+ @apply rounded-2xl;
+ @apply flex-grow-0 flex-shrink-0;
+ @apply transition;
+}
+
+.nftCardSkeleton {
+ @apply bg-gray-500;
+}
+
+.infoSkeleton {
+}
+
+.header {
+ @apply text-2xl;
+}
+
+.description {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+:hover.info .description {
+ white-space: normal;
+}
+
+.hideInfoArea {
+ flex-grow: 1;
+}
+
+:hover.hideInfoArea + .info {
+ @apply opacity-0;
+}
diff --git a/airdrop/frontend/src/entities/nft-card/ui/nft-card.tsx b/airdrop/frontend/src/entities/nft-card/ui/nft-card.tsx
new file mode 100644
index 00000000..257bbceb
--- /dev/null
+++ b/airdrop/frontend/src/entities/nft-card/ui/nft-card.tsx
@@ -0,0 +1,29 @@
+import { FC } from 'react';
+import cls from './nft-card.module.css';
+import classNames from 'classnames';
+import { Metadata } from 'widgets/form-init/model/metadata.ts';
+
+interface NftCardProps {
+ className?: string;
+ metadata: Metadata;
+}
+
+export const NftCard: FC = ({ className, metadata }) => {
+ return (
+
+
+
+
{metadata.name}
+
{metadata.description}
+
+
+ );
+};
diff --git a/airdrop/frontend/src/entities/transaction-claim-card/index.ts b/airdrop/frontend/src/entities/transaction-claim-card/index.ts
new file mode 100644
index 00000000..a714d3af
--- /dev/null
+++ b/airdrop/frontend/src/entities/transaction-claim-card/index.ts
@@ -0,0 +1,2 @@
+export { type AirdropTransactionClaim } from './model/airdrop-transaction-claim';
+export { TransactionClaimCard } from './ui/transaction-claim-card';
diff --git a/airdrop/frontend/src/entities/transaction-claim-card/model/airdrop-transaction-claim.ts b/airdrop/frontend/src/entities/transaction-claim-card/model/airdrop-transaction-claim.ts
new file mode 100644
index 00000000..abb02f6f
--- /dev/null
+++ b/airdrop/frontend/src/entities/transaction-claim-card/model/airdrop-transaction-claim.ts
@@ -0,0 +1,10 @@
+export interface AirdropTransactionClaim {
+ claimDate: Date;
+ whitelistUrl: string;
+ isOnWhitelist: boolean;
+ selectedToken: number;
+ amountOfTokens: number;
+ hash: string;
+ error: number;
+ contractIndex: number;
+}
diff --git a/airdrop/frontend/src/entities/transaction-claim-card/ui/transaction-claim-card.tsx b/airdrop/frontend/src/entities/transaction-claim-card/ui/transaction-claim-card.tsx
new file mode 100644
index 00000000..a825b9b4
--- /dev/null
+++ b/airdrop/frontend/src/entities/transaction-claim-card/ui/transaction-claim-card.tsx
@@ -0,0 +1,45 @@
+import { FC } from 'react';
+import { AirdropTransactionClaim } from 'entities/transaction-claim-card';
+import { TransactionHashLink } from 'shared/components/transaction-hash-link';
+import { IpfsCidLink } from 'shared/components/ipfs-cid-link';
+import { Link } from 'react-router-dom';
+import { RoutePath } from 'shared/config/route.ts';
+import { getErrorMessage } from 'shared/lib/get-error-message.ts';
+
+export const TransactionClaimCard: FC = (
+ transaction,
+) => {
+ return (
+
+
date: {transaction.claimDate.toDateString()}
+
time: {transaction.claimDate.toTimeString()}
+
+ contract address:{' '}
+
+ {`<${transaction.contractIndex}, 0>`}
+
+
+
+
is on whitelist: {String(transaction.isOnWhitelist)}
+
selected index: {String(transaction.selectedToken)}
+
amount of tokens: {String(transaction.amountOfTokens)}
+
+ status:{' '}
+ {transaction.error
+ ? getErrorMessage(transaction.error)
+ : 'success'}
+
+
+
+ );
+};
diff --git a/airdrop/frontend/src/entities/transaction-init-card/index.ts b/airdrop/frontend/src/entities/transaction-init-card/index.ts
new file mode 100644
index 00000000..2271d7d4
--- /dev/null
+++ b/airdrop/frontend/src/entities/transaction-init-card/index.ts
@@ -0,0 +1,2 @@
+export { TransactionInitCard } from './ui/transaction-init-card.tsx';
+export { type AirdropTransactionInit } from './model/airdrop-transaction-init.ts';
diff --git a/airdrop/frontend/src/entities/transaction-init-card/model/airdrop-transaction-init.ts b/airdrop/frontend/src/entities/transaction-init-card/model/airdrop-transaction-init.ts
new file mode 100644
index 00000000..b9be17ad
--- /dev/null
+++ b/airdrop/frontend/src/entities/transaction-init-card/model/airdrop-transaction-init.ts
@@ -0,0 +1,13 @@
+export interface AirdropTransactionInit {
+ initDate: Date;
+ metadataUrl: string;
+ whitelistUrl: string;
+ nftLimit: number;
+ reserve: number;
+ nftLimitPerAddress: number;
+ endTime: Date;
+ selectedIndex: boolean;
+ hash: string;
+ error: number;
+ contractIndex: number;
+}
diff --git a/airdrop/frontend/src/entities/transaction-init-card/ui/transaction-init-card.tsx b/airdrop/frontend/src/entities/transaction-init-card/ui/transaction-init-card.tsx
new file mode 100644
index 00000000..cbbdf5d4
--- /dev/null
+++ b/airdrop/frontend/src/entities/transaction-init-card/ui/transaction-init-card.tsx
@@ -0,0 +1,51 @@
+import { FC } from 'react';
+import { AirdropTransactionInit } from 'entities/transaction-init-card/model/airdrop-transaction-init.ts';
+import { TransactionHashLink } from 'shared/components/transaction-hash-link';
+import { IpfsCidLink } from 'shared/components/ipfs-cid-link';
+import { Link } from 'react-router-dom';
+import { RoutePath } from 'shared/config/route.ts';
+import { getErrorMessage } from 'shared/lib/get-error-message.ts';
+
+export const TransactionInitCard: FC = (
+ transaction,
+) => {
+ return (
+
+
date: {transaction.initDate.toDateString()}
+
time: {transaction.initDate.toTimeString()}
+
+ contract address:{' '}
+
+ {`<${transaction.contractIndex}, 0>`}
+
+
+
+
+
nft limit: {transaction.nftLimit}
+
reserve: {transaction.reserve}
+
nft limit per address: {transaction.nftLimitPerAddress}
+
airdrop end time: {transaction.endTime.toString()}
+
selected index: {String(transaction.selectedIndex)}
+
+ status:{' '}
+ {transaction.error
+ ? getErrorMessage(transaction.error)
+ : 'success'}
+
+
+
+ );
+};
diff --git a/airdrop/frontend/src/features/connect-button/hooks/use-button-action-connection.ts b/airdrop/frontend/src/features/connect-button/hooks/use-button-action-connection.ts
new file mode 100644
index 00000000..8fc84e90
--- /dev/null
+++ b/airdrop/frontend/src/features/connect-button/hooks/use-button-action-connection.ts
@@ -0,0 +1,12 @@
+import { useConcordiumApi } from 'shared/hooks/use-concordium-api.ts';
+
+type ButtonAction = 'connecting...' | 'disconnect' | 'connect';
+
+export function useButtonActionConnection(): ButtonAction {
+ const { isConnecting, connection } = useConcordiumApi();
+
+ if (isConnecting) {
+ return 'connecting...';
+ }
+ return connection ? 'disconnect' : 'connect';
+}
diff --git a/airdrop/frontend/src/features/connect-button/hooks/use-connect-button.ts b/airdrop/frontend/src/features/connect-button/hooks/use-connect-button.ts
new file mode 100644
index 00000000..f905ec6e
--- /dev/null
+++ b/airdrop/frontend/src/features/connect-button/hooks/use-connect-button.ts
@@ -0,0 +1,9 @@
+import { useToggleConnection } from './use-toggle-connection.ts';
+import { useButtonActionConnection } from './use-button-action-connection.ts';
+
+export function useConnectButton() {
+ return {
+ toggleConnection: useToggleConnection(),
+ actionConnection: useButtonActionConnection(),
+ };
+}
diff --git a/airdrop/frontend/src/features/connect-button/hooks/use-toggle-connection.ts b/airdrop/frontend/src/features/connect-button/hooks/use-toggle-connection.ts
new file mode 100644
index 00000000..02b727df
--- /dev/null
+++ b/airdrop/frontend/src/features/connect-button/hooks/use-toggle-connection.ts
@@ -0,0 +1,13 @@
+import { useConcordiumApi } from 'shared/hooks/use-concordium-api.ts';
+
+export function useToggleConnection() {
+ const { connection, activeConnector, setConnection } = useConcordiumApi();
+
+ return () =>
+ connection
+ ? setConnection(undefined)
+ : activeConnector
+ ?.connect()
+ .then(setConnection)
+ .catch(console.error);
+}
diff --git a/airdrop/frontend/src/features/connect-button/index.tsx b/airdrop/frontend/src/features/connect-button/index.tsx
new file mode 100644
index 00000000..13ca5358
--- /dev/null
+++ b/airdrop/frontend/src/features/connect-button/index.tsx
@@ -0,0 +1 @@
+export { ConnectButton } from './ui/connect-button.tsx';
diff --git a/airdrop/frontend/src/features/connect-button/ui/connect-button.module.css b/airdrop/frontend/src/features/connect-button/ui/connect-button.module.css
new file mode 100644
index 00000000..b0f1b939
--- /dev/null
+++ b/airdrop/frontend/src/features/connect-button/ui/connect-button.module.css
@@ -0,0 +1,23 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+.buttonConnect {
+ @apply rounded-lg border border-transparent;
+ @apply px-5 py-4;
+ @apply transition-colors;
+ @apply hover:border-gray-300 hover:bg-gray-100;
+ @apply hover:dark:border-neutral-700 hover:dark:bg-neutral-800/30;
+}
+
+.arrow {
+ @apply inline-block transition-transform group-hover:translate-x-1 motion-reduce:transform-none;
+}
+
+.title {
+ @apply mb-3 text-2xl font-semibold;
+}
+
+.description {
+ @apply m-0 max-w-[30ch] text-sm opacity-50;
+}
diff --git a/airdrop/frontend/src/features/connect-button/ui/connect-button.tsx b/airdrop/frontend/src/features/connect-button/ui/connect-button.tsx
new file mode 100644
index 00000000..ce8087b1
--- /dev/null
+++ b/airdrop/frontend/src/features/connect-button/ui/connect-button.tsx
@@ -0,0 +1,17 @@
+import { FC } from 'react';
+import { useConnectButton } from '../hooks/use-connect-button.ts';
+import { StyledButton } from 'shared/components/styled-button';
+import { UserIcon } from '@heroicons/react/24/outline';
+
+export const ConnectButton: FC = () => {
+ const { toggleConnection, actionConnection } = useConnectButton();
+ return (
+ }
+ onClick={toggleConnection}
+ description={'wallet connection'}
+ >
+ {actionConnection}
+
+ );
+};
diff --git a/airdrop/frontend/src/features/form-metadata/index.ts b/airdrop/frontend/src/features/form-metadata/index.ts
new file mode 100644
index 00000000..f52bbdb3
--- /dev/null
+++ b/airdrop/frontend/src/features/form-metadata/index.ts
@@ -0,0 +1 @@
+export { FormMetadata } from 'features/form-metadata/ui/form-metadata.tsx';
diff --git a/airdrop/frontend/src/features/form-metadata/ui/form-metadata.tsx b/airdrop/frontend/src/features/form-metadata/ui/form-metadata.tsx
new file mode 100644
index 00000000..284f82cd
--- /dev/null
+++ b/airdrop/frontend/src/features/form-metadata/ui/form-metadata.tsx
@@ -0,0 +1,82 @@
+import { SubmitHandler, useForm } from 'react-hook-form';
+import { listenerFabric } from 'widgets/form-init/lib/listner-fabric.ts';
+import { useEffect, useState } from 'react';
+import { TextAlert } from 'shared/components/text-alert';
+import { useMetadataStore } from 'shared/model/use-metadata-store.ts';
+import { postIpfs } from 'widgets/form-init/lib/post-ipfs.ts';
+import { InputFile } from 'shared/components/input-file';
+
+interface FormMetadataProps {
+ metadata: FileList;
+}
+
+export function FormMetadata() {
+ const {
+ register,
+ handleSubmit,
+ formState: { errors },
+ } = useForm();
+
+ const [metadata, setMetadata] = useState('');
+ const [isLoading, setIsLoading] = useState(false);
+ const [filename, setFilename] = useState('');
+ const setStoreMetadata = useMetadataStore((state) => state.setMetadata);
+ const setMetadataUrl = useMetadataStore((state) => state.setMetadataUrl);
+ const setMetadataFile = useMetadataStore((state) => state.setMetadataFile);
+ const [fileError, setFileError] = useState();
+
+ useEffect(() => {
+ if (metadata) {
+ setStoreMetadata(JSON.parse(metadata));
+ } else {
+ setStoreMetadata(undefined);
+ }
+ handleSubmit(onAction)();
+ }, [metadata]);
+
+ const onAction: SubmitHandler = async (
+ data,
+ ): Promise => {
+ setIsLoading(true);
+ try {
+ setFilename(data.metadata[0].name);
+ const metadataReader = new FileReader();
+ metadataReader.onloadend = listenerFabric(setMetadata);
+ metadataReader.readAsText(data.metadata[0]);
+ setMetadataFile(data.metadata);
+
+ setMetadataUrl(await postIpfs(data.metadata[0]));
+ } catch (error) {
+ console.error(error);
+ setFileError('unknown file error');
+ } finally {
+ setIsLoading(false);
+ }
+ };
+
+ return (
+
+ );
+}
diff --git a/airdrop/frontend/src/features/form-smart-contract/index.ts b/airdrop/frontend/src/features/form-smart-contract/index.ts
new file mode 100644
index 00000000..ca465215
--- /dev/null
+++ b/airdrop/frontend/src/features/form-smart-contract/index.ts
@@ -0,0 +1 @@
+export { FormSmartContract } from './ui/form-smart-contract';
diff --git a/airdrop/frontend/src/features/form-smart-contract/ui/form-smart-contract.tsx b/airdrop/frontend/src/features/form-smart-contract/ui/form-smart-contract.tsx
new file mode 100644
index 00000000..e61ff7f8
--- /dev/null
+++ b/airdrop/frontend/src/features/form-smart-contract/ui/form-smart-contract.tsx
@@ -0,0 +1,107 @@
+import { FC } from 'react';
+import classNames from 'classnames';
+import { SubmitHandler, useForm } from 'react-hook-form';
+import { TextAlert } from 'shared/components/text-alert';
+import { BASE_64_RAW_SCHEMA, RAW_MODULE_REFERENCE } from 'shared/config';
+import {
+ LOCAL_STORAGE_KEY_MODULE_REFERENCE,
+ LOCAL_STORAGE_KEY_RAW_SCHEMA,
+} from 'shared/config/local-storage.ts';
+import {
+ DEFAULT_BASE_64_RAW_SCHEMA,
+ DEFAULT_RAW_MODULE_REFERENCE,
+} from 'shared/config/smart-contract.ts';
+
+interface FormSmartContractWrapperProps {
+ className?: string;
+}
+
+interface FormSmartContractProps {
+ 'Raw Schema': string;
+ 'Module Reference': string;
+}
+
+export const FormSmartContract: FC = ({
+ className,
+}) => {
+ const {
+ register,
+ handleSubmit,
+ formState: { errors },
+ } = useForm();
+
+ function resetHandler() {
+ sessionStorage.setItem(
+ LOCAL_STORAGE_KEY_MODULE_REFERENCE,
+ DEFAULT_RAW_MODULE_REFERENCE,
+ );
+ sessionStorage.setItem(
+ LOCAL_STORAGE_KEY_RAW_SCHEMA,
+ DEFAULT_BASE_64_RAW_SCHEMA,
+ );
+ window.location.reload();
+ }
+
+ const onAction: SubmitHandler = async (
+ data,
+ ): Promise => {
+ sessionStorage.setItem(
+ LOCAL_STORAGE_KEY_MODULE_REFERENCE,
+ data['Module Reference'],
+ );
+ sessionStorage.setItem(
+ LOCAL_STORAGE_KEY_RAW_SCHEMA,
+ data['Raw Schema'],
+ );
+ window.location.reload();
+ };
+
+ return (
+
+ );
+};
diff --git a/airdrop/frontend/src/features/form-whitelist/index.ts b/airdrop/frontend/src/features/form-whitelist/index.ts
new file mode 100644
index 00000000..2639613b
--- /dev/null
+++ b/airdrop/frontend/src/features/form-whitelist/index.ts
@@ -0,0 +1 @@
+export { FormWhitelist } from 'features/form-whitelist/ui/form-whitelist.tsx';
diff --git a/airdrop/frontend/src/features/form-whitelist/ui/form-whitelist.tsx b/airdrop/frontend/src/features/form-whitelist/ui/form-whitelist.tsx
new file mode 100644
index 00000000..01e1f6ce
--- /dev/null
+++ b/airdrop/frontend/src/features/form-whitelist/ui/form-whitelist.tsx
@@ -0,0 +1,88 @@
+import { SubmitHandler, useForm } from 'react-hook-form';
+import { listenerFabric } from 'widgets/form-init/lib/listner-fabric.ts';
+import { useEffect, useState } from 'react';
+import { TextAlert } from 'shared/components/text-alert';
+import { useWhitelistStore } from 'shared/model/use-whitelist-store.ts';
+import { postIpfs } from 'widgets/form-init/lib/post-ipfs.ts';
+import { InputFile } from 'shared/components/input-file';
+
+interface FormWhitelistProps {
+ whitelist: FileList;
+}
+
+export function FormWhitelist() {
+ const { register, handleSubmit } = useForm();
+
+ const [whitelist, setWhitelist] = useState('');
+ const [isLoading, setIsLoading] = useState(false);
+ const [fileError, setFileError] = useState();
+ const [filename, setFilename] = useState('');
+ const setStoreWhitelist = useWhitelistStore((state) => state.setWhitelist);
+ const setStoreWhitelistUrl = useWhitelistStore(
+ (state) => state.setWhitelistUrl,
+ );
+
+ useEffect(() => {
+ if (whitelist) {
+ setStoreWhitelist(whitelist);
+ }
+ handleSubmit(onAction)();
+ }, [whitelist]);
+
+ const onAction: SubmitHandler = async (data): Promise => {
+ setIsLoading(true);
+ try {
+ setFilename(data.whitelist[0].name);
+ } catch (error) {
+ setIsLoading(false);
+ return;
+ }
+
+ try {
+ const whitelistReader = new FileReader();
+ whitelistReader.onloadend = listenerFabric(setWhitelist);
+ whitelistReader.readAsText(data.whitelist[0]);
+ } catch (error) {
+ console.error(error);
+ if (error instanceof Error) {
+ setFileError(error.message)
+ } else {
+ setFileError('File loading error');
+ }
+ setIsLoading(false);
+ return;
+ }
+
+ try {
+ setStoreWhitelistUrl(await postIpfs(data.whitelist[0]));
+ } catch (error) {
+ console.error(error);
+ if (error instanceof Error) {
+ setFileError(error.message)
+ } else {
+ setFileError('File loading error');
+ }
+ } finally {
+ setIsLoading(false);
+ }
+ };
+
+ return (
+
+ );
+}
diff --git a/airdrop/frontend/src/features/input-date/index.ts b/airdrop/frontend/src/features/input-date/index.ts
new file mode 100644
index 00000000..d5e38cfa
--- /dev/null
+++ b/airdrop/frontend/src/features/input-date/index.ts
@@ -0,0 +1 @@
+export { InputDate } from 'features/input-date/ui/input-date.tsx';
diff --git a/airdrop/frontend/src/features/input-date/ui/input-date.module.css b/airdrop/frontend/src/features/input-date/ui/input-date.module.css
new file mode 100644
index 00000000..812b6980
--- /dev/null
+++ b/airdrop/frontend/src/features/input-date/ui/input-date.module.css
@@ -0,0 +1,42 @@
+.inputBox {
+ position: relative;
+ width: 16rem;
+ margin-top: 8px;
+}
+
+.inputBox input {
+ width: 100%;
+ padding: 10px;
+ border: 1px solid rgba(0, 0, 0, 0.25);
+ background: var(--background-color);
+ border-radius: 5px;
+ outline: none;
+ font-size: 1rem;
+ @apply text-black dark:text-white;
+}
+
+.inputBox span {
+ position: absolute;
+ left: 0;
+ padding: 10px;
+ pointer-events: none;
+ color: rgba(0, 0, 0, 0.25);
+ text-transform: uppercase;
+ transition: 0.5s;
+}
+
+.inputBox input:valid ~ span,
+.inputBox input:focus ~ span {
+ color: #fff;
+ transform: translateX(10px) translateY(-7px);
+ font-size: 0.65em;
+ padding: 0 10px;
+ background: #444;
+ border-radius: 5px;
+ letter-spacing: 0.2em;
+}
+
+.inputBox input:valid,
+.inputBox input:focus {
+ border: 1px solid #1d2d3a;
+}
diff --git a/airdrop/frontend/src/features/input-date/ui/input-date.tsx b/airdrop/frontend/src/features/input-date/ui/input-date.tsx
new file mode 100644
index 00000000..95581528
--- /dev/null
+++ b/airdrop/frontend/src/features/input-date/ui/input-date.tsx
@@ -0,0 +1,24 @@
+import { FC, InputHTMLAttributes } from 'react';
+import cls from './input-date.module.css';
+import classNames from 'classnames';
+
+interface InputDateProps extends InputHTMLAttributes {
+ className?: string;
+ register?: any;
+}
+
+export const InputDate: FC = (props) => {
+ const { className, register, ...otherProps } = props;
+ return (
+
+
+
+ {register.name}
+
+
+ );
+};
diff --git a/airdrop/frontend/src/features/input-number/index.ts b/airdrop/frontend/src/features/input-number/index.ts
new file mode 100644
index 00000000..0c3e8f91
--- /dev/null
+++ b/airdrop/frontend/src/features/input-number/index.ts
@@ -0,0 +1 @@
+export { InputNumber } from './ui/input-number.tsx';
diff --git a/airdrop/frontend/src/features/input-number/ui/input-number.module.css b/airdrop/frontend/src/features/input-number/ui/input-number.module.css
new file mode 100644
index 00000000..812b6980
--- /dev/null
+++ b/airdrop/frontend/src/features/input-number/ui/input-number.module.css
@@ -0,0 +1,42 @@
+.inputBox {
+ position: relative;
+ width: 16rem;
+ margin-top: 8px;
+}
+
+.inputBox input {
+ width: 100%;
+ padding: 10px;
+ border: 1px solid rgba(0, 0, 0, 0.25);
+ background: var(--background-color);
+ border-radius: 5px;
+ outline: none;
+ font-size: 1rem;
+ @apply text-black dark:text-white;
+}
+
+.inputBox span {
+ position: absolute;
+ left: 0;
+ padding: 10px;
+ pointer-events: none;
+ color: rgba(0, 0, 0, 0.25);
+ text-transform: uppercase;
+ transition: 0.5s;
+}
+
+.inputBox input:valid ~ span,
+.inputBox input:focus ~ span {
+ color: #fff;
+ transform: translateX(10px) translateY(-7px);
+ font-size: 0.65em;
+ padding: 0 10px;
+ background: #444;
+ border-radius: 5px;
+ letter-spacing: 0.2em;
+}
+
+.inputBox input:valid,
+.inputBox input:focus {
+ border: 1px solid #1d2d3a;
+}
diff --git a/airdrop/frontend/src/features/input-number/ui/input-number.tsx b/airdrop/frontend/src/features/input-number/ui/input-number.tsx
new file mode 100644
index 00000000..9497953c
--- /dev/null
+++ b/airdrop/frontend/src/features/input-number/ui/input-number.tsx
@@ -0,0 +1,62 @@
+import { type FC } from 'react';
+import {
+ type FieldErrors,
+ type FieldValues,
+ type Path,
+ type UseFormRegister,
+} from 'react-hook-form';
+import { TextAlert } from 'shared/components/text-alert';
+import cls from './input-number.module.css';
+import classNames from 'classnames';
+
+export const numberRegExp = /^\d+$/;
+
+interface NumberInputProperties {
+ className?: string;
+ name: Path;
+ register: UseFormRegister;
+ errors: FieldErrors;
+ defaultValue?: number;
+}
+
+// replace any to Record
+type customFC = FC>;
+
+export const InputNumber: customFC = (
+ props: NumberInputProperties,
+) => {
+ const { name, register, errors, defaultValue, className } = props;
+
+ return (
+
+
+
+ {name}
+
+
+ {errors[name]?.type === 'required' && (
+ {name} is required
+ )}
+ {errors[name]?.type === 'pattern' && (
+ Input correct {name}
+ )}
+ {errors[name]?.type === 'min' && (
+ The min {name} is 0
+ )}
+ {errors[name]?.type === 'max' && (
+ The max {name} is 100'000
+ )}
+
+
+ );
+};
diff --git a/airdrop/frontend/src/features/status-transaction-claim/index.ts b/airdrop/frontend/src/features/status-transaction-claim/index.ts
new file mode 100644
index 00000000..395a52ae
--- /dev/null
+++ b/airdrop/frontend/src/features/status-transaction-claim/index.ts
@@ -0,0 +1 @@
+export { StatusTransactionClaim } from './ui/status-transaction-claim.tsx';
diff --git a/airdrop/frontend/src/features/status-transaction-claim/ui/status-transaction-claim.module.css b/airdrop/frontend/src/features/status-transaction-claim/ui/status-transaction-claim.module.css
new file mode 100644
index 00000000..c9a8c598
--- /dev/null
+++ b/airdrop/frontend/src/features/status-transaction-claim/ui/status-transaction-claim.module.css
@@ -0,0 +1,18 @@
+.statusTransactionClaim {
+ @apply max-w-max;
+ @apply flex flex-col gap-2;
+ @apply px-4 py-2;
+ @apply border-[1px] border-gray-700 rounded-md;
+}
+.iconsBar {
+ @apply flex gap-2;
+ @apply justify-center items-center;
+}
+.iconsBar > * {
+ @apply self-center;
+}
+
+.errorMessage {
+ @apply border-t-[1px] border-gray-700;
+ @apply p-2;
+}
diff --git a/airdrop/frontend/src/features/status-transaction-claim/ui/status-transaction-claim.tsx b/airdrop/frontend/src/features/status-transaction-claim/ui/status-transaction-claim.tsx
new file mode 100644
index 00000000..68f0808b
--- /dev/null
+++ b/airdrop/frontend/src/features/status-transaction-claim/ui/status-transaction-claim.tsx
@@ -0,0 +1,56 @@
+import { FC } from 'react';
+import cls from './status-transaction-claim.module.css';
+import classNames from 'classnames';
+import { EXPLORER_URL } from 'shared/config/urls.ts';
+import {
+ ArrowTopRightOnSquareIcon,
+ CheckIcon,
+ XMarkIcon,
+} from '@heroicons/react/24/outline';
+import { Spinner } from 'shared/components/spinner';
+import { TextAlert } from 'shared/components/text-alert';
+import { getErrorMessage } from 'shared/lib/get-error-message.ts';
+
+interface ClaimTransactionStatusProps {
+ transactionHash: string;
+ isLoading: boolean;
+ errorCode: number | undefined;
+ className?: string;
+}
+
+export const StatusTransactionClaim: FC = (
+ props,
+) => {
+ const { className, isLoading, errorCode, transactionHash } = props;
+ return (
+
+
+
+ {isLoading && }
+ {!!errorCode && (
+
+ )}
+ {!isLoading && !errorCode && (
+
+ )}
+
+
+
+
+
+
+ {!!errorCode && (
+
+ {errorCode !== 0 && (
+
+ {getErrorMessage(errorCode)}
+
+ )}
+
+ )}
+
+ );
+};
diff --git a/airdrop/frontend/src/features/status-transaction-init/index.ts b/airdrop/frontend/src/features/status-transaction-init/index.ts
new file mode 100644
index 00000000..41b50c9e
--- /dev/null
+++ b/airdrop/frontend/src/features/status-transaction-init/index.ts
@@ -0,0 +1 @@
+export { StatusTransactionInit } from './ui/status-transaction-init.tsx';
diff --git a/airdrop/frontend/src/features/status-transaction-init/ui/status-transaction-init.module.css b/airdrop/frontend/src/features/status-transaction-init/ui/status-transaction-init.module.css
new file mode 100644
index 00000000..f9058cb9
--- /dev/null
+++ b/airdrop/frontend/src/features/status-transaction-init/ui/status-transaction-init.module.css
@@ -0,0 +1,24 @@
+.statusTransactionInit {
+ @apply max-w-max;
+ @apply flex flex-col gap-2;
+ @apply px-4 py-2;
+ @apply border-[1px] border-gray-700 rounded-md;
+}
+
+.iconsBar {
+ @apply flex gap-2;
+ @apply justify-center items-center;
+}
+
+.iconsBar > * {
+ @apply self-center;
+}
+
+.borderTop {
+ @apply border-t-[1px] border-gray-700;
+ @apply p-2;
+}
+
+.link {
+ @apply text-blue-500 hover:text-blue-700;
+}
diff --git a/airdrop/frontend/src/features/status-transaction-init/ui/status-transaction-init.tsx b/airdrop/frontend/src/features/status-transaction-init/ui/status-transaction-init.tsx
new file mode 100644
index 00000000..19e96702
--- /dev/null
+++ b/airdrop/frontend/src/features/status-transaction-init/ui/status-transaction-init.tsx
@@ -0,0 +1,80 @@
+import { FC } from 'react';
+import cls from './status-transaction-init.module.css';
+import classNames from 'classnames';
+import { Spinner } from 'shared/components/spinner';
+import {
+ ArrowTopRightOnSquareIcon,
+ CheckIcon,
+ XMarkIcon,
+} from '@heroicons/react/24/outline';
+import { EXPLORER_URL } from 'shared/config/urls.ts';
+import { TextAlert } from 'shared/components/text-alert';
+import { getErrorMessage } from 'shared/lib/get-error-message.ts';
+import { RoutePath } from 'shared/config/route.ts';
+import { Link } from 'react-router-dom';
+
+interface StatusTransactionInitProps {
+ transactionHash: string;
+ contractIndex: bigint | undefined;
+ isLoading: boolean;
+ errorCode: number | undefined;
+ className?: string;
+}
+
+export const StatusTransactionInit: FC = (
+ props,
+) => {
+ const { className, isLoading, errorCode, transactionHash, contractIndex } =
+ props;
+
+ if (isLoading) {
+ return (
+
+ );
+ }
+
+ return (
+
+
+
+ {!!errorCode && (
+
+ )}
+
+ {!isLoading && !errorCode && (
+
+ )}
+
+
+
+
+
+
+
+ {!errorCode && !!contractIndex && (
+
+ {`<${contractIndex}, 0>`}{' '}
+
+ )}
+
+ {!!errorCode && errorCode !== 0 && (
+
+ {getErrorMessage(errorCode)}
+
+ )}
+
+ );
+};
diff --git a/airdrop/frontend/src/main.tsx b/airdrop/frontend/src/main.tsx
new file mode 100644
index 00000000..e5551cd9
--- /dev/null
+++ b/airdrop/frontend/src/main.tsx
@@ -0,0 +1,13 @@
+import ReactDOM from 'react-dom/client';
+import App from './app/app.tsx';
+import './app/styles/index.css';
+import { BrowserRouter } from 'react-router-dom';
+import { WalletConnectorWrapper } from 'app/providers/concordium-provider';
+
+ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(
+
+
+
+
+ ,
+);
diff --git a/airdrop/frontend/src/pages/claim/index.ts b/airdrop/frontend/src/pages/claim/index.ts
new file mode 100644
index 00000000..9ea40b95
--- /dev/null
+++ b/airdrop/frontend/src/pages/claim/index.ts
@@ -0,0 +1 @@
+export { ClaimAsync as Claim } from './ui/claim.async';
diff --git a/airdrop/frontend/src/pages/claim/ui/claim.async.ts b/airdrop/frontend/src/pages/claim/ui/claim.async.ts
new file mode 100644
index 00000000..606ed313
--- /dev/null
+++ b/airdrop/frontend/src/pages/claim/ui/claim.async.ts
@@ -0,0 +1,3 @@
+import { lazy } from 'react';
+
+export const ClaimAsync = lazy(async () => import('./claim'));
diff --git a/airdrop/frontend/src/pages/claim/ui/claim.tsx b/airdrop/frontend/src/pages/claim/ui/claim.tsx
new file mode 100644
index 00000000..46b0224c
--- /dev/null
+++ b/airdrop/frontend/src/pages/claim/ui/claim.tsx
@@ -0,0 +1,20 @@
+import { FormClaim } from 'widgets/form-claim';
+import { NftCard, NftCardSkeleton } from 'entities/nft-card';
+import { usePageMetadata } from 'shared/hooks/use-page-metadata.ts';
+
+export default function Claim() {
+ const metadata = usePageMetadata();
+
+ return (
+
+ {metadata ? (
+
+ ) : (
+
+ )}
+
+
+
+
+ );
+}
diff --git a/airdrop/frontend/src/pages/create/index.tsx b/airdrop/frontend/src/pages/create/index.tsx
new file mode 100644
index 00000000..a6bbaf65
--- /dev/null
+++ b/airdrop/frontend/src/pages/create/index.tsx
@@ -0,0 +1 @@
+export { CreateAsync as Create } from './ui/create.async';
diff --git a/airdrop/frontend/src/pages/create/ui/create.async.tsx b/airdrop/frontend/src/pages/create/ui/create.async.tsx
new file mode 100644
index 00000000..f2a8838c
--- /dev/null
+++ b/airdrop/frontend/src/pages/create/ui/create.async.tsx
@@ -0,0 +1,3 @@
+import { lazy } from 'react';
+
+export const CreateAsync = lazy(async () => import('./create'));
diff --git a/airdrop/frontend/src/pages/create/ui/create.tsx b/airdrop/frontend/src/pages/create/ui/create.tsx
new file mode 100644
index 00000000..b168b0c1
--- /dev/null
+++ b/airdrop/frontend/src/pages/create/ui/create.tsx
@@ -0,0 +1,21 @@
+import { FormInit } from 'widgets/form-init';
+import { FormMetadata } from 'features/form-metadata';
+import { useMetadataStore } from 'shared/model/use-metadata-store.ts';
+import { FormWhitelist } from 'features/form-whitelist';
+import { NftCard } from 'entities/nft-card/ui/nft-card.tsx';
+import { NftCardSkeleton } from 'entities/nft-card';
+
+export default function Create() {
+ const metadata = useMetadataStore((state) => state.metadata);
+ return (
+
+
+
+
+
+
+
+ {metadata ? : }
+
+ );
+}
diff --git a/airdrop/frontend/src/pages/find/index.tsx b/airdrop/frontend/src/pages/find/index.tsx
new file mode 100644
index 00000000..a3459766
--- /dev/null
+++ b/airdrop/frontend/src/pages/find/index.tsx
@@ -0,0 +1 @@
+export { FindAsync as Find } from './ui/find.async';
diff --git a/airdrop/frontend/src/pages/find/ui/find.async.ts b/airdrop/frontend/src/pages/find/ui/find.async.ts
new file mode 100644
index 00000000..18509365
--- /dev/null
+++ b/airdrop/frontend/src/pages/find/ui/find.async.ts
@@ -0,0 +1,3 @@
+import { lazy } from 'react';
+
+export const FindAsync = lazy(async () => import('./find'));
diff --git a/airdrop/frontend/src/pages/find/ui/find.tsx b/airdrop/frontend/src/pages/find/ui/find.tsx
new file mode 100644
index 00000000..b81db90c
--- /dev/null
+++ b/airdrop/frontend/src/pages/find/ui/find.tsx
@@ -0,0 +1,9 @@
+import { FormFind } from 'widgets/form-find';
+
+export default function Find() {
+ return (
+
+
+
+ );
+}
diff --git a/airdrop/frontend/src/pages/home/index.ts b/airdrop/frontend/src/pages/home/index.ts
new file mode 100644
index 00000000..3e66e6a2
--- /dev/null
+++ b/airdrop/frontend/src/pages/home/index.ts
@@ -0,0 +1 @@
+export { HomeAsync as Home } from 'pages/home/ui/home.async.ts';
diff --git a/airdrop/frontend/src/pages/home/ui/home.async.ts b/airdrop/frontend/src/pages/home/ui/home.async.ts
new file mode 100644
index 00000000..ac1e7b35
--- /dev/null
+++ b/airdrop/frontend/src/pages/home/ui/home.async.ts
@@ -0,0 +1,3 @@
+import { lazy } from 'react';
+
+export const HomeAsync = lazy(async () => import('./home'));
diff --git a/airdrop/frontend/src/pages/home/ui/home.tsx b/airdrop/frontend/src/pages/home/ui/home.tsx
new file mode 100644
index 00000000..fd9f0d46
--- /dev/null
+++ b/airdrop/frontend/src/pages/home/ui/home.tsx
@@ -0,0 +1,36 @@
+import { IPFS_URL } from 'shared/config/urls.ts';
+
+export default function Home() {
+ return (
+
+ Hello Concordium User!
+
+ Here you can download simple metadata examples for testing the
+ application:
+
+
+
+ );
+}
diff --git a/airdrop/frontend/src/pages/not-found/index.ts b/airdrop/frontend/src/pages/not-found/index.ts
new file mode 100644
index 00000000..4e3913d3
--- /dev/null
+++ b/airdrop/frontend/src/pages/not-found/index.ts
@@ -0,0 +1 @@
+export { NotFound } from './ui/not-found';
diff --git a/airdrop/frontend/src/pages/not-found/ui/not-found.module.css b/airdrop/frontend/src/pages/not-found/ui/not-found.module.css
new file mode 100644
index 00000000..98215eda
--- /dev/null
+++ b/airdrop/frontend/src/pages/not-found/ui/not-found.module.css
@@ -0,0 +1,8 @@
+.notFound {
+ @apply text-3xl min-h-max;
+ display: flex;
+ flex-direction: column;
+ gap: 1rem;
+ justify-content: center;
+ align-items: center;
+}
diff --git a/airdrop/frontend/src/pages/not-found/ui/not-found.tsx b/airdrop/frontend/src/pages/not-found/ui/not-found.tsx
new file mode 100644
index 00000000..0fb2c8dd
--- /dev/null
+++ b/airdrop/frontend/src/pages/not-found/ui/not-found.tsx
@@ -0,0 +1,15 @@
+import { FC } from 'react';
+import cls from './not-found.module.css';
+
+interface NotFoundProps {
+ className?: string;
+}
+
+export const NotFound: FC = () => {
+ return (
+
+ 404
+ page not found
+
+ );
+};
diff --git a/airdrop/frontend/src/pages/settings/index.ts b/airdrop/frontend/src/pages/settings/index.ts
new file mode 100644
index 00000000..82644717
--- /dev/null
+++ b/airdrop/frontend/src/pages/settings/index.ts
@@ -0,0 +1 @@
+export { SettingsAsync as Settings } from './ui/settings.async.ts';
diff --git a/airdrop/frontend/src/pages/settings/ui/settings.async.ts b/airdrop/frontend/src/pages/settings/ui/settings.async.ts
new file mode 100644
index 00000000..ba75338b
--- /dev/null
+++ b/airdrop/frontend/src/pages/settings/ui/settings.async.ts
@@ -0,0 +1,3 @@
+import { lazy } from 'react';
+
+export const SettingsAsync = lazy(async () => import('./settings'));
diff --git a/airdrop/frontend/src/pages/settings/ui/settings.tsx b/airdrop/frontend/src/pages/settings/ui/settings.tsx
new file mode 100644
index 00000000..00508271
--- /dev/null
+++ b/airdrop/frontend/src/pages/settings/ui/settings.tsx
@@ -0,0 +1,11 @@
+import { SettingsTransactions } from 'widgets/settings-transactions';
+import { AppVersion } from 'shared/components/app-version/ui/app-version';
+
+export default function Settings() {
+ return (
+
+
+
+
+ );
+}
diff --git a/airdrop/frontend/src/pages/transactions/index.ts b/airdrop/frontend/src/pages/transactions/index.ts
new file mode 100644
index 00000000..9660460b
--- /dev/null
+++ b/airdrop/frontend/src/pages/transactions/index.ts
@@ -0,0 +1 @@
+export { TransactionsAsync as Transactions } from './ui/transactions.async';
diff --git a/airdrop/frontend/src/pages/transactions/ui/transactions.async.ts b/airdrop/frontend/src/pages/transactions/ui/transactions.async.ts
new file mode 100644
index 00000000..6e46317f
--- /dev/null
+++ b/airdrop/frontend/src/pages/transactions/ui/transactions.async.ts
@@ -0,0 +1,3 @@
+import { lazy } from 'react';
+
+export const TransactionsAsync = lazy(async () => import('./transactions'));
diff --git a/airdrop/frontend/src/pages/transactions/ui/transactions.tsx b/airdrop/frontend/src/pages/transactions/ui/transactions.tsx
new file mode 100644
index 00000000..f50a6676
--- /dev/null
+++ b/airdrop/frontend/src/pages/transactions/ui/transactions.tsx
@@ -0,0 +1,13 @@
+import { TransactionsInitList } from 'widgets/transactions-init-list';
+import { TransactionsClaimList } from 'widgets/transactions-claim-list';
+
+export default function Transactions() {
+ return (
+
+
+
+
+
+
+ );
+}
diff --git a/airdrop/frontend/src/shared/components/app-version/index.ts b/airdrop/frontend/src/shared/components/app-version/index.ts
new file mode 100644
index 00000000..e69de29b
diff --git a/airdrop/frontend/src/shared/components/app-version/ui/app-version.module.css b/airdrop/frontend/src/shared/components/app-version/ui/app-version.module.css
new file mode 100644
index 00000000..1a2b1187
--- /dev/null
+++ b/airdrop/frontend/src/shared/components/app-version/ui/app-version.module.css
@@ -0,0 +1,3 @@
+.appVersion {
+ @apply self-start text-2xl;
+}
diff --git a/airdrop/frontend/src/shared/components/app-version/ui/app-version.tsx b/airdrop/frontend/src/shared/components/app-version/ui/app-version.tsx
new file mode 100644
index 00000000..a75510b6
--- /dev/null
+++ b/airdrop/frontend/src/shared/components/app-version/ui/app-version.tsx
@@ -0,0 +1,18 @@
+import type { FC } from 'react';
+import classNames from 'classnames';
+import cls from './app-version.module.css';
+import { version } from '../../../../../package.json';
+
+interface AppVersionProps {
+ className?: string;
+}
+
+export const AppVersion: FC = (props) => {
+ const { className } = props;
+
+ return (
+
+ current version: {version}
+
+ );
+};
diff --git a/airdrop/frontend/src/shared/components/input-file/index.ts b/airdrop/frontend/src/shared/components/input-file/index.ts
new file mode 100644
index 00000000..d2251f95
--- /dev/null
+++ b/airdrop/frontend/src/shared/components/input-file/index.ts
@@ -0,0 +1 @@
+export { InputFile } from './ui/input-file';
diff --git a/airdrop/frontend/src/shared/components/input-file/ui/input-file.module.css b/airdrop/frontend/src/shared/components/input-file/ui/input-file.module.css
new file mode 100644
index 00000000..656761a9
--- /dev/null
+++ b/airdrop/frontend/src/shared/components/input-file/ui/input-file.module.css
@@ -0,0 +1,16 @@
+.inputFile {
+ @apply flex justify-between;
+ @apply w-64 px-4 py-3;
+ @apply cursor-pointer;
+ @apply border-[1px] border-gray-700 border-dashed;
+ @apply rounded-md;
+}
+
+.inputFileError {
+ @apply border-[1px] border-red-700 border-dashed;
+ @apply text-red-700 dark:text-red-500;
+}
+
+.accept {
+ @apply text-gray-500;
+}
diff --git a/airdrop/frontend/src/shared/components/input-file/ui/input-file.tsx b/airdrop/frontend/src/shared/components/input-file/ui/input-file.tsx
new file mode 100644
index 00000000..128017b7
--- /dev/null
+++ b/airdrop/frontend/src/shared/components/input-file/ui/input-file.tsx
@@ -0,0 +1,68 @@
+import { FC, InputHTMLAttributes } from 'react';
+import cls from './input-file.module.css';
+import { CheckIcon, XMarkIcon } from '@heroicons/react/24/outline';
+import { Spinner } from 'shared/components/spinner';
+import classNames from 'classnames';
+
+interface InputFileProps extends InputHTMLAttributes {
+ innerText?: string;
+ isLoading?: boolean;
+ isSuccess?: boolean;
+ isInvalid?: boolean;
+ className?: string;
+ formReg?: any;
+}
+
+export const InputFile: FC = (props) => {
+ const {
+ className,
+ innerText,
+ formReg,
+ isLoading = false,
+ isSuccess = false,
+ isInvalid = false,
+ ...otherProps
+ } = props;
+
+ return (
+
+ );
+};
diff --git a/airdrop/frontend/src/shared/components/ipfs-cid-link/index.ts b/airdrop/frontend/src/shared/components/ipfs-cid-link/index.ts
new file mode 100644
index 00000000..63422afb
--- /dev/null
+++ b/airdrop/frontend/src/shared/components/ipfs-cid-link/index.ts
@@ -0,0 +1 @@
+export { IpfsCidLink } from './ui/ipfs-cid-link.tsx';
diff --git a/airdrop/frontend/src/shared/components/ipfs-cid-link/ui/ipfs-cid-link.tsx b/airdrop/frontend/src/shared/components/ipfs-cid-link/ui/ipfs-cid-link.tsx
new file mode 100644
index 00000000..e903acdd
--- /dev/null
+++ b/airdrop/frontend/src/shared/components/ipfs-cid-link/ui/ipfs-cid-link.tsx
@@ -0,0 +1,22 @@
+import { FC } from 'react';
+import { IPFS_URL } from 'shared/config/urls.ts';
+
+interface TransactionHashLinkProps {
+ name?: string;
+ link: string;
+}
+
+export const IpfsCidLink: FC = ({ link, name }) => {
+ return (
+
+ {name}:
+
+ {link.replace(IPFS_URL + '/', '')}
+
+
+ );
+};
diff --git a/airdrop/frontend/src/shared/components/spinner/index.ts b/airdrop/frontend/src/shared/components/spinner/index.ts
new file mode 100644
index 00000000..ef241e9d
--- /dev/null
+++ b/airdrop/frontend/src/shared/components/spinner/index.ts
@@ -0,0 +1 @@
+export { Spinner } from './ui/spinner';
diff --git a/airdrop/frontend/src/shared/components/spinner/ui/spinner.module.css b/airdrop/frontend/src/shared/components/spinner/ui/spinner.module.css
new file mode 100644
index 00000000..501afd75
--- /dev/null
+++ b/airdrop/frontend/src/shared/components/spinner/ui/spinner.module.css
@@ -0,0 +1,42 @@
+.spinner {
+ border: 5px solid #333;
+ border-bottom-color: transparent;
+ border-radius: 50%;
+ display: inline-block;
+ box-sizing: border-box;
+ animation: rotation 1s linear infinite;
+}
+
+@keyframes rotation {
+ 0% {
+ transform: rotate(0deg);
+ }
+
+ 100% {
+ transform: rotate(360deg);
+ }
+}
+
+.xs {
+ border-width: 2px;
+ width: 24px;
+ height: 24px;
+}
+
+.sm {
+ border-width: 3px;
+ width: 36px;
+ height: 36px;
+}
+
+.md {
+ border-width: 4px;
+ width: 48px;
+ height: 48px;
+}
+
+.lg {
+ border-width: 8px;
+ width: 96px;
+ height: 96px;
+}
diff --git a/airdrop/frontend/src/shared/components/spinner/ui/spinner.tsx b/airdrop/frontend/src/shared/components/spinner/ui/spinner.tsx
new file mode 100644
index 00000000..70951023
--- /dev/null
+++ b/airdrop/frontend/src/shared/components/spinner/ui/spinner.tsx
@@ -0,0 +1,12 @@
+import { FC } from 'react';
+import cls from './spinner.module.css';
+import classNames from 'classnames';
+
+interface SpinnerProps {
+ className?: string;
+ variant?: 'xs' | 'sm' | 'md' | 'lg';
+}
+
+export const Spinner: FC = ({ className, variant = 'md' }) => {
+ return ;
+};
diff --git a/airdrop/frontend/src/shared/components/styled-button/index.ts b/airdrop/frontend/src/shared/components/styled-button/index.ts
new file mode 100644
index 00000000..47f870c6
--- /dev/null
+++ b/airdrop/frontend/src/shared/components/styled-button/index.ts
@@ -0,0 +1 @@
+export { StyledButton } from './ui/styled-button.tsx';
diff --git a/airdrop/frontend/src/shared/components/styled-button/ui/styled-button.module.css b/airdrop/frontend/src/shared/components/styled-button/ui/styled-button.module.css
new file mode 100644
index 00000000..19177f63
--- /dev/null
+++ b/airdrop/frontend/src/shared/components/styled-button/ui/styled-button.module.css
@@ -0,0 +1,43 @@
+.styledButton {
+ @apply px-5 py-4;
+ @apply pr-7;
+ @apply min-w-[256px];
+ @apply text-left;
+ @apply max-h-fit max-w-fit;
+ @apply rounded-lg border-2 border-transparent;
+ @apply border-gray-400 hover:bg-gray-100;
+ @apply hover:border-gray-600;
+ @apply dark:border-neutral-700 hover:dark:bg-neutral-800/30;
+ @apply transition-colors;
+}
+
+.title {
+ @apply max-h-min;
+ @apply flex gap-2;
+ @apply mb-3;
+ @apply text-2xl font-semibold;
+ @apply transition-all;
+}
+
+.center {
+ @apply justify-center;
+}
+
+.children {
+}
+
+.styledButton:hover .title {
+ @apply gap-4;
+}
+
+.icon {
+ @apply h-7 w-7;
+ @apply self-end;
+ @apply inline-block;
+ @apply transition-transform;
+ @apply motion-reduce:transform-none;
+}
+
+.description {
+ @apply m-0 max-w-[30ch] text-sm opacity-50;
+}
diff --git a/airdrop/frontend/src/shared/components/styled-button/ui/styled-button.tsx b/airdrop/frontend/src/shared/components/styled-button/ui/styled-button.tsx
new file mode 100644
index 00000000..9de3e3d1
--- /dev/null
+++ b/airdrop/frontend/src/shared/components/styled-button/ui/styled-button.tsx
@@ -0,0 +1,25 @@
+import { ButtonHTMLAttributes, FC, ReactNode } from 'react';
+import cls from './styled-button.module.css';
+import classNames from 'classnames';
+
+interface Properties extends ButtonHTMLAttributes {
+ icon?: ReactNode;
+ description?: string;
+ className?: string;
+}
+
+export const StyledButton: FC = (props) => {
+ const { children, description, icon, className } = props;
+ return (
+
+ );
+};
diff --git a/airdrop/frontend/src/shared/components/styled-link/index.ts b/airdrop/frontend/src/shared/components/styled-link/index.ts
new file mode 100644
index 00000000..8eb1ab97
--- /dev/null
+++ b/airdrop/frontend/src/shared/components/styled-link/index.ts
@@ -0,0 +1 @@
+export { StyledLink } from './ui/styled-link.tsx';
diff --git a/airdrop/frontend/src/shared/components/styled-link/ui/styled-link.tsx b/airdrop/frontend/src/shared/components/styled-link/ui/styled-link.tsx
new file mode 100644
index 00000000..d4a36efb
--- /dev/null
+++ b/airdrop/frontend/src/shared/components/styled-link/ui/styled-link.tsx
@@ -0,0 +1,28 @@
+import { FC, ReactNode } from 'react';
+import { Link } from 'react-router-dom';
+import { ArrowRightIcon } from '@heroicons/react/24/outline';
+
+interface Properties {
+ children: ReactNode;
+ description?: string;
+ to: string;
+}
+
+export const StyledLink: FC = ({ children, to, description }) => {
+ return (
+
+
+ {children}{' '}
+
+
+
+
+
+ {description}
+
+
+ );
+};
diff --git a/airdrop/frontend/src/shared/components/text-alert/index.ts b/airdrop/frontend/src/shared/components/text-alert/index.ts
new file mode 100644
index 00000000..afe03deb
--- /dev/null
+++ b/airdrop/frontend/src/shared/components/text-alert/index.ts
@@ -0,0 +1 @@
+export { TextAlert } from './ui/text-alert.tsx';
diff --git a/airdrop/frontend/src/shared/components/text-alert/ui/text-alert.tsx b/airdrop/frontend/src/shared/components/text-alert/ui/text-alert.tsx
new file mode 100644
index 00000000..79ef6aaa
--- /dev/null
+++ b/airdrop/frontend/src/shared/components/text-alert/ui/text-alert.tsx
@@ -0,0 +1,27 @@
+import { FC, ReactNode } from 'react';
+import { ExclamationTriangleIcon } from '@heroicons/react/24/outline';
+
+interface TextAlertProps {
+ icon?: boolean;
+ className?: string;
+ children?: ReactNode;
+}
+
+export const TextAlert: FC = ({
+ className,
+ icon = true,
+ children,
+}) => {
+ return (
+
+ {icon && (
+
+
+
+ )}
+ {children}
+
+ );
+};
diff --git a/airdrop/frontend/src/shared/components/text-success/index.ts b/airdrop/frontend/src/shared/components/text-success/index.ts
new file mode 100644
index 00000000..8ad7ea5c
--- /dev/null
+++ b/airdrop/frontend/src/shared/components/text-success/index.ts
@@ -0,0 +1 @@
+export { TextSuccess } from './ui/text-success.tsx';
diff --git a/airdrop/frontend/src/shared/components/text-success/ui/text-success.tsx b/airdrop/frontend/src/shared/components/text-success/ui/text-success.tsx
new file mode 100644
index 00000000..d5258b86
--- /dev/null
+++ b/airdrop/frontend/src/shared/components/text-success/ui/text-success.tsx
@@ -0,0 +1,14 @@
+import { FC, ReactNode } from 'react';
+
+interface TextSuccessProps {
+ className?: string;
+ children?: ReactNode;
+}
+
+export const TextSuccess: FC = ({ className, children }) => {
+ return (
+
+ {children}
+
+ );
+};
diff --git a/airdrop/frontend/src/shared/components/transaction-hash-link/index.ts b/airdrop/frontend/src/shared/components/transaction-hash-link/index.ts
new file mode 100644
index 00000000..a703d3bb
--- /dev/null
+++ b/airdrop/frontend/src/shared/components/transaction-hash-link/index.ts
@@ -0,0 +1 @@
+export { TransactionHashLink } from './ui/transaction-hash-link';
diff --git a/airdrop/frontend/src/shared/components/transaction-hash-link/ui/transaction-hash-link.tsx b/airdrop/frontend/src/shared/components/transaction-hash-link/ui/transaction-hash-link.tsx
new file mode 100644
index 00000000..19441bd1
--- /dev/null
+++ b/airdrop/frontend/src/shared/components/transaction-hash-link/ui/transaction-hash-link.tsx
@@ -0,0 +1,20 @@
+import { FC } from 'react';
+import { EXPLORER_URL } from 'shared/config/urls.ts';
+
+interface TransactionHashLinkProps {
+ transactionHash: string;
+}
+
+export const TransactionHashLink: FC = ({
+ transactionHash,
+}) => {
+ return (
+
+ {transactionHash}
+
+ );
+};
diff --git a/airdrop/frontend/src/shared/config/api.ts b/airdrop/frontend/src/shared/config/api.ts
new file mode 100644
index 00000000..47296626
--- /dev/null
+++ b/airdrop/frontend/src/shared/config/api.ts
@@ -0,0 +1,3 @@
+export const PINATA_API_KEY = '25961eb67d1f33c6d03a';
+export const PINATA_SECRET_API_KEY =
+ '65a555538d3a0de8bd08bfdbb1f6363743b4480f86435547de4a255fdf1d39a8';
diff --git a/airdrop/frontend/src/shared/config/concordium-context.ts b/airdrop/frontend/src/shared/config/concordium-context.ts
new file mode 100644
index 00000000..7a931fce
--- /dev/null
+++ b/airdrop/frontend/src/shared/config/concordium-context.ts
@@ -0,0 +1,14 @@
+import { createContext } from 'react';
+import { WalletConnectionProps } from '@concordium/react-components/dist/WithWalletConnector';
+import { Connection } from '@concordium/react-components/dist/useConnection';
+import { Connect } from '@concordium/react-components';
+
+export type ConcordiumContextProps = WalletConnectionProps &
+ Connection &
+ Connect;
+
+export const ConcordiumContext = createContext>(
+ {},
+);
+
+export const LOCAL_STORAGE_CONCORDIUM_KEY = 'walletConnectionProps';
diff --git a/airdrop/frontend/src/shared/config/dummy.ts b/airdrop/frontend/src/shared/config/dummy.ts
new file mode 100644
index 00000000..320815eb
--- /dev/null
+++ b/airdrop/frontend/src/shared/config/dummy.ts
@@ -0,0 +1,4 @@
+export const DUMMY_WHITELIST = [
+ '4n7N78gNEXuVjmdD421H4X6tdjDQ4LdkYswV8paAJzQVsvZ4QU',
+ '3br3Fx9AvGjfqaRedgmPncQrUmSxtBqRtSZnBaWCueHaiEpxKB',
+];
diff --git a/airdrop/frontend/src/shared/config/index.ts b/airdrop/frontend/src/shared/config/index.ts
new file mode 100644
index 00000000..72855ed8
--- /dev/null
+++ b/airdrop/frontend/src/shared/config/index.ts
@@ -0,0 +1,8 @@
+export {
+ CONTRACT_NAME,
+ BASE_64_RAW_SCHEMA,
+ RAW_MODULE_REFERENCE,
+ MODULE_REFERENCE,
+ BROWSER_WALLET,
+ MAX_CONTRACT_EXECUTION_ENERGY,
+} from './smart-contract.ts';
diff --git a/airdrop/frontend/src/shared/config/local-storage.ts b/airdrop/frontend/src/shared/config/local-storage.ts
new file mode 100644
index 00000000..1399d852
--- /dev/null
+++ b/airdrop/frontend/src/shared/config/local-storage.ts
@@ -0,0 +1,11 @@
+export const LOCAL_STORAGE_KEY_AIRDROP_TRANSACTIONS_INIT =
+ 'airdrop-transactions-init';
+
+export const LOCAL_STORAGE_KEY_AIRDROP_TRANSACTIONS_CLAIM =
+ 'airdrop-transactions-claim';
+
+export const LOCAL_STORAGE_KEY_LAST_CONTRACT_INDEX =
+ 'airdrop-last-contract-index';
+
+export const LOCAL_STORAGE_KEY_RAW_SCHEMA = 'airdrop-raw-schema';
+export const LOCAL_STORAGE_KEY_MODULE_REFERENCE = 'airdrop-module-reference';
diff --git a/airdrop/frontend/src/shared/config/route.ts b/airdrop/frontend/src/shared/config/route.ts
new file mode 100644
index 00000000..248325e6
--- /dev/null
+++ b/airdrop/frontend/src/shared/config/route.ts
@@ -0,0 +1,19 @@
+export enum AppRoutes {
+ HOME = 'main',
+ CREATE = 'create',
+ FIND = 'find',
+ CLAIM = 'claim',
+ NOT_FOUNT = 'not-found',
+ TRANSACTIONS = 'transactions',
+ SETTINGS = 'settings',
+}
+
+export const RoutePath: Record = {
+ [AppRoutes.HOME]: '/',
+ [AppRoutes.CREATE]: `/${AppRoutes.CREATE}`,
+ [AppRoutes.FIND]: `/${AppRoutes.FIND}`,
+ [AppRoutes.CLAIM]: `/${AppRoutes.CLAIM}`,
+ [AppRoutes.TRANSACTIONS]: `/${AppRoutes.TRANSACTIONS}`,
+ [AppRoutes.SETTINGS]: `/${AppRoutes.SETTINGS}`,
+ [AppRoutes.NOT_FOUNT]: '*',
+};
diff --git a/airdrop/frontend/src/shared/config/smart-contract.ts b/airdrop/frontend/src/shared/config/smart-contract.ts
new file mode 100644
index 00000000..302a4865
--- /dev/null
+++ b/airdrop/frontend/src/shared/config/smart-contract.ts
@@ -0,0 +1,35 @@
+import { ModuleReference } from '@concordium/web-sdk';
+import {
+ BrowserWalletConnector,
+ ephemeralConnectorType,
+} from '@concordium/react-components';
+import {
+ LOCAL_STORAGE_KEY_MODULE_REFERENCE,
+ LOCAL_STORAGE_KEY_RAW_SCHEMA,
+} from 'shared/config/local-storage.ts';
+
+export const BROWSER_WALLET = ephemeralConnectorType(
+ BrowserWalletConnector.create,
+);
+
+export const MAX_CONTRACT_EXECUTION_ENERGY = BigInt(30_000);
+
+export const CONTRACT_NAME = 'airdrop_project';
+
+const storedModuleReference = sessionStorage.getItem(
+ LOCAL_STORAGE_KEY_MODULE_REFERENCE,
+);
+
+export const DEFAULT_RAW_MODULE_REFERENCE =
+ '0edbd695743789ac415289c31391ec66e66958efbaa1ea826b37ddcdeea74e7e';
+
+export const RAW_MODULE_REFERENCE =
+ storedModuleReference ?? DEFAULT_RAW_MODULE_REFERENCE;
+export const MODULE_REFERENCE = new ModuleReference(RAW_MODULE_REFERENCE);
+
+const storedRawSchema = sessionStorage.getItem(LOCAL_STORAGE_KEY_RAW_SCHEMA);
+
+export const DEFAULT_BASE_64_RAW_SCHEMA =
+ '//8DAQAAAA8AAABhaXJkcm9wX3Byb2plY3QBABQACQAAAAkAAAB3aGl0ZWxpc3QQAhYCCQAAAG5mdF9saW1pdAQVAAAAbmZ0X2xpbWl0X3Blcl9hZGRyZXNzBA4AAABuZnRfdGltZV9saW1pdAUHAAAAcmVzZXJ2ZQQIAAAAYmFzZV91cmwWAggAAABtZXRhZGF0YRYCDgAAAHdoaXRlbGlzdF9maWxlFgIOAAAAc2VsZWN0ZWRfaW5kZXgBBgAAAAoAAABiYWxhbmNlX29mAhQAAgAAAAYAAABfZHVtbXkIBAAAAG5vZGULBAsAAABjaGVja19vd25lcgIUAAEAAAAFAAAAdG9rZW4dABQAAQAAAAcAAABhZGRyZXNzFQIAAAAEAAAATm9uZQIEAAAAU29tZQEBAAAAFgIJAAAAY2xhaW1fbmZ0BBQABQAAAAUAAABwcm9vZhACFgIEAAAAbm9kZQsLAAAAbm9kZV9zdHJpbmcWAg4AAABzZWxlY3RlZF90b2tlbh0AEAAAAGFtb3VudF9vZl90b2tlbnMEFQgAAAAPAAAATkZUTGltaXRSZWFjaGVkAhUAAABBZGRyZXNzTm90T25XaGl0ZWxpc3QCEAAAAEFpcmRyb3BOb3dDbG9zZWQCEwAAAE1pbnRpbmdMb2dNYWxmb3JtZWQCDgAAAE1pbnRpbmdMb2dGdWxsAhQAAABNZXRhRGF0YUxvZ01hbGZvcm1lZAIPAAAATWV0YURhdGFMb2dGdWxsAhMAAABJbmRleEFscmVhZHlDbGFpbWVkAg4AAABjdXJyZW50X3N1cHBseQEEDAAAAHRvdGFsX3N1cHBseQEEBAAAAHZpZXcBFAADAAAACAAAAG1ldGFkYXRhFgIJAAAAd2hpdGVsaXN0FgIOAAAAbnVtYmVyX29mX25mdHMEAA==';
+
+export const BASE_64_RAW_SCHEMA = storedRawSchema ?? DEFAULT_BASE_64_RAW_SCHEMA;
diff --git a/airdrop/frontend/src/shared/config/urls.ts b/airdrop/frontend/src/shared/config/urls.ts
new file mode 100644
index 00000000..fbea17ef
--- /dev/null
+++ b/airdrop/frontend/src/shared/config/urls.ts
@@ -0,0 +1,3 @@
+export const EXPLORER_URL = 'https://dashboard.testnet.concordium.com/lookup';
+
+export const IPFS_URL = 'https://gateway.pinata.cloud/ipfs';
diff --git a/airdrop/frontend/src/shared/hooks/use-auth.ts b/airdrop/frontend/src/shared/hooks/use-auth.ts
new file mode 100644
index 00000000..f00ceeae
--- /dev/null
+++ b/airdrop/frontend/src/shared/hooks/use-auth.ts
@@ -0,0 +1,9 @@
+import { useConcordiumApi } from 'shared/hooks/use-concordium-api.ts';
+
+export function useAuth() {
+ const { account } = useConcordiumApi();
+
+ return {
+ isAuth: !!account,
+ };
+}
diff --git a/airdrop/frontend/src/shared/hooks/use-concordium-api.ts b/airdrop/frontend/src/shared/hooks/use-concordium-api.ts
new file mode 100644
index 00000000..20eb334c
--- /dev/null
+++ b/airdrop/frontend/src/shared/hooks/use-concordium-api.ts
@@ -0,0 +1,13 @@
+import {
+ ConcordiumContext,
+ ConcordiumContextProps,
+} from 'shared/config/concordium-context.ts';
+import { useContext } from 'react';
+
+export function useConcordiumApi(): ConcordiumContextProps {
+ const walletConnectionProps = useContext(
+ ConcordiumContext,
+ ) as ConcordiumContextProps;
+
+ return { ...walletConnectionProps };
+}
diff --git a/airdrop/frontend/src/shared/hooks/use-page-metadata.ts b/airdrop/frontend/src/shared/hooks/use-page-metadata.ts
new file mode 100644
index 00000000..3b9f52f5
--- /dev/null
+++ b/airdrop/frontend/src/shared/hooks/use-page-metadata.ts
@@ -0,0 +1,24 @@
+import { useConcordiumApi } from 'shared/hooks/use-concordium-api.ts';
+import { useParams } from 'react-router-dom';
+import { useEffect, useState } from 'react';
+import { Metadata } from 'widgets/form-init/model/metadata.ts';
+import { contractView } from 'shared/lib/contract-view.ts';
+import axios from 'axios';
+
+export function usePageMetadata() {
+ const { connection } = useConcordiumApi();
+ const { index } = useParams();
+ const [metadata, setMetadata] = useState();
+
+ useEffect(() => {
+ (async () => {
+ if (connection && index) {
+ const state = await contractView(connection, +index);
+ const metadata = (await axios.get(state.metadataUrl)).data;
+ setMetadata(metadata);
+ }
+ })();
+ }, [connection]);
+
+ return metadata;
+}
diff --git a/airdrop/frontend/src/shared/lib/addDays.ts b/airdrop/frontend/src/shared/lib/addDays.ts
new file mode 100644
index 00000000..b7c926a3
--- /dev/null
+++ b/airdrop/frontend/src/shared/lib/addDays.ts
@@ -0,0 +1,8 @@
+export function addDays(date: Date, days: number) {
+ const futureDate = date.getDate() + days;
+ date.setDate(futureDate);
+ date.setHours(date.getHours() + 1);
+ date.setMinutes(0);
+ date.setSeconds(0);
+ return date.toISOString().slice(0, -8);
+}
diff --git a/airdrop/frontend/src/shared/lib/contract-claim.ts b/airdrop/frontend/src/shared/lib/contract-claim.ts
new file mode 100644
index 00000000..de190cf5
--- /dev/null
+++ b/airdrop/frontend/src/shared/lib/contract-claim.ts
@@ -0,0 +1,46 @@
+import { AccountTransactionType, CcdAmount } from '@concordium/web-sdk';
+import {
+ CONTRACT_NAME,
+ BASE_64_RAW_SCHEMA,
+ MAX_CONTRACT_EXECUTION_ENERGY,
+} from '../config';
+import {
+ moduleSchemaFromBase64,
+ WalletConnection,
+} from '@concordium/react-components';
+import { getProof } from 'shared/lib/get-proof.ts';
+
+export async function contractClaim(
+ connection: WalletConnection,
+ account: string,
+ index: number,
+ subindex: number,
+ selectedToken: number,
+ amountOfTokens: number,
+): Promise {
+ const proof = await getProof(connection, account, index);
+
+ return connection.signAndSendTransaction(
+ account,
+ AccountTransactionType.Update,
+ {
+ amount: new CcdAmount(BigInt(0)),
+ address: {
+ index: BigInt(index),
+ subindex: BigInt(subindex),
+ },
+ receiveName: `${CONTRACT_NAME}.claim_nft`,
+ maxContractExecutionEnergy: MAX_CONTRACT_EXECUTION_ENERGY,
+ },
+ {
+ parameters: {
+ proof: proof,
+ node: account,
+ node_string: account,
+ selected_token: selectedToken.toString().padStart(8, '0'),
+ amount_of_tokens: amountOfTokens,
+ },
+ schema: moduleSchemaFromBase64(BASE_64_RAW_SCHEMA),
+ },
+ );
+}
diff --git a/airdrop/frontend/src/shared/lib/contract-view.ts b/airdrop/frontend/src/shared/lib/contract-view.ts
new file mode 100644
index 00000000..2b78c09e
--- /dev/null
+++ b/airdrop/frontend/src/shared/lib/contract-view.ts
@@ -0,0 +1,28 @@
+import { CONTRACT_NAME } from '../config';
+import { WalletConnection } from '@concordium/react-components';
+import { ContractState } from 'shared/model/contract-state.ts';
+import { deserializeReceiveReturnValue, toBuffer } from '@concordium/web-sdk';
+import { DEFAULT_BASE_64_RAW_SCHEMA } from '../config/smart-contract.ts';
+
+export async function contractView(
+ connection: WalletConnection,
+ index: number,
+): Promise {
+ const encodedView = await connection.getJsonRpcClient().invokeContract({
+ contract: { index: BigInt(index), subindex: BigInt(0) },
+ method: `${CONTRACT_NAME}.view`,
+ });
+
+ const contractState = deserializeReceiveReturnValue(
+ toBuffer((encodedView as any).returnValue, 'hex'),
+ toBuffer(DEFAULT_BASE_64_RAW_SCHEMA, 'base64'),
+ CONTRACT_NAME,
+ 'view',
+ 2,
+ );
+ return {
+ metadataUrl: contractState.metadata,
+ whitelistUrl: contractState.whitelist,
+ numberOfNFTs: contractState['number_of_nfts'],
+ };
+}
diff --git a/airdrop/frontend/src/shared/lib/get-error-message.ts b/airdrop/frontend/src/shared/lib/get-error-message.ts
new file mode 100644
index 00000000..499a2d6d
--- /dev/null
+++ b/airdrop/frontend/src/shared/lib/get-error-message.ts
@@ -0,0 +1,28 @@
+export function getErrorMessage(error: number) {
+ return `error: (${error}) ${getErrorMessageWithoutCode(error)}`;
+}
+
+function getErrorMessageWithoutCode(error: number) {
+ switch (error) {
+ case 0:
+ return 'Success';
+ case -1:
+ return 'NFT Limit Reached';
+ case -2:
+ return 'Address Not On Whitelist';
+ case -3:
+ return 'Airdrop Now Closed';
+ case -4:
+ return 'Minting Log Mal formed';
+ case -5:
+ return 'Minting Log Full';
+ case -6:
+ return 'Metadata Log Mal formed';
+ case -7:
+ return 'Metadata Log Full';
+ case -8:
+ return 'Index Already Claimed';
+ default:
+ return 'Unknown Error';
+ }
+}
diff --git a/airdrop/frontend/src/shared/lib/get-proof.ts b/airdrop/frontend/src/shared/lib/get-proof.ts
new file mode 100644
index 00000000..59056297
--- /dev/null
+++ b/airdrop/frontend/src/shared/lib/get-proof.ts
@@ -0,0 +1,37 @@
+import { create_hash_tree, get_hash_proof } from 'shared/lib/merkle-tree';
+import { SHA256 } from 'crypto-js';
+import { contractView } from 'shared/lib/contract-view.ts';
+import axios from 'axios';
+import { WalletConnection } from '@concordium/react-components';
+
+export async function getProof(
+ connection: WalletConnection,
+ account: string,
+ index: number,
+): Promise {
+ const contractState = await contractView(connection, index);
+ const whitelistRaw = (await axios.get(contractState.whitelistUrl)).data;
+ const whitelist = whitelistRaw?.split(',');
+
+ if (!whitelist) {
+ throw new Error('no fetched whitelistUrl');
+ }
+
+ const tree = create_hash_tree(whitelist);
+
+ let proof: string[] = [];
+
+ if (tree) {
+ const hashed = SHA256(account).toString();
+ try {
+ proof = get_hash_proof(hashed, tree) || [];
+ } catch (error) {
+ console.error('error proof');
+ console.error(error);
+ }
+ } else {
+ console.error('build tree error');
+ }
+
+ return proof;
+}
diff --git a/airdrop/frontend/src/shared/lib/merkle-tree.spec.ts b/airdrop/frontend/src/shared/lib/merkle-tree.spec.ts
new file mode 100644
index 00000000..cf288473
--- /dev/null
+++ b/airdrop/frontend/src/shared/lib/merkle-tree.spec.ts
@@ -0,0 +1,62 @@
+import { describe, expect, it } from 'vitest';
+import {
+ check_hash_value,
+ create_hash_tree,
+ get_hash_proof,
+} from './merkle-tree';
+import { SHA256 } from 'crypto-js';
+
+const DEFAULT_WHITElIST = [
+ '4n7N78gNEXuVjmdD421H4X6tdjDQ4LdkYswV8paAJzQVsvZ4QU',
+ '3br3Fx9AvGjfqaRedgmPncQrUmSxtBqRtSZnBaWCueHaiEpxKB',
+];
+
+const WHITELIST_ADDRESS = DEFAULT_WHITElIST[0];
+const NON_WHITELIST_ADDRESS =
+ '4n7N78gNEXuVjmdD421H4X6tdjDQ4LdkYswV8paAJzQVsvZ4QA';
+
+describe('merkle tree', () => {
+ it('creating tree', () => {
+ const address = WHITELIST_ADDRESS;
+ const tree = create_hash_tree(DEFAULT_WHITElIST);
+ expect(tree).not.eq(undefined);
+ if (tree) {
+ const addressHashed = SHA256(address).toString();
+ const result = check_hash_value(tree, addressHashed);
+ expect(result).eq(true);
+ }
+ });
+
+ it('hash not exist', () => {
+ const address = NON_WHITELIST_ADDRESS;
+ const tree = create_hash_tree(DEFAULT_WHITElIST);
+ expect(tree).not.eq(undefined);
+ if (tree) {
+ const addressHashed = SHA256(address).toString();
+ const result = check_hash_value(tree, addressHashed);
+ expect(result).eq(false);
+ }
+ });
+
+ it('create proof', () => {
+ const address = WHITELIST_ADDRESS;
+ const tree = create_hash_tree(DEFAULT_WHITElIST);
+ expect(tree).not.eq(undefined);
+ if (tree) {
+ const hashed = SHA256(address).toString();
+ const proof = get_hash_proof(hashed, tree);
+ expect(proof).not.eq(undefined);
+ }
+ });
+
+ it('create wrong proof', () => {
+ const address = NON_WHITELIST_ADDRESS;
+ const tree = create_hash_tree(DEFAULT_WHITElIST);
+ expect(tree).not.eq(undefined);
+ if (tree) {
+ const hashed = SHA256(address).toString();
+ const proof = get_hash_proof(hashed, tree);
+ expect(proof).eq(undefined);
+ }
+ });
+});
diff --git a/airdrop/frontend/src/shared/lib/merkle-tree/merkle_tree.d.ts b/airdrop/frontend/src/shared/lib/merkle-tree/merkle_tree.d.ts
new file mode 100644
index 00000000..b55d0daf
--- /dev/null
+++ b/airdrop/frontend/src/shared/lib/merkle-tree/merkle_tree.d.ts
@@ -0,0 +1,53 @@
+/* tslint:disable */
+
+/* eslint-disable */
+/**
+ * @param {(string)[]} nodes
+ * @returns {MerkleTree | undefined}
+ */
+export function create_hash_tree(nodes: string[]): MerkleTree | undefined;
+
+/**
+ * @param {string} test
+ * @param {MerkleTree} merkle_tree
+ * @returns {(string)[] | undefined}
+ */
+export function get_hash_proof(
+ test: string,
+ merkle_tree: MerkleTree,
+): string[] | undefined;
+
+/**
+ * @param {ClaimNFTParams} test
+ * @param {MerkleTree} merkle_tree
+ * @returns {boolean}
+ */
+export function check_proof(
+ test: ClaimNFTParams,
+ merkle_tree: MerkleTree,
+): boolean;
+
+/**
+ * @param {MerkleTree} tree
+ * @param {string} test_address
+ * @returns {boolean}
+ */
+export function check_hash_value(
+ tree: MerkleTree,
+ test_address: string,
+): boolean;
+
+/**
+ */
+export class ClaimNFTParams {
+ proof: string[];
+ node: string;
+ selected_token: number;
+ free(): void;
+}
+
+/**
+ */
+export class MerkleTree {
+ free(): void;
+}
diff --git a/airdrop/frontend/src/shared/lib/merkle-tree/merkle_tree.js b/airdrop/frontend/src/shared/lib/merkle-tree/merkle_tree.js
new file mode 100644
index 00000000..0d7864ea
--- /dev/null
+++ b/airdrop/frontend/src/shared/lib/merkle-tree/merkle_tree.js
@@ -0,0 +1,4 @@
+import * as wasm from './merkle_tree_bg.wasm';
+import { __wbg_set_wasm } from './merkle_tree_bg.js';
+__wbg_set_wasm(wasm);
+export * from './merkle_tree_bg.js';
diff --git a/airdrop/frontend/src/shared/lib/merkle-tree/merkle_tree_bg.js b/airdrop/frontend/src/shared/lib/merkle-tree/merkle_tree_bg.js
new file mode 100644
index 00000000..4e0c27f4
--- /dev/null
+++ b/airdrop/frontend/src/shared/lib/merkle-tree/merkle_tree_bg.js
@@ -0,0 +1,306 @@
+let wasm;
+export function __wbg_set_wasm(val) {
+ wasm = val;
+}
+
+const heap = new Array(128).fill(undefined);
+
+heap.push(undefined, null, true, false);
+
+function getObject(idx) {
+ return heap[idx];
+}
+
+let heap_next = heap.length;
+
+function dropObject(idx) {
+ if (idx < 132) return;
+ heap[idx] = heap_next;
+ heap_next = idx;
+}
+
+function takeObject(idx) {
+ const ret = getObject(idx);
+ dropObject(idx);
+ return ret;
+}
+
+let WASM_VECTOR_LEN = 0;
+
+let cachedUint8Memory0 = null;
+
+function getUint8Memory0() {
+ if (cachedUint8Memory0 === null || cachedUint8Memory0.byteLength === 0) {
+ cachedUint8Memory0 = new Uint8Array(wasm.memory.buffer);
+ }
+ return cachedUint8Memory0;
+}
+
+const lTextEncoder =
+ typeof TextEncoder === 'undefined'
+ ? (0, module.require)('util').TextEncoder
+ : TextEncoder;
+
+let cachedTextEncoder = new lTextEncoder('utf-8');
+
+const encodeString =
+ typeof cachedTextEncoder.encodeInto === 'function'
+ ? function (arg, view) {
+ return cachedTextEncoder.encodeInto(arg, view);
+ }
+ : function (arg, view) {
+ const buf = cachedTextEncoder.encode(arg);
+ view.set(buf);
+ return {
+ read: arg.length,
+ written: buf.length,
+ };
+ };
+
+function passStringToWasm0(arg, malloc, realloc) {
+ if (realloc === undefined) {
+ const buf = cachedTextEncoder.encode(arg);
+ const ptr = malloc(buf.length) >>> 0;
+ getUint8Memory0()
+ .subarray(ptr, ptr + buf.length)
+ .set(buf);
+ WASM_VECTOR_LEN = buf.length;
+ return ptr;
+ }
+
+ let len = arg.length;
+ let ptr = malloc(len) >>> 0;
+
+ const mem = getUint8Memory0();
+
+ let offset = 0;
+
+ for (; offset < len; offset++) {
+ const code = arg.charCodeAt(offset);
+ if (code > 0x7f) break;
+ mem[ptr + offset] = code;
+ }
+
+ if (offset !== len) {
+ if (offset !== 0) {
+ arg = arg.slice(offset);
+ }
+ ptr = realloc(ptr, len, (len = offset + arg.length * 3)) >>> 0;
+ const view = getUint8Memory0().subarray(ptr + offset, ptr + len);
+ const ret = encodeString(arg, view);
+
+ offset += ret.written;
+ }
+
+ WASM_VECTOR_LEN = offset;
+ return ptr;
+}
+
+function isLikeNone(x) {
+ return x === undefined || x === null;
+}
+
+let cachedInt32Memory0 = null;
+
+function getInt32Memory0() {
+ if (cachedInt32Memory0 === null || cachedInt32Memory0.byteLength === 0) {
+ cachedInt32Memory0 = new Int32Array(wasm.memory.buffer);
+ }
+ return cachedInt32Memory0;
+}
+
+const lTextDecoder =
+ typeof TextDecoder === 'undefined'
+ ? (0, module.require)('util').TextDecoder
+ : TextDecoder;
+
+let cachedTextDecoder = new lTextDecoder('utf-8', {
+ ignoreBOM: true,
+ fatal: true,
+});
+
+cachedTextDecoder.decode();
+
+function getStringFromWasm0(ptr, len) {
+ ptr = ptr >>> 0;
+ return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len));
+}
+
+function addHeapObject(obj) {
+ if (heap_next === heap.length) heap.push(heap.length + 1);
+ const idx = heap_next;
+ heap_next = heap[idx];
+
+ heap[idx] = obj;
+ return idx;
+}
+
+let cachedUint32Memory0 = null;
+
+function getUint32Memory0() {
+ if (cachedUint32Memory0 === null || cachedUint32Memory0.byteLength === 0) {
+ cachedUint32Memory0 = new Uint32Array(wasm.memory.buffer);
+ }
+ return cachedUint32Memory0;
+}
+
+function passArrayJsValueToWasm0(array, malloc) {
+ const ptr = malloc(array.length * 4) >>> 0;
+ const mem = getUint32Memory0();
+ for (let i = 0; i < array.length; i++) {
+ mem[ptr / 4 + i] = addHeapObject(array[i]);
+ }
+ WASM_VECTOR_LEN = array.length;
+ return ptr;
+}
+/**
+ * @param {(string)[]} nodes
+ * @returns {MerkleTree | undefined}
+ */
+export function create_hash_tree(nodes) {
+ const ptr0 = passArrayJsValueToWasm0(nodes, wasm.__wbindgen_malloc);
+ const len0 = WASM_VECTOR_LEN;
+ const ret = wasm.create_hash_tree(ptr0, len0);
+ return ret === 0 ? undefined : MerkleTree.__wrap(ret);
+}
+
+function _assertClass(instance, klass) {
+ if (!(instance instanceof klass)) {
+ throw new Error(`expected instance of ${klass.name}`);
+ }
+ return instance.ptr;
+}
+
+function getArrayJsValueFromWasm0(ptr, len) {
+ ptr = ptr >>> 0;
+ const mem = getUint32Memory0();
+ const slice = mem.subarray(ptr / 4, ptr / 4 + len);
+ const result = [];
+ for (let i = 0; i < slice.length; i++) {
+ result.push(takeObject(slice[i]));
+ }
+ return result;
+}
+/**
+ * @param {string} test
+ * @param {MerkleTree} merkle_tree
+ * @returns {(string)[] | undefined}
+ */
+export function get_hash_proof(test, merkle_tree) {
+ try {
+ const returnPtr = wasm.__wbindgen_add_to_stack_pointer(-16);
+ _assertClass(merkle_tree, MerkleTree);
+ const ptr0 = merkle_tree.__destroy_into_raw();
+
+ wasm.get_hash_proof(returnPtr, addHeapObject(test), ptr0);
+
+ const r0 = getInt32Memory0()[returnPtr / 4];
+ const r1 = getInt32Memory0()[returnPtr / 4 + 1];
+ let v2;
+ if (r0 !== 0) {
+ v2 = getArrayJsValueFromWasm0(r0, r1).slice();
+ wasm.__wbindgen_free(r0, r1 * 4);
+ }
+ return v2;
+ } finally {
+ wasm.__wbindgen_add_to_stack_pointer(16);
+ }
+}
+
+/**
+ * @param {ClaimNFTParams} test
+ * @param {MerkleTree} merkle_tree
+ * @returns {boolean}
+ */
+export function check_proof(test, merkle_tree) {
+ _assertClass(test, ClaimNFTParams);
+ _assertClass(merkle_tree, MerkleTree);
+ var ptr0 = merkle_tree.__destroy_into_raw();
+ const ret = wasm.check_proof(test.__wbg_ptr, ptr0);
+ return ret !== 0;
+}
+
+/**
+ * @param {MerkleTree} tree
+ * @param {string} test_address
+ * @returns {boolean}
+ */
+export function check_hash_value(tree, test_address) {
+ _assertClass(tree, MerkleTree);
+ var ptr0 = tree.__destroy_into_raw();
+ const ptr1 = passStringToWasm0(
+ test_address,
+ wasm.__wbindgen_malloc,
+ wasm.__wbindgen_realloc,
+ );
+ const len1 = WASM_VECTOR_LEN;
+ const ret = wasm.check_hash_value(ptr0, ptr1, len1);
+ return ret !== 0;
+}
+
+/**
+ */
+export class ClaimNFTParams {
+ __destroy_into_raw() {
+ const ptr = this.__wbg_ptr;
+ this.__wbg_ptr = 0;
+
+ return ptr;
+ }
+
+ free() {
+ const ptr = this.__destroy_into_raw();
+ wasm.__wbg_claimnftparams_free(ptr);
+ }
+}
+/**
+ */
+export class MerkleTree {
+ static __wrap(ptr) {
+ ptr = ptr >>> 0;
+ const obj = Object.create(MerkleTree.prototype);
+ obj.__wbg_ptr = ptr;
+
+ return obj;
+ }
+
+ __destroy_into_raw() {
+ const ptr = this.__wbg_ptr;
+ this.__wbg_ptr = 0;
+
+ return ptr;
+ }
+
+ free() {
+ const ptr = this.__destroy_into_raw();
+ wasm.__wbg_merkletree_free(ptr);
+ }
+}
+
+export function __wbindgen_object_drop_ref(arg0) {
+ takeObject(arg0);
+}
+
+export function __wbindgen_string_get(arg0, arg1) {
+ const obj = getObject(arg1);
+ const ret = typeof obj === 'string' ? obj : undefined;
+ var ptr1 = isLikeNone(ret)
+ ? 0
+ : passStringToWasm0(
+ ret,
+ wasm.__wbindgen_malloc,
+ wasm.__wbindgen_realloc,
+ );
+ var len1 = WASM_VECTOR_LEN;
+ getInt32Memory0()[arg0 / 4 + 1] = len1;
+ getInt32Memory0()[arg0 / 4 + 0] = ptr1;
+}
+
+export function __wbindgen_string_new(arg0, arg1) {
+ const ret = getStringFromWasm0(arg0, arg1);
+ return addHeapObject(ret);
+}
+
+export function __wbindgen_throw(arg0, arg1) {
+ throw new Error(getStringFromWasm0(arg0, arg1));
+}
diff --git a/airdrop/frontend/src/shared/lib/merkle-tree/merkle_tree_bg.wasm b/airdrop/frontend/src/shared/lib/merkle-tree/merkle_tree_bg.wasm
new file mode 100644
index 00000000..489b4ae6
Binary files /dev/null and b/airdrop/frontend/src/shared/lib/merkle-tree/merkle_tree_bg.wasm differ
diff --git a/airdrop/frontend/src/shared/lib/merkle-tree/merkle_tree_bg.wasm.d.ts b/airdrop/frontend/src/shared/lib/merkle-tree/merkle_tree_bg.wasm.d.ts
new file mode 100644
index 00000000..6853b0e5
--- /dev/null
+++ b/airdrop/frontend/src/shared/lib/merkle-tree/merkle_tree_bg.wasm.d.ts
@@ -0,0 +1,13 @@
+/* tslint:disable */
+/* eslint-disable */
+export const memory: WebAssembly.Memory;
+export function __wbg_merkletree_free(a: number): void;
+export function __wbg_claimnftparams_free(a: number): void;
+export function create_hash_tree(a: number, b: number): number;
+export function get_hash_proof(a: number, b: number, c: number): void;
+export function check_proof(a: number, b: number): number;
+export function check_hash_value(a: number, b: number, c: number): number;
+export function __wbindgen_malloc(a: number): number;
+export function __wbindgen_realloc(a: number, b: number, c: number): number;
+export function __wbindgen_add_to_stack_pointer(a: number): number;
+export function __wbindgen_free(a: number, b: number): void;
diff --git a/airdrop/frontend/src/shared/lib/merkle-tree/package.json b/airdrop/frontend/src/shared/lib/merkle-tree/package.json
new file mode 100644
index 00000000..1106f178
--- /dev/null
+++ b/airdrop/frontend/src/shared/lib/merkle-tree/package.json
@@ -0,0 +1,16 @@
+{
+ "name": "merkle_tree",
+ "version": "0.1.0",
+ "files": [
+ "merkle_tree_bg.wasm",
+ "merkle_tree.js",
+ "merkle_tree_bg.js",
+ "merkle_tree.d.ts"
+ ],
+ "module": "merkle_tree.js",
+ "types": "merkle_tree.d.ts",
+ "sideEffects": [
+ "./merkle_tree.js",
+ "./snippets/*"
+ ]
+}
diff --git a/airdrop/frontend/src/shared/lib/push-local-storage-claim.ts b/airdrop/frontend/src/shared/lib/push-local-storage-claim.ts
new file mode 100644
index 00000000..e0d3d4bb
--- /dev/null
+++ b/airdrop/frontend/src/shared/lib/push-local-storage-claim.ts
@@ -0,0 +1,14 @@
+import { AirdropTransactionClaim } from 'entities/transaction-claim-card';
+import { LOCAL_STORAGE_KEY_AIRDROP_TRANSACTIONS_CLAIM } from 'shared/config/local-storage.ts';
+
+export function pushLocalStorageClaim(transaction: AirdropTransactionClaim) {
+ const transactions: AirdropTransactionClaim[] = JSON.parse(
+ localStorage.getItem(LOCAL_STORAGE_KEY_AIRDROP_TRANSACTIONS_CLAIM) ||
+ '[]',
+ );
+ transactions.push(transaction);
+ localStorage.setItem(
+ LOCAL_STORAGE_KEY_AIRDROP_TRANSACTIONS_CLAIM,
+ JSON.stringify(transactions),
+ );
+}
diff --git a/airdrop/frontend/src/shared/lib/push-local-storage-init.ts b/airdrop/frontend/src/shared/lib/push-local-storage-init.ts
new file mode 100644
index 00000000..b2dbea3e
--- /dev/null
+++ b/airdrop/frontend/src/shared/lib/push-local-storage-init.ts
@@ -0,0 +1,14 @@
+import { AirdropTransactionInit } from 'entities/transaction-init-card';
+import { LOCAL_STORAGE_KEY_AIRDROP_TRANSACTIONS_INIT } from 'shared/config/local-storage.ts';
+
+export function pushLocalStorageInit(transaction: AirdropTransactionInit) {
+ const transactions: AirdropTransactionInit[] = JSON.parse(
+ localStorage.getItem(LOCAL_STORAGE_KEY_AIRDROP_TRANSACTIONS_INIT) ||
+ '[]',
+ );
+ transactions.push(transaction);
+ localStorage.setItem(
+ LOCAL_STORAGE_KEY_AIRDROP_TRANSACTIONS_INIT,
+ JSON.stringify(transactions),
+ );
+}
diff --git a/airdrop/frontend/src/shared/lib/use-check-whitelist.ts b/airdrop/frontend/src/shared/lib/use-check-whitelist.ts
new file mode 100644
index 00000000..01d4a63c
--- /dev/null
+++ b/airdrop/frontend/src/shared/lib/use-check-whitelist.ts
@@ -0,0 +1,18 @@
+import { contractView } from 'shared/lib/contract-view.ts';
+import axios from 'axios';
+import { WalletConnection } from '@concordium/react-components';
+
+export async function checkWhitelist(
+ connection: WalletConnection,
+ index: number,
+ account: string,
+) {
+ const contractState = await contractView(connection, index);
+ const whitelistRaw: string = (await axios.get(contractState.whitelistUrl))
+ .data;
+ const whitelist: string[] = whitelistRaw?.split(',');
+ return {
+ isOnWhitelist: whitelist.indexOf(account) >= 0,
+ whitelistUrl: contractState.whitelistUrl,
+ };
+}
diff --git a/airdrop/frontend/src/shared/model/contract-address.ts b/airdrop/frontend/src/shared/model/contract-address.ts
new file mode 100644
index 00000000..334eb76e
--- /dev/null
+++ b/airdrop/frontend/src/shared/model/contract-address.ts
@@ -0,0 +1,4 @@
+export interface ContractAddress {
+ index: number;
+ subindex: number;
+}
diff --git a/airdrop/frontend/src/shared/model/contract-state.ts b/airdrop/frontend/src/shared/model/contract-state.ts
new file mode 100644
index 00000000..5f928f33
--- /dev/null
+++ b/airdrop/frontend/src/shared/model/contract-state.ts
@@ -0,0 +1,5 @@
+export interface ContractState {
+ metadataUrl: string;
+ whitelistUrl: string;
+ numberOfNFTs: number;
+}
diff --git a/airdrop/frontend/src/shared/model/use-metadata-store.ts b/airdrop/frontend/src/shared/model/use-metadata-store.ts
new file mode 100644
index 00000000..e325872e
--- /dev/null
+++ b/airdrop/frontend/src/shared/model/use-metadata-store.ts
@@ -0,0 +1,36 @@
+import { create } from 'zustand';
+import { Metadata } from 'widgets/form-init/model/metadata.ts';
+
+interface State {
+ metadata: Metadata | undefined;
+ metadataUrl: string | undefined;
+ metadataFile: FileList | undefined;
+}
+
+interface Actions {
+ setMetadata: (metadata: Metadata | undefined) => void;
+ setMetadataUrl: (metadataUrl: string) => void;
+ setMetadataFile: (metadataFile: FileList) => void;
+}
+
+type IStore = State & Actions;
+
+export const useMetadataStore = create(
+ (set): IStore => ({
+ metadata: undefined,
+ metadataUrl: undefined,
+ metadataFile: undefined,
+
+ setMetadata(metadata) {
+ set({ metadata });
+ },
+
+ setMetadataUrl(metadataUrl) {
+ set({ metadataUrl });
+ },
+
+ setMetadataFile(metadataFile) {
+ set({ metadataFile });
+ },
+ }),
+);
diff --git a/airdrop/frontend/src/shared/model/use-whitelist-store.ts b/airdrop/frontend/src/shared/model/use-whitelist-store.ts
new file mode 100644
index 00000000..d875c016
--- /dev/null
+++ b/airdrop/frontend/src/shared/model/use-whitelist-store.ts
@@ -0,0 +1,29 @@
+import { create } from 'zustand';
+import { IPFS_URL } from 'shared/config/urls.ts';
+
+interface State {
+ whitelist: string | undefined;
+ whitelistUrl: string | undefined;
+}
+
+interface Actions {
+ setWhitelist: (whitelist: string) => void;
+ setWhitelistUrl: (whitelistUrl: string) => void;
+}
+
+type IStore = State & Actions;
+
+export const useWhitelistStore = create(
+ (set): IStore => ({
+ whitelist: '',
+ whitelistUrl: `${IPFS_URL}/QmbFMke1KXqnYyBBWxB74N4c5SBnJMVAiMNRcGu6x1AwQH`,
+
+ setWhitelist(whitelist) {
+ set({ whitelist });
+ },
+
+ setWhitelistUrl(whitelistUrl) {
+ set({ whitelistUrl });
+ },
+ }),
+);
diff --git a/airdrop/frontend/src/widgets/form-claim/hooks/use-form-claim.ts b/airdrop/frontend/src/widgets/form-claim/hooks/use-form-claim.ts
new file mode 100644
index 00000000..d1da4bf5
--- /dev/null
+++ b/airdrop/frontend/src/widgets/form-claim/hooks/use-form-claim.ts
@@ -0,0 +1,114 @@
+import { useConcordiumApi } from 'shared/hooks/use-concordium-api.ts';
+import { FormClaimProps } from '../model/form-claim-props.ts';
+import { type SubmitHandler, useForm } from 'react-hook-form';
+import { useParams } from 'react-router-dom';
+import { contractClaim } from 'shared/lib/contract-claim.ts';
+import { useEffect, useState } from 'react';
+import { pushLocalStorageClaim } from 'shared/lib/push-local-storage-claim.ts';
+import { checkWhitelist } from 'shared/lib/use-check-whitelist.ts';
+
+export function useFormClaim() {
+ const {
+ register,
+ handleSubmit,
+ formState: { errors },
+ } = useForm();
+
+ const { connection, account } = useConcordiumApi();
+ const { index, subindex } = useParams();
+ const [transactionHash, setTransactionHash] = useState<
+ string | undefined
+ >();
+ const [isLoading, setIsLoading] = useState(false);
+ const [errorCode, setErrorCode] = useState(0);
+ const [data, setData] = useState();
+
+ const onAction: SubmitHandler = async (
+ data,
+ ): Promise => {
+ setData(data);
+ setErrorCode(0);
+ setIsLoading(true);
+ setTransactionHash(undefined);
+
+ if (!connection || !account || !index || !subindex) {
+ return;
+ }
+ try {
+ const transactionHash = await contractClaim(
+ connection,
+ account,
+ +index,
+ +subindex,
+ +data['selected NFT'] || 0,
+ +data['amount of NFTs'],
+ );
+ setTransactionHash(transactionHash);
+ } catch (error) {
+ console.error(error);
+ setIsLoading(false);
+ }
+ };
+
+ useEffect(() => {
+ Promise.resolve(checkTransaction()).catch(console.error);
+ }, [connection, transactionHash, isLoading]);
+
+ function checkTransaction() {
+ if (
+ connection &&
+ transactionHash &&
+ !errorCode &&
+ isLoading &&
+ data &&
+ index &&
+ account
+ ) {
+ const interval = setInterval(async () => {
+ const status = await connection
+ .getJsonRpcClient()
+ .getTransactionStatus(transactionHash);
+
+ console.log('claim', status);
+
+ if (status?.status === 'finalized' && status.outcomes) {
+ const outcome = Object.values(status.outcomes)[0];
+
+ setIsLoading(false);
+ clearInterval(interval);
+ let error = 0;
+
+ if (outcome.result.outcome === 'reject') {
+ // @ts-ignore
+ const reason = outcome.result.rejectReason.rejectReason;
+ setErrorCode(reason);
+ error = reason;
+ }
+ const { whitelistUrl, isOnWhitelist } =
+ await checkWhitelist(connection, +index, account);
+
+ pushLocalStorageClaim({
+ claimDate: new Date(),
+ hash: transactionHash,
+ whitelistUrl,
+ isOnWhitelist,
+ selectedToken: +data['selected NFT'] || 0,
+ amountOfTokens: +data['amount of NFTs'],
+ error,
+ contractIndex: +index,
+ });
+ }
+ }, 1000);
+ }
+ return null;
+ }
+
+ return {
+ register,
+ errors,
+ handleAction: handleSubmit(onAction),
+ transactionHash,
+ isLoading,
+ errorCode,
+ };
+}
diff --git a/airdrop/frontend/src/widgets/form-claim/index.ts b/airdrop/frontend/src/widgets/form-claim/index.ts
new file mode 100644
index 00000000..28caabfe
--- /dev/null
+++ b/airdrop/frontend/src/widgets/form-claim/index.ts
@@ -0,0 +1 @@
+export { FormClaim } from './ui/form-claim.tsx';
diff --git a/airdrop/frontend/src/widgets/form-claim/model/form-claim-props.ts b/airdrop/frontend/src/widgets/form-claim/model/form-claim-props.ts
new file mode 100644
index 00000000..40010b35
--- /dev/null
+++ b/airdrop/frontend/src/widgets/form-claim/model/form-claim-props.ts
@@ -0,0 +1,4 @@
+export interface FormClaimProps {
+ 'selected NFT': number;
+ 'amount of NFTs': number;
+}
diff --git a/airdrop/frontend/src/widgets/form-claim/ui/form-claim.tsx b/airdrop/frontend/src/widgets/form-claim/ui/form-claim.tsx
new file mode 100644
index 00000000..6d865895
--- /dev/null
+++ b/airdrop/frontend/src/widgets/form-claim/ui/form-claim.tsx
@@ -0,0 +1,58 @@
+import { type FC } from 'react';
+
+import { useFormClaim } from '../hooks/use-form-claim.ts';
+import { InputNumber } from 'features/input-number';
+import { useAuth } from 'shared/hooks/use-auth.ts';
+import { StyledButton } from 'shared/components/styled-button';
+import { Spinner } from 'shared/components/spinner';
+import { StatusTransactionClaim } from 'features/status-transaction-claim';
+
+export const FormClaim: FC = () => {
+ const {
+ register,
+ errors,
+ handleAction,
+ transactionHash,
+ isLoading,
+ errorCode,
+ } = useFormClaim();
+
+ const { isAuth } = useAuth();
+
+ return (
+
+ );
+};
diff --git a/airdrop/frontend/src/widgets/form-find/hooks/use-form-find.ts b/airdrop/frontend/src/widgets/form-find/hooks/use-form-find.ts
new file mode 100644
index 00000000..349d6b20
--- /dev/null
+++ b/airdrop/frontend/src/widgets/form-find/hooks/use-form-find.ts
@@ -0,0 +1,53 @@
+import { useConcordiumApi } from 'shared/hooks/use-concordium-api.ts';
+import { FormFindProps } from '../model/form-find-props.ts';
+import { type SubmitHandler, useForm } from 'react-hook-form';
+import { useNavigate } from 'react-router-dom';
+import { RoutePath } from 'shared/config/route.ts';
+import { LOCAL_STORAGE_KEY_LAST_CONTRACT_INDEX } from 'shared/config/local-storage.ts';
+import { useState } from 'react';
+
+export function useFormFind() {
+ const {
+ register,
+ handleSubmit,
+ formState: { errors },
+ } = useForm();
+ const navigate = useNavigate();
+
+ const { connection, account } = useConcordiumApi();
+ const [errorMessage, setErrorMessage] = useState('');
+ const [isLoading, setIsLoading] = useState(false);
+ const onAction: SubmitHandler = async (
+ data,
+ ): Promise => {
+ setIsLoading(true);
+ setErrorMessage('');
+ if (!connection || !account) return;
+ const address = {
+ index: BigInt(+data.index),
+ subindex: BigInt(+data.subindex),
+ };
+ const instanceInfo = await connection
+ .getJsonRpcClient()
+ .getInstanceInfo(address);
+
+ if (instanceInfo !== undefined) {
+ localStorage.setItem(
+ LOCAL_STORAGE_KEY_LAST_CONTRACT_INDEX,
+ address.index.toString(),
+ );
+ navigate(`${RoutePath.claim}/${address.index}/${address.subindex}`);
+ } else {
+ setErrorMessage(`<${data.index}, ${data.subindex}> not found`);
+ }
+ setIsLoading(false);
+ };
+
+ return {
+ register,
+ errors,
+ handleAction: handleSubmit(onAction),
+ errorMessage,
+ isLoading,
+ };
+}
diff --git a/airdrop/frontend/src/widgets/form-find/index.ts b/airdrop/frontend/src/widgets/form-find/index.ts
new file mode 100644
index 00000000..1e43dae4
--- /dev/null
+++ b/airdrop/frontend/src/widgets/form-find/index.ts
@@ -0,0 +1 @@
+export { FormFind } from './ui/form-find.tsx';
diff --git a/airdrop/frontend/src/widgets/form-find/model/form-find-props.ts b/airdrop/frontend/src/widgets/form-find/model/form-find-props.ts
new file mode 100644
index 00000000..8c88cbdc
--- /dev/null
+++ b/airdrop/frontend/src/widgets/form-find/model/form-find-props.ts
@@ -0,0 +1,4 @@
+export interface FormFindProps {
+ index: number;
+ subindex: number;
+}
diff --git a/airdrop/frontend/src/widgets/form-find/ui/button-find.tsx b/airdrop/frontend/src/widgets/form-find/ui/button-find.tsx
new file mode 100644
index 00000000..fd6076f5
--- /dev/null
+++ b/airdrop/frontend/src/widgets/form-find/ui/button-find.tsx
@@ -0,0 +1,35 @@
+import { FC } from 'react';
+import classNames from 'classnames';
+import { StyledButton } from 'shared/components/styled-button';
+import { MagnifyingGlassIcon } from '@heroicons/react/24/outline';
+import { Spinner } from 'shared/components/spinner';
+import { useAuth } from 'shared/hooks/use-auth.ts';
+
+interface ButtonFindProps {
+ isLoading: boolean;
+ className?: string;
+}
+
+export const ButtonFind: FC = (props) => {
+ const { isLoading, className } = props;
+ const { isAuth } = useAuth();
+ return (
+
+ : undefined
+ }
+ type='submit'
+ disabled={!isAuth}
+ >
+ {isLoading ? (
+
+ ) : isAuth ? (
+ 'Find airdrop'
+ ) : (
+ 'need to connect'
+ )}
+
+
+ );
+};
diff --git a/airdrop/frontend/src/widgets/form-find/ui/form-find.tsx b/airdrop/frontend/src/widgets/form-find/ui/form-find.tsx
new file mode 100644
index 00000000..b37723f3
--- /dev/null
+++ b/airdrop/frontend/src/widgets/form-find/ui/form-find.tsx
@@ -0,0 +1,37 @@
+import { type FC } from 'react';
+
+import { useFormFind } from '../hooks/use-form-find.ts';
+import { InputNumber } from 'features/input-number';
+import { LOCAL_STORAGE_KEY_LAST_CONTRACT_INDEX } from 'shared/config/local-storage.ts';
+import { TextAlert } from 'shared/components/text-alert';
+import { ButtonFind } from 'widgets/form-find/ui/button-find.tsx';
+
+export const FormFind: FC = () => {
+ const { register, errors, handleAction, errorMessage, isLoading } =
+ useFormFind();
+
+ const index = Number.parseInt(
+ localStorage.getItem(LOCAL_STORAGE_KEY_LAST_CONTRACT_INDEX) || '4878',
+ );
+
+ return (
+
+ );
+};
diff --git a/airdrop/frontend/src/widgets/form-init/hooks/use-form-init.ts b/airdrop/frontend/src/widgets/form-init/hooks/use-form-init.ts
new file mode 100644
index 00000000..1c3fec79
--- /dev/null
+++ b/airdrop/frontend/src/widgets/form-init/hooks/use-form-init.ts
@@ -0,0 +1,175 @@
+import { useEffect, useState } from 'react';
+import { FormInitProps } from '../model/form-init-props.ts';
+import { type SubmitHandler, useForm } from 'react-hook-form';
+import { useConcordiumApi } from 'shared/hooks/use-concordium-api.ts';
+import { LOCAL_STORAGE_KEY_LAST_CONTRACT_INDEX } from 'shared/config/local-storage.ts';
+import { contractInit } from 'widgets/form-init/lib/contract-init.ts';
+import { useMetadataStore } from 'shared/model/use-metadata-store.ts';
+import { useWhitelistStore } from 'shared/model/use-whitelist-store.ts';
+import { pushLocalStorageInit } from 'shared/lib/push-local-storage-init.ts';
+
+const INTERVAL_LIMIT = 10;
+
+export function useFormInit() {
+ const {
+ register,
+ handleSubmit,
+ formState: { errors },
+ } = useForm();
+
+ const [isLoading, setIsLoading] = useState(false);
+ const [errorCode, setErrorCode] = useState();
+ const { connection, account } = useConcordiumApi();
+ const metadata = useMetadataStore((state) => state.metadata);
+ const metadataUrl = useMetadataStore((state) => state.metadataUrl);
+ const whitelist = useWhitelistStore((state) => state.whitelist);
+ const whitelistUrl = useWhitelistStore((state) => state.whitelistUrl);
+
+ const [submittedTxHash, setSubmittedTxHash] = useState(
+ undefined,
+ );
+ const [createdContractId, setCreatedContractId] = useState<
+ bigint | undefined
+ >();
+ const [data, setData] = useState();
+
+ const onAction: SubmitHandler = async (
+ data,
+ ): Promise => {
+ if (
+ !data ||
+ metadataUrl === undefined ||
+ metadata === undefined ||
+ whitelistUrl === undefined ||
+ whitelist === undefined ||
+ !connection ||
+ !account
+ ) {
+ return;
+ }
+ try {
+ setData(data);
+ setIsLoading(true);
+ setSubmittedTxHash(undefined);
+ setCreatedContractId(undefined);
+ const transactionHash = await contractInit(connection, account, {
+ whitelist: whitelist !== '' ? whitelist.split(',') : [],
+ nft_limit: +data['nft limit'],
+ nft_limit_per_address: +data['nft limit per address'],
+ nft_time_limit: new Date(data['nft time limit']).getTime(),
+ reserve: +data['reserve'],
+ base_url: metadata.display.url,
+ metadata: metadataUrl,
+ whitelist_file: whitelistUrl,
+ selected_index: Boolean(data['selected index']),
+ });
+
+ setSubmittedTxHash(transactionHash);
+ } catch (error) {
+ setIsLoading(false);
+ console.error('transaction', error);
+ }
+ };
+
+ useEffect(() => {
+ Promise.resolve(checkTransaction()).catch(console.error);
+ }, [connection, submittedTxHash, createdContractId]);
+
+ function checkTransaction() {
+ if (
+ !data ||
+ metadataUrl === undefined ||
+ metadata === undefined ||
+ whitelistUrl === undefined ||
+ whitelist === undefined ||
+ !connection ||
+ !account ||
+ !submittedTxHash ||
+ createdContractId
+ ) {
+ return;
+ }
+ let intervalCount = 0;
+ const interval = setInterval(async () => {
+ ++intervalCount;
+ const status = await connection
+ .getJsonRpcClient()
+ .getTransactionStatus(submittedTxHash);
+
+ console.log('init', status);
+
+ if (intervalCount > INTERVAL_LIMIT) {
+ clearInterval(interval);
+ setIsLoading(false);
+ setErrorCode(() => -10);
+ let index = NaN;
+ console.error('interval limit reached');
+ pushLocalStorageInit({
+ initDate: new Date(),
+ metadataUrl: metadataUrl,
+ whitelistUrl: whitelistUrl,
+ endTime: new Date(data['nft time limit']),
+ hash: submittedTxHash,
+ nftLimit: +data['nft limit'],
+ nftLimitPerAddress: +data['nft limit per address'],
+ reserve: +data['reserve'],
+ selectedIndex: Boolean(data['selected index']),
+ error: errorCode ?? 0,
+ contractIndex: index,
+ });
+ return;
+ }
+
+ if (status?.status === 'finalized' && status.outcomes) {
+ const outcome = Object.values(status.outcomes)[0];
+
+ clearInterval(interval);
+ setIsLoading(false);
+
+ let index = 0;
+
+ if (outcome.result.outcome === 'success') {
+ setErrorCode(() => 0);
+ const contractIndex =
+ // @ts-ignore
+ outcome.result.events[0].address.index;
+ setCreatedContractId(contractIndex);
+ localStorage.setItem(
+ LOCAL_STORAGE_KEY_LAST_CONTRACT_INDEX,
+ String(Number.parseInt(contractIndex)),
+ );
+ index = Number.parseInt(contractIndex);
+ } else {
+ setErrorCode(() => -1);
+ console.error('creation failed');
+ }
+
+ pushLocalStorageInit({
+ initDate: new Date(),
+ metadataUrl: metadataUrl,
+ whitelistUrl: whitelistUrl,
+ endTime: new Date(data['nft time limit']),
+ hash: submittedTxHash,
+ nftLimit: +data['nft limit'],
+ nftLimitPerAddress: +data['nft limit per address'],
+ reserve: +data['reserve'],
+ selectedIndex: Boolean(data['selected index']),
+ error: errorCode ?? 0,
+ contractIndex: index,
+ });
+ }
+ }, 1000);
+
+ return () => clearInterval(interval);
+ }
+
+ return {
+ register,
+ errors,
+ handleAction: handleSubmit(onAction),
+ transactionHash: submittedTxHash,
+ isLoading,
+ createdContractId,
+ errorCode,
+ };
+}
diff --git a/airdrop/frontend/src/widgets/form-init/index.ts b/airdrop/frontend/src/widgets/form-init/index.ts
new file mode 100644
index 00000000..8696444f
--- /dev/null
+++ b/airdrop/frontend/src/widgets/form-init/index.ts
@@ -0,0 +1 @@
+export { FormInit } from './ui/form-init.tsx';
diff --git a/airdrop/frontend/src/widgets/form-init/lib/contract-init.ts b/airdrop/frontend/src/widgets/form-init/lib/contract-init.ts
new file mode 100644
index 00000000..ac764ce8
--- /dev/null
+++ b/airdrop/frontend/src/widgets/form-init/lib/contract-init.ts
@@ -0,0 +1,33 @@
+import { AccountTransactionType, CcdAmount } from '@concordium/web-sdk';
+import {
+ CONTRACT_NAME,
+ BASE_64_RAW_SCHEMA,
+ MAX_CONTRACT_EXECUTION_ENERGY,
+ MODULE_REFERENCE,
+} from 'shared/config';
+import {
+ moduleSchemaFromBase64,
+ WalletConnection,
+} from '@concordium/react-components';
+import { ContractInitParameters } from '../model/contract-init-parameters';
+
+export function contractInit(
+ connection: WalletConnection,
+ account: string,
+ parameters: ContractInitParameters,
+): Promise {
+ return connection.signAndSendTransaction(
+ account,
+ AccountTransactionType.InitContract,
+ {
+ amount: new CcdAmount(BigInt(0)),
+ moduleRef: MODULE_REFERENCE,
+ initName: CONTRACT_NAME,
+ maxContractExecutionEnergy: MAX_CONTRACT_EXECUTION_ENERGY,
+ },
+ {
+ schema: moduleSchemaFromBase64(BASE_64_RAW_SCHEMA),
+ parameters: { ...parameters },
+ },
+ );
+}
diff --git a/airdrop/frontend/src/widgets/form-init/lib/listner-fabric.ts b/airdrop/frontend/src/widgets/form-init/lib/listner-fabric.ts
new file mode 100644
index 00000000..6903eb7a
--- /dev/null
+++ b/airdrop/frontend/src/widgets/form-init/lib/listner-fabric.ts
@@ -0,0 +1,15 @@
+import { Dispatch, SetStateAction } from 'react';
+
+export type listenerFabricResult = (event: ProgressEvent) => void;
+export function listenerFabric(
+ set: Dispatch>,
+): listenerFabricResult {
+ function listener(event: ProgressEvent): void {
+ const buffer = event.target?.result;
+ if (typeof buffer === 'string' || typeof buffer === 'undefined') {
+ set(buffer);
+ }
+ }
+
+ return listener;
+}
diff --git a/airdrop/frontend/src/widgets/form-init/lib/post-ipfs.ts b/airdrop/frontend/src/widgets/form-init/lib/post-ipfs.ts
new file mode 100644
index 00000000..73315921
--- /dev/null
+++ b/airdrop/frontend/src/widgets/form-init/lib/post-ipfs.ts
@@ -0,0 +1,30 @@
+import axios from 'axios';
+import { IPFS_URL } from 'shared/config/urls.ts';
+import {
+ PINATA_API_KEY,
+ PINATA_SECRET_API_KEY,
+} from '../../../shared/config/api.ts';
+
+export async function postIpfs(file: File): Promise {
+ const formData = new FormData();
+ formData.append('file', file);
+
+ try {
+ const resFile = await axios({
+ method: 'post',
+ url: 'https://api.pinata.cloud/pinning/pinFileToIPFS',
+ data: formData,
+ headers: {
+ pinata_api_key: PINATA_API_KEY,
+ pinata_secret_api_key: PINATA_SECRET_API_KEY,
+ 'Content-Type': 'multipart/form-data',
+ },
+ });
+
+ return `${IPFS_URL}/${resFile.data.IpfsHash}`;
+ } catch (error) {
+ console.log('Error sending File to IPFS: ');
+ console.log(error);
+ throw new Error('Error sending File to IPFS: ');
+ }
+}
diff --git a/airdrop/frontend/src/widgets/form-init/model/contract-init-parameters.ts b/airdrop/frontend/src/widgets/form-init/model/contract-init-parameters.ts
new file mode 100644
index 00000000..c640e45a
--- /dev/null
+++ b/airdrop/frontend/src/widgets/form-init/model/contract-init-parameters.ts
@@ -0,0 +1,11 @@
+export interface ContractInitParameters {
+ whitelist: string[];
+ nft_limit: number;
+ nft_limit_per_address: number;
+ nft_time_limit: number;
+ reserve: number;
+ base_url: string;
+ metadata: string;
+ whitelist_file: string;
+ selected_index: boolean;
+}
diff --git a/airdrop/frontend/src/widgets/form-init/model/form-init-props.ts b/airdrop/frontend/src/widgets/form-init/model/form-init-props.ts
new file mode 100644
index 00000000..99370712
--- /dev/null
+++ b/airdrop/frontend/src/widgets/form-init/model/form-init-props.ts
@@ -0,0 +1,9 @@
+export interface FormInitProps {
+ whitelist: FileList;
+ metadata: FileList;
+ 'nft limit': number;
+ reserve: number;
+ 'nft limit per address': number;
+ 'nft time limit': Date;
+ 'selected index': boolean;
+}
diff --git a/airdrop/frontend/src/widgets/form-init/model/metadata.ts b/airdrop/frontend/src/widgets/form-init/model/metadata.ts
new file mode 100644
index 00000000..340c9da4
--- /dev/null
+++ b/airdrop/frontend/src/widgets/form-init/model/metadata.ts
@@ -0,0 +1,18 @@
+interface Attribute {
+ type: string;
+ name: string;
+ value: string;
+}
+
+export interface Metadata {
+ name: string;
+ unique: boolean;
+ description: string;
+ thumbnail: {
+ url: string;
+ };
+ display: {
+ url: string;
+ };
+ attributes: Attribute[];
+}
diff --git a/airdrop/frontend/src/widgets/form-init/ui/button-drop.tsx b/airdrop/frontend/src/widgets/form-init/ui/button-drop.tsx
new file mode 100644
index 00000000..ed31e4bf
--- /dev/null
+++ b/airdrop/frontend/src/widgets/form-init/ui/button-drop.tsx
@@ -0,0 +1,36 @@
+import { FC } from 'react';
+import classNames from 'classnames';
+import { StyledButton } from 'shared/components/styled-button';
+import { RocketLaunchIcon } from '@heroicons/react/24/outline';
+import { Spinner } from 'shared/components/spinner';
+import { useAuth } from 'shared/hooks/use-auth.ts';
+
+interface ButtonDropProps {
+ isLoading: boolean;
+ className?: string;
+}
+
+export const ButtonDrop: FC = (props) => {
+ const { isLoading, className } = props;
+ const { isAuth } = useAuth();
+ return (
+
+ : undefined}
+ disabled={!isAuth || isLoading}
+ >
+ {isLoading ? (
+
+ ) : isAuth ? (
+ 'Drop'
+ ) : (
+ 'need to connect'
+ )}
+
+
+ );
+};
diff --git a/airdrop/frontend/src/widgets/form-init/ui/form-init.tsx b/airdrop/frontend/src/widgets/form-init/ui/form-init.tsx
new file mode 100644
index 00000000..5d28c8c9
--- /dev/null
+++ b/airdrop/frontend/src/widgets/form-init/ui/form-init.tsx
@@ -0,0 +1,75 @@
+import { type FC } from 'react';
+
+import { useFormInit } from '../hooks/use-form-init.ts';
+import { InputNumber } from 'features/input-number';
+import { InputDate } from 'features/input-date';
+import { addDays } from 'shared/lib/addDays.ts';
+import { TextAlert } from 'shared/components/text-alert';
+import { StatusTransactionInit } from 'features/status-transaction-init';
+import { ButtonDrop } from 'widgets/form-init/ui/button-drop.tsx';
+
+export const FormInit: FC = () => {
+ const {
+ register,
+ errors,
+ handleAction,
+ transactionHash,
+ isLoading,
+ createdContractId,
+ errorCode,
+ } = useFormInit();
+
+ return (
+
+ );
+};
diff --git a/airdrop/frontend/src/widgets/header/index.tsx b/airdrop/frontend/src/widgets/header/index.tsx
new file mode 100644
index 00000000..c5fd6a8f
--- /dev/null
+++ b/airdrop/frontend/src/widgets/header/index.tsx
@@ -0,0 +1 @@
+export { AirdropHeader } from './ui/header.tsx';
diff --git a/airdrop/frontend/src/widgets/header/ui/header.module.css b/airdrop/frontend/src/widgets/header/ui/header.module.css
new file mode 100644
index 00000000..3bc9881a
--- /dev/null
+++ b/airdrop/frontend/src/widgets/header/ui/header.module.css
@@ -0,0 +1,6 @@
+.header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ @apply px-24 py-12;
+}
diff --git a/airdrop/frontend/src/widgets/header/ui/header.tsx b/airdrop/frontend/src/widgets/header/ui/header.tsx
new file mode 100644
index 00000000..5e3d19b8
--- /dev/null
+++ b/airdrop/frontend/src/widgets/header/ui/header.tsx
@@ -0,0 +1,47 @@
+import { FC, useEffect } from 'react';
+import { BROWSER_WALLET } from 'shared/config';
+import { useConcordiumApi } from 'shared/hooks/use-concordium-api.ts';
+import { StyledLink } from 'shared/components/styled-link';
+import { ConnectButton } from 'features/connect-button';
+import { RoutePath } from 'shared/config/route.ts';
+
+export const AirdropHeader: FC = () => {
+ const { setActiveConnectorType } = useConcordiumApi();
+
+ useEffect(() => setActiveConnectorType(BROWSER_WALLET), []);
+ return (
+
+ );
+};
diff --git a/airdrop/frontend/src/widgets/page-loader/index.ts b/airdrop/frontend/src/widgets/page-loader/index.ts
new file mode 100644
index 00000000..a4f5986a
--- /dev/null
+++ b/airdrop/frontend/src/widgets/page-loader/index.ts
@@ -0,0 +1 @@
+export { PageLoader } from './ui/page-loader';
diff --git a/airdrop/frontend/src/widgets/page-loader/ui/page-loader.module.css b/airdrop/frontend/src/widgets/page-loader/ui/page-loader.module.css
new file mode 100644
index 00000000..3a02dcf0
--- /dev/null
+++ b/airdrop/frontend/src/widgets/page-loader/ui/page-loader.module.css
@@ -0,0 +1,6 @@
+.page-loader {
+ min-height: auto;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
diff --git a/airdrop/frontend/src/widgets/page-loader/ui/page-loader.tsx b/airdrop/frontend/src/widgets/page-loader/ui/page-loader.tsx
new file mode 100644
index 00000000..fbd44e60
--- /dev/null
+++ b/airdrop/frontend/src/widgets/page-loader/ui/page-loader.tsx
@@ -0,0 +1,16 @@
+import { FC } from 'react';
+import cls from './page-loader.module.css';
+import { Spinner } from 'shared/components/spinner';
+import classNames from 'classnames';
+
+interface PageLoaderProps {
+ className?: string;
+}
+
+export const PageLoader: FC = ({ className }) => {
+ return (
+
+
+
+ );
+};
diff --git a/airdrop/frontend/src/widgets/settings-contract/index.ts b/airdrop/frontend/src/widgets/settings-contract/index.ts
new file mode 100644
index 00000000..ea591436
--- /dev/null
+++ b/airdrop/frontend/src/widgets/settings-contract/index.ts
@@ -0,0 +1 @@
+export { SettingsContract } from './ui/settings-contract';
diff --git a/airdrop/frontend/src/widgets/settings-contract/ui/settings-contract.module.css b/airdrop/frontend/src/widgets/settings-contract/ui/settings-contract.module.css
new file mode 100644
index 00000000..9a31d1f7
--- /dev/null
+++ b/airdrop/frontend/src/widgets/settings-contract/ui/settings-contract.module.css
@@ -0,0 +1,11 @@
+.settingsContract {
+ @apply mt-8 flex flex-col min-w-[100%];
+}
+
+.header {
+ @apply text-2xl;
+}
+
+.settingsContainer {
+ @apply mt-8 flex flex-col min-w-[100%] gap-2;
+}
diff --git a/airdrop/frontend/src/widgets/settings-contract/ui/settings-contract.tsx b/airdrop/frontend/src/widgets/settings-contract/ui/settings-contract.tsx
new file mode 100644
index 00000000..072b4540
--- /dev/null
+++ b/airdrop/frontend/src/widgets/settings-contract/ui/settings-contract.tsx
@@ -0,0 +1,19 @@
+import { FC } from 'react';
+import cls from './settings-contract.module.css';
+import classNames from 'classnames';
+import { FormSmartContract } from 'features/form-smart-contract/ui/form-smart-contract.tsx';
+
+interface SettingsContractProps {
+ className?: string;
+}
+
+export const SettingsContract: FC = ({ className }) => {
+ return (
+
+ );
+};
diff --git a/airdrop/frontend/src/widgets/settings-transactions/index.ts b/airdrop/frontend/src/widgets/settings-transactions/index.ts
new file mode 100644
index 00000000..8af0d7b6
--- /dev/null
+++ b/airdrop/frontend/src/widgets/settings-transactions/index.ts
@@ -0,0 +1 @@
+export { SettingsTransactions } from './ui/settings-transactions';
diff --git a/airdrop/frontend/src/widgets/settings-transactions/ui/settings-transactions.module.css b/airdrop/frontend/src/widgets/settings-transactions/ui/settings-transactions.module.css
new file mode 100644
index 00000000..71cd2ed9
--- /dev/null
+++ b/airdrop/frontend/src/widgets/settings-transactions/ui/settings-transactions.module.css
@@ -0,0 +1,23 @@
+.settingsTransactions {
+ @apply mt-8 flex flex-col min-w-[100%];
+}
+
+.header {
+ @apply text-2xl text-black dark:text-white;
+}
+
+.cleanButton {
+ @apply border-2 bg-red-700 text-white font-bold rounded-2xl px-4 py-2 hover:bg-red-500 transition-colors;
+}
+
+.cleanTitle {
+ @apply self-center;
+}
+
+.settingsContainer {
+ @apply mt-8 flex flex-col min-w-[100%] gap-2;
+}
+
+.settingContainer {
+ @apply flex justify-between min-w-max border-b border-gray-400 align-middle pb-2;
+}
diff --git a/airdrop/frontend/src/widgets/settings-transactions/ui/settings-transactions.tsx b/airdrop/frontend/src/widgets/settings-transactions/ui/settings-transactions.tsx
new file mode 100644
index 00000000..8e0f81b7
--- /dev/null
+++ b/airdrop/frontend/src/widgets/settings-transactions/ui/settings-transactions.tsx
@@ -0,0 +1,60 @@
+import { FC } from 'react';
+import cls from './settings-transactions.module.css';
+import classNames from 'classnames';
+import {
+ LOCAL_STORAGE_KEY_AIRDROP_TRANSACTIONS_CLAIM,
+ LOCAL_STORAGE_KEY_AIRDROP_TRANSACTIONS_INIT,
+} from 'shared/config/local-storage.ts';
+
+interface SettingsTransactionsProps {
+ className?: string;
+}
+
+export const SettingsTransactions: FC = ({
+ className,
+}) => {
+ function cleanLocalStorageHandler() {
+ cleanLocalStorageInitHandler();
+ cleanLocalStorageClaimHandler();
+ }
+ function cleanLocalStorageInitHandler() {
+ localStorage.setItem(LOCAL_STORAGE_KEY_AIRDROP_TRANSACTIONS_INIT, '');
+ }
+ function cleanLocalStorageClaimHandler() {
+ localStorage.setItem(LOCAL_STORAGE_KEY_AIRDROP_TRANSACTIONS_CLAIM, '');
+ }
+ return (
+
+
Transactions
+
+
+
all transactions
+
+
+
+
transactions init
+
+
+
+
transactions claim
+
+
+
+
+ );
+};
diff --git a/airdrop/frontend/src/widgets/transactions-claim-list/index.ts b/airdrop/frontend/src/widgets/transactions-claim-list/index.ts
new file mode 100644
index 00000000..7b55e75d
--- /dev/null
+++ b/airdrop/frontend/src/widgets/transactions-claim-list/index.ts
@@ -0,0 +1 @@
+export { TransactionsClaimList } from './ui/transactions-claim-list';
diff --git a/airdrop/frontend/src/widgets/transactions-claim-list/ui/transactions-claim-list.module.css b/airdrop/frontend/src/widgets/transactions-claim-list/ui/transactions-claim-list.module.css
new file mode 100644
index 00000000..f6c4f786
--- /dev/null
+++ b/airdrop/frontend/src/widgets/transactions-claim-list/ui/transactions-claim-list.module.css
@@ -0,0 +1,11 @@
+.transactionsClaimList {
+ @apply flex flex-col gap-4;
+}
+
+.header {
+ @apply text-2xl font-bold;
+}
+
+.transactions {
+ @apply flex flex-col gap-4;
+}
diff --git a/airdrop/frontend/src/widgets/transactions-claim-list/ui/transactions-claim-list.tsx b/airdrop/frontend/src/widgets/transactions-claim-list/ui/transactions-claim-list.tsx
new file mode 100644
index 00000000..33ab3f01
--- /dev/null
+++ b/airdrop/frontend/src/widgets/transactions-claim-list/ui/transactions-claim-list.tsx
@@ -0,0 +1,44 @@
+import { FC } from 'react';
+import cls from './transactions-claim-list.module.css';
+import {
+ AirdropTransactionClaim,
+ TransactionClaimCard,
+} from 'entities/transaction-claim-card';
+import classNames from 'classnames';
+import { LOCAL_STORAGE_KEY_AIRDROP_TRANSACTIONS_CLAIM } from 'shared/config/local-storage.ts';
+import { TextAlert } from 'shared/components/text-alert';
+
+interface TransactionsClaimListProps {
+ className?: string;
+}
+
+export const TransactionsClaimList: FC = ({
+ className,
+}) => {
+ const transactions: AirdropTransactionClaim[] = JSON.parse(
+ localStorage.getItem(LOCAL_STORAGE_KEY_AIRDROP_TRANSACTIONS_CLAIM) ||
+ '[]',
+ );
+
+ transactions.forEach((transaction) => {
+ transaction.claimDate = new Date(transaction.claimDate);
+ transaction.selectedToken = +transaction.selectedToken;
+ });
+
+ transactions.reverse();
+ return (
+
+
Claim transactions
+
+ {transactions.length === 0 && (
+ No Claim Transactions
+ )}
+ {transactions.map((transaction, key) => (
+ -
+
+
+ ))}
+
+
+ );
+};
diff --git a/airdrop/frontend/src/widgets/transactions-init-list/index.ts b/airdrop/frontend/src/widgets/transactions-init-list/index.ts
new file mode 100644
index 00000000..a70126e5
--- /dev/null
+++ b/airdrop/frontend/src/widgets/transactions-init-list/index.ts
@@ -0,0 +1 @@
+export { TransactionsInitList } from './ui/transactions-init-list';
diff --git a/airdrop/frontend/src/widgets/transactions-init-list/ui/transactions-init-list.module.css b/airdrop/frontend/src/widgets/transactions-init-list/ui/transactions-init-list.module.css
new file mode 100644
index 00000000..b3a4f5c6
--- /dev/null
+++ b/airdrop/frontend/src/widgets/transactions-init-list/ui/transactions-init-list.module.css
@@ -0,0 +1,11 @@
+.transactionsInitList {
+ @apply flex flex-col gap-4;
+}
+
+.header {
+ @apply text-2xl font-bold;
+}
+
+.transactions {
+ @apply flex flex-col gap-4;
+}
diff --git a/airdrop/frontend/src/widgets/transactions-init-list/ui/transactions-init-list.tsx b/airdrop/frontend/src/widgets/transactions-init-list/ui/transactions-init-list.tsx
new file mode 100644
index 00000000..6efd880b
--- /dev/null
+++ b/airdrop/frontend/src/widgets/transactions-init-list/ui/transactions-init-list.tsx
@@ -0,0 +1,47 @@
+import { FC } from 'react';
+import cls from './transactions-init-list.module.css';
+import {
+ AirdropTransactionInit,
+ TransactionInitCard,
+} from 'entities/transaction-init-card';
+import classNames from 'classnames';
+import { LOCAL_STORAGE_KEY_AIRDROP_TRANSACTIONS_INIT } from 'shared/config/local-storage.ts';
+import { TextAlert } from 'shared/components/text-alert';
+
+interface TransactionsInitListProps {
+ className?: string;
+}
+
+export const TransactionsInitList: FC = ({
+ className,
+}) => {
+ const transactions: AirdropTransactionInit[] = JSON.parse(
+ localStorage.getItem(LOCAL_STORAGE_KEY_AIRDROP_TRANSACTIONS_INIT) ||
+ '[]',
+ );
+
+ transactions.forEach((transaction) => {
+ transaction.initDate = new Date(transaction.initDate);
+ transaction.endTime = new Date(transaction.endTime);
+ transaction.reserve = +transaction.reserve;
+ transaction.nftLimit = +transaction.nftLimit;
+ transaction.selectedIndex = Boolean(transaction.selectedIndex);
+ });
+
+ transactions.reverse();
+ return (
+
+
init transactions
+
+ {transactions.length === 0 && (
+ No Init Transactions
+ )}
+ {transactions.map((transaction, key) => (
+ -
+
+
+ ))}
+
+
+ );
+};
diff --git a/airdrop/frontend/tailwind.config.js b/airdrop/frontend/tailwind.config.js
new file mode 100644
index 00000000..d37737fc
--- /dev/null
+++ b/airdrop/frontend/tailwind.config.js
@@ -0,0 +1,12 @@
+/** @type {import('tailwindcss').Config} */
+export default {
+ content: [
+ "./index.html",
+ "./src/**/*.{js,ts,jsx,tsx}",
+ ],
+ theme: {
+ extend: {},
+ },
+ plugins: [],
+}
+
diff --git a/airdrop/frontend/tsconfig.json b/airdrop/frontend/tsconfig.json
new file mode 100644
index 00000000..8b2ca5bb
--- /dev/null
+++ b/airdrop/frontend/tsconfig.json
@@ -0,0 +1,41 @@
+{
+ "compilerOptions": {
+ "target": "ESNext",
+ "lib": [
+ "DOM",
+ "DOM.Iterable",
+ "ESNext"
+ ],
+ "module": "ESNext",
+ "skipLibCheck": true,
+ "allowSyntheticDefaultImports": true,
+ "baseUrl": ".",
+ "paths": {
+ "*": [ "./src/*" ]
+ },
+
+ /* Bundler mode */
+ "moduleResolution": "node",
+ "allowImportingTsExtensions": true,
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "noEmit": true,
+ "jsx": "react-jsx",
+ /* Linting */
+ "strict": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "noFallthroughCasesInSwitch": true,
+ "forceConsistentCasingInFileNames": true,
+ "esModuleInterop": true,
+ "noImplicitAny": true
+ },
+ "include": [
+ "src"
+ ],
+ "references": [
+ {
+ "path": "./tsconfig.node.json"
+ }
+ ]
+}
diff --git a/airdrop/frontend/tsconfig.node.json b/airdrop/frontend/tsconfig.node.json
new file mode 100644
index 00000000..cfa1ab5b
--- /dev/null
+++ b/airdrop/frontend/tsconfig.node.json
@@ -0,0 +1,10 @@
+{
+ "compilerOptions": {
+ "composite": true,
+ "skipLibCheck": true,
+ "module": "ESNext",
+ "moduleResolution": "node",
+ "allowSyntheticDefaultImports": true
+ },
+ "include": ["vite.config.ts"]
+}
diff --git a/airdrop/frontend/vercel.json b/airdrop/frontend/vercel.json
new file mode 100644
index 00000000..34c5a8b3
--- /dev/null
+++ b/airdrop/frontend/vercel.json
@@ -0,0 +1,8 @@
+{
+ "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }],
+ "git": {
+ "deploymentEnabled": {
+ "coverage-deploy": false
+ }
+ }
+}
diff --git a/airdrop/frontend/vite.config.ts b/airdrop/frontend/vite.config.ts
new file mode 100644
index 00000000..ed2a0e72
--- /dev/null
+++ b/airdrop/frontend/vite.config.ts
@@ -0,0 +1,15 @@
+import { defineConfig } from 'vite';
+import react from '@vitejs/plugin-react';
+import tsconfigPaths from 'vite-tsconfig-paths';
+import wasm from 'vite-plugin-wasm';
+
+export default defineConfig({
+ build: {
+ target: 'esnext',
+ },
+ plugins: [
+ wasm(),
+ react(),
+ tsconfigPaths(),
+ ],
+});
diff --git a/airdrop/frontend/vitest.config.ts b/airdrop/frontend/vitest.config.ts
new file mode 100644
index 00000000..a34f6021
--- /dev/null
+++ b/airdrop/frontend/vitest.config.ts
@@ -0,0 +1,12 @@
+// vite.config.ts
+import { defineConfig } from 'vitest/config';
+import wasm from 'vite-plugin-wasm';
+
+export default defineConfig({
+ plugins: [wasm()],
+ test: {
+ coverage: {
+ provider: 'istanbul', //istanbul or 'c8'
+ },
+ },
+});
diff --git a/airdrop/smart-contract/.gitignore b/airdrop/smart-contract/.gitignore
new file mode 100644
index 00000000..fadcf9a0
--- /dev/null
+++ b/airdrop/smart-contract/.gitignore
@@ -0,0 +1,4 @@
+.idea/
+merkle_tree/.idea/
+target/
+merkle_tree/target/
diff --git a/airdrop/smart-contract/Cargo.lock b/airdrop/smart-contract/Cargo.lock
new file mode 100644
index 00000000..8b39d6f4
--- /dev/null
+++ b/airdrop/smart-contract/Cargo.lock
@@ -0,0 +1,308 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "airdrop_project"
+version = "0.1.0"
+dependencies = [
+ "concordium-cis2",
+ "concordium-std",
+ "sha256",
+]
+
+[[package]]
+name = "block-buffer"
+version = "0.10.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
+dependencies = [
+ "generic-array",
+]
+
+[[package]]
+name = "byteorder"
+version = "1.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
+
+[[package]]
+name = "cfg-if"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
+
+[[package]]
+name = "cfg-if"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+[[package]]
+name = "concordium-cis2"
+version = "3.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "80fb245add5b85a3d8ab111a5a0c8760caf18b1e63ac86d58d6d8a15289fd6f1"
+dependencies = [
+ "concordium-std",
+ "primitive-types",
+]
+
+[[package]]
+name = "concordium-contracts-common"
+version = "6.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6b03d120efcfc1c4b52209d4553302fa71683df4159cf5352927425ae8ed657f"
+dependencies = [
+ "concordium-contracts-common-derive",
+ "fnv",
+ "hashbrown",
+]
+
+[[package]]
+name = "concordium-contracts-common-derive"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "434938667ab95bd21adb63289008690839d967eb23ead39d82f0dd2cd3b97c68"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "concordium-std"
+version = "6.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "be15c99a7effe3dccdba34dd666172a1236cbebba1bb29a6c3d47ab653153cd2"
+dependencies = [
+ "concordium-contracts-common",
+ "concordium-std-derive",
+ "wee_alloc",
+]
+
+[[package]]
+name = "concordium-std-derive"
+version = "5.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0fb31ccffc667d355936f4e0482cee1d393d119e65d1c30ce08fe96f51802031"
+dependencies = [
+ "concordium-contracts-common",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "cpufeatures"
+version = "0.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3e4c1eaa2012c47becbbad2ab175484c2a84d1185b566fb2cc5b8707343dfe58"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "crunchy"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7"
+
+[[package]]
+name = "crypto-common"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
+dependencies = [
+ "generic-array",
+ "typenum",
+]
+
+[[package]]
+name = "digest"
+version = "0.10.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
+dependencies = [
+ "block-buffer",
+ "crypto-common",
+]
+
+[[package]]
+name = "fixed-hash"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cfcf0ed7fe52a17a03854ec54a9f76d6d84508d1c0e66bc1793301c73fc8493c"
+dependencies = [
+ "static_assertions",
+]
+
+[[package]]
+name = "fnv"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
+
+[[package]]
+name = "generic-array"
+version = "0.14.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
+dependencies = [
+ "typenum",
+ "version_check",
+]
+
+[[package]]
+name = "hashbrown"
+version = "0.11.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e"
+
+[[package]]
+name = "hex"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
+
+[[package]]
+name = "libc"
+version = "0.2.144"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2b00cc1c228a6782d0f076e7b232802e0c5689d41bb5df366f2a6b6621cfdfe1"
+
+[[package]]
+name = "memory_units"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8452105ba047068f40ff7093dd1d9da90898e63dd61736462e9cdda6a90ad3c3"
+
+[[package]]
+name = "primitive-types"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e28720988bff275df1f51b171e1b2a18c30d194c4d2b61defdacecd625a5d94a"
+dependencies = [
+ "fixed-hash",
+ "uint",
+]
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.58"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fa1fb82fc0c281dd9671101b66b771ebbe1eaf967b96ac8740dcba4b70005ca8"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f4f29d145265ec1c483c7c654450edde0bfe043d3938d6972630663356d9500"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "sha2"
+version = "0.10.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0"
+dependencies = [
+ "cfg-if 1.0.0",
+ "cpufeatures",
+ "digest",
+]
+
+[[package]]
+name = "sha256"
+version = "1.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5f9f8b5de2bac3a4ae28e9b611072a8e326d9b26c8189c0972d4c321fa684f1f"
+dependencies = [
+ "hex",
+ "sha2",
+]
+
+[[package]]
+name = "static_assertions"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
+
+[[package]]
+name = "syn"
+version = "1.0.109"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "typenum"
+version = "1.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba"
+
+[[package]]
+name = "uint"
+version = "0.9.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52"
+dependencies = [
+ "byteorder",
+ "crunchy",
+ "hex",
+ "static_assertions",
+]
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4"
+
+[[package]]
+name = "version_check"
+version = "0.9.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
+
+[[package]]
+name = "wee_alloc"
+version = "0.4.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dbb3b5a6b2bb17cb6ad44a2e68a43e8d2722c997da10e928665c72ec6c0a0b8e"
+dependencies = [
+ "cfg-if 0.1.10",
+ "libc",
+ "memory_units",
+ "winapi",
+]
+
+[[package]]
+name = "winapi"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
+dependencies = [
+ "winapi-i686-pc-windows-gnu",
+ "winapi-x86_64-pc-windows-gnu",
+]
+
+[[package]]
+name = "winapi-i686-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+
+[[package]]
+name = "winapi-x86_64-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
diff --git a/airdrop/smart-contract/Cargo.toml b/airdrop/smart-contract/Cargo.toml
new file mode 100644
index 00000000..3d7e04c6
--- /dev/null
+++ b/airdrop/smart-contract/Cargo.toml
@@ -0,0 +1,26 @@
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[package]
+name = "airdrop_project"
+version = "0.1.0"
+edition = "2021"
+license = "MPL-2.0"
+authors = [ "NossicaSystems <124845628+NossicaSystems@users.noreply.github.com>" ]
+description = "Airdop system for NFTs"
+
+[features]
+default = ["std"]
+std = ["concordium-std/std"]
+wee_alloc = ["concordium-std/wee_alloc"]
+
+[dependencies]
+concordium-cis2 = "3.1.0"
+concordium-std = {version = "6.2", default-features = false}
+sha256 = "1.1.3"
+
+[lib]
+crate-type=["cdylib", "rlib"]
+
+[profile.release]
+opt-level = "s"
+codegen-units = 1
diff --git a/airdrop/smart-contract/merkle_tree/.gitignore b/airdrop/smart-contract/merkle_tree/.gitignore
new file mode 100644
index 00000000..bde21220
--- /dev/null
+++ b/airdrop/smart-contract/merkle_tree/.gitignore
@@ -0,0 +1,2 @@
+pkg
+null.o
diff --git a/airdrop/smart-contract/merkle_tree/Cargo.lock b/airdrop/smart-contract/merkle_tree/Cargo.lock
new file mode 100644
index 00000000..113ae9f3
--- /dev/null
+++ b/airdrop/smart-contract/merkle_tree/Cargo.lock
@@ -0,0 +1,355 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "block-buffer"
+version = "0.10.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
+dependencies = [
+ "generic-array",
+]
+
+[[package]]
+name = "bumpalo"
+version = "3.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1"
+
+[[package]]
+name = "byteorder"
+version = "1.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
+
+[[package]]
+name = "cfg-if"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+[[package]]
+name = "concordium-cis2"
+version = "3.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "80fb245add5b85a3d8ab111a5a0c8760caf18b1e63ac86d58d6d8a15289fd6f1"
+dependencies = [
+ "concordium-std",
+ "primitive-types",
+]
+
+[[package]]
+name = "concordium-contracts-common"
+version = "6.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6b03d120efcfc1c4b52209d4553302fa71683df4159cf5352927425ae8ed657f"
+dependencies = [
+ "concordium-contracts-common-derive",
+ "fnv",
+ "hashbrown",
+]
+
+[[package]]
+name = "concordium-contracts-common-derive"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "434938667ab95bd21adb63289008690839d967eb23ead39d82f0dd2cd3b97c68"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "concordium-std"
+version = "6.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "be15c99a7effe3dccdba34dd666172a1236cbebba1bb29a6c3d47ab653153cd2"
+dependencies = [
+ "concordium-contracts-common",
+ "concordium-std-derive",
+]
+
+[[package]]
+name = "concordium-std-derive"
+version = "5.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0fb31ccffc667d355936f4e0482cee1d393d119e65d1c30ce08fe96f51802031"
+dependencies = [
+ "concordium-contracts-common",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "cpufeatures"
+version = "0.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3e4c1eaa2012c47becbbad2ab175484c2a84d1185b566fb2cc5b8707343dfe58"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "crunchy"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7"
+
+[[package]]
+name = "crypto-common"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
+dependencies = [
+ "generic-array",
+ "typenum",
+]
+
+[[package]]
+name = "digest"
+version = "0.10.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
+dependencies = [
+ "block-buffer",
+ "crypto-common",
+]
+
+[[package]]
+name = "fixed-hash"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cfcf0ed7fe52a17a03854ec54a9f76d6d84508d1c0e66bc1793301c73fc8493c"
+dependencies = [
+ "static_assertions",
+]
+
+[[package]]
+name = "fnv"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
+
+[[package]]
+name = "generic-array"
+version = "0.14.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
+dependencies = [
+ "typenum",
+ "version_check",
+]
+
+[[package]]
+name = "hashbrown"
+version = "0.11.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e"
+
+[[package]]
+name = "hex"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
+
+[[package]]
+name = "js-sys"
+version = "0.3.63"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2f37a4a5928311ac501dee68b3c7613a1037d0edb30c8e5427bd832d55d1b790"
+dependencies = [
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "libc"
+version = "0.2.145"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fc86cde3ff845662b8f4ef6cb50ea0e20c524eb3d29ae048287e06a1b3fa6a81"
+
+[[package]]
+name = "log"
+version = "0.4.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "518ef76f2f87365916b142844c16d8fefd85039bc5699050210a7778ee1cd1de"
+
+[[package]]
+name = "merkle_tree"
+version = "0.1.0"
+dependencies = [
+ "concordium-cis2",
+ "concordium-std",
+ "js-sys",
+ "sha256",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.17.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9670a07f94779e00908f3e686eab508878ebb390ba6e604d3a284c00e8d0487b"
+
+[[package]]
+name = "primitive-types"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e28720988bff275df1f51b171e1b2a18c30d194c4d2b61defdacecd625a5d94a"
+dependencies = [
+ "fixed-hash",
+ "uint",
+]
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.59"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6aeca18b86b413c660b781aa319e4e2648a3e6f9eadc9b47e9038e6fe9f3451b"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1b9ab9c7eadfd8df19006f1cf1a4aed13540ed5cbc047010ece5826e10825488"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "sha2"
+version = "0.10.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0"
+dependencies = [
+ "cfg-if",
+ "cpufeatures",
+ "digest",
+]
+
+[[package]]
+name = "sha256"
+version = "1.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5f9f8b5de2bac3a4ae28e9b611072a8e326d9b26c8189c0972d4c321fa684f1f"
+dependencies = [
+ "hex",
+ "sha2",
+]
+
+[[package]]
+name = "static_assertions"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
+
+[[package]]
+name = "syn"
+version = "1.0.109"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "syn"
+version = "2.0.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32d41677bcbe24c20c52e7c70b0d8db04134c5d1066bf98662e2871ad200ea3e"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "typenum"
+version = "1.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba"
+
+[[package]]
+name = "uint"
+version = "0.9.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52"
+dependencies = [
+ "byteorder",
+ "crunchy",
+ "hex",
+ "static_assertions",
+]
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0"
+
+[[package]]
+name = "version_check"
+version = "0.9.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
+
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.86"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5bba0e8cb82ba49ff4e229459ff22a191bbe9a1cb3a341610c9c33efc27ddf73"
+dependencies = [
+ "cfg-if",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.86"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "19b04bc93f9d6bdee709f6bd2118f57dd6679cf1176a1af464fca3ab0d66d8fb"
+dependencies = [
+ "bumpalo",
+ "log",
+ "once_cell",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.18",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.86"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "14d6b024f1a526bb0234f52840389927257beb670610081360e5a03c5df9c258"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.86"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e128beba882dd1eb6200e1dc92ae6c5dbaa4311aa7bb211ca035779e5efc39f8"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.18",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.86"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ed9d5b4305409d1fc9482fee2d7f9bcbf24b3972bf59817ef757e23982242a93"
diff --git a/airdrop/smart-contract/merkle_tree/Cargo.toml b/airdrop/smart-contract/merkle_tree/Cargo.toml
new file mode 100644
index 00000000..77ae09f4
--- /dev/null
+++ b/airdrop/smart-contract/merkle_tree/Cargo.toml
@@ -0,0 +1,16 @@
+[package]
+name = "merkle_tree"
+version = "0.1.0"
+edition = "2021"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[lib]
+crate-type = ["cdylib"]
+
+[dependencies]
+concordium-cis2 = "3.1.0"
+concordium-std = {version = "6.2", default-features = false}
+wasm-bindgen = "0.2"
+js-sys = "0.3.58"
+sha256 = "1.1.3"
diff --git a/airdrop/smart-contract/merkle_tree/src/lib.rs b/airdrop/smart-contract/merkle_tree/src/lib.rs
new file mode 100644
index 00000000..ebbd971e
--- /dev/null
+++ b/airdrop/smart-contract/merkle_tree/src/lib.rs
@@ -0,0 +1,176 @@
+use concordium_cis2::*;
+use concordium_std::*;
+use wasm_bindgen::prelude::*;
+use sha256::digest;
+use js_sys::*;
+
+// Basic merkle tree implementation
+// This will produce merkle trees like the following (note the real values would be hashed)
+// Example 1 - input 1,2,3
+// 1 2 3 3
+// 12 33
+// 1233
+//
+// Example 2 - input 1,2,3,4,5,6
+// 1 2 3 4 5 6
+// 12 34 56 56
+// 1234 5656
+// 12345656
+
+type ContractTokenId = TokenIdU32;
+
+#[derive(Serial, Deserial, SchemaType, Clone)]
+#[wasm_bindgen]
+pub struct MerkleTree {
+ length: u8,
+ hash_tree: Vec,
+ hashroot: String,
+ steps: Vec,
+}
+
+#[derive(Debug, Serialize, SchemaType)]
+#[wasm_bindgen]
+pub struct ClaimNFTParams {
+ proof: Vec,
+ node: String,
+ selected_token: ContractTokenId,
+}
+
+#[wasm_bindgen]
+pub fn create_hash_tree(nodes: Vec) ->Option {
+ let mut working_vec: Vec = vec![];
+ for node in nodes {
+ working_vec.push(digest(node.as_string().unwrap()));
+ }
+ let mut working_node_total: usize = working_vec.len();
+ let mut steps: Vec = Vec::new();
+
+ if working_vec.len() % 2 == 1 {
+ working_vec.push(working_vec[working_node_total - 1].clone());
+ working_node_total += 1;
+ }
+
+ let initial_length = working_node_total;
+ let mut startpoint = 0;
+ let mut vec_to_add: Vec = Vec::new();
+
+ loop {
+ // make sure tree is even
+ if working_node_total % 2 == 1 {
+ working_vec.push(working_vec.last().unwrap().clone());
+ }
+
+ for index in (startpoint..working_vec.len()).step_by(2) {
+ vec_to_add.push(digest(working_vec[index].clone() + &working_vec[index + 1]));
+ }
+
+ startpoint = working_vec.len();
+ working_vec.append(&mut vec_to_add.clone());
+ working_node_total = working_vec.len();
+
+ if (vec_to_add.len()) / 2 == 1 {
+ steps.push((vec_to_add.len() + 1).try_into().unwrap());
+ } else {
+ steps.push((vec_to_add.len()).try_into().unwrap());
+ }
+
+ if vec_to_add.len() == 1 {
+ return Some(MerkleTree {
+ length: initial_length as u8,
+ hashroot: working_vec.last().unwrap().clone(),
+ steps,
+ hash_tree: working_vec.clone(),
+ });
+ }
+ vec_to_add.clear();
+ }
+}
+
+#[wasm_bindgen]
+// Use this to get the node chain for a given value.
+// Returns None if the value is not found.
+pub fn get_hash_proof(test: JsString, merkle_tree: MerkleTree) -> Option> {
+ let local_tree = merkle_tree;
+
+ let steps = &local_tree.steps;
+ let mut end_point: usize = local_tree.length as usize;
+ let nodes: &Vec = &local_tree.hash_tree;
+ let mut hunted: String = test.as_string().unwrap();
+ let mut startpoint: usize = 0;
+ let mut step_number = 0;
+ let mut proof: Vec = Vec::new();
+ let mut index = 0;
+ while startpoint + index < end_point {
+ if hunted == local_tree.hashroot {
+ proof.push(hunted.into());
+ return Some(proof);
+ }
+
+ if nodes[startpoint + index] == hunted {
+ proof.push(hunted.into());
+ if index % 2 == 1 {
+ // it is on the right hand side
+ hunted =
+ digest(nodes[startpoint + index - 1].clone() + &nodes[startpoint + index]);
+ } else {
+ // it is on the left hand side
+ hunted =
+ digest(nodes[startpoint + index].clone() + &nodes[startpoint + index + 1]);
+ }
+ startpoint = end_point;
+ end_point += steps[step_number] as usize;
+ step_number += 1;
+ index = 0;
+ continue;
+ }
+
+ index += 1;
+ }
+ None
+}
+
+#[wasm_bindgen]
+// Use this to compare the user's proof with our's
+pub fn check_proof(test: &ClaimNFTParams, merkle_tree: MerkleTree) -> bool {
+ let master_proof: Vec = get_hash_proof(test.node.clone().into(), merkle_tree).unwrap();
+ master_proof == test.proof
+}
+
+// Checks to see whether a given value is in the tree
+// Generally used in testing
+#[wasm_bindgen]
+pub fn check_hash_value(tree: MerkleTree, test_address: JsString) -> bool {
+ let steps = &tree.steps;
+ let mut end_point = tree.length as usize;
+ let nodes = &tree.hash_tree;
+ let mut hunted = test_address.as_string().unwrap();
+ let mut startpoint = 0;
+ let mut step_number = 0;
+
+ let mut index: usize = 0;
+ while startpoint + index < end_point {
+ if hunted.eq(&tree.hashroot) {
+ return true;
+ }
+
+ if nodes[startpoint + index] == hunted {
+ if index % 2 == 1 {
+ // it is on the right hand side
+ hunted =
+ digest(nodes[startpoint + index - 1].clone() + &nodes[startpoint + index]).into();
+ } else {
+ // it is on the left hand side
+ hunted =
+ digest(nodes[startpoint + index].clone() + &nodes[startpoint + index + 1]).into();
+ }
+ startpoint = end_point;
+ end_point += steps[step_number] as usize;
+ step_number += 1;
+ index = 0;
+ continue;
+ }
+
+ index += 1;
+ }
+ false
+}
diff --git a/airdrop/smart-contract/src/README.md b/airdrop/smart-contract/src/README.md
new file mode 100644
index 00000000..3feba5e6
--- /dev/null
+++ b/airdrop/smart-contract/src/README.md
@@ -0,0 +1,51 @@
+*Overview:*
+
+Contract name: airdrop_project
+Module reference: 0edbd695743789ac415289c31391ec66e66958efbaa1ea826b37ddcdeea74e7e
+
+The base64 conversion of the schema is:
+//8DAQAAAA8AAABhaXJkcm9wX3Byb2plY3QBABQACQAAAAkAAAB3aGl0ZWxpc3QQAhYCCQAAAG5mdF9saW1pdAQVAAAAbmZ0X2xpbWl0X3Blcl9hZGRyZXNzBA4AAABuZnRfdGltZV9saW1pdAUHAAAAcmVzZXJ2ZQQIAAAAYmFzZV91cmwWAggAAABtZXRhZGF0YRYCDgAAAHdoaXRlbGlzdF9maWxlFgIOAAAAc2VsZWN0ZWRfaW5kZXgBBgAAAAoAAABiYWxhbmNlX29mAhQAAgAAAAYAAABfZHVtbXkIBAAAAG5vZGULBAsAAABjaGVja19vd25lcgIUAAEAAAAFAAAAdG9rZW4dABQAAQAAAAcAAABhZGRyZXNzFQIAAAAEAAAATm9uZQIEAAAAU29tZQEBAAAAFgIJAAAAY2xhaW1fbmZ0BBQABQAAAAUAAABwcm9vZhACFgIEAAAAbm9kZQsLAAAAbm9kZV9zdHJpbmcWAg4AAABzZWxlY3RlZF90b2tlbh0AEAAAAGFtb3VudF9vZl90b2tlbnMEFQgAAAAPAAAATkZUTGltaXRSZWFjaGVkAhUAAABBZGRyZXNzTm90T25XaGl0ZWxpc3QCEAAAAEFpcmRyb3BOb3dDbG9zZWQCEwAAAE1pbnRpbmdMb2dNYWxmb3JtZWQCDgAAAE1pbnRpbmdMb2dGdWxsAhQAAABNZXRhRGF0YUxvZ01hbGZvcm1lZAIPAAAATWV0YURhdGFMb2dGdWxsAhMAAABJbmRleEFscmVhZHlDbGFpbWVkAg4AAABjdXJyZW50X3N1cHBseQEEDAAAAHRvdGFsX3N1cHBseQEEBAAAAHZpZXcBFAADAAAACAAAAG1ldGFkYXRhFgIJAAAAd2hpdGVsaXN0FgIOAAAAbnVtYmVyX29mX25mdHMEAA
+
+Please see https://www.youtube.com/watch?v=J-SP_ptKu_I&t=1999s for an example on how to use these contracts.
+
+*External contract functions:*
+
+Init: This initialises the nft.
+
+This takes an InitParams structure which contains:
+ whitelist - a vector of address. Leave empty if there is no whitelist required.
+ nft_limit - the maximum amount of nfts that can be claimed. Leave 0 for no limit.
+ nft_limit_per_address - the maximum amount of nfts that can be claimed per address. Leave 0 for no limit.
+ nft_time_limit - the time at which the airdrop will end.
+ reserve - the amount of nfts which will be held back for the whitelist. Leave 0 for no reserve.
+ base_url - the base url for the nft
+ metadata - the IPFS link for the metadata file
+ whitelist_file - the IPFS link for the whitelist file
+ selected_index - boolean which determines whether claimined specific NFTs is supported
+
+
+contract_claim_nft: this claims a specified amount of tokens.
+
+This takes a MintParams structure which contains:
+ proof - the merkle proof for the claiming node. Can be blank if no whitelist is in use for this claim.
+ node - the address of the claiming node
+ node_string - the address of the claiming node in string format
+ selected_token - the ID of the token being claimed
+ amount_of_tokens - the amount of tokens being claimed
+
+view: Returns the metadata, whiteslist and number of claimed NFTs
+
+balance_of: Returns the amount of tokens claimed by the specified address.
+
+This takes a BalanceParam structure which contains:
+ dummy: an integer which is always set to 0
+ node: the address being queries
+
+total_supply: Returns the amount of claimable tokens
+
+current_supply: Returns the amount of tokens that are currently claimable
+
+check_owner: Returns the owner of the specified token
+
+This takes a TokenParam structure which contains:
+ token - the token ID being queried.
diff --git a/airdrop/smart-contract/src/lib.rs b/airdrop/smart-contract/src/lib.rs
new file mode 100644
index 00000000..9e85858d
--- /dev/null
+++ b/airdrop/smart-contract/src/lib.rs
@@ -0,0 +1,1241 @@
+//! # A Concordium V1 smart contract
+use concordium_cis2::*;
+use concordium_std::*;
+use sha256::digest;
+
+use core::fmt::Debug;
+
+/// Contract token ID type.
+/// To save bytes we use a token ID type limited to a `u32`.
+type ContractTokenId = TokenIdU32;
+
+type ContractTokenAmount = TokenAmountU32;
+
+/*
+fn account_address_to_string(address: AccountAddress) -> String {
+ let hex_chars: Vec = address
+ .0
+ .iter()
+ .map(|byte| format!("{:02x}", byte))
+ .skip(7)
+ .collect();
+ hex_chars.join("")
+}
+*/
+
+/// The parameter for the contract function `mint` which mints a number of
+/// tokens to a given address.
+#[derive(Serial, Deserial, SchemaType)]
+struct InitParams {
+ whitelist: Vec,
+ nft_limit: u32,
+ nft_limit_per_address: u32,
+ nft_time_limit: u64,
+ reserve: u32,
+ base_url: String,
+ metadata: String,
+ whitelist_file: String,
+ selected_index: bool,
+}
+
+/// The parameter type for the contract function `contract_claim_nft`.
+#[derive(Debug, Serialize, SchemaType)]
+pub struct ClaimNFTParams {
+ proof: Vec,
+ node: AccountAddress,
+ node_string: String,
+ selected_token: ContractTokenId,
+ amount_of_tokens: u32,
+}
+
+#[derive(Serialize, SchemaType, PartialEq, Debug)]
+struct ViewResult {
+ metadata: String,
+ whitelist: String,
+ number_of_nfts: u32,
+}
+
+#[derive(Serialize, SchemaType, PartialEq, Debug)]
+struct CheckOwnerReply {
+ address: Option,
+}
+
+/// The parameter type for the contract function `contract_claim_nft`.
+#[derive(Debug, Serialize, SchemaType)]
+pub struct TokenParam {
+ token: ContractTokenId,
+}
+
+/// The parameter type for the contract function `balance_of`.
+#[derive(Debug, Serialize, SchemaType)]
+pub struct BalanceParam {
+ _dummy: i32, // without this the AccountAddress get corrupted
+ node: AccountAddress,
+}
+
+#[derive(Serial, Deserial, SchemaType, Clone)]
+pub struct MerkleTree {
+ length: u8,
+ hash_tree: Vec,
+ hashroot: String,
+ steps: Vec,
+}
+
+/// Your smart contract state.
+#[derive(Serial, DeserialWithState, StateClone)]
+#[concordium(state_parameter = "S")]
+pub struct State {
+ /// Next token ID. Used if the user is just claiming tokens in sequential order.
+ next_token_id: u32,
+ /// Map of taken indexes. Used if the user is claiming specific indexes.
+ taken_indexes: Option>,
+ /// Map containing how many claims each address has made.
+ claimed_nfts: StateMap,
+ /// Max number of nfts that can be minted before hitting reserve
+ nft_limit: u32,
+ /// Max number of nfts that can be claimed per address
+ nft_limit_per_address: Option,
+ /// Number of nfts which are held in reserve
+ nft_reserve: Option,
+ /// Airdrop time limit
+ nft_time_limit: Option,
+ /// Whitelist proof
+ merkle_tree: Option,
+ /// Base url for these NFTs
+ base_url: String, // something like "https://some.example/token/";
+ /// Metadata URL in IPFS
+ metadata: String,
+ /// Whitelist URL in IPFS
+ whitelist: String,
+}
+
+impl State {
+ /// Creates a new state with no tokens.
+ fn empty(state_builder: &mut StateBuilder) -> Self {
+ State {
+ next_token_id: 0,
+ nft_limit: 1,
+ merkle_tree: None,
+ nft_time_limit: None,
+ nft_reserve: None,
+ base_url: String::new(),
+ metadata: String::new(),
+ whitelist: String::new(),
+ taken_indexes: None,
+ nft_limit_per_address: None,
+ claimed_nfts: state_builder.new_map(),
+ }
+ }
+
+ // Basic merkle tree implementation
+ // This will produce merkle trees like the following (note the real values would be hashed)
+ // Example 1 - input 1,2,3
+ // 1 2 3 3
+ // 12 33
+ // 1233
+ //
+ // Example 2 - input 1,2,3,4,5,6
+ // 1 2 3 4 5 6
+ // 12 34 56 56
+ // 1234 5656
+ // 12345656
+ pub fn create_hash_tree(&mut self, nodes: Vec) {
+ let mut working_vec: Vec = vec![];
+ for node in nodes {
+ working_vec.push(digest(node));
+ }
+ let mut working_node_total: usize = working_vec.len();
+ let mut steps: Vec = Vec::new();
+
+ if working_vec.len() % 2 == 1 {
+ working_vec.push(working_vec[working_node_total - 1].clone());
+ working_node_total += 1;
+ }
+
+ let initial_length = working_node_total;
+ let mut startpoint = 0;
+ let mut vec_to_add: Vec = Vec::new();
+
+ loop {
+ // make sure tree is even
+ if working_node_total % 2 == 1 {
+ working_vec.push(working_vec.last().unwrap().clone());
+ }
+
+ for index in (startpoint..working_vec.len()).step_by(2) {
+ vec_to_add.push(digest(working_vec[index].clone() + &working_vec[index + 1]));
+ }
+
+ startpoint = working_vec.len();
+ working_vec.append(&mut vec_to_add.clone());
+ working_node_total = working_vec.len();
+
+ if (vec_to_add.len()) / 2 == 1 {
+ steps.push((vec_to_add.len() + 1).try_into().unwrap());
+ } else {
+ steps.push((vec_to_add.len()).try_into().unwrap());
+ }
+
+ if vec_to_add.len() == 1 {
+ self.merkle_tree = Some(MerkleTree {
+ length: initial_length as u8,
+ hashroot: working_vec.last().unwrap().clone(),
+ steps,
+ hash_tree: working_vec.clone(),
+ });
+
+ return;
+ }
+ vec_to_add.clear();
+ }
+ }
+
+ // Use this to get the node chain for a given value.
+ // Returns None if the value is not found.
+ pub fn get_hash_proof(&self, test: String) -> Option> {
+ self.merkle_tree.as_ref()?;
+ let local_tree = self.merkle_tree.as_ref().unwrap();
+
+ let steps = &local_tree.steps;
+ let mut end_point: usize = local_tree.length as usize;
+ let nodes: &Vec = &local_tree.hash_tree;
+ let mut hunted: String = test;
+ let mut startpoint: usize = 0;
+ let mut step_number = 0;
+ let mut proof: Vec = Vec::new();
+ let mut index = 0;
+ while startpoint + index < end_point {
+ if hunted == local_tree.hashroot {
+ proof.push(hunted);
+ return Some(proof);
+ }
+
+ if nodes[startpoint + index] == hunted {
+ proof.push(hunted);
+ if index % 2 == 1 {
+ // it is on the right hand side
+ hunted =
+ digest(nodes[startpoint + index - 1].clone() + &nodes[startpoint + index]);
+ } else {
+ // it is on the left hand side
+ hunted =
+ digest(nodes[startpoint + index].clone() + &nodes[startpoint + index + 1]);
+ }
+ startpoint = end_point;
+ end_point += steps[step_number] as usize;
+ step_number += 1;
+ index = 0;
+ continue;
+ }
+
+ index += 1;
+ }
+ None
+ }
+
+ // Use this to compare the user's proof with our's
+ pub fn check_proof(&self, test: &ClaimNFTParams) -> bool {
+ let claimer = digest(test.node_string.clone());
+
+ let master_proof = self.get_hash_proof(claimer);
+ if master_proof.is_none() {
+ return false;
+ }
+ master_proof.unwrap() == test.proof
+ }
+
+ // Checks to see whether a given value is in the tree
+ // Generally used in testing
+ pub fn check_hash_value(&self, test_address: String) -> bool {
+ if self.merkle_tree.is_none() {
+ return false;
+ };
+ let tree = self.merkle_tree.as_ref().unwrap();
+
+ let steps = &tree.steps;
+ let mut end_point = tree.length as usize;
+ let nodes = &tree.hash_tree;
+ let mut hunted = test_address;
+ let mut startpoint = 0;
+ let mut step_number = 0;
+
+ let mut index: usize = 0;
+ while startpoint + index < end_point {
+ if hunted.eq(&tree.hashroot) {
+ return true;
+ }
+
+ if nodes[startpoint + index] == hunted {
+ if index % 2 == 1 {
+ // it is on the right hand side
+ hunted =
+ digest(nodes[startpoint + index - 1].clone() + &nodes[startpoint + index]);
+ } else {
+ // it is on the left hand side
+ hunted =
+ digest(nodes[startpoint + index].clone() + &nodes[startpoint + index + 1]);
+ }
+ startpoint = end_point;
+ end_point += steps[step_number] as usize;
+ step_number += 1;
+ index = 0;
+ continue;
+ }
+
+ index += 1;
+ }
+ false
+ }
+}
+
+/// Your smart contract errors.
+#[derive(Debug, PartialEq, Eq, Reject, Serial, SchemaType)]
+enum Error {
+ /// Failed parsing the parameter.
+ #[from(ParseError)]
+ NFTLimitReached,
+ AddressNotOnWhitelist,
+ AirdropNowClosed,
+ MintingLogMalformed,
+ MintingLogFull,
+ MetaDataLogMalformed,
+ MetaDataLogFull,
+ IndexAlreadyClaimed,
+}
+
+/// Init function that creates a new smart contract.
+#[init(contract = "airdrop_project", parameter = "InitParams")]
+fn init(
+ ctx: &impl HasInitContext,
+ state_builder: &mut StateBuilder,
+) -> InitResult> {
+ let params: InitParams = ctx.parameter_cursor().get()?;
+ let mut state: State = State::empty(state_builder);
+
+ state.nft_limit = params.nft_limit;
+ state.base_url = params.base_url;
+
+ state.metadata = params.metadata;
+ state.whitelist = params.whitelist_file;
+
+ if params.nft_time_limit != 0 {
+ state.nft_time_limit = Some(Timestamp::from_timestamp_millis(params.nft_time_limit));
+ }
+
+ if params.nft_limit_per_address != 0 {
+ state.nft_limit_per_address = Some(params.nft_limit_per_address);
+ }
+
+ if params.reserve != 0 {
+ state.nft_reserve = Some(params.reserve);
+ }
+
+ if params.selected_index {
+ state.taken_indexes = Some(HashMap::default());
+ }
+
+ if !params.whitelist.is_empty() {
+ state.create_hash_tree(params.whitelist);
+ }
+
+ Ok(state)
+}
+
+/// Claims an NFT
+#[receive(
+ contract = "airdrop_project",
+ name = "claim_nft",
+ parameter = "ClaimNFTParams",
+ error = "Error",
+ mutable,
+ enable_logger
+)]
+fn claim_nft(
+ ctx: &impl HasReceiveContext,
+ host: &mut impl HasHost, StateApiType = S>,
+ logger: &mut impl HasLogger,
+) -> Result<(), Error> {
+ let state = host.state_mut();
+
+ if let Some(time_limit) = state.nft_time_limit {
+ if time_limit > Timestamp::from_timestamp_millis(0)
+ && ctx.metadata().slot_time() > state.nft_time_limit.unwrap()
+ {
+ return Err(Error::AirdropNowClosed);
+ }
+ }
+
+ let params: ClaimNFTParams = ctx.parameter_cursor().get()?;
+ let current_token_id = state.next_token_id;
+ let amount_of_tokens = params.amount_of_tokens;
+ if current_token_id + params.amount_of_tokens > state.nft_limit {
+ return Err(Error::NFTLimitReached);
+ }
+
+ if let Some(max_claims_per_address) = state.nft_limit_per_address {
+ let val = *(state.claimed_nfts.entry(params.node).or_insert(0));
+ if val + amount_of_tokens > max_claims_per_address {
+ return Err(Error::NFTLimitReached);
+ };
+ }
+
+ // if there is a whitelist and no reserve only whitelist can by
+ // if there is no whitelist everyone can buy
+ // if there is a reserve and a whitelist only whitelist can by reserve
+ // Presence of a whitelist is determined by the presence of the merkle tree
+ if ((state.merkle_tree.is_some() && state.nft_reserve.is_none()) // whitelist and no reserve
+ || (state.merkle_tree.is_some()
+ && state.next_token_id + amount_of_tokens > (state.nft_limit - state.nft_reserve.unwrap_or(0)))) // whitelist and only reserve left
+ && (params.proof.is_empty() || !state.check_proof(¶ms))
+ {
+ return Err(Error::AddressNotOnWhitelist);
+ }
+
+ // This is where the code differentiates between the user claiming the next available token
+ // and the user claiming a specific one they have requested.
+ let token_id_to_use = if state.taken_indexes.is_some() {
+ if state
+ .taken_indexes
+ .as_ref()
+ .unwrap()
+ .contains_key(¶ms.selected_token)
+ {
+ return Err(Error::IndexAlreadyClaimed);
+ }
+ params.selected_token
+ } else {
+ ContractTokenId::from(current_token_id)
+ };
+
+ // Event for minted token.
+ let log_mint_result = logger.log(&Cis2Event::Mint(MintEvent {
+ token_id: token_id_to_use,
+ amount: ContractTokenAmount::from(amount_of_tokens),
+ owner: concordium_std::Address::Account(params.node),
+ }));
+
+ match log_mint_result {
+ Ok(_) => (),
+ Err(error) => match error {
+ LogError::Full => {
+ return Err(Error::MintingLogFull);
+ }
+ LogError::Malformed => {
+ return Err(Error::MintingLogMalformed);
+ }
+ },
+ }
+
+ let url: String = state.base_url.clone() + &token_id_to_use.to_string();
+
+ // Metadata URL for the token.
+ let log_meta_result = logger.log(&Cis2Event::TokenMetadata::<_, ContractTokenAmount>(
+ TokenMetadataEvent {
+ token_id: token_id_to_use,
+ metadata_url: MetadataUrl { url, hash: None },
+ },
+ ));
+
+ match log_meta_result {
+ Ok(_) => (),
+ Err(error) => match error {
+ LogError::Full => {
+ return Err(Error::MetaDataLogFull);
+ }
+ LogError::Malformed => {
+ return Err(Error::MetaDataLogMalformed);
+ }
+ },
+ }
+
+ if state.taken_indexes.is_some() {
+ state
+ .taken_indexes
+ .as_mut()
+ .unwrap()
+ .insert(token_id_to_use, params.node_string);
+ } else {
+ state.next_token_id += params.amount_of_tokens;
+ }
+
+ let mut tokens = state.claimed_nfts.entry(params.node).or_insert(0);
+ *tokens += amount_of_tokens;
+
+ Ok(())
+}
+
+/// View function that returns the metadata, whitelist and number of NFTs
+#[receive(
+ contract = "airdrop_project",
+ name = "view",
+ return_value = "ViewResult"
+)]
+fn view(
+ _ctx: &impl HasReceiveContext,
+ host: &impl HasHost, StateApiType = S>,
+) -> ReceiveResult {
+ let state = host.state();
+
+ Ok(ViewResult {
+ metadata: state.metadata.clone(),
+ whitelist: state.whitelist.clone(),
+ number_of_nfts: state.nft_limit,
+ })
+}
+
+/// View function that returns the amount of tokens claimed by the address
+#[receive(
+ contract = "airdrop_project",
+ name = "balance_of",
+ parameter = "BalanceParam",
+ return_value = "u32"
+)]
+fn balance_of(
+ ctx: &impl HasReceiveContext,
+ host: &impl HasHost, StateApiType = S>,
+) -> ReceiveResult {
+ let state: &State = host.state();
+ let params: BalanceParam = ctx.parameter_cursor().get()?;
+
+ let res = state.claimed_nfts.get(¶ms.node);
+ if res.is_none() {
+ Ok(0)
+ } else {
+ Ok(*state.claimed_nfts.get(¶ms.node).unwrap())
+ }
+}
+
+/// View function that returns the total supply of available NFTs
+#[receive(
+ contract = "airdrop_project",
+ name = "total_supply",
+ return_value = "u32"
+)]
+fn total_supply(
+ _ctx: &impl HasReceiveContext,
+ host: &impl HasHost, StateApiType = S>,
+) -> ReceiveResult {
+ Ok(host.state().nft_limit)
+}
+
+/// View function that returns the current supply of available NFTs
+#[receive(
+ contract = "airdrop_project",
+ name = "current_supply",
+ return_value = "u32"
+)]
+fn current_supply(
+ _ctx: &impl HasReceiveContext,
+ host: &impl HasHost, StateApiType = S>,
+) -> ReceiveResult {
+ let current_claimed = if host.state().taken_indexes.is_some() {
+ host.state().taken_indexes.as_ref().unwrap().len() as u32
+ } else {
+ host.state().next_token_id
+ };
+
+ Ok(host.state().nft_limit - current_claimed)
+}
+
+/// View function that returns the owner of tokens or None if no one owns it
+#[receive(
+ contract = "airdrop_project",
+ name = "check_owner",
+ parameter = "TokenParam",
+ return_value = "CheckOwnerReply"
+)]
+fn check_owner(
+ ctx: &impl HasReceiveContext,
+ host: &impl HasHost, StateApiType = S>,
+) -> ReceiveResult {
+ let params: TokenParam = ctx.parameter_cursor().get()?;
+
+ if host.state().taken_indexes.as_ref().is_none() {
+ return Ok(CheckOwnerReply { address: None });
+ }
+
+ if !host
+ .state()
+ .taken_indexes
+ .as_ref()
+ .unwrap()
+ .contains_key(¶ms.token)
+ {
+ return Ok(CheckOwnerReply { address: None });
+ }
+
+ return Ok(CheckOwnerReply {
+ address: Some(
+ host.state()
+ .taken_indexes
+ .as_ref()
+ .unwrap()
+ .get(¶ms.token)
+ .unwrap()
+ .clone(),
+ ),
+ });
+}
+
+#[concordium_cfg_test]
+mod tests {
+ use super::*;
+ use test_infrastructure::*;
+
+ #[concordium_test]
+ /// Test that initializing the contract succeeds with some state.
+ fn test_init() {
+ let mut ctx = TestInitContext::empty();
+ ctx.set_metadata_slot_time(Timestamp::from_timestamp_millis(1));
+ let mut state_builder = TestStateBuilder::new();
+
+ let params = InitParams {
+ nft_limit: 0,
+ nft_time_limit: 0,
+ whitelist: vec![],
+ reserve: 0,
+ base_url: String::new(),
+ whitelist_file: String::new(),
+ metadata: String::new(),
+ selected_index: false,
+ nft_limit_per_address: 0,
+ };
+
+ let parameter_bytes = to_bytes(¶ms);
+ ctx.set_parameter(¶meter_bytes);
+
+ let state_result = init(&ctx, &mut state_builder);
+ state_result.unwrap();
+ }
+
+ #[concordium_test]
+ fn test_mint_no_reserve_no_whitelist() {
+ let mut ctx = TestInitContext::empty();
+ ctx.set_metadata_slot_time(Timestamp::from_timestamp_millis(1));
+ let mut state_builder = TestStateBuilder::new();
+
+ const ACCOUNT_0: AccountAddress = AccountAddress([1u8; 32]);
+ let account_0_string = "00000000000000000000000000000000000000000000000000".to_string();
+
+ // This should allow anyone to purchase 1 NFT
+ let params = InitParams {
+ nft_limit: 3,
+ nft_time_limit: 0,
+ whitelist: vec![],
+ reserve: 0,
+ base_url: String::new(),
+ whitelist_file: String::new(),
+ metadata: String::new(),
+ selected_index: false,
+ nft_limit_per_address: 0,
+ };
+
+ let parameter_bytes = to_bytes(¶ms);
+ ctx.set_parameter(¶meter_bytes);
+
+ let state_result = init(&ctx, &mut state_builder);
+ let new_state = state_result.unwrap();
+ assert_eq!(new_state.nft_limit, 3);
+
+ let mut ctx_claim = TestReceiveContext::empty();
+ ctx_claim.set_metadata_slot_time(Timestamp::from_timestamp_millis(1));
+ let mint_params = ClaimNFTParams {
+ node: ACCOUNT_0,
+ node_string: account_0_string,
+ proof: vec![],
+ selected_token: concordium_cis2::TokenIdU32(0),
+ amount_of_tokens: 2,
+ };
+
+ let mut host = TestHost::new(new_state, state_builder);
+
+ let claim_parameter_bytes = to_bytes(&mint_params);
+ ctx_claim.set_parameter(&claim_parameter_bytes);
+ let mut logger = TestLogger::init();
+
+ let claim_result = claim_nft(&ctx_claim, &mut host, &mut logger);
+ assert_eq!(claim_result.is_ok(), true);
+
+ let claim_result_bad: Result<(), Error> = claim_nft(&ctx_claim, &mut host, &mut logger);
+ assert_eq!(claim_result_bad, Err(Error::NFTLimitReached));
+ }
+
+ #[concordium_test]
+ fn test_whitelist() {
+ let mut ctx = TestInitContext::empty();
+ ctx.set_metadata_slot_time(Timestamp::from_timestamp_millis(1));
+ let mut state_builder = TestStateBuilder::new();
+
+ let account_0_string = "00000000000000000000000000000000000000000000000000".to_string();
+ let account_1_string = "11111111111111111111111111111111111111111111111111".to_string();
+ let account_2_string = "22222222222222222222222222222222222222222222222222".to_string();
+
+ let whitelist: Vec =
+ vec![account_0_string.clone(), account_1_string, account_2_string];
+
+ // This should allow anyone to purchase 1 NFT
+ let params = InitParams {
+ nft_limit: 1,
+ nft_time_limit: 0,
+ whitelist: whitelist.clone(),
+ reserve: 0,
+ base_url: String::new(),
+ whitelist_file: String::new(),
+ metadata: String::new(),
+ selected_index: false,
+ nft_limit_per_address: 0,
+ };
+
+ let parameter_bytes = to_bytes(¶ms);
+ ctx.set_parameter(¶meter_bytes);
+
+ let state = init(&ctx, &mut state_builder).unwrap();
+ // convert the addresses to strings
+ let mut hashes: Vec = vec![];
+ for address in whitelist {
+ hashes.push(digest(address));
+ }
+
+ let bad_address: String = "This address should not work".to_string();
+ assert_eq!(state.check_hash_value(hashes[0].clone()), true);
+ assert_eq!(state.check_hash_value(hashes[1].clone()), true);
+ assert_eq!(state.check_hash_value(hashes[2].clone()), true);
+ assert_eq!(state.check_hash_value(bad_address), false);
+
+ let a = digest(hashes[0].clone() + &hashes[1]);
+ let b = digest(hashes[2].clone() + &hashes[2]); // MT will duplicated 4th element from 3rd
+ let c = digest(a.clone() + &b);
+
+ let test_merkle_proof = vec![hashes[0].clone(), a, c];
+
+ let test_address = digest(account_0_string);
+ let merkle_proof = state.get_hash_proof(test_address).unwrap();
+ assert_eq!(merkle_proof, test_merkle_proof);
+ }
+
+ #[concordium_test]
+ fn test_merkle_proof() {
+ let mut ctx = TestInitContext::empty();
+ ctx.set_metadata_slot_time(Timestamp::from_timestamp_millis(1));
+ let mut state_builder = TestStateBuilder::new();
+
+ let account_0_string = "00000000000000000000000000000000000000000000000000".to_string();
+ let account_1_string = "11111111111111111111111111111111111111111111111111".to_string();
+ let account_2_string = "22222222222222222222222222222222222222222222222222".to_string();
+ let account_3_string = "33333333333333333333333333333333333333333333333333".to_string();
+
+ let whitelist: Vec = vec![
+ account_0_string.clone(),
+ account_1_string.clone(),
+ account_2_string,
+ ];
+
+ // This should allow anyone to purchase 1 NFT
+ let params = InitParams {
+ nft_limit: 1,
+ nft_time_limit: 0,
+ whitelist: whitelist.clone(),
+ whitelist_file: String::new(),
+ metadata: String::new(),
+ reserve: 0,
+ base_url: String::new(),
+ selected_index: false,
+ nft_limit_per_address: 0,
+ };
+
+ let parameter_bytes = to_bytes(¶ms);
+ ctx.set_parameter(¶meter_bytes);
+
+ let state = init(&ctx, &mut state_builder).unwrap();
+
+ // convert the addresses to strings
+ let mut hashes: Vec = vec![];
+ for address in whitelist {
+ hashes.push(digest(address));
+ }
+
+ assert_eq!(state.check_hash_value(hashes[0].clone()), true);
+ assert_eq!(state.check_hash_value(hashes[1].clone()), true);
+ assert_eq!(state.check_hash_value(hashes[2].clone()), true);
+ assert_eq!(state.check_hash_value(account_3_string), false);
+
+ let a = digest(hashes[0].clone() + &hashes[1]);
+ let b = digest(hashes[2].clone() + &hashes[2]); // MT will duplicated 4th element from 3rd
+ let c = digest(a.clone() + &b);
+
+ let test_merkle_proof = vec![hashes[0].clone(), a, c];
+
+ let test_address = digest(account_0_string.clone());
+ let merkle_proof = state.get_hash_proof(test_address).unwrap();
+ assert_eq!(merkle_proof, test_merkle_proof);
+
+ const ACCOUNT_0: AccountAddress = AccountAddress([0u8; 32]);
+ const ACCOUNT_1: AccountAddress = AccountAddress([1u8; 32]);
+
+ let proof_params = ClaimNFTParams {
+ proof: test_merkle_proof.clone(),
+ node: ACCOUNT_0,
+ node_string: account_0_string,
+ selected_token: concordium_cis2::TokenIdU32(0),
+ amount_of_tokens: 1,
+ };
+ assert_eq!(state.check_proof(&proof_params), true);
+
+ let proof_params = ClaimNFTParams {
+ proof: test_merkle_proof.clone(),
+ node: ACCOUNT_1,
+ node_string: account_1_string,
+ selected_token: concordium_cis2::TokenIdU32(0),
+ amount_of_tokens: 1,
+ };
+ assert_eq!(state.check_proof(&proof_params), false);
+ }
+
+ #[concordium_test]
+ fn test_claim_with_whitelist_full_reserve() {
+ let mut ctx = TestInitContext::empty();
+ let mut state_builder = TestStateBuilder::new();
+ ctx.set_metadata_slot_time(Timestamp::from_timestamp_millis(1));
+
+ let account_0_string = "00000000000000000000000000000000000000000000000000".to_string();
+ let account_1_string = "10101010101010101010101010101010101010101010101010".to_string();
+ const ACCOUNT_0: AccountAddress = AccountAddress([0u8; 32]);
+ const ACCOUNT_1: AccountAddress = AccountAddress([1u8; 32]);
+
+ let whitelist: Vec = vec![account_0_string.clone(), account_1_string.clone()];
+
+ // This should allow anyone to purchase 1 NFT
+ let params = InitParams {
+ nft_limit: 4,
+ nft_time_limit: 0,
+ whitelist: whitelist.clone(),
+ reserve: 4,
+ base_url: String::new(),
+ whitelist_file: String::new(),
+ metadata: String::new(),
+ selected_index: false,
+ nft_limit_per_address: 0,
+ };
+
+ let parameter_bytes = to_bytes(¶ms);
+ ctx.set_parameter(¶meter_bytes);
+
+ let state = init(&ctx, &mut state_builder).unwrap();
+
+ let mut test_proof: Vec = vec![];
+ let acc1 = digest(account_0_string.clone());
+ let acc2 = digest(account_1_string.clone());
+
+ test_proof.push(acc1.clone());
+ test_proof.push(digest(acc1.clone() + &acc2));
+
+ let mut ctx_claim = TestReceiveContext::empty();
+ ctx_claim.set_metadata_slot_time(Timestamp::from_timestamp_millis(1));
+
+ let mint_params = ClaimNFTParams {
+ node: ACCOUNT_0,
+ node_string: account_0_string,
+ proof: test_proof.clone(),
+ selected_token: concordium_cis2::TokenIdU32(0),
+ amount_of_tokens: 1,
+ };
+
+ let mut host = TestHost::new(state, state_builder);
+
+ let claim_parameter_bytes = to_bytes(&mint_params);
+ ctx_claim.set_parameter(&claim_parameter_bytes);
+ let mut logger = TestLogger::init();
+
+ claim_nft(&ctx_claim, &mut host, &mut logger).unwrap();
+
+ let mut ctx_bad_claim = TestReceiveContext::empty();
+ ctx_bad_claim.set_metadata_slot_time(Timestamp::from_timestamp_millis(1));
+ let mint_bad_params = ClaimNFTParams {
+ node: ACCOUNT_1,
+ node_string: account_1_string,
+ proof: test_proof.clone(),
+ selected_token: concordium_cis2::TokenIdU32(0),
+ amount_of_tokens: 1,
+ };
+ let bad_claim_parameter_bytes = to_bytes(&mint_bad_params);
+ ctx_bad_claim.set_parameter(&bad_claim_parameter_bytes);
+
+ let claim_result_bad = claim_nft(&ctx_bad_claim, &mut host, &mut logger);
+ claim_eq!(
+ claim_result_bad,
+ Err(Error::AddressNotOnWhitelist),
+ "Function should fail with NFT error"
+ );
+ }
+
+ #[concordium_test]
+ fn test_claim_with_whitelist_no_reserve() {
+ let mut ctx = TestInitContext::empty();
+ let mut state_builder = TestStateBuilder::new();
+ ctx.set_metadata_slot_time(Timestamp::from_timestamp_millis(1));
+
+ let account_0_string = "00000000000000000000000000000000000000000000000000".to_string();
+ let account_1_string = "11111111111111111111111111111111111111111111111111".to_string();
+ const ACCOUNT_0: AccountAddress = AccountAddress([0u8; 32]);
+ const ACCOUNT_1: AccountAddress = AccountAddress([1u8; 32]);
+
+ let whitelist: Vec = vec![account_0_string.clone(), account_1_string.clone()];
+
+ // This should allow anyone to purchase 1 NFT
+ let params = InitParams {
+ nft_limit: 10,
+ nft_time_limit: 0,
+ whitelist: whitelist.clone(),
+ reserve: 0,
+ base_url: String::new(),
+ whitelist_file: String::new(),
+ metadata: String::new(),
+ selected_index: false,
+ nft_limit_per_address: 1,
+ };
+
+ let mut test_proof: Vec = vec![];
+ let acc1 = digest(account_0_string.clone());
+ let acc2 = digest(account_1_string.clone());
+
+ test_proof.push(acc1.clone());
+ test_proof.push(digest(acc1.clone() + &acc2));
+
+ let parameter_bytes = to_bytes(¶ms);
+ ctx.set_parameter(¶meter_bytes);
+
+ let state = init(&ctx, &mut state_builder).unwrap();
+
+ let mut ctx_claim = TestReceiveContext::empty();
+ let mint_params = ClaimNFTParams {
+ node: ACCOUNT_0,
+ node_string: account_0_string,
+ proof: test_proof.clone(),
+ selected_token: concordium_cis2::TokenIdU32(0),
+ amount_of_tokens: 1,
+ };
+
+ let mut host = TestHost::new(state, state_builder);
+
+ let claim_parameter_bytes = to_bytes(&mint_params);
+ ctx_claim.set_parameter(&claim_parameter_bytes);
+ ctx_claim.set_metadata_slot_time(Timestamp::from_timestamp_millis(1));
+ let mut logger = TestLogger::init();
+
+ claim_nft(&ctx_claim, &mut host, &mut logger).unwrap();
+
+ let mut ctx_bad_claim = TestReceiveContext::empty();
+ ctx_bad_claim.set_metadata_slot_time(Timestamp::from_timestamp_millis(1));
+ let mint_bad_params = ClaimNFTParams {
+ node: ACCOUNT_1,
+ node_string: account_1_string,
+ proof: test_proof.clone(),
+ selected_token: concordium_cis2::TokenIdU32(0),
+ amount_of_tokens: 1,
+ };
+ let bad_claim_parameter_bytes = to_bytes(&mint_bad_params);
+ ctx_bad_claim.set_parameter(&bad_claim_parameter_bytes);
+
+ let claim_result_bad = claim_nft(&ctx_bad_claim, &mut host, &mut logger);
+ claim_eq!(
+ claim_result_bad,
+ Err(Error::AddressNotOnWhitelist),
+ "Function should fail with NFT error"
+ );
+ }
+
+ #[concordium_test]
+ fn test_claim_with_whitelist_partial_reserve() {
+ let mut ctx = TestInitContext::empty();
+ ctx.set_metadata_slot_time(Timestamp::from_timestamp_millis(1));
+ let mut state_builder = TestStateBuilder::new();
+
+ let account_0_string = "00000000000000000000000000000000000000000000000000".to_string();
+ let account_1_string = "11111111111111111111111111111111111111111111111111".to_string();
+
+ const ACCOUNT_0: AccountAddress = AccountAddress([0u8; 32]);
+ const ACCOUNT_1: AccountAddress = AccountAddress([1u8; 32]);
+
+ let whitelist: Vec = vec![account_0_string.clone()];
+
+ // This should allow anyone to purchase 1 NFT
+ let params = InitParams {
+ nft_limit: 3,
+ nft_time_limit: 0,
+ whitelist: whitelist.clone(),
+ reserve: 2,
+ base_url: String::new(),
+ whitelist_file: String::new(),
+ metadata: String::new(),
+ selected_index: false,
+ nft_limit_per_address: 0,
+ };
+
+ let parameter_bytes = to_bytes(¶ms);
+ ctx.set_parameter(¶meter_bytes);
+
+ let state = init(&ctx, &mut state_builder).unwrap();
+
+ let mut ctx_claim = TestReceiveContext::empty();
+ ctx_claim.set_metadata_slot_time(Timestamp::from_timestamp_millis(1));
+
+ let mint_params = ClaimNFTParams {
+ node: ACCOUNT_1,
+ node_string: account_1_string,
+ proof: vec![],
+ selected_token: concordium_cis2::TokenIdU32(0),
+ amount_of_tokens: 1,
+ };
+
+ let mut host = TestHost::new(state, state_builder);
+
+ let claim_parameter_bytes = to_bytes(&mint_params);
+ ctx_claim.set_parameter(&claim_parameter_bytes);
+
+ let mut logger = TestLogger::init();
+ // this should not check the whitelist
+ claim_nft(&ctx_claim, &mut host, &mut logger).unwrap();
+
+ let mut ctx_wl_claim = TestReceiveContext::empty();
+ ctx_wl_claim.set_metadata_slot_time(Timestamp::from_timestamp_millis(1));
+ let address_hashed = digest(account_0_string.clone());
+
+ let mut test_proof = vec![];
+
+ test_proof.push(address_hashed.clone());
+ test_proof.push(digest(address_hashed.clone() + &address_hashed));
+
+ let mint_wl_params = ClaimNFTParams {
+ node: ACCOUNT_0,
+ node_string: account_0_string,
+ proof: test_proof.clone(),
+ selected_token: concordium_cis2::TokenIdU32(0),
+ amount_of_tokens: 1,
+ };
+
+ let wl_claim_parameter_bytes = to_bytes(&mint_wl_params);
+ ctx_wl_claim.set_parameter(&wl_claim_parameter_bytes);
+
+ let mut logger = TestLogger::init();
+ // this should check the whitelist and pass
+ claim_nft(&ctx_wl_claim, &mut host, &mut logger).unwrap();
+
+ // this should not check the whitelist and fail
+ let fail_claim = claim_nft(&ctx_claim, &mut host, &mut logger);
+
+ claim_eq!(
+ fail_claim,
+ Err(Error::AddressNotOnWhitelist),
+ "Function should fail with whitelist error"
+ );
+ }
+
+ #[concordium_test]
+ fn test_mint_too_late() {
+ let mut ctx = TestInitContext::empty();
+ let mut state_builder = TestStateBuilder::new();
+ ctx.set_metadata_slot_time(Timestamp::from_timestamp_millis(1));
+ const ACCOUNT_0: AccountAddress = AccountAddress([0u8; 32]);
+ let account_0_string = "00000000000000000000000000000000000000000000000000".to_string();
+
+ // This should allow anyone to purchase 1 NFT
+ let params = InitParams {
+ nft_limit: 1,
+ nft_time_limit: 10,
+ whitelist: vec![],
+ reserve: 0,
+ whitelist_file: String::new(),
+ metadata: String::new(),
+ base_url: String::new(),
+ selected_index: false,
+ nft_limit_per_address: 0,
+ };
+
+ let parameter_bytes = to_bytes(¶ms);
+ ctx.set_parameter(¶meter_bytes);
+
+ let state_result = init(&ctx, &mut state_builder);
+ let new_state = state_result.unwrap();
+ assert_eq!(new_state.nft_limit, 1);
+
+ let mut ctx_claim = TestReceiveContext::empty();
+ ctx_claim.set_metadata_slot_time(Timestamp::from_timestamp_millis(1));
+ let mint_params = ClaimNFTParams {
+ node: ACCOUNT_0,
+ node_string: account_0_string,
+ proof: vec![],
+ selected_token: concordium_cis2::TokenIdU32(0),
+ amount_of_tokens: 1,
+ };
+
+ let mut host = TestHost::new(new_state, state_builder);
+
+ let claim_parameter_bytes = to_bytes(&mint_params);
+ ctx_claim.set_metadata_slot_time(Timestamp::from_timestamp_millis(11));
+ ctx_claim.set_parameter(&claim_parameter_bytes);
+
+ let mut logger = TestLogger::init();
+ let claim_result = claim_nft(&ctx_claim, &mut host, &mut logger);
+ claim_eq!(
+ claim_result,
+ Err(Error::AirdropNowClosed),
+ "Function should fail with Airdrop closed error"
+ );
+ }
+
+ #[concordium_test]
+ fn test_mint_no_reserve_no_whitelist_selected_index() {
+ let mut ctx = TestInitContext::empty();
+ ctx.set_metadata_slot_time(Timestamp::from_timestamp_millis(1));
+ let mut state_builder = TestStateBuilder::new();
+
+ let account_0_string = "00000000000000000000000000000000000000000000000000".to_string();
+ const ACCOUNT_0: AccountAddress = AccountAddress([0u8; 32]);
+
+ // This should allow anyone to purchase 2 NFTs
+ let params = InitParams {
+ nft_limit: 2,
+ nft_time_limit: 0,
+ whitelist: vec![],
+ reserve: 0,
+ base_url: "https://some.example/token/".to_string(),
+ whitelist_file: String::new(),
+ metadata: String::new(),
+ selected_index: true,
+ nft_limit_per_address: 0,
+ };
+
+ let parameter_bytes = to_bytes(¶ms);
+ ctx.set_parameter(¶meter_bytes);
+
+ let state_result = init(&ctx, &mut state_builder);
+ let new_state = state_result.unwrap();
+ assert_eq!(new_state.nft_limit, 2);
+
+ let mut ctx_claim = TestReceiveContext::empty();
+ ctx_claim.set_metadata_slot_time(Timestamp::from_timestamp_millis(1));
+ let mint_params = ClaimNFTParams {
+ node: ACCOUNT_0,
+ node_string: account_0_string.clone(),
+ proof: vec![],
+ selected_token: concordium_cis2::TokenIdU32(2),
+ amount_of_tokens: 1,
+ };
+
+ let mut host = TestHost::new(new_state, state_builder);
+
+ let claim_parameter_bytes = to_bytes(&mint_params);
+ ctx_claim.set_parameter(&claim_parameter_bytes);
+ let mut logger = TestLogger::init();
+
+ let claim_result = claim_nft(&ctx_claim, &mut host, &mut logger);
+ assert_eq!(claim_result.is_ok(), true);
+
+ claim!(
+ logger.logs.contains(&to_bytes(&Cis2Event::Mint(MintEvent {
+ owner: concordium_std::Address::Account(ACCOUNT_0),
+ token_id: ContractTokenId::from(2),
+ amount: ContractTokenAmount::from(1),
+ }))),
+ "Expected an event for minting token 2"
+ );
+
+ claim!(
+ logger.logs.contains(&to_bytes(
+ &Cis2Event::TokenMetadata::<_, ContractTokenAmount>(TokenMetadataEvent {
+ token_id: concordium_cis2::TokenIdU32(2),
+ metadata_url: MetadataUrl {
+ url: "https://some.example/token/02000000".to_string(),
+ hash: None,
+ },
+ })
+ )),
+ "Expected an event for token metadata for token 2"
+ );
+
+ // check that the token has the correct owner:
+ let mut owner_ctx = TestReceiveContext::empty();
+ let owner_params = concordium_cis2::TokenIdU32(2);
+ let owner_parameter_bytes = to_bytes(&owner_params);
+ owner_ctx.set_parameter(&owner_parameter_bytes);
+ let owner_result: Result = check_owner(&owner_ctx, &mut host);
+ assert!(owner_result.is_ok());
+ let result_details = owner_result.unwrap();
+ assert!(result_details.address.is_some());
+ assert_eq!(result_details.address.unwrap(), account_0_string);
+
+ // check that the wrong token has the no owner:
+ let mut non_owner_ctx = TestReceiveContext::empty();
+ let non_owner_params = concordium_cis2::TokenIdU32(5);
+ let non_owner_parameter_bytes = to_bytes(&non_owner_params);
+ non_owner_ctx.set_parameter(&non_owner_parameter_bytes);
+ let non_owner_result: Result =
+ check_owner(&non_owner_ctx, &mut host);
+ assert!(non_owner_result.is_ok());
+ let non_result_details = non_owner_result.unwrap();
+ assert!(non_result_details.address.is_none());
+
+ // Check the right amount of tokens exist and have been claimed
+ assert_eq!(total_supply(&non_owner_ctx, &mut host).unwrap(), 2);
+ assert_eq!(current_supply(&non_owner_ctx, &mut host).unwrap(), 1);
+
+ assert_eq!(
+ view(&ctx_claim, &host).unwrap(),
+ ViewResult {
+ metadata: String::new(),
+ whitelist: String::new(),
+ number_of_nfts: 2
+ }
+ );
+
+ let claim_result_bad: Result<(), Error> = claim_nft(&ctx_claim, &mut host, &mut logger);
+ assert_eq!(claim_result_bad, Err(Error::IndexAlreadyClaimed));
+ }
+
+ #[concordium_test]
+ fn test_mint_no_reserve_no_whitelist_address_limited() {
+ let mut ctx = TestInitContext::empty();
+ ctx.set_metadata_slot_time(Timestamp::from_timestamp_millis(1));
+ let mut state_builder = TestStateBuilder::new();
+
+ const ACCOUNT_0: AccountAddress = AccountAddress([1u8; 32]);
+ let account_0_string = "00000000000000000000000000000000000000000000000000".to_string();
+
+ let params = InitParams {
+ nft_limit: 3,
+ nft_time_limit: 0,
+ whitelist: vec![],
+ reserve: 0,
+ base_url: String::new(),
+ whitelist_file: String::new(),
+ metadata: String::new(),
+ selected_index: false,
+ nft_limit_per_address: 1,
+ };
+
+ let parameter_bytes = to_bytes(¶ms);
+ ctx.set_parameter(¶meter_bytes);
+
+ let state_result = init(&ctx, &mut state_builder);
+ let new_state = state_result.unwrap();
+ assert_eq!(new_state.nft_limit, 3);
+
+ let mut ctx_claim = TestReceiveContext::empty();
+ ctx_claim.set_metadata_slot_time(Timestamp::from_timestamp_millis(1));
+ let mint_params = ClaimNFTParams {
+ node: ACCOUNT_0,
+ node_string: account_0_string,
+ proof: vec![],
+ selected_token: concordium_cis2::TokenIdU32(0),
+ amount_of_tokens: 2,
+ };
+
+ let mut host = TestHost::new(new_state, state_builder);
+ let claim_parameter_bytes = to_bytes(&mint_params);
+ ctx_claim.set_parameter(&claim_parameter_bytes);
+ let mut logger = TestLogger::init();
+
+ let claim_result = claim_nft(&ctx_claim, &mut host, &mut logger);
+ assert_eq!(claim_result.is_ok(), false);
+ }
+}