diff --git a/.changeset/README.md b/.changeset/README.md
index e5b6d8d6a6..4f3b76b096 100644
--- a/.changeset/README.md
+++ b/.changeset/README.md
@@ -5,4 +5,4 @@ with multi-package repos, or single-package repos to help you version and publis
find the full documentation for it [in our repository](https://github.com/changesets/changesets)
We have a quick list of common questions to get you started engaging with this project in
-[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md)
+[our documentation](https://github.com/changesets/changesets/blob/master/docs/common-questions.md)
diff --git a/.changeset/config.json b/.changeset/config.json
index 4f8345f464..6b372552ca 100644
--- a/.changeset/config.json
+++ b/.changeset/config.json
@@ -5,7 +5,7 @@
"fixed": [],
"linked": [],
"access": "restricted",
- "baseBranch": "master",
+ "baseBranch": "main",
"updateInternalDependencies": "patch",
- "ignore": ["@0xsequence/wallet-primitives-cli", "docs", "web"]
+ "ignore": []
}
diff --git a/.codesandbox/.github/workflows/build.yml b/.codesandbox/.github/workflows/build.yml
new file mode 100644
index 0000000000..fe104fb809
--- /dev/null
+++ b/.codesandbox/.github/workflows/build.yml
@@ -0,0 +1,32 @@
+name: build app
+
+on:
+ push:
+ branches:
+ - master
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ name: Build and Push
+ steps:
+ - name: git-checkout
+ uses: actions/checkout@v3
+
+ - name: Setup PNPM
+ uses: pnpm/action-setup@v2
+ with:
+ version: 8
+ run_install: true
+
+ - name: Build
+ run: pnpm dist
+
+ - name: Push
+ uses: s0/git-publish-subdir-action@develop
+ env:
+ REPO: self
+ BRANCH: build
+ FOLDER: dist
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ MESSAGE: 'Build: ({sha}) {msg}'
diff --git a/.codesandbox/.gitignore b/.codesandbox/.gitignore
new file mode 100644
index 0000000000..e4db0232ce
--- /dev/null
+++ b/.codesandbox/.gitignore
@@ -0,0 +1,19 @@
+.env
+
+#dependencies
+node_modules/
+
+# production
+dist/
+
+# misc
+.DS_Store
+.vscode
+.idea/
+*.iml
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+lerna-debug.log*
+
+.env.local
diff --git a/.codesandbox/.prettierrc b/.codesandbox/.prettierrc
new file mode 100644
index 0000000000..421afa9791
--- /dev/null
+++ b/.codesandbox/.prettierrc
@@ -0,0 +1,9 @@
+{
+ "tabWidth": 2,
+ "useTabs": false,
+ "semi": false,
+ "singleQuote": true,
+ "trailingComma": "none",
+ "arrowParens": "avoid",
+ "printWidth": 130
+}
diff --git a/.codesandbox/README.md b/.codesandbox/README.md
new file mode 100644
index 0000000000..130d32d21e
--- /dev/null
+++ b/.codesandbox/README.md
@@ -0,0 +1,45 @@
+# Demo Dapp
+
+Dapp example on how to use Sequence Wallet. Covers how to connect, sign messages and send transctions.
+
+Try this dapp at: [https://0xsequence.github.io/demo-dapp](https://0xsequence.github.io/demo-dapp)
+
+For complete documentation on Sequence, please see: [https://docs.sequence.build](https://docs.sequence.build)
+
+## Usage
+
+1. pnpm install
+2. pnpm start
+3. Open browser to http://localhost:4000 to access the demo dapp
+4. Open browser inspector to see responses from the remote Sequence Wallet
+
+## Development
+
+See [src/App.tsx](./src/App.tsx) for the source
+usage for a variety of functions. Be sure to open your browser's dev inspector to see output.
+Think of these functions as a "cookbook" for how you can perform these functions in your dapps.
+
+Also note, sequence.js is built on top of ethers.js, and is API-compatible.
+
+## Screenshots
+
+**Opening wallet from dapp:**
+
+
+
+**Send transaction from dapp:**
+
+Sequence Wallet is an Ethereum wallet supporting Ethereum mainnet, Polygon and more. Sequence will work
+with any blockchain which is EVM compatible and supports Ethereum's node JSON-RPC interface.
+
+Here you can see in this screenshot the call to "Send DAI" from demo-dapp
+(https://github.com/0xsequence/demo-dapp/blob/master/src/routes/HomeRoute.tsx#L420). This function demonstrates
+how you can transfer an ERC-20 token like DAI on any Ethereum network.
+
+Notice how you can pay gas fees for a transaction in either MATIC token or USDC for price of $0.01.
+
+
+
+## LICENSE
+
+Apache 2.0 or MIT (your choice)
diff --git a/.codesandbox/index.html b/.codesandbox/index.html
new file mode 100644
index 0000000000..7a355ef15c
--- /dev/null
+++ b/.codesandbox/index.html
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Sequence | Demo Dapp
+
+
+ You need to enable JavaScript to run this app.
+
+
+
+
+
diff --git a/.codesandbox/package.json b/.codesandbox/package.json
new file mode 100644
index 0000000000..cbe91bfe10
--- /dev/null
+++ b/.codesandbox/package.json
@@ -0,0 +1,60 @@
+{
+ "name": "demo-dapp",
+ "description": "Ethereum Demo Dapp built on Sequence stack",
+ "version": "0.1.0",
+ "private": true,
+ "homepage": "demo-dapp",
+ "scripts": {
+ "dev": "BROWSER=none pnpm start",
+ "start": "vite",
+ "build": "tsc && vite build",
+ "typecheck": "tsc --noEmit",
+ "serve": "Vite preview",
+ "dist": "pnpm build",
+ "link-sequence": "pnpm run clear:vite:cache && ../sequence.js/scripts/pnpm-link.sh link",
+ "unlink-sequence": "pnpm run clear:vite:cache && ../sequence.js/scripts/pnpm-link.sh unlink",
+ "clear:vite:cache": "rimraf node_modules/.vite/"
+ },
+ "dependencies": {
+ "0xsequence": "2.2.13",
+ "@0xsequence/abi": "2.2.13",
+ "@0xsequence/design-system": "^1.8.1",
+ "@0xsequence/ethauth": "^1.0.0",
+ "@0xsequence/network": "2.2.13",
+ "@0xsequence/provider": "2.2.13",
+ "@0xsequence/utils": "2.2.13",
+ "@types/node": "^20.11.30",
+ "@types/react": "^18.3.7",
+ "@types/react-dom": "^18.3.0",
+ "@vanilla-extract/css": "^1.14.1",
+ "ethers": "^6.13.4",
+ "framer-motion": "^9.0.1",
+ "react": "^18.3.1",
+ "react-dom": "^18.3.1",
+ "typescript": "^4.5.5"
+ },
+ "devDependencies": {
+ "@vanilla-extract/vite-plugin": "^4.0.6",
+ "@vitejs/plugin-react": "^4.2.1",
+ "vite": "^6.4.2",
+ "vite-plugin-svgr": "^4.2.0",
+ "vite-tsconfig-paths": "^4.3.2"
+ },
+ "eslintConfig": {
+ "extends": [
+ "react-app"
+ ]
+ },
+ "browsers list": {
+ "production": [
+ ">0.2%",
+ "not dead",
+ "not op_mini all"
+ ],
+ "development": [
+ "last 1 chrome version",
+ "last 1 firefox version",
+ "last 1 safari version"
+ ]
+ }
+}
diff --git a/.codesandbox/pnpm-lock.yaml b/.codesandbox/pnpm-lock.yaml
new file mode 100644
index 0000000000..14abf5d34d
--- /dev/null
+++ b/.codesandbox/pnpm-lock.yaml
@@ -0,0 +1,4111 @@
+lockfileVersion: '9.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+importers:
+
+ .:
+ dependencies:
+ 0xsequence:
+ specifier: 2.2.3
+ version: 2.2.3(ethers@6.13.4)
+ '@0xsequence/abi':
+ specifier: 2.2.13
+ version: 2.2.13
+ '@0xsequence/design-system':
+ specifier: ^1.8.1
+ version: 1.8.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(framer-motion@9.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@0xsequence/ethauth':
+ specifier: ^1.0.0
+ version: 1.0.0(ethers@6.13.4)
+ '@0xsequence/network':
+ specifier: 2.2.13
+ version: 2.2.13(ethers@6.13.4)
+ '@0xsequence/provider':
+ specifier: 2.2.13
+ version: 2.2.13(ethers@6.13.4)
+ '@0xsequence/utils':
+ specifier: 2.2.13
+ version: 2.2.13(ethers@6.13.4)
+ '@types/node':
+ specifier: ^20.11.30
+ version: 20.11.30
+ '@types/react':
+ specifier: ^18.3.7
+ version: 18.3.7
+ '@types/react-dom':
+ specifier: ^18.3.0
+ version: 18.3.0
+ '@vanilla-extract/css':
+ specifier: ^1.14.1
+ version: 1.14.1
+ ethers:
+ specifier: ^6.13.4
+ version: 6.13.4
+ framer-motion:
+ specifier: ^9.0.1
+ version: 9.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react:
+ specifier: ^18.3.1
+ version: 18.3.1
+ react-dom:
+ specifier: ^18.3.1
+ version: 18.3.1(react@18.3.1)
+ typescript:
+ specifier: ^4.5.5
+ version: 4.5.5
+ devDependencies:
+ '@vanilla-extract/vite-plugin':
+ specifier: ^4.0.6
+ version: 4.0.6(@types/node@20.11.30)(vite@5.2.6(@types/node@20.11.30))
+ '@vitejs/plugin-react':
+ specifier: ^4.2.1
+ version: 4.2.1(vite@5.2.6(@types/node@20.11.30))
+ vite:
+ specifier: ^5.2.6
+ version: 5.2.6(@types/node@20.11.30)
+ vite-plugin-svgr:
+ specifier: ^4.2.0
+ version: 4.2.0(rollup@4.21.3)(typescript@4.5.5)(vite@5.2.6(@types/node@20.11.30))
+ vite-tsconfig-paths:
+ specifier: ^4.3.2
+ version: 4.3.2(typescript@4.5.5)(vite@5.2.6(@types/node@20.11.30))
+
+packages:
+
+ 0xsequence@2.2.3:
+ resolution: {integrity: sha512-1P/U1oEu51vCA6VgrzCt1pPjEx6iKd44NLLjHTEmmUxEKcesEFHtzhfA9H6tY/O2liqVT8SpS5NoHnQqtoyEAg==}
+ peerDependencies:
+ ethers: '>=6'
+
+ '@0xsequence/abi@2.2.13':
+ resolution: {integrity: sha512-cZDR83SNxpXTD9vZoJAtmn6/YgvttN0gmeB8feQ5cpo8yd+AeJvQpUGMPR6Ud1MQGsvcPTLnTwKkL432Pc6UGQ==}
+
+ '@0xsequence/abi@2.2.3':
+ resolution: {integrity: sha512-y0JxKXHKqkJh2i2d8F+Ql7P5jyGujJ2P28pN4YTcYacqmpDZqYi3d0Bf+uMgroWfncKBZDBETGxjWNvUYmhivg==}
+
+ '@0xsequence/account@2.2.13':
+ resolution: {integrity: sha512-+kGyDsLEYOQUMhahtJps1N2j0jLXl0hAl2ilGA4NiALck7JP1Q/IO0RtkOlfSgjqFdyaipGvhYYyJuok2ARF5w==}
+ peerDependencies:
+ ethers: '>=6'
+
+ '@0xsequence/account@2.2.3':
+ resolution: {integrity: sha512-Q0czXuoNpwwECwMS4GGkmoh0xIEfQrATi5gcyLlhA5kDu4Idsws3dy95D4fkTXTY2kt7JUNuG79XEmq5L2GciQ==}
+ peerDependencies:
+ ethers: '>=6'
+
+ '@0xsequence/api@2.2.13':
+ resolution: {integrity: sha512-UmFMdLRCOfUGT2WqXzHE91sm+XU7eossdoKZ74W/F1ZTBU8XRa4DldQ0alKjff5x4Hxe/wIjppBPE9pQUzGYxA==}
+
+ '@0xsequence/api@2.2.3':
+ resolution: {integrity: sha512-qwNcAWb4LbewZqn/39WHU/te1Wi+h7JJ2kuu9RRcV+rore3Z3zc7SqxHqtxoVMUOKlubmDEv/Y4BsL00m6XLmQ==}
+
+ '@0xsequence/auth@2.2.13':
+ resolution: {integrity: sha512-3UQ6/zDhrNO5BVsgiLwCfQq4Nmbd1W0Ync/FNug8Yum1i9r2il54bUZRtauct6uMUaotAqNG4l/nzy105v93QQ==}
+ peerDependencies:
+ ethers: '>=6'
+
+ '@0xsequence/auth@2.2.3':
+ resolution: {integrity: sha512-Ct5ECn5qigaSMDZ6j9vvGX3eaeSO9P9bAoknImhFURH4dsC7Dz03Z3oYbP/78oKX2RqV3uu8c8NxAWzYjBLuNg==}
+ peerDependencies:
+ ethers: '>=6'
+
+ '@0xsequence/core@2.2.13':
+ resolution: {integrity: sha512-tu6OEGbDLg1KfMb+YOn0Z5BsYbK3UFBjuPVHRx7SpmCsZPEApJqqRKHpTYah2T3bmYIJy9tRBtqstfTsniSgng==}
+ peerDependencies:
+ ethers: '>=6'
+
+ '@0xsequence/core@2.2.3':
+ resolution: {integrity: sha512-Bt2PsAIDSOjRx82uTqDYmOdin1DYVtwlt/TYb27Q/oNSY8MA1GG5NqEHefssi/ohXAsPRNeLMaspfmX0/BUTWw==}
+ peerDependencies:
+ ethers: '>=6'
+
+ '@0xsequence/design-system@1.8.1':
+ resolution: {integrity: sha512-VsYBYR8d2UXnte5MvysyWtrdYpyvTYpQFbpNW8nOseAB6lWc8q9miTwYzeUy0fq90BQQ1YfE95EbJ4BjGTYInw==}
+ peerDependencies:
+ framer-motion: '>=6'
+ react: '>=17'
+ react-dom: '>=17'
+
+ '@0xsequence/ethauth@1.0.0':
+ resolution: {integrity: sha512-piihXzbS8Sq7P670a+GyTm3igTJL3Ts6pqjJcC0Sv86yqeK6QD0pzJP4APP+/IQa5k+0s2l1SeZwMjR7gSPtCA==}
+ peerDependencies:
+ ethers: '>=6'
+
+ '@0xsequence/guard@2.2.3':
+ resolution: {integrity: sha512-B9FRVJauAs/Asispe0p6wk3zAQubL9c6laC3xsCnFq3Qkv5t4VsGudTBe6ewx0xTeyQwEnVkneVgnUcnUP9xwA==}
+ peerDependencies:
+ ethers: '>=6'
+
+ '@0xsequence/indexer@2.2.13':
+ resolution: {integrity: sha512-RFjjjckuAhM0vgYFO1RgYyBqsUrU54l2N/Isr5DPSLCCczp+qcopNuFMB0e0FuvzUP1buunxTjHRVjFH75kQEA==}
+
+ '@0xsequence/indexer@2.2.3':
+ resolution: {integrity: sha512-bt74b5+SV5aGM+ZZfUmSU7rkttmc8I7OsQovQZBDw5YRVWPVEeVPZeX4ws4bZwiuYifD954A2Z/2MX1brH76Sw==}
+
+ '@0xsequence/metadata@2.2.13':
+ resolution: {integrity: sha512-RpkIXSYKEt/W6zCoY99Q44OMjjLf//Pi8yImitXNh8IqTZqio54L9Xo4L+5ryz6rjPmaY3Mce1J1D5YJam0h4g==}
+
+ '@0xsequence/metadata@2.2.3':
+ resolution: {integrity: sha512-Y7/Prw0CVxTuw59B0DnE0WnjbhJaPATibThWb13Y6W99M4NvQi5NlfS2KagfsMo5MHb5iFRjJHrCFovbv+MiuA==}
+
+ '@0xsequence/migration@2.2.13':
+ resolution: {integrity: sha512-YcdjW7BRrQiOvhmSuvTM3GqklZVfO3dpbwSNqT0bMqwx/9YzE0CsVZVSMYrqVq5njyNFZjs42zazLdcrqqA2Ag==}
+ peerDependencies:
+ ethers: '>=6'
+
+ '@0xsequence/migration@2.2.3':
+ resolution: {integrity: sha512-Q1+YePKzfPnCF9Rk0Tc9EqYtD1BdLym8ZEjco6b5BtyAGyIF7UefWql57IVEXBB/H1DtF+M7JHoZusvmS6atTw==}
+ peerDependencies:
+ ethers: '>=6'
+
+ '@0xsequence/network@2.2.13':
+ resolution: {integrity: sha512-U8sVC2nWokPtQzIXwNKOP/mgkkuvjxYmQrgITkc8YDTAQOYPu6n/4lIqQ2//jjSfloniMK00tDpfUd5fCFbsUA==}
+ peerDependencies:
+ ethers: '>=6'
+
+ '@0xsequence/network@2.2.3':
+ resolution: {integrity: sha512-oOw4oB/Y6EqTvFHYzMX9bjpizj8DQxkUGdQLBcs3R1ZLipbbwhMKWfBf9BoXAl1YUthyFKI5rl9v0MJMxaq3Bg==}
+ peerDependencies:
+ ethers: '>=6'
+
+ '@0xsequence/provider@2.2.13':
+ resolution: {integrity: sha512-p5DlA2eHWhgfyCK7JQL3k7qT+aNiNxFkiAMbO2Q/eRnBnmrKcN0dK9HjuK1lWvWH3eZniEgK/M9Kec6nfixbcw==}
+ peerDependencies:
+ ethers: '>=6'
+
+ '@0xsequence/provider@2.2.3':
+ resolution: {integrity: sha512-QxHBbgLGGpVsnEiFI5uvpuEUdl7JfxQ/i2T28aUK4vtUtiYLTiOnNwQy9RiK/bGPtqx9vh3Xh05G8c1KKWRqyw==}
+ peerDependencies:
+ ethers: '>=6'
+
+ '@0xsequence/relayer@2.2.13':
+ resolution: {integrity: sha512-fnt4AJ1u9CPwx7JJwpZ7UbJ3eN2LOG0Wuwe4FS9OSfxCOhbokELRSWegToEyH6ew6FRPvsuRMN/im3Bu3Og0QQ==}
+ peerDependencies:
+ ethers: '>=6'
+
+ '@0xsequence/relayer@2.2.3':
+ resolution: {integrity: sha512-baFGhIQIXhYcRNWV2mzFss+EXYkSlsnMI0+G3ZOUAfTkPR5Tv8iL/srvM0d+/ByhCsGwe8fqNfEbFTGIDOVviA==}
+ peerDependencies:
+ ethers: '>=6'
+
+ '@0xsequence/replacer@2.2.13':
+ resolution: {integrity: sha512-+cTsda4HKzLpCzERrcPSEn5ei/lj4vPIs6kAS9aqO1XOWqeyslPWcPbfMgMbMbn+/vmbnVuqUXDOgRZqkZ2FEA==}
+ peerDependencies:
+ ethers: '>=6'
+
+ '@0xsequence/replacer@2.2.3':
+ resolution: {integrity: sha512-onYf/GjYUkah1GTqimBliQQzCF9ksfb53ugJKibN1Q1uT2mKJvO1NMxXviuduXan2A+Rdr8/tTkfZwMnbVoX+A==}
+ peerDependencies:
+ ethers: '>=6'
+
+ '@0xsequence/sessions@2.2.13':
+ resolution: {integrity: sha512-duClp86VeyaMuyKItByK2rIbsDQHDiMP22yLQeCN+Si+bk0T7Jta9rHP+PoAOncKpbRDJZSqSX1hmzYgB4LD5g==}
+ peerDependencies:
+ ethers: '>=6'
+
+ '@0xsequence/sessions@2.2.3':
+ resolution: {integrity: sha512-MJgOZkG3fZFc0sidYY1OzFGte2HVRjmkrxDukuwlEsxvN2M+HikgrpFwVcG5u1n2uiJGA0Uzq85UL7jvF5QozQ==}
+ peerDependencies:
+ ethers: '>=6'
+
+ '@0xsequence/signhub@2.2.13':
+ resolution: {integrity: sha512-yCo3l3a4nYNy5LOxcH4xEoGmQqMfWq9BxkUF+Y8xDd001L7cynaGzAS7s+5Fs4B+HD9obC7NxwSOeoJ6qqk4xw==}
+ peerDependencies:
+ ethers: '>=6'
+
+ '@0xsequence/signhub@2.2.3':
+ resolution: {integrity: sha512-Gk0DitT/Su+gMDAa/r6mNOBX+RcWQfd75CnuOmJxBZT/jH6uxrbtlz/DDTR/P1gjf1EyYJ7NjibszMvr9sawzA==}
+ peerDependencies:
+ ethers: '>=6'
+
+ '@0xsequence/utils@2.2.13':
+ resolution: {integrity: sha512-V4uip1fCZAzp5O2S+nkKnwrqmzzC7em1Mc4HJvUX+fqT0jzw20BZt0CNlX34DgW6E6MzBvWnrX+DTfz/+alBWQ==}
+ peerDependencies:
+ ethers: '>=6'
+
+ '@0xsequence/utils@2.2.3':
+ resolution: {integrity: sha512-2F9dMqlgsoPdXk8xfOc7VuTrEtsNukadI5HSUYpLF+J1HZBamkCa/shgiHoKIZULiDt+scZ/3amVXvQUk0Zj1w==}
+ peerDependencies:
+ ethers: '>=6'
+
+ '@0xsequence/wallet@2.2.13':
+ resolution: {integrity: sha512-lCD+Z6E4bpZCkwAttFy4P1iAM1ZkaiN9zo8dw4+unSVqzVslPPKoWNCX+b16Qg1pZEqe0yPjbqqon0eH/iHGyw==}
+ peerDependencies:
+ ethers: '>=6'
+
+ '@0xsequence/wallet@2.2.3':
+ resolution: {integrity: sha512-lS/eVCQtjm4TAL4Xc+Hec7YZAoAZJ5XLRd3eo7oV8Seakwa2GagT3MeGnpMgRUTpySf4i9k3iDcL6fkpxWVvMg==}
+ peerDependencies:
+ ethers: '>=6'
+
+ '@adraffy/ens-normalize@1.10.1':
+ resolution: {integrity: sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==}
+
+ '@ampproject/remapping@2.2.1':
+ resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==}
+ engines: {node: '>=6.0.0'}
+
+ '@ampproject/remapping@2.3.0':
+ resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
+ engines: {node: '>=6.0.0'}
+
+ '@babel/code-frame@7.23.5':
+ resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/code-frame@7.24.2':
+ resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/compat-data@7.23.5':
+ resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/core@7.23.7':
+ resolution: {integrity: sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/core@7.24.3':
+ resolution: {integrity: sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/generator@7.23.6':
+ resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/generator@7.24.1':
+ resolution: {integrity: sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-compilation-targets@7.23.6':
+ resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-environment-visitor@7.22.20':
+ resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-function-name@7.23.0':
+ resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-hoist-variables@7.22.5':
+ resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-module-imports@7.22.15':
+ resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-module-transforms@7.23.3':
+ resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/helper-plugin-utils@7.22.5':
+ resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-plugin-utils@7.24.0':
+ resolution: {integrity: sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-simple-access@7.22.5':
+ resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-split-export-declaration@7.22.6':
+ resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-string-parser@7.22.5':
+ resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-string-parser@7.23.4':
+ resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-string-parser@7.24.1':
+ resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-validator-identifier@7.22.20':
+ resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-validator-identifier@7.22.5':
+ resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-validator-option@7.23.5':
+ resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helpers@7.23.8':
+ resolution: {integrity: sha512-KDqYz4PiOWvDFrdHLPhKtCThtIcKVy6avWD2oG4GEvyQ+XDZwHD4YQd+H2vNMnq2rkdxsDkU82T+Vk8U/WXHRQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helpers@7.24.1':
+ resolution: {integrity: sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/highlight@7.23.4':
+ resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/highlight@7.24.2':
+ resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/parser@7.23.6':
+ resolution: {integrity: sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+
+ '@babel/parser@7.24.1':
+ resolution: {integrity: sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+
+ '@babel/plugin-syntax-typescript@7.24.1':
+ resolution: {integrity: sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-react-jsx-self@7.23.3':
+ resolution: {integrity: sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-react-jsx-source@7.23.3':
+ resolution: {integrity: sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/runtime@7.24.1':
+ resolution: {integrity: sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/template@7.22.15':
+ resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/template@7.24.0':
+ resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/traverse@7.23.7':
+ resolution: {integrity: sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/traverse@7.24.1':
+ resolution: {integrity: sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/types@7.22.5':
+ resolution: {integrity: sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/types@7.23.6':
+ resolution: {integrity: sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/types@7.24.0':
+ resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==}
+ engines: {node: '>=6.9.0'}
+
+ '@databeat/tracker@0.9.3':
+ resolution: {integrity: sha512-eGsiNU/CRFujcNtUUqvBiqveCs6S6SiAhalXPDodbk74d3FzvLqHDn5k6WfOEJIhrP3CbYgfMXL0nk51s/rQsg==}
+
+ '@emotion/hash@0.9.1':
+ resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==}
+
+ '@emotion/is-prop-valid@0.8.8':
+ resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==}
+
+ '@emotion/memoize@0.7.4':
+ resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==}
+
+ '@esbuild/aix-ppc64@0.19.12':
+ resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==}
+ engines: {node: '>=12'}
+ cpu: [ppc64]
+ os: [aix]
+
+ '@esbuild/aix-ppc64@0.20.2':
+ resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==}
+ engines: {node: '>=12'}
+ cpu: [ppc64]
+ os: [aix]
+
+ '@esbuild/android-arm64@0.19.12':
+ resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [android]
+
+ '@esbuild/android-arm64@0.20.2':
+ resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [android]
+
+ '@esbuild/android-arm@0.19.12':
+ resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [android]
+
+ '@esbuild/android-arm@0.20.2':
+ resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [android]
+
+ '@esbuild/android-x64@0.19.12':
+ resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [android]
+
+ '@esbuild/android-x64@0.20.2':
+ resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [android]
+
+ '@esbuild/darwin-arm64@0.19.12':
+ resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@esbuild/darwin-arm64@0.20.2':
+ resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@esbuild/darwin-x64@0.19.12':
+ resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@esbuild/darwin-x64@0.20.2':
+ resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@esbuild/freebsd-arm64@0.19.12':
+ resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@esbuild/freebsd-arm64@0.20.2':
+ resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@esbuild/freebsd-x64@0.19.12':
+ resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@esbuild/freebsd-x64@0.20.2':
+ resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@esbuild/linux-arm64@0.19.12':
+ resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@esbuild/linux-arm64@0.20.2':
+ resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@esbuild/linux-arm@0.19.12':
+ resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [linux]
+
+ '@esbuild/linux-arm@0.20.2':
+ resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [linux]
+
+ '@esbuild/linux-ia32@0.19.12':
+ resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [linux]
+
+ '@esbuild/linux-ia32@0.20.2':
+ resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [linux]
+
+ '@esbuild/linux-loong64@0.19.12':
+ resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==}
+ engines: {node: '>=12'}
+ cpu: [loong64]
+ os: [linux]
+
+ '@esbuild/linux-loong64@0.20.2':
+ resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==}
+ engines: {node: '>=12'}
+ cpu: [loong64]
+ os: [linux]
+
+ '@esbuild/linux-mips64el@0.19.12':
+ resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==}
+ engines: {node: '>=12'}
+ cpu: [mips64el]
+ os: [linux]
+
+ '@esbuild/linux-mips64el@0.20.2':
+ resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==}
+ engines: {node: '>=12'}
+ cpu: [mips64el]
+ os: [linux]
+
+ '@esbuild/linux-ppc64@0.19.12':
+ resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==}
+ engines: {node: '>=12'}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@esbuild/linux-ppc64@0.20.2':
+ resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==}
+ engines: {node: '>=12'}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@esbuild/linux-riscv64@0.19.12':
+ resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==}
+ engines: {node: '>=12'}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@esbuild/linux-riscv64@0.20.2':
+ resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==}
+ engines: {node: '>=12'}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@esbuild/linux-s390x@0.19.12':
+ resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==}
+ engines: {node: '>=12'}
+ cpu: [s390x]
+ os: [linux]
+
+ '@esbuild/linux-s390x@0.20.2':
+ resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==}
+ engines: {node: '>=12'}
+ cpu: [s390x]
+ os: [linux]
+
+ '@esbuild/linux-x64@0.19.12':
+ resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [linux]
+
+ '@esbuild/linux-x64@0.20.2':
+ resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [linux]
+
+ '@esbuild/netbsd-x64@0.19.12':
+ resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [netbsd]
+
+ '@esbuild/netbsd-x64@0.20.2':
+ resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [netbsd]
+
+ '@esbuild/openbsd-x64@0.19.12':
+ resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@esbuild/openbsd-x64@0.20.2':
+ resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@esbuild/sunos-x64@0.19.12':
+ resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [sunos]
+
+ '@esbuild/sunos-x64@0.20.2':
+ resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [sunos]
+
+ '@esbuild/win32-arm64@0.19.12':
+ resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@esbuild/win32-arm64@0.20.2':
+ resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@esbuild/win32-ia32@0.19.12':
+ resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@esbuild/win32-ia32@0.20.2':
+ resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@esbuild/win32-x64@0.19.12':
+ resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [win32]
+
+ '@esbuild/win32-x64@0.20.2':
+ resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [win32]
+
+ '@floating-ui/core@1.6.0':
+ resolution: {integrity: sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==}
+
+ '@floating-ui/dom@1.6.3':
+ resolution: {integrity: sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==}
+
+ '@floating-ui/react-dom@2.0.8':
+ resolution: {integrity: sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==}
+ peerDependencies:
+ react: '>=16.8.0'
+ react-dom: '>=16.8.0'
+
+ '@floating-ui/utils@0.2.1':
+ resolution: {integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==}
+
+ '@jridgewell/gen-mapping@0.3.3':
+ resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==}
+ engines: {node: '>=6.0.0'}
+
+ '@jridgewell/gen-mapping@0.3.5':
+ resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==}
+ engines: {node: '>=6.0.0'}
+
+ '@jridgewell/resolve-uri@3.1.0':
+ resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==}
+ engines: {node: '>=6.0.0'}
+
+ '@jridgewell/resolve-uri@3.1.1':
+ resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==}
+ engines: {node: '>=6.0.0'}
+
+ '@jridgewell/resolve-uri@3.1.2':
+ resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
+ engines: {node: '>=6.0.0'}
+
+ '@jridgewell/set-array@1.1.2':
+ resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==}
+ engines: {node: '>=6.0.0'}
+
+ '@jridgewell/set-array@1.2.1':
+ resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==}
+ engines: {node: '>=6.0.0'}
+
+ '@jridgewell/sourcemap-codec@1.4.14':
+ resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==}
+
+ '@jridgewell/sourcemap-codec@1.4.15':
+ resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==}
+
+ '@jridgewell/trace-mapping@0.3.18':
+ resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==}
+
+ '@jridgewell/trace-mapping@0.3.21':
+ resolution: {integrity: sha512-SRfKmRe1KvYnxjEMtxEr+J4HIeMX5YBg/qhRHpxEIGjhX1rshcHlnFUE9K0GazhVKWM7B+nARSkV8LuvJdJ5/g==}
+
+ '@jridgewell/trace-mapping@0.3.25':
+ resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
+
+ '@motionone/animation@10.15.1':
+ resolution: {integrity: sha512-mZcJxLjHor+bhcPuIFErMDNyrdb2vJur8lSfMCsuCB4UyV8ILZLvK+t+pg56erv8ud9xQGK/1OGPt10agPrCyQ==}
+
+ '@motionone/dom@10.16.2':
+ resolution: {integrity: sha512-bnuHdNbge1FutZXv+k7xub9oPWcF0hsu8y1HTH/qg6av58YI0VufZ3ngfC7p2xhMJMnoh0LXFma2EGTgPeCkeg==}
+
+ '@motionone/easing@10.15.1':
+ resolution: {integrity: sha512-6hIHBSV+ZVehf9dcKZLT7p5PEKHGhDwky2k8RKkmOvUoYP3S+dXsKupyZpqx5apjd9f+php4vXk4LuS+ADsrWw==}
+
+ '@motionone/generators@10.15.1':
+ resolution: {integrity: sha512-67HLsvHJbw6cIbLA/o+gsm7h+6D4Sn7AUrB/GPxvujse1cGZ38F5H7DzoH7PhX+sjvtDnt2IhFYF2Zp1QTMKWQ==}
+
+ '@motionone/types@10.15.1':
+ resolution: {integrity: sha512-iIUd/EgUsRZGrvW0jqdst8st7zKTzS9EsKkP+6c6n4MPZoQHwiHuVtTQLD6Kp0bsBLhNzKIBlHXponn/SDT4hA==}
+
+ '@motionone/utils@10.15.1':
+ resolution: {integrity: sha512-p0YncgU+iklvYr/Dq4NobTRdAPv9PveRDUXabPEeOjBLSO/1FNB2phNTZxOxpi1/GZwYpAoECEa0Wam+nsmhSw==}
+
+ '@noble/curves@1.2.0':
+ resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==}
+
+ '@noble/hashes@1.3.2':
+ resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==}
+ engines: {node: '>= 16'}
+
+ '@noble/hashes@1.6.1':
+ resolution: {integrity: sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w==}
+ engines: {node: ^14.21.3 || >=16}
+
+ '@radix-ui/number@1.1.0':
+ resolution: {integrity: sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==}
+
+ '@radix-ui/primitive@1.1.0':
+ resolution: {integrity: sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==}
+
+ '@radix-ui/react-arrow@1.1.0':
+ resolution: {integrity: sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-aspect-ratio@1.1.0':
+ resolution: {integrity: sha512-dP87DM/Y7jFlPgUZTlhx6FF5CEzOiaxp2rBCKlaXlpH5Ip/9Fg5zZ9lDOQ5o/MOfUlf36eak14zoWYpgcgGoOg==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-checkbox@1.1.1':
+ resolution: {integrity: sha512-0i/EKJ222Afa1FE0C6pNJxDq1itzcl3HChE9DwskA4th4KRse8ojx8a1nVcOjwJdbpDLcz7uol77yYnQNMHdKw==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-collapsible@1.1.0':
+ resolution: {integrity: sha512-zQY7Epa8sTL0mq4ajSJpjgn2YmCgyrG7RsQgLp3C0LQVkG7+Tf6Pv1CeNWZLyqMjhdPkBa5Lx7wYBeSu7uCSTA==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-collection@1.1.0':
+ resolution: {integrity: sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-compose-refs@1.1.0':
+ resolution: {integrity: sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-context@1.1.0':
+ resolution: {integrity: sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-dialog@1.1.1':
+ resolution: {integrity: sha512-zysS+iU4YP3STKNS6USvFVqI4qqx8EpiwmT5TuCApVEBca+eRCbONi4EgzfNSuVnOXvC5UPHHMjs8RXO6DH9Bg==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-direction@1.1.0':
+ resolution: {integrity: sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-dismissable-layer@1.1.0':
+ resolution: {integrity: sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-dropdown-menu@2.1.1':
+ resolution: {integrity: sha512-y8E+x9fBq9qvteD2Zwa4397pUVhYsh9iq44b5RD5qu1GMJWBCBuVg1hMyItbc6+zH00TxGRqd9Iot4wzf3OoBQ==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-focus-guards@1.1.0':
+ resolution: {integrity: sha512-w6XZNUPVv6xCpZUqb/yN9DL6auvpGX3C/ee6Hdi16v2UUy25HV2Q5bcflsiDyT/g5RwbPQ/GIT1vLkeRb+ITBw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-focus-scope@1.1.0':
+ resolution: {integrity: sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-id@1.1.0':
+ resolution: {integrity: sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-menu@2.1.1':
+ resolution: {integrity: sha512-oa3mXRRVjHi6DZu/ghuzdylyjaMXLymx83irM7hTxutQbD+7IhPKdMdRHD26Rm+kHRrWcrUkkRPv5pd47a2xFQ==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-popper@1.2.0':
+ resolution: {integrity: sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-portal@1.1.1':
+ resolution: {integrity: sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-presence@1.1.0':
+ resolution: {integrity: sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-primitive@2.0.0':
+ resolution: {integrity: sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-progress@1.1.0':
+ resolution: {integrity: sha512-aSzvnYpP725CROcxAOEBVZZSIQVQdHgBr2QQFKySsaD14u8dNT0batuXI+AAGDdAHfXH8rbnHmjYFqVJ21KkRg==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-radio-group@1.2.0':
+ resolution: {integrity: sha512-yv+oiLaicYMBpqgfpSPw6q+RyXlLdIpQWDHZbUKURxe+nEh53hFXPPlfhfQQtYkS5MMK/5IWIa76SksleQZSzw==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-roving-focus@1.1.0':
+ resolution: {integrity: sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-select@2.1.1':
+ resolution: {integrity: sha512-8iRDfyLtzxlprOo9IicnzvpsO1wNCkuwzzCM+Z5Rb5tNOpCdMvcc2AkzX0Fz+Tz9v6NJ5B/7EEgyZveo4FBRfQ==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-slot@1.1.0':
+ resolution: {integrity: sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-switch@1.1.0':
+ resolution: {integrity: sha512-OBzy5WAj641k0AOSpKQtreDMe+isX0MQJ1IVyF03ucdF3DunOnROVrjWs8zsXUxC3zfZ6JL9HFVCUlMghz9dJw==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-tabs@1.1.0':
+ resolution: {integrity: sha512-bZgOKB/LtZIij75FSuPzyEti/XBhJH52ExgtdVqjCIh+Nx/FW+LhnbXtbCzIi34ccyMsyOja8T0thCzoHFXNKA==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-toast@1.2.1':
+ resolution: {integrity: sha512-5trl7piMXcZiCq7MW6r8YYmu0bK5qDpTWz+FdEPdKyft2UixkspheYbjbrLXVN5NGKHFbOP7lm8eD0biiSqZqg==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-tooltip@1.1.2':
+ resolution: {integrity: sha512-9XRsLwe6Yb9B/tlnYCPVUd/TFS4J7HuOZW345DCeC6vKIxQGMZdx21RK4VoZauPD5frgkXTYVS5y90L+3YBn4w==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-use-callback-ref@1.1.0':
+ resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-use-controllable-state@1.1.0':
+ resolution: {integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-use-escape-keydown@1.1.0':
+ resolution: {integrity: sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-use-layout-effect@1.1.0':
+ resolution: {integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-use-previous@1.1.0':
+ resolution: {integrity: sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-use-rect@1.1.0':
+ resolution: {integrity: sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-use-size@1.1.0':
+ resolution: {integrity: sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-visually-hidden@1.1.0':
+ resolution: {integrity: sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/rect@1.1.0':
+ resolution: {integrity: sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==}
+
+ '@rollup/pluginutils@5.1.0':
+ resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
+ peerDependenciesMeta:
+ rollup:
+ optional: true
+
+ '@rollup/rollup-android-arm-eabi@4.13.1':
+ resolution: {integrity: sha512-4C4UERETjXpC4WpBXDbkgNVgHyWfG3B/NKY46e7w5H134UDOFqUJKpsLm0UYmuupW+aJmRgeScrDNfvZ5WV80A==}
+ cpu: [arm]
+ os: [android]
+
+ '@rollup/rollup-android-arm-eabi@4.21.3':
+ resolution: {integrity: sha512-MmKSfaB9GX+zXl6E8z4koOr/xU63AMVleLEa64v7R0QF/ZloMs5vcD1sHgM64GXXS1csaJutG+ddtzcueI/BLg==}
+ cpu: [arm]
+ os: [android]
+
+ '@rollup/rollup-android-arm64@4.13.1':
+ resolution: {integrity: sha512-TrTaFJ9pXgfXEiJKQ3yQRelpQFqgRzVR9it8DbeRzG0RX7mKUy0bqhCFsgevwXLJepQKTnLl95TnPGf9T9AMOA==}
+ cpu: [arm64]
+ os: [android]
+
+ '@rollup/rollup-android-arm64@4.21.3':
+ resolution: {integrity: sha512-zrt8ecH07PE3sB4jPOggweBjJMzI1JG5xI2DIsUbkA+7K+Gkjys6eV7i9pOenNSDJH3eOr/jLb/PzqtmdwDq5g==}
+ cpu: [arm64]
+ os: [android]
+
+ '@rollup/rollup-darwin-arm64@4.13.1':
+ resolution: {integrity: sha512-fz7jN6ahTI3cKzDO2otQuybts5cyu0feymg0bjvYCBrZQ8tSgE8pc0sSNEuGvifrQJWiwx9F05BowihmLxeQKw==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@rollup/rollup-darwin-arm64@4.21.3':
+ resolution: {integrity: sha512-P0UxIOrKNBFTQaXTxOH4RxuEBVCgEA5UTNV6Yz7z9QHnUJ7eLX9reOd/NYMO3+XZO2cco19mXTxDMXxit4R/eQ==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@rollup/rollup-darwin-x64@4.13.1':
+ resolution: {integrity: sha512-WTvdz7SLMlJpektdrnWRUN9C0N2qNHwNbWpNo0a3Tod3gb9leX+yrYdCeB7VV36OtoyiPAivl7/xZ3G1z5h20g==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@rollup/rollup-darwin-x64@4.21.3':
+ resolution: {integrity: sha512-L1M0vKGO5ASKntqtsFEjTq/fD91vAqnzeaF6sfNAy55aD+Hi2pBI5DKwCO+UNDQHWsDViJLqshxOahXyLSh3EA==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@rollup/rollup-linux-arm-gnueabihf@4.13.1':
+ resolution: {integrity: sha512-dBHQl+7wZzBYcIF6o4k2XkAfwP2ks1mYW2q/Gzv9n39uDcDiAGDqEyml08OdY0BIct0yLSPkDTqn4i6czpBLLw==}
+ cpu: [arm]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm-gnueabihf@4.21.3':
+ resolution: {integrity: sha512-btVgIsCjuYFKUjopPoWiDqmoUXQDiW2A4C3Mtmp5vACm7/GnyuprqIDPNczeyR5W8rTXEbkmrJux7cJmD99D2g==}
+ cpu: [arm]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm-musleabihf@4.21.3':
+ resolution: {integrity: sha512-zmjbSphplZlau6ZTkxd3+NMtE4UKVy7U4aVFMmHcgO5CUbw17ZP6QCgyxhzGaU/wFFdTfiojjbLG3/0p9HhAqA==}
+ cpu: [arm]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm64-gnu@4.13.1':
+ resolution: {integrity: sha512-bur4JOxvYxfrAmocRJIW0SADs3QdEYK6TQ7dTNz6Z4/lySeu3Z1H/+tl0a4qDYv0bCdBpUYM0sYa/X+9ZqgfSQ==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm64-gnu@4.21.3':
+ resolution: {integrity: sha512-nSZfcZtAnQPRZmUkUQwZq2OjQciR6tEoJaZVFvLHsj0MF6QhNMg0fQ6mUOsiCUpTqxTx0/O6gX0V/nYc7LrgPw==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm64-musl@4.13.1':
+ resolution: {integrity: sha512-ssp77SjcDIUSoUyj7DU7/5iwM4ZEluY+N8umtCT9nBRs3u045t0KkW02LTyHouHDomnMXaXSZcCSr2bdMK63kA==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm64-musl@4.21.3':
+ resolution: {integrity: sha512-MnvSPGO8KJXIMGlQDYfvYS3IosFN2rKsvxRpPO2l2cum+Z3exiExLwVU+GExL96pn8IP+GdH8Tz70EpBhO0sIQ==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@rollup/rollup-linux-powerpc64le-gnu@4.21.3':
+ resolution: {integrity: sha512-+W+p/9QNDr2vE2AXU0qIy0qQE75E8RTwTwgqS2G5CRQ11vzq0tbnfBd6brWhS9bCRjAjepJe2fvvkvS3dno+iw==}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@rollup/rollup-linux-riscv64-gnu@4.13.1':
+ resolution: {integrity: sha512-Jv1DkIvwEPAb+v25/Unrnnq9BO3F5cbFPT821n3S5litkz+O5NuXuNhqtPx5KtcwOTtaqkTsO+IVzJOsxd11aQ==}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@rollup/rollup-linux-riscv64-gnu@4.21.3':
+ resolution: {integrity: sha512-yXH6K6KfqGXaxHrtr+Uoy+JpNlUlI46BKVyonGiaD74ravdnF9BUNC+vV+SIuB96hUMGShhKV693rF9QDfO6nQ==}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@rollup/rollup-linux-s390x-gnu@4.13.1':
+ resolution: {integrity: sha512-U564BrhEfaNChdATQaEODtquCC7Ez+8Hxz1h5MAdMYj0AqD0GA9rHCpElajb/sQcaFL6NXmHc5O+7FXpWMa73Q==}
+ cpu: [s390x]
+ os: [linux]
+
+ '@rollup/rollup-linux-s390x-gnu@4.21.3':
+ resolution: {integrity: sha512-R8cwY9wcnApN/KDYWTH4gV/ypvy9yZUHlbJvfaiXSB48JO3KpwSpjOGqO4jnGkLDSk1hgjYkTbTt6Q7uvPf8eg==}
+ cpu: [s390x]
+ os: [linux]
+
+ '@rollup/rollup-linux-x64-gnu@4.13.1':
+ resolution: {integrity: sha512-zGRDulLTeDemR8DFYyFIQ8kMP02xpUsX4IBikc7lwL9PrwR3gWmX2NopqiGlI2ZVWMl15qZeUjumTwpv18N7sQ==}
+ cpu: [x64]
+ os: [linux]
+
+ '@rollup/rollup-linux-x64-gnu@4.21.3':
+ resolution: {integrity: sha512-kZPbX/NOPh0vhS5sI+dR8L1bU2cSO9FgxwM8r7wHzGydzfSjLRCFAT87GR5U9scj2rhzN3JPYVC7NoBbl4FZ0g==}
+ cpu: [x64]
+ os: [linux]
+
+ '@rollup/rollup-linux-x64-musl@4.13.1':
+ resolution: {integrity: sha512-VTk/MveyPdMFkYJJPCkYBw07KcTkGU2hLEyqYMsU4NjiOfzoaDTW9PWGRsNwiOA3qI0k/JQPjkl/4FCK1smskQ==}
+ cpu: [x64]
+ os: [linux]
+
+ '@rollup/rollup-linux-x64-musl@4.21.3':
+ resolution: {integrity: sha512-S0Yq+xA1VEH66uiMNhijsWAafffydd2X5b77eLHfRmfLsRSpbiAWiRHV6DEpz6aOToPsgid7TI9rGd6zB1rhbg==}
+ cpu: [x64]
+ os: [linux]
+
+ '@rollup/rollup-win32-arm64-msvc@4.13.1':
+ resolution: {integrity: sha512-L+hX8Dtibb02r/OYCsp4sQQIi3ldZkFI0EUkMTDwRfFykXBPptoz/tuuGqEd3bThBSLRWPR6wsixDSgOx/U3Zw==}
+ cpu: [arm64]
+ os: [win32]
+
+ '@rollup/rollup-win32-arm64-msvc@4.21.3':
+ resolution: {integrity: sha512-9isNzeL34yquCPyerog+IMCNxKR8XYmGd0tHSV+OVx0TmE0aJOo9uw4fZfUuk2qxobP5sug6vNdZR6u7Mw7Q+Q==}
+ cpu: [arm64]
+ os: [win32]
+
+ '@rollup/rollup-win32-ia32-msvc@4.13.1':
+ resolution: {integrity: sha512-+dI2jVPfM5A8zme8riEoNC7UKk0Lzc7jCj/U89cQIrOjrZTCWZl/+IXUeRT2rEZ5j25lnSA9G9H1Ob9azaF/KQ==}
+ cpu: [ia32]
+ os: [win32]
+
+ '@rollup/rollup-win32-ia32-msvc@4.21.3':
+ resolution: {integrity: sha512-nMIdKnfZfzn1Vsk+RuOvl43ONTZXoAPUUxgcU0tXooqg4YrAqzfKzVenqqk2g5efWh46/D28cKFrOzDSW28gTA==}
+ cpu: [ia32]
+ os: [win32]
+
+ '@rollup/rollup-win32-x64-msvc@4.13.1':
+ resolution: {integrity: sha512-YY1Exxo2viZ/O2dMHuwQvimJ0SqvL+OAWQLLY6rvXavgQKjhQUzn7nc1Dd29gjB5Fqi00nrBWctJBOyfVMIVxw==}
+ cpu: [x64]
+ os: [win32]
+
+ '@rollup/rollup-win32-x64-msvc@4.21.3':
+ resolution: {integrity: sha512-fOvu7PCQjAj4eWDEuD8Xz5gpzFqXzGlxHZozHP4b9Jxv9APtdxL6STqztDzMLuRXEc4UpXGGhx029Xgm91QBeA==}
+ cpu: [x64]
+ os: [win32]
+
+ '@svgr/babel-plugin-add-jsx-attribute@8.0.0':
+ resolution: {integrity: sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@svgr/babel-plugin-remove-jsx-attribute@8.0.0':
+ resolution: {integrity: sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0':
+ resolution: {integrity: sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0':
+ resolution: {integrity: sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@svgr/babel-plugin-svg-dynamic-title@8.0.0':
+ resolution: {integrity: sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@svgr/babel-plugin-svg-em-dimensions@8.0.0':
+ resolution: {integrity: sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@svgr/babel-plugin-transform-react-native-svg@8.1.0':
+ resolution: {integrity: sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@svgr/babel-plugin-transform-svg-component@8.0.0':
+ resolution: {integrity: sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==}
+ engines: {node: '>=12'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@svgr/babel-preset@8.1.0':
+ resolution: {integrity: sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@svgr/core@8.1.0':
+ resolution: {integrity: sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==}
+ engines: {node: '>=14'}
+
+ '@svgr/hast-util-to-babel-ast@8.0.0':
+ resolution: {integrity: sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==}
+ engines: {node: '>=14'}
+
+ '@svgr/plugin-jsx@8.1.0':
+ resolution: {integrity: sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@svgr/core': '*'
+
+ '@types/babel__core@7.20.5':
+ resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==}
+
+ '@types/babel__generator@7.6.8':
+ resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==}
+
+ '@types/babel__template@7.4.4':
+ resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==}
+
+ '@types/babel__traverse@7.20.5':
+ resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==}
+
+ '@types/estree@1.0.5':
+ resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==}
+
+ '@types/node@20.11.30':
+ resolution: {integrity: sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==}
+
+ '@types/node@22.7.5':
+ resolution: {integrity: sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==}
+
+ '@types/prop-types@15.7.13':
+ resolution: {integrity: sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==}
+
+ '@types/react-dom@18.3.0':
+ resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==}
+
+ '@types/react@18.3.7':
+ resolution: {integrity: sha512-KUnDCJF5+AiZd8owLIeVHqmW9yM4sqmDVf2JRJiBMFkGvkoZ4/WyV2lL4zVsoinmRS/W3FeEdZLEWFRofnT2FQ==}
+
+ '@vanilla-extract/babel-plugin-debug-ids@1.0.5':
+ resolution: {integrity: sha512-Rc9A6ylsw7EBErmpgqCMvc/Z/eEZxI5k1xfLQHw7f5HHh3oc5YfzsAsYU/PdmSNjF1dp3sGEViBdDltvwnfVaA==}
+
+ '@vanilla-extract/css@1.14.1':
+ resolution: {integrity: sha512-V4JUuHNjZgl64NGfkDJePqizkNgiSpphODtZEs4cCPuxLAzwOUJYATGpejwimJr1n529kq4DEKWexW22LMBokw==}
+
+ '@vanilla-extract/integration@7.1.1':
+ resolution: {integrity: sha512-2JjDKL2HDTazis4oTkUFsQFUyw61k8oym9r0NOLSJC0JB0W25W1ryVZvDx74d3deIyB5AWbCselyzl3gja30kQ==}
+
+ '@vanilla-extract/private@1.0.3':
+ resolution: {integrity: sha512-17kVyLq3ePTKOkveHxXuIJZtGYs+cSoev7BlP+Lf4916qfDhk/HBjvlYDe8egrea7LNPHKwSZJK/bzZC+Q6AwQ==}
+
+ '@vanilla-extract/vite-plugin@4.0.6':
+ resolution: {integrity: sha512-uT2AhzxEC8qdn7SFxD/MHF7pxyFMb2e7HY3+isyPDzkTyIdiA/ZXk7qwWhcigFMNCJ6YuyxFQJmiDhP9U9oOmg==}
+ peerDependencies:
+ vite: ^4.0.3 || ^5.0.0
+
+ '@vitejs/plugin-react@4.2.1':
+ resolution: {integrity: sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ peerDependencies:
+ vite: ^4.2.0 || ^5.0.0
+
+ acorn@8.11.3:
+ resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+
+ aes-js@4.0.0-beta.5:
+ resolution: {integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==}
+
+ ansi-styles@3.2.1:
+ resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
+ engines: {node: '>=4'}
+
+ ansi-styles@4.3.0:
+ resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+ engines: {node: '>=8'}
+
+ argparse@2.0.1:
+ resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+
+ aria-hidden@1.2.4:
+ resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==}
+ engines: {node: '>=10'}
+
+ browserslist@4.22.2:
+ resolution: {integrity: sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==}
+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+ hasBin: true
+
+ cac@6.7.14:
+ resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
+ engines: {node: '>=8'}
+
+ callsites@3.1.0:
+ resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
+ engines: {node: '>=6'}
+
+ camelcase@6.3.0:
+ resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
+ engines: {node: '>=10'}
+
+ caniuse-lite@1.0.30001579:
+ resolution: {integrity: sha512-u5AUVkixruKHJjw/pj9wISlcMpgFWzSrczLZbrqBSxukQixmg0SJ5sZTpvaFvxU0HoQKd4yoyAogyrAz9pzJnA==}
+
+ chalk@2.4.2:
+ resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
+ engines: {node: '>=4'}
+
+ chalk@4.1.2:
+ resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
+ engines: {node: '>=10'}
+
+ color-convert@1.9.3:
+ resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
+
+ color-convert@2.0.1:
+ resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+ engines: {node: '>=7.0.0'}
+
+ color-name@1.1.3:
+ resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
+
+ color-name@1.1.4:
+ resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+
+ convert-source-map@2.0.0:
+ resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
+
+ cosmiconfig@8.3.6:
+ resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ typescript: '>=4.9.5'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ css-what@6.1.0:
+ resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==}
+ engines: {node: '>= 6'}
+
+ cssesc@3.0.0:
+ resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ csstype@3.1.3:
+ resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
+
+ debug@4.3.4:
+ resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ deep-object-diff@1.1.9:
+ resolution: {integrity: sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA==}
+
+ deepmerge@4.3.1:
+ resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
+ engines: {node: '>=0.10.0'}
+
+ detect-node-es@1.1.0:
+ resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==}
+
+ dot-case@3.0.4:
+ resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==}
+
+ electron-to-chromium@1.4.638:
+ resolution: {integrity: sha512-gpmbAG2LbfPKcDaL5m9IKutKjUx4ZRkvGNkgL/8nKqxkXsBVYykVULboWlqCrHsh3razucgDJDuKoWJmGPdItA==}
+
+ entities@4.5.0:
+ resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
+ engines: {node: '>=0.12'}
+
+ error-ex@1.3.2:
+ resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
+
+ esbuild@0.19.12:
+ resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==}
+ engines: {node: '>=12'}
+ hasBin: true
+
+ esbuild@0.20.2:
+ resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==}
+ engines: {node: '>=12'}
+ hasBin: true
+
+ escalade@3.1.1:
+ resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
+ engines: {node: '>=6'}
+
+ escape-string-regexp@1.0.5:
+ resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
+ engines: {node: '>=0.8.0'}
+
+ estree-walker@2.0.2:
+ resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
+
+ ethers@6.13.4:
+ resolution: {integrity: sha512-21YtnZVg4/zKkCQPjrDj38B1r4nQvTZLopUGMLQ1ePU2zV/joCfDC3t3iKQjWRzjjjbzR+mdAIoikeBRNkdllA==}
+ engines: {node: '>=14.0.0'}
+
+ eval@0.1.8:
+ resolution: {integrity: sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==}
+ engines: {node: '>= 0.8'}
+
+ eventemitter2@6.4.9:
+ resolution: {integrity: sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==}
+
+ find-up@5.0.0:
+ resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
+ engines: {node: '>=10'}
+
+ framer-motion@9.0.1:
+ resolution: {integrity: sha512-0EP7+b/hnsbrFOum9zU+23Fq2cJJrLOqv/yJ26fIzK4CC33ZAjXZGi1/XyblbgnUF0cxZ/SEDj5IYHeQo42qNg==}
+ peerDependencies:
+ react: ^18.0.0
+ react-dom: ^18.0.0
+
+ fsevents@2.3.3:
+ resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+
+ gensync@1.0.0-beta.2:
+ resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
+ engines: {node: '>=6.9.0'}
+
+ get-nonce@1.0.1:
+ resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==}
+ engines: {node: '>=6'}
+
+ globals@11.12.0:
+ resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
+ engines: {node: '>=4'}
+
+ globrex@0.1.2:
+ resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==}
+
+ has-flag@3.0.0:
+ resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
+ engines: {node: '>=4'}
+
+ has-flag@4.0.0:
+ resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
+ engines: {node: '>=8'}
+
+ hey-listen@1.0.8:
+ resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==}
+
+ idb@7.1.1:
+ resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==}
+
+ import-fresh@3.3.0:
+ resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
+ engines: {node: '>=6'}
+
+ invariant@2.2.4:
+ resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==}
+
+ is-arrayish@0.2.1:
+ resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
+
+ javascript-stringify@2.1.0:
+ resolution: {integrity: sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==}
+
+ js-base64@3.7.7:
+ resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==}
+
+ js-tokens@4.0.0:
+ resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+
+ js-yaml@4.1.0:
+ resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
+ hasBin: true
+
+ jsesc@2.5.2:
+ resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ json-parse-even-better-errors@2.3.1:
+ resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
+
+ json5@2.2.3:
+ resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ jsonc-parser@3.2.1:
+ resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==}
+
+ lines-and-columns@1.2.4:
+ resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
+
+ locate-path@6.0.0:
+ resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
+ engines: {node: '>=10'}
+
+ lodash@4.17.21:
+ resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
+
+ loose-envify@1.4.0:
+ resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
+ hasBin: true
+
+ lower-case@2.0.2:
+ resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==}
+
+ lru-cache@5.1.1:
+ resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
+
+ media-query-parser@2.0.2:
+ resolution: {integrity: sha512-1N4qp+jE0pL5Xv4uEcwVUhIkwdUO3S/9gML90nqKA7v7FcOS5vUtatfzok9S9U1EJU8dHWlcv95WLnKmmxZI9w==}
+
+ mlly@1.6.1:
+ resolution: {integrity: sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==}
+
+ modern-ahocorasick@1.0.1:
+ resolution: {integrity: sha512-yoe+JbhTClckZ67b2itRtistFKf8yPYelHLc7e5xAwtNAXxM6wJTUx2C7QeVSJFDzKT7bCIFyBVybPMKvmB9AA==}
+
+ ms@2.1.2:
+ resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
+
+ nanoid@3.3.7:
+ resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+
+ no-case@3.0.4:
+ resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==}
+
+ node-releases@2.0.14:
+ resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==}
+
+ outdent@0.8.0:
+ resolution: {integrity: sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A==}
+
+ p-limit@3.1.0:
+ resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
+ engines: {node: '>=10'}
+
+ p-locate@5.0.0:
+ resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
+ engines: {node: '>=10'}
+
+ parent-module@1.0.1:
+ resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
+ engines: {node: '>=6'}
+
+ parse-json@5.2.0:
+ resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
+ engines: {node: '>=8'}
+
+ path-exists@4.0.0:
+ resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
+ engines: {node: '>=8'}
+
+ path-type@4.0.0:
+ resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
+ engines: {node: '>=8'}
+
+ pathe@1.1.2:
+ resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==}
+
+ picocolors@1.0.0:
+ resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
+
+ picomatch@2.3.1:
+ resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
+ engines: {node: '>=8.6'}
+
+ pkg-types@1.0.3:
+ resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==}
+
+ postcss@8.4.38:
+ resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==}
+ engines: {node: ^10 || ^12 || >=14}
+
+ react-dom@18.3.1:
+ resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==}
+ peerDependencies:
+ react: ^18.3.1
+
+ react-hook-form@7.53.0:
+ resolution: {integrity: sha512-M1n3HhqCww6S2hxLxciEXy2oISPnAzxY7gvwVPrtlczTM/1dDadXgUxDpHMrMTblDOcm/AXtXxHwZ3jpg1mqKQ==}
+ engines: {node: '>=18.0.0'}
+ peerDependencies:
+ react: ^16.8.0 || ^17 || ^18 || ^19
+
+ react-refresh@0.14.0:
+ resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==}
+ engines: {node: '>=0.10.0'}
+
+ react-remove-scroll-bar@2.3.6:
+ resolution: {integrity: sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ react-remove-scroll@2.5.7:
+ resolution: {integrity: sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ react-style-singleton@2.2.1:
+ resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ react@18.3.1:
+ resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==}
+ engines: {node: '>=0.10.0'}
+
+ regenerator-runtime@0.14.1:
+ resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
+
+ require-like@0.1.2:
+ resolution: {integrity: sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==}
+
+ resolve-from@4.0.0:
+ resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
+ engines: {node: '>=4'}
+
+ rollup@4.13.1:
+ resolution: {integrity: sha512-hFi+fU132IvJ2ZuihN56dwgpltpmLZHZWsx27rMCTZ2sYwrqlgL5sECGy1eeV2lAihD8EzChBVVhsXci0wD4Tg==}
+ engines: {node: '>=18.0.0', npm: '>=8.0.0'}
+ hasBin: true
+
+ rollup@4.21.3:
+ resolution: {integrity: sha512-7sqRtBNnEbcBtMeRVc6VRsJMmpI+JU1z9VTvW8D4gXIYQFz0aLcsE6rRkyghZkLfEgUZgVvOG7A5CVz/VW5GIA==}
+ engines: {node: '>=18.0.0', npm: '>=8.0.0'}
+ hasBin: true
+
+ scheduler@0.23.2:
+ resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==}
+
+ semver@6.3.1:
+ resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
+ hasBin: true
+
+ snake-case@3.0.4:
+ resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==}
+
+ source-map-js@1.2.0:
+ resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==}
+ engines: {node: '>=0.10.0'}
+
+ supports-color@5.5.0:
+ resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
+ engines: {node: '>=4'}
+
+ supports-color@7.2.0:
+ resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
+ engines: {node: '>=8'}
+
+ svg-parser@2.0.4:
+ resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==}
+
+ to-fast-properties@2.0.0:
+ resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
+ engines: {node: '>=4'}
+
+ tsconfck@3.0.3:
+ resolution: {integrity: sha512-4t0noZX9t6GcPTfBAbIbbIU4pfpCwh0ueq3S4O/5qXI1VwK1outmxhe9dOiEWqMz3MW2LKgDTpqWV+37IWuVbA==}
+ engines: {node: ^18 || >=20}
+ hasBin: true
+ peerDependencies:
+ typescript: ^5.0.0
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ tslib@2.6.1:
+ resolution: {integrity: sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==}
+
+ tslib@2.6.2:
+ resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==}
+
+ tslib@2.7.0:
+ resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==}
+
+ typescript@4.5.5:
+ resolution: {integrity: sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==}
+ engines: {node: '>=4.2.0'}
+ hasBin: true
+
+ ufo@1.5.3:
+ resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==}
+
+ undici-types@5.26.5:
+ resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
+
+ undici-types@6.19.8:
+ resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==}
+
+ update-browserslist-db@1.0.13:
+ resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==}
+ hasBin: true
+ peerDependencies:
+ browserslist: '>= 4.21.0'
+
+ use-callback-ref@1.3.2:
+ resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ use-sidecar@1.1.2:
+ resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ vite-node@1.4.0:
+ resolution: {integrity: sha512-VZDAseqjrHgNd4Kh8icYHWzTKSCZMhia7GyHfhtzLW33fZlG9SwsB6CEhgyVOWkJfJ2pFLrp/Gj1FSfAiqH9Lw==}
+ engines: {node: ^18.0.0 || >=20.0.0}
+ hasBin: true
+
+ vite-plugin-svgr@4.2.0:
+ resolution: {integrity: sha512-SC7+FfVtNQk7So0XMjrrtLAbEC8qjFPifyD7+fs/E6aaNdVde6umlVVh0QuwDLdOMu7vp5RiGFsB70nj5yo0XA==}
+ peerDependencies:
+ vite: ^2.6.0 || 3 || 4 || 5
+
+ vite-tsconfig-paths@4.3.2:
+ resolution: {integrity: sha512-0Vd/a6po6Q+86rPlntHye7F31zA2URZMbH8M3saAZ/xR9QoGN/L21bxEGfXdWmFdNkqPpRdxFT7nmNe12e9/uA==}
+ peerDependencies:
+ vite: '*'
+ peerDependenciesMeta:
+ vite:
+ optional: true
+
+ vite@5.2.6:
+ resolution: {integrity: sha512-FPtnxFlSIKYjZ2eosBQamz4CbyrTizbZ3hnGJlh/wMtCrlp1Hah6AzBLjGI5I2urTfNnpovpHdrL6YRuBOPnCA==}
+ engines: {node: ^18.0.0 || >=20.0.0}
+ hasBin: true
+ peerDependencies:
+ '@types/node': ^18.0.0 || >=20.0.0
+ less: '*'
+ lightningcss: ^1.21.0
+ sass: '*'
+ stylus: '*'
+ sugarss: '*'
+ terser: ^5.4.0
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+ less:
+ optional: true
+ lightningcss:
+ optional: true
+ sass:
+ optional: true
+ stylus:
+ optional: true
+ sugarss:
+ optional: true
+ terser:
+ optional: true
+
+ webextension-polyfill@0.10.0:
+ resolution: {integrity: sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g==}
+
+ ws@8.17.1:
+ resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==}
+ engines: {node: '>=10.0.0'}
+ peerDependencies:
+ bufferutil: ^4.0.1
+ utf-8-validate: '>=5.0.2'
+ peerDependenciesMeta:
+ bufferutil:
+ optional: true
+ utf-8-validate:
+ optional: true
+
+ yallist@3.1.1:
+ resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
+
+ yocto-queue@0.1.0:
+ resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
+ engines: {node: '>=10'}
+
+snapshots:
+
+ 0xsequence@2.2.3(ethers@6.13.4):
+ dependencies:
+ '@0xsequence/abi': 2.2.3
+ '@0xsequence/account': 2.2.3(ethers@6.13.4)
+ '@0xsequence/api': 2.2.3
+ '@0xsequence/auth': 2.2.3(ethers@6.13.4)
+ '@0xsequence/core': 2.2.3(ethers@6.13.4)
+ '@0xsequence/guard': 2.2.3(ethers@6.13.4)
+ '@0xsequence/indexer': 2.2.3
+ '@0xsequence/metadata': 2.2.3
+ '@0xsequence/migration': 2.2.3(ethers@6.13.4)
+ '@0xsequence/network': 2.2.3(ethers@6.13.4)
+ '@0xsequence/provider': 2.2.3(ethers@6.13.4)
+ '@0xsequence/relayer': 2.2.3(ethers@6.13.4)
+ '@0xsequence/sessions': 2.2.3(ethers@6.13.4)
+ '@0xsequence/signhub': 2.2.3(ethers@6.13.4)
+ '@0xsequence/utils': 2.2.3(ethers@6.13.4)
+ '@0xsequence/wallet': 2.2.3(ethers@6.13.4)
+ ethers: 6.13.4
+
+ '@0xsequence/abi@2.2.13': {}
+
+ '@0xsequence/abi@2.2.3': {}
+
+ '@0xsequence/account@2.2.13(ethers@6.13.4)':
+ dependencies:
+ '@0xsequence/abi': 2.2.13
+ '@0xsequence/core': 2.2.13(ethers@6.13.4)
+ '@0xsequence/migration': 2.2.13(ethers@6.13.4)
+ '@0xsequence/network': 2.2.13(ethers@6.13.4)
+ '@0xsequence/relayer': 2.2.13(ethers@6.13.4)
+ '@0xsequence/sessions': 2.2.13(ethers@6.13.4)
+ '@0xsequence/utils': 2.2.13(ethers@6.13.4)
+ '@0xsequence/wallet': 2.2.13(ethers@6.13.4)
+ ethers: 6.13.4
+
+ '@0xsequence/account@2.2.3(ethers@6.13.4)':
+ dependencies:
+ '@0xsequence/abi': 2.2.3
+ '@0xsequence/core': 2.2.3(ethers@6.13.4)
+ '@0xsequence/migration': 2.2.3(ethers@6.13.4)
+ '@0xsequence/network': 2.2.3(ethers@6.13.4)
+ '@0xsequence/relayer': 2.2.3(ethers@6.13.4)
+ '@0xsequence/sessions': 2.2.3(ethers@6.13.4)
+ '@0xsequence/utils': 2.2.3(ethers@6.13.4)
+ '@0xsequence/wallet': 2.2.3(ethers@6.13.4)
+ ethers: 6.13.4
+
+ '@0xsequence/api@2.2.13': {}
+
+ '@0xsequence/api@2.2.3': {}
+
+ '@0xsequence/auth@2.2.13(ethers@6.13.4)':
+ dependencies:
+ '@0xsequence/abi': 2.2.13
+ '@0xsequence/account': 2.2.13(ethers@6.13.4)
+ '@0xsequence/api': 2.2.13
+ '@0xsequence/core': 2.2.13(ethers@6.13.4)
+ '@0xsequence/ethauth': 1.0.0(ethers@6.13.4)
+ '@0xsequence/indexer': 2.2.13
+ '@0xsequence/metadata': 2.2.13
+ '@0xsequence/migration': 2.2.13(ethers@6.13.4)
+ '@0xsequence/network': 2.2.13(ethers@6.13.4)
+ '@0xsequence/sessions': 2.2.13(ethers@6.13.4)
+ '@0xsequence/signhub': 2.2.13(ethers@6.13.4)
+ '@0xsequence/utils': 2.2.13(ethers@6.13.4)
+ '@0xsequence/wallet': 2.2.13(ethers@6.13.4)
+ ethers: 6.13.4
+
+ '@0xsequence/auth@2.2.3(ethers@6.13.4)':
+ dependencies:
+ '@0xsequence/abi': 2.2.3
+ '@0xsequence/account': 2.2.3(ethers@6.13.4)
+ '@0xsequence/api': 2.2.3
+ '@0xsequence/core': 2.2.3(ethers@6.13.4)
+ '@0xsequence/ethauth': 1.0.0(ethers@6.13.4)
+ '@0xsequence/indexer': 2.2.3
+ '@0xsequence/metadata': 2.2.3
+ '@0xsequence/migration': 2.2.3(ethers@6.13.4)
+ '@0xsequence/network': 2.2.3(ethers@6.13.4)
+ '@0xsequence/sessions': 2.2.3(ethers@6.13.4)
+ '@0xsequence/signhub': 2.2.3(ethers@6.13.4)
+ '@0xsequence/utils': 2.2.3(ethers@6.13.4)
+ '@0xsequence/wallet': 2.2.3(ethers@6.13.4)
+ ethers: 6.13.4
+
+ '@0xsequence/core@2.2.13(ethers@6.13.4)':
+ dependencies:
+ '@0xsequence/abi': 2.2.13
+ '@0xsequence/utils': 2.2.13(ethers@6.13.4)
+ ethers: 6.13.4
+
+ '@0xsequence/core@2.2.3(ethers@6.13.4)':
+ dependencies:
+ '@0xsequence/abi': 2.2.3
+ '@0xsequence/utils': 2.2.3(ethers@6.13.4)
+ ethers: 6.13.4
+
+ '@0xsequence/design-system@1.8.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(framer-motion@9.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-aspect-ratio': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-checkbox': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-collapsible': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-dialog': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-dropdown-menu': 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-progress': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-radio-group': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-select': 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-switch': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-tabs': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-toast': 1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-tooltip': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ framer-motion: 9.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ react-hook-form: 7.53.0(react@18.3.1)
+ transitivePeerDependencies:
+ - '@types/react'
+ - '@types/react-dom'
+
+ '@0xsequence/ethauth@1.0.0(ethers@6.13.4)':
+ dependencies:
+ ethers: 6.13.4
+ js-base64: 3.7.7
+
+ '@0xsequence/guard@2.2.3(ethers@6.13.4)':
+ dependencies:
+ '@0xsequence/account': 2.2.3(ethers@6.13.4)
+ '@0xsequence/core': 2.2.3(ethers@6.13.4)
+ '@0xsequence/signhub': 2.2.3(ethers@6.13.4)
+ '@0xsequence/utils': 2.2.3(ethers@6.13.4)
+ ethers: 6.13.4
+
+ '@0xsequence/indexer@2.2.13': {}
+
+ '@0xsequence/indexer@2.2.3': {}
+
+ '@0xsequence/metadata@2.2.13': {}
+
+ '@0xsequence/metadata@2.2.3': {}
+
+ '@0xsequence/migration@2.2.13(ethers@6.13.4)':
+ dependencies:
+ '@0xsequence/abi': 2.2.13
+ '@0xsequence/core': 2.2.13(ethers@6.13.4)
+ '@0xsequence/wallet': 2.2.13(ethers@6.13.4)
+ ethers: 6.13.4
+
+ '@0xsequence/migration@2.2.3(ethers@6.13.4)':
+ dependencies:
+ '@0xsequence/abi': 2.2.3
+ '@0xsequence/core': 2.2.3(ethers@6.13.4)
+ '@0xsequence/wallet': 2.2.3(ethers@6.13.4)
+ ethers: 6.13.4
+
+ '@0xsequence/network@2.2.13(ethers@6.13.4)':
+ dependencies:
+ '@0xsequence/core': 2.2.13(ethers@6.13.4)
+ '@0xsequence/indexer': 2.2.13
+ '@0xsequence/relayer': 2.2.13(ethers@6.13.4)
+ '@0xsequence/utils': 2.2.13(ethers@6.13.4)
+ ethers: 6.13.4
+
+ '@0xsequence/network@2.2.3(ethers@6.13.4)':
+ dependencies:
+ '@0xsequence/core': 2.2.3(ethers@6.13.4)
+ '@0xsequence/indexer': 2.2.3
+ '@0xsequence/relayer': 2.2.3(ethers@6.13.4)
+ '@0xsequence/utils': 2.2.3(ethers@6.13.4)
+ ethers: 6.13.4
+
+ '@0xsequence/provider@2.2.13(ethers@6.13.4)':
+ dependencies:
+ '@0xsequence/abi': 2.2.13
+ '@0xsequence/account': 2.2.13(ethers@6.13.4)
+ '@0xsequence/auth': 2.2.13(ethers@6.13.4)
+ '@0xsequence/core': 2.2.13(ethers@6.13.4)
+ '@0xsequence/migration': 2.2.13(ethers@6.13.4)
+ '@0xsequence/network': 2.2.13(ethers@6.13.4)
+ '@0xsequence/relayer': 2.2.13(ethers@6.13.4)
+ '@0xsequence/utils': 2.2.13(ethers@6.13.4)
+ '@0xsequence/wallet': 2.2.13(ethers@6.13.4)
+ '@databeat/tracker': 0.9.3
+ ethers: 6.13.4
+ eventemitter2: 6.4.9
+ webextension-polyfill: 0.10.0
+
+ '@0xsequence/provider@2.2.3(ethers@6.13.4)':
+ dependencies:
+ '@0xsequence/abi': 2.2.3
+ '@0xsequence/account': 2.2.3(ethers@6.13.4)
+ '@0xsequence/auth': 2.2.3(ethers@6.13.4)
+ '@0xsequence/core': 2.2.3(ethers@6.13.4)
+ '@0xsequence/migration': 2.2.3(ethers@6.13.4)
+ '@0xsequence/network': 2.2.3(ethers@6.13.4)
+ '@0xsequence/relayer': 2.2.3(ethers@6.13.4)
+ '@0xsequence/utils': 2.2.3(ethers@6.13.4)
+ '@0xsequence/wallet': 2.2.3(ethers@6.13.4)
+ '@databeat/tracker': 0.9.3
+ ethers: 6.13.4
+ eventemitter2: 6.4.9
+ webextension-polyfill: 0.10.0
+
+ '@0xsequence/relayer@2.2.13(ethers@6.13.4)':
+ dependencies:
+ '@0xsequence/abi': 2.2.13
+ '@0xsequence/core': 2.2.13(ethers@6.13.4)
+ '@0xsequence/utils': 2.2.13(ethers@6.13.4)
+ ethers: 6.13.4
+
+ '@0xsequence/relayer@2.2.3(ethers@6.13.4)':
+ dependencies:
+ '@0xsequence/abi': 2.2.3
+ '@0xsequence/core': 2.2.3(ethers@6.13.4)
+ '@0xsequence/utils': 2.2.3(ethers@6.13.4)
+ ethers: 6.13.4
+
+ '@0xsequence/replacer@2.2.13(ethers@6.13.4)':
+ dependencies:
+ '@0xsequence/abi': 2.2.13
+ '@0xsequence/core': 2.2.13(ethers@6.13.4)
+ ethers: 6.13.4
+
+ '@0xsequence/replacer@2.2.3(ethers@6.13.4)':
+ dependencies:
+ '@0xsequence/abi': 2.2.3
+ '@0xsequence/core': 2.2.3(ethers@6.13.4)
+ ethers: 6.13.4
+
+ '@0xsequence/sessions@2.2.13(ethers@6.13.4)':
+ dependencies:
+ '@0xsequence/core': 2.2.13(ethers@6.13.4)
+ '@0xsequence/migration': 2.2.13(ethers@6.13.4)
+ '@0xsequence/replacer': 2.2.13(ethers@6.13.4)
+ '@0xsequence/utils': 2.2.13(ethers@6.13.4)
+ ethers: 6.13.4
+ idb: 7.1.1
+
+ '@0xsequence/sessions@2.2.3(ethers@6.13.4)':
+ dependencies:
+ '@0xsequence/core': 2.2.3(ethers@6.13.4)
+ '@0xsequence/migration': 2.2.3(ethers@6.13.4)
+ '@0xsequence/replacer': 2.2.3(ethers@6.13.4)
+ '@0xsequence/utils': 2.2.3(ethers@6.13.4)
+ ethers: 6.13.4
+ idb: 7.1.1
+
+ '@0xsequence/signhub@2.2.13(ethers@6.13.4)':
+ dependencies:
+ '@0xsequence/core': 2.2.13(ethers@6.13.4)
+ ethers: 6.13.4
+
+ '@0xsequence/signhub@2.2.3(ethers@6.13.4)':
+ dependencies:
+ '@0xsequence/core': 2.2.3(ethers@6.13.4)
+ ethers: 6.13.4
+
+ '@0xsequence/utils@2.2.13(ethers@6.13.4)':
+ dependencies:
+ ethers: 6.13.4
+ js-base64: 3.7.7
+
+ '@0xsequence/utils@2.2.3(ethers@6.13.4)':
+ dependencies:
+ ethers: 6.13.4
+ js-base64: 3.7.7
+
+ '@0xsequence/wallet@2.2.13(ethers@6.13.4)':
+ dependencies:
+ '@0xsequence/abi': 2.2.13
+ '@0xsequence/core': 2.2.13(ethers@6.13.4)
+ '@0xsequence/network': 2.2.13(ethers@6.13.4)
+ '@0xsequence/relayer': 2.2.13(ethers@6.13.4)
+ '@0xsequence/signhub': 2.2.13(ethers@6.13.4)
+ '@0xsequence/utils': 2.2.13(ethers@6.13.4)
+ ethers: 6.13.4
+
+ '@0xsequence/wallet@2.2.3(ethers@6.13.4)':
+ dependencies:
+ '@0xsequence/abi': 2.2.3
+ '@0xsequence/core': 2.2.3(ethers@6.13.4)
+ '@0xsequence/network': 2.2.3(ethers@6.13.4)
+ '@0xsequence/relayer': 2.2.3(ethers@6.13.4)
+ '@0xsequence/signhub': 2.2.3(ethers@6.13.4)
+ '@0xsequence/utils': 2.2.3(ethers@6.13.4)
+ ethers: 6.13.4
+
+ '@adraffy/ens-normalize@1.10.1': {}
+
+ '@ampproject/remapping@2.2.1':
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.3
+ '@jridgewell/trace-mapping': 0.3.18
+
+ '@ampproject/remapping@2.3.0':
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.5
+ '@jridgewell/trace-mapping': 0.3.25
+
+ '@babel/code-frame@7.23.5':
+ dependencies:
+ '@babel/highlight': 7.23.4
+ chalk: 2.4.2
+
+ '@babel/code-frame@7.24.2':
+ dependencies:
+ '@babel/highlight': 7.24.2
+ picocolors: 1.0.0
+
+ '@babel/compat-data@7.23.5': {}
+
+ '@babel/core@7.23.7':
+ dependencies:
+ '@ampproject/remapping': 2.2.1
+ '@babel/code-frame': 7.23.5
+ '@babel/generator': 7.23.6
+ '@babel/helper-compilation-targets': 7.23.6
+ '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.7)
+ '@babel/helpers': 7.23.8
+ '@babel/parser': 7.23.6
+ '@babel/template': 7.22.15
+ '@babel/traverse': 7.23.7
+ '@babel/types': 7.23.6
+ convert-source-map: 2.0.0
+ debug: 4.3.4
+ gensync: 1.0.0-beta.2
+ json5: 2.2.3
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/core@7.24.3':
+ dependencies:
+ '@ampproject/remapping': 2.3.0
+ '@babel/code-frame': 7.24.2
+ '@babel/generator': 7.24.1
+ '@babel/helper-compilation-targets': 7.23.6
+ '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3)
+ '@babel/helpers': 7.24.1
+ '@babel/parser': 7.24.1
+ '@babel/template': 7.24.0
+ '@babel/traverse': 7.24.1
+ '@babel/types': 7.24.0
+ convert-source-map: 2.0.0
+ debug: 4.3.4
+ gensync: 1.0.0-beta.2
+ json5: 2.2.3
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/generator@7.23.6':
+ dependencies:
+ '@babel/types': 7.23.6
+ '@jridgewell/gen-mapping': 0.3.3
+ '@jridgewell/trace-mapping': 0.3.21
+ jsesc: 2.5.2
+
+ '@babel/generator@7.24.1':
+ dependencies:
+ '@babel/types': 7.24.0
+ '@jridgewell/gen-mapping': 0.3.5
+ '@jridgewell/trace-mapping': 0.3.25
+ jsesc: 2.5.2
+
+ '@babel/helper-compilation-targets@7.23.6':
+ dependencies:
+ '@babel/compat-data': 7.23.5
+ '@babel/helper-validator-option': 7.23.5
+ browserslist: 4.22.2
+ lru-cache: 5.1.1
+ semver: 6.3.1
+
+ '@babel/helper-environment-visitor@7.22.20': {}
+
+ '@babel/helper-function-name@7.23.0':
+ dependencies:
+ '@babel/template': 7.22.15
+ '@babel/types': 7.23.6
+
+ '@babel/helper-hoist-variables@7.22.5':
+ dependencies:
+ '@babel/types': 7.22.5
+
+ '@babel/helper-module-imports@7.22.15':
+ dependencies:
+ '@babel/types': 7.23.6
+
+ '@babel/helper-module-transforms@7.23.3(@babel/core@7.23.7)':
+ dependencies:
+ '@babel/core': 7.23.7
+ '@babel/helper-environment-visitor': 7.22.20
+ '@babel/helper-module-imports': 7.22.15
+ '@babel/helper-simple-access': 7.22.5
+ '@babel/helper-split-export-declaration': 7.22.6
+ '@babel/helper-validator-identifier': 7.22.20
+
+ '@babel/helper-module-transforms@7.23.3(@babel/core@7.24.3)':
+ dependencies:
+ '@babel/core': 7.24.3
+ '@babel/helper-environment-visitor': 7.22.20
+ '@babel/helper-module-imports': 7.22.15
+ '@babel/helper-simple-access': 7.22.5
+ '@babel/helper-split-export-declaration': 7.22.6
+ '@babel/helper-validator-identifier': 7.22.20
+
+ '@babel/helper-plugin-utils@7.22.5': {}
+
+ '@babel/helper-plugin-utils@7.24.0': {}
+
+ '@babel/helper-simple-access@7.22.5':
+ dependencies:
+ '@babel/types': 7.22.5
+
+ '@babel/helper-split-export-declaration@7.22.6':
+ dependencies:
+ '@babel/types': 7.22.5
+
+ '@babel/helper-string-parser@7.22.5': {}
+
+ '@babel/helper-string-parser@7.23.4': {}
+
+ '@babel/helper-string-parser@7.24.1': {}
+
+ '@babel/helper-validator-identifier@7.22.20': {}
+
+ '@babel/helper-validator-identifier@7.22.5': {}
+
+ '@babel/helper-validator-option@7.23.5': {}
+
+ '@babel/helpers@7.23.8':
+ dependencies:
+ '@babel/template': 7.22.15
+ '@babel/traverse': 7.23.7
+ '@babel/types': 7.23.6
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helpers@7.24.1':
+ dependencies:
+ '@babel/template': 7.24.0
+ '@babel/traverse': 7.24.1
+ '@babel/types': 7.24.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/highlight@7.23.4':
+ dependencies:
+ '@babel/helper-validator-identifier': 7.22.20
+ chalk: 2.4.2
+ js-tokens: 4.0.0
+
+ '@babel/highlight@7.24.2':
+ dependencies:
+ '@babel/helper-validator-identifier': 7.22.20
+ chalk: 2.4.2
+ js-tokens: 4.0.0
+ picocolors: 1.0.0
+
+ '@babel/parser@7.23.6':
+ dependencies:
+ '@babel/types': 7.23.6
+
+ '@babel/parser@7.24.1':
+ dependencies:
+ '@babel/types': 7.24.0
+
+ '@babel/plugin-syntax-typescript@7.24.1(@babel/core@7.24.3)':
+ dependencies:
+ '@babel/core': 7.24.3
+ '@babel/helper-plugin-utils': 7.24.0
+
+ '@babel/plugin-transform-react-jsx-self@7.23.3(@babel/core@7.23.7)':
+ dependencies:
+ '@babel/core': 7.23.7
+ '@babel/helper-plugin-utils': 7.22.5
+
+ '@babel/plugin-transform-react-jsx-source@7.23.3(@babel/core@7.23.7)':
+ dependencies:
+ '@babel/core': 7.23.7
+ '@babel/helper-plugin-utils': 7.22.5
+
+ '@babel/runtime@7.24.1':
+ dependencies:
+ regenerator-runtime: 0.14.1
+
+ '@babel/template@7.22.15':
+ dependencies:
+ '@babel/code-frame': 7.23.5
+ '@babel/parser': 7.23.6
+ '@babel/types': 7.23.6
+
+ '@babel/template@7.24.0':
+ dependencies:
+ '@babel/code-frame': 7.24.2
+ '@babel/parser': 7.24.1
+ '@babel/types': 7.24.0
+
+ '@babel/traverse@7.23.7':
+ dependencies:
+ '@babel/code-frame': 7.23.5
+ '@babel/generator': 7.23.6
+ '@babel/helper-environment-visitor': 7.22.20
+ '@babel/helper-function-name': 7.23.0
+ '@babel/helper-hoist-variables': 7.22.5
+ '@babel/helper-split-export-declaration': 7.22.6
+ '@babel/parser': 7.23.6
+ '@babel/types': 7.23.6
+ debug: 4.3.4
+ globals: 11.12.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/traverse@7.24.1':
+ dependencies:
+ '@babel/code-frame': 7.24.2
+ '@babel/generator': 7.24.1
+ '@babel/helper-environment-visitor': 7.22.20
+ '@babel/helper-function-name': 7.23.0
+ '@babel/helper-hoist-variables': 7.22.5
+ '@babel/helper-split-export-declaration': 7.22.6
+ '@babel/parser': 7.24.1
+ '@babel/types': 7.24.0
+ debug: 4.3.4
+ globals: 11.12.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/types@7.22.5':
+ dependencies:
+ '@babel/helper-string-parser': 7.22.5
+ '@babel/helper-validator-identifier': 7.22.5
+ to-fast-properties: 2.0.0
+
+ '@babel/types@7.23.6':
+ dependencies:
+ '@babel/helper-string-parser': 7.23.4
+ '@babel/helper-validator-identifier': 7.22.20
+ to-fast-properties: 2.0.0
+
+ '@babel/types@7.24.0':
+ dependencies:
+ '@babel/helper-string-parser': 7.24.1
+ '@babel/helper-validator-identifier': 7.22.20
+ to-fast-properties: 2.0.0
+
+ '@databeat/tracker@0.9.3':
+ dependencies:
+ '@noble/hashes': 1.6.1
+
+ '@emotion/hash@0.9.1': {}
+
+ '@emotion/is-prop-valid@0.8.8':
+ dependencies:
+ '@emotion/memoize': 0.7.4
+ optional: true
+
+ '@emotion/memoize@0.7.4':
+ optional: true
+
+ '@esbuild/aix-ppc64@0.19.12':
+ optional: true
+
+ '@esbuild/aix-ppc64@0.20.2':
+ optional: true
+
+ '@esbuild/android-arm64@0.19.12':
+ optional: true
+
+ '@esbuild/android-arm64@0.20.2':
+ optional: true
+
+ '@esbuild/android-arm@0.19.12':
+ optional: true
+
+ '@esbuild/android-arm@0.20.2':
+ optional: true
+
+ '@esbuild/android-x64@0.19.12':
+ optional: true
+
+ '@esbuild/android-x64@0.20.2':
+ optional: true
+
+ '@esbuild/darwin-arm64@0.19.12':
+ optional: true
+
+ '@esbuild/darwin-arm64@0.20.2':
+ optional: true
+
+ '@esbuild/darwin-x64@0.19.12':
+ optional: true
+
+ '@esbuild/darwin-x64@0.20.2':
+ optional: true
+
+ '@esbuild/freebsd-arm64@0.19.12':
+ optional: true
+
+ '@esbuild/freebsd-arm64@0.20.2':
+ optional: true
+
+ '@esbuild/freebsd-x64@0.19.12':
+ optional: true
+
+ '@esbuild/freebsd-x64@0.20.2':
+ optional: true
+
+ '@esbuild/linux-arm64@0.19.12':
+ optional: true
+
+ '@esbuild/linux-arm64@0.20.2':
+ optional: true
+
+ '@esbuild/linux-arm@0.19.12':
+ optional: true
+
+ '@esbuild/linux-arm@0.20.2':
+ optional: true
+
+ '@esbuild/linux-ia32@0.19.12':
+ optional: true
+
+ '@esbuild/linux-ia32@0.20.2':
+ optional: true
+
+ '@esbuild/linux-loong64@0.19.12':
+ optional: true
+
+ '@esbuild/linux-loong64@0.20.2':
+ optional: true
+
+ '@esbuild/linux-mips64el@0.19.12':
+ optional: true
+
+ '@esbuild/linux-mips64el@0.20.2':
+ optional: true
+
+ '@esbuild/linux-ppc64@0.19.12':
+ optional: true
+
+ '@esbuild/linux-ppc64@0.20.2':
+ optional: true
+
+ '@esbuild/linux-riscv64@0.19.12':
+ optional: true
+
+ '@esbuild/linux-riscv64@0.20.2':
+ optional: true
+
+ '@esbuild/linux-s390x@0.19.12':
+ optional: true
+
+ '@esbuild/linux-s390x@0.20.2':
+ optional: true
+
+ '@esbuild/linux-x64@0.19.12':
+ optional: true
+
+ '@esbuild/linux-x64@0.20.2':
+ optional: true
+
+ '@esbuild/netbsd-x64@0.19.12':
+ optional: true
+
+ '@esbuild/netbsd-x64@0.20.2':
+ optional: true
+
+ '@esbuild/openbsd-x64@0.19.12':
+ optional: true
+
+ '@esbuild/openbsd-x64@0.20.2':
+ optional: true
+
+ '@esbuild/sunos-x64@0.19.12':
+ optional: true
+
+ '@esbuild/sunos-x64@0.20.2':
+ optional: true
+
+ '@esbuild/win32-arm64@0.19.12':
+ optional: true
+
+ '@esbuild/win32-arm64@0.20.2':
+ optional: true
+
+ '@esbuild/win32-ia32@0.19.12':
+ optional: true
+
+ '@esbuild/win32-ia32@0.20.2':
+ optional: true
+
+ '@esbuild/win32-x64@0.19.12':
+ optional: true
+
+ '@esbuild/win32-x64@0.20.2':
+ optional: true
+
+ '@floating-ui/core@1.6.0':
+ dependencies:
+ '@floating-ui/utils': 0.2.1
+
+ '@floating-ui/dom@1.6.3':
+ dependencies:
+ '@floating-ui/core': 1.6.0
+ '@floating-ui/utils': 0.2.1
+
+ '@floating-ui/react-dom@2.0.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@floating-ui/dom': 1.6.3
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ '@floating-ui/utils@0.2.1': {}
+
+ '@jridgewell/gen-mapping@0.3.3':
+ dependencies:
+ '@jridgewell/set-array': 1.1.2
+ '@jridgewell/sourcemap-codec': 1.4.15
+ '@jridgewell/trace-mapping': 0.3.18
+
+ '@jridgewell/gen-mapping@0.3.5':
+ dependencies:
+ '@jridgewell/set-array': 1.2.1
+ '@jridgewell/sourcemap-codec': 1.4.15
+ '@jridgewell/trace-mapping': 0.3.25
+
+ '@jridgewell/resolve-uri@3.1.0': {}
+
+ '@jridgewell/resolve-uri@3.1.1': {}
+
+ '@jridgewell/resolve-uri@3.1.2': {}
+
+ '@jridgewell/set-array@1.1.2': {}
+
+ '@jridgewell/set-array@1.2.1': {}
+
+ '@jridgewell/sourcemap-codec@1.4.14': {}
+
+ '@jridgewell/sourcemap-codec@1.4.15': {}
+
+ '@jridgewell/trace-mapping@0.3.18':
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.0
+ '@jridgewell/sourcemap-codec': 1.4.14
+
+ '@jridgewell/trace-mapping@0.3.21':
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.1
+ '@jridgewell/sourcemap-codec': 1.4.15
+
+ '@jridgewell/trace-mapping@0.3.25':
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.4.15
+
+ '@motionone/animation@10.15.1':
+ dependencies:
+ '@motionone/easing': 10.15.1
+ '@motionone/types': 10.15.1
+ '@motionone/utils': 10.15.1
+ tslib: 2.6.2
+
+ '@motionone/dom@10.16.2':
+ dependencies:
+ '@motionone/animation': 10.15.1
+ '@motionone/generators': 10.15.1
+ '@motionone/types': 10.15.1
+ '@motionone/utils': 10.15.1
+ hey-listen: 1.0.8
+ tslib: 2.6.2
+
+ '@motionone/easing@10.15.1':
+ dependencies:
+ '@motionone/utils': 10.15.1
+ tslib: 2.6.2
+
+ '@motionone/generators@10.15.1':
+ dependencies:
+ '@motionone/types': 10.15.1
+ '@motionone/utils': 10.15.1
+ tslib: 2.6.2
+
+ '@motionone/types@10.15.1': {}
+
+ '@motionone/utils@10.15.1':
+ dependencies:
+ '@motionone/types': 10.15.1
+ hey-listen: 1.0.8
+ tslib: 2.6.2
+
+ '@noble/curves@1.2.0':
+ dependencies:
+ '@noble/hashes': 1.3.2
+
+ '@noble/hashes@1.3.2': {}
+
+ '@noble/hashes@1.6.1': {}
+
+ '@radix-ui/number@1.1.0': {}
+
+ '@radix-ui/primitive@1.1.0': {}
+
+ '@radix-ui/react-arrow@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.7
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-aspect-ratio@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.7
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-checkbox@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.7
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-collapsible@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-id': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.7
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-collection@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-slot': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.7
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-compose-refs@1.1.0(@types/react@18.3.7)(react@18.3.1)':
+ dependencies:
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.7
+
+ '@radix-ui/react-context@1.1.0(@types/react@18.3.7)(react@18.3.1)':
+ dependencies:
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.7
+
+ '@radix-ui/react-dialog@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-id': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-slot': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ aria-hidden: 1.2.4
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ react-remove-scroll: 2.5.7(@types/react@18.3.7)(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.7
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-direction@1.1.0(@types/react@18.3.7)(react@18.3.1)':
+ dependencies:
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.7
+
+ '@radix-ui/react-dismissable-layer@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.7
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-dropdown-menu@2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-id': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-menu': 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.7
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-focus-guards@1.1.0(@types/react@18.3.7)(react@18.3.1)':
+ dependencies:
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.7
+
+ '@radix-ui/react-focus-scope@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.7
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-id@1.1.0(@types/react@18.3.7)(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.7
+
+ '@radix-ui/react-menu@2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-direction': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-id': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-slot': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ aria-hidden: 1.2.4
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ react-remove-scroll: 2.5.7(@types/react@18.3.7)(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.7
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-popper@1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@floating-ui/react-dom': 2.0.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-arrow': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-use-rect': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/rect': 1.1.0
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.7
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-portal@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.7
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-presence@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.7
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-primitive@2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-slot': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.7
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-progress@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.7
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-radio-group@1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-direction': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.7
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-roving-focus@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-direction': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-id': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.7
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-select@2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/number': 1.1.0
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-direction': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-id': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-slot': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ aria-hidden: 1.2.4
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ react-remove-scroll: 2.5.7(@types/react@18.3.7)(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.7
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-slot@1.1.0(@types/react@18.3.7)(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.7
+
+ '@radix-ui/react-switch@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.7
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-tabs@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-direction': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-id': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.7
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-toast@1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.7
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-tooltip@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-id': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-slot': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.7
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.3.7)(react@18.3.1)':
+ dependencies:
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.7
+
+ '@radix-ui/react-use-controllable-state@1.1.0(@types/react@18.3.7)(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.7
+
+ '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.3.7)(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.7
+
+ '@radix-ui/react-use-layout-effect@1.1.0(@types/react@18.3.7)(react@18.3.1)':
+ dependencies:
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.7
+
+ '@radix-ui/react-use-previous@1.1.0(@types/react@18.3.7)(react@18.3.1)':
+ dependencies:
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.7
+
+ '@radix-ui/react-use-rect@1.1.0(@types/react@18.3.7)(react@18.3.1)':
+ dependencies:
+ '@radix-ui/rect': 1.1.0
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.7
+
+ '@radix-ui/react-use-size@1.1.0(@types/react@18.3.7)(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.7
+
+ '@radix-ui/react-visually-hidden@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.7
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/rect@1.1.0': {}
+
+ '@rollup/pluginutils@5.1.0(rollup@4.21.3)':
+ dependencies:
+ '@types/estree': 1.0.5
+ estree-walker: 2.0.2
+ picomatch: 2.3.1
+ optionalDependencies:
+ rollup: 4.21.3
+
+ '@rollup/rollup-android-arm-eabi@4.13.1':
+ optional: true
+
+ '@rollup/rollup-android-arm-eabi@4.21.3':
+ optional: true
+
+ '@rollup/rollup-android-arm64@4.13.1':
+ optional: true
+
+ '@rollup/rollup-android-arm64@4.21.3':
+ optional: true
+
+ '@rollup/rollup-darwin-arm64@4.13.1':
+ optional: true
+
+ '@rollup/rollup-darwin-arm64@4.21.3':
+ optional: true
+
+ '@rollup/rollup-darwin-x64@4.13.1':
+ optional: true
+
+ '@rollup/rollup-darwin-x64@4.21.3':
+ optional: true
+
+ '@rollup/rollup-linux-arm-gnueabihf@4.13.1':
+ optional: true
+
+ '@rollup/rollup-linux-arm-gnueabihf@4.21.3':
+ optional: true
+
+ '@rollup/rollup-linux-arm-musleabihf@4.21.3':
+ optional: true
+
+ '@rollup/rollup-linux-arm64-gnu@4.13.1':
+ optional: true
+
+ '@rollup/rollup-linux-arm64-gnu@4.21.3':
+ optional: true
+
+ '@rollup/rollup-linux-arm64-musl@4.13.1':
+ optional: true
+
+ '@rollup/rollup-linux-arm64-musl@4.21.3':
+ optional: true
+
+ '@rollup/rollup-linux-powerpc64le-gnu@4.21.3':
+ optional: true
+
+ '@rollup/rollup-linux-riscv64-gnu@4.13.1':
+ optional: true
+
+ '@rollup/rollup-linux-riscv64-gnu@4.21.3':
+ optional: true
+
+ '@rollup/rollup-linux-s390x-gnu@4.13.1':
+ optional: true
+
+ '@rollup/rollup-linux-s390x-gnu@4.21.3':
+ optional: true
+
+ '@rollup/rollup-linux-x64-gnu@4.13.1':
+ optional: true
+
+ '@rollup/rollup-linux-x64-gnu@4.21.3':
+ optional: true
+
+ '@rollup/rollup-linux-x64-musl@4.13.1':
+ optional: true
+
+ '@rollup/rollup-linux-x64-musl@4.21.3':
+ optional: true
+
+ '@rollup/rollup-win32-arm64-msvc@4.13.1':
+ optional: true
+
+ '@rollup/rollup-win32-arm64-msvc@4.21.3':
+ optional: true
+
+ '@rollup/rollup-win32-ia32-msvc@4.13.1':
+ optional: true
+
+ '@rollup/rollup-win32-ia32-msvc@4.21.3':
+ optional: true
+
+ '@rollup/rollup-win32-x64-msvc@4.13.1':
+ optional: true
+
+ '@rollup/rollup-win32-x64-msvc@4.21.3':
+ optional: true
+
+ '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.23.7)':
+ dependencies:
+ '@babel/core': 7.23.7
+
+ '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.23.7)':
+ dependencies:
+ '@babel/core': 7.23.7
+
+ '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.23.7)':
+ dependencies:
+ '@babel/core': 7.23.7
+
+ '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.23.7)':
+ dependencies:
+ '@babel/core': 7.23.7
+
+ '@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.23.7)':
+ dependencies:
+ '@babel/core': 7.23.7
+
+ '@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.23.7)':
+ dependencies:
+ '@babel/core': 7.23.7
+
+ '@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.23.7)':
+ dependencies:
+ '@babel/core': 7.23.7
+
+ '@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.23.7)':
+ dependencies:
+ '@babel/core': 7.23.7
+
+ '@svgr/babel-preset@8.1.0(@babel/core@7.23.7)':
+ dependencies:
+ '@babel/core': 7.23.7
+ '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.23.7)
+ '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.23.7)
+ '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.23.7)
+ '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.23.7)
+ '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.23.7)
+ '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.23.7)
+ '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.23.7)
+ '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.23.7)
+
+ '@svgr/core@8.1.0(typescript@4.5.5)':
+ dependencies:
+ '@babel/core': 7.23.7
+ '@svgr/babel-preset': 8.1.0(@babel/core@7.23.7)
+ camelcase: 6.3.0
+ cosmiconfig: 8.3.6(typescript@4.5.5)
+ snake-case: 3.0.4
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+
+ '@svgr/hast-util-to-babel-ast@8.0.0':
+ dependencies:
+ '@babel/types': 7.23.6
+ entities: 4.5.0
+
+ '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@4.5.5))':
+ dependencies:
+ '@babel/core': 7.23.7
+ '@svgr/babel-preset': 8.1.0(@babel/core@7.23.7)
+ '@svgr/core': 8.1.0(typescript@4.5.5)
+ '@svgr/hast-util-to-babel-ast': 8.0.0
+ svg-parser: 2.0.4
+ transitivePeerDependencies:
+ - supports-color
+
+ '@types/babel__core@7.20.5':
+ dependencies:
+ '@babel/parser': 7.23.6
+ '@babel/types': 7.23.6
+ '@types/babel__generator': 7.6.8
+ '@types/babel__template': 7.4.4
+ '@types/babel__traverse': 7.20.5
+
+ '@types/babel__generator@7.6.8':
+ dependencies:
+ '@babel/types': 7.23.6
+
+ '@types/babel__template@7.4.4':
+ dependencies:
+ '@babel/parser': 7.23.6
+ '@babel/types': 7.23.6
+
+ '@types/babel__traverse@7.20.5':
+ dependencies:
+ '@babel/types': 7.23.6
+
+ '@types/estree@1.0.5': {}
+
+ '@types/node@20.11.30':
+ dependencies:
+ undici-types: 5.26.5
+
+ '@types/node@22.7.5':
+ dependencies:
+ undici-types: 6.19.8
+
+ '@types/prop-types@15.7.13': {}
+
+ '@types/react-dom@18.3.0':
+ dependencies:
+ '@types/react': 18.3.7
+
+ '@types/react@18.3.7':
+ dependencies:
+ '@types/prop-types': 15.7.13
+ csstype: 3.1.3
+
+ '@vanilla-extract/babel-plugin-debug-ids@1.0.5':
+ dependencies:
+ '@babel/core': 7.24.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@vanilla-extract/css@1.14.1':
+ dependencies:
+ '@emotion/hash': 0.9.1
+ '@vanilla-extract/private': 1.0.3
+ chalk: 4.1.2
+ css-what: 6.1.0
+ cssesc: 3.0.0
+ csstype: 3.1.3
+ deep-object-diff: 1.1.9
+ deepmerge: 4.3.1
+ media-query-parser: 2.0.2
+ modern-ahocorasick: 1.0.1
+ outdent: 0.8.0
+
+ '@vanilla-extract/integration@7.1.1(@types/node@20.11.30)':
+ dependencies:
+ '@babel/core': 7.24.3
+ '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.3)
+ '@vanilla-extract/babel-plugin-debug-ids': 1.0.5
+ '@vanilla-extract/css': 1.14.1
+ esbuild: 0.19.12
+ eval: 0.1.8
+ find-up: 5.0.0
+ javascript-stringify: 2.1.0
+ lodash: 4.17.21
+ mlly: 1.6.1
+ outdent: 0.8.0
+ vite: 5.2.6(@types/node@20.11.30)
+ vite-node: 1.4.0(@types/node@20.11.30)
+ transitivePeerDependencies:
+ - '@types/node'
+ - less
+ - lightningcss
+ - sass
+ - stylus
+ - sugarss
+ - supports-color
+ - terser
+
+ '@vanilla-extract/private@1.0.3': {}
+
+ '@vanilla-extract/vite-plugin@4.0.6(@types/node@20.11.30)(vite@5.2.6(@types/node@20.11.30))':
+ dependencies:
+ '@vanilla-extract/integration': 7.1.1(@types/node@20.11.30)
+ vite: 5.2.6(@types/node@20.11.30)
+ transitivePeerDependencies:
+ - '@types/node'
+ - less
+ - lightningcss
+ - sass
+ - stylus
+ - sugarss
+ - supports-color
+ - terser
+
+ '@vitejs/plugin-react@4.2.1(vite@5.2.6(@types/node@20.11.30))':
+ dependencies:
+ '@babel/core': 7.23.7
+ '@babel/plugin-transform-react-jsx-self': 7.23.3(@babel/core@7.23.7)
+ '@babel/plugin-transform-react-jsx-source': 7.23.3(@babel/core@7.23.7)
+ '@types/babel__core': 7.20.5
+ react-refresh: 0.14.0
+ vite: 5.2.6(@types/node@20.11.30)
+ transitivePeerDependencies:
+ - supports-color
+
+ acorn@8.11.3: {}
+
+ aes-js@4.0.0-beta.5: {}
+
+ ansi-styles@3.2.1:
+ dependencies:
+ color-convert: 1.9.3
+
+ ansi-styles@4.3.0:
+ dependencies:
+ color-convert: 2.0.1
+
+ argparse@2.0.1: {}
+
+ aria-hidden@1.2.4:
+ dependencies:
+ tslib: 2.6.2
+
+ browserslist@4.22.2:
+ dependencies:
+ caniuse-lite: 1.0.30001579
+ electron-to-chromium: 1.4.638
+ node-releases: 2.0.14
+ update-browserslist-db: 1.0.13(browserslist@4.22.2)
+
+ cac@6.7.14: {}
+
+ callsites@3.1.0: {}
+
+ camelcase@6.3.0: {}
+
+ caniuse-lite@1.0.30001579: {}
+
+ chalk@2.4.2:
+ dependencies:
+ ansi-styles: 3.2.1
+ escape-string-regexp: 1.0.5
+ supports-color: 5.5.0
+
+ chalk@4.1.2:
+ dependencies:
+ ansi-styles: 4.3.0
+ supports-color: 7.2.0
+
+ color-convert@1.9.3:
+ dependencies:
+ color-name: 1.1.3
+
+ color-convert@2.0.1:
+ dependencies:
+ color-name: 1.1.4
+
+ color-name@1.1.3: {}
+
+ color-name@1.1.4: {}
+
+ convert-source-map@2.0.0: {}
+
+ cosmiconfig@8.3.6(typescript@4.5.5):
+ dependencies:
+ import-fresh: 3.3.0
+ js-yaml: 4.1.0
+ parse-json: 5.2.0
+ path-type: 4.0.0
+ optionalDependencies:
+ typescript: 4.5.5
+
+ css-what@6.1.0: {}
+
+ cssesc@3.0.0: {}
+
+ csstype@3.1.3: {}
+
+ debug@4.3.4:
+ dependencies:
+ ms: 2.1.2
+
+ deep-object-diff@1.1.9: {}
+
+ deepmerge@4.3.1: {}
+
+ detect-node-es@1.1.0: {}
+
+ dot-case@3.0.4:
+ dependencies:
+ no-case: 3.0.4
+ tslib: 2.6.2
+
+ electron-to-chromium@1.4.638: {}
+
+ entities@4.5.0: {}
+
+ error-ex@1.3.2:
+ dependencies:
+ is-arrayish: 0.2.1
+
+ esbuild@0.19.12:
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.19.12
+ '@esbuild/android-arm': 0.19.12
+ '@esbuild/android-arm64': 0.19.12
+ '@esbuild/android-x64': 0.19.12
+ '@esbuild/darwin-arm64': 0.19.12
+ '@esbuild/darwin-x64': 0.19.12
+ '@esbuild/freebsd-arm64': 0.19.12
+ '@esbuild/freebsd-x64': 0.19.12
+ '@esbuild/linux-arm': 0.19.12
+ '@esbuild/linux-arm64': 0.19.12
+ '@esbuild/linux-ia32': 0.19.12
+ '@esbuild/linux-loong64': 0.19.12
+ '@esbuild/linux-mips64el': 0.19.12
+ '@esbuild/linux-ppc64': 0.19.12
+ '@esbuild/linux-riscv64': 0.19.12
+ '@esbuild/linux-s390x': 0.19.12
+ '@esbuild/linux-x64': 0.19.12
+ '@esbuild/netbsd-x64': 0.19.12
+ '@esbuild/openbsd-x64': 0.19.12
+ '@esbuild/sunos-x64': 0.19.12
+ '@esbuild/win32-arm64': 0.19.12
+ '@esbuild/win32-ia32': 0.19.12
+ '@esbuild/win32-x64': 0.19.12
+
+ esbuild@0.20.2:
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.20.2
+ '@esbuild/android-arm': 0.20.2
+ '@esbuild/android-arm64': 0.20.2
+ '@esbuild/android-x64': 0.20.2
+ '@esbuild/darwin-arm64': 0.20.2
+ '@esbuild/darwin-x64': 0.20.2
+ '@esbuild/freebsd-arm64': 0.20.2
+ '@esbuild/freebsd-x64': 0.20.2
+ '@esbuild/linux-arm': 0.20.2
+ '@esbuild/linux-arm64': 0.20.2
+ '@esbuild/linux-ia32': 0.20.2
+ '@esbuild/linux-loong64': 0.20.2
+ '@esbuild/linux-mips64el': 0.20.2
+ '@esbuild/linux-ppc64': 0.20.2
+ '@esbuild/linux-riscv64': 0.20.2
+ '@esbuild/linux-s390x': 0.20.2
+ '@esbuild/linux-x64': 0.20.2
+ '@esbuild/netbsd-x64': 0.20.2
+ '@esbuild/openbsd-x64': 0.20.2
+ '@esbuild/sunos-x64': 0.20.2
+ '@esbuild/win32-arm64': 0.20.2
+ '@esbuild/win32-ia32': 0.20.2
+ '@esbuild/win32-x64': 0.20.2
+
+ escalade@3.1.1: {}
+
+ escape-string-regexp@1.0.5: {}
+
+ estree-walker@2.0.2: {}
+
+ ethers@6.13.4:
+ dependencies:
+ '@adraffy/ens-normalize': 1.10.1
+ '@noble/curves': 1.2.0
+ '@noble/hashes': 1.3.2
+ '@types/node': 22.7.5
+ aes-js: 4.0.0-beta.5
+ tslib: 2.7.0
+ ws: 8.17.1
+ transitivePeerDependencies:
+ - bufferutil
+ - utf-8-validate
+
+ eval@0.1.8:
+ dependencies:
+ '@types/node': 20.11.30
+ require-like: 0.1.2
+
+ eventemitter2@6.4.9: {}
+
+ find-up@5.0.0:
+ dependencies:
+ locate-path: 6.0.0
+ path-exists: 4.0.0
+
+ framer-motion@9.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@motionone/dom': 10.16.2
+ hey-listen: 1.0.8
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ tslib: 2.6.1
+ optionalDependencies:
+ '@emotion/is-prop-valid': 0.8.8
+
+ fsevents@2.3.3:
+ optional: true
+
+ gensync@1.0.0-beta.2: {}
+
+ get-nonce@1.0.1: {}
+
+ globals@11.12.0: {}
+
+ globrex@0.1.2: {}
+
+ has-flag@3.0.0: {}
+
+ has-flag@4.0.0: {}
+
+ hey-listen@1.0.8: {}
+
+ idb@7.1.1: {}
+
+ import-fresh@3.3.0:
+ dependencies:
+ parent-module: 1.0.1
+ resolve-from: 4.0.0
+
+ invariant@2.2.4:
+ dependencies:
+ loose-envify: 1.4.0
+
+ is-arrayish@0.2.1: {}
+
+ javascript-stringify@2.1.0: {}
+
+ js-base64@3.7.7: {}
+
+ js-tokens@4.0.0: {}
+
+ js-yaml@4.1.0:
+ dependencies:
+ argparse: 2.0.1
+
+ jsesc@2.5.2: {}
+
+ json-parse-even-better-errors@2.3.1: {}
+
+ json5@2.2.3: {}
+
+ jsonc-parser@3.2.1: {}
+
+ lines-and-columns@1.2.4: {}
+
+ locate-path@6.0.0:
+ dependencies:
+ p-locate: 5.0.0
+
+ lodash@4.17.21: {}
+
+ loose-envify@1.4.0:
+ dependencies:
+ js-tokens: 4.0.0
+
+ lower-case@2.0.2:
+ dependencies:
+ tslib: 2.6.2
+
+ lru-cache@5.1.1:
+ dependencies:
+ yallist: 3.1.1
+
+ media-query-parser@2.0.2:
+ dependencies:
+ '@babel/runtime': 7.24.1
+
+ mlly@1.6.1:
+ dependencies:
+ acorn: 8.11.3
+ pathe: 1.1.2
+ pkg-types: 1.0.3
+ ufo: 1.5.3
+
+ modern-ahocorasick@1.0.1: {}
+
+ ms@2.1.2: {}
+
+ nanoid@3.3.7: {}
+
+ no-case@3.0.4:
+ dependencies:
+ lower-case: 2.0.2
+ tslib: 2.6.2
+
+ node-releases@2.0.14: {}
+
+ outdent@0.8.0: {}
+
+ p-limit@3.1.0:
+ dependencies:
+ yocto-queue: 0.1.0
+
+ p-locate@5.0.0:
+ dependencies:
+ p-limit: 3.1.0
+
+ parent-module@1.0.1:
+ dependencies:
+ callsites: 3.1.0
+
+ parse-json@5.2.0:
+ dependencies:
+ '@babel/code-frame': 7.23.5
+ error-ex: 1.3.2
+ json-parse-even-better-errors: 2.3.1
+ lines-and-columns: 1.2.4
+
+ path-exists@4.0.0: {}
+
+ path-type@4.0.0: {}
+
+ pathe@1.1.2: {}
+
+ picocolors@1.0.0: {}
+
+ picomatch@2.3.1: {}
+
+ pkg-types@1.0.3:
+ dependencies:
+ jsonc-parser: 3.2.1
+ mlly: 1.6.1
+ pathe: 1.1.2
+
+ postcss@8.4.38:
+ dependencies:
+ nanoid: 3.3.7
+ picocolors: 1.0.0
+ source-map-js: 1.2.0
+
+ react-dom@18.3.1(react@18.3.1):
+ dependencies:
+ loose-envify: 1.4.0
+ react: 18.3.1
+ scheduler: 0.23.2
+
+ react-hook-form@7.53.0(react@18.3.1):
+ dependencies:
+ react: 18.3.1
+
+ react-refresh@0.14.0: {}
+
+ react-remove-scroll-bar@2.3.6(@types/react@18.3.7)(react@18.3.1):
+ dependencies:
+ react: 18.3.1
+ react-style-singleton: 2.2.1(@types/react@18.3.7)(react@18.3.1)
+ tslib: 2.6.2
+ optionalDependencies:
+ '@types/react': 18.3.7
+
+ react-remove-scroll@2.5.7(@types/react@18.3.7)(react@18.3.1):
+ dependencies:
+ react: 18.3.1
+ react-remove-scroll-bar: 2.3.6(@types/react@18.3.7)(react@18.3.1)
+ react-style-singleton: 2.2.1(@types/react@18.3.7)(react@18.3.1)
+ tslib: 2.6.2
+ use-callback-ref: 1.3.2(@types/react@18.3.7)(react@18.3.1)
+ use-sidecar: 1.1.2(@types/react@18.3.7)(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.7
+
+ react-style-singleton@2.2.1(@types/react@18.3.7)(react@18.3.1):
+ dependencies:
+ get-nonce: 1.0.1
+ invariant: 2.2.4
+ react: 18.3.1
+ tslib: 2.6.2
+ optionalDependencies:
+ '@types/react': 18.3.7
+
+ react@18.3.1:
+ dependencies:
+ loose-envify: 1.4.0
+
+ regenerator-runtime@0.14.1: {}
+
+ require-like@0.1.2: {}
+
+ resolve-from@4.0.0: {}
+
+ rollup@4.13.1:
+ dependencies:
+ '@types/estree': 1.0.5
+ optionalDependencies:
+ '@rollup/rollup-android-arm-eabi': 4.13.1
+ '@rollup/rollup-android-arm64': 4.13.1
+ '@rollup/rollup-darwin-arm64': 4.13.1
+ '@rollup/rollup-darwin-x64': 4.13.1
+ '@rollup/rollup-linux-arm-gnueabihf': 4.13.1
+ '@rollup/rollup-linux-arm64-gnu': 4.13.1
+ '@rollup/rollup-linux-arm64-musl': 4.13.1
+ '@rollup/rollup-linux-riscv64-gnu': 4.13.1
+ '@rollup/rollup-linux-s390x-gnu': 4.13.1
+ '@rollup/rollup-linux-x64-gnu': 4.13.1
+ '@rollup/rollup-linux-x64-musl': 4.13.1
+ '@rollup/rollup-win32-arm64-msvc': 4.13.1
+ '@rollup/rollup-win32-ia32-msvc': 4.13.1
+ '@rollup/rollup-win32-x64-msvc': 4.13.1
+ fsevents: 2.3.3
+
+ rollup@4.21.3:
+ dependencies:
+ '@types/estree': 1.0.5
+ optionalDependencies:
+ '@rollup/rollup-android-arm-eabi': 4.21.3
+ '@rollup/rollup-android-arm64': 4.21.3
+ '@rollup/rollup-darwin-arm64': 4.21.3
+ '@rollup/rollup-darwin-x64': 4.21.3
+ '@rollup/rollup-linux-arm-gnueabihf': 4.21.3
+ '@rollup/rollup-linux-arm-musleabihf': 4.21.3
+ '@rollup/rollup-linux-arm64-gnu': 4.21.3
+ '@rollup/rollup-linux-arm64-musl': 4.21.3
+ '@rollup/rollup-linux-powerpc64le-gnu': 4.21.3
+ '@rollup/rollup-linux-riscv64-gnu': 4.21.3
+ '@rollup/rollup-linux-s390x-gnu': 4.21.3
+ '@rollup/rollup-linux-x64-gnu': 4.21.3
+ '@rollup/rollup-linux-x64-musl': 4.21.3
+ '@rollup/rollup-win32-arm64-msvc': 4.21.3
+ '@rollup/rollup-win32-ia32-msvc': 4.21.3
+ '@rollup/rollup-win32-x64-msvc': 4.21.3
+ fsevents: 2.3.3
+ optional: true
+
+ scheduler@0.23.2:
+ dependencies:
+ loose-envify: 1.4.0
+
+ semver@6.3.1: {}
+
+ snake-case@3.0.4:
+ dependencies:
+ dot-case: 3.0.4
+ tslib: 2.6.2
+
+ source-map-js@1.2.0: {}
+
+ supports-color@5.5.0:
+ dependencies:
+ has-flag: 3.0.0
+
+ supports-color@7.2.0:
+ dependencies:
+ has-flag: 4.0.0
+
+ svg-parser@2.0.4: {}
+
+ to-fast-properties@2.0.0: {}
+
+ tsconfck@3.0.3(typescript@4.5.5):
+ optionalDependencies:
+ typescript: 4.5.5
+
+ tslib@2.6.1: {}
+
+ tslib@2.6.2: {}
+
+ tslib@2.7.0: {}
+
+ typescript@4.5.5: {}
+
+ ufo@1.5.3: {}
+
+ undici-types@5.26.5: {}
+
+ undici-types@6.19.8: {}
+
+ update-browserslist-db@1.0.13(browserslist@4.22.2):
+ dependencies:
+ browserslist: 4.22.2
+ escalade: 3.1.1
+ picocolors: 1.0.0
+
+ use-callback-ref@1.3.2(@types/react@18.3.7)(react@18.3.1):
+ dependencies:
+ react: 18.3.1
+ tslib: 2.6.2
+ optionalDependencies:
+ '@types/react': 18.3.7
+
+ use-sidecar@1.1.2(@types/react@18.3.7)(react@18.3.1):
+ dependencies:
+ detect-node-es: 1.1.0
+ react: 18.3.1
+ tslib: 2.6.2
+ optionalDependencies:
+ '@types/react': 18.3.7
+
+ vite-node@1.4.0(@types/node@20.11.30):
+ dependencies:
+ cac: 6.7.14
+ debug: 4.3.4
+ pathe: 1.1.2
+ picocolors: 1.0.0
+ vite: 5.2.6(@types/node@20.11.30)
+ transitivePeerDependencies:
+ - '@types/node'
+ - less
+ - lightningcss
+ - sass
+ - stylus
+ - sugarss
+ - supports-color
+ - terser
+
+ vite-plugin-svgr@4.2.0(rollup@4.21.3)(typescript@4.5.5)(vite@5.2.6(@types/node@20.11.30)):
+ dependencies:
+ '@rollup/pluginutils': 5.1.0(rollup@4.21.3)
+ '@svgr/core': 8.1.0(typescript@4.5.5)
+ '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@4.5.5))
+ vite: 5.2.6(@types/node@20.11.30)
+ transitivePeerDependencies:
+ - rollup
+ - supports-color
+ - typescript
+
+ vite-tsconfig-paths@4.3.2(typescript@4.5.5)(vite@5.2.6(@types/node@20.11.30)):
+ dependencies:
+ debug: 4.3.4
+ globrex: 0.1.2
+ tsconfck: 3.0.3(typescript@4.5.5)
+ optionalDependencies:
+ vite: 5.2.6(@types/node@20.11.30)
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+
+ vite@5.2.6(@types/node@20.11.30):
+ dependencies:
+ esbuild: 0.20.2
+ postcss: 8.4.38
+ rollup: 4.13.1
+ optionalDependencies:
+ '@types/node': 20.11.30
+ fsevents: 2.3.3
+
+ webextension-polyfill@0.10.0: {}
+
+ ws@8.17.1: {}
+
+ yallist@3.1.1: {}
+
+ yocto-queue@0.1.0: {}
diff --git a/.codesandbox/public/favicon.ico b/.codesandbox/public/favicon.ico
new file mode 100644
index 0000000000..bf5da566d2
Binary files /dev/null and b/.codesandbox/public/favicon.ico differ
diff --git a/.codesandbox/public/logo192.png b/.codesandbox/public/logo192.png
new file mode 100644
index 0000000000..f90c48a287
Binary files /dev/null and b/.codesandbox/public/logo192.png differ
diff --git a/.codesandbox/public/logo512.png b/.codesandbox/public/logo512.png
new file mode 100644
index 0000000000..36aff8456a
Binary files /dev/null and b/.codesandbox/public/logo512.png differ
diff --git a/.codesandbox/public/manifest.json b/.codesandbox/public/manifest.json
new file mode 100644
index 0000000000..9db53285e9
--- /dev/null
+++ b/.codesandbox/public/manifest.json
@@ -0,0 +1,25 @@
+{
+ "short_name": "Sequence Demo Dapp",
+ "name": "Ethereum Demo Dapp built on Sequence stack",
+ "icons": [
+ {
+ "src": "favicon.ico",
+ "sizes": "64x64 32x32 24x24 16x16",
+ "type": "image/x-icon"
+ },
+ {
+ "src": "logo192.png",
+ "type": "image/png",
+ "sizes": "192x192"
+ },
+ {
+ "src": "logo512.png",
+ "type": "image/png",
+ "sizes": "512x512"
+ }
+ ],
+ "start_url": ".",
+ "display": "standalone",
+ "theme_color": "#000000",
+ "background_color": "#ffffff"
+}
diff --git a/.codesandbox/public/robots.txt b/.codesandbox/public/robots.txt
new file mode 100644
index 0000000000..e9e57dc4d4
--- /dev/null
+++ b/.codesandbox/public/robots.txt
@@ -0,0 +1,3 @@
+# https://www.robotstxt.org/robotstxt.html
+User-agent: *
+Disallow:
diff --git a/.codesandbox/screenshots/screen-open.png b/.codesandbox/screenshots/screen-open.png
new file mode 100644
index 0000000000..17fa83ccc1
Binary files /dev/null and b/.codesandbox/screenshots/screen-open.png differ
diff --git a/.codesandbox/screenshots/screen-txn.png b/.codesandbox/screenshots/screen-txn.png
new file mode 100644
index 0000000000..3ed768960e
Binary files /dev/null and b/.codesandbox/screenshots/screen-txn.png differ
diff --git a/.codesandbox/src/App.tsx b/.codesandbox/src/App.tsx
new file mode 100644
index 0000000000..73eec67f40
--- /dev/null
+++ b/.codesandbox/src/App.tsx
@@ -0,0 +1,1348 @@
+import { AnimatePresence } from 'framer-motion'
+import React, { useState, useEffect, useMemo, SetStateAction } from 'react'
+import { ethers } from 'ethers'
+import { sequence } from '0xsequence'
+import { walletContracts } from '@0xsequence/abi'
+import {
+ Box,
+ Image,
+ Text,
+ Button,
+ ExternalLinkIcon,
+ Divider,
+ Card,
+ TransactionIcon,
+ Select,
+ TokenImage,
+ TextInput,
+ Modal
+} from '@0xsequence/design-system'
+import { ETHAuth } from '@0xsequence/ethane'
+import { configureLogger } from '@0xsequence/utils'
+import { ConnectOptions, OpenWalletIntent, Settings } from '@0xsequence/provider'
+import { ChainId, NetworkType } from '@0xsequence/network'
+
+import { ERC_20_ABI } from './constants/abi'
+import { Console } from './components/Console'
+import { Group } from './components/Group'
+import { getDefaultChainId, toHexString } from './helpers'
+import logoUrl from './images/logo.svg'
+import skyweaverBannerUrl from './images/sky weaver-banner.png'
+import skyweaverBannerLargeUrl from './images/sky weaver-banner-large.png'
+
+configureLogger({ logLevel: 'DEBUG' })
+
+interface Environment {
+ name: string
+ walletUrl: string
+ projectAccessKey: string
+}
+
+const environments: Environment[] = [
+ {
+ name: 'production',
+ walletUrl: 'https://sequence.app',
+ projectAccessKey: 'AQAAAAAAAAbvrgpWEC2Aefg5qYStQmwjBpA'
+ },
+ {
+ name: 'development',
+ walletUrl: 'https://dev.sequence.app',
+ //projectAccessKey: 'AQAAAAAAAAVBNfoB30kz7Ph4I_Qs5mkYuDc',
+ projectAccessKey: 'AQAAAAAAAAVCXiQ9f_57R44MjorZ4SmGdhA'
+ },
+ {
+ name: 'local',
+ walletUrl: 'http://localhost:3333',
+ projectAccessKey: 'AQAAAAAAAAVCXiQ9f_57R44MjorZ4SmGdhA'
+ },
+ {
+ name: 'custom',
+ walletUrl: '',
+ projectAccessKey: ''
+ }
+]
+
+const DEFAULT_API_URL = 'https://api.sequence.app'
+
+// Specify your desired default chain id. NOTE: you can communicate to multiple
+// chains at the same time without even having to switch the network, but a default
+// chain is required.
+const defaultChainId = getDefaultChainId() || ChainId.MAINNET
+// const defaultChainId = ChainId.POLYGON
+// const defaultChainId = ChainId.GURLI
+// const defaultChainId = ChainId.ARBITRUM
+// const defaultChainId = ChainId.AVALANCHE
+// etc.. see the full list here: https://docs.sequence.xyz/multi-chain-support
+
+// For Sequence core dev team -- app developers can ignore
+// a custom wallet app url can specified in the query string
+const urlParams = new URLSearchParams(window.location.search)
+
+const env = urlParams.get('env') ?? 'production'
+const envConfig = environments.find(x => x.name === env)
+const walletAppURL = urlParams.get('walletAppURL') ?? envConfig.walletUrl
+const projectAccessKey = urlParams.get('projectAccessKey') ?? envConfig.projectAccessKey
+const showProhibitedActions = urlParams.has('showProhibitedActions')
+
+const isCustom = walletAppURL !== envConfig.walletUrl || projectAccessKey !== envConfig.projectAccessKey
+
+if (walletAppURL && walletAppURL.length > 0) {
+ // Wallet can point to a custom wallet app url
+ // NOTICE: this is not needed, unless testing an alpha version of the wallet
+ sequence.initWallet(projectAccessKey, { defaultNetwork: defaultChainId, transports: { walletAppURL } })
+} else {
+ // Init the sequence wallet library at the top-level of your project with
+ // your designed default chain id
+ sequence.initWallet(projectAccessKey, { defaultNetwork: defaultChainId, transports: { walletAppURL } })
+}
+
+// App component
+const App = () => {
+ const [consoleMsg, setConsoleMsg] = useState(null)
+ const [email, setEmail] = useState(null)
+ const [consoleLoading, setConsoleLoading] = useState(false)
+ const [isWalletConnected, setIsWalletConnected] = useState(false)
+
+ const wallet = sequence.getWallet().getProvider()
+
+ const [showChainId, setShowChainId] = useState(wallet.getChainId())
+ const [isOpen, toggleModal] = useState(false)
+ const [warning, setWarning] = useState(false)
+
+ useMemo(() => {
+ wallet.on('chainChanged', (chainId: string) => {
+ setShowChainId(Number(BigInt(chainId)))
+ })
+ }, [])
+
+ useEffect(() => {
+ setIsWalletConnected(wallet.isConnected())
+ }, [wallet])
+
+ useEffect(() => {
+ consoleWelcomeMessage()
+ // eslint-disable-next-line
+ }, [isWalletConnected])
+
+ useEffect(() => {
+ // Wallet events
+ wallet.client.onOpen(() => {
+ console.log('wallet window opened')
+ })
+
+ wallet.client.onClose(() => {
+ console.log('wallet window closed')
+ })
+ }, [wallet])
+
+ const defaultConnectOptions: ConnectOptions = {
+ app: 'Demo Dapp',
+ askForEmail: true
+ // keepWalletOpened: true,
+ }
+
+ // Methods
+ const connect = async (connectOptions: ConnectOptions = { app: 'Demo dapp' }) => {
+ if (isWalletConnected) {
+ resetConsole()
+ appendConsoleLine('Wallet already connected!')
+ setConsoleLoading(false)
+ return
+ }
+
+ connectOptions = {
+ ...defaultConnectOptions,
+ ...connectOptions,
+ settings: {
+ ...defaultConnectOptions.settings,
+ ...connectOptions.settings
+ }
+ }
+
+ try {
+ resetConsole()
+ appendConsoleLine('Connecting')
+ const wallet = sequence.getWallet()
+
+ const connectDetails = await wallet.connect(connectOptions)
+
+ // Example of how to verify using ETHAuth via Sequence API
+ if (connectOptions.authorize && connectDetails.connected) {
+ let apiUrl = urlParams.get('apiUrl')
+
+ if (!apiUrl || apiUrl.length === 0) {
+ apiUrl = DEFAULT_API_URL
+ }
+
+ const api = new sequence.api.SequenceAPIClient(apiUrl)
+ // or just
+ // const api = new sequence.api.SequenceAPIClient('https://api.sequence.app')
+
+ const { isValid } = await api.isValidETHAuthProof({
+ chainId: connectDetails.chainId,
+ walletAddress: connectDetails.session.accountAddress,
+ ethAuthProofString: connectDetails.proof!.proofString
+ })
+
+ appendConsoleLine(`isValid (API)?: ${isValid}`)
+ }
+
+ // Example of how to verify using ETHAuth directl on the client
+ if (connectOptions.authorize) {
+ const ethAuth = new ETHAuth()
+
+ if (connectDetails.proof) {
+ const decodedProof = await ethAuth.decodeProof(connectDetails.proof.proofString, true)
+
+ const isValid = await wallet.utils.isValidTypedDataSignature(
+ wallet.getAddress(),
+ connectDetails.proof.typedData,
+ decodedProof.signature,
+ Number(BigInt(connectDetails.chainId))
+ )
+
+ appendConsoleLine(`connected using chainId: ${BigInt(connectDetails.chainId).toString()}`)
+ appendConsoleLine(`isValid (client)?: ${isValid}`)
+ }
+ }
+
+ setConsoleLoading(false)
+ if (connectDetails.connected) {
+ appendConsoleLine('Wallet connected!')
+ appendConsoleLine(`shared email: ${connectDetails.email}`)
+ setIsWalletConnected(true)
+ } else {
+ appendConsoleLine('Failed to connect wallet - ' + connectDetails.error)
+ }
+ } catch (e) {
+ console.error(e)
+ consoleErrorMessage()
+ }
+ }
+
+ const disconnect = () => {
+ const wallet = sequence.getWallet()
+ wallet.disconnect()
+ consoleWelcomeMessage()
+ setIsWalletConnected(false)
+ }
+
+ const openWallet = () => {
+ const wallet = sequence.getWallet()
+ wallet.openWallet()
+ }
+
+ const openWalletWithSettings = () => {
+ const wallet = sequence.getWallet()
+
+ const settings: Settings = {
+ theme: 'light',
+ includedPaymentProviders: ['moonpay', 'ramp'],
+ defaultFundingCurrency: 'eth',
+ defaultPurchaseAmount: 400,
+ lockFundingCurrencyToDefault: false
+ }
+
+ const intent: OpenWalletIntent = {
+ type: 'openWithOptions',
+ options: {
+ app: 'Demo Dapp',
+ settings
+ }
+ }
+
+ const path = 'wallet/add-funds'
+ wallet.openWallet(path, intent)
+ }
+
+ const closeWallet = () => {
+ const wallet = sequence.getWallet()
+ wallet.closeWallet()
+ }
+
+ const isConnected = async () => {
+ resetConsole()
+ const wallet = sequence.getWallet()
+ appendConsoleLine(`isConnected?: ${wallet.isConnected()}`)
+ setConsoleLoading(false)
+ }
+
+ const isOpened = async () => {
+ resetConsole()
+ const wallet = sequence.getWallet()
+ appendConsoleLine(`isOpened?: ${wallet.isOpened()}`)
+ setConsoleLoading(false)
+ }
+
+ const getChainID = async () => {
+ try {
+ resetConsole()
+
+ const topChainId = wallet.getChainId()
+ appendConsoleLine(`top chainId: ${topChainId}`)
+
+ const provider = wallet.getProvider()
+ const providerChainId = provider!.getChainId()
+ appendConsoleLine(`provider.getChainId(): ${providerChainId}`)
+
+ const signer = wallet.getSigner()
+ const signerChainId = await signer.getChainId()
+ appendConsoleLine(`signer.getChainId(): ${signerChainId}`)
+
+ setConsoleLoading(false)
+ } catch (e) {
+ console.error(e)
+ consoleErrorMessage()
+ }
+ }
+
+ const getAccounts = async () => {
+ try {
+ resetConsole()
+
+ const wallet = sequence.getWallet()
+ const address = wallet.getAddress()
+ appendConsoleLine(`getAddress(): ${address}`)
+
+ const provider = wallet.getProvider()
+ const accountList = provider.listAccounts()
+ appendConsoleLine(`accounts: ${JSON.stringify(accountList)}`)
+
+ setConsoleLoading(false)
+ } catch (e) {
+ console.error(e)
+ consoleErrorMessage()
+ }
+ }
+
+ const getBalance = async () => {
+ try {
+ resetConsole()
+
+ const wallet = sequence.getWallet()
+
+ const provider = wallet.getProvider()
+ const account = wallet.getAddress()
+ const balanceChk1 = await provider!.getBalance(account)
+ appendConsoleLine(`balance check 1: ${balanceChk1.toString()}`)
+
+ const signer = wallet.getSigner()
+ const balanceChk2 = await signer.getBalance()
+ appendConsoleLine(`balance check 2: ${balanceChk2.toString()}`)
+
+ setConsoleLoading(false)
+ } catch (e) {
+ console.error(e)
+ consoleErrorMessage()
+ }
+ }
+
+ const getNetworks = async () => {
+ try {
+ resetConsole()
+
+ const wallet = sequence.getWallet()
+ const networks = await wallet.getNetworks()
+
+ appendConsoleLine(`networks: ${JSON.stringify(networks, null, 2)}`)
+ setConsoleLoading(false)
+ } catch (e) {
+ console.error(e)
+ consoleErrorMessage()
+ }
+ }
+
+ const signMessageString = async () => {
+ try {
+ resetConsole()
+
+ const wallet = sequence.getWallet()
+
+ appendConsoleLine('signing message...')
+ const signer = wallet.getSigner()
+
+ const message = `1915 Robert Frost
+The Road Not Taken
+
+Two roads diverged in a yellow wood,
+And sorry I could not travel both
+And be one traveler, long I stood
+And looked down one as far as I could
+To where it bent in the undergrowth
+
+Then took the other, as just as fair,
+And having perhaps the better claim,
+Because it was grassy and wanted wear
+Though as for that the passing there
+Had worn them really about the same,
+
+And both that morning equally lay
+In leaves no step had trodden black.
+Oh, I kept the first for another day!
+Yet knowing how way leads on to way,
+I doubted if I should ever come back.
+
+I shall be telling this with a sigh
+Somewhere ages and ages hence:
+Two roads diverged in a wood, and I—
+I took the one less traveled by,
+And that has made all the difference.
+
+\u2601 \u2600 \u2602`
+
+ // sign
+ const sig = await signer.signMessage(message)
+ appendConsoleLine(`signature: ${sig}`)
+
+ const isValid = await wallet.utils.isValidMessageSignature(wallet.getAddress(), message, sig, await signer.getChainId())
+ appendConsoleLine(`isValid?: ${isValid}`)
+ if (!isValid) throw new Error('sig invalid')
+
+ setConsoleLoading(false)
+ } catch (e) {
+ console.error(e)
+ consoleErrorMessage()
+ }
+ }
+
+ const signMessageHex = async () => {
+ try {
+ resetConsole()
+
+ const wallet = sequence.getWallet()
+
+ appendConsoleLine('signing message...')
+ const signer = wallet.getSigner()
+
+ // Message in hex
+ const message = ethers.hexlify(ethers.toUtf8Bytes('Hello, world!'))
+
+ // sign
+ const sig = await signer.signMessage(message)
+ appendConsoleLine(`signature: ${sig}`)
+
+ const isValid = await wallet.utils.isValidMessageSignature(wallet.getAddress(), message, sig, await signer.getChainId())
+ appendConsoleLine(`isValid?: ${isValid}`)
+ if (!isValid) throw new Error('sig invalid')
+
+ setConsoleLoading(false)
+ } catch (e) {
+ console.error(e)
+ consoleErrorMessage()
+ }
+ }
+
+ const signMessageBytes = async () => {
+ try {
+ resetConsole()
+
+ const wallet = sequence.getWallet()
+
+ appendConsoleLine('signing message...')
+ const signer = wallet.getSigner()
+
+ // Message in hex
+ const message = ethers.toUtf8Bytes('Hello, world!')
+
+ // sign
+ const sig = await signer.signMessage(message)
+ appendConsoleLine(`signature: ${sig}`)
+
+ const isValid = await wallet.utils.isValidMessageSignature(wallet.getAddress(), message, sig, await signer.getChainId())
+ appendConsoleLine(`isValid?: ${isValid}`)
+ if (!isValid) throw new Error('sig invalid')
+
+ setConsoleLoading(false)
+ } catch (e) {
+ console.error(e)
+ consoleErrorMessage()
+ }
+ }
+
+ const signTypedData = async () => {
+ try {
+ resetConsole()
+ const wallet = sequence.getWallet()
+
+ appendConsoleLine('signing typedData...')
+
+ const typedData: sequence.utils.TypedData = {
+ types: {
+ Person: [
+ { name: 'name', type: 'string' },
+ { name: 'wallet', type: 'address' }
+ ],
+ Mail: [
+ { name: 'from', type: 'Person' },
+ { name: 'to', type: 'Person' },
+ { name: 'cc', type: 'Person[]' },
+ { name: 'contents', type: 'string' },
+ { name: 'attachements', type: 'string[]' }
+ ]
+ },
+ primaryType: 'Mail',
+ domain: {
+ name: 'Ether Mail',
+ version: '1',
+ chainId: 1,
+ verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC'
+ },
+ message: {
+ from: {
+ name: 'Cow',
+ wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826'
+ },
+ to: {
+ name: 'Bob',
+ wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB'
+ },
+ cc: [
+ { name: 'Dev Team', wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB' },
+ { name: 'Accounting', wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB' }
+ ],
+ contents: 'Hello, Bob!',
+ attachements: ['cat.png', 'dog.png']
+ }
+ }
+
+ const signer = wallet.getSigner()
+
+ const sig = await signer.signTypedData(typedData.domain, typedData.types, typedData.message)
+ appendConsoleLine(`signature: ${sig}`)
+
+ // validate
+ const isValid = await wallet.utils.isValidTypedDataSignature(wallet.getAddress(), typedData, sig, await signer.getChainId())
+ appendConsoleLine(`isValid?: ${isValid}`)
+
+ setConsoleLoading(false)
+ } catch (e) {
+ console.error(e)
+ consoleErrorMessage()
+ }
+ }
+
+ const estimateUnwrapGas = async () => {
+ try {
+ resetConsole()
+
+ const wallet = sequence.getWallet()
+
+ const wmaticContractAddress = '0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270'
+ const wmaticInterface = new ethers.Interface(['function withdraw(uint256 amount)'])
+
+ const tx: sequence.transactions.Transaction = {
+ to: wmaticContractAddress,
+ data: wmaticInterface.encodeFunctionData('withdraw', ['1000000000000000000'])
+ }
+
+ const provider = wallet.getProvider()
+ const estimate = await provider.estimateGas(tx)
+
+ appendConsoleLine(`estimated gas needed for wmatic withdrawal : ${estimate.toString()}`)
+
+ setConsoleLoading(false)
+ } catch (e) {
+ console.error(e)
+ consoleErrorMessage()
+ }
+ }
+
+ const sendETH = async (signer?: sequence.provider.SequenceSigner) => {
+ try {
+ resetConsole()
+ const wallet = sequence.getWallet()
+
+ signer = signer || wallet.getSigner()
+
+ appendConsoleLine(`Transfer txn on ${signer.getChainId()} chainId`)
+
+ // NOTE: on mainnet, the balance will be of ETH value
+ // and on matic, the balance will be of MATIC value
+
+ // Sending the funds to the wallet itself
+ // so we don't lose any funds ;-)
+ // (of course, you can send anywhere)
+ const toAddress = await signer.getAddress()
+
+ const tx1: sequence.transactions.Transaction = {
+ delegateCall: false,
+ revertOnError: false,
+ gasLimit: '0x55555',
+ to: toAddress,
+ value: ethers.parseEther('1.234'),
+ data: '0x'
+ }
+
+ const tx2: sequence.transactions.Transaction = {
+ delegateCall: false,
+ revertOnError: false,
+ gasLimit: '0x55555',
+ to: toAddress,
+ value: ethers.parseEther('0.4242'),
+ data: '0x'
+ }
+
+ const provider = signer.provider
+
+ const balance1 = await provider.getBalance(toAddress)
+ appendConsoleLine(`balance of ${toAddress}, before: ${balance1}`)
+
+ const txnResp = await signer.sendTransaction([tx1, tx2])
+ appendConsoleLine(`txnResponse: ${JSON.stringify(txnResp)}`)
+
+ const balance2 = await provider.getBalance(toAddress)
+ appendConsoleLine(`balance of ${toAddress}, after: ${balance2}`)
+
+ setConsoleLoading(false)
+ } catch (e) {
+ console.error(e)
+ consoleErrorMessage()
+ }
+ }
+
+ const sendSepoliaUSDC = async (signer?: sequence.provider.SequenceSigner) => {
+ try {
+ resetConsole()
+
+ const wallet = sequence.getWallet()
+
+ signer = signer || wallet.getSigner() // select DefaultChain signer by default
+
+ // Sending the funds to the wallet itself
+ // so we don't lose any funds ;-)
+ // (of course, you can send anywhere)
+ const toAddress = await signer.getAddress()
+
+ const amount = ethers.parseUnits('1', 1)
+
+ // (USDC address on Sepolia)
+ const usdcAddress = '0x07865c6e87b9f70255377e024ace6630c1eaa37f'
+
+ const tx: sequence.transactions.Transaction = {
+ delegateCall: false,
+ revertOnError: false,
+ gasLimit: '0x55555',
+ to: usdcAddress,
+ value: 0,
+ data: new ethers.Interface(ERC_20_ABI).encodeFunctionData('transfer', [toAddress, toHexString(amount)])
+ }
+
+ const txnResp = await signer.sendTransaction([tx], { chainId: ChainId.SEPOLIA })
+ appendConsoleLine(`txnResponse: ${JSON.stringify(txnResp)}`)
+
+ setConsoleLoading(false)
+ } catch (e) {
+ console.error(e)
+ consoleErrorMessage()
+ }
+ }
+
+ const sendDAI = async (signer?: sequence.provider.SequenceSigner) => {
+ try {
+ resetConsole()
+
+ const wallet = sequence.getWallet()
+
+ signer = signer || wallet.getSigner() // select DefaultChain signer by default
+
+ // Sending the funds to the wallet itself
+ // so we don't lose any funds ;-)
+ // (of course, you can send anywhere)
+ const toAddress = await signer.getAddress()
+
+ const amount = ethers.parseUnits('0.05', 18)
+ const daiContractAddress = '0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063' // (DAI address on Polygon)
+
+ const tx: sequence.transactions.Transaction = {
+ delegateCall: false,
+ revertOnError: false,
+ gasLimit: '0x55555',
+ to: daiContractAddress,
+ value: 0,
+ data: new ethers.Interface(ERC_20_ABI).encodeFunctionData('transfer', [toAddress, toHexString(amount)])
+ }
+
+ const txnResp = await signer.sendTransaction([tx])
+ appendConsoleLine(`txnResponse: ${JSON.stringify(txnResp)}`)
+
+ setConsoleLoading(false)
+ } catch (e) {
+ console.error(e)
+ consoleErrorMessage()
+ }
+ }
+
+ const sendETHSidechain = async () => {
+ try {
+ const wallet = sequence.getWallet()
+
+ // Send either to Arbitrum or Optimism
+ // just pick one that is not the current chainId
+ const pick = wallet.getChainId() === ChainId.ARBITRUM ? ChainId.OPTIMISM : ChainId.ARBITRUM
+ sendETH(wallet.getSigner(pick))
+ } catch (e) {
+ console.error(e)
+ consoleErrorMessage()
+ }
+ }
+
+ const send1155Tokens = async () => {
+ try {
+ resetConsole()
+ appendConsoleLine('TODO')
+ setConsoleLoading(false)
+ } catch (e) {
+ console.error(e)
+ consoleErrorMessage()
+ }
+ }
+
+ const contractExample = async (signer?: sequence.provider.SequenceSigner) => {
+ try {
+ resetConsole()
+
+ const wallet = sequence.getWallet()
+
+ signer = signer || wallet.getSigner()
+
+ const abi = [
+ 'function balanceOf(address owner) view returns (uint256)',
+ 'function decimals() view returns (uint8)',
+ 'function symbol() view returns (string)',
+ 'function transfer(address to, uint amount) returns (bool)',
+ 'event Transfer(address indexed from, address indexed to, uint amount)'
+ ]
+
+ // USD Coin (PoS) on Polygon
+ const address = '0x2791bca1f2de4661ed88a30c99a7a9449aa84174'
+
+ const usdc = new ethers.Contract(address, abi)
+
+ const usdSymbol = await usdc.symbol()
+ appendConsoleLine(`Token symbol: ${usdSymbol}`)
+
+ const balance = await usdc.balanceOf(await signer.getAddress())
+ appendConsoleLine(`Token Balance: ${balance.toString()}`)
+
+ setConsoleLoading(false)
+ } catch (e) {
+ console.error(e)
+ consoleErrorMessage()
+ }
+ }
+
+ const fetchTokenBalances = async () => {
+ try {
+ resetConsole()
+
+ const wallet = sequence.getWallet()
+
+ const signer = wallet.getSigner()
+ const accountAddress = await signer.getAddress()
+ const networks = await wallet.getNetworks()
+ const network = networks.find(network => network.chainId === ChainId.POLYGON)
+
+ if (!network) {
+ throw new Error(`Could not find Polygon network in networks list`)
+ }
+
+ const indexer = new sequence.indexer.SequenceIndexer(network.indexerUrl)
+
+ const tokenBalances = await indexer.getTokenBalances({
+ accountAddress: accountAddress,
+ includeMetadata: true
+ })
+
+ appendConsoleLine(`tokens in your account: ${JSON.stringify(tokenBalances)}`)
+
+ // NOTE: you can put any NFT/collectible address in the `contractAddress` field and it will return all of the balances + metadata.
+ // We use the Skyweaver production contract address here for demo purposes, but try another one :)
+ const skyweaverCollectibles = await indexer.getTokenBalances({
+ accountAddress: accountAddress,
+ includeMetadata: true,
+ contractAddress: '0x631998e91476DA5B870D741192fc5Cbc55F5a52E'
+ })
+ appendConsoleLine(`skyweaver collectibles in your account: ${JSON.stringify(skyweaverCollectibles)}`)
+
+ setConsoleLoading(false)
+ } catch (e) {
+ console.error(e)
+ consoleErrorMessage()
+ }
+ }
+
+ const updateImplementation = async (signer?: sequence.provider.SequenceSigner) => {
+ try {
+ resetConsole()
+
+ const wallet = sequence.getWallet()
+
+ signer = signer || wallet.getSigner() // select DefaultChain signer by default
+
+ const transaction: sequence.transactions.Transaction = {
+ to: wallet.getAddress(),
+ data: new ethers.Interface(walletContracts.mainModule.abi).encodeFunctionData('updateImplementation', [
+ ethers.ZeroAddress
+ ])
+ }
+
+ const response = await signer.sendTransaction(transaction)
+ appendConsoleLine(`response: ${JSON.stringify(response)}`)
+ setConsoleLoading(false)
+ } catch (e) {
+ console.error(e)
+ consoleErrorMessage()
+ }
+ }
+
+ const updateImageHash = async (signer?: sequence.provider.SequenceSigner) => {
+ try {
+ resetConsole()
+
+ const wallet = sequence.getWallet()
+
+ signer = signer || wallet.getSigner() // select DefaultChain signer by default
+
+ const transaction: sequence.transactions.Transaction = {
+ to: wallet.getAddress(),
+ data: new ethers.Interface(walletContracts.mainModuleUpgradable.abi).encodeFunctionData('updateImageHash', [
+ ethers.ZeroHash
+ ])
+ }
+
+ const response = await signer.sendTransaction(transaction)
+ appendConsoleLine(`response: ${JSON.stringify(response)}`)
+ setConsoleLoading(false)
+ } catch (e) {
+ console.error(e)
+ consoleErrorMessage()
+ }
+ }
+
+ const delegateCall = async (signer?: sequence.provider.SequenceSigner) => {
+ try {
+ resetConsole()
+
+ const wallet = sequence.getWallet()
+
+ signer = signer || wallet.getSigner() // select DefaultChain signer by default
+
+ const transaction: sequence.transactions.Transaction = {
+ to: wallet.getAddress(),
+ delegateCall: true
+ }
+
+ const response = await signer.sendTransaction(transaction)
+ appendConsoleLine(`response: ${JSON.stringify(response)}`)
+ setConsoleLoading(false)
+ } catch (e) {
+ console.error(e)
+ consoleErrorMessage()
+ }
+ }
+
+ const addHook = async (signer?: sequence.provider.SequenceSigner) => {
+ try {
+ resetConsole()
+
+ const wallet = sequence.getWallet()
+
+ signer = signer || wallet.getSigner() // select DefaultChain signer by default
+
+ const transaction: sequence.transactions.Transaction = {
+ to: wallet.getAddress(),
+ data: new ethers.Interface(['function addHook(bytes4 _signature, address _implementation)']).encodeFunctionData(
+ 'addHook',
+ ['0x01234567', ethers.ZeroAddress]
+ )
+ }
+
+ const response = await signer.sendTransaction(transaction)
+ appendConsoleLine(`response: ${JSON.stringify(response)}`)
+ setConsoleLoading(false)
+ } catch (e) {
+ console.error(e)
+ consoleErrorMessage()
+ }
+ }
+
+ const setExtraImageHash = async (signer?: sequence.provider.SequenceSigner) => {
+ try {
+ resetConsole()
+
+ const wallet = sequence.getWallet()
+
+ signer = signer || wallet.getSigner() // select DefaultChain signer by default
+
+ const transaction: sequence.transactions.Transaction = {
+ to: wallet.getAddress(),
+ data: new ethers.Interface(['function setExtraImageHash(bytes32 _imageHash, uint256 _expiration)']).encodeFunctionData(
+ 'setExtraImageHash',
+ [ethers.ZeroHash, ethers.MaxUint256]
+ )
+ }
+
+ const response = await signer.sendTransaction(transaction)
+ appendConsoleLine(`response: ${JSON.stringify(response)}`)
+ setConsoleLoading(false)
+ } catch (e) {
+ console.error(e)
+ consoleErrorMessage()
+ }
+ }
+
+ const appendConsoleLine = (message: string, clear = false) => {
+ console.log(message)
+
+ if (clear) {
+ return setConsoleMsg(message)
+ }
+
+ return setConsoleMsg(prevState => {
+ return `${prevState}\n\n${message}`
+ })
+ }
+
+ const resetConsole = () => {
+ setConsoleLoading(true)
+ }
+
+ const consoleWelcomeMessage = () => {
+ setConsoleLoading(false)
+
+ if (isWalletConnected) {
+ setConsoleMsg('Status: Wallet is connected :)')
+ } else {
+ setConsoleMsg('Status: Wallet not connected. Please connect wallet first.')
+ }
+ }
+
+ const consoleErrorMessage = () => {
+ setConsoleLoading(false)
+ setConsoleMsg('An error occurred')
+ }
+
+ // networks list, filtered and sorted
+ const omitNetworks = [
+ ChainId.RINKEBY,
+ ChainId.HARDHAT,
+ ChainId.HARDHAT_2,
+ ChainId.KOVAN,
+ ChainId.ROPSTEN,
+ ChainId.HOMEVERSE_TESTNET,
+ ChainId.BASE_GOERLI
+ ]
+
+ const mainnets = Object.values(sequence.network.networks)
+ .filter(network => network.type === NetworkType.MAINNET)
+ .sort((a, b) => a.chainId - b.chainId)
+ const testnets = Object.values(sequence.network.networks)
+ .filter(network => network.type === NetworkType.TESTNET)
+ .sort((a, b) => a.chainId - b.chainId)
+ const networks = [...mainnets, ...testnets].filter(network => !network.deprecated && !omitNetworks.includes(network.chainId))
+
+ useEffect(() => {
+ if (email && !isOpen) {
+ console.log(email)
+ connect({
+ app: 'Demo Dapp',
+ authorize: true,
+ settings: {
+ // Specify signInWithEmail with an email address to allow user automatically sign in with the email option.
+ signInWithEmail: email,
+ theme: 'dark',
+ bannerUrl: `${window.location.origin}${skyweaverBannerUrl}`
+ }
+ })
+ setEmail(null)
+ }
+ }, [email, isOpen])
+
+ const sanitizeEmail = (email: string) => {
+ // Trim unnecessary spaces
+ email = email.trim()
+
+ // Check if the email matches the pattern of a typical email
+ const emailRegex = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}$/
+ if (emailRegex.test(email)) {
+ return true
+ }
+
+ return false
+ }
+
+ return (
+
+
+
+
+
+
+
+
+
+ Demo Dapp
+
+
+
+
+
+ A dapp example on how to use the Sequence Wallet. This covers how to connect, sign messages and send transctions.
+
+
+
+
+
+
+ Please open your browser dev inspector to view output of functions below.
+
+
+
+
+
+ {!isCustom && (
+
+ {
+ // Disconnect the wallet
+ disconnect()
+
+ // Set the new env url param
+ urlParams.set('env', value)
+
+ // Clear any existing walletAppURL overrides
+ urlParams.delete('walletAppURL')
+
+ // Update the url with the new params and refresh the page
+ window.location.search = urlParams.toString()
+ }}
+ value={env}
+ options={[
+ ...Object.values(environments).map(env => ({
+ label: (
+
+ {env.name}
+
+ ),
+ value: String(env.name)
+ }))
+ ]}
+ />
+
+ )}
+
+
+
+ Wallet URL
+
+
+
+
+ {walletAppURL}
+
+
+
+
+
+
+
+
+
+ Project Access Key
+
+
+
+
+ {projectAccessKey}
+
+
+
+
+
+
+
+ wallet.setDefaultChainId(Number(value))}
+ value={String(showChainId)}
+ options={[
+ ...Object.values(networks).map(network => ({
+ label: (
+
+
+ {network.title!}
+
+ ),
+ value: String(network.chainId)
+ }))
+ ]}
+ />
+
+
+
+ connect()} label="Connect" />
+ connect({ app: 'Demo Dapp', authorize: true })}
+ label="Connect & Auth"
+ />
+
+ connect({
+ app: 'Demo Dapp',
+ authorize: true,
+ settings: {
+ // Specify signInOptions to pick the available sign in options.
+ // signInOptions: ['email', 'google', 'apple'],
+ theme: 'dark',
+ bannerUrl: `${window.location.origin}${skyweaverBannerLargeUrl}`,
+ bannerSize: 'medium',
+ includedPaymentProviders: ['moonpay'],
+ defaultFundingCurrency: 'matic',
+ defaultPurchaseAmount: 111
+ }
+ })
+ }
+ label="Connect with Settings"
+ />
+ {
+ toggleModal(true)
+ }}
+ label="Connect with Email"
+ />
+ {
+ connect({
+ app: 'Demo Dapp',
+ authorize: true,
+ settings: {
+ // Specify signInWithEmail with an email address to allow user automatically sign in with the email option.
+ signInWith: 'google',
+ theme: 'dark',
+ bannerUrl: `${window.location.origin}${skyweaverBannerUrl}`
+ }
+ })
+ }}
+ label="Connect with Google"
+ />
+
+ disconnect()} label="Disconnect" />
+
+
+
+ openWallet()} label="Open Wallet" />
+ openWalletWithSettings()}
+ label="Open Wallet with Settings"
+ />
+ closeWallet()} label="Close Wallet" />
+ isConnected()} label="Is Connected?" />
+ isOpened()} label="Is Opened?" />
+
+
+
+ getChainID()} label="ChainID" />
+ getNetworks()} label="Networks" />
+ getAccounts()} label="Get Accounts" />
+ getBalance()} label="Get Balance" />
+
+
+
+ signMessageString()}
+ label="Sign Message"
+ />
+ signMessageHex()}
+ label="Sign Message (Hex)"
+ />
+ signMessageBytes()}
+ label="Sign Message (Bytes)"
+ />
+ signTypedData()}
+ label="Sign TypedData"
+ />
+
+
+
+ estimateUnwrapGas()}
+ label="Estimate Unwrap Gas"
+ />
+
+
+
+ sendETH()} label="Send funds" />
+ sendETHSidechain()} label="Send on L2" />
+ sendDAI()} label="Send DAI" />
+ send1155Tokens()}
+ label="Send ERC-1155 Tokens"
+ />
+ sendSepoliaUSDC()}
+ label="Send USDC on Sepolia"
+ />
+
+
+
+ contractExample()}
+ label="Read Symbol and Balance"
+ />
+ fetchTokenBalances()}
+ label="Fetch Token Balances"
+ />
+
+
+ {showProhibitedActions && (
+
+ updateImplementation()}
+ label="Update Implementation"
+ />
+ updateImageHash()}
+ label="Update Image Hash"
+ />
+ delegateCall()}
+ label="Delegate Call"
+ />
+ addHook()} label="Add Hook" />
+ setExtraImageHash()}
+ label="Set Extra Image Hash"
+ />
+
+ )}
+
+
+ {isOpen && (
+ toggleModal(false)} size={'sm'}>
+
+
+
+
+ Auto-email login, please specify the email address
+
+
+
+ } }) => {
+ setEmail(ev.target.value)
+ }}
+ >
+
+ {warning ? (
+
+
+ please input an email with correct format
+
+
+ ) : null}
+
+ {
+ if (sanitizeEmail(email)) {
+ setWarning(false)
+ toggleModal(false)
+ } else {
+ setWarning(true)
+ }
+ }}
+ data-id="login"
+ />
+
+
+
+
+ )}
+
+
+
+ )
+}
+
+export default React.memo(App)
diff --git a/.codesandbox/src/README.md b/.codesandbox/src/README.md
new file mode 100644
index 0000000000..19fb72ea17
--- /dev/null
+++ b/.codesandbox/src/README.md
@@ -0,0 +1,85 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Reactive primitives for Ethereum apps
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+---
+
+
+
+
+
+
+
+
+
+
+
+## Documentation
+
+For documentation and guides, visit [wagmi.sh](https://wagmi.sh).
+
+## Community
+
+For help, discussion about best practices, or any other conversation that would benefit from being searchable:
+
+[Discuss Wagmi on GitHub](https://github.com/wevm/wagmi/discussions)
+
+For casual chit-chat with others using the framework:
+
+[Join the Wagmi Discord](https://discord.gg/SghfWBKexF)
+
+## Contributing
+
+Contributions to Wagmi are greatly appreciated! If you're interested in contributing to Wagmi, please read the [Contributing Guide](https://wagmi.sh/dev/contributing) **before submitting a pull request**.
+
+## Sponsors
+
+If you find Wagmi useful or use it for work, please consider [sponsoring Wagmi](https://github.com/sponsors/wevm?metadata_campaign=gh_readme_support). Thank you 🙏 [Sponsor Wagmi](https://github.com/sponsors/wevm?metadata_campaign=gh_readme_support_bottom)
+
diff --git a/.codesandbox/src/components/Console/index.tsx b/.codesandbox/src/components/Console/index.tsx
new file mode 100644
index 0000000000..ccc41c2807
--- /dev/null
+++ b/.codesandbox/src/components/Console/index.tsx
@@ -0,0 +1,37 @@
+import { Box, Collapsible } from '@0xsequence/design-system'
+
+import * as styles from './styles.css'
+
+export interface ConsoleProps {
+ message: string | null
+ loading: boolean
+}
+
+export const Console = ({ message, loading }: ConsoleProps) => {
+ const getLoadingDots = () => {
+ if (message) {
+ return '\n...'
+ }
+ return '...'
+ }
+
+ return (
+
+
+ {message}
+ {loading && getLoadingDots()}
+ {
+
+ _
+
+ }
+
+
+ )
+}
diff --git a/.codesandbox/src/components/Console/styles.css.ts b/.codesandbox/src/components/Console/styles.css.ts
new file mode 100644
index 0000000000..537572fdf7
--- /dev/null
+++ b/.codesandbox/src/components/Console/styles.css.ts
@@ -0,0 +1,11 @@
+import { style, keyframes } from '@vanilla-extract/css'
+
+export const blink = keyframes({
+ '0%': { visibility: 'hidden' },
+ '50%': { visibility: 'hidden' },
+ '100%': { visibility: 'visible' }
+})
+
+export const cursor = style({
+ animation: `${blink} 2s infinite`
+})
diff --git a/.codesandbox/src/components/Group/index.tsx b/.codesandbox/src/components/Group/index.tsx
new file mode 100644
index 0000000000..c0edc223d1
--- /dev/null
+++ b/.codesandbox/src/components/Group/index.tsx
@@ -0,0 +1,42 @@
+import React from 'react'
+import { Box, Text } from '@0xsequence/design-system'
+
+import * as styles from './styles.css'
+
+interface GroupProps {
+ label?: JSX.Element | string
+ children: React.ReactNode
+ style?: any
+ className?: string
+}
+
+export const Group = (props: GroupProps) => {
+ const { label, children, style, className } = props
+
+ return (
+
+ {label && (
+
+ {label}
+
+ )}
+
+ {React.Children.map(children, (child, i) => (
+ {child}
+ ))}
+
+
+ )
+}
+
+interface GroupTitleProps {
+ children?: React.ReactNode
+}
+
+export const GroupTitle = (props: GroupTitleProps) => {
+ return (
+
+ {props.children}
+
+ )
+}
diff --git a/.codesandbox/src/components/Group/styles.css.ts b/.codesandbox/src/components/Group/styles.css.ts
new file mode 100644
index 0000000000..7ade6562e6
--- /dev/null
+++ b/.codesandbox/src/components/Group/styles.css.ts
@@ -0,0 +1,17 @@
+import { vars, responsiveStyle } from '@0xsequence/design-system'
+import { style } from '@vanilla-extract/css'
+
+export const groupItems = style({
+ display: 'grid',
+ gridColumnGap: vars.space[2],
+ gridRowGap: vars.space[2],
+ gridTemplateColumns: 'repeat(1, minmax(0, 1fr))',
+ '@media': responsiveStyle({
+ lg: {
+ gridTemplateColumns: 'repeat(2, minmax(0, 1fr))'
+ },
+ xl: {
+ gridTemplateColumns: 'repeat(3, minmax(0, 1fr))'
+ }
+ })
+})
diff --git a/.codesandbox/src/constants/abi.ts b/.codesandbox/src/constants/abi.ts
new file mode 100644
index 0000000000..d18bf898e0
--- /dev/null
+++ b/.codesandbox/src/constants/abi.ts
@@ -0,0 +1,64 @@
+export const ERC_1155_ABI = [
+ {
+ inputs: [
+ {
+ internalType: 'address',
+ name: '_from',
+ type: 'address'
+ },
+ {
+ internalType: 'address',
+ name: '_to',
+ type: 'address'
+ },
+ {
+ internalType: 'uint256[]',
+ name: '_ids',
+ type: 'uint256[]'
+ },
+ {
+ internalType: 'uint256[]',
+ name: '_amounts',
+ type: 'uint256[]'
+ },
+ {
+ internalType: 'bytes',
+ name: '_data',
+ type: 'bytes'
+ }
+ ],
+ name: 'safeBatchTransferFrom',
+ outputs: [],
+ stateMutability: 'nonpayable',
+ type: 'function'
+ }
+]
+
+export const ERC_20_ABI = [
+ {
+ constant: false,
+ inputs: [
+ {
+ internalType: 'address',
+ name: 'recipient',
+ type: 'address'
+ },
+ {
+ internalType: 'uint256',
+ name: 'amount',
+ type: 'uint256'
+ }
+ ],
+ name: 'transfer',
+ outputs: [
+ {
+ internalType: 'bool',
+ name: '',
+ type: 'bool'
+ }
+ ],
+ payable: false,
+ stateMutability: 'nonpayable',
+ type: 'function'
+ }
+]
diff --git a/.codesandbox/src/helpers.ts b/.codesandbox/src/helpers.ts
new file mode 100644
index 0000000000..6faad9885b
--- /dev/null
+++ b/.codesandbox/src/helpers.ts
@@ -0,0 +1,17 @@
+export const getDefaultChainId = () => {
+ const chainId = window.localStorage.getItem('defaultChainId')
+ if (chainId === null || chainId === undefined) {
+ return null
+ } else {
+ return Number(chainId)
+ }
+}
+
+export const saveDefaultChainId = (chainId: number) => {
+ console.log('huh?', chainId)
+ window.localStorage.setItem('defaultChainId', `${chainId}`)
+}
+
+export const toHexString = (value: bigint) => {
+ return '0x' + value.toString(16)
+}
diff --git a/.codesandbox/src/images/logo.svg b/.codesandbox/src/images/logo.svg
new file mode 100644
index 0000000000..2d6fca5885
--- /dev/null
+++ b/.codesandbox/src/images/logo.svg
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.codesandbox/src/images/skyweaver-banner-large.png b/.codesandbox/src/images/skyweaver-banner-large.png
new file mode 100644
index 0000000000..c536a9710e
Binary files /dev/null and b/.codesandbox/src/images/skyweaver-banner-large.png differ
diff --git a/.codesandbox/src/images/skyweaver-banner.old.png b/.codesandbox/src/images/skyweaver-banner.old.png
new file mode 100644
index 0000000000..85b65fcf04
Binary files /dev/null and b/.codesandbox/src/images/skyweaver-banner.old.png differ
diff --git a/.codesandbox/src/images/skyweaver-banner.png b/.codesandbox/src/images/skyweaver-banner.png
new file mode 100644
index 0000000000..6356329216
Binary files /dev/null and b/.codesandbox/src/images/skyweaver-banner.png differ
diff --git a/.codesandbox/src/index.css b/.codesandbox/src/index.css
new file mode 100644
index 0000000000..4d357aa163
--- /dev/null
+++ b/.codesandbox/src/index.css
@@ -0,0 +1,9 @@
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+}
+
+body {
+ background: var(--seq-colors-background-primary);
+}
diff --git a/.codesandbox/src/index.tsx b/.codesandbox/src/index.tsx
new file mode 100644
index 0000000000..05fa3617c5
--- /dev/null
+++ b/.codesandbox/src/index.tsx
@@ -0,0 +1,17 @@
+import './index.css'
+import '@0xsequence/design-system/styles.css'
+
+import { ThemeProvider } from '@0xsequence/design-system'
+import React from 'react'
+import { createRoot } from 'react-dom/client'
+import App from './App'
+
+const root = createRoot(document.getElementById('root'))
+
+root.render(
+
+
+
+
+
+)
diff --git a/.codesandbox/src/react-app-env.d.ts b/.codesandbox/src/react-app-env.d.ts
new file mode 100644
index 0000000000..6431bc5fc6
--- /dev/null
+++ b/.codesandbox/src/react-app-env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/.codesandbox/src/vite-env.d.ts b/.codesandbox/src/vite-env.d.ts
new file mode 100644
index 0000000000..11f02fe2a0
--- /dev/null
+++ b/.codesandbox/src/vite-env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/.codesandbox/tasks.json b/.codesandbox/tasks.json
new file mode 100644
index 0000000000..32148f7583
--- /dev/null
+++ b/.codesandbox/tasks.json
@@ -0,0 +1,118 @@
+{
+
+ "setupTasks": [
+ {
+ "name": "Install Dependencies",
+ "command": "pnpm install"
+ }
+ ],
+
+
+ "tasks": {
+ "build": {
+ "name": "build",
+ "command": "pnpm build",
+ "runAtStart": false
+ },
+ "watch": {
+ "name": "watch",
+ "command": "pnpm watch",
+ "runAtStart": false
+ },
+ "clean": {
+ "name": "clean",
+ "command": "pnpm clean",
+ "runAtStart": false
+ },
+ "changeset": {
+ "name": "changeset",
+ "command": "pnpm changeset",
+ "runAtStart": false
+ },
+ "version-packages": {
+ "name": "version-packages",
+ "command": "pnpm version-packages",
+ "runAtStart": false
+ },
+ "release": {
+ "name": "release",
+ "command": "pnpm release",
+ "runAtStart": false
+ },
+ "snapshot": {
+ "name": "snapshot",
+ "command": "pnpm snapshot",
+ "runAtStart": false
+ },
+ "update-version": {
+ "name": "update-version",
+ "command": "pnpm update-version",
+ "runAtStart": false
+ },
+ "test": {
+ "name": "test",
+ "command": "pnpm test",
+ "runAtStart": false
+ },
+ "test:parallel": {
+ "name": "test:parallel",
+ "command": "pnpm test:parallel",
+ "runAtStart": false
+ },
+ "lint": {
+ "name": "lint",
+ "command": "pnpm lint",
+ "runAtStart": false
+ },
+ "lint:fix": {
+ "name": "lint:fix",
+ "command": "pnpm lint:fix",
+ "runAtStart": false
+ },
+ "lint:tests": {
+ "name": "lint:tests",
+ "command": "pnpm lint:tests",
+ "runAtStart": false
+ },
+ "lint:tests:fix": {
+ "name": "lint:tests:fix",
+ "command": "pnpm lint:tests:fix",
+ "runAtStart": false
+ },
+ "format": {
+ "name": "format",
+ "command": "pnpm format",
+ "runAtStart": false
+ },
+ "audit:fix": {
+ "name": "audit:fix",
+ "command": "pnpm audit:fix",
+ "runAtStart": false
+ },
+ "typecheck": {
+ "name": "typecheck",
+ "command": "pnpm typecheck",
+ "runAtStart": false
+ },
+ "dev": {
+ "name": "dev",
+ "command": "pnpm dev",
+ "runAtStart": true
+ },
+ "postinstall": {
+ "name": "postinstall",
+ "command": "pnpm postinstall",
+ "runAtStart": false
+ },
+ "coverage": {
+ "name": "coverage",
+ "command": "pnpm coverage",
+ "runAtStart": false
+ },
+ "prepare": {
+ "name": "prepare",
+ "command": "pnpm prepare",
+ "runAtStart": false
+ }
+ }
+}
diff --git a/.codesandbox/tsconfig.json b/.codesandbox/tsconfig.json
new file mode 100644
index 0000000000..6f3e83f21a
--- /dev/null
+++ b/.codesandbox/tsconfig.json
@@ -0,0 +1,27 @@
+{
+ "compilerOptions": {
+ "target": "ESNext",
+ "lib": [
+ "dom",
+ "dom.iterable",
+ "esnext"
+ ],
+ "allowJs": true,
+ "skipLibCheck": true,
+ "esModuleInterop": true,
+ "allowSyntheticDefaultImports": true,
+ "strict": true,
+ "forceConsistentCasingInFileNames": true,
+ "noFallthroughCasesInSwitch": true,
+ "module": "esnext",
+ "moduleResolution": "node",
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "noEmit": true,
+ "jsx": "react-jsx",
+ "types": ["vite/client", "vite-plugin-svgr/client"],
+ },
+ "include": [
+ "src"
+ ]
+}
diff --git a/.codesandbox/v8-compile-cache-0/x64/11.3.244.8-node.19/zSprojectzSsequence.jszSnode_moduleszS.pnpmzS@preconstruct+cli@2.8.7zSnode_moduleszS@preconstructzSclizSbin.js.BLOB b/.codesandbox/v8-compile-cache-0/x64/11.3.244.8-node.19/zSprojectzSsequence.jszSnode_moduleszS.pnpmzS@preconstruct+cli@2.8.7zSnode_moduleszS@preconstructzSclizSbin.js.BLOB
new file mode 100644
index 0000000000..0b31b75844
Binary files /dev/null and b/.codesandbox/v8-compile-cache-0/x64/11.3.244.8-node.19/zSprojectzSsequence.jszSnode_moduleszS.pnpmzS@preconstruct+cli@2.8.7zSnode_moduleszS@preconstructzSclizSbin.js.BLOB differ
diff --git a/.codesandbox/v8-compile-cache-0/x64/11.3.244.8-node.19/zSprojectzSworkspacezSnode_moduleszS.pnpmzS@preconstruct+cli@2.8.7zSnode_moduleszS@preconstructzSclizSbin.js.BLOB b/.codesandbox/v8-compile-cache-0/x64/11.3.244.8-node.19/zSprojectzSworkspacezSnode_moduleszS.pnpmzS@preconstruct+cli@2.8.7zSnode_moduleszS@preconstructzSclizSbin.js.BLOB
new file mode 100644
index 0000000000..5e6ea312b8
Binary files /dev/null and b/.codesandbox/v8-compile-cache-0/x64/11.3.244.8-node.19/zSprojectzSworkspacezSnode_moduleszS.pnpmzS@preconstruct+cli@2.8.7zSnode_moduleszS@preconstructzSclizSbin.js.BLOB differ
diff --git a/.codesandbox/vite.config.ts b/.codesandbox/vite.config.ts
new file mode 100644
index 0000000000..5c41a802d1
--- /dev/null
+++ b/.codesandbox/vite.config.ts
@@ -0,0 +1,21 @@
+import { defineConfig } from 'vite'
+import dns from 'dns'
+import react from '@vitejs/plugin-react'
+import viteTsconfigPaths from 'vite-tsconfig-paths'
+import svgrPlugin from 'vite-plugin-svgr'
+import { vanillaExtractPlugin } from '@vanilla-extract/vite-plugin'
+
+dns.setDefaultResultOrder('verbatim')
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [react(), viteTsconfigPaths(), svgrPlugin(), vanillaExtractPlugin()],
+ server: {
+ port: 4000,
+ fs: {
+ // Allow serving files from one level up to the project root
+ allow: ['..']
+ }
+ },
+ base: '/demo-dapp'
+})
diff --git a/.eslintignore b/.eslintignore
new file mode 100644
index 0000000000..849dc677d2
--- /dev/null
+++ b/.eslintignore
@@ -0,0 +1,2 @@
+.eslintrc.js
+packages/**/dist
diff --git a/.eslintrc.js b/.eslintrc.js
new file mode 100644
index 0000000000..d4366e4255
--- /dev/null
+++ b/.eslintrc.js
@@ -0,0 +1,48 @@
+const { off } = require("process")
+
+module.exports = {
+ parser: '@typescript-eslint/parser',
+ parserOptions: {
+ ecmaVersion: 2018,
+ sourceType: 'module'
+ },
+
+ extends: [
+ 'plugin:@typescript-eslint/recommended',
+ 'plugin:import/errors',
+ 'plugin:import/warnings',
+ 'plugin:import/typescript',
+ 'prettier'
+ ],
+
+ rules: {
+ '@typescript-eslint/no-unused-vars': 'off',
+ '@typescript-eslint/no-explicit-any': 'off',
+ '@typescript-eslint/no-non-null-assertion': 'off',
+ '@typescript-eslint/explicit-module-boundary-types': 'off',
+ '@typescript-eslint/ban-types': 'off',
+ '@typescript-eslint/ban-ts-comment': 'off',
+ '@typescript-eslint/no-empty-function': 'off',
+ '@typescript-eslint/no-inferrable-types': 'off',
+ '@typescript-eslint/no-var-requires': 'off',
+ '@typescript-eslint/no-this-alias': 'off',
+
+ 'import/no-unresolved': 'off',
+ 'import/no-default-export': 2,
+ 'import/no-named-as-default-member': 'off',
+ 'import/export': 'off'
+
+
+ // 'import/order': [
+ // 'warn',
+ // {
+ // 'groups': ['builtin', 'external', 'parent', 'sibling', 'index'],
+ // 'alphabetize': {
+ // 'order': 'asc', /* sort in ascending order. Options: ['ignore', 'asc', 'desc'] */
+ // 'caseInsensitive': true /* ignore case. Options: [true, false] */
+ // }
+ // },
+ // ]
+
+ }
+}
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
new file mode 100644
index 0000000000..63b7ea3898
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -0,0 +1,36 @@
+---
+name: Bug report
+about: Create a report to help us improve
+title: ''
+labels: 'bug'
+assignees: ''
+
+---
+
+**Describe the bug**
+A clear and concise description of what the bug is.
+
+**To Reproduce**
+Steps to reproduce the behavior:
+1. Go to '...'
+2. Click on '....'
+3. Scroll down to '....'
+4. See error
+
+**Expected behavior**
+A clear and concise description of what you expected to happen.
+
+**Screenshots**
+If applicable, add screenshots to help explain your problem.
+
+**Environment (please complete the following information):**
+ - Library Version: [e.g. 3.0.0]
+ - Runtime: [e.g. Node v18, Chrome 110]
+ - OS: [e.g. macOS 13.2]
+ - Bundler/Framework: [e.g. Vite, Next.js]
+
+**Minimal Reproducible Example**
+Please provide a link to a repository or a code snippet that reproduces the issue.
+
+**Additional context**
+Add any other context about the problem here.
diff --git a/.github/ISSUE_TEMPLATE/custom.md b/.github/ISSUE_TEMPLATE/custom.md
new file mode 100644
index 0000000000..5b0f09ce21
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/custom.md
@@ -0,0 +1,11 @@
+---
+name: General issue
+about: Open an issue for topics not covered by other templates
+title: ''
+labels: ''
+assignees: ''
+
+---
+
+**Description**
+A clear and concise description of the issue or suggestion.
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
new file mode 100644
index 0000000000..36014cde56
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature_request.md
@@ -0,0 +1,20 @@
+---
+name: Feature request
+about: Suggest an idea for this project
+title: ''
+labels: 'enhancement'
+assignees: ''
+
+---
+
+**Is your feature request related to a problem? Please describe.**
+A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
+
+**Describe the solution you'd like**
+A clear and concise description of what you want to happen.
+
+**Describe alternatives you've considered**
+A clear and concise description of any alternative solutions or features you've considered.
+
+**Additional context**
+Add any other context or screenshots about the feature request here.
diff --git a/.github/actions/install-dependencies/action.yml b/.github/actions/install-dependencies/action.yml
index ca81d1a40a..c354c156ba 100644
--- a/.github/actions/install-dependencies/action.yml
+++ b/.github/actions/install-dependencies/action.yml
@@ -4,15 +4,10 @@ runs:
using: 'composite'
steps:
- - name: Setup Node
- uses: actions/setup-node@v4
- with:
- node-version: 20
-
- name: Setup PNPM
- uses: pnpm/action-setup@v3
+ uses: pnpm/action-setup@v2
with:
- version: 10
+ version: 8
run_install: false
- name: Get pnpm store directory
@@ -22,7 +17,7 @@ runs:
echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT
- name: Setup pnpm cache
- uses: actions/cache@v4
+ uses: actions/cache@v3
with:
path: |
${{ steps.pnpm-cache.outputs.STORE_PATH }}
@@ -33,6 +28,11 @@ runs:
restore-keys: |
${{ runner.os }}-pnpm-store-
+ - name: Setup Node
+ uses: actions/setup-node@v3
+ with:
+ node-version: 20
+
- name: Install dependencies
shell: bash
run: pnpm install --frozen-lockfile
diff --git a/.github/workflows/Publish-Dists.yml b/.github/workflows/Publish-Dists.yml
new file mode 100644
index 0000000000..b97bc750c3
--- /dev/null
+++ b/.github/workflows/Publish-Dists.yml
@@ -0,0 +1,93 @@
+name: Publish Dists for Packages
+
+on:
+ workflow_dispatch:
+ push:
+ branches:
+ - master
+
+jobs:
+ build-and-push:
+ runs-on: ubuntu-latest
+ permissions:
+ contents: write
+
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+
+ - uses: ./.github/actions/install-dependencies
+
+ - name: Build package
+ run: pnpm run build
+
+ - name: Prepare dist branch
+ run: |
+ PACKAGES=("services/guard" "services/identity-instrument" "services/relayer" "wallet/core" "wallet/primitives" "wallet/wdk" "wallet/dapp-client")
+
+ for PACKAGE in "${PACKAGES[@]}"; do
+ BRANCH="dists/$PACKAGE"
+ PKG_DIR="packages/$PACKAGE"
+
+ echo "📦 Publishing $PACKAGE to $BRANCH"
+
+ mkdir -p "/tmp/$PACKAGE"
+ cp -r "$PKG_DIR"/. "/tmp/$PACKAGE" || true
+
+ cd /tmp/$PACKAGE
+ git init
+ git checkout -b $BRANCH
+
+ git config user.name "github-actions"
+ git config user.email "actions@github.com"
+
+ echo "🔧 Rewriting workspace: deps in package.json..."
+ node -e '
+ const fs = require("fs");
+ const path = require("path");
+ const pkgPath = path.resolve("package.json");
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf8"));
+ const repo = "github:0xsequence/sequence.js";
+
+ const versions = {
+ "@0xsequence/guard": `${repo}#dists/services/guard`,
+ "@0xsequence/identity-instrument": `${repo}#dists/services/identity-instrument`,
+ "@0xsequence/relayer": `${repo}#dists/services/relayer`,
+ "@0xsequence/wallet-core": `${repo}#dists/wallet/core`,
+ "@0xsequence/wallet-primitives": `${repo}#dists/wallet/primitives`,
+ "@0xsequence/wallet-wdk": `${repo}#dists/wallet/wdk`,
+ };
+
+ const rewrite = (deps = {}) => {
+ for (const k in deps) {
+ if (deps[k].startsWith("workspace:")) {
+ const version = versions[k];
+
+ if (!version) {
+ console.warn(`No version found for ${k}, skipping...`);
+ continue;
+ }
+
+ deps[k] = version;
+ console.log(`→ ${k} → ${deps[k]}`);
+ }
+ }
+ };
+
+ ['dependencies', 'devDependencies', 'peerDependencies', 'optionalDependencies'].forEach((field) => {
+ if (pkg[field]) {
+ rewrite(pkg[field]);
+ }
+ });
+ fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2));
+ '
+
+ git add .
+ git commit -m "Build: publish $PACKAGE dist"
+
+ git remote add origin https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}.git
+ git push -f origin HEAD:$BRANCH
+
+ cd -
+ done
diff --git a/.github/workflows/azure-pipelines.yml b/.github/workflows/azure-pipelines.yml
new file mode 100644
index 0000000000..04aeec669f
--- /dev/null
+++ b/.github/workflows/azure-pipelines.yml
@@ -0,0 +1,20 @@
+# Node.js
+# Build a general Node.js project with npm.
+# Add steps that analyze code, save build artifacts, deploy, and more:
+# https://docs.microsoft.com/azure/devops/pipelines/languages/javascript
+
+ trigger:
+ - master
+
+ pool:
+ vmImage: ubuntu-latest
+
+ steps:
+ - task: NodeTool@0
+ inputs:
+ versionSpec: '10.x'
+ displayName: 'Install Node.js'
+ script: |
+ npm install
+ npm run build
+ displayName: 'npm install and build'
diff --git a/.github/workflows/defender-for-devops.yml b/.github/workflows/defender-for-devops.yml
new file mode 100644
index 0000000000..ccffad8c46
--- /dev/null
+++ b/.github/workflows/defender-for-devops.yml
@@ -0,0 +1,50 @@
+# This workflow uses actions that are not certified by GitHub.
+# They are provided by a third-party and are governed by
+# separate terms of service, privacy policy, and support
+# documentation.
+#
+# Microsoft Security DevOps (MSDO) is a command line application which integrates static analysis tools into the development cycle.
+# MSDO installs, configures and runs the latest versions of static analysis tools
+# (including, but not limited to, SDL/security and compliance tools).
+#
+# The Microsoft Security DevOps action is currently in beta and runs on the windows-latest queue,
+# as well as Windows self hosted agents. ubuntu-latest support coming soon.
+#
+# For more information about the action , check out https://github.com/microsoft/security-devops-action
+#
+# Please note this workflow do not integrate your GitHub Org with Microsoft Defender For DevOps. You have to create an integration
+# and provide permission before this can report data back to azure.
+# Read the official documentation here : https://learn.microsoft.com/en-us/azure/defender-for-cloud/quickstart-onboard-github
+
+name: "Microsoft Defender for DevOps"
+
+permissions:
+ contents: read
+
+on:
+ push:
+ branches: [ "master" ]
+ pull_request:
+ branches: [ "master" ]
+ schedule:
+ - cron: '32 12 * * 5'
+
+jobs:
+ MSDO:
+ # currently only windows latest is supported
+ runs-on: windows-latest
+
+ steps:
+ - uses: actions/checkout@v4
+ - uses: actions/setup-dotnet@v4
+ with:
+ dotnet-version: |
+ 5.0.x
+ 6.0.x
+ - name: Run Microsoft Security DevOps
+ uses: microsoft/security-devops-action@v1.6.0
+ id: msdo
+ - name: Upload results to Security tab
+ uses: github/codeql-action/upload-sarif@v3
+ with:
+ sarif_file: ${{ steps.msdo.outputs.sarifFile }}
diff --git a/.github/workflows/fortify.yml b/.github/workflows/fortify.yml
new file mode 100644
index 0000000000..ff1a25baf2
--- /dev/null
+++ b/.github/workflows/fortify.yml
@@ -0,0 +1,85 @@
+# This workflow uses actions that are not certified by GitHub.
+# They are provided by a third-party and are governed by
+# separate terms of service, privacy policy, and support
+# documentation.
+
+################################################################################################################################################
+# Fortify Application Security provides your team with solutions to empower DevSecOps practices, enable cloud transformation, and secure your #
+# software supply chain. To learn more about Fortify, start a free trial or contact our sales team, visit fortify.com. #
+# #
+# Use this starter workflow as a basis for integrating Fortify Application Security Testing into your GitHub workflows. This template #
+# demonstrates the steps to package the code+dependencies, initiate a scan, and optionally import SAST vulnerabilities into GitHub Security #
+# Code Scanning Alerts. Additional information is available in the workflow comments and the Fortify AST Action / fcli / Fortify product #
+# documentation. If you need additional assistance, please contact Fortify support. #
+################################################################################################################################################
+
+name: Fortify AST Scan
+
+# Customize trigger events based on your DevSecOps process and/or policy
+on:
+ push:
+ branches: [ "master" ]
+ pull_request:
+ # The branches below must be a subset of the branches above
+ branches: [ "master" ]
+ schedule:
+ - cron: '31 12 * * 4'
+ workflow_dispatch:
+
+jobs:
+ Fortify-AST-Scan:
+ # Use the appropriate runner for building your source code. Ensure dev tools required to build your code are present and configured appropriately (MSBuild, Python, etc).
+ runs-on: ubuntu-latest
+ permissions:
+ actions: read
+ contents: read
+ security-events: write
+
+ steps:
+ # Check out source code
+ - name: Check Out Source Code
+ uses: actions/checkout@v4
+
+ # Java is required to run the various Fortify utilities. Ensuring proper version is installed on the runner.
+ - name: Setup Java
+ uses: actions/setup-java@v4
+ with:
+ java-version: 17
+ distribution: 'temurin'
+
+ # Perform SAST and optionally SCA scan via Fortify on Demand/Fortify Hosted/Software Security Center, then
+ # optionally export SAST results to the GitHub code scanning dashboard. In case further customization is
+ # required, you can use sub-actions like fortify/github-action/setup@v1 to set up the various Fortify tools
+ # and run them directly from within your pipeline; see https://github.com/fortify/github-action#readme for
+ # details.
+
+ - name: Run FoD SAST Scan
+ uses: fortify/github-action@a92347297e02391b857e7015792cd1926a4cd418
+ with:
+ sast-scan: true
+ env:
+ ### Required configuration when integrating with Fortify on Demand
+ FOD_URL: https://ams.fortify.com
+ FOD_TENANT: ${{secrets.FOD_TENANT}}
+ FOD_USER: ${{secrets.FOD_USER}}
+ FOD_PASSWORD: ${{secrets.FOD_PAT}}
+ ### Optional configuration when integrating with Fortify on Demand
+ # EXTRA_PACKAGE_OPTS: -oss # Extra 'scancentral package' options, like '-oss'' if
+ # Debricked SCA scan is enabled on Fortify on Demand
+ # EXTRA_FOD_LOGIN_OPTS: --socket-timeout=60s # Extra 'fcli fod session login' options
+ # FOD_RELEASE: MyApp:MyRelease # FoD release name, default: /:; may
+ # replace app+release name with numeric release ID
+ # DO_WAIT: true # Wait for scan completion, implied if 'DO_EXPORT: true'
+ # DO_EXPORT: true # Export SAST results to GitHub code scanning dashboard
+ ### Required configuration when integrating with Fortify Hosted / Software Security Center & ScanCentral
+ # SSC_URL: ${{secrets.SSC_URL}} # SSC URL
+ # SSC_TOKEN: ${{secrets.SSC_TOKEN}} # SSC CIToken or AutomationToken
+ # SC_SAST_TOKEN: ${{secrets.SC_SAST_TOKEN}} # ScanCentral SAST client auth token
+ # SC_SAST_SENSOR_VERSION: ${{vars.SC_SAST_SENSOR_VERSION}} # Sensor version on which to run the scan;
+ # usually defined as organization or repo variable
+ ### Optional configuration when integrating with Fortify Hosted / Software Security Center & ScanCentral
+ # EXTRA_SC_SAST_LOGIN_OPTS: --socket-timeout=60s # Extra 'fcli sc-sast session login' options
+ # SSC_APPVERSION: MyApp:MyVersion # SSC application version, default: /:
+ # EXTRA_PACKAGE_OPTS: -bv myCustomPom.xml # Extra 'scancentral package' options
+ # DO_WAIT: true # Wait for scan completion, implied if 'DO_EXPORT: true'
+ # DO_EXPORT: true # Export SAST results to GitHub code scanning dashboard
diff --git a/.github/workflows/neuralegion.yml b/.github/workflows/neuralegion.yml
new file mode 100644
index 0000000000..33a05d29dc
--- /dev/null
+++ b/.github/workflows/neuralegion.yml
@@ -0,0 +1,177 @@
+# This workflow uses actions that are not certified by GitHub.
+# They are provided by a third-party and are governed by
+# separate terms of service, privacy policy, and support
+# documentation.
+#
+# Run a Nexploit Scan
+# This action runs a new security scan in Nexploit, or reruns an existing one.
+# Build Secure Apps & APIs. Fast.
+# [NeuraLegion](https://www.neuralegion.com) is a powerful dynamic application & API security testing (DAST) platform that security teams trust and developers love.
+# Automatically Tests Every Aspect of Your Apps & APIs
+# Scans any target, whether Web Apps, APIs (REST. & SOAP, GraphQL & more), Web sockets or mobile, providing actionable reports
+# Seamlessly integrates with the Tools and Workflows You Already Use
+#
+# NeuraLegion works with your existing CI/CD pipelines – trigger scans on every commit, pull request or build with unit testing.
+# Spin-Up, Configure and Control Scans with Code
+# One file. One command. One scan. No UI needed.
+#
+# Super-Fast Scans
+#
+# Interacts with applications and APIs, instead of just crawling them and guessing.
+# Scans are fast as our AI-powered engine can understand application architecture and generate sophisticated and targeted attacks.
+#
+# No False Positives
+#
+# Stop chasing ghosts and wasting time. NeuraLegion doesn’t return false positives, so you can focus on releasing code.
+#
+# Comprehensive Security Testing
+#
+# NeuraLegion tests for all common vulnerabilities, such as SQL injection, CSRF, XSS, and XXE -- as well as uncommon vulnerabilities, such as business logic vulnerabilities.
+#
+# More information is available on NeuraLegion’s:
+# * [Website](https://www.neuralegion.com/)
+# * [Knowledge base](https://docs.neuralegion.com/docs/quickstart)
+# * [YouTube channel](https://www.youtube.com/channel/UCoIC0T1pmozq3eKLsUR2uUw)
+# * [GitHub Actions](https://github.com/marketplace?query=neuralegion+)
+#
+# Inputs
+#
+# `name`
+#
+# **Required**. Scan name.
+#
+# _Example:_ `name: GitHub scan ${{ github.sha }}`
+#
+# `api_token`
+#
+# **Required**. Your Nexploit API authorization token (key). You can generate it in the **Organization** section on [nexploit.app](https://nexploit.app/login). Find more information [here](https://kb.neuralegion.com/#/guide/np-web-ui/advanced-set-up/managing-org?id=managing-organization-apicli-authentication-tokens).
+#
+# _Example:_ `api_token: ${{ secrets.NEXPLOIT_TOKEN }}`
+#
+# `restart_scan`
+#
+# **Required** when restarting an existing scan by its ID. You can get the scan ID in the Scans section on [nexploit.app](https://nexploit.app/login). Please make sure to only use the necessary parameters. Otherwise, you will get a response with the parameter usage requirements.
+#
+# _Example:_ `restart_scan: ai3LG8DmVn9Rn1YeqCNRGQ)`
+#
+# `discovery_types`
+#
+# **Required**. Array of discovery types. The following types are available:
+# * `archive` - uses an uploaded HAR-file for a scan
+# * `crawler` - uses a crawler to define the attack surface for a scan
+# * `oas` - uses an uploaded OpenAPI schema for a scan
+# If no discovery type is specified, `crawler` is applied by default.
+#
+# _Example:_
+#
+# ```yml
+# discovery_types: |
+# [ "crawler", "archive" ]
+# ```
+#
+# `file_id`
+#
+# **Required** if the discovery type is set to `archive` or `oas`. ID of a HAR-file or an OpenAPI schema you want to use for a scan. You can get the ID of an uploaded HAR-file or an OpenAPI schema in the **Storage** section on [nexploit.app](https://nexploit.app/login).
+#
+# _Example:_
+#
+# ```
+# FILE_ID=$(nexploit-cli archive:upload \
+# --token ${{ secrets.NEXPLOIT_TOKEN }} \
+# --discard true \
+# ./example.har)
+# ```
+#
+# `crawler_urls`
+#
+# **Required** if the discovery type is set to `crawler`. Target URLs to be used by the crawler to define the attack surface.
+#
+# _Example:_
+#
+# ```
+# crawler_urls: |
+# [ "http://vulnerable-bank.com" ]
+# ```
+#
+# `hosts_filter`
+#
+# **Required** when the the discovery type is set to `archive`. Allows selecting specific hosts for a scan.
+#
+# Outputs
+#
+# `url`
+#
+# Url of the resulting scan
+#
+# `id`
+#
+# ID of the created scan. This ID could then be used to restart the scan, or for the following GitHub actions:
+# * [Nexploit Wait for Issues](https://github.com/marketplace/actions/nexploit-wait-for-issues)
+# * [Nexploit Stop Scan](https://github.com/marketplace/actions/nexploit-stop-scan)
+#
+# Example usage
+#
+# Start a new scan with parameters
+#
+# ```yml
+# steps:
+# - name: Start Nexploit Scan
+# id: start
+# uses: NeuraLegion/run-scan@29ebd17b4fd6292ce7a238a59401668953b37fbe
+# with:
+# api_token: ${{ secrets.NEXPLOIT_TOKEN }}
+# name: GitHub scan ${{ github.sha }}
+# discovery_types: |
+# [ "crawler", "archive" ]
+# crawler_urls: |
+# [ "http://vulnerable-bank.com" ]
+# file_id: LiYknMYSdbSZbqgMaC9Sj
+# hosts_filter: |
+# [ ]
+# - name: Get the output scan url
+# run: echo "The scan was started on ${{ steps.start.outputs.url }}"
+# ```
+#
+# Restart an existing scan
+#
+# ```yml
+# steps:
+# - name: Start Nexploit Scan
+# id: start
+# uses: NeuraLegion/run-scan@29ebd17b4fd6292ce7a238a59401668953b37fbe
+# with:
+# api_token: ${{ secrets.NEXPLOIT_TOKEN }}
+# name: GitHub scan ${{ github.sha }}
+# restart_scan: ai3LG8DmVn9Rn1YeqCNRGQ
+# - name: Get the output scan url
+# run: echo "The scan was started on ${{ steps.start.outputs.url }}"
+
+
+name: "NeuraLegion"
+
+on:
+ push:
+ branches: [ "master" ]
+ pull_request:
+ branches: [ "master" ]
+ schedule:
+ - cron: '31 8 * * 2'
+
+jobs:
+ neuralegion_scan:
+ runs-on: ubuntu-18.04
+ name: A job to run a Nexploit scan
+ permissions:
+ contents: read
+ steps:
+ - uses: actions/checkout@v4
+ - name: Start Nexploit Scan 🏁
+ id: start
+ uses: NeuraLegion/run-scan@29ebd17b4fd6292ce7a238a59401668953b37fbe
+ with:
+ api_token: ${{ secrets.NEURALEGION_TOKEN }}
+ name: GitHub scan ${{ github.sha }}
+ discovery_types: |
+ [ "crawler" ]
+ crawler_urls: |
+ [ "https://brokencrystals.com" ] # ✏️ Update this to the url you wish to scan
diff --git a/.github/workflows/on_pr_pnpm-format-label.yml b/.github/workflows/on_pr_pnpm-format-label.yml
index 84fb27cb3e..b9dda862bc 100644
--- a/.github/workflows/on_pr_pnpm-format-label.yml
+++ b/.github/workflows/on_pr_pnpm-format-label.yml
@@ -12,6 +12,9 @@ jobs:
rm:
if: ${{ github.event.label.name == 'pnpm format' }}
+ permissions:
+ contents: read
+ issues: write
runs-on: ubuntu-latest
steps:
- name: Remove the label
diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index bb22f4c721..6e1bcb9a9d 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -1,6 +1,8 @@
on: [push]
name: tests
+permissions:
+ contents: read
jobs:
install:
@@ -25,17 +27,17 @@ jobs:
tests:
name: Run all tests
runs-on: ubuntu-latest
- needs: [build]
+ needs: [install]
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/install-dependencies
- name: Install Foundry
uses: foundry-rs/foundry-toolchain@v1
with:
- version: v1.5.0
+ version: nightly
+ # Fork latest mainnet state
- name: Start Anvil in background
- run: anvil --fork-url https://nodes.sequence.app/arbitrum &
- - run: pnpm build
+ run: anvil --fork-url https://reth-ethereum.ithaca.xyz/nodes.sequence.app/rpc &
- run: pnpm test
# NOTE: if you'd like to see example of how to run
diff --git a/.gitignore b/.gitignore
index e70ecd7f00..eae85e64a2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -38,4 +38,7 @@ yarn-error.log*
*.pem
# Husky
-.husky/
\ No newline at end of file
+.husky/
+/lib/signals-implicit-mode/Counter
+/lib/signals-implicit-mode/lib/signals-implicit-mode
+.env*.local
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000000..ba34f41974
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,54 @@
+[submodule "lib/solar"]
+ path = lib/solar
+ url = https://github.com/vectorized/solady
+[submodule "counter/lib/forge-std"]
+ path = counter/lib/forge-std
+ url = https://github.com/foundry-rs/forge-std
+[submodule "Counter/lib/forge-std"]
+ path = Counter/lib/forge-std
+ url = https://github.com/foundry-rs/forge-std
+[submodule "dependencies/v4-core"]
+ path = dependencies/v4-core
+ url = https://github.com/uniswap/v4-core
+[submodule "dependencies/v4-periphery"]
+ path = dependencies/v4-periphery
+ url = https://github.com/Uniswap/v4-periphery
+[submodule "dependencies/permit2"]
+ path = dependencies/permit2
+ url = https://github.com/uniswap/permit2
+[submodule "dependencies/universal-router"]
+ path = dependencies/universal-router
+ url = https://github.com/uniswap/universal-router
+[submodule "dependencies/v3-core"]
+ path = dependencies/v3-core
+ url = https://github.com/uniswap/v3-core
+[submodule "dependencies/v2-core"]
+ path = dependencies/v2-core
+ url = https://github.com/uniswap/v2-core
+[submodule "dependencies/openzeppelin-contracts"]
+ path = dependencies/openzeppelin-contracts
+ url = https://github.com/OpenZeppelin/openzeppelin-contracts
+[submodule "dependencies/signals-implicit-mode"]
+ path = dependencies/signals-implicit-mode
+ url = https://github.com/0xsequence/signals-implicit-mode
+[submodule "dependencies/solady"]
+ path = dependencies/solady
+ url = https://github.com/vectorized/solady
+[submodule "dependencies/forge-std"]
+ path = dependencies/forge-std
+ url = https://github.com/foundry-rs/forge-std
+[submodule "dependencies/contracts-library"]
+ path = dependencies/contracts-library
+ url = https://github.com/Dargon789/contracts-library
+[submodule "lib/forge-std"]
+ path = lib/forge-std
+ url = https://github.com/foundry-rs/forge-std
+[submodule "dependencies/ds-test"]
+ path = dependencies/ds-test
+ url = https://github.com/dapphub/ds-test
+[submodule "lib/signals-implicit-mode/lib/signals-implicit-mode"]
+ path = lib/signals-implicit-mode/lib/signals-implicit-mode
+ url = https://github.com/0xsequence/signals-implicit-mode
+[submodule "lib/signals-implicit-mode/lib/signals-implicit-mode"]
+ path = lib/signals-implicit-mode/lib/signals-implicit-mode
+ url = https://github.com/0xsequence/signals-implicit-mode
diff --git a/.hintrc b/.hintrc
new file mode 100644
index 0000000000..12c4655b47
--- /dev/null
+++ b/.hintrc
@@ -0,0 +1,8 @@
+{
+ "extends": [
+ "development"
+ ],
+ "hints": {
+ "typescript-config/strict": "off"
+ }
+}
\ No newline at end of file
diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000000..26d33521af
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,3 @@
+# Default ignored files
+/shelf/
+/workspace.xml
diff --git a/.idea/.name b/.idea/.name
new file mode 100644
index 0000000000..835472432f
--- /dev/null
+++ b/.idea/.name
@@ -0,0 +1 @@
+workspace.xml
\ No newline at end of file
diff --git a/.idea/AICommit.xml b/.idea/AICommit.xml
new file mode 100644
index 0000000000..2fa6456f44
--- /dev/null
+++ b/.idea/AICommit.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/caches/deviceStreaming.xml b/.idea/caches/deviceStreaming.xml
new file mode 100644
index 0000000000..94e429a7a2
--- /dev/null
+++ b/.idea/caches/deviceStreaming.xml
@@ -0,0 +1,2007 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
new file mode 100644
index 0000000000..4bec4ea8ae
--- /dev/null
+++ b/.idea/codeStyles/Project.xml
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ xmlns:android
+
+ ^$
+
+
+
+
+
+
+
+
+ xmlns:.*
+
+ ^$
+
+
+ BY_NAME
+
+
+
+
+
+
+ .*:id
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ .*:name
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ name
+
+ ^$
+
+
+
+
+
+
+
+
+ style
+
+ ^$
+
+
+
+
+
+
+
+
+ .*
+
+ ^$
+
+
+ BY_NAME
+
+
+
+
+
+
+ .*
+
+ http://schemas.android.com/apk/res/android
+
+
+ ANDROID_ATTRIBUTE_ORDER
+
+
+
+
+
+
+ .*
+
+ .*
+
+
+ BY_NAME
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml
new file mode 100644
index 0000000000..a55e7a179b
--- /dev/null
+++ b/.idea/codeStyles/codeStyleConfig.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/copilot.data.migration.ask2agent.xml b/.idea/copilot.data.migration.ask2agent.xml
new file mode 100644
index 0000000000..1f2ea11e7f
--- /dev/null
+++ b/.idea/copilot.data.migration.ask2agent.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 0000000000..50ea44ed90
--- /dev/null
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/jsonSchemas.xml b/.idea/jsonSchemas.xml
new file mode 100644
index 0000000000..583df9543c
--- /dev/null
+++ b/.idea/jsonSchemas.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/markdown.xml b/.idea/markdown.xml
new file mode 100644
index 0000000000..c61ea3346e
--- /dev/null
+++ b/.idea/markdown.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000000..a62e24909f
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000000..5691f15403
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/sequence.js.iml b/.idea/sequence.js.iml
new file mode 100644
index 0000000000..5bf7f4cf07
--- /dev/null
+++ b/.idea/sequence.js.iml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000000..ccc3562890
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
new file mode 100644
index 0000000000..1444d76806
--- /dev/null
+++ b/.idea/workspace.xml
@@ -0,0 +1,137 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {
+ "lastFilter": {}
+}
+ {
+ "prStates": [
+ {
+ "id": {
+ "id": "PR_kwDOFtcLA86MvQBm",
+ "number": 26
+ },
+ "lastSeen": 1773929218845
+ }
+ ]
+}
+ {
+ "selectedUrlAndAccountId": {
+ "url": "git@github.com:0xsequence/demo-dapp.git",
+ "accountId": "901c3c88-76ca-48f1-af81-8988657f5914"
+ }
+}
+
+
+
+
+
+
+ {
+ "associatedIndex": 2
+}
+
+
+
+
+
+ {
+ "keyToString": {
+ "ASKED_SHARE_PROJECT_CONFIGURATION_FILES": "true",
+ "ModuleVcsDetector.initialDetectionPerformed": "true",
+ "RunOnceActivity.ShowReadmeOnStart": "true",
+ "RunOnceActivity.cidr.known.project.marker": "true",
+ "RunOnceActivity.readMode.enableVisualFormatting": "true",
+ "SHARE_PROJECT_CONFIGURATION_FILES": "true",
+ "cf.first.check.clang-format": "false",
+ "cidr.known.project.marker": "true",
+ "com.google.services.firebase.aqiPopupShown": "true",
+ "com.intellij.ml.llm.matterhorn.ej.ui.settings.DefaultModelSelectionForGA.v1": "true",
+ "dart.analysis.tool.window.visible": "false",
+ "git-widget-placeholder": "master",
+ "ignore.virus.scanning.warn.message": "true",
+ "junie.onboarding.icon.badge.shown": "true",
+ "kotlin-language-version-configured": "true",
+ "kronk.content.tree.expanded.paths": "",
+ "last_opened_file_path": "C:/Users/Legion/sequence.js",
+ "project.structure.last.edited": "Project",
+ "project.structure.proportion": "0.0",
+ "project.structure.side.proportion": "0.0",
+ "settings.editor.selected.configurable": "memory.settings",
+ "show.migrate.to.gradle.popup": "false",
+ "to.speed.mode.migration.done": "true"
+ }
+}
+
+
+
+ 1770786009107
+
+
+ 1770786009107
+
+
+
+ 1770790536574
+
+
+
+ 1770790536579
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.nycrc b/.nycrc
new file mode 100644
index 0000000000..9b547ac2db
--- /dev/null
+++ b/.nycrc
@@ -0,0 +1,26 @@
+{
+ "include": [
+ "packages/**/*.ts"
+ ],
+ "exclude": [
+ "**/*.d.ts",
+ "**/dist/*",
+ "**/tests/*",
+ "**/0xsequence/*"
+ ],
+ "extension": [
+ ".ts"
+ ],
+ "require": [
+ "ts-node/register",
+ "babel-core/register"
+ ],
+ "reporter": [
+ "html",
+ "text",
+ "lcov"
+ ],
+ "sourceMap": true,
+ "instrument": true,
+ "all": true
+}
diff --git a/.vscode/launch.json b/.vscode/launch.json
index dc22920a87..585147c876 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -6,8 +6,12 @@
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/packages/wallet/primitives-cli/dist/index.js",
- "args": ["server"],
- "runtimeArgs": ["--enable-source-maps"],
+ "args": [
+ "server"
+ ],
+ "runtimeArgs": [
+ "--enable-source-maps"
+ ],
"cwd": "${workspaceFolder}",
"console": "integratedTerminal",
"sourceMaps": true,
@@ -23,6 +27,56 @@
"../packages/wallet/primitives/src/*": "${workspaceFolder}/packages/wallet/primitives/src/*",
"../packages/wallet/wdk/src/*": "${workspaceFolder}/packages/wallet/wdk/src/*"
}
+ },
+ {
+ "type": "msedge",
+ "name": "Launch Microsoft Edge",
+ "request": "launch",
+ "runtimeArgs": [
+ "--remote-debugging-port=9222"
+ ],
+ "url": "c:\\Users\\Legion\\.vscode\\extensions\\ms-edgedevtools.vscode-edge-devtools-2.1.10\\out\\startpage\\index.html",
+ "presentation": {
+ "hidden": true
+ }
+ },
+ {
+ "type": "msedge",
+ "name": "Launch Microsoft Edge in headless mode",
+ "request": "launch",
+ "runtimeArgs": [
+ "--headless",
+ "--remote-debugging-port=9222"
+ ],
+ "url": "c:\\Users\\Legion\\.vscode\\extensions\\ms-edgedevtools.vscode-edge-devtools-2.1.10\\out\\startpage\\index.html",
+ "presentation": {
+ "hidden": true
+ }
+ },
+ {
+ "type": "vscode-edge-devtools.debug",
+ "name": "Open Edge DevTools",
+ "request": "attach",
+ "url": "c:\\Users\\Legion\\.vscode\\extensions\\ms-edgedevtools.vscode-edge-devtools-2.1.10\\out\\startpage\\index.html",
+ "presentation": {
+ "hidden": true
+ }
+ }
+ ],
+ "compounds": [
+ {
+ "name": "Launch Edge Headless and attach DevTools",
+ "configurations": [
+ "Launch Microsoft Edge in headless mode",
+ "Open Edge DevTools"
+ ]
+ },
+ {
+ "name": "Launch Edge and attach DevTools",
+ "configurations": [
+ "Launch Microsoft Edge",
+ "Open Edge DevTools"
+ ]
}
]
-}
+}
\ No newline at end of file
diff --git a/CNAME b/CNAME
new file mode 100644
index 0000000000..1889d9bae7
--- /dev/null
+++ b/CNAME
@@ -0,0 +1 @@
+sequence.app
diff --git a/FUNDING.json b/FUNDING.json
new file mode 100644
index 0000000000..cb7bbaf783
--- /dev/null
+++ b/FUNDING.json
@@ -0,0 +1,10 @@
+{
+ "drips": {
+ "ethereum": {
+ "ownedBy": "0x9a72807e1BC8A5e1E178f51E26239d58F511EB3D"
+ }
+ },
+ "opRetro": {
+ "projectId": "0x62408999652f3bfa1be746d256bf5a4eb4719b993d40f07d2d60aaebee015018"
+ }
+}
diff --git a/SECURITY.md b/SECURITY.md
new file mode 100644
index 0000000000..c9a2fbd4c1
--- /dev/null
+++ b/SECURITY.md
@@ -0,0 +1,20 @@
+# Security Policy
+
+## Supported Versions
+
+Use this section to tell people about which versions of your project are
+currently being supported with security updates.
+
+| Version | Supported |
+| ------- | ------------------ |
+| 5.1.x | :white_check_mark: |
+| 5.0.x | :x: |
+| 4.0.x | :white_check_mark: |
+| < 4.0 | :x: |
+
+## Reporting a Vulnerability
+
+Use this section to tell people how to report a vulnerability.
+
+To report a vulnerability, please email us at [dev@wevm.dev](mailto:dev@wevm.dev). We aim to provide an initial response within 48 hours and will keep you updated on the status of the reported vulnerability.
+
diff --git a/babel.config.js b/babel.config.js
new file mode 100644
index 0000000000..0a594b952f
--- /dev/null
+++ b/babel.config.js
@@ -0,0 +1,19 @@
+module.exports = {
+ presets: [
+ ['@babel/preset-env', {
+ targets: {
+ modules: true
+ },
+ bugfixes: true,
+ loose: true,
+ exclude: [
+ '@babel/plugin-transform-async-to-generator',
+ '@babel/plugin-transform-regenerator'
+ ]
+ }],
+ '@babel/preset-typescript'
+ ],
+ plugins: [
+ ['@babel/plugin-transform-class-properties', { loose: true }]
+ ]
+}
diff --git a/extras/docs/eslint.config.js b/extras/docs/eslint.config.js
index 0fbeffd979..3d2c2e9d49 100644
--- a/extras/docs/eslint.config.js
+++ b/extras/docs/eslint.config.js
@@ -1,9 +1,4 @@
import { nextJsConfig } from '@repo/eslint-config/next-js'
/** @type {import("eslint").Linter.Config} */
-export default [
- ...nextJsConfig,
- {
- ignores: ['next-env.d.ts'],
- },
-]
+export default nextJsConfig
diff --git a/extras/docs/next-env.d.ts b/extras/docs/next-env.d.ts
new file mode 100644
index 0000000000..830fb594ca
--- /dev/null
+++ b/extras/docs/next-env.d.ts
@@ -0,0 +1,6 @@
+///
+///
+///
+
+// NOTE: This file should not be edited
+// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
diff --git a/extras/docs/next.config.js b/extras/docs/next.config.js
index 2963459c42..1d6147825a 100644
--- a/extras/docs/next.config.js
+++ b/extras/docs/next.config.js
@@ -1,14 +1,4 @@
-import path from 'node:path'
-import { fileURLToPath } from 'node:url'
-
-const __dirname = path.dirname(fileURLToPath(import.meta.url))
-const workspaceRoot = path.join(__dirname, '..', '..')
-
/** @type {import('next').NextConfig} */
-const nextConfig = {
- // Anchor output tracing to the monorepo root so Next.js doesn't pick up
- // sibling lockfiles and mis-detect the workspace boundary during lint/build.
- outputFileTracingRoot: workspaceRoot,
-}
+const nextConfig = {}
export default nextConfig
diff --git a/extras/docs/package.json b/extras/docs/package.json
index d48a68d1e2..eb5768ed0c 100644
--- a/extras/docs/package.json
+++ b/extras/docs/package.json
@@ -13,7 +13,7 @@
},
"dependencies": {
"@repo/ui": "workspace:^",
- "next": "^15.5.14",
+ "next": "^15.5.15",
"react": "^19.2.3",
"react-dom": "^19.2.3"
},
diff --git a/extras/web/app/layout.tsx b/extras/web/app/layout.tsx
index 2e5719345e..a28c1043ea 100644
--- a/extras/web/app/layout.tsx
+++ b/extras/web/app/layout.tsx
@@ -1,5 +1,6 @@
import type { Metadata } from 'next'
import localFont from 'next/font/local'
+import { Analytics } from '@vercel/analytics/next'
import './globals.css'
const geistSans = localFont({
@@ -23,7 +24,10 @@ export default function RootLayout({
}>) {
return (
- {children}
+
+ {children}
+
+
)
}
diff --git a/extras/web/eslint.config.js b/extras/web/eslint.config.js
index 0fbeffd979..3d2c2e9d49 100644
--- a/extras/web/eslint.config.js
+++ b/extras/web/eslint.config.js
@@ -1,9 +1,4 @@
import { nextJsConfig } from '@repo/eslint-config/next-js'
/** @type {import("eslint").Linter.Config} */
-export default [
- ...nextJsConfig,
- {
- ignores: ['next-env.d.ts'],
- },
-]
+export default nextJsConfig
diff --git a/extras/web/next-env.d.ts b/extras/web/next-env.d.ts
new file mode 100644
index 0000000000..698b30224d
--- /dev/null
+++ b/extras/web/next-env.d.ts
@@ -0,0 +1,6 @@
+///
+///
+///
+
+// NOTE: This file should not be edited
+// see https://next's.org/docs/app/api-reference/config/typescript for more information.
diff --git a/extras/web/next.config.js b/extras/web/next.config.js
index 2963459c42..1d6147825a 100644
--- a/extras/web/next.config.js
+++ b/extras/web/next.config.js
@@ -1,14 +1,4 @@
-import path from 'node:path'
-import { fileURLToPath } from 'node:url'
-
-const __dirname = path.dirname(fileURLToPath(import.meta.url))
-const workspaceRoot = path.join(__dirname, '..', '..')
-
/** @type {import('next').NextConfig} */
-const nextConfig = {
- // Anchor output tracing to the monorepo root so Next.js doesn't pick up
- // sibling lockfiles and mis-detect the workspace boundary during lint/build.
- outputFileTracingRoot: workspaceRoot,
-}
+const nextConfig = {}
export default nextConfig
diff --git a/extras/web/package.json b/extras/web/package.json
index 3f2920e881..a4c4edaa72 100644
--- a/extras/web/package.json
+++ b/extras/web/package.json
@@ -13,7 +13,7 @@
},
"dependencies": {
"@repo/ui": "workspace:^",
- "next": "^15.5.14",
+ "next": "^15.5.15",
"react": "^19.2.3",
"react-dom": "^19.2.3"
},
diff --git a/extras/web/tsconfig.json b/extras/web/tsconfig.json
index 7b98032678..d426d59ce9 100644
--- a/extras/web/tsconfig.json
+++ b/extras/web/tsconfig.json
@@ -1,5 +1,5 @@
{
- "extends": "@repo/typescript-config/nextjs.json",
+ "extends": "@repo/typescript-config/next's.json",
"compilerOptions": {
"plugins": [
{
diff --git a/foundry.lock b/foundry.lock
new file mode 100644
index 0000000000..66eebd7048
--- /dev/null
+++ b/foundry.lock
@@ -0,0 +1,68 @@
+{
+ "Counter/lib/forge-std": {
+ "rev": "0768d9c08c085c79bb31d88683a78770764fec49"
+ },
+ "counter/lib/forge-std": {
+ "rev": "8bbcf6e3f8f62f419e5429a0bd89331c85c37824"
+ },
+ "dependencies/contracts-library": {
+ "rev": "8f278d8e55c26abe8d76cebd662c8f815cac2330"
+ },
+ "dependencies/ds-test": {
+ "rev": "e282159d5170298eb2455a6c05280ab5a73a4ef0"
+ },
+ "dependencies/forge-std": {
+ "tag": {
+ "name": "v1.14.0",
+ "rev": "1801b0541f4fda118a10798fd3486bb7051c5dd6"
+ }
+ },
+ "dependencies/openzeppelin-contracts": {
+ "tag": {
+ "name": "v5.5.0",
+ "rev": "fcbae5394ae8ad52d8e580a3477db99814b9d565"
+ }
+ },
+ "dependencies/permit2": {
+ "rev": "cc56ad0f3439c502c246fc5cfcc3db92bb8b7219"
+ },
+ "dependencies/signals-implicit-mode": {
+ "rev": "8d797cd5a963f8374cf780510b79d8350339c04d"
+ },
+ "dependencies/solady": {
+ "tag": {
+ "name": "v0.1.26",
+ "rev": "acd959aa4bd04720d640bf4e6a5c71037510cc4b"
+ }
+ },
+ "dependencies/universal-router": {
+ "rev": "41183d6eb154f0ab0e74a0e911a5ef9ea51fc4bd"
+ },
+ "dependencies/v2-core": {
+ "tag": {
+ "name": "v1.0.1",
+ "rev": "4dd59067c76dea4a0e8e4bfdda41877a6b16dedc"
+ }
+ },
+ "dependencies/v3-core": {
+ "tag": {
+ "name": "v1.0.0",
+ "rev": "e3589b192d0be27e100cd0daaf6c97204fdb1899"
+ }
+ },
+ "dependencies/v4-core": {
+ "tag": {
+ "name": "v4.0.0",
+ "rev": "e50237c43811bd9b526eff40f26772152a42daba"
+ }
+ },
+ "dependencies/v4-periphery": {
+ "rev": "60cd93803ac2b7fa65fd6cd351fd5fd4cc8c9db5"
+ },
+ "lib/solady": {
+ "tag": {
+ "name": "v0.1.26",
+ "rev": "acd959aa4bd04720d640bf4e6a5c71037510cc4b"
+ }
+ }
+}
\ No newline at end of file
diff --git a/foundry.toml b/foundry.toml
new file mode 100644
index 0000000000..f776f544d3
--- /dev/null
+++ b/foundry.toml
@@ -0,0 +1,10 @@
+[profile.default]
+src = "src"
+out = "out"
+libs = ["dependencies"]
+
+[dependencies]
+forge-std = "1.14.0"
+"@openzeppelin-contracts" = "5.0.2"
+
+# See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000000..776f82ddc9
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,3567 @@
+{
+ "name": "sequence-core",
+ "version": "1.0.0",
+ "lockfileVersion": 2,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "sequence-core",
+ "hasInstallScript": true,
+ "license": "Apache-2.0",
+ "devDependencies": {
+ "@changesets/cli": "^2.29.8",
+ "@types/node": "^25.3.0",
+ "lefthook": "^2.1.1",
+ "prettier": "^3.8.1",
+ "rimraf": "^6.1.3",
+ "syncpack": "^14.0.0",
+ "turbo": "^2.8.10",
+ "typescript": "^5.9.3"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.28.4",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz",
+ "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@changesets/apply-release-plan": {
+ "version": "7.0.14",
+ "resolved": "https://registry.npmjs.org/@changesets/apply-release-plan/-/apply-release-plan-7.0.14.tgz",
+ "integrity": "sha512-ddBvf9PHdy2YY0OUiEl3TV78mH9sckndJR14QAt87KLEbIov81XO0q0QAmvooBxXlqRRP8I9B7XOzZwQG7JkWA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@changesets/config": "^3.1.2",
+ "@changesets/get-version-range-type": "^0.4.0",
+ "@changesets/git": "^3.0.4",
+ "@changesets/should-skip-package": "^0.1.2",
+ "@changesets/types": "^6.1.0",
+ "@manypkg/get-packages": "^1.1.3",
+ "detect-indent": "^6.0.0",
+ "fs-extra": "^7.0.1",
+ "lodash.startcase": "^4.4.0",
+ "outdent": "^0.5.0",
+ "prettier": "^2.7.1",
+ "resolve-from": "^5.0.0",
+ "semver": "^7.5.3"
+ }
+ },
+ "node_modules/@changesets/apply-release-plan/node_modules/fs-extra": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
+ "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=6 <7 || >=8"
+ }
+ },
+ "node_modules/@changesets/apply-release-plan/node_modules/jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
+ "dev": true,
+ "license": "MIT",
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/@changesets/apply-release-plan/node_modules/prettier": {
+ "version": "2.8.8",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz",
+ "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "prettier": "bin-prettier.js"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
+ "node_modules/@changesets/apply-release-plan/node_modules/resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@changesets/apply-release-plan/node_modules/semver": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@changesets/apply-release-plan/node_modules/universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/@changesets/assemble-release-plan": {
+ "version": "6.0.9",
+ "resolved": "https://registry.npmjs.org/@changesets/assemble-release-plan/-/assemble-release-plan-6.0.9.tgz",
+ "integrity": "sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@changesets/errors": "^0.2.0",
+ "@changesets/get-dependents-graph": "^2.1.3",
+ "@changesets/should-skip-package": "^0.1.2",
+ "@changesets/types": "^6.1.0",
+ "@manypkg/get-packages": "^1.1.3",
+ "semver": "^7.5.3"
+ }
+ },
+ "node_modules/@changesets/assemble-release-plan/node_modules/semver": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@changesets/changelog-git": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/@changesets/changelog-git/-/changelog-git-0.2.1.tgz",
+ "integrity": "sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@changesets/types": "^6.1.0"
+ }
+ },
+ "node_modules/@changesets/cli": {
+ "version": "2.29.8",
+ "resolved": "https://registry.npmjs.org/@changesets/cli/-/cli-2.29.8.tgz",
+ "integrity": "sha512-1weuGZpP63YWUYjay/E84qqwcnt5yJMM0tep10Up7Q5cS/DGe2IZ0Uj3HNMxGhCINZuR7aO9WBMdKnPit5ZDPA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@changesets/apply-release-plan": "^7.0.14",
+ "@changesets/assemble-release-plan": "^6.0.9",
+ "@changesets/changelog-git": "^0.2.1",
+ "@changesets/config": "^3.1.2",
+ "@changesets/errors": "^0.2.0",
+ "@changesets/get-dependents-graph": "^2.1.3",
+ "@changesets/get-release-plan": "^4.0.14",
+ "@changesets/git": "^3.0.4",
+ "@changesets/logger": "^0.1.1",
+ "@changesets/pre": "^2.0.2",
+ "@changesets/read": "^0.6.6",
+ "@changesets/should-skip-package": "^0.1.2",
+ "@changesets/types": "^6.1.0",
+ "@changesets/write": "^0.4.0",
+ "@inquirer/external-editor": "^1.0.2",
+ "@manypkg/get-packages": "^1.1.3",
+ "ansi-colors": "^4.1.3",
+ "ci-info": "^3.7.0",
+ "enquirer": "^2.4.1",
+ "fs-extra": "^7.0.1",
+ "mri": "^1.2.0",
+ "p-limit": "^2.2.0",
+ "package-manager-detector": "^0.2.0",
+ "picocolors": "^1.1.0",
+ "resolve-from": "^5.0.0",
+ "semver": "^7.5.3",
+ "spawndamnit": "^3.0.1",
+ "term-size": "^2.1.0"
+ },
+ "bin": {
+ "changeset": "bin.js"
+ }
+ },
+ "node_modules/@changesets/cli/node_modules/ci-info": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
+ "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@changesets/cli/node_modules/fs-extra": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
+ "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=6 <7 || >=8"
+ }
+ },
+ "node_modules/@changesets/cli/node_modules/jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
+ "dev": true,
+ "license": "MIT",
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/@changesets/cli/node_modules/resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@changesets/cli/node_modules/semver": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@changesets/cli/node_modules/universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/@changesets/config": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@changesets/config/-/config-3.1.2.tgz",
+ "integrity": "sha512-CYiRhA4bWKemdYi/uwImjPxqWNpqGPNbEBdX1BdONALFIDK7MCUj6FPkzD+z9gJcvDFUQJn9aDVf4UG7OT6Kog==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@changesets/errors": "^0.2.0",
+ "@changesets/get-dependents-graph": "^2.1.3",
+ "@changesets/logger": "^0.1.1",
+ "@changesets/types": "^6.1.0",
+ "@manypkg/get-packages": "^1.1.3",
+ "fs-extra": "^7.0.1",
+ "micromatch": "^4.0.8"
+ }
+ },
+ "node_modules/@changesets/config/node_modules/fs-extra": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
+ "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=6 <7 || >=8"
+ }
+ },
+ "node_modules/@changesets/config/node_modules/jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
+ "dev": true,
+ "license": "MIT",
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/@changesets/config/node_modules/universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/@changesets/errors": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@changesets/errors/-/errors-0.2.0.tgz",
+ "integrity": "sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "extendable-error": "^0.1.5"
+ }
+ },
+ "node_modules/@changesets/get-dependents-graph": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/@changesets/get-dependents-graph/-/get-dependents-graph-2.1.3.tgz",
+ "integrity": "sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@changesets/types": "^6.1.0",
+ "@manypkg/get-packages": "^1.1.3",
+ "picocolors": "^1.1.0",
+ "semver": "^7.5.3"
+ }
+ },
+ "node_modules/@changesets/get-dependents-graph/node_modules/semver": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@changesets/get-release-plan": {
+ "version": "4.0.14",
+ "resolved": "https://registry.npmjs.org/@changesets/get-release-plan/-/get-release-plan-4.0.14.tgz",
+ "integrity": "sha512-yjZMHpUHgl4Xl5gRlolVuxDkm4HgSJqT93Ri1Uz8kGrQb+5iJ8dkXJ20M2j/Y4iV5QzS2c5SeTxVSKX+2eMI0g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@changesets/assemble-release-plan": "^6.0.9",
+ "@changesets/config": "^3.1.2",
+ "@changesets/pre": "^2.0.2",
+ "@changesets/read": "^0.6.6",
+ "@changesets/types": "^6.1.0",
+ "@manypkg/get-packages": "^1.1.3"
+ }
+ },
+ "node_modules/@changesets/get-version-range-type": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@changesets/get-version-range-type/-/get-version-range-type-0.4.0.tgz",
+ "integrity": "sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@changesets/git": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@changesets/git/-/git-3.0.4.tgz",
+ "integrity": "sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@changesets/errors": "^0.2.0",
+ "@manypkg/get-packages": "^1.1.3",
+ "is-subdir": "^1.1.1",
+ "micromatch": "^4.0.8",
+ "spawndamnit": "^3.0.1"
+ }
+ },
+ "node_modules/@changesets/logger": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@changesets/logger/-/logger-0.1.1.tgz",
+ "integrity": "sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "picocolors": "^1.1.0"
+ }
+ },
+ "node_modules/@changesets/parse": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/@changesets/parse/-/parse-0.4.2.tgz",
+ "integrity": "sha512-Uo5MC5mfg4OM0jU3up66fmSn6/NE9INK+8/Vn/7sMVcdWg46zfbvvUSjD9EMonVqPi9fbrJH9SXHn48Tr1f2yA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@changesets/types": "^6.1.0",
+ "js-yaml": "^4.1.1"
+ }
+ },
+ "node_modules/@changesets/pre": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/@changesets/pre/-/pre-2.0.2.tgz",
+ "integrity": "sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@changesets/errors": "^0.2.0",
+ "@changesets/types": "^6.1.0",
+ "@manypkg/get-packages": "^1.1.3",
+ "fs-extra": "^7.0.1"
+ }
+ },
+ "node_modules/@changesets/pre/node_modules/fs-extra": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
+ "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=6 <7 || >=8"
+ }
+ },
+ "node_modules/@changesets/pre/node_modules/jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
+ "dev": true,
+ "license": "MIT",
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/@changesets/pre/node_modules/universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/@changesets/read": {
+ "version": "0.6.6",
+ "resolved": "https://registry.npmjs.org/@changesets/read/-/read-0.6.6.tgz",
+ "integrity": "sha512-P5QaN9hJSQQKJShzzpBT13FzOSPyHbqdoIBUd2DJdgvnECCyO6LmAOWSV+O8se2TaZJVwSXjL+v9yhb+a9JeJg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@changesets/git": "^3.0.4",
+ "@changesets/logger": "^0.1.1",
+ "@changesets/parse": "^0.4.2",
+ "@changesets/types": "^6.1.0",
+ "fs-extra": "^7.0.1",
+ "p-filter": "^2.1.0",
+ "picocolors": "^1.1.0"
+ }
+ },
+ "node_modules/@changesets/read/node_modules/fs-extra": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
+ "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=6 <7 || >=8"
+ }
+ },
+ "node_modules/@changesets/read/node_modules/jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
+ "dev": true,
+ "license": "MIT",
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/@changesets/read/node_modules/universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/@changesets/should-skip-package": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/@changesets/should-skip-package/-/should-skip-package-0.1.2.tgz",
+ "integrity": "sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@changesets/types": "^6.1.0",
+ "@manypkg/get-packages": "^1.1.3"
+ }
+ },
+ "node_modules/@changesets/types": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.1.0.tgz",
+ "integrity": "sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@changesets/write": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@changesets/write/-/write-0.4.0.tgz",
+ "integrity": "sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@changesets/types": "^6.1.0",
+ "fs-extra": "^7.0.1",
+ "human-id": "^4.1.1",
+ "prettier": "^2.7.1"
+ }
+ },
+ "node_modules/@changesets/write/node_modules/fs-extra": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
+ "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=6 <7 || >=8"
+ }
+ },
+ "node_modules/@changesets/write/node_modules/jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
+ "dev": true,
+ "license": "MIT",
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/@changesets/write/node_modules/prettier": {
+ "version": "2.8.8",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz",
+ "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "prettier": "bin-prettier.js"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
+ "node_modules/@changesets/write/node_modules/universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/@inquirer/external-editor": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz",
+ "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "chardet": "^2.1.1",
+ "iconv-lite": "^0.7.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/external-editor/node_modules/iconv-lite": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz",
+ "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/@manypkg/find-root": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@manypkg/find-root/-/find-root-1.1.0.tgz",
+ "integrity": "sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.5.5",
+ "@types/node": "^12.7.1",
+ "find-up": "^4.1.0",
+ "fs-extra": "^8.1.0"
+ }
+ },
+ "node_modules/@manypkg/find-root/node_modules/@types/node": {
+ "version": "12.20.55",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz",
+ "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@manypkg/find-root/node_modules/fs-extra": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
+ "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=6 <7 || >=8"
+ }
+ },
+ "node_modules/@manypkg/find-root/node_modules/jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
+ "dev": true,
+ "license": "MIT",
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/@manypkg/find-root/node_modules/universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/@manypkg/get-packages": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@manypkg/get-packages/-/get-packages-1.1.3.tgz",
+ "integrity": "sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.5.5",
+ "@changesets/types": "^4.0.1",
+ "@manypkg/find-root": "^1.1.0",
+ "fs-extra": "^8.1.0",
+ "globby": "^11.0.0",
+ "read-yaml-file": "^1.1.0"
+ }
+ },
+ "node_modules/@manypkg/get-packages/node_modules/@changesets/types": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/@changesets/types/-/types-4.1.0.tgz",
+ "integrity": "sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@manypkg/get-packages/node_modules/fs-extra": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
+ "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=6 <7 || >=8"
+ }
+ },
+ "node_modules/@manypkg/get-packages/node_modules/globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "dev": true,
+ "license": "MIT",
+ "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/@manypkg/get-packages/node_modules/jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
+ "dev": true,
+ "license": "MIT",
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/@manypkg/get-packages/node_modules/universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "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/@types/node": {
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-25.3.0.tgz",
+ "integrity": "sha512-4K3bqJpXpqfg2XKGK9bpDTc6xO/xoUP/RBWS7AtRMug6zZFaRekiLzjVtAoZMquxoAbzBvy5nxQ7veS5eYzf8A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~7.18.0"
+ }
+ },
+ "node_modules/ansi-colors": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz",
+ "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "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==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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/better-path-resolve": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/better-path-resolve/-/better-path-resolve-1.0.0.tgz",
+ "integrity": "sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-windows": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "dev": true,
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/chardet": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz",
+ "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/cross-spawn/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,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/detect-indent": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz",
+ "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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/enquirer": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz",
+ "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-colors": "^4.1.1",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/extendable-error": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/extendable-error/-/extendable-error-0.1.7.tgz",
+ "integrity": "sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+ "dev": true,
+ "license": "MIT",
+ "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.8"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fastq": {
+ "version": "1.19.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
+ "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "dev": true,
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "dev": true
+ },
+ "node_modules/human-id": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/human-id/-/human-id-4.1.3.tgz",
+ "integrity": "sha512-tsYlhAYpjCKa//8rXZ9DqKEawhPoSytweBC2eNvcaDK+57RZLHGqNs3PZTQO6yekLFSuvA6AlnAfrw1uBvtb+Q==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "human-id": "dist/cli.js"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "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-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-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-subdir": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/is-subdir/-/is-subdir-1.2.0.tgz",
+ "integrity": "sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "better-path-resolve": "1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "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/js-yaml": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
+ "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/lefthook": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/lefthook/-/lefthook-2.1.1.tgz",
+ "integrity": "sha512-Tl9h9c+sG3ShzTHKuR3LAIblnnh+Mgxnm2Ul7yu9cu260Z27LEbO3V6Zw4YZFP59/2rlD42pt/llYsQCkkCFzw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "lefthook": "bin/index.js"
+ },
+ "optionalDependencies": {
+ "lefthook-darwin-arm64": "2.1.1",
+ "lefthook-darwin-x64": "2.1.1",
+ "lefthook-freebsd-arm64": "2.1.1",
+ "lefthook-freebsd-x64": "2.1.1",
+ "lefthook-linux-arm64": "2.1.1",
+ "lefthook-linux-x64": "2.1.1",
+ "lefthook-openbsd-arm64": "2.1.1",
+ "lefthook-openbsd-x64": "2.1.1",
+ "lefthook-windows-arm64": "2.1.1",
+ "lefthook-windows-x64": "2.1.1"
+ }
+ },
+ "node_modules/lefthook-darwin-arm64": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/lefthook-darwin-arm64/-/lefthook-darwin-arm64-2.1.1.tgz",
+ "integrity": "sha512-O/RS1j03/Fnq5zCzEb2r7UOBsqPeBuf1C5pMkIJcO4TSE6hf3rhLUkcorKc2M5ni/n5zLGtzQUXHV08/fSAT3Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/lefthook-darwin-x64": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/lefthook-darwin-x64/-/lefthook-darwin-x64-2.1.1.tgz",
+ "integrity": "sha512-mm/kdKl81ROPoYnj9XYk5JDqj+/6Al8w/SSPDfhItkLJyl4pqS+hWUOP6gDGrnuRk8S0DvJ2+hzhnDsQnZohWQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/lefthook-freebsd-arm64": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/lefthook-freebsd-arm64/-/lefthook-freebsd-arm64-2.1.1.tgz",
+ "integrity": "sha512-F7JXlKmjxGqGbCWPLND0bVB4DMQezIe48pEwTlUQZbxh450c2gP5Q8FdttMZKOT163kBGGTqJAJSEC6zW+QSxA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/lefthook-freebsd-x64": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/lefthook-freebsd-x64/-/lefthook-freebsd-x64-2.1.1.tgz",
+ "integrity": "sha512-Po8/lJMqNzKSZPuEI46dLuWoBoXtAxCuRpeOh6DAV/M4RhBynaCu8rLMZ9BqF7cVbZEWoplOmYo6HdOuiYpCkQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/lefthook-linux-arm64": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/lefthook-linux-arm64/-/lefthook-linux-arm64-2.1.1.tgz",
+ "integrity": "sha512-mI2ljFgPEqHxI8vrN9nKgnVu63Rz1KisDbPwlvs7BTYNwq3sncdK5ukpGR4zzWdh6saNJ5tCtHEtep5GQI11nw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/lefthook-linux-x64": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/lefthook-linux-x64/-/lefthook-linux-x64-2.1.1.tgz",
+ "integrity": "sha512-m3G/FaxC+crxeg9XeaUuHfEoL+i9gbkg2Hp2KD2IcVVIxprqlyqf0Hb8zbLV2NMXuo5RSGokJu44oAoTO3Ou2g==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/lefthook-openbsd-arm64": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/lefthook-openbsd-arm64/-/lefthook-openbsd-arm64-2.1.1.tgz",
+ "integrity": "sha512-gz/8FJPvhjOdOFt1GmFvuvDOe+W+BBRjoeAT1/mTgkN7HCXMXgqNjjvakQKQeGz1I1v08wXG1ZNf5y+T9XBCDQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ]
+ },
+ "node_modules/lefthook-openbsd-x64": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/lefthook-openbsd-x64/-/lefthook-openbsd-x64-2.1.1.tgz",
+ "integrity": "sha512-ch3lyMUtbmtWUufaQVn4IoEs/2hjK51XqaCdY1mh5ca//VctR1peknIwQ5feHu+vATCDviWQ7HsdNDewm3HMPg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ]
+ },
+ "node_modules/lefthook-windows-arm64": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/lefthook-windows-arm64/-/lefthook-windows-arm64-2.1.1.tgz",
+ "integrity": "sha512-mm3PZhKDs9FE/jQDimkfWxtoj9xQ2k8uw2MdhtC825bhvIh+MEi0WFj/MOW+ug0RBg0I55tGYzZ5aVuozAWpTQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/lefthook-windows-x64": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/lefthook-windows-x64/-/lefthook-windows-x64-2.1.1.tgz",
+ "integrity": "sha512-1L2oGIzmhfOTxfwbe5mpSQ+m3ilpvGNymwIhn4UHq6hwHsUL6HEhODqx02GfBn6OXpVIr56bvdBAusjL/SVYGQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/lodash.startcase": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz",
+ "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "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/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/minipass": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz",
+ "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/mri": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz",
+ "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/outdent": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/outdent/-/outdent-0.5.0.tgz",
+ "integrity": "sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/p-filter": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz",
+ "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-map": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/p-filter/node_modules/p-map": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz",
+ "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/package-json-from-dist": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
+ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
+ "dev": true,
+ "license": "BlueOak-1.0.0"
+ },
+ "node_modules/package-manager-detector": {
+ "version": "0.2.11",
+ "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-0.2.11.tgz",
+ "integrity": "sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "quansync": "^0.2.7"
+ }
+ },
+ "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,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-scurry": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz",
+ "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "lru-cache": "^11.0.0",
+ "minipass": "^7.1.2"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/path-scurry/node_modules/lru-cache": {
+ "version": "11.2.6",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz",
+ "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": "20 || >=22"
+ }
+ },
+ "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/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "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": "4.0.1",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/prettier": {
+ "version": "3.8.1",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz",
+ "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "prettier": "bin/prettier.cjs"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
+ "node_modules/quansync": {
+ "version": "0.2.11",
+ "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz",
+ "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/antfu"
+ },
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/sxzz"
+ }
+ ],
+ "license": "MIT"
+ },
+ "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/read-yaml-file": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/read-yaml-file/-/read-yaml-file-1.1.0.tgz",
+ "integrity": "sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.1.5",
+ "js-yaml": "^3.6.1",
+ "pify": "^4.0.1",
+ "strip-bom": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/read-yaml-file/node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "node_modules/read-yaml-file/node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/read-yaml-file/node_modules/js-yaml": {
+ "version": "3.14.2",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz",
+ "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/read-yaml-file/node_modules/sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
+ "dev": true,
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/reusify": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rimraf": {
+ "version": "6.1.3",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.3.tgz",
+ "integrity": "sha512-LKg+Cr2ZF61fkcaK1UdkH2yEBBKnYjTyWzTJT6KNPcSPaiT7HSdhtMXQuN5wkTX0Xu72KQ1l8S42rlmexS2hSA==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "glob": "^13.0.3",
+ "package-json-from-dist": "^1.0.1"
+ },
+ "bin": {
+ "rimraf": "dist/esm/bin.mjs"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/rimraf/node_modules/balanced-match": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
+ "node_modules/rimraf/node_modules/brace-expansion": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz",
+ "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^4.0.2"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
+ "node_modules/rimraf/node_modules/glob": {
+ "version": "13.0.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz",
+ "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "minimatch": "^10.2.2",
+ "minipass": "^7.1.3",
+ "path-scurry": "^2.0.2"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/rimraf/node_modules/minimatch": {
+ "version": "10.2.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.2.tgz",
+ "integrity": "sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "brace-expansion": "^5.0.2"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "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/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "dev": true
+ },
+ "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,
+ "license": "MIT",
+ "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,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "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/spawndamnit": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/spawndamnit/-/spawndamnit-3.0.1.tgz",
+ "integrity": "sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==",
+ "dev": true,
+ "license": "SEE LICENSE IN LICENSE",
+ "dependencies": {
+ "cross-spawn": "^7.0.5",
+ "signal-exit": "^4.0.1"
+ }
+ },
+ "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==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/syncpack": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/syncpack/-/syncpack-14.0.0.tgz",
+ "integrity": "sha512-OfAa3Oip5YC9Ad1jEs92Hw08Wy4JfdpdeequIwaJGsQG0tJtb8gpQfCdLuBefsk6n8WiUdt/5qmzcW+BDXtzbQ==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "syncpack": "index.cjs"
+ },
+ "engines": {
+ "node": ">=14.17.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/JamieMason"
+ },
+ "optionalDependencies": {
+ "syncpack-darwin-arm64": "14.0.0",
+ "syncpack-darwin-x64": "14.0.0",
+ "syncpack-linux-arm64": "14.0.0",
+ "syncpack-linux-arm64-musl": "14.0.0",
+ "syncpack-linux-x64": "14.0.0",
+ "syncpack-linux-x64-musl": "14.0.0",
+ "syncpack-windows-arm64": "14.0.0",
+ "syncpack-windows-x64": "14.0.0"
+ }
+ },
+ "node_modules/syncpack-darwin-arm64": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/syncpack-darwin-arm64/-/syncpack-darwin-arm64-14.0.0.tgz",
+ "integrity": "sha512-mEcku9YkOHfM6JOxhq9McgeLvd4djsJvRwNONZXHeoJ6+yqC96DdxZwFjkw3e8Vn95wsxsrwY5ZjMExs5Gbacw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "funding": {
+ "url": "https://github.com/sponsors/JamieMason"
+ }
+ },
+ "node_modules/syncpack-darwin-x64": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/syncpack-darwin-x64/-/syncpack-darwin-x64-14.0.0.tgz",
+ "integrity": "sha512-qSj3bT3SIZA5NLM5PNVeExapyOrdmptlGSMu0SLVHj9hata/Vqh3xWgwq7wB9uajmlrHljeJ84R/NKAHyzFewA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "funding": {
+ "url": "https://github.com/sponsors/JamieMason"
+ }
+ },
+ "node_modules/syncpack-linux-arm64": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/syncpack-linux-arm64/-/syncpack-linux-arm64-14.0.0.tgz",
+ "integrity": "sha512-votlkb4P/0Bxd9yhBWCSUOjZwaii+LfFn1tZZVN5dfs8qcjcLeqfdG5zbnlJSzZhS3T+BfzejFW+Z95OxZag0A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://github.com/sponsors/JamieMason"
+ }
+ },
+ "node_modules/syncpack-linux-arm64-musl": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/syncpack-linux-arm64-musl/-/syncpack-linux-arm64-musl-14.0.0.tgz",
+ "integrity": "sha512-i57Chz0tHP7ybKElPLhoygl6Cab1fxyUKS9xRgezX5NDrNxKUgrvqBfYd7288/QKB4C8+IcYHugFPjZjoFlAIA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://github.com/sponsors/JamieMason"
+ }
+ },
+ "node_modules/syncpack-linux-x64": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/syncpack-linux-x64/-/syncpack-linux-x64-14.0.0.tgz",
+ "integrity": "sha512-sZGy4+uL+P/+nI0yc9jwW/R22u9lw0+NXDYC/9ts9eYiWFyO4+luOeosvVKbED1OavUp/GQJqNV+9KHjMwq0Fw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://github.com/sponsors/JamieMason"
+ }
+ },
+ "node_modules/syncpack-linux-x64-musl": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/syncpack-linux-x64-musl/-/syncpack-linux-x64-musl-14.0.0.tgz",
+ "integrity": "sha512-RKyp+29UlLGE8oYkd3UfwgjWUHN4dLHDyarv0dS6gWVpWM6qHtHS339KBc9JcIS7FD1vNGnQ3GmSaAodxDlkMA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://github.com/sponsors/JamieMason"
+ }
+ },
+ "node_modules/syncpack-windows-arm64": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/syncpack-windows-arm64/-/syncpack-windows-arm64-14.0.0.tgz",
+ "integrity": "sha512-aNtr0F6HkA7M0azDuDkt//DlPWlplFa4kmvHXirwDmJQ9u3SAvN3ZItW4ZYS96ZbiV1DgO15jIKBI7rDkzcwrQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "funding": {
+ "url": "https://github.com/sponsors/JamieMason"
+ }
+ },
+ "node_modules/syncpack-windows-x64": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/syncpack-windows-x64/-/syncpack-windows-x64-14.0.0.tgz",
+ "integrity": "sha512-usMH61wlonssfh2Q8SJDiiAcsXVzuPzRl8XdHqdavR3XeCSGBIW9ieJpPfiKvDPWslekufWD+GhLNoH+8vV0Cg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "funding": {
+ "url": "https://github.com/sponsors/JamieMason"
+ }
+ },
+ "node_modules/term-size": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz",
+ "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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/turbo": {
+ "version": "2.8.10",
+ "resolved": "https://registry.npmjs.org/turbo/-/turbo-2.8.10.tgz",
+ "integrity": "sha512-OxbzDES66+x7nnKGg2MwBA1ypVsZoDTLHpeaP4giyiHSixbsiTaMyeJqbEyvBdp5Cm28fc+8GG6RdQtic0ijwQ==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "turbo": "bin/turbo"
+ },
+ "optionalDependencies": {
+ "turbo-darwin-64": "2.8.10",
+ "turbo-darwin-arm64": "2.8.10",
+ "turbo-linux-64": "2.8.10",
+ "turbo-linux-arm64": "2.8.10",
+ "turbo-windows-64": "2.8.10",
+ "turbo-windows-arm64": "2.8.10"
+ }
+ },
+ "node_modules/turbo-darwin-64": {
+ "version": "2.8.10",
+ "resolved": "https://registry.npmjs.org/turbo-darwin-64/-/turbo-darwin-64-2.8.10.tgz",
+ "integrity": "sha512-A03fXh+B7S8mL3PbdhTd+0UsaGrhfyPkODvzBDpKRY7bbeac4MDFpJ7I+Slf2oSkCEeSvHKR7Z4U71uKRUfX7g==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/turbo-darwin-arm64": {
+ "version": "2.8.10",
+ "resolved": "https://registry.npmjs.org/turbo-darwin-arm64/-/turbo-darwin-arm64-2.8.10.tgz",
+ "integrity": "sha512-sidzowgWL3s5xCHLeqwC9M3s9M0i16W1nuQF3Mc7fPHpZ+YPohvcbVFBB2uoRRHYZg6yBnwD4gyUHKTeXfwtXA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/turbo-linux-64": {
+ "version": "2.8.10",
+ "resolved": "https://registry.npmjs.org/turbo-linux-64/-/turbo-linux-64-2.8.10.tgz",
+ "integrity": "sha512-YK9vcpL3TVtqonB021XwgaQhY9hJJbKKUhLv16osxV0HkcQASQWUqR56yMge7puh6nxU67rQlTq1b7ksR1T3KA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/turbo-linux-arm64": {
+ "version": "2.8.10",
+ "resolved": "https://registry.npmjs.org/turbo-linux-arm64/-/turbo-linux-arm64-2.8.10.tgz",
+ "integrity": "sha512-3+j2tL0sG95iBJTm+6J8/45JsETQABPqtFyYjVjBbi6eVGdtNTiBmHNKrbvXRlQ3ZbUG75bKLaSSDHSEEN+btQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/turbo-windows-64": {
+ "version": "2.8.10",
+ "resolved": "https://registry.npmjs.org/turbo-windows-64/-/turbo-windows-64-2.8.10.tgz",
+ "integrity": "sha512-hdeF5qmVY/NFgiucf8FW0CWJWtyT2QPm5mIsX0W1DXAVzqKVXGq+Zf+dg4EUngAFKjDzoBeN6ec2Fhajwfztkw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/turbo-windows-arm64": {
+ "version": "2.8.10",
+ "resolved": "https://registry.npmjs.org/turbo-windows-arm64/-/turbo-windows-arm64-2.8.10.tgz",
+ "integrity": "sha512-QGdr/Q8LWmj+ITMkSvfiz2glf0d7JG0oXVzGL3jxkGqiBI1zXFj20oqVY0qWi+112LO9SVrYdpHS0E/oGFrMbQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/typescript": {
+ "version": "5.9.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
+ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "7.18.2",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz",
+ "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==",
+ "dev": true,
+ "license": "MIT"
+ }
+ },
+ "dependencies": {
+ "@babel/runtime": {
+ "version": "7.28.4",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz",
+ "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==",
+ "dev": true
+ },
+ "@changesets/apply-release-plan": {
+ "version": "7.0.14",
+ "resolved": "https://registry.npmjs.org/@changesets/apply-release-plan/-/apply-release-plan-7.0.14.tgz",
+ "integrity": "sha512-ddBvf9PHdy2YY0OUiEl3TV78mH9sckndJR14QAt87KLEbIov81XO0q0QAmvooBxXlqRRP8I9B7XOzZwQG7JkWA==",
+ "dev": true,
+ "requires": {
+ "@changesets/config": "^3.1.2",
+ "@changesets/get-version-range-type": "^0.4.0",
+ "@changesets/git": "^3.0.4",
+ "@changesets/should-skip-package": "^0.1.2",
+ "@changesets/types": "^6.1.0",
+ "@manypkg/get-packages": "^1.1.3",
+ "detect-indent": "^6.0.0",
+ "fs-extra": "^7.0.1",
+ "lodash.startcase": "^4.4.0",
+ "outdent": "^0.5.0",
+ "prettier": "^2.7.1",
+ "resolve-from": "^5.0.0",
+ "semver": "^7.5.3"
+ },
+ "dependencies": {
+ "fs-extra": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
+ "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ }
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "prettier": {
+ "version": "2.8.8",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz",
+ "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
+ "dev": true
+ },
+ "resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true
+ },
+ "semver": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
+ "dev": true
+ },
+ "universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "dev": true
+ }
+ }
+ },
+ "@changesets/assemble-release-plan": {
+ "version": "6.0.9",
+ "resolved": "https://registry.npmjs.org/@changesets/assemble-release-plan/-/assemble-release-plan-6.0.9.tgz",
+ "integrity": "sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ==",
+ "dev": true,
+ "requires": {
+ "@changesets/errors": "^0.2.0",
+ "@changesets/get-dependents-graph": "^2.1.3",
+ "@changesets/should-skip-package": "^0.1.2",
+ "@changesets/types": "^6.1.0",
+ "@manypkg/get-packages": "^1.1.3",
+ "semver": "^7.5.3"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
+ "dev": true
+ }
+ }
+ },
+ "@changesets/changelog-git": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/@changesets/changelog-git/-/changelog-git-0.2.1.tgz",
+ "integrity": "sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==",
+ "dev": true,
+ "requires": {
+ "@changesets/types": "^6.1.0"
+ }
+ },
+ "@changesets/cli": {
+ "version": "2.29.8",
+ "resolved": "https://registry.npmjs.org/@changesets/cli/-/cli-2.29.8.tgz",
+ "integrity": "sha512-1weuGZpP63YWUYjay/E84qqwcnt5yJMM0tep10Up7Q5cS/DGe2IZ0Uj3HNMxGhCINZuR7aO9WBMdKnPit5ZDPA==",
+ "dev": true,
+ "requires": {
+ "@changesets/apply-release-plan": "^7.0.14",
+ "@changesets/assemble-release-plan": "^6.0.9",
+ "@changesets/changelog-git": "^0.2.1",
+ "@changesets/config": "^3.1.2",
+ "@changesets/errors": "^0.2.0",
+ "@changesets/get-dependents-graph": "^2.1.3",
+ "@changesets/get-release-plan": "^4.0.14",
+ "@changesets/git": "^3.0.4",
+ "@changesets/logger": "^0.1.1",
+ "@changesets/pre": "^2.0.2",
+ "@changesets/read": "^0.6.6",
+ "@changesets/should-skip-package": "^0.1.2",
+ "@changesets/types": "^6.1.0",
+ "@changesets/write": "^0.4.0",
+ "@inquirer/external-editor": "^1.0.2",
+ "@manypkg/get-packages": "^1.1.3",
+ "ansi-colors": "^4.1.3",
+ "ci-info": "^3.7.0",
+ "enquirer": "^2.4.1",
+ "fs-extra": "^7.0.1",
+ "mri": "^1.2.0",
+ "p-limit": "^2.2.0",
+ "package-manager-detector": "^0.2.0",
+ "picocolors": "^1.1.0",
+ "resolve-from": "^5.0.0",
+ "semver": "^7.5.3",
+ "spawndamnit": "^3.0.1",
+ "term-size": "^2.1.0"
+ },
+ "dependencies": {
+ "ci-info": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
+ "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+ "dev": true
+ },
+ "fs-extra": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
+ "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ }
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true
+ },
+ "semver": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
+ "dev": true
+ },
+ "universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "dev": true
+ }
+ }
+ },
+ "@changesets/config": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@changesets/config/-/config-3.1.2.tgz",
+ "integrity": "sha512-CYiRhA4bWKemdYi/uwImjPxqWNpqGPNbEBdX1BdONALFIDK7MCUj6FPkzD+z9gJcvDFUQJn9aDVf4UG7OT6Kog==",
+ "dev": true,
+ "requires": {
+ "@changesets/errors": "^0.2.0",
+ "@changesets/get-dependents-graph": "^2.1.3",
+ "@changesets/logger": "^0.1.1",
+ "@changesets/types": "^6.1.0",
+ "@manypkg/get-packages": "^1.1.3",
+ "fs-extra": "^7.0.1",
+ "micromatch": "^4.0.8"
+ },
+ "dependencies": {
+ "fs-extra": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
+ "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ }
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "dev": true
+ }
+ }
+ },
+ "@changesets/errors": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@changesets/errors/-/errors-0.2.0.tgz",
+ "integrity": "sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==",
+ "dev": true,
+ "requires": {
+ "extendable-error": "^0.1.5"
+ }
+ },
+ "@changesets/get-dependents-graph": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/@changesets/get-dependents-graph/-/get-dependents-graph-2.1.3.tgz",
+ "integrity": "sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==",
+ "dev": true,
+ "requires": {
+ "@changesets/types": "^6.1.0",
+ "@manypkg/get-packages": "^1.1.3",
+ "picocolors": "^1.1.0",
+ "semver": "^7.5.3"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
+ "dev": true
+ }
+ }
+ },
+ "@changesets/get-release-plan": {
+ "version": "4.0.14",
+ "resolved": "https://registry.npmjs.org/@changesets/get-release-plan/-/get-release-plan-4.0.14.tgz",
+ "integrity": "sha512-yjZMHpUHgl4Xl5gRlolVuxDkm4HgSJqT93Ri1Uz8kGrQb+5iJ8dkXJ20M2j/Y4iV5QzS2c5SeTxVSKX+2eMI0g==",
+ "dev": true,
+ "requires": {
+ "@changesets/assemble-release-plan": "^6.0.9",
+ "@changesets/config": "^3.1.2",
+ "@changesets/pre": "^2.0.2",
+ "@changesets/read": "^0.6.6",
+ "@changesets/types": "^6.1.0",
+ "@manypkg/get-packages": "^1.1.3"
+ }
+ },
+ "@changesets/get-version-range-type": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@changesets/get-version-range-type/-/get-version-range-type-0.4.0.tgz",
+ "integrity": "sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==",
+ "dev": true
+ },
+ "@changesets/git": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@changesets/git/-/git-3.0.4.tgz",
+ "integrity": "sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==",
+ "dev": true,
+ "requires": {
+ "@changesets/errors": "^0.2.0",
+ "@manypkg/get-packages": "^1.1.3",
+ "is-subdir": "^1.1.1",
+ "micromatch": "^4.0.8",
+ "spawndamnit": "^3.0.1"
+ }
+ },
+ "@changesets/logger": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@changesets/logger/-/logger-0.1.1.tgz",
+ "integrity": "sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==",
+ "dev": true,
+ "requires": {
+ "picocolors": "^1.1.0"
+ }
+ },
+ "@changesets/parse": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/@changesets/parse/-/parse-0.4.2.tgz",
+ "integrity": "sha512-Uo5MC5mfg4OM0jU3up66fmSn6/NE9INK+8/Vn/7sMVcdWg46zfbvvUSjD9EMonVqPi9fbrJH9SXHn48Tr1f2yA==",
+ "dev": true,
+ "requires": {
+ "@changesets/types": "^6.1.0",
+ "js-yaml": "^4.1.1"
+ }
+ },
+ "@changesets/pre": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/@changesets/pre/-/pre-2.0.2.tgz",
+ "integrity": "sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==",
+ "dev": true,
+ "requires": {
+ "@changesets/errors": "^0.2.0",
+ "@changesets/types": "^6.1.0",
+ "@manypkg/get-packages": "^1.1.3",
+ "fs-extra": "^7.0.1"
+ },
+ "dependencies": {
+ "fs-extra": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
+ "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ }
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "dev": true
+ }
+ }
+ },
+ "@changesets/read": {
+ "version": "0.6.6",
+ "resolved": "https://registry.npmjs.org/@changesets/read/-/read-0.6.6.tgz",
+ "integrity": "sha512-P5QaN9hJSQQKJShzzpBT13FzOSPyHbqdoIBUd2DJdgvnECCyO6LmAOWSV+O8se2TaZJVwSXjL+v9yhb+a9JeJg==",
+ "dev": true,
+ "requires": {
+ "@changesets/git": "^3.0.4",
+ "@changesets/logger": "^0.1.1",
+ "@changesets/parse": "^0.4.2",
+ "@changesets/types": "^6.1.0",
+ "fs-extra": "^7.0.1",
+ "p-filter": "^2.1.0",
+ "picocolors": "^1.1.0"
+ },
+ "dependencies": {
+ "fs-extra": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
+ "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ }
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "dev": true
+ }
+ }
+ },
+ "@changesets/should-skip-package": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/@changesets/should-skip-package/-/should-skip-package-0.1.2.tgz",
+ "integrity": "sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==",
+ "dev": true,
+ "requires": {
+ "@changesets/types": "^6.1.0",
+ "@manypkg/get-packages": "^1.1.3"
+ }
+ },
+ "@changesets/types": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.1.0.tgz",
+ "integrity": "sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==",
+ "dev": true
+ },
+ "@changesets/write": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@changesets/write/-/write-0.4.0.tgz",
+ "integrity": "sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==",
+ "dev": true,
+ "requires": {
+ "@changesets/types": "^6.1.0",
+ "fs-extra": "^7.0.1",
+ "human-id": "^4.1.1",
+ "prettier": "^2.7.1"
+ },
+ "dependencies": {
+ "fs-extra": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
+ "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ }
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "prettier": {
+ "version": "2.8.8",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz",
+ "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
+ "dev": true
+ },
+ "universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "dev": true
+ }
+ }
+ },
+ "@inquirer/external-editor": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz",
+ "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==",
+ "dev": true,
+ "requires": {
+ "chardet": "^2.1.1",
+ "iconv-lite": "^0.7.0"
+ },
+ "dependencies": {
+ "iconv-lite": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz",
+ "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==",
+ "dev": true,
+ "requires": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ }
+ }
+ }
+ },
+ "@manypkg/find-root": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@manypkg/find-root/-/find-root-1.1.0.tgz",
+ "integrity": "sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==",
+ "dev": true,
+ "requires": {
+ "@babel/runtime": "^7.5.5",
+ "@types/node": "^12.7.1",
+ "find-up": "^4.1.0",
+ "fs-extra": "^8.1.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "12.20.55",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz",
+ "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==",
+ "dev": true
+ },
+ "fs-extra": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
+ "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ }
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "dev": true
+ }
+ }
+ },
+ "@manypkg/get-packages": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@manypkg/get-packages/-/get-packages-1.1.3.tgz",
+ "integrity": "sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==",
+ "dev": true,
+ "requires": {
+ "@babel/runtime": "^7.5.5",
+ "@changesets/types": "^4.0.1",
+ "@manypkg/find-root": "^1.1.0",
+ "fs-extra": "^8.1.0",
+ "globby": "^11.0.0",
+ "read-yaml-file": "^1.1.0"
+ },
+ "dependencies": {
+ "@changesets/types": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/@changesets/types/-/types-4.1.0.tgz",
+ "integrity": "sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==",
+ "dev": true
+ },
+ "fs-extra": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
+ "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ }
+ },
+ "globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "dev": true,
+ "requires": {
+ "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"
+ }
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "dev": true
+ }
+ }
+ },
+ "@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "requires": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ }
+ },
+ "@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true
+ },
+ "@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "requires": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ }
+ },
+ "@types/node": {
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-25.3.0.tgz",
+ "integrity": "sha512-4K3bqJpXpqfg2XKGK9bpDTc6xO/xoUP/RBWS7AtRMug6zZFaRekiLzjVtAoZMquxoAbzBvy5nxQ7veS5eYzf8A==",
+ "dev": true,
+ "requires": {
+ "undici-types": "~7.18.0"
+ }
+ },
+ "ansi-colors": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz",
+ "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==",
+ "dev": true
+ },
+ "ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true
+ },
+ "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
+ },
+ "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
+ },
+ "better-path-resolve": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/better-path-resolve/-/better-path-resolve-1.0.0.tgz",
+ "integrity": "sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==",
+ "dev": true,
+ "requires": {
+ "is-windows": "^1.0.0"
+ }
+ },
+ "braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "dev": true,
+ "requires": {
+ "fill-range": "^7.1.1"
+ }
+ },
+ "chardet": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz",
+ "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==",
+ "dev": true
+ },
+ "cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "dev": true,
+ "requires": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "dependencies": {
+ "which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ }
+ }
+ },
+ "detect-indent": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz",
+ "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==",
+ "dev": true
+ },
+ "dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dev": true,
+ "requires": {
+ "path-type": "^4.0.0"
+ }
+ },
+ "enquirer": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz",
+ "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==",
+ "dev": true,
+ "requires": {
+ "ansi-colors": "^4.1.1",
+ "strip-ansi": "^6.0.1"
+ }
+ },
+ "extendable-error": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/extendable-error/-/extendable-error-0.1.7.tgz",
+ "integrity": "sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==",
+ "dev": true
+ },
+ "fast-glob": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+ "dev": true,
+ "requires": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.8"
+ }
+ },
+ "fastq": {
+ "version": "1.19.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
+ "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
+ "dev": true,
+ "requires": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "dev": true,
+ "requires": {
+ "to-regex-range": "^5.0.1"
+ }
+ },
+ "find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ }
+ },
+ "glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "requires": {
+ "is-glob": "^4.0.1"
+ }
+ },
+ "graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "dev": true
+ },
+ "human-id": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/human-id/-/human-id-4.1.3.tgz",
+ "integrity": "sha512-tsYlhAYpjCKa//8rXZ9DqKEawhPoSytweBC2eNvcaDK+57RZLHGqNs3PZTQO6yekLFSuvA6AlnAfrw1uBvtb+Q==",
+ "dev": true
+ },
+ "ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "dev": true
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true
+ },
+ "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,
+ "requires": {
+ "is-extglob": "^2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true
+ },
+ "is-subdir": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/is-subdir/-/is-subdir-1.2.0.tgz",
+ "integrity": "sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==",
+ "dev": true,
+ "requires": {
+ "better-path-resolve": "1.0.0"
+ }
+ },
+ "is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
+ "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
+ "dev": true,
+ "requires": {
+ "argparse": "^2.0.1"
+ }
+ },
+ "lefthook": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/lefthook/-/lefthook-2.1.1.tgz",
+ "integrity": "sha512-Tl9h9c+sG3ShzTHKuR3LAIblnnh+Mgxnm2Ul7yu9cu260Z27LEbO3V6Zw4YZFP59/2rlD42pt/llYsQCkkCFzw==",
+ "dev": true,
+ "requires": {
+ "lefthook-darwin-arm64": "2.1.1",
+ "lefthook-darwin-x64": "2.1.1",
+ "lefthook-freebsd-arm64": "2.1.1",
+ "lefthook-freebsd-x64": "2.1.1",
+ "lefthook-linux-arm64": "2.1.1",
+ "lefthook-linux-x64": "2.1.1",
+ "lefthook-openbsd-arm64": "2.1.1",
+ "lefthook-openbsd-x64": "2.1.1",
+ "lefthook-windows-arm64": "2.1.1",
+ "lefthook-windows-x64": "2.1.1"
+ }
+ },
+ "lefthook-darwin-arm64": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/lefthook-darwin-arm64/-/lefthook-darwin-arm64-2.1.1.tgz",
+ "integrity": "sha512-O/RS1j03/Fnq5zCzEb2r7UOBsqPeBuf1C5pMkIJcO4TSE6hf3rhLUkcorKc2M5ni/n5zLGtzQUXHV08/fSAT3Q==",
+ "dev": true,
+ "optional": true
+ },
+ "lefthook-darwin-x64": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/lefthook-darwin-x64/-/lefthook-darwin-x64-2.1.1.tgz",
+ "integrity": "sha512-mm/kdKl81ROPoYnj9XYk5JDqj+/6Al8w/SSPDfhItkLJyl4pqS+hWUOP6gDGrnuRk8S0DvJ2+hzhnDsQnZohWQ==",
+ "dev": true,
+ "optional": true
+ },
+ "lefthook-freebsd-arm64": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/lefthook-freebsd-arm64/-/lefthook-freebsd-arm64-2.1.1.tgz",
+ "integrity": "sha512-F7JXlKmjxGqGbCWPLND0bVB4DMQezIe48pEwTlUQZbxh450c2gP5Q8FdttMZKOT163kBGGTqJAJSEC6zW+QSxA==",
+ "dev": true,
+ "optional": true
+ },
+ "lefthook-freebsd-x64": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/lefthook-freebsd-x64/-/lefthook-freebsd-x64-2.1.1.tgz",
+ "integrity": "sha512-Po8/lJMqNzKSZPuEI46dLuWoBoXtAxCuRpeOh6DAV/M4RhBynaCu8rLMZ9BqF7cVbZEWoplOmYo6HdOuiYpCkQ==",
+ "dev": true,
+ "optional": true
+ },
+ "lefthook-linux-arm64": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/lefthook-linux-arm64/-/lefthook-linux-arm64-2.1.1.tgz",
+ "integrity": "sha512-mI2ljFgPEqHxI8vrN9nKgnVu63Rz1KisDbPwlvs7BTYNwq3sncdK5ukpGR4zzWdh6saNJ5tCtHEtep5GQI11nw==",
+ "dev": true,
+ "optional": true
+ },
+ "lefthook-linux-x64": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/lefthook-linux-x64/-/lefthook-linux-x64-2.1.1.tgz",
+ "integrity": "sha512-m3G/FaxC+crxeg9XeaUuHfEoL+i9gbkg2Hp2KD2IcVVIxprqlyqf0Hb8zbLV2NMXuo5RSGokJu44oAoTO3Ou2g==",
+ "dev": true,
+ "optional": true
+ },
+ "lefthook-openbsd-arm64": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/lefthook-openbsd-arm64/-/lefthook-openbsd-arm64-2.1.1.tgz",
+ "integrity": "sha512-gz/8FJPvhjOdOFt1GmFvuvDOe+W+BBRjoeAT1/mTgkN7HCXMXgqNjjvakQKQeGz1I1v08wXG1ZNf5y+T9XBCDQ==",
+ "dev": true,
+ "optional": true
+ },
+ "lefthook-openbsd-x64": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/lefthook-openbsd-x64/-/lefthook-openbsd-x64-2.1.1.tgz",
+ "integrity": "sha512-ch3lyMUtbmtWUufaQVn4IoEs/2hjK51XqaCdY1mh5ca//VctR1peknIwQ5feHu+vATCDviWQ7HsdNDewm3HMPg==",
+ "dev": true,
+ "optional": true
+ },
+ "lefthook-windows-arm64": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/lefthook-windows-arm64/-/lefthook-windows-arm64-2.1.1.tgz",
+ "integrity": "sha512-mm3PZhKDs9FE/jQDimkfWxtoj9xQ2k8uw2MdhtC825bhvIh+MEi0WFj/MOW+ug0RBg0I55tGYzZ5aVuozAWpTQ==",
+ "dev": true,
+ "optional": true
+ },
+ "lefthook-windows-x64": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/lefthook-windows-x64/-/lefthook-windows-x64-2.1.1.tgz",
+ "integrity": "sha512-1L2oGIzmhfOTxfwbe5mpSQ+m3ilpvGNymwIhn4UHq6hwHsUL6HEhODqx02GfBn6OXpVIr56bvdBAusjL/SVYGQ==",
+ "dev": true,
+ "optional": true
+ },
+ "locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "requires": {
+ "p-locate": "^4.1.0"
+ }
+ },
+ "lodash.startcase": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz",
+ "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==",
+ "dev": true
+ },
+ "merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "dev": true,
+ "requires": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ }
+ },
+ "minipass": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz",
+ "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==",
+ "dev": true
+ },
+ "mri": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz",
+ "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==",
+ "dev": true
+ },
+ "outdent": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/outdent/-/outdent-0.5.0.tgz",
+ "integrity": "sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==",
+ "dev": true
+ },
+ "p-filter": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz",
+ "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==",
+ "dev": true,
+ "requires": {
+ "p-map": "^2.0.0"
+ },
+ "dependencies": {
+ "p-map": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz",
+ "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==",
+ "dev": true
+ }
+ }
+ },
+ "p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "requires": {
+ "p-try": "^2.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "requires": {
+ "p-limit": "^2.2.0"
+ }
+ },
+ "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==",
+ "dev": true
+ },
+ "package-json-from-dist": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
+ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
+ "dev": true
+ },
+ "package-manager-detector": {
+ "version": "0.2.11",
+ "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-0.2.11.tgz",
+ "integrity": "sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==",
+ "dev": true,
+ "requires": {
+ "quansync": "^0.2.7"
+ }
+ },
+ "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
+ },
+ "path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true
+ },
+ "path-scurry": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz",
+ "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^11.0.0",
+ "minipass": "^7.1.2"
+ },
+ "dependencies": {
+ "lru-cache": {
+ "version": "11.2.6",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz",
+ "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==",
+ "dev": true
+ }
+ }
+ },
+ "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
+ },
+ "picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "dev": true
+ },
+ "picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true
+ },
+ "pify": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+ "dev": true
+ },
+ "prettier": {
+ "version": "3.8.1",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz",
+ "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==",
+ "dev": true
+ },
+ "quansync": {
+ "version": "0.2.11",
+ "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz",
+ "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==",
+ "dev": true
+ },
+ "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
+ },
+ "read-yaml-file": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/read-yaml-file/-/read-yaml-file-1.1.0.tgz",
+ "integrity": "sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.5",
+ "js-yaml": "^3.6.1",
+ "pify": "^4.0.1",
+ "strip-bom": "^3.0.0"
+ },
+ "dependencies": {
+ "argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "3.14.2",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz",
+ "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==",
+ "dev": true,
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ }
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
+ "dev": true
+ }
+ }
+ },
+ "reusify": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
+ "dev": true
+ },
+ "rimraf": {
+ "version": "6.1.3",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.3.tgz",
+ "integrity": "sha512-LKg+Cr2ZF61fkcaK1UdkH2yEBBKnYjTyWzTJT6KNPcSPaiT7HSdhtMXQuN5wkTX0Xu72KQ1l8S42rlmexS2hSA==",
+ "dev": true,
+ "requires": {
+ "glob": "^13.0.3",
+ "package-json-from-dist": "^1.0.1"
+ },
+ "dependencies": {
+ "balanced-match": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz",
+ "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^4.0.2"
+ }
+ },
+ "glob": {
+ "version": "13.0.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz",
+ "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==",
+ "dev": true,
+ "requires": {
+ "minimatch": "^10.2.2",
+ "minipass": "^7.1.3",
+ "path-scurry": "^2.0.2"
+ }
+ },
+ "minimatch": {
+ "version": "10.2.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.2.tgz",
+ "integrity": "sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^5.0.2"
+ }
+ }
+ }
+ },
+ "run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "requires": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "dev": true
+ },
+ "shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "requires": {
+ "shebang-regex": "^3.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true
+ },
+ "signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "dev": true
+ },
+ "slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true
+ },
+ "spawndamnit": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/spawndamnit/-/spawndamnit-3.0.1.tgz",
+ "integrity": "sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "^7.0.5",
+ "signal-exit": "^4.0.1"
+ }
+ },
+ "strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.1"
+ }
+ },
+ "strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
+ "dev": true
+ },
+ "syncpack": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/syncpack/-/syncpack-14.0.0.tgz",
+ "integrity": "sha512-OfAa3Oip5YC9Ad1jEs92Hw08Wy4JfdpdeequIwaJGsQG0tJtb8gpQfCdLuBefsk6n8WiUdt/5qmzcW+BDXtzbQ==",
+ "dev": true,
+ "requires": {
+ "syncpack-darwin-arm64": "14.0.0",
+ "syncpack-darwin-x64": "14.0.0",
+ "syncpack-linux-arm64": "14.0.0",
+ "syncpack-linux-arm64-musl": "14.0.0",
+ "syncpack-linux-x64": "14.0.0",
+ "syncpack-linux-x64-musl": "14.0.0",
+ "syncpack-windows-arm64": "14.0.0",
+ "syncpack-windows-x64": "14.0.0"
+ }
+ },
+ "syncpack-darwin-arm64": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/syncpack-darwin-arm64/-/syncpack-darwin-arm64-14.0.0.tgz",
+ "integrity": "sha512-mEcku9YkOHfM6JOxhq9McgeLvd4djsJvRwNONZXHeoJ6+yqC96DdxZwFjkw3e8Vn95wsxsrwY5ZjMExs5Gbacw==",
+ "dev": true,
+ "optional": true
+ },
+ "syncpack-darwin-x64": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/syncpack-darwin-x64/-/syncpack-darwin-x64-14.0.0.tgz",
+ "integrity": "sha512-qSj3bT3SIZA5NLM5PNVeExapyOrdmptlGSMu0SLVHj9hata/Vqh3xWgwq7wB9uajmlrHljeJ84R/NKAHyzFewA==",
+ "dev": true,
+ "optional": true
+ },
+ "syncpack-linux-arm64": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/syncpack-linux-arm64/-/syncpack-linux-arm64-14.0.0.tgz",
+ "integrity": "sha512-votlkb4P/0Bxd9yhBWCSUOjZwaii+LfFn1tZZVN5dfs8qcjcLeqfdG5zbnlJSzZhS3T+BfzejFW+Z95OxZag0A==",
+ "dev": true,
+ "optional": true
+ },
+ "syncpack-linux-arm64-musl": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/syncpack-linux-arm64-musl/-/syncpack-linux-arm64-musl-14.0.0.tgz",
+ "integrity": "sha512-i57Chz0tHP7ybKElPLhoygl6Cab1fxyUKS9xRgezX5NDrNxKUgrvqBfYd7288/QKB4C8+IcYHugFPjZjoFlAIA==",
+ "dev": true,
+ "optional": true
+ },
+ "syncpack-linux-x64": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/syncpack-linux-x64/-/syncpack-linux-x64-14.0.0.tgz",
+ "integrity": "sha512-sZGy4+uL+P/+nI0yc9jwW/R22u9lw0+NXDYC/9ts9eYiWFyO4+luOeosvVKbED1OavUp/GQJqNV+9KHjMwq0Fw==",
+ "dev": true,
+ "optional": true
+ },
+ "syncpack-linux-x64-musl": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/syncpack-linux-x64-musl/-/syncpack-linux-x64-musl-14.0.0.tgz",
+ "integrity": "sha512-RKyp+29UlLGE8oYkd3UfwgjWUHN4dLHDyarv0dS6gWVpWM6qHtHS339KBc9JcIS7FD1vNGnQ3GmSaAodxDlkMA==",
+ "dev": true,
+ "optional": true
+ },
+ "syncpack-windows-arm64": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/syncpack-windows-arm64/-/syncpack-windows-arm64-14.0.0.tgz",
+ "integrity": "sha512-aNtr0F6HkA7M0azDuDkt//DlPWlplFa4kmvHXirwDmJQ9u3SAvN3ZItW4ZYS96ZbiV1DgO15jIKBI7rDkzcwrQ==",
+ "dev": true,
+ "optional": true
+ },
+ "syncpack-windows-x64": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/syncpack-windows-x64/-/syncpack-windows-x64-14.0.0.tgz",
+ "integrity": "sha512-usMH61wlonssfh2Q8SJDiiAcsXVzuPzRl8XdHqdavR3XeCSGBIW9ieJpPfiKvDPWslekufWD+GhLNoH+8vV0Cg==",
+ "dev": true,
+ "optional": true
+ },
+ "term-size": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz",
+ "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==",
+ "dev": true
+ },
+ "to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "^7.0.0"
+ }
+ },
+ "turbo": {
+ "version": "2.8.10",
+ "resolved": "https://registry.npmjs.org/turbo/-/turbo-2.8.10.tgz",
+ "integrity": "sha512-OxbzDES66+x7nnKGg2MwBA1ypVsZoDTLHpeaP4giyiHSixbsiTaMyeJqbEyvBdp5Cm28fc+8GG6RdQtic0ijwQ==",
+ "dev": true,
+ "requires": {
+ "turbo-darwin-64": "2.8.10",
+ "turbo-darwin-arm64": "2.8.10",
+ "turbo-linux-64": "2.8.10",
+ "turbo-linux-arm64": "2.8.10",
+ "turbo-windows-64": "2.8.10",
+ "turbo-windows-arm64": "2.8.10"
+ }
+ },
+ "turbo-darwin-64": {
+ "version": "2.8.10",
+ "resolved": "https://registry.npmjs.org/turbo-darwin-64/-/turbo-darwin-64-2.8.10.tgz",
+ "integrity": "sha512-A03fXh+B7S8mL3PbdhTd+0UsaGrhfyPkODvzBDpKRY7bbeac4MDFpJ7I+Slf2oSkCEeSvHKR7Z4U71uKRUfX7g==",
+ "dev": true,
+ "optional": true
+ },
+ "turbo-darwin-arm64": {
+ "version": "2.8.10",
+ "resolved": "https://registry.npmjs.org/turbo-darwin-arm64/-/turbo-darwin-arm64-2.8.10.tgz",
+ "integrity": "sha512-sidzowgWL3s5xCHLeqwC9M3s9M0i16W1nuQF3Mc7fPHpZ+YPohvcbVFBB2uoRRHYZg6yBnwD4gyUHKTeXfwtXA==",
+ "dev": true,
+ "optional": true
+ },
+ "turbo-linux-64": {
+ "version": "2.8.10",
+ "resolved": "https://registry.npmjs.org/turbo-linux-64/-/turbo-linux-64-2.8.10.tgz",
+ "integrity": "sha512-YK9vcpL3TVtqonB021XwgaQhY9hJJbKKUhLv16osxV0HkcQASQWUqR56yMge7puh6nxU67rQlTq1b7ksR1T3KA==",
+ "dev": true,
+ "optional": true
+ },
+ "turbo-linux-arm64": {
+ "version": "2.8.10",
+ "resolved": "https://registry.npmjs.org/turbo-linux-arm64/-/turbo-linux-arm64-2.8.10.tgz",
+ "integrity": "sha512-3+j2tL0sG95iBJTm+6J8/45JsETQABPqtFyYjVjBbi6eVGdtNTiBmHNKrbvXRlQ3ZbUG75bKLaSSDHSEEN+btQ==",
+ "dev": true,
+ "optional": true
+ },
+ "turbo-windows-64": {
+ "version": "2.8.10",
+ "resolved": "https://registry.npmjs.org/turbo-windows-64/-/turbo-windows-64-2.8.10.tgz",
+ "integrity": "sha512-hdeF5qmVY/NFgiucf8FW0CWJWtyT2QPm5mIsX0W1DXAVzqKVXGq+Zf+dg4EUngAFKjDzoBeN6ec2Fhajwfztkw==",
+ "dev": true,
+ "optional": true
+ },
+ "turbo-windows-arm64": {
+ "version": "2.8.10",
+ "resolved": "https://registry.npmjs.org/turbo-windows-arm64/-/turbo-windows-arm64-2.8.10.tgz",
+ "integrity": "sha512-QGdr/Q8LWmj+ITMkSvfiz2glf0d7JG0oXVzGL3jxkGqiBI1zXFj20oqVY0qWi+112LO9SVrYdpHS0E/oGFrMbQ==",
+ "dev": true,
+ "optional": true
+ },
+ "typescript": {
+ "version": "5.9.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
+ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
+ "dev": true
+ },
+ "undici-types": {
+ "version": "7.18.2",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz",
+ "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==",
+ "dev": true
+ }
+ }
+}
diff --git a/packages/0xsequence/README.md b/packages/0xsequence/README.md
new file mode 100644
index 0000000000..1b4b9e6704
--- /dev/null
+++ b/packages/0xsequence/README.md
@@ -0,0 +1,67 @@
+0xsequence
+==========
+
+## Install
+
+`npm install 0xsequence ethers`
+
+or
+
+`pnpm install 0xsequence ethers`
+
+or
+
+`yarn add 0xsequence ethers`
+
+
+## Development Workflow
+
+Sequence is a critical piece of software and any change should be delivered via a TDD (test-driven development)
+workflow.
+
+As well, sequence.js's monorepo tooling is setup with preconstruct, which links all sub-packages together
+so it feels like a single program and is easy to work with. Please run `pnpm dev` in the root of `sequence.js/`
+folder to ensure the monorepo is in 'dev-mode'.
+
+Second, you can run the test suite directly from console with a single `pnpm test`, or you can boot up the Typescript
+compiling server (`pnpm test:server`) and ethereum test node (`pnpm start:hardhat` and `pnpm start:hardhat2`) manually
+in separate terminals, and then run a specific test directly from your browser instance. We recommend running the
+test stack separately and running specific browser tests manually during development. See [here for recommended setup](./#from-browser).
+
+
+## Running E2E Tests
+
+This 0xsequence top-level package contains e2e tests which run in a headless chrome browser.
+
+You can view tests running directly from the browser directly, or from the cli which will communicate
+to the headless browser behind the scenes. See below. Please note, for an improved development workflow
+we highly recommend to view your tests running from the browser as its more clear and better experience.
+
+
+### From Browser
+
+1. `pnpm test:server` -- in one terminal, to start the webpack server compiling typescript
+2. `pnpm start:hardhat` -- in a second terminal, to start hardhat local ethereum test node
+3. `pnpm start:hardhat2` -- (2nd chain) in a third terminal, to start hardhat2 local ethereum test node
+4. open browser to `http://localhost:9999/{browser-test-dir}/{test-filename}.test.html` for example,
+ http://localhost:9999/wallet-provider/dapp.test.html
+5. open your browser console so you can see the tests running and their results.
+
+Finally, if you'd like to run only a specific test case, either add a temporary "return" statement
+following the last test case, so you will preempt the runner after a certain test case.
+
+As well, since you have all the services running in terminals, you can also execute commands via
+the cli by calling `test:run`, which is similar to step 4 above, but executing all tests from the terminal.
+There is also the `test:only` command if you'd like to execute a specific test from ./tests/browser/*.spec.ts
+file, ie. `pnpm test:only window-transport`.
+
+
+### From CLI
+
+With a single command, you can spin up the testing stack and execute tests:
+
+`pnpm test`
+
+This is useful for a sanity check to ensure tests pass, or using it with the CI. However, if you're
+developing on sequence.js, its highly recommended you follow the [development workflow instructions](./#development-workflow).
+
diff --git a/packages/0xsequence/hardhat.config.js b/packages/0xsequence/hardhat.config.js
new file mode 100644
index 0000000000..88c1e3f0a6
--- /dev/null
+++ b/packages/0xsequence/hardhat.config.js
@@ -0,0 +1,21 @@
+/**
+ * @type import('hardhat/config').HardhatUserConfig
+ */
+module.exports = {
+ solidity: '0.7.6',
+
+ networks: {
+ hardhat: {
+ // gas: 10000000000000,
+ // blockGasLimit: 10000000000000,
+ // gasPrice: 2,
+ initialBaseFeePerGas: 1,
+ chainId: 31337,
+ accounts: {
+ mnemonic: 'ripple axis someone ridge uniform wrist prosper there frog rate olympic knee'
+ },
+ // loggingEnabled: true
+ // verbose: true
+ },
+ }
+}
diff --git a/packages/0xsequence/hardhat2.config.js b/packages/0xsequence/hardhat2.config.js
new file mode 100644
index 0000000000..4ec2897be8
--- /dev/null
+++ b/packages/0xsequence/hardhat2.config.js
@@ -0,0 +1,21 @@
+/**
+ * @type import('hardhat/config').HardhatUserConfig
+ */
+module.exports = {
+ solidity: '0.7.6',
+
+ networks: {
+ hardhat: {
+ // gas: 10000000000000,
+ // blockGasLimit: 10000000000000,
+ // gasPrice: 2,
+ initialBaseFeePerGas: 1,
+ chainId: 31338,
+ accounts: {
+ mnemonic: 'ripple axis someone ridge uniform wrist prosper there frog rate olympic knee'
+ },
+ // loggingEnabled: true
+ // verbose: true
+ },
+ }
+}
diff --git a/packages/0xsequence/src/abi.ts b/packages/0xsequence/src/abi.ts
new file mode 100644
index 0000000000..56f239636f
--- /dev/null
+++ b/packages/0xsequence/src/abi.ts
@@ -0,0 +1 @@
+export * from '@0xsequence/abi'
diff --git a/packages/0xsequence/src/account.ts b/packages/0xsequence/src/account.ts
new file mode 100644
index 0000000000..5378d52938
--- /dev/null
+++ b/packages/0xsequence/src/account.ts
@@ -0,0 +1 @@
+export * from '@0xsequence/account'
diff --git a/packages/0xsequence/src/api.ts b/packages/0xsequence/src/api.ts
new file mode 100644
index 0000000000..157694d571
--- /dev/null
+++ b/packages/0xsequence/src/api.ts
@@ -0,0 +1 @@
+export * from '@0xsequence/api'
diff --git a/packages/0xsequence/src/auth.ts b/packages/0xsequence/src/auth.ts
new file mode 100644
index 0000000000..5ea89b7eae
--- /dev/null
+++ b/packages/0xsequence/src/auth.ts
@@ -0,0 +1 @@
+export * from '@0xsequence/auth'
diff --git a/packages/0xsequence/src/core.ts b/packages/0xsequence/src/core.ts
new file mode 100644
index 0000000000..c9df6528a9
--- /dev/null
+++ b/packages/0xsequence/src/core.ts
@@ -0,0 +1,6 @@
+import { commons } from '@0xsequence/core'
+
+export * from '@0xsequence/core'
+
+export type Config = commons.config.Config
+export type WalletContext = commons.context.WalletContext
diff --git a/packages/0xsequence/src/guard.ts b/packages/0xsequence/src/guard.ts
new file mode 100644
index 0000000000..d91cdc9030
--- /dev/null
+++ b/packages/0xsequence/src/guard.ts
@@ -0,0 +1 @@
+export * from '@0xsequence/guard'
diff --git a/packages/0xsequence/src/index.ts b/packages/0xsequence/src/index.ts
new file mode 100644
index 0000000000..e8f182e4c3
--- /dev/null
+++ b/packages/0xsequence/src/index.ts
@@ -0,0 +1,3 @@
+export * as sequence from './sequence'
+
+export { initWallet } from '@0xsequence/provider'
diff --git a/packages/0xsequence/src/indexer.ts b/packages/0xsequence/src/indexer.ts
new file mode 100644
index 0000000000..e59cb5bcef
--- /dev/null
+++ b/packages/0xsequence/src/indexer.ts
@@ -0,0 +1 @@
+export * from '@0xsequence/indexer'
diff --git a/packages/0xsequence/src/metadata.ts b/packages/0xsequence/src/metadata.ts
new file mode 100644
index 0000000000..cb9f181988
--- /dev/null
+++ b/packages/0xsequence/src/metadata.ts
@@ -0,0 +1 @@
+export * from '@0xsequence/metadata'
diff --git a/packages/0xsequence/src/migration.ts b/packages/0xsequence/src/migration.ts
new file mode 100644
index 0000000000..029dfd7095
--- /dev/null
+++ b/packages/0xsequence/src/migration.ts
@@ -0,0 +1 @@
+export * from '@0xsequence/migration'
diff --git a/packages/0xsequence/src/multicall.ts b/packages/0xsequence/src/multicall.ts
new file mode 100644
index 0000000000..76f619a9cb
--- /dev/null
+++ b/packages/0xsequence/src/multicall.ts
@@ -0,0 +1 @@
+export * from '@0xsequence/multicall'
diff --git a/packages/0xsequence/src/network.ts b/packages/0xsequence/src/network.ts
new file mode 100644
index 0000000000..137b376efd
--- /dev/null
+++ b/packages/0xsequence/src/network.ts
@@ -0,0 +1,14 @@
+export * from '@0xsequence/network'
+
+export type {
+ JsonRpcRequest,
+ JsonRpcResponse,
+ JsonRpcResponseCallback,
+ JsonRpcHandlerFunc,
+ JsonRpcFetchFunc,
+ JsonRpcRequestFunc,
+ JsonRpcMiddleware,
+ JsonRpcMiddlewareHandler,
+ NetworkConfig,
+ ChainIdLike
+} from '@0xsequence/network'
diff --git a/packages/0xsequence/src/provider.ts b/packages/0xsequence/src/provider.ts
new file mode 100644
index 0000000000..65262e5f43
--- /dev/null
+++ b/packages/0xsequence/src/provider.ts
@@ -0,0 +1,29 @@
+export * from '@0xsequence/provider'
+
+export type {
+ SequenceProvider,
+ ProviderConfig,
+ WalletSignInOptions,
+ ProviderTransport,
+ WalletTransport,
+ ProviderMessage,
+ ProviderMessageRequest,
+ ProviderMessageResponse,
+ ProviderMessageResponseCallback,
+ ProviderMessageRequestHandler,
+ ProviderMessageTransport,
+ WalletEventTypes,
+ ProviderEventTypes,
+ EventType,
+ WalletSession,
+ OpenState,
+ ConnectOptions,
+ ConnectDetails,
+ PromptConnectDetails,
+ OpenWalletIntent,
+ ETHAuthProof,
+ ProviderError,
+ MessageToSign,
+ ProviderRpcError,
+ ErrSignedInRequired
+} from '@0xsequence/provider'
diff --git a/packages/0xsequence/src/relayer.ts b/packages/0xsequence/src/relayer.ts
new file mode 100644
index 0000000000..92995de5f8
--- /dev/null
+++ b/packages/0xsequence/src/relayer.ts
@@ -0,0 +1,3 @@
+export * from '@0xsequence/relayer'
+
+export type { Relayer, RpcRelayerProto, RelayerTxReceipt } from '@0xsequence/relayer'
diff --git a/packages/0xsequence/src/sequence.ts b/packages/0xsequence/src/sequence.ts
new file mode 100644
index 0000000000..6eda8e9d93
--- /dev/null
+++ b/packages/0xsequence/src/sequence.ts
@@ -0,0 +1,21 @@
+export * as abi from './abi'
+export * as api from './api'
+export * as auth from './auth'
+export * as guard from './guard'
+export * as indexer from './indexer'
+export * as metadata from './metadata'
+export * as multicall from './multicall'
+export * as network from './network'
+export * as provider from './provider'
+export * as relayer from './relayer'
+export * as transactions from './transactions'
+export * as utils from './utils'
+export * as core from './core'
+export * as signhub from './signhub'
+export * as sessions from './sessions'
+export * as migration from './migration'
+export * as account from './account'
+
+export { initWallet, getWallet, unregisterWallet, SequenceProvider, SequenceClient, SequenceSigner } from '@0xsequence/provider'
+
+export type { ProviderConfig, WalletSession } from '@0xsequence/provider'
diff --git a/packages/0xsequence/src/sessions.ts b/packages/0xsequence/src/sessions.ts
new file mode 100644
index 0000000000..9a4eebe7c0
--- /dev/null
+++ b/packages/0xsequence/src/sessions.ts
@@ -0,0 +1 @@
+export * from '@0xsequence/sessions'
diff --git a/packages/0xsequence/src/signhub.ts b/packages/0xsequence/src/signhub.ts
new file mode 100644
index 0000000000..6c49ae506d
--- /dev/null
+++ b/packages/0xsequence/src/signhub.ts
@@ -0,0 +1 @@
+export * from '@0xsequence/signhub'
diff --git a/packages/0xsequence/src/transactions.ts b/packages/0xsequence/src/transactions.ts
new file mode 100644
index 0000000000..f2b08c462f
--- /dev/null
+++ b/packages/0xsequence/src/transactions.ts
@@ -0,0 +1,10 @@
+import { commons } from '@0xsequence/core'
+
+export const transactions = commons.transaction
+
+export type Transaction = commons.transaction.Transaction
+export type TransactionEncoded = commons.transaction.TransactionEncoded
+export type TransactionResponse = commons.transaction.TransactionResponse
+export type Transactionish = commons.transaction.Transactionish
+export type SignedTransactionBundle = commons.transaction.SignedTransactionBundle
+export type RelayReadyTransactionBundle = commons.transaction.RelayReadyTransactionBundle
diff --git a/packages/0xsequence/src/utils.ts b/packages/0xsequence/src/utils.ts
new file mode 100644
index 0000000000..b82801f35d
--- /dev/null
+++ b/packages/0xsequence/src/utils.ts
@@ -0,0 +1,5 @@
+export * from '@0xsequence/utils'
+
+export { isValidSignature, isValidMessageSignature, isValidTypedDataSignature, isWalletUpToDate } from '@0xsequence/provider'
+
+export type { Deferrable, TypedData, TypedDataDomain, TypedDataField, LogLevel, LoggerConfig } from '@0xsequence/utils'
diff --git a/packages/0xsequence/tests/browser/json-rpc-provider/rpc.test.ts b/packages/0xsequence/tests/browser/json-rpc-provider/rpc.test.ts
new file mode 100644
index 0000000000..1e234ee69b
--- /dev/null
+++ b/packages/0xsequence/tests/browser/json-rpc-provider/rpc.test.ts
@@ -0,0 +1,39 @@
+import { ethers } from 'ethers'
+import { test, assert } from '../../utils/assert'
+
+import { configureLogger } from '@0xsequence/utils'
+import { JsonRpcProvider, loggingProviderMiddleware } from '@0xsequence/network'
+
+configureLogger({ logLevel: 'DEBUG', silence: false })
+
+export const tests = async () => {
+ // const provider = new ethers.providers.JsonRpcProvider('http://localhost:8545', 31337)
+ const provider = new JsonRpcProvider('http://localhost:8545', { chainId: 31337 })
+
+ await test('sending a json-rpc request', async () => {
+ {
+ const network = await provider.getNetwork()
+ console.log('network?', network)
+ }
+ {
+ const chainId = await provider.send('eth_chainId', [])
+ assert.true(ethers.BigNumber.from(chainId).toString() === '31337')
+ }
+ {
+ const chainId = await provider.send('eth_chainId', [])
+ assert.true(ethers.BigNumber.from(chainId).toString() === '31337')
+ }
+ {
+ const chainId = await provider.send('eth_chainId', [])
+ assert.true(ethers.BigNumber.from(chainId).toString() === '31337')
+ }
+ {
+ const chainId = await provider.send('eth_chainId', [])
+ assert.true(ethers.BigNumber.from(chainId).toString() === '31337')
+ }
+ {
+ const netVersion = await provider.send('net_version', [])
+ assert.true(netVersion === '31337')
+ }
+ })
+}
diff --git a/packages/0xsequence/tests/browser/mock-wallet/mock-wallet.test.ts b/packages/0xsequence/tests/browser/mock-wallet/mock-wallet.test.ts
new file mode 100644
index 0000000000..6ee073cb7e
--- /dev/null
+++ b/packages/0xsequence/tests/browser/mock-wallet/mock-wallet.test.ts
@@ -0,0 +1,120 @@
+import { ethers } from 'ethers'
+import { WalletRequestHandler, WindowMessageHandler } from '@0xsequence/provider'
+import { Account } from '@0xsequence/account'
+import { NetworkConfig } from '@0xsequence/network'
+import { LocalRelayer } from '@0xsequence/relayer'
+import { configureLogger } from '@0xsequence/utils'
+
+import { testAccounts, getEOAWallet } from '../testutils'
+import { test, assert } from '../../utils/assert'
+import * as utils from '@0xsequence/tests'
+import { Orchestrator } from '@0xsequence/signhub'
+import { trackers } from '@0xsequence/sessions'
+
+configureLogger({ logLevel: 'DEBUG', silence: false })
+
+//
+// Wallet, a test wallet
+//
+
+const main = async () => {
+ //
+ // Providers
+ //
+ const provider = new ethers.providers.JsonRpcProvider('http://localhost:8545')
+ const provider2 = new ethers.providers.JsonRpcProvider('http://localhost:9545')
+
+ //
+ // Deploy Sequence WalletContext (deterministic)
+ //
+ const deployedWalletContext = await utils.context.deploySequenceContexts(provider.getSigner())
+ await utils.context.deploySequenceContexts(provider2.getSigner())
+
+ // Generate a new wallet every time, otherwise tests will fail
+ // due to EIP-6492 being used only sometimes (some tests deploy the wallet)
+ const owner = ethers.Wallet.createRandom()
+
+ const relayer = new LocalRelayer(getEOAWallet(testAccounts[5].privateKey))
+ const relayer2 = new LocalRelayer(getEOAWallet(testAccounts[5].privateKey, provider2))
+
+ // Network available list
+ const networks: NetworkConfig[] = [
+ {
+ name: 'hardhat',
+ chainId: 31337,
+ rpcUrl: provider.connection.url,
+ provider: provider,
+ relayer: relayer,
+ isDefaultChain: true,
+ nativeToken: {
+ symbol: 'ETH',
+ name: 'Ether',
+ decimals: 18
+ }
+ },
+ {
+ name: 'hardhat2',
+ chainId: 31338,
+ rpcUrl: provider2.connection.url,
+ provider: provider2,
+ relayer: relayer2,
+ nativeToken: {
+ symbol: 'ETH',
+ name: 'Ether',
+ decimals: 18
+ }
+ }
+ ]
+
+ // Account for managing multi-network wallets
+ // TODO: make this a 3-key multisig with threshold of 2
+ // const account = new Account(
+ // {
+ // initialConfig: wallet.config,
+ // networks,
+ // context: deployedWalletContext
+ // },
+ // owner
+ // )
+ const account = await Account.new({
+ config: {
+ threshold: 2,
+ checkpoint: 0,
+ signers: [
+ {
+ address: owner.address,
+ weight: 2
+ }
+ ]
+ },
+ networks,
+ contexts: deployedWalletContext,
+ orchestrator: new Orchestrator([owner]),
+ tracker: new trackers.local.LocalConfigTracker(provider)
+ })
+
+ // the json-rpc signer via the wallet
+ const walletRequestHandler = new WalletRequestHandler(undefined, null, networks)
+
+ // fake/force an async wallet initialization for the wallet-request handler. This is the behaviour
+ // of the wallet-webapp, so lets ensure the mock wallet does the same thing too.
+ setTimeout(() => {
+ walletRequestHandler.signIn(account)
+ }, 1000)
+
+ // setup and register window message transport
+ const windowHandler = new WindowMessageHandler(walletRequestHandler)
+ windowHandler.register()
+}
+
+main()
+
+export const tests = async () => {
+ // TODO: add tests() method to verify some wallet functionality such a login
+ // and adding / removing keys, etc..
+ // + mock in a RemoteSigner as well.
+
+ await test('stub', async () => {
+ assert.true(true, 'ok')
+ })
+}
diff --git a/packages/0xsequence/tests/browser/mux-transport/mux.test.ts b/packages/0xsequence/tests/browser/mux-transport/mux.test.ts
new file mode 100644
index 0000000000..d691143764
--- /dev/null
+++ b/packages/0xsequence/tests/browser/mux-transport/mux.test.ts
@@ -0,0 +1,175 @@
+import {
+ WalletRequestHandler,
+ ProxyMessageChannel,
+ ProxyMessageHandler,
+ WindowMessageHandler,
+ SequenceClient,
+ MemoryItemStore
+} from '@0xsequence/provider'
+import { ethers } from 'ethers'
+import { test, assert } from '../../utils/assert'
+import { NetworkConfig } from '@0xsequence/network'
+import { LocalRelayer } from '@0xsequence/relayer'
+import { configureLogger } from '@0xsequence/utils'
+import { testAccounts, getEOAWallet } from '../testutils'
+import * as utils from '@0xsequence/tests'
+import { Account } from '@0xsequence/account'
+import { Orchestrator } from '@0xsequence/signhub'
+import { trackers } from '@0xsequence/sessions'
+import { commons } from '@0xsequence/core'
+
+configureLogger({ logLevel: 'DEBUG', silence: false })
+
+// Tests simulates a multi-message provider environment by having a wallet available via the
+// proxy channel and wallet window.
+export const tests = async () => {
+ //
+ // Providers
+ //
+ const provider1 = new ethers.providers.JsonRpcProvider('http://localhost:8545')
+ const provider2 = new ethers.providers.JsonRpcProvider('http://localhost:9545')
+
+ //
+ // Deploy Sequence WalletContext (deterministic).
+ //
+ const deployedWalletContext = await utils.context.deploySequenceContexts(provider1.getSigner())
+ await utils.context.deploySequenceContexts(provider2.getSigner())
+ console.log('walletContext:', deployedWalletContext)
+
+ //
+ // Proxy Channel (normally would be out-of-band)
+ //
+ const ch = new ProxyMessageChannel()
+
+ //
+ // Wallet Handler (local mock wallet, same a mock-wallet tests)
+ //
+
+ // owner account address: 0x4e37E14f5d5AAC4DF1151C6E8DF78B7541680853
+ const owner = getEOAWallet(testAccounts[0].privateKey)
+
+ // relayers, account address: 0x3631d4d374c3710c3456d6b1de1ee8745fbff8ba
+ // const relayerAccount = getEOAWallet(testAccounts[5].privateKey)
+ const relayer1 = new LocalRelayer(getEOAWallet(testAccounts[5].privateKey))
+ const relayer2 = new LocalRelayer(getEOAWallet(testAccounts[5].privateKey, provider2))
+
+ // Network available list
+ const networks: NetworkConfig[] = [
+ {
+ name: 'hardhat',
+ chainId: 31337,
+ rpcUrl: provider1.connection.url,
+ provider: provider1,
+ relayer: relayer1,
+ isDefaultChain: true
+ },
+ {
+ name: 'hardhat2',
+ chainId: 31338,
+ rpcUrl: provider2.connection.url,
+ provider: provider2,
+ relayer: relayer2
+ }
+ ]
+
+ // Account for managing multi-network wallets
+ const saccount = await Account.new({
+ networks,
+ contexts: deployedWalletContext,
+ config: {
+ threshold: 1,
+ checkpoint: 0,
+ signers: [
+ {
+ address: owner.address,
+ weight: 1
+ }
+ ]
+ },
+ orchestrator: new Orchestrator([owner]),
+ tracker: new trackers.local.LocalConfigTracker(provider1)
+ })
+
+ // the rpc signer via the wallet
+ const walletRequestHandler = new WalletRequestHandler(saccount, null, networks)
+
+ // register wallet message handler, in this case using the ProxyMessage transport.
+ const proxyHandler = new ProxyMessageHandler(walletRequestHandler, ch.wallet)
+ proxyHandler.register()
+
+ // register window message transport
+ const windowHandler = new WindowMessageHandler(walletRequestHandler)
+ windowHandler.register()
+
+ //
+ // Dapp, wallet provider and dapp tests
+ //
+
+ // wallet client with multiple message provider transports enabled
+ const client = new SequenceClient(
+ {
+ windowTransport: { enabled: true },
+ proxyTransport: { enabled: true, appPort: ch.app }
+ },
+ new MemoryItemStore(),
+ {
+ defaultChainId: 31337
+ }
+ )
+
+ // provider + signer, by default if a chainId is not specified it will direct
+ // requests to the defaultChain
+ // const provider = wallet.getProvider()
+ // const signer = wallet.getSigner()
+
+ // clear it in case we're testing in browser session
+ client.disconnect()
+
+ await test('is disconnected / logged out', async () => {
+ assert.false(client.isConnected(), 'is logged out')
+ })
+
+ await test('is closed', async () => {
+ assert.false(client.isOpened(), 'is closed')
+ })
+
+ await test('connect', async () => {
+ const { connected } = await client.connect({
+ app: 'test',
+ keepWalletOpened: true
+ })
+
+ assert.true(connected, 'is connected')
+ })
+
+ await test('isOpened', async () => {
+ assert.true(client.isOpened(), 'is opened')
+ })
+
+ await test('isConnected', async () => {
+ assert.true(client.isConnected(), 'is connected')
+ })
+
+ await test('open wallet while its already opened', async () => {
+ // its already opened, but lets do it again
+ const opened = await client.openWallet()
+ assert.true(opened, 'wallet is opened')
+ })
+
+ let walletContext: commons.context.VersionedContext
+ await test('getWalletContext', async () => {
+ walletContext = await client.getWalletContext()
+ assert.equal(walletContext[2].factory, deployedWalletContext[2].factory, 'wallet context factory')
+ assert.equal(walletContext[2].guestModule, deployedWalletContext[2].guestModule, 'wallet context guestModule')
+ })
+
+ await test('getChainId', async () => {
+ const chainId = client.getChainId()
+ assert.equal(chainId, 31337, 'chainId is correct')
+ })
+
+ await test('switch chains', async () => {
+ client.setDefaultChainId(31338)
+ assert.equal(client.getChainId(), 31338, 'chainId of other chain is 31338')
+ })
+}
diff --git a/packages/0xsequence/tests/browser/proxy-transport/channel.test.ts b/packages/0xsequence/tests/browser/proxy-transport/channel.test.ts
new file mode 100644
index 0000000000..ae8e56f77b
--- /dev/null
+++ b/packages/0xsequence/tests/browser/proxy-transport/channel.test.ts
@@ -0,0 +1,172 @@
+import {
+ SequenceClient,
+ ProxyMessageProvider,
+ WalletRequestHandler,
+ ProxyMessageChannel,
+ ProxyMessageHandler,
+ prefixEIP191Message,
+ MemoryItemStore
+} from '@0xsequence/provider'
+import { ethers } from 'ethers'
+import { test, assert } from '../../utils/assert'
+import { LocalRelayer } from '@0xsequence/relayer'
+import { configureLogger, encodeMessageDigest } from '@0xsequence/utils'
+import { testAccounts, getEOAWallet } from '../testutils'
+import { Account } from '@0xsequence/account'
+import * as utils from '@0xsequence/tests'
+import { Orchestrator } from '@0xsequence/signhub'
+import { trackers } from '@0xsequence/sessions'
+import { commons } from '@0xsequence/core'
+
+configureLogger({ logLevel: 'DEBUG', silence: false })
+
+export const tests = async () => {
+ // ProxyMessageChannel object is to be instantiated by the app coordinating
+ // the channel, ie. such as the mobile application itself.
+ //
+ // `ch.app` (port) will be injected into the app, and `ch.wallet` (port) will be injected into the wallet.
+ //
+ // Sending messages to the app port will go through channel and get received by the wallet.
+ // Sending messages to the wallet port will go through channel and get received by the app.
+ const ch = new ProxyMessageChannel()
+
+ ch.app.on('open', openInfo => {
+ console.log('app, wallet opened.', openInfo)
+ })
+ ch.app.on('close', () => {
+ console.log('app, wallet closed.')
+ })
+ ch.app.on('connect', () => {
+ console.log('app, wallet connected.')
+ })
+ ch.app.on('disconnect', () => {
+ console.log('app, wallet disconnected.')
+ })
+ // ch.wallet.on('open', () => {
+ // console.log('wallet, wallet opened.')
+ // })
+ // ch.wallet.on('close', () => {
+ // console.log('wallet, wallet closed.')
+ // })
+ // ch.wallet.on('connect', () => {
+ // console.log('wallet, wallet connected.')
+ // })
+ // ch.wallet.on('disconnect', () => {
+ // console.log('wallet, wallet disconnected.')
+ // })
+
+ //
+ // Wallet Handler
+ //
+
+ // owner account address: 0x4e37E14f5d5AAC4DF1151C6E8DF78B7541680853
+ const owner = getEOAWallet(testAccounts[0].privateKey)
+
+ // relayer account is same as owner here
+ const relayer = new LocalRelayer(owner)
+ const rpcProvider = new ethers.providers.JsonRpcProvider('http://localhost:8545')
+ const contexts = await utils.context.deploySequenceContexts(rpcProvider.getSigner())
+
+ const networks = [
+ {
+ name: 'hardhat',
+ chainId: 31337,
+ rpcUrl: rpcProvider.connection.url,
+ provider: rpcProvider,
+ relayer: relayer,
+ isDefaultChain: true
+ }
+ ]
+
+ // wallet account address: 0x91A858FbBa42E7EE200b4303b1A8B2F0BD139663 based on the chainId
+ const account = await Account.new({
+ config: {
+ threshold: 1,
+ checkpoint: 1674142220,
+ signers: [
+ {
+ address: owner.address,
+ weight: 1
+ }
+ ]
+ },
+ networks,
+ contexts,
+ orchestrator: new Orchestrator([owner]),
+ tracker: new trackers.local.LocalConfigTracker(rpcProvider)
+ })
+
+ // the rpc signer via the wallet
+ const walletRequestHandler = new WalletRequestHandler(undefined, null, networks)
+
+ // register wallet message handler, in this case using the ProxyMessage transport.
+ const proxyHandler = new ProxyMessageHandler(walletRequestHandler, ch.wallet)
+ proxyHandler.register()
+
+ //
+ // App Provider
+ //
+ const walletProvider = new ProxyMessageProvider(ch.app)
+ walletProvider.register()
+
+ // setup web3 provider
+ const client = new SequenceClient(walletProvider, new MemoryItemStore(), { defaultChainId: 31337 })
+ const connectPromise = client.connect({ app: 'proxy-transport-channel test', keepWalletOpened: true })
+
+ // fake/force an async wallet initialization for the wallet-request handler. This is the behaviour
+ // of the wallet-webapp, so lets ensure the mock wallet does the same thing too.
+ walletRequestHandler.signIn(account, { connect: true })
+
+ await connectPromise
+
+ const address = client.getAddress()
+
+ await test('verifying getAddress result', async () => {
+ assert.equal(address, ethers.utils.getAddress('0x91A858FbBa42E7EE200b4303b1A8B2F0BD139663'), 'wallet address')
+ })
+
+ await test('sending a json-rpc request', async () => {
+ await walletProvider.sendAsync({ jsonrpc: '2.0', id: 88, method: 'eth_accounts', params: [] }, (err, resp) => {
+ assert.true(!err, 'error is empty')
+ assert.true(!!resp, 'response successful')
+ assert.true(resp!.result == address, 'response address check')
+ })
+ })
+
+ await test('get chain id', async () => {
+ const chainIdClient = client.getChainId()
+ assert.equal(chainIdClient, 31337, 'chain id match')
+
+ const netVersion = await client.send({ method: 'net_version' })
+ assert.equal(netVersion, '31337', 'net_version check')
+
+ const chainId = await client.send({ method: 'eth_chainId' })
+ assert.equal(chainId, '0x7a69', 'eth_chainId check')
+ })
+
+ await test('sign a message and validate/recover', async () => {
+ const message = ethers.utils.toUtf8Bytes('hihi')
+
+ //
+ // Sign the message
+ //
+ const sig = await client.signMessage(message)
+ assert.equal(
+ sig,
+ '0x000163c9620c0001045ea593a25d0053816f2cfb0239eb04c30cc08fd26193927bf6cf68f7f31a8239ecbcbd1365f18a6bf2bf3b13d544c91d85e35503696a28fcb96a4078a7556a1c02',
+ 'signature match'
+ )
+
+ const reader = new commons.reader.OnChainReader(rpcProvider)
+
+ //
+ // Verify the message signature
+ //
+ await account.doBootstrap(31337)
+ const messageDigest = encodeMessageDigest(prefixEIP191Message(message))
+ const isValid = await reader.isValidSignature(address, messageDigest, sig)
+ assert.true(isValid, 'signature is valid - 1')
+ })
+
+ walletProvider.closeWallet()
+}
diff --git a/packages/0xsequence/tests/browser/testutils/accounts.ts b/packages/0xsequence/tests/browser/testutils/accounts.ts
new file mode 100644
index 0000000000..1b8ad32e50
--- /dev/null
+++ b/packages/0xsequence/tests/browser/testutils/accounts.ts
@@ -0,0 +1,44 @@
+import { ethers, Wallet as EOAWallet, providers } from 'ethers'
+
+// testAccounts with 10000 ETH each
+export const testAccounts = [
+ {
+ address: '0x4e37e14f5d5aac4df1151c6e8df78b7541680853',
+ privateKey: '0xcd0434442164a4a6ef9bb677da8dc326fddf412cad4df65e1a3f2555aee5e2b3'
+ },
+ {
+ address: '0x8a6e090a13d2dc04f87a127699952ce2d4428cd9',
+ privateKey: '0x15d476cba8e6a981e77a00fa22a06ce7f418b80dbb3cb2860f67ea811da9b108'
+ },
+ {
+ address: '0xf1fc4872058b066578008519970b7e789eea5040',
+ privateKey: '0x5b7ce9d034f2d2d8cc5667fcd5986db6e4c1e73b51bc84d61fa0b197068e381a'
+ },
+ {
+ address: '0x4875692d103162f4e29ccdd5678806043d3f16c7',
+ privateKey: '0x02173b01073b895fa3f92335658b4b1bbb3686c06193069b5c5914157f6a360a'
+ },
+ {
+ address: '0xf4b294d1fce145a73ce91b860b871e77573957e5',
+ privateKey: '0xbbbf16b45613564ad7bff353d4cb9e249f5a6d6ac2ef27a256ffafb9afaf8d58'
+ },
+ {
+ address: '0x3631d4d374c3710c3456d6b1de1ee8745fbff8ba',
+ privateKey: '0x2c527b40d4db8eff67de1b6b583b5e15037d0e02f88143668e5626039199da48'
+ }
+]
+
+export const getEOAWallet = (privateKey: string, provider?: string | ethers.providers.Provider): EOAWallet => {
+ // defaults
+ if (!provider) {
+ provider = 'http://localhost:8545'
+ }
+
+ const wallet = new EOAWallet(privateKey)
+
+ if (typeof provider === 'string') {
+ return wallet.connect(new providers.JsonRpcProvider(provider))
+ } else {
+ return wallet.connect(provider)
+ }
+}
diff --git a/packages/0xsequence/tests/browser/testutils/deploy-wallet-context.ts b/packages/0xsequence/tests/browser/testutils/deploy-wallet-context.ts
new file mode 100644
index 0000000000..58bdeb1aa3
--- /dev/null
+++ b/packages/0xsequence/tests/browser/testutils/deploy-wallet-context.ts
@@ -0,0 +1,79 @@
+// import { ethers } from 'ethers'
+// import { UniversalDeployer } from '@0xsequence/deployer'
+// import { WalletContext } from '@0xsequence/network'
+// import { testAccounts, getEOAWallet } from './accounts'
+
+// // TODO/NOTE: it should be possible to import below from just '@0xsequence/wallet-contracts'
+// // however, experiencing a strange JS packaging/module resolution issue which leads to:
+// //
+// // mock-wallet.test.js:70822 Uncaught (in promise) TypeError: Class constructor ContractFactory cannot be invoked without 'new'
+// //
+// // by importing from '@0xsequence/wallet-contracts/gen/typechain', this issue goes away
+
+// import {
+// Factory__factory,
+// MainModule__factory,
+// MainModuleUpgradable__factory,
+// GuestModule__factory,
+// SequenceUtils__factory,
+// RequireFreshSigner__factory,
+// } from '@0xsequence/wallet-contracts'
+
+// const deployWalletContextCache: WalletContext[] = []
+
+// // deployWalletContext will deploy the Sequence WalletContext via the UniversalDeployer
+// // which will return deterministic contract addresses between calls.
+// export const deployWalletContext = async (...providers: ethers.providers.JsonRpcProvider[]): Promise => {
+// if (!providers || providers.length === 0) {
+// providers.push(new ethers.providers.JsonRpcProvider('http://localhost:8545'))
+// }
+
+// // Memoize the result. Even though its universal/deterministic, caching the result
+// // offers greater efficiency between calls
+// if (deployWalletContextCache.length === providers.length) {
+// return deployWalletContextCache[0]
+// }
+
+// await Promise.all(providers.map(async provider => {
+// // Deploying test accounts with the first test account
+// const wallet = getEOAWallet(testAccounts[0].privateKey, provider)
+
+// // Universal deployer for deterministic contract addresses
+// const universalDeployer = new UniversalDeployer('local', wallet.provider as ethers.providers.JsonRpcProvider)
+// const txParams = { gasLimit: 8000000, gasPrice: ethers.BigNumber.from(10).pow(9).mul(10) }
+
+// const walletFactory = await universalDeployer.deploy('WalletFactory', Factory__factory as any, txParams)
+// const mainModule = await universalDeployer.deploy('MainModule', MainModule__factory as any, txParams, 0, walletFactory.address)
+
+// await universalDeployer.deploy('MainModuleUpgradable', MainModuleUpgradable__factory as any, txParams)
+// await universalDeployer.deploy('GuestModule', GuestModule__factory as any, txParams)
+
+// const sequenceUtils = await universalDeployer.deploy('SequenceUtils', SequenceUtils__factory as any, txParams, 0, walletFactory.address, mainModule.address)
+// await universalDeployer.deploy('RequireFreshSignerLib', RequireFreshSigner__factory as any, txParams, 0, sequenceUtils.address)
+
+// const deployment = universalDeployer.getDeployment()
+
+// deployWalletContextCache.push({
+// factory: deployment['WalletFactory'].address,
+// mainModule: deployment['MainModule'].address,
+// mainModuleUpgradable: deployment['MainModuleUpgradable'].address,
+// guestModule: deployment['GuestModule'].address,
+// sequenceUtils: deployment['SequenceUtils'].address,
+// libs: {
+// requireFreshSigner: deployment['RequireFreshSignerLib'].address
+// }
+// })
+// }))
+
+// return deployWalletContextCache[0]
+// }
+
+// // testWalletContext is determined by the `deployWalletContext` method above. We can use this
+// // across instances, but, we must ensure the contracts are deployed by the mock-wallet at least.
+// export const testWalletContext: WalletContext = {
+// factory: "0xf9D09D634Fb818b05149329C1dcCFAeA53639d96",
+// guestModule: "0x02390F3E6E5FD1C6786CB78FD3027C117a9955A7",
+// mainModule: "0xd01F11855bCcb95f88D7A48492F66410d4637313",
+// mainModuleUpgradable: "0x7EFE6cE415956c5f80C6530cC6cc81b4808F6118",
+// sequenceUtils: "0xd130B43062D875a4B7aF3f8fc036Bc6e9D3E1B3E"
+// }
diff --git a/packages/0xsequence/tests/browser/testutils/index.ts b/packages/0xsequence/tests/browser/testutils/index.ts
new file mode 100644
index 0000000000..63f7cc82aa
--- /dev/null
+++ b/packages/0xsequence/tests/browser/testutils/index.ts
@@ -0,0 +1,3 @@
+export * from './accounts'
+// export * from './deploy-wallet-context'
+export * from './wallet'
diff --git a/packages/0xsequence/tests/browser/testutils/wallet.ts b/packages/0xsequence/tests/browser/testutils/wallet.ts
new file mode 100644
index 0000000000..52b7124d9c
--- /dev/null
+++ b/packages/0xsequence/tests/browser/testutils/wallet.ts
@@ -0,0 +1,16 @@
+import { ethers, Wallet as EOAWallet } from 'ethers'
+
+export const sendETH = (
+ eoaWallet: EOAWallet,
+ toAddress: string,
+ amount: ethers.BigNumber
+): Promise => {
+ const tx = {
+ gasPrice: '0x55555',
+ gasLimit: '0x55555',
+ to: toAddress,
+ value: amount.toHexString(),
+ data: '0x'
+ }
+ return eoaWallet.sendTransaction(tx)
+}
diff --git a/packages/0xsequence/tests/browser/wallet-provider/dapp.test.ts b/packages/0xsequence/tests/browser/wallet-provider/dapp.test.ts
new file mode 100644
index 0000000000..99c55cd031
--- /dev/null
+++ b/packages/0xsequence/tests/browser/wallet-provider/dapp.test.ts
@@ -0,0 +1,543 @@
+import { commons, v2 } from '@0xsequence/core'
+import { SequenceClient, SequenceProvider, DefaultProviderConfig, MemoryItemStore } from '@0xsequence/provider'
+import { context } from '@0xsequence/tests'
+import { configureLogger } from '@0xsequence/utils'
+import { ethers, TypedDataDomain, TypedDataField } from 'ethers'
+import { test, assert } from '../../utils/assert'
+import { testAccounts, getEOAWallet, sendETH } from '../testutils'
+
+configureLogger({ logLevel: 'DEBUG', silence: false })
+
+export const tests = async () => {
+ //
+ // Setup
+ //
+ const transportsConfig = {
+ ...DefaultProviderConfig.transports,
+ walletAppURL: 'http://localhost:9999/mock-wallet/mock-wallet.test.html'
+ }
+
+ //
+ // Deploy Sequence WalletContext (deterministic).
+ //
+ const deployedWalletContext = await (async () => {
+ const provider = new ethers.providers.JsonRpcProvider('http://localhost:8545')
+ const signer = provider.getSigner()
+ return context.deploySequenceContexts(signer)
+ })()
+
+ const hardhatProvider = new ethers.providers.JsonRpcProvider('http://localhost:8545')
+
+ const client = new SequenceClient(transportsConfig, new MemoryItemStore(), { defaultChainId: 31337 })
+ const wallet = new SequenceProvider(client, chainId => {
+ if (chainId === 31337) {
+ return hardhatProvider
+ }
+
+ if (chainId === 31338) {
+ return new ethers.providers.JsonRpcProvider('http://localhost:9545')
+ }
+
+ throw new Error(`No provider for chainId ${chainId}`)
+ })
+
+ // provider + signer, by default if a chainId is not specified it will direct
+ // requests to the defaultChain
+ const provider = wallet.getProvider()
+ const signer = wallet.getSigner()
+
+ // clear it in case we're testing in browser session
+ await wallet.disconnect()
+
+ await test('is disconnected / logged out', async () => {
+ assert.false(wallet.isConnected(), 'is connected')
+ })
+
+ await test('is closed', async () => {
+ assert.false(wallet.isOpened(), 'is closed')
+ })
+
+ await test('is disconnected', async () => {
+ assert.false(wallet.isConnected(), 'is disconnnected')
+ })
+
+ await test('connect', async () => {
+ const { connected } = await wallet.connect({
+ app: 'test',
+ keepWalletOpened: true
+ })
+ assert.true(connected, 'is connected')
+ })
+
+ await test('isOpened', async () => {
+ assert.true(wallet.isOpened(), 'is opened')
+ })
+
+ await test('isConnected', async () => {
+ assert.true(wallet.isConnected(), 'is connected')
+ })
+
+ let walletContext: commons.context.VersionedContext
+ await test('getWalletContext', async () => {
+ walletContext = await wallet.getWalletContext()
+ assert.equal(walletContext[1].factory, deployedWalletContext[1].factory, 'wallet context factory')
+ assert.equal(walletContext[1].guestModule, deployedWalletContext[1].guestModule, 'wallet context guestModule')
+ assert.equal(walletContext[2].factory, deployedWalletContext[2].factory, 'wallet context factory')
+ assert.equal(walletContext[2].guestModule, deployedWalletContext[2].guestModule, 'wallet context guestModule')
+ })
+
+ await test('getChainId', async () => {
+ const chainId = wallet.getChainId()
+ assert.equal(chainId, 31337, 'chainId is correct')
+ })
+
+ await test('networks', async () => {
+ const networks = await wallet.getNetworks()
+
+ assert.equal(networks.length, 2, '2 networks')
+ assert.true(networks[0].isDefaultChain!, '1st network is DefaultChain')
+ assert.true(!networks[1].isDefaultChain, '1st network is not DefaultChain')
+ assert.true(networks[1].chainId === 31338, 'authChainId is correct')
+
+ const authProvider = wallet.getProvider(31338)!
+ assert.equal(authProvider.getChainId(), 31338, 'authProvider chainId is 31338')
+
+ assert.equal(provider.getChainId(), 31337, 'provider chainId is 31337')
+ })
+
+ await test('getAddress', async () => {
+ const address = wallet.getAddress()
+ assert.true(ethers.utils.isAddress(address), 'wallet address is valid')
+ })
+
+ await test('getWalletConfig', async () => {
+ const allWalletConfigs = await wallet.getWalletConfig()
+
+ const config = allWalletConfigs as v2.config.WalletConfig
+ assert.equal(config.version, 2, 'wallet config version is correct')
+ assert.true(ethers.BigNumber.from(2).eq(config.threshold), 'config, 2 threshold')
+ assert.true(ethers.BigNumber.from(0).eq(config.checkpoint), 'config, 0 checkpoint')
+ assert.true(v2.config.isSignerLeaf(config.tree), 'config, isSignerLeaf')
+ assert.true(ethers.utils.isAddress((config.tree as v2.config.SignerLeaf).address), 'config, signer address')
+ assert.true(ethers.BigNumber.from(2).eq((config.tree as v2.config.SignerLeaf).weight), 'config, signer weight')
+ })
+
+ await test('multiple networks', async () => {
+ // chainId 31337
+ {
+ assert.equal(provider.getChainId(), 31337, 'provider chainId is 31337')
+
+ const network = await provider.getNetwork()
+ assert.equal(network.chainId, 31337, 'chain id match')
+
+ const netVersion = await provider.send('net_version', [])
+ assert.equal(netVersion, '31337', 'net_version check')
+
+ const chainId = await provider.send('eth_chainId', [])
+ assert.equal(chainId, ethers.utils.hexValue(31337), 'eth_chainId check')
+
+ const chainId2 = await signer.getChainId()
+ assert.equal(chainId2, 31337, 'chainId check')
+ }
+
+ // chainId 31338
+ {
+ const provider2 = wallet.getProvider(31338)
+ assert.equal(provider2.getChainId(), 31338, '2nd chain, chainId is 31338 - 2')
+
+ const network = await provider2.getNetwork()
+ assert.equal(network.chainId, 31338, '2nd chain, chain id match - 3')
+
+ const netVersion = await provider2.send('net_version', [])
+ assert.equal(netVersion, '31338', '2nd chain, net_version check - 4')
+
+ const chainId = await provider2.send('eth_chainId', [])
+ assert.equal(chainId, ethers.utils.hexValue(31338), '2nd chain, eth_chainId check - 5')
+
+ const chainId2 = await provider2.getSigner().getChainId()
+ assert.equal(chainId2, 31338, '2nd chain, chainId check - 6')
+ }
+ })
+
+ await test('listAccounts', async () => {
+ const signers = provider.listAccounts()
+ assert.true(signers.length === 1, 'signers, single owner')
+ assert.true(signers[0] === wallet.getAddress(), 'signers, check address')
+ })
+
+ await test('signMessage on defaultChain', async () => {
+ const address = wallet.getAddress()
+ const chainId = wallet.getChainId()
+
+ const message = 'hihi'
+ const message2 = ethers.utils.toUtf8Bytes('hihi')
+
+ // Sign the message
+ const sigs = await Promise.all(
+ [message, message2].map(async m => {
+ assert.equal(await signer.getChainId(), 31337, 'signer chainId is 31337')
+
+ // NOTE: below line is equivalent to `signer.signMessage(m)` call
+ // const sig = await wallet.utils.signMessage(m)
+ const sig = await signer.signMessage(m, { eip6492: true })
+
+ // Non-deployed wallet (with EIP6492) should return a signature
+ // that ends with the EIP-6492 magic bytes
+ const suffix = '6492649264926492649264926492649264926492649264926492649264926492'
+ assert.true(sig.endsWith(suffix), 'signature ends with EIP-6492 magic bytes')
+
+ return sig
+ })
+ )
+ const sig = sigs[0]
+
+ // Verify the signature
+ const isValid = await wallet.utils.isValidMessageSignature(address, message, sig, chainId)
+ assert.true(isValid, 'signature is valid - 2')
+ })
+
+ await test('signTypedData on defaultChain', async () => {
+ const address = wallet.getAddress()
+ const chainId = wallet.getChainId()
+
+ const domain: TypedDataDomain = {
+ name: 'Ether Mail',
+ version: '1',
+ chainId: chainId,
+ verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC'
+ }
+
+ const types: { [key: string]: TypedDataField[] } = {
+ Person: [
+ { name: 'name', type: 'string' },
+ { name: 'wallet', type: 'address' }
+ ]
+ }
+
+ const message = {
+ name: 'Bob',
+ wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB'
+ }
+
+ const sig = await signer.signTypedData(domain, types, message)
+
+ // Verify typed data
+ const isValid = await wallet.utils.isValidTypedDataSignature(address, { domain, types, message }, sig, chainId)
+ assert.true(isValid, 'signature is valid - 3')
+ })
+
+ await test('signAuthMessage', async () => {
+ const address = wallet.getAddress()
+ const chainId = 31337
+ const authProvider = wallet.getProvider(chainId)!
+
+ assert.equal(chainId, 31337, 'chainId is 31337 (authChain)')
+ assert.equal(authProvider.getChainId(), 31337, 'authProvider chainId is 31337')
+ assert.equal(authProvider.getChainId(), await authProvider.getSigner().getChainId(), 'authProvider signer chainId is 31337')
+
+ // Sign the message
+ const message = 'hihi'
+ const sig = await signer.signMessage(message, { chainId })
+
+ // confirm that authSigner, the chain-bound provider, derived from the authProvider returns the same signature
+ const authSigner = authProvider.getSigner()
+ const sigChk = await authSigner.signMessage(message, { chainId })
+ assert.equal(sigChk, sig, 'authSigner.signMessage returns the same sig')
+
+ // Verify the signature
+ const isValid = await wallet.utils.isValidMessageSignature(address, message, sig, chainId)
+ assert.true(isValid, 'signAuthMessage, signature is valid')
+ })
+
+ await test('getBalance', async () => {
+ // technically, the mock-wallet's single signer owner has some ETH..
+ const balanceSigner1 = await provider.getBalance('0x4e37E14f5d5AAC4DF1151C6E8DF78B7541680853')
+ assert.true(balanceSigner1.gt(ethers.BigNumber.from(0)), 'signer1 balance > 0')
+ })
+
+ await test('fund sequence wallet', async () => {
+ // fund Sequence wallet with some ETH from test seed account
+ const testAccount = getEOAWallet(testAccounts[0].privateKey)
+ const walletBalanceBefore = await signer.getBalance()
+
+ const ethAmount = ethers.utils.parseEther('10.1234')
+ const txResp = await sendETH(testAccount, wallet.getAddress(), ethAmount)
+ const txReceipt = await provider.getTransactionReceipt(txResp.hash)
+ assert.true(txReceipt.status === 1, 'eth sent from signer1')
+
+ const walletBalanceAfter = await signer.getBalance()
+ assert.true(walletBalanceAfter.sub(walletBalanceBefore).eq(ethAmount), `wallet received ${ethAmount} eth`)
+ })
+
+ const testSendETH = async (
+ title: string,
+ opts: {
+ gasLimit?: string
+ } = {}
+ ) =>
+ test(title, async () => {
+ // sequence wallet to now send some eth back to another seed account
+ // via the relayer
+ {
+ const walletAddress = wallet.getAddress()
+ const walletBalanceBefore = await signer.getBalance()
+
+ // send eth from sequence smart wallet to another test account
+ const toAddress = testAccounts[1].address
+ const toBalanceBefore = await provider.getBalance(toAddress)
+
+ const ethAmount = ethers.utils.parseEther('1.4242')
+
+ // NOTE: when a wallet is undeployed (counterfactual), and although the txn contents are to send from our
+ // sequence wallet to the test account, the transaction by the Sequence Wallet instance will be sent `to` the
+ // `GuestModule` smart contract address of the Sequence context `from` the Sequence Relayer (local) account.
+ //
+ // However, when a wallet is deployed on-chain, and the txn object is to send from our sequence wallet to the
+ // test account, the transaction will be sent `to` the smart wallet contract address of the sender by
+ // the relayer. The transaction will then be delegated through the Smart Wallet and transfer will occur
+ // as an internal transaction on-chain.
+ //
+ // Also note, the gasLimit and gasPrice can be estimated by the relayer, or optionally may be specified.
+
+ //--
+
+ // Record wallet deployed state before, so we can check the receipt.to below. We have to do this
+ // because a wallet will automatically get bundled for deployment when it sends a transaction.
+ const beforeWalletDeployed = (await hardhatProvider.getCode(wallet.getAddress())) !== '0x'
+
+ // NOTE/TODO: gasPrice even if set will be set again by the LocalRelayer, we should allow it to be overridden
+ const tx: ethers.providers.TransactionRequest = {
+ from: walletAddress,
+ to: toAddress,
+ value: ethAmount
+ }
+
+ // specifying gasLimit manually
+ if (opts.gasLimit) {
+ tx.gasLimit = opts.gasLimit
+ }
+
+ const txResp = await signer.sendTransaction(tx)
+ const txReceipt = await txResp.wait()
+
+ assert.true(txReceipt.status === 1, 'txn sent successfully')
+ assert.true(
+ (await hardhatProvider.getCode(wallet.getAddress())) !== '0x',
+ 'wallet must be in deployed state after the txn'
+ )
+
+ // transaction is sent to the deployed wallet, if the wallet is deployed.. otherwise its sent to guestModule
+ if (beforeWalletDeployed) {
+ assert.equal(txReceipt.to, wallet.getAddress(), 'recipient is correct')
+ } else {
+ assert.equal(txReceipt.to, walletContext[2].guestModule, 'recipient is correct')
+ }
+
+ // Ensure fromAddress sent their eth
+ const walletBalanceAfter = await signer.getBalance()
+ const sent = walletBalanceAfter.sub(walletBalanceBefore).mul(-1)
+
+ assert.true(sent.eq(ethAmount), `wallet sent ${sent} eth while expected ${ethAmount}`)
+
+ // Ensure toAddress received their eth
+ const toBalanceAfter = await provider.getBalance(toAddress)
+ const received = toBalanceAfter.sub(toBalanceBefore)
+ assert.true(received.eq(ethAmount), `toAddress received ${received} eth while expected ${ethAmount}`)
+
+ // Extra checks
+ if (opts.gasLimit) {
+ // In our test, we are passing a high gas limit for an internal transaction, so overall
+ // transaction must be higher than this value if it used our value correctly
+ assert.true(txResp.gasLimit.gte(opts.gasLimit), 'sendETH, using higher gasLimit')
+ }
+ }
+ })
+
+ await testSendETH('sendETH (defaultChain)')
+
+ // NOTE: this will pass, as we set the gasLimit low on the txn, but the LocalRelayer will re-estimate
+ // the entire transaction to have it pass.
+ await testSendETH('sendETH with high gasLimit override (defaultChain)', { gasLimit: '0x55555' })
+
+ await test('sendTransaction batch', async () => {
+ const testAccount = getEOAWallet(testAccounts[1].privateKey)
+
+ const ethAmount1 = ethers.utils.parseEther('1.234')
+ const ethAmount2 = ethers.utils.parseEther('0.456')
+
+ const tx1: ethers.providers.TransactionRequest = {
+ to: testAccount.address,
+ value: ethAmount1
+ }
+ const tx2: ethers.providers.TransactionRequest = {
+ to: testAccount.address,
+ value: ethAmount2
+ }
+
+ const toBalanceBefore = await provider.getBalance(testAccount.address)
+ const txnResp = await signer.sendTransaction([tx1, tx2])
+
+ await txnResp.wait()
+
+ const toBalanceAfter = await provider.getBalance(testAccount.address)
+ const sent = toBalanceAfter.sub(toBalanceBefore)
+ const expected = ethAmount1.add(ethAmount2)
+ assert.true(
+ sent.eq(ethAmount1.add(ethAmount2)),
+ `wallet sent ${sent} eth while expected ${expected} (${ethAmount1} + ${ethAmount2})`
+ )
+ })
+
+ await test('sendTransaction batch format 2', async () => {
+ const testAccount = getEOAWallet(testAccounts[1].privateKey)
+
+ const ethAmount1 = ethers.utils.parseEther('1.234')
+ const ethAmount2 = ethers.utils.parseEther('0.456')
+
+ const tx1: ethers.providers.TransactionRequest = {
+ to: testAccount.address,
+ value: ethAmount1
+ }
+
+ const tx2: ethers.providers.TransactionRequest = {
+ to: testAccount.address,
+ value: ethAmount2
+ }
+
+ const toBalanceBefore = await provider.getBalance(testAccount.address)
+ const txnResp = await signer.sendTransaction([tx1, tx2])
+
+ await txnResp.wait()
+
+ const toBalanceAfter = await provider.getBalance(testAccount.address)
+ const sent = toBalanceAfter.sub(toBalanceBefore)
+ const expected = ethAmount1.add(ethAmount2)
+ assert.true(
+ sent.eq(ethAmount1.add(ethAmount2)),
+ `wallet sent ${sent} eth while expected ${expected} (${ethAmount1} + ${ethAmount2})`
+ )
+ })
+
+ await test('sendTransaction batch format 3', async () => {
+ const testAccount = getEOAWallet(testAccounts[1].privateKey)
+
+ const ethAmount1 = ethers.utils.parseEther('1.234')
+ const ethAmount2 = ethers.utils.parseEther('0.456')
+
+ const tx1: commons.transaction.Transaction = {
+ to: testAccount.address,
+ value: ethAmount1
+ }
+
+ const tx2: commons.transaction.Transaction = {
+ to: testAccount.address,
+ value: ethAmount2
+ }
+
+ const toBalanceBefore = await provider.getBalance(testAccount.address)
+
+ const txnResp = await signer.sendTransaction([tx1, tx2])
+ await txnResp.wait()
+
+ const toBalanceAfter = await provider.getBalance(testAccount.address)
+ const sent = toBalanceAfter.sub(toBalanceBefore)
+ const expected = ethAmount1.add(ethAmount2)
+ assert.true(
+ sent.eq(ethAmount1.add(ethAmount2)),
+ `wallet sent ${sent} eth while expected ${expected} (${ethAmount1} + ${ethAmount2})`
+ )
+ })
+
+ await test('sendETH from the sequence smart wallet (authChain)', async () => {
+ // multi-chain to send eth on an alternative chain, in this case the authChain
+ //
+ // NOTE: the account addresses are both chains have been seeded with the same private key
+ // so we can have overlapping addresses and keys for ease of use duringtesting
+
+ // get provider of the 2nd chain
+ const provider2 = wallet.getProvider('hardhat2')!
+
+ assert.equal(provider2.getChainId(), 31338, 'provider is the 2nd chain - 1')
+ assert.equal(provider2.getChainId(), wallet.getProvider(31338)!.getChainId(), 'provider2 code path check')
+
+ const signer2 = provider2.getSigner()
+
+ // confirm all account addresses are the same and correct
+ {
+ assert.equal(wallet.getAddress(), await signer.getAddress(), 'wallet and signer address match')
+ assert.equal(wallet.getAddress(), await signer2.getAddress(), 'wallet and signer2 address match')
+ assert.true(wallet.getAddress() !== testAccounts[0].address, 'wallet is not subkey address')
+ }
+
+ // initial balances
+ {
+ const testAccount = getEOAWallet(testAccounts[0].privateKey, provider2)
+ const walletBalanceBefore = await testAccount.getBalance()
+
+ const mainTestAccount = getEOAWallet(testAccounts[0].privateKey, wallet.getProvider())
+ const mainWalletBalanceBefore = await mainTestAccount.getBalance()
+
+ assert.true(walletBalanceBefore.toString() !== mainWalletBalanceBefore.toString(), 'balances across networks do not match')
+
+ // test different code paths lead to same results
+ assert.equal(
+ (await provider2.getBalance(await testAccount.getAddress())).toString(),
+ (await testAccount.getBalance()).toString(),
+ 'balance match 1'
+ )
+ assert.equal(
+ (await provider.getBalance(await mainTestAccount.getAddress())).toString(),
+ (await mainTestAccount.getBalance()).toString(),
+ 'balance match 2'
+ )
+ }
+
+ // first, lets move some ETH info the wallet from teh testnet seed account
+ {
+ const testAccount = getEOAWallet(testAccounts[0].privateKey, provider2)
+ const walletBalanceBefore = await signer2.getBalance()
+
+ const ethAmount = ethers.utils.parseEther('4.2')
+
+ // const txResp = await sendETH(testAccount, await wallet.getAddress(), ethAmount)
+ // const txReceipt = await provider2.getTransactionReceipt(txResp.hash)
+
+ const txReceipt = await (await sendETH(testAccount, wallet.getAddress(), ethAmount)).wait()
+ assert.true(txReceipt.status === 1, 'eth sent')
+
+ const walletBalanceAfter = await signer2.getBalance()
+ assert.true(walletBalanceAfter.sub(walletBalanceBefore).eq(ethAmount), `wallet received ${ethAmount} eth`)
+ }
+
+ // using sequence wallet on the authChain, send eth back to anotehr seed account via
+ // the authChain relayer
+ {
+ const walletAddress = wallet.getAddress()
+ const walletBalanceBefore = await signer2.getBalance()
+
+ // send eth from sequence smart wallet to another test account
+ const toAddress = testAccounts[1].address
+ const toBalanceBefore = await provider2.getBalance(toAddress)
+
+ const ethAmount = ethers.utils.parseEther('1.1234')
+
+ const tx = {
+ from: walletAddress,
+ to: toAddress,
+ value: ethAmount
+ }
+ const txReceipt = await (await signer2.sendTransaction(tx)).wait()
+
+ assert.true(txReceipt.status === 1, 'txn sent successfully')
+ assert.true((await hardhatProvider.getCode(walletAddress)) !== '0x', 'wallet must be in deployed state after the txn')
+
+ // Ensure fromAddress sent their eth
+ const walletBalanceAfter = await signer2.getBalance()
+ assert.true(walletBalanceAfter.sub(walletBalanceBefore).mul(-1).eq(ethAmount), `wallet sent ${ethAmount} eth`)
+
+ // Ensure toAddress received their eth
+ const toBalanceAfter = await provider2.getBalance(toAddress)
+ assert.true(toBalanceAfter.sub(toBalanceBefore).eq(ethAmount), `toAddress received ${ethAmount} eth`)
+ }
+ })
+}
diff --git a/packages/0xsequence/tests/browser/wallet-provider/dapp2.test.ts b/packages/0xsequence/tests/browser/wallet-provider/dapp2.test.ts
new file mode 100644
index 0000000000..79d1c75977
--- /dev/null
+++ b/packages/0xsequence/tests/browser/wallet-provider/dapp2.test.ts
@@ -0,0 +1,116 @@
+import { DefaultProviderConfig, MemoryItemStore, SequenceClient, SequenceProvider } from '@0xsequence/provider'
+import { configureLogger } from '@0xsequence/utils'
+import { ethers, TypedDataDomain, TypedDataField } from 'ethers'
+import { test, assert } from '../../utils/assert'
+
+configureLogger({ logLevel: 'DEBUG', silence: false })
+
+export const tests = async () => {
+ //
+ // Setup
+ //
+ const transportsConfig = {
+ ...DefaultProviderConfig.transports,
+ walletAppURL: 'http://localhost:9999/mock-wallet/mock-wallet.test.html'
+ }
+
+ const hardhatProvider = new ethers.providers.JsonRpcProvider('http://localhost:8545')
+
+ const client = new SequenceClient(transportsConfig, new MemoryItemStore(), { defaultChainId: 31338 })
+ const provider = new SequenceProvider(client, chainId => {
+ if (chainId === 31337) {
+ return hardhatProvider
+ }
+
+ if (chainId === 31338) {
+ return new ethers.providers.JsonRpcProvider('http://localhost:9545')
+ }
+
+ throw new Error(`No provider for chainId ${chainId}`)
+ })
+
+ // clear it in case we're testing in browser session
+ provider.disconnect()
+
+ await test('is logged out', async () => {
+ assert.false(provider.isConnected(), 'is logged out')
+ })
+
+ await test('is disconnected', async () => {
+ assert.false(provider.isConnected(), 'is disconnnected')
+ })
+
+ await test('connect / login', async () => {
+ const { connected } = await provider.connect({
+ app: 'test',
+ keepWalletOpened: true
+ })
+
+ assert.true(connected, 'is connected')
+ })
+
+ await test('isConnected', async () => {
+ assert.true(provider.isConnected(), 'is connected')
+ })
+
+ await test('check defaultNetwork is 31338', async () => {
+ assert.equal(provider.getChainId(), 31338, 'provider chainId is 31338')
+
+ const network = await provider.getNetwork()
+ assert.equal(network.chainId, 31338, 'chain id match')
+ })
+
+ await test('getNetworks()', async () => {
+ const networks = await provider.getNetworks()
+ console.log('=> networks', networks)
+
+ // There should be two chains, hardhat and hardhat2
+ assert.equal(networks.length, 2, 'networks length is 2')
+ assert.equal(networks[0].chainId, 31337, 'chain id match')
+ assert.equal(networks[1].chainId, 31338, 'chain id match')
+ })
+
+ await test('signMessage with our custom defaultChain', async () => {
+ console.log('signing message...')
+ const signer = provider.getSigner()
+
+ const message = 'Hi there! Please sign this message, 123456789, thanks.'
+
+ // sign
+ const sig = await signer.signMessage(message)
+
+ // validate
+ const isValid = await provider.utils.isValidMessageSignature(provider.getAddress(), message, sig, await signer.getChainId())
+ assert.true(isValid, 'signMessage sig is valid')
+ })
+
+ await test('signTypedData on defaultChain (in this case, hardhat2)', async () => {
+ const address = provider.getAddress()
+ const chainId = provider.getChainId()
+
+ const domain: TypedDataDomain = {
+ name: 'Ether Mail',
+ version: '1',
+ chainId: chainId,
+ verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC'
+ }
+
+ const types: { [key: string]: TypedDataField[] } = {
+ Person: [
+ { name: 'name', type: 'string' },
+ { name: 'wallet', type: 'address' }
+ ]
+ }
+
+ const message = {
+ name: 'Bob',
+ wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB'
+ }
+
+ const sig = await provider.getSigner().signTypedData(domain, types, message)
+
+ // Verify typed data
+ const isValid = await provider.utils.isValidTypedDataSignature(address, { domain, types, message }, sig, chainId)
+ assert.true(isValid, 'signature is valid - 4')
+ })
+}
diff --git a/packages/0xsequence/tests/browser/window-transport/dapp.test.ts b/packages/0xsequence/tests/browser/window-transport/dapp.test.ts
new file mode 100644
index 0000000000..aa0812c29f
--- /dev/null
+++ b/packages/0xsequence/tests/browser/window-transport/dapp.test.ts
@@ -0,0 +1,135 @@
+import { isValidSignature, prefixEIP191Message, WindowMessageProvider } from '@0xsequence/provider'
+import { context } from '@0xsequence/tests'
+import { configureLogger, encodeMessageDigest, packMessageData } from '@0xsequence/utils'
+import { ethers } from 'ethers'
+import { test, assert } from '../../utils/assert'
+
+configureLogger({ logLevel: 'DEBUG', silence: false })
+
+const walletProvider = new WindowMessageProvider('http://localhost:9999/mock-wallet/mock-wallet.test.html')
+walletProvider.register()
+
+// ;(window as any).walletProvider = walletProvider
+
+export const tests = async () => {
+ await (async () => {
+ const provider = new ethers.providers.JsonRpcProvider('http://localhost:8545')
+ const signer = provider.getSigner()
+ return context.deploySequenceContexts(signer)
+ })()
+
+ walletProvider.openWallet()
+
+ await test('provider opened the wallet', async () => {
+ const opened = await walletProvider.waitUntilOpened()
+ assert.true(!!opened, 'opened is true')
+ })
+
+ // TODO: try this again, but turn off hardhat, to ensure our error reponses are working correctly..
+ // ..
+ const provider = new ethers.providers.Web3Provider(walletProvider)
+ const signer = provider.getSigner()
+ const address = await signer.getAddress()
+ const chainId = await signer.getChainId()
+
+ await test('getAddress', async () => {
+ assert.true(ethers.utils.isAddress(address), 'wallet address')
+ })
+
+ await test('sending a json-rpc request', async () => {
+ await walletProvider.sendAsync({ jsonrpc: '2.0', id: 88, method: 'eth_accounts', params: [] }, (err, resp) => {
+ assert.true(!err, 'error is empty')
+ assert.true(!!resp, 'response successful')
+ assert.true(resp!.result[0] === address, 'response address check')
+ })
+
+ const resp = await provider.send('eth_accounts', [])
+ assert.true(!!resp, 'response successful')
+ assert.true(resp[0] === address, 'response address check')
+ })
+
+ await test('get chain id', async () => {
+ const network = await provider.getNetwork()
+ assert.equal(network.chainId, 31337, 'chain id match')
+
+ const netVersion = await provider.send('net_version', [])
+ assert.equal(netVersion, '31337', 'net_version check')
+
+ const chainId = await provider.send('eth_chainId', [])
+ assert.equal(chainId, '0x7a69', 'eth_chainId check')
+
+ const chainId2 = await signer.getChainId()
+ assert.equal(chainId2, 31337, 'chainId check')
+ })
+
+ // NOTE: when a dapp wants to verify SmartWallet signed messages, they will need to verify against EIP-1271
+ await test('sign a message and validate/recover', async () => {
+ const message = ethers.utils.toUtf8Bytes('hihi')
+
+ // TODO: signer should be a Sequence signer, and should be able to specify the chainId
+ // however, for a single wallet, it can check the chainId and throw if doesnt match, for multi-wallet it will select
+
+ // Deploy the wallet (by sending a random tx)
+ // (this step is performed by wallet-webapp when signing without EIP-6492 support)
+ await signer.sendTransaction({ to: ethers.Wallet.createRandom().address })
+
+ //
+ // Sign the message
+ //
+ const sig = await signer.signMessage(message)
+
+ //
+ // Verify the message signature
+ //
+ const messageDigest = encodeMessageDigest(prefixEIP191Message(message))
+ const isValid = await isValidSignature(address, messageDigest, sig, provider)
+ assert.true(isValid, 'signature is valid - 5')
+
+ // also compute the subDigest of the message, to be provided to the end-user
+ // in order to recover the config properly, the subDigest + sig is required.
+ const subDigest = packMessageData(address, chainId, messageDigest)
+ })
+
+ await test('sign EIP712 typed data and validate/recover', async () => {
+ const typedData = {
+ types: {
+ Person: [
+ { name: 'name', type: 'string' },
+ { name: 'wallet', type: 'address' }
+ ]
+ },
+ primaryType: 'Person' as const,
+ domain: {
+ name: 'Ether Mail',
+ version: '1',
+ chainId: 31337,
+ verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC'
+ },
+ message: {
+ name: 'Bob',
+ wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB'
+ }
+ }
+
+ //
+ // Sign the message
+ //
+ const sig = await provider.send('eth_signTypedData', [address, typedData])
+
+ // NOTE: verification of message below is identical to verifying a message with eth_sign,
+ // the difference is we have to provide 'message' as the typedData digest format
+
+ //
+ // Verify the message signature
+ //
+
+ const messageHash = ethers.utils._TypedDataEncoder.hash(typedData.domain, typedData.types, typedData.message)
+ const messageDigest = ethers.utils.arrayify(messageHash)
+ const isValid = await isValidSignature(address, messageDigest, sig, provider)
+ assert.true(isValid, 'signature is valid - 6')
+
+ // also compute the subDigest of the message, to be provided to the end-user
+ // in order to recover the config properly, the subDigest + sig is required.
+ const subDigest = packMessageData(address, chainId, messageDigest)
+ })
+}
diff --git a/packages/0xsequence/tests/json-rpc-provider.spec.ts b/packages/0xsequence/tests/json-rpc-provider.spec.ts
new file mode 100644
index 0000000000..3171949494
--- /dev/null
+++ b/packages/0xsequence/tests/json-rpc-provider.spec.ts
@@ -0,0 +1,3 @@
+import { runBrowserTests } from './utils/browser-test-runner'
+
+runBrowserTests('json-rpc-provider', 'json-rpc-provider/rpc.test.html')
diff --git a/packages/0xsequence/tests/mock-wallet.spec.ts b/packages/0xsequence/tests/mock-wallet.spec.ts
new file mode 100644
index 0000000000..62f770985e
--- /dev/null
+++ b/packages/0xsequence/tests/mock-wallet.spec.ts
@@ -0,0 +1,3 @@
+import { runBrowserTests } from './utils/browser-test-runner'
+
+runBrowserTests('mock-wallet', 'mock-wallet/mock-wallet.test.html')
diff --git a/packages/0xsequence/tests/mux-transport.spec.ts b/packages/0xsequence/tests/mux-transport.spec.ts
new file mode 100644
index 0000000000..814f019ec3
--- /dev/null
+++ b/packages/0xsequence/tests/mux-transport.spec.ts
@@ -0,0 +1,3 @@
+import { runBrowserTests } from './utils/browser-test-runner'
+
+runBrowserTests('mux-transport', 'mux-transport/mux.test.html')
diff --git a/packages/0xsequence/tests/proxy-transport.spec.ts b/packages/0xsequence/tests/proxy-transport.spec.ts
new file mode 100644
index 0000000000..338fb0fc30
--- /dev/null
+++ b/packages/0xsequence/tests/proxy-transport.spec.ts
@@ -0,0 +1,3 @@
+import { runBrowserTests } from './utils/browser-test-runner'
+
+runBrowserTests('proxy-transport-channel', 'proxy-transport/channel.test.html')
diff --git a/packages/0xsequence/tests/utils/assert.ts b/packages/0xsequence/tests/utils/assert.ts
new file mode 100644
index 0000000000..413851dcd0
--- /dev/null
+++ b/packages/0xsequence/tests/utils/assert.ts
@@ -0,0 +1,76 @@
+const testResults = []
+
+;(window as any).__testResults = testResults
+
+export const test = async (title: string, run: () => void) => {
+ const entry = {
+ title: title,
+ pass: null,
+ startTime: performance.now(),
+ error: null,
+ stack: null
+ }
+ testResults.push(entry)
+
+ try {
+ await run()
+ entry.pass = true
+ } catch (err) {
+ entry.error = err.message
+ entry.stack = err.stack
+ // throw new Error(`case '${title}' failed due to ${err.message}`)
+ // throw err
+ err.message = `case '${title}' failed due to ${err.message}`
+ throw err
+ }
+}
+
+export const assert = {
+ true: function (cond: boolean, msg?: string) {
+ if (cond !== true) {
+ if (msg) {
+ throw new Error(`invalid condition, '${msg}'`)
+ } else {
+ throw new Error(`invalid condition`)
+ }
+ }
+ },
+
+ false: function (cond: boolean, msg?: string) {
+ return assert.true(!cond, msg)
+ },
+
+ equal: function (actual: any, expected: any, msg?: string) {
+ if (actual !== expected) {
+ if (msg) {
+ throw new Error(`expected '${expected}' but got '${actual}', '${msg}'`)
+ } else {
+ throw new Error(`expected '${expected}' but got '${actual}'`)
+ }
+ }
+ },
+
+ rejected: async function (promise: Promise, msg?: string) {
+ let wasRejected = false
+
+ try {
+ await promise
+ } catch {
+ wasRejected = true
+ }
+
+ if (!wasRejected) {
+ if (msg) {
+ throw new Error(`expected to be rejected`)
+ } else {
+ throw new Error(`expected to be rejected, ${msg}`)
+ }
+ }
+ }
+}
+
+export const sleep = (time: number) => {
+ return new Promise((resolve, reject) => {
+ setTimeout(resolve, time)
+ })
+}
diff --git a/packages/0xsequence/tests/utils/browser-test-runner.ts b/packages/0xsequence/tests/utils/browser-test-runner.ts
new file mode 100644
index 0000000000..5bb74cf41f
--- /dev/null
+++ b/packages/0xsequence/tests/utils/browser-test-runner.ts
@@ -0,0 +1,90 @@
+import test from 'ava'
+import puppeteer from 'puppeteer'
+import { spawnSync } from 'child_process'
+
+export const runBrowserTests = async (title: string, path: string) => {
+ test.serial(title, browserContext, async (t, page: puppeteer.Page) => {
+ await page.goto('http://localhost:9999/' + path, {
+ waitUntil: 'networkidle0',
+ timeout: 30000
+ })
+
+ // confirm
+ t.true((await page.title()) === 'test')
+
+ // debugging
+ page.on('console', msg => console.log(`console: ${msg.text()}`))
+
+ // catch uncaught errors
+ page.on('pageerror', err => {
+ page.close()
+ t.fail(`${err}`)
+ })
+
+ // run the test
+ try {
+ const timeout = setTimeout(() => {
+ throw `Test runner timed out after 60s!`
+ }, 60000) // 60 seconds to run the tests
+
+ const testResults = await page.evaluate(async () => {
+ // @ts-ignore
+ await lib.tests()
+
+ // @ts-ignore
+ return window.__testResults
+ })
+
+ clearTimeout(timeout)
+
+ for (let i = 0; i < testResults.length; i++) {
+ const result = testResults[i]
+ if (result.pass === true) {
+ t.log(`${result.title}: \x1b[32mPASS\x1b[0m`)
+ } else {
+ t.log(`${result.title}: \x1b[31mFAIL\x1b[0m`)
+ if (result.error) {
+ t.fail(`WHOOPS! case '${result.title}' failed due to ${result.error} !`)
+ } else {
+ t.fail(`WHOOPS! case '${result.title}' failed !`)
+ }
+ }
+ }
+ } catch (err) {
+ t.fail(`${err}`)
+ }
+ })
+}
+
+export const browserContext = async (t, run) => {
+ const browser = await puppeteer.launch({
+ executablePath: getChromePath(),
+ args: ['--headless']
+ })
+ const page = await browser.newPage()
+ try {
+ await run(t, page)
+ } finally {
+ await page.close()
+ await browser.close()
+ }
+}
+
+const getChromePath = (): string | undefined => {
+ if (process.env['NIX_PATH']) {
+ // nixos users are unable to use the chrome bin packaged with puppeteer,
+ // so instead we use the locally installed chrome or chromium binary.
+ for (const bin of ['google-chrome-stable', 'chromium']) {
+ const out = spawnSync('which', [bin])
+ if (out.status === 0) {
+ const executablePath = out.stdout.toString().trim()
+ return executablePath
+ }
+ }
+ console.error('Unable to find `google-chrome-stable` or `chromium` binary on your NixOS system.')
+ process.exit(1)
+ } else {
+ // undefined will use the chrome version packaged with puppeteer npm package
+ return undefined
+ }
+}
diff --git a/packages/0xsequence/tests/utils/webpack-test-server.ts b/packages/0xsequence/tests/utils/webpack-test-server.ts
new file mode 100644
index 0000000000..8b4a050d4c
--- /dev/null
+++ b/packages/0xsequence/tests/utils/webpack-test-server.ts
@@ -0,0 +1,31 @@
+import webpack from 'webpack'
+import WebpackDevServer from 'webpack-dev-server'
+import webpackTestConfig from '../webpack.config'
+
+export const DEFAULT_PORT = 9999
+
+// NOTE: currently not in use, instead we run the server as a separate process via `pnpm test:server`
+
+export const createWebpackTestServer = async (port = DEFAULT_PORT) => {
+ const testServer = new WebpackDevServer(
+ // @ts-ignore
+ webpack(webpackTestConfig),
+ {
+ clientLogLevel: 'silent',
+ open: false,
+ host: '0.0.0.0',
+ historyApiFallback: true,
+ stats: 'errors-only',
+ disableHostCheck: true,
+ publicPath: '/',
+ inline: false,
+ hot: false
+ }
+ )
+
+ await testServer.listen(port, '0.0.0.0', function (err) {
+ if (err) {
+ console.error(err)
+ }
+ })
+}
diff --git a/packages/0xsequence/tests/wallet-provider.spec.ts b/packages/0xsequence/tests/wallet-provider.spec.ts
new file mode 100644
index 0000000000..418cefd9fb
--- /dev/null
+++ b/packages/0xsequence/tests/wallet-provider.spec.ts
@@ -0,0 +1,4 @@
+import { runBrowserTests } from './utils/browser-test-runner'
+
+runBrowserTests('wallet-provider/dapp', 'wallet-provider/dapp.test.html')
+runBrowserTests('wallet-provider/dapp2', 'wallet-provider/dapp2.test.html')
diff --git a/packages/0xsequence/tests/webpack.config.js b/packages/0xsequence/tests/webpack.config.js
new file mode 100644
index 0000000000..9b02970794
--- /dev/null
+++ b/packages/0xsequence/tests/webpack.config.js
@@ -0,0 +1,165 @@
+const path = require('path')
+const fs = require('fs')
+const webpack = require('webpack')
+const HtmlWebpackPlugin = require('html-webpack-plugin')
+
+const port = process.env['PORT'] || 9999
+
+const appDirectory = fs.realpathSync(process.cwd())
+const resolveCwd = (relativePath) => path.resolve(appDirectory, relativePath)
+
+const resolvePackages = () => {
+ const pkgs = path.resolve(fs.realpathSync(process.cwd()), '..')
+ return fs.readdirSync(pkgs).reduce((list, dir) => {
+ const p = path.join(pkgs, dir, 'src')
+ if (fs.existsSync(p)) {
+ list.push(p)
+ }
+ return list
+ }, [])
+}
+
+// Include extra sources for compilation.
+//
+// NOTE: if you experience an error in your webpack builder such as,
+// Module parse failed: Unexpected token (11:20)
+// You may need an appropriate loader to handle this file type, currently no loaders are
+// configured to process this file. See https://webpack.js.org/concepts#loaders
+//
+// The above error is due to not passing the TypeScript files to the module.rules for
+// babel below. The solution is to include the path to the source files below, and
+// the error will go away.
+const resolveExtras = [
+ // resolveCwd('../wallet/tests/utils'),
+ resolveCwd('../../node_modules/@0xsequence/wallet-contracts/gen')
+]
+
+const resolveTestEntries = (location) => {
+ return fs.readdirSync(location).reduce((list, f) => {
+ const n = path.join(location, f)
+ if (fs.lstatSync(n).isDirectory()) {
+ list.push(...resolveTestEntries(n))
+ } else {
+ if (n.endsWith(".test.ts") > 0) list.push(n)
+ }
+ return list
+ }, [])
+}
+
+const resolveEntry = () => {
+ const browserTestRoot = fs.realpathSync(path.join(process.cwd(), 'tests', 'browser'))
+ const entry = { 'lib': './src/index.ts' }
+ const testEntries = resolveTestEntries(browserTestRoot)
+ testEntries.forEach(v => entry[v.slice(browserTestRoot.length+1, v.length-3)] = v)
+ return entry
+}
+
+const resolveHtmlPlugins = (entry) => {
+ const plugins = []
+ for (let k in entry) {
+ if (k === 'lib') continue
+ plugins.push(new HtmlWebpackPlugin({
+ inject: false,
+ filename: `${k}.html`,
+ templateContent: htmlTemplate(k)
+ }))
+ }
+ return plugins
+}
+
+const htmlTemplate = (k) => `
+
+
+
+ test
+
+
+ ${k}
+
+
+ TEST
+
+
+
+
+
+
+
+`
+
+const entry = resolveEntry()
+
+module.exports = {
+ mode: 'none',
+ context: process.cwd(),
+ entry: entry,
+ output: {
+ library: 'lib',
+ libraryTarget: 'umd'
+ },
+ watch: false,
+ plugins: [...resolveHtmlPlugins(entry)],
+ module: {
+ rules: [
+ {
+ test: /\.(js|mjs|ts)$/,
+ include: [...resolvePackages(), resolveCwd('./tests'), ...resolveExtras],
+ loader: require.resolve('babel-loader'),
+ options: {
+ presets: ['@babel/preset-typescript'],
+ plugins: [
+ [require.resolve('@babel/plugin-transform-class-properties'), { loose: true }]
+ ],
+ cacheCompression: false,
+ compact: false,
+ },
+ },
+ {
+ test: /\.(jpe?g|png|gif|svg)$/i,
+ use: [
+ {
+ loader: 'url-loader',
+ options: {
+ limit: 8192000
+ }
+ }
+ ]
+ }
+ ]
+ },
+ resolve: {
+ modules: ['node_modules', resolveCwd('node_modules')],
+ extensions: ['.ts', '.js', '.png', '.jpg', '.d.ts'],
+ alias: {},
+ fallback: {
+ fs: false,
+ stream: false,
+ readline: false,
+ assert: false
+ }
+ },
+ devServer: {
+ clientLogLevel: 'silent',
+ open: false,
+ host: '0.0.0.0',
+ port: port,
+ historyApiFallback: true,
+ stats: 'errors-only',
+ disableHostCheck: true,
+ contentBase: path.resolve(process.cwd(), 'tests/browser'),
+ publicPath: '/',
+ inline: false,
+ hot: false
+ }
+}
diff --git a/packages/0xsequence/tests/window-transport.spec.ts b/packages/0xsequence/tests/window-transport.spec.ts
new file mode 100644
index 0000000000..d56374379b
--- /dev/null
+++ b/packages/0xsequence/tests/window-transport.spec.ts
@@ -0,0 +1,3 @@
+import { runBrowserTests } from './utils/browser-test-runner'
+
+runBrowserTests('window-transport', 'window-transport/dapp.test.html')
diff --git a/packages/abi/CHANGELOG.md b/packages/abi/CHANGELOG.md
new file mode 100644
index 0000000000..15772c27df
--- /dev/null
+++ b/packages/abi/CHANGELOG.md
@@ -0,0 +1,2085 @@
+# @0xsequence/abi
+
+## 2.3.8
+
+### Patch Changes
+
+- indexer: update clients
+
+## 2.3.7
+
+### Patch Changes
+
+- Metadata updates
+
+## 2.3.6
+
+### Patch Changes
+
+- New chains
+
+## 2.3.5
+
+### Patch Changes
+
+- Add Frequency Testnet
+
+## 2.3.4
+
+### Patch Changes
+
+- metadata: exclude deprecated methods on rpc client
+
+## 2.3.3
+
+### Patch Changes
+
+- metadata: client update
+
+## 2.3.2
+
+### Patch Changes
+
+- metadata: update rpc client
+
+## 2.3.1
+
+### Patch Changes
+
+- indexer: update rpc client
+
+## 2.3.0
+
+### Minor Changes
+
+- update metadata rpc client
+
+## 2.2.15
+
+### Patch Changes
+
+- API updates
+
+## 2.2.14
+
+### Patch Changes
+
+- Somnia Testnet and Monad Testnet
+
+## 2.2.13
+
+### Patch Changes
+
+- Add XR1 to all networks
+
+## 2.2.12
+
+### Patch Changes
+
+- Add XR1
+
+## 2.2.11
+
+### Patch Changes
+
+- Relayer updates
+
+## 2.2.10
+
+### Patch Changes
+
+- Etherlink support
+
+## 2.2.9
+
+### Patch Changes
+
+- Indexer gateway native token balances
+
+## 2.2.8
+
+### Patch Changes
+
+- Add Moonbeam and Moonbase Alpha
+
+## 2.2.7
+
+### Patch Changes
+
+- Update Builder package
+
+## 2.2.6
+
+### Patch Changes
+
+- Update relayer package
+
+## 2.2.5
+
+### Patch Changes
+
+- auth: fix sequence indexer gateway url
+- account: immutable wallet proxy hook
+
+## 2.2.4
+
+### Patch Changes
+
+- network: update soneium mainnet block explorer url
+- waas: signTypedData intent support
+
+## 2.2.3
+
+### Patch Changes
+
+- provider: updating initWallet to use connected network configs if they exist
+
+## 2.2.2
+
+### Patch Changes
+
+- pass projectAccessKey to relayer at all times
+
+## 2.2.1
+
+### Patch Changes
+
+- waas-ethers: sign typed data
+
+## 2.2.0
+
+### Minor Changes
+
+- indexer: gateway client
+- @0xsequence/builder
+- upgrade puppeteer to v23.10.3
+
+## 2.1.8
+
+### Patch Changes
+
+- Add Soneium Mainnet
+
+## 2.1.7
+
+### Patch Changes
+
+- guard: pass project access key to guard requests
+
+## 2.1.6
+
+### Patch Changes
+
+- Add LAOS and Telos Testnet chains
+
+## 2.1.5
+
+### Patch Changes
+
+- account: save presigned configuration with reference chain id 1
+
+## 2.1.4
+
+### Patch Changes
+
+- provider: pass projectAccessKey into MuxMessageProvider
+
+## 2.1.3
+
+### Patch Changes
+
+- waas: time drift date fix due to strange browser quirk
+
+## 2.1.2
+
+### Patch Changes
+
+- provider: export analytics correctly
+
+## 2.1.1
+
+### Patch Changes
+
+- Add LAOS chain support
+
+## 2.1.0
+
+### Minor Changes
+
+- account: forward project access key when estimating fees and sending transactions
+
+### Patch Changes
+
+- sessions: save signatures with reference chain id
+
+## 2.0.26
+
+### Patch Changes
+
+- account: fix chain id comparison
+
+## 2.0.25
+
+### Patch Changes
+
+- skale-nebula: deploy gas limit = 10m
+
+## 2.0.24
+
+### Patch Changes
+
+- sessions: arweave: configurable gateway url
+- waas: use /status to get time drift before sending any intents
+
+## 2.0.23
+
+### Patch Changes
+
+- Add The Root Network support
+
+## 2.0.22
+
+### Patch Changes
+
+- Add SKALE Nebula Mainnet support
+
+## 2.0.21
+
+### Patch Changes
+
+- account: add publishWitnessFor
+
+## 2.0.20
+
+### Patch Changes
+
+- upgrade deps, and improve waas session status handling
+
+## 2.0.19
+
+### Patch Changes
+
+- Add Immutable zkEVM support
+
+## 2.0.18
+
+### Patch Changes
+
+- waas: new contractCall transaction type
+- sessions: add arweave owner
+
+## 2.0.17
+
+### Patch Changes
+
+- update waas auth to clear session before signIn
+
+## 2.0.16
+
+### Patch Changes
+
+- Removed Astar chains
+
+## 2.0.15
+
+### Patch Changes
+
+- indexer: update bindings with token balance additions
+
+## 2.0.14
+
+### Patch Changes
+
+- sessions: arweave config reader
+- network: add b3 and apechain mainnet configs
+
+## 2.0.13
+
+### Patch Changes
+
+- network: toy-testnet
+
+## 2.0.12
+
+### Patch Changes
+
+- api: update bindings
+
+## 2.0.11
+
+### Patch Changes
+
+- waas: intents test fix
+- api: update bindings
+
+## 2.0.10
+
+### Patch Changes
+
+- network: soneium minato testnet
+
+## 2.0.9
+
+### Patch Changes
+
+- network: fix SKALE network name
+
+## 2.0.8
+
+### Patch Changes
+
+- metadata: update bindings
+
+## 2.0.7
+
+### Patch Changes
+
+- wallet request handler fix
+
+## 2.0.6
+
+### Patch Changes
+
+- network: matic -> pol
+
+## 2.0.5
+
+### Patch Changes
+
+- provider: update databeat to 0.9.2
+
+## 2.0.4
+
+### Patch Changes
+
+- network: add skale-nebula-testnet
+
+## 2.0.3
+
+### Patch Changes
+
+- waas: check session status in SequenceWaaS.isSignedIn()
+
+## 2.0.2
+
+### Patch Changes
+
+- sessions: property convert serialized bignumber hex value to bigint
+
+## 2.0.1
+
+### Patch Changes
+
+- waas: http signature check for authenticator requests
+- provider: unwrap legacy json rpc responses
+- use json replacer and reviver for bigints
+
+## 2.0.0
+
+### Major Changes
+
+- ethers v6
+
+## 1.10.15
+
+### Patch Changes
+
+- utils: extractProjectIdFromAccessKey
+
+## 1.10.14
+
+### Patch Changes
+
+- network: add borne-testnet to allNetworks
+
+## 1.10.13
+
+### Patch Changes
+
+- network: add borne testnet
+
+## 1.10.12
+
+### Patch Changes
+
+- api: update bindings
+- global/window -> globalThis
+
+## 1.10.11
+
+### Patch Changes
+
+- waas: updated intent.gen without webrpc types, errors exported from authenticator.gen
+
+## 1.10.10
+
+### Patch Changes
+
+- metadata: update bindings with new contract collections api
+
+## 1.10.9
+
+### Patch Changes
+
+- waas minor update
+
+## 1.10.8
+
+### Patch Changes
+
+- update metadata bindings
+
+## 1.10.7
+
+### Patch Changes
+
+- minor fixes to waas client
+
+## 1.10.6
+
+### Patch Changes
+
+- metadata: update bindings
+
+## 1.10.5
+
+### Patch Changes
+
+- network: ape-chain-testnet -> apechain-testnet
+
+## 1.10.4
+
+### Patch Changes
+
+- network: add b3-sepolia, ape-chain-testnet, blast, blast-sepolia
+
+## 1.10.3
+
+### Patch Changes
+
+- typing fix
+
+## 1.10.2
+
+### Patch Changes
+
+- - waas: add getIdToken method
+ - indexer: update api client
+
+## 1.10.1
+
+### Patch Changes
+
+- metadata: update bindings
+
+## 1.10.0
+
+### Minor Changes
+
+- waas release v1.3.0
+
+## 1.9.37
+
+### Patch Changes
+
+- network: adds nativeToken data to NetworkMetadata constants
+
+## 1.9.36
+
+### Patch Changes
+
+- guard: export client
+
+## 1.9.35
+
+### Patch Changes
+
+- guard: update bindings
+
+## 1.9.34
+
+### Patch Changes
+
+- waas: always use lowercase email
+
+## 1.9.33
+
+### Patch Changes
+
+- waas: umd build
+
+## 1.9.32
+
+### Patch Changes
+
+- indexer: update bindings
+
+## 1.9.31
+
+### Patch Changes
+
+- metadata: token directory changes
+
+## 1.9.30
+
+### Patch Changes
+
+- update
+
+## 1.9.29
+
+### Patch Changes
+
+- disable gnosis chain
+
+## 1.9.28
+
+### Patch Changes
+
+- add utils/merkletree
+
+## 1.9.27
+
+### Patch Changes
+
+- network: optimistic -> optimism
+- waas: remove defaults
+- api, sessions: update bindings
+
+## 1.9.26
+
+### Patch Changes
+
+- - add backend interfaces for pluggable interfaces
+ - introduce @0xsequence/react-native
+ - update pnpm to lockfile v9
+
+## 1.9.25
+
+### Patch Changes
+
+- update webrpc clients with new error types
+
+## 1.9.24
+
+### Patch Changes
+
+- waas: add memoryStore backend to localStore
+
+## 1.9.23
+
+### Patch Changes
+
+- update api client bindings
+
+## 1.9.22
+
+### Patch Changes
+
+- update metadata client bindings
+
+## 1.9.21
+
+### Patch Changes
+
+- api client bindings
+
+## 1.9.20
+
+### Patch Changes
+
+- api client bindings update
+
+## 1.9.19
+
+### Patch Changes
+
+- waas update
+
+## 1.9.18
+
+### Patch Changes
+
+- provider: prohibit dangerous functions
+
+## 1.9.17
+
+### Patch Changes
+
+- network: add xr-sepolia
+
+## 1.9.16
+
+### Patch Changes
+
+- waas: sequence.feeOptions
+
+## 1.9.15
+
+### Patch Changes
+
+- metadata: collection external_link field name fix
+
+## 1.9.14
+
+### Patch Changes
+
+- network: astar-zkatana -> astar-zkyoto
+- network: deprecate polygon mumbai network
+- network: add xai and polygon amoy
+
+## 1.9.13
+
+### Patch Changes
+
+- waas: fix @0xsequence/network dependency
+
+## 1.9.12
+
+### Patch Changes
+
+- indexer: update rpc bindings
+- provider: signMessage: Serialize the BytesLike or string message into hexstring before sending
+- waas: SessionAuthProof
+
+## 1.9.11
+
+### Patch Changes
+
+- metdata, update rpc bindings
+
+## 1.9.10
+
+### Patch Changes
+
+- update metadata rpc bindings
+
+## 1.9.9
+
+### Patch Changes
+
+- metadata, add SequenceCollections rpc client
+
+## 1.9.8
+
+### Patch Changes
+
+- waas client update
+
+## 1.9.7
+
+### Patch Changes
+
+- update rpc client bindings for api, metadata and relayer
+
+## 1.9.6
+
+### Patch Changes
+
+- waas package update
+
+## 1.9.5
+
+### Patch Changes
+
+- RpcRelayer prioritize project access key
+
+## 1.9.4
+
+### Patch Changes
+
+- waas: fix network dependency
+
+## 1.9.3
+
+### Patch Changes
+
+- provider: don't append access key to RPC url if user has already provided it
+
+## 1.9.2
+
+### Patch Changes
+
+- network: add xai-sepolia
+
+## 1.9.1
+
+### Patch Changes
+
+- analytics fix
+
+## 1.9.0
+
+### Minor Changes
+
+- waas release
+
+## 1.8.8
+
+### Patch Changes
+
+- update metadata bindings
+
+## 1.8.7
+
+### Patch Changes
+
+- provider: update databeat to 0.9.1
+
+## 1.8.6
+
+### Patch Changes
+
+- guard: SignedOwnershipProof
+
+## 1.8.5
+
+### Patch Changes
+
+- guard: signOwnershipProof and isSignedOwnershipProof
+
+## 1.8.4
+
+### Patch Changes
+
+- network: add homeverse to networks list
+
+## 1.8.3
+
+### Patch Changes
+
+- api: introduce basic linked wallet support
+
+## 1.8.2
+
+### Patch Changes
+
+- provider: don't initialize analytics unless explicitly requested
+
+## 1.8.1
+
+### Patch Changes
+
+- update to analytics provider
+
+## 1.8.0
+
+### Minor Changes
+
+- provider: project analytics
+
+## 1.7.2
+
+### Patch Changes
+
+- 0xsequence: ChainId should not be exported as a type
+- account, wallet: fix nonce selection
+
+## 1.7.1
+
+### Patch Changes
+
+- network: add missing avalanche logoURI
+
+## 1.7.0
+
+### Minor Changes
+
+- provider: projectAccessKey is now required
+
+### Patch Changes
+
+- network: add NetworkMetadata.logoURI property for all networks
+
+## 1.6.3
+
+### Patch Changes
+
+- network list update
+
+## 1.6.2
+
+### Patch Changes
+
+- auth: projectAccessKey option
+- wallet: use 12 bytes for random space
+
+## 1.6.1
+
+### Patch Changes
+
+- core: add simple config from subdigest support
+- core: fix encode tree with subdigest
+- account: implement buildOnChainSignature on Account
+
+## 1.6.0
+
+### Minor Changes
+
+- account, wallet: parallel transactions by default
+
+### Patch Changes
+
+- provider: emit disconnect on sign out
+
+## 1.5.0
+
+### Minor Changes
+
+- signhub: add 'signing' signer status
+
+### Patch Changes
+
+- auth: Session.open: onAccountAddress callback
+- account: allow empty transaction bundles
+
+## 1.4.9
+
+### Patch Changes
+
+- rename SequenceMetadataClient to SequenceMetadata
+
+## 1.4.8
+
+### Patch Changes
+
+- account: Account.getSigners
+
+## 1.4.7
+
+### Patch Changes
+
+- update indexer client bindings
+
+## 1.4.6
+
+### Patch Changes
+
+- - add sepolia networks, mark goerli as deprecated
+ - update indexer client bindings
+
+## 1.4.5
+
+### Patch Changes
+
+- indexer/metadata: update client bindings
+- auth: selectWallet with new address
+
+## 1.4.4
+
+### Patch Changes
+
+- indexer: update bindings
+- auth: handle jwt expiry
+
+## 1.4.3
+
+### Patch Changes
+
+- guard: return active status from GuardSigner.getAuthMethods
+
+## 1.4.2
+
+### Patch Changes
+
+- guard: update bindings
+
+## 1.4.1
+
+### Patch Changes
+
+- network: remove unused networks
+- signhub: orchestrator interface
+- guard: auth methods interface
+- guard: update bindings for pin and totp
+- guard: no more retry logic
+
+## 1.4.0
+
+### Minor Changes
+
+- project access key support
+
+## 1.3.0
+
+### Minor Changes
+
+- signhub: account children
+
+### Patch Changes
+
+- guard: do not throw when building deploy transaction
+- network: snowtrace.io -> subnets.avax.network/c-chain
+
+## 1.2.9
+
+### Patch Changes
+
+- account: AccountSigner.sendTransaction simulateForFeeOptions
+- relayer: update bindings
+
+## 1.2.8
+
+### Patch Changes
+
+- rename X-Sequence-Token-Key header to X-Access-Key
+
+## 1.2.7
+
+### Patch Changes
+
+- add x-sequence-token-key to clients
+
+## 1.2.6
+
+### Patch Changes
+
+- Fix bind multicall provider
+
+## 1.2.5
+
+### Patch Changes
+
+- Multicall default configuration fixes
+
+## 1.2.4
+
+### Patch Changes
+
+- provider: Adding missing payment provider types to PaymentProviderOption
+- provider: WalletRequestHandler.notifyChainChanged
+
+## 1.2.3
+
+### Patch Changes
+
+- auth, provider: connect to accept optional authorizeNonce
+
+## 1.2.2
+
+### Patch Changes
+
+- provider: allow createContract calls
+- core: check for explicit zero address in contract deployments
+
+## 1.2.1
+
+### Patch Changes
+
+- auth: use sequence api chain id as reference chain id if available
+
+## 1.2.0
+
+### Minor Changes
+
+- split services from session, better local support
+
+## 1.1.15
+
+### Patch Changes
+
+- guard: remove error filtering
+
+## 1.1.14
+
+### Patch Changes
+
+- guard: add GuardSigner.onError
+
+## 1.1.13
+
+### Patch Changes
+
+- provider: pass client version with connect options
+- provider: removing large from BannerSize
+
+## 1.1.12
+
+### Patch Changes
+
+- provider: adding bannerSize to ConnectOptions
+
+## 1.1.11
+
+### Patch Changes
+
+- add homeverse configs
+
+## 1.1.10
+
+### Patch Changes
+
+- handle default EIP6492 on send
+
+## 1.1.9
+
+### Patch Changes
+
+- Custom default EIP6492 on client
+
+## 1.1.8
+
+### Patch Changes
+
+- metadata: searchMetadata: add types filter
+
+## 1.1.7
+
+### Patch Changes
+
+- adding signInWith connect settings option to allow dapps to automatically login their users with a certain provider optimizing the normal authentication flow
+
+## 1.1.6
+
+### Patch Changes
+
+- metadata: searchMetadata: add chainID and excludeTokenMetadata filters
+
+## 1.1.5
+
+### Patch Changes
+
+- account: re-compute meta-transaction id for wallet deployment transactions
+
+## 1.1.4
+
+### Patch Changes
+
+- network: rename base-mainnet to base
+- provider: override isDefaultChain with ConnectOptions.networkId if provided
+
+## 1.1.3
+
+### Patch Changes
+
+- provider: use network id from transport session
+- provider: sign authorization using ConnectOptions.networkId if provided
+
+## 1.1.2
+
+### Patch Changes
+
+- provider: jsonrpc chain id fixes
+
+## 1.1.1
+
+### Patch Changes
+
+- network: add base mainnet and sepolia
+- provider: reject toxic transaction requests
+
+## 1.1.0
+
+### Minor Changes
+
+- Refactor dapp facing provider
+
+## 1.0.5
+
+### Patch Changes
+
+- network: export network constants
+- guard: use the correct global for fetch
+- network: nova-explorer.arbitrum.io -> nova.arbiscan.io
+
+## 1.0.4
+
+### Patch Changes
+
+- provider: accept name or number for networkId
+
+## 1.0.3
+
+### Patch Changes
+
+- Simpler isValidSignature helpers
+
+## 1.0.2
+
+### Patch Changes
+
+- add extra signature validation utils methods
+
+## 1.0.1
+
+### Patch Changes
+
+- add homeverse testnet
+
+## 1.0.0
+
+### Major Changes
+
+- https://sequence.xyz/blog/sequence-wallet-light-state-sync-full-merkle-wallets
+
+## 0.43.34
+
+### Patch Changes
+
+- auth: no jwt for indexer
+
+## 0.43.33
+
+### Patch Changes
+
+- Adding onConnectOptionsChange handler to WalletRequestHandler
+
+## 0.43.32
+
+### Patch Changes
+
+- add Base Goerli network
+
+## 0.43.31
+
+### Patch Changes
+
+- remove AuxDataProvider, add promptSignInConnect
+
+## 0.43.30
+
+### Patch Changes
+
+- add arbitrum goerli testnet
+
+## 0.43.29
+
+### Patch Changes
+
+- provider: check availability of window object
+
+## 0.43.28
+
+### Patch Changes
+
+- update api bindings
+
+## 0.43.27
+
+### Patch Changes
+
+- Add rpc is sequence method
+
+## 0.43.26
+
+### Patch Changes
+
+- add zkevm url to enum
+
+## 0.43.25
+
+### Patch Changes
+
+- added polygon zkevm to mainnet networks
+
+## 0.43.24
+
+### Patch Changes
+
+- name change from zkevm to polygon-zkevm
+
+## 0.43.23
+
+### Patch Changes
+
+- update zkEVM name to Polygon zkEVM
+
+## 0.43.22
+
+### Patch Changes
+
+- add zkevm chain
+
+## 0.43.21
+
+### Patch Changes
+
+- api: update client bindings
+
+## 0.43.20
+
+### Patch Changes
+
+- indexer: update bindings
+
+## 0.43.19
+
+### Patch Changes
+
+- session proof update
+
+## 0.43.18
+
+### Patch Changes
+
+- rpc client global check, hardening
+
+## 0.43.17
+
+### Patch Changes
+
+- rpc clients, check of 'global' is defined
+
+## 0.43.16
+
+### Patch Changes
+
+- ethers peerDep to v5, update rpc client global use
+
+## 0.43.15
+
+### Patch Changes
+
+- - provider: expand receiver type on some util methods
+
+## 0.43.14
+
+### Patch Changes
+
+- bump
+
+## 0.43.13
+
+### Patch Changes
+
+- update rpc bindings
+
+## 0.43.12
+
+### Patch Changes
+
+- provider: single wallet init, and add new unregisterWallet() method
+
+## 0.43.11
+
+### Patch Changes
+
+- fix lockfiles
+- re-add mocha type deleter
+
+## 0.43.10
+
+### Patch Changes
+
+- various improvements
+
+## 0.43.9
+
+### Patch Changes
+
+- update deps
+
+## 0.43.8
+
+### Patch Changes
+
+- network: JsonRpcProvider with caching
+
+## 0.43.7
+
+### Patch Changes
+
+- provider: fix wallet network init
+
+## 0.43.6
+
+### Patch Changes
+
+- metadatata: update rpc bindings
+
+## 0.43.5
+
+### Patch Changes
+
+- provider: do not set default network for connect messages
+- provider: forward missing error message
+
+## 0.43.4
+
+### Patch Changes
+
+- no-change version bump to fix incorrectly tagged snapshot build
+
+## 0.43.3
+
+### Patch Changes
+
+- metadata: update bindings
+
+## 0.43.2
+
+### Patch Changes
+
+- provider: implement connectUnchecked
+
+## 0.43.1
+
+### Patch Changes
+
+- update to latest ethauth dep
+
+## 0.43.0
+
+### Minor Changes
+
+- move ethers to a peer dependency
+
+## 0.42.10
+
+### Patch Changes
+
+- add auxDataProvider
+
+## 0.42.9
+
+### Patch Changes
+
+- provider: add eip-191 exceptions
+
+## 0.42.8
+
+### Patch Changes
+
+- provider: skip setting intent origin if we're unity plugin
+
+## 0.42.7
+
+### Patch Changes
+
+- Add sign in options to connection settings
+
+## 0.42.6
+
+### Patch Changes
+
+- api bindings update
+
+## 0.42.5
+
+### Patch Changes
+
+- relayer: don't treat missing receipt as hard failure
+
+## 0.42.4
+
+### Patch Changes
+
+- provider: add custom app protocol to connect options
+
+## 0.42.3
+
+### Patch Changes
+
+- update api bindings
+
+## 0.42.2
+
+### Patch Changes
+
+- disable rinkeby network
+
+## 0.42.1
+
+### Patch Changes
+
+- wallet: optional waitForReceipt parameter
+
+## 0.42.0
+
+### Minor Changes
+
+- relayer: estimateGasLimits -> simulate
+- add simulator package
+
+### Patch Changes
+
+- transactions: fix flattenAuxTransactions
+- provider: only filter nullish values
+- provider: re-map transaction 'gas' back to 'gasLimit'
+
+## 0.41.3
+
+### Patch Changes
+
+- api bindings update
+
+## 0.41.2
+
+### Patch Changes
+
+- api bindings update
+
+## 0.41.1
+
+### Patch Changes
+
+- update default networks
+
+## 0.41.0
+
+### Minor Changes
+
+- relayer: fix Relayer.wait() interface
+
+ The interface for calling Relayer.wait() has changed. Instead of a single optional ill-defined timeout/delay parameter, there are three optional parameters, in order:
+ - timeout: the maximum time to wait for the transaction receipt
+ - delay: the polling interval, i.e. the time to wait between requests
+ - maxFails: the maximum number of hard failures to tolerate before giving up
+
+ Please update your codebase accordingly.
+
+- relayer: add optional waitForReceipt parameter to Relayer.relay
+
+ The behaviour of Relayer.relay() was not well-defined with respect to whether or not it waited for a receipt.
+ This change allows the caller to specify whether to wait or not, with the default behaviour being to wait.
+
+### Patch Changes
+
+- relayer: wait receipt retry logic
+- fix wrapped object error
+- provider: forward delegateCall and revertOnError transaction fields
+
+## 0.40.6
+
+### Patch Changes
+
+- add arbitrum-nova chain
+
+## 0.40.5
+
+### Patch Changes
+
+- api: update bindings
+
+## 0.40.4
+
+### Patch Changes
+
+- add unreal transport
+
+## 0.40.3
+
+### Patch Changes
+
+- provider: fix MessageToSign message type
+
+## 0.40.2
+
+### Patch Changes
+
+- Wallet provider, loadSession method
+
+## 0.40.1
+
+### Patch Changes
+
+- export sequence.initWallet and sequence.getWallet
+
+## 0.40.0
+
+### Minor Changes
+
+- add sequence.initWallet(network, config) and sequence.getWallet() helper methods
+
+## 0.39.6
+
+### Patch Changes
+
+- indexer: update client bindings
+
+## 0.39.5
+
+### Patch Changes
+
+- provider: fix networkRpcUrl config option
+
+## 0.39.4
+
+### Patch Changes
+
+- api: update client bindings
+
+## 0.39.3
+
+### Patch Changes
+
+- add request method on Web3Provider
+
+## 0.39.2
+
+### Patch Changes
+
+- update umd name
+
+## 0.39.1
+
+### Patch Changes
+
+- add Aurora network
+- add origin info for accountsChanged event to handle it per dapp
+
+## 0.39.0
+
+### Minor Changes
+
+- abstract window.localStorage to interface type
+
+## 0.38.2
+
+### Patch Changes
+
+- provider: add Settings.defaultPurchaseAmount
+
+## 0.38.1
+
+### Patch Changes
+
+- update api and metadata rpc bindings
+
+## 0.38.0
+
+### Minor Changes
+
+- api: update bindings, change TokenPrice interface
+- bridge: remove @0xsequence/bridge package
+- api: update bindings, rename ContractCallArg to TupleComponent
+
+## 0.37.1
+
+### Patch Changes
+
+- Add back sortNetworks - Removing sorting was a breaking change for dapps on older versions which directly integrate sequence.
+
+## 0.37.0
+
+### Minor Changes
+
+- network related fixes and improvements
+- api: bindings: exchange rate lookups
+
+## 0.36.13
+
+### Patch Changes
+
+- api: update bindings with new price endpoints
+
+## 0.36.12
+
+### Patch Changes
+
+- wallet: skip remote signers if not needed
+- auth: check that signature meets threshold before requesting auth token
+
+## 0.36.11
+
+### Patch Changes
+
+- Prefix EIP191 message on wallet-request-handler
+
+## 0.36.10
+
+### Patch Changes
+
+- support bannerUrl on connect
+
+## 0.36.9
+
+### Patch Changes
+
+- minor dev xp improvements
+
+## 0.36.8
+
+### Patch Changes
+
+- more connect options (theme, payment providers, funding currencies)
+
+## 0.36.7
+
+### Patch Changes
+
+- fix missing break
+
+## 0.36.6
+
+### Patch Changes
+
+- wallet_switchEthereumChain support
+
+## 0.36.5
+
+### Patch Changes
+
+- auth: bump ethauth to 0.7.0
+ network, wallet: don't assume position of auth network in list
+ api/indexer/metadata: trim trailing slash on hostname, and add endpoint urls
+ relayer: Allow to specify local relayer transaction parameters like gas price or gas limit
+
+## 0.36.4
+
+### Patch Changes
+
+- Updating list of chain ids to include other ethereum compatible chains
+
+## 0.36.3
+
+### Patch Changes
+
+- provider: pass connect options to prompter methods
+
+## 0.36.2
+
+### Patch Changes
+
+- transactions: Setting target to 0x0 when empty to during SequenceTxAbiEncode
+
+## 0.36.1
+
+### Patch Changes
+
+- metadata: update client with more fields
+
+## 0.36.0
+
+### Minor Changes
+
+- relayer, wallet: fee quote support
+
+## 0.35.12
+
+### Patch Changes
+
+- provider: rename wallet.commands to wallet.utils
+
+## 0.35.11
+
+### Patch Changes
+
+- provider/utils: smoother message validation
+
+## 0.35.10
+
+### Patch Changes
+
+- upgrade deps
+
+## 0.35.9
+
+### Patch Changes
+
+- provider: window-transport override event handlers with new wallet instance
+
+## 0.35.8
+
+### Patch Changes
+
+- provider: async wallet sign in improvements
+
+## 0.35.7
+
+### Patch Changes
+
+- config: cache wallet configs
+
+## 0.35.6
+
+### Patch Changes
+
+- provider: support async signin of wallet request handler
+
+## 0.35.5
+
+### Patch Changes
+
+- wallet: skip threshold check during fee estimation
+
+## 0.35.4
+
+### Patch Changes
+
+- - browser extension mode, center window
+
+## 0.35.3
+
+### Patch Changes
+
+- - update window position when in browser extension mode
+
+## 0.35.2
+
+### Patch Changes
+
+- - provider: WindowMessageHandler accept optional windowHref
+
+## 0.35.1
+
+### Patch Changes
+
+- wallet: update config on undeployed too
+
+## 0.35.0
+
+### Minor Changes
+
+- - config: add buildStubSignature
+ - provider: add checks to signing cases for wallet deployment and config statuses
+ - provider: add prompt for wallet deployment
+ - relayer: add BaseRelayer.prependWalletDeploy
+ - relayer: add Relayer.feeOptions
+ - relayer: account for wallet deployment in fee estimation
+ - transactions: add fromTransactionish
+ - wallet: add Account.prependConfigUpdate
+ - wallet: add Account.getFeeOptions
+
+## 0.34.0
+
+### Minor Changes
+
+- - upgrade deps
+
+## 0.31.0
+
+### Minor Changes
+
+- - upgrading to ethers v5.5
+
+## 0.30.0
+
+### Minor Changes
+
+- - upgrade most deps
+
+## 0.29.8
+
+### Patch Changes
+
+- update api
+
+## 0.29.0
+
+### Minor Changes
+
+- major architectural changes in Sequence design
+ - only one API instance, API is no longer a per-chain service
+ - separate per-chain indexer service, API no longer handles indexing
+ - single contract metadata service, API no longer serves metadata
+
+ chaind package has been removed, indexer and metadata packages have been added
+
+ stronger typing with new explicit ChainId type
+
+ multicall fixes and improvements
+
+ forbid "wait" transactions in sendTransactionBatch calls
+
+## 0.28.0
+
+### Minor Changes
+
+- extension provider
+
+## 0.27.0
+
+### Minor Changes
+
+- Add requireFreshSigner lib to sessions
+
+## 0.25.1
+
+### Patch Changes
+
+- Fix build typescrypt issue
+
+## 0.25.0
+
+### Minor Changes
+
+- 10c8af8: Add estimator package
+ Fix multicall few calls bug
+
+## 0.23.0
+
+### Minor Changes
+
+- - relayer: offer variety of gas fee options from the relayer service"
+
+## 0.22.2
+
+### Patch Changes
+
+- e1c109e: Fix authProof on expired sessions
+
+## 0.22.1
+
+### Patch Changes
+
+- transport session cache
+
+## 0.22.0
+
+### Minor Changes
+
+- e667b65: Expose all relayer options on networks
+
+## 0.21.5
+
+### Patch Changes
+
+- Give priority to metaTxnId returned by relayer
+
+## 0.21.4
+
+### Patch Changes
+
+- Add has enough signers method
+
+## 0.21.3
+
+### Patch Changes
+
+- add window session cache
+
+## 0.21.2
+
+### Patch Changes
+
+- exception handlind in relayer
+
+## 0.21.0
+
+### Minor Changes
+
+- - fix gas estimation on wallets with large number of signers
+ - update to session handling and wallet config construction upon auth
+
+## 0.19.3
+
+### Patch Changes
+
+- jwtAuth visibility, package version sync
+
+## 0.19.2
+
+### Patch Changes
+
+- - api: change jwtAuth visibility
+
+## 0.19.0
+
+### Minor Changes
+
+- - provider, improve dapp / wallet transport io
+
+## 0.18.0
+
+### Minor Changes
+
+- relayer improvements and pending transaction handling
+
+## 0.16.0
+
+### Minor Changes
+
+- relayer as its own service separate from chaind
+
+## 0.15.1
+
+### Patch Changes
+
+- update api clients
+
+## 0.14.3
+
+### Patch Changes
+
+- Fix 0xSequence relayer dependencies
+
+## 0.14.2
+
+### Patch Changes
+
+- Add debug logs to rpc-relayer
+
+## 0.14.0
+
+### Minor Changes
+
+- update sequence utils finder which includes optimization
+
+## 0.13.0
+
+### Minor Changes
+
+- Update SequenceUtils deployed contract
+
+## 0.12.1
+
+### Patch Changes
+
+- npm bump
+
+## 0.12.0
+
+### Minor Changes
+
+- provider: improvements to window transport
+
+## 0.11.4
+
+### Patch Changes
+
+- update api client
+
+## 0.11.3
+
+### Patch Changes
+
+- improve openWindow state options handling
+
+## 0.11.2
+
+### Patch Changes
+
+- Fix multicall proxy scopes
+
+## 0.11.1
+
+### Patch Changes
+
+- Add support for dynamic and nested signatures
+
+## 0.11.0
+
+### Minor Changes
+
+- Update wallet context to 1.7 contracts
+
+## 0.10.9
+
+### Patch Changes
+
+- add support for public addresses as signers in session.open
+
+## 0.10.8
+
+### Patch Changes
+
+- Multicall production configuration
+
+## 0.10.7
+
+### Patch Changes
+
+- allow provider transport to force disconnect
+
+## 0.10.6
+
+### Patch Changes
+
+- - fix getWalletState method
+
+## 0.10.5
+
+### Patch Changes
+
+- update relayer gas refund options
+
+## 0.10.4
+
+### Patch Changes
+
+- Update api proto
+
+## 0.10.3
+
+### Patch Changes
+
+- Fix loading config cross-chain
+
+## 0.10.2
+
+### Patch Changes
+
+- - message digest fix
+
+## 0.10.1
+
+### Patch Changes
+
+- upgrade deps
+
+## 0.10.0
+
+### Minor Changes
+
+- Deployed new contracts with ERC1271 signer support
+
+## 0.9.6
+
+### Patch Changes
+
+- Update ABIs for latest sequence contracts
+
+## 0.9.3
+
+### Patch Changes
+
+- - minor improvements
+
+## 0.9.1
+
+### Patch Changes
+
+- - patch bump
+
+## 0.9.0
+
+### Minor Changes
+
+- - provider transport hardening
+
+## 0.8.5
+
+### Patch Changes
+
+- - use latest wallet-contracts
+
+## 0.8.4
+
+### Patch Changes
+
+- - minor improvements, name updates and comments
+
+## 0.8.3
+
+### Patch Changes
+
+- - refinements
+
+ - normalize signer address in config
+
+ - provider: getWalletState() method to WalletProvider
+
+## 0.8.2
+
+### Patch Changes
+
+- - field rename and ethauth dependency bump
+
+## 0.8.1
+
+### Patch Changes
+
+- - variety of optimizations
+
+## 0.8.0
+
+### Minor Changes
+
+- - changeset fix
+
+## 0.7.0
+
+### Patch Changes
+
+- 6f11ed7: sequence.js, init release
diff --git a/packages/abi/README.md b/packages/abi/README.md
new file mode 100644
index 0000000000..e0bbc2309a
--- /dev/null
+++ b/packages/abi/README.md
@@ -0,0 +1,4 @@
+@0xsequence/abi
+===============
+
+See [0xsequence project page](https://github.com/0xsequence/sequence.js).
diff --git a/packages/abi/package.json b/packages/abi/package.json
new file mode 100644
index 0000000000..c0305eccc1
--- /dev/null
+++ b/packages/abi/package.json
@@ -0,0 +1,22 @@
+{
+ "name": "@0xsequence/abi",
+ "version": "2.0.0",
+ "description": "abi sub-package for Sequence",
+ "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/abi",
+ "source": "src/index.ts",
+ "main": "dist/0xsequence-abi.cjs.js",
+ "module": "dist/0xsequence-abi.esm.js",
+ "author": "Horizon Blockchain Games",
+ "license": "Apache-2.0",
+ "scripts": {
+ "test": "echo",
+ "typecheck": "tsc --noEmit"
+ },
+ "dependencies": {},
+ "peerDependencies": {},
+ "devDependencies": {},
+ "files": [
+ "src",
+ "dist"
+ ]
+}
diff --git a/packages/abi/src/index.ts b/packages/abi/src/index.ts
new file mode 100644
index 0000000000..6537ee23d2
--- /dev/null
+++ b/packages/abi/src/index.ts
@@ -0,0 +1 @@
+export { walletContracts } from './wallet'
diff --git a/packages/abi/src/tokens/erc1155.ts b/packages/abi/src/tokens/erc1155.ts
new file mode 100644
index 0000000000..1e20ce4050
--- /dev/null
+++ b/packages/abi/src/tokens/erc1155.ts
@@ -0,0 +1,3 @@
+export const abi = []
+
+export const returns = {}
diff --git a/packages/abi/src/tokens/erc20.ts b/packages/abi/src/tokens/erc20.ts
new file mode 100644
index 0000000000..1e20ce4050
--- /dev/null
+++ b/packages/abi/src/tokens/erc20.ts
@@ -0,0 +1,3 @@
+export const abi = []
+
+export const returns = {}
diff --git a/packages/abi/src/tokens/erc721.ts b/packages/abi/src/tokens/erc721.ts
new file mode 100644
index 0000000000..1e20ce4050
--- /dev/null
+++ b/packages/abi/src/tokens/erc721.ts
@@ -0,0 +1,3 @@
+export const abi = []
+
+export const returns = {}
diff --git a/packages/abi/src/wallet/erc1271.ts b/packages/abi/src/wallet/erc1271.ts
new file mode 100644
index 0000000000..14e0576117
--- /dev/null
+++ b/packages/abi/src/wallet/erc1271.ts
@@ -0,0 +1,26 @@
+export const abi = [
+ {
+ type: 'function',
+ name: 'isValidSignature',
+ constant: true,
+ inputs: [
+ {
+ type: 'bytes32'
+ },
+ {
+ type: 'bytes'
+ }
+ ],
+ outputs: [
+ {
+ type: 'bytes4'
+ }
+ ],
+ payable: false,
+ stateMutability: 'view'
+ }
+]
+
+export const returns = {
+ isValidSignatureBytes32: '0x1626ba7e'
+}
diff --git a/packages/abi/src/wallet/erc5719.ts b/packages/abi/src/wallet/erc5719.ts
new file mode 100644
index 0000000000..2f9b43b6ab
--- /dev/null
+++ b/packages/abi/src/wallet/erc5719.ts
@@ -0,0 +1,19 @@
+export const abi = [
+ {
+ inputs: [
+ {
+ internalType: 'bytes32',
+ type: 'bytes32'
+ }
+ ],
+ name: 'getAlternativeSignature',
+ outputs: [
+ {
+ internalType: 'string',
+ type: 'string'
+ }
+ ],
+ stateMutability: 'view',
+ type: 'function'
+ }
+]
diff --git a/packages/abi/src/wallet/erc6492.ts b/packages/abi/src/wallet/erc6492.ts
new file mode 100644
index 0000000000..dcaf022a50
--- /dev/null
+++ b/packages/abi/src/wallet/erc6492.ts
@@ -0,0 +1,61 @@
+export const abi = [
+ { inputs: [{ internalType: 'bytes', name: 'error', type: 'bytes' }], name: 'ERC1271Revert', type: 'error' },
+ { inputs: [{ internalType: 'bytes', name: 'error', type: 'bytes' }], name: 'ERC6492DeployFailed', type: 'error' },
+ {
+ inputs: [
+ { internalType: 'address', name: '_signer', type: 'address' },
+ { internalType: 'bytes32', name: '_hash', type: 'bytes32' },
+ { internalType: 'bytes', name: '_signature', type: 'bytes' }
+ ],
+ name: 'isValidSig',
+ outputs: [{ internalType: 'bool', name: '', type: 'bool' }],
+ stateMutability: 'nonpayable',
+ type: 'function'
+ },
+ {
+ inputs: [
+ { internalType: 'address', name: '_signer', type: 'address' },
+ { internalType: 'bytes32', name: '_hash', type: 'bytes32' },
+ { internalType: 'bytes', name: '_signature', type: 'bytes' },
+ { internalType: 'bool', name: 'allowSideEffects', type: 'bool' },
+ { internalType: 'bool', name: 'deployAlreadyDeployed', type: 'bool' }
+ ],
+ name: 'isValidSigImpl',
+ outputs: [{ internalType: 'bool', name: '', type: 'bool' }],
+ stateMutability: 'nonpayable',
+ type: 'function'
+ },
+ {
+ inputs: [
+ { internalType: 'address', name: '_signer', type: 'address' },
+ { internalType: 'bytes32', name: '_hash', type: 'bytes32' },
+ { internalType: 'bytes', name: '_signature', type: 'bytes' }
+ ],
+ name: 'isValidSigNoThrow',
+ outputs: [{ internalType: 'bool', name: '', type: 'bool' }],
+ stateMutability: 'nonpayable',
+ type: 'function'
+ },
+ {
+ inputs: [
+ { internalType: 'address', name: '_signer', type: 'address' },
+ { internalType: 'bytes32', name: '_hash', type: 'bytes32' },
+ { internalType: 'bytes', name: '_signature', type: 'bytes' }
+ ],
+ name: 'isValidSigWithSideEffects',
+ outputs: [{ internalType: 'bool', name: '', type: 'bool' }],
+ stateMutability: 'nonpayable',
+ type: 'function'
+ },
+ {
+ inputs: [
+ { internalType: 'address', name: '_signer', type: 'address' },
+ { internalType: 'bytes32', name: '_hash', type: 'bytes32' },
+ { internalType: 'bytes', name: '_signature', type: 'bytes' }
+ ],
+ name: 'isValidSigWithSideEffectsNoThrow',
+ outputs: [{ internalType: 'bool', name: '', type: 'bool' }],
+ stateMutability: 'nonpayable',
+ type: 'function'
+ }
+]
diff --git a/packages/abi/src/wallet/factory.ts b/packages/abi/src/wallet/factory.ts
new file mode 100644
index 0000000000..df5ef5fc66
--- /dev/null
+++ b/packages/abi/src/wallet/factory.ts
@@ -0,0 +1,18 @@
+export const abi = [
+ {
+ type: 'function',
+ name: 'deploy',
+ constant: false,
+ inputs: [
+ {
+ type: 'address'
+ },
+ {
+ type: 'bytes32'
+ }
+ ],
+ outputs: [],
+ payable: true,
+ stateMutability: 'payable'
+ }
+]
diff --git a/packages/abi/src/wallet/index.ts b/packages/abi/src/wallet/index.ts
new file mode 100644
index 0000000000..cb9bdf867c
--- /dev/null
+++ b/packages/abi/src/wallet/index.ts
@@ -0,0 +1,19 @@
+import * as erc5719 from './erc5719'
+import * as erc1271 from './erc1271'
+import * as erc6492 from './erc6492'
+import * as factory from './factory'
+import * as mainModule from './mainModule'
+import * as mainModuleUpgradable from './mainModuleUpgradable'
+import * as sequenceUtils from './sequenceUtils'
+import * as requireFreshSigner from './libs/requireFreshSigners'
+
+export const walletContracts = {
+ erc6492,
+ erc5719,
+ erc1271,
+ factory,
+ mainModule,
+ mainModuleUpgradable,
+ sequenceUtils,
+ requireFreshSigner
+}
diff --git a/packages/abi/src/wallet/libs/requireFreshSigners.ts b/packages/abi/src/wallet/libs/requireFreshSigners.ts
new file mode 100644
index 0000000000..ef8f78657c
--- /dev/null
+++ b/packages/abi/src/wallet/libs/requireFreshSigners.ts
@@ -0,0 +1,15 @@
+export const abi = [
+ {
+ inputs: [
+ {
+ internalType: 'address',
+ name: '',
+ type: 'address'
+ }
+ ],
+ name: 'requireFreshSigner',
+ outputs: [],
+ stateMutability: 'nonpayable',
+ type: 'function'
+ }
+]
diff --git a/packages/abi/src/wallet/mainModule.ts b/packages/abi/src/wallet/mainModule.ts
new file mode 100644
index 0000000000..e92fde8f1d
--- /dev/null
+++ b/packages/abi/src/wallet/mainModule.ts
@@ -0,0 +1,158 @@
+export const abi = [
+ {
+ type: 'function',
+ name: 'nonce',
+ constant: true,
+ inputs: [],
+ outputs: [
+ {
+ type: 'uint256'
+ }
+ ],
+ payable: false,
+ stateMutability: 'view'
+ },
+ {
+ type: 'function',
+ name: 'readNonce',
+ constant: true,
+ inputs: [
+ {
+ type: 'uint256'
+ }
+ ],
+ outputs: [
+ {
+ type: 'uint256'
+ }
+ ],
+ payable: false,
+ stateMutability: 'view'
+ },
+ {
+ type: 'function',
+ name: 'updateImplementation',
+ constant: false,
+ inputs: [
+ {
+ type: 'address'
+ }
+ ],
+ outputs: [],
+ payable: false,
+ stateMutability: 'nonpayable'
+ },
+ {
+ type: 'function',
+ name: 'selfExecute',
+ constant: false,
+ inputs: [
+ {
+ components: [
+ {
+ type: 'bool',
+ name: 'delegateCall'
+ },
+ {
+ type: 'bool',
+ name: 'revertOnError'
+ },
+ {
+ type: 'uint256',
+ name: 'gasLimit'
+ },
+ {
+ type: 'address',
+ name: 'target'
+ },
+ {
+ type: 'uint256',
+ name: 'value'
+ },
+ {
+ type: 'bytes',
+ name: 'data'
+ }
+ ],
+ type: 'tuple[]'
+ }
+ ],
+ outputs: [],
+ payable: false,
+ stateMutability: 'nonpayable'
+ },
+ {
+ type: 'function',
+ name: 'execute',
+ constant: false,
+ inputs: [
+ {
+ components: [
+ {
+ type: 'bool',
+ name: 'delegateCall'
+ },
+ {
+ type: 'bool',
+ name: 'revertOnError'
+ },
+ {
+ type: 'uint256',
+ name: 'gasLimit'
+ },
+ {
+ type: 'address',
+ name: 'target'
+ },
+ {
+ type: 'uint256',
+ name: 'value'
+ },
+ {
+ type: 'bytes',
+ name: 'data'
+ }
+ ],
+ type: 'tuple[]'
+ },
+ {
+ type: 'uint256'
+ },
+ {
+ type: 'bytes'
+ }
+ ],
+ outputs: [],
+ payable: false,
+ stateMutability: 'nonpayable'
+ },
+ {
+ type: 'function',
+ name: 'createContract',
+ inputs: [
+ {
+ type: 'bytes'
+ }
+ ],
+ payable: true,
+ stateMutability: 'payable'
+ },
+ {
+ type: 'function',
+ name: 'setExtraImageHash',
+ constant: false,
+ inputs: [
+ {
+ type: 'bytes32',
+ name: 'imageHash'
+ },
+ {
+ type: 'uint256',
+ name: 'expiration'
+ }
+ ],
+ outputs: [],
+ payable: false,
+ stateMutability: 'nonpayable'
+ }
+]
diff --git a/packages/abi/src/wallet/mainModuleUpgradable.ts b/packages/abi/src/wallet/mainModuleUpgradable.ts
new file mode 100644
index 0000000000..e49298a38f
--- /dev/null
+++ b/packages/abi/src/wallet/mainModuleUpgradable.ts
@@ -0,0 +1,28 @@
+export const abi = [
+ {
+ type: 'function',
+ name: 'updateImageHash',
+ constant: true,
+ inputs: [
+ {
+ type: 'bytes32'
+ }
+ ],
+ outputs: [],
+ payable: false,
+ stateMutability: 'view'
+ },
+ {
+ type: 'function',
+ name: 'imageHash',
+ constant: true,
+ inputs: [],
+ outputs: [
+ {
+ type: 'bytes32'
+ }
+ ],
+ payable: false,
+ stateMutability: 'view'
+ }
+]
diff --git a/packages/abi/src/wallet/sequenceUtils.ts b/packages/abi/src/wallet/sequenceUtils.ts
new file mode 100644
index 0000000000..7b52c69c8a
--- /dev/null
+++ b/packages/abi/src/wallet/sequenceUtils.ts
@@ -0,0 +1,516 @@
+export const abi = [
+ {
+ inputs: [
+ {
+ internalType: 'address',
+ name: '_factory',
+ type: 'address'
+ },
+ {
+ internalType: 'address',
+ name: '_mainModule',
+ type: 'address'
+ }
+ ],
+ stateMutability: 'nonpayable',
+ type: 'constructor'
+ },
+ {
+ anonymous: false,
+ inputs: [
+ {
+ indexed: true,
+ internalType: 'address',
+ name: '_wallet',
+ type: 'address'
+ },
+ {
+ indexed: true,
+ internalType: 'bytes32',
+ name: '_imageHash',
+ type: 'bytes32'
+ },
+ {
+ indexed: false,
+ internalType: 'uint256',
+ name: '_threshold',
+ type: 'uint256'
+ },
+ {
+ indexed: false,
+ internalType: 'bytes',
+ name: '_signers',
+ type: 'bytes'
+ }
+ ],
+ name: 'RequiredConfig',
+ type: 'event'
+ },
+ {
+ anonymous: false,
+ inputs: [
+ {
+ indexed: true,
+ internalType: 'address',
+ name: '_wallet',
+ type: 'address'
+ },
+ {
+ indexed: true,
+ internalType: 'address',
+ name: '_signer',
+ type: 'address'
+ }
+ ],
+ name: 'RequiredSigner',
+ type: 'event'
+ },
+ {
+ inputs: [
+ {
+ internalType: 'address',
+ name: '_addr',
+ type: 'address'
+ }
+ ],
+ name: 'callBalanceOf',
+ outputs: [
+ {
+ internalType: 'uint256',
+ name: '',
+ type: 'uint256'
+ }
+ ],
+ stateMutability: 'view',
+ type: 'function'
+ },
+ {
+ inputs: [],
+ name: 'callBlockNumber',
+ outputs: [
+ {
+ internalType: 'uint256',
+ name: '',
+ type: 'uint256'
+ }
+ ],
+ stateMutability: 'view',
+ type: 'function'
+ },
+ {
+ inputs: [
+ {
+ internalType: 'uint256',
+ name: '_i',
+ type: 'uint256'
+ }
+ ],
+ name: 'callBlockhash',
+ outputs: [
+ {
+ internalType: 'bytes32',
+ name: '',
+ type: 'bytes32'
+ }
+ ],
+ stateMutability: 'view',
+ type: 'function'
+ },
+ {
+ inputs: [],
+ name: 'callChainId',
+ outputs: [
+ {
+ internalType: 'uint256',
+ name: 'id',
+ type: 'uint256'
+ }
+ ],
+ stateMutability: 'pure',
+ type: 'function'
+ },
+ {
+ inputs: [
+ {
+ internalType: 'address',
+ name: '_addr',
+ type: 'address'
+ }
+ ],
+ name: 'callCode',
+ outputs: [
+ {
+ internalType: 'bytes',
+ name: 'code',
+ type: 'bytes'
+ }
+ ],
+ stateMutability: 'view',
+ type: 'function'
+ },
+ {
+ inputs: [
+ {
+ internalType: 'address',
+ name: '_addr',
+ type: 'address'
+ }
+ ],
+ name: 'callCodeHash',
+ outputs: [
+ {
+ internalType: 'bytes32',
+ name: 'codeHash',
+ type: 'bytes32'
+ }
+ ],
+ stateMutability: 'view',
+ type: 'function'
+ },
+ {
+ inputs: [
+ {
+ internalType: 'address',
+ name: '_addr',
+ type: 'address'
+ }
+ ],
+ name: 'callCodeSize',
+ outputs: [
+ {
+ internalType: 'uint256',
+ name: 'size',
+ type: 'uint256'
+ }
+ ],
+ stateMutability: 'view',
+ type: 'function'
+ },
+ {
+ inputs: [],
+ name: 'callCoinbase',
+ outputs: [
+ {
+ internalType: 'address',
+ name: '',
+ type: 'address'
+ }
+ ],
+ stateMutability: 'view',
+ type: 'function'
+ },
+ {
+ inputs: [],
+ name: 'callDifficulty',
+ outputs: [
+ {
+ internalType: 'uint256',
+ name: '',
+ type: 'uint256'
+ }
+ ],
+ stateMutability: 'view',
+ type: 'function'
+ },
+ {
+ inputs: [],
+ name: 'callGasLeft',
+ outputs: [
+ {
+ internalType: 'uint256',
+ name: '',
+ type: 'uint256'
+ }
+ ],
+ stateMutability: 'view',
+ type: 'function'
+ },
+ {
+ inputs: [],
+ name: 'callGasLimit',
+ outputs: [
+ {
+ internalType: 'uint256',
+ name: '',
+ type: 'uint256'
+ }
+ ],
+ stateMutability: 'view',
+ type: 'function'
+ },
+ {
+ inputs: [],
+ name: 'callGasPrice',
+ outputs: [
+ {
+ internalType: 'uint256',
+ name: '',
+ type: 'uint256'
+ }
+ ],
+ stateMutability: 'view',
+ type: 'function'
+ },
+ {
+ inputs: [],
+ name: 'callOrigin',
+ outputs: [
+ {
+ internalType: 'address',
+ name: '',
+ type: 'address'
+ }
+ ],
+ stateMutability: 'view',
+ type: 'function'
+ },
+ {
+ inputs: [],
+ name: 'callTimestamp',
+ outputs: [
+ {
+ internalType: 'uint256',
+ name: '',
+ type: 'uint256'
+ }
+ ],
+ stateMutability: 'view',
+ type: 'function'
+ },
+ {
+ inputs: [
+ {
+ internalType: 'address',
+ name: '',
+ type: 'address'
+ }
+ ],
+ name: 'knownImageHashes',
+ outputs: [
+ {
+ internalType: 'bytes32',
+ name: '',
+ type: 'bytes32'
+ }
+ ],
+ stateMutability: 'view',
+ type: 'function'
+ },
+ {
+ inputs: [
+ {
+ internalType: 'bytes32',
+ name: '',
+ type: 'bytes32'
+ }
+ ],
+ name: 'lastImageHashUpdate',
+ outputs: [
+ {
+ internalType: 'uint256',
+ name: '',
+ type: 'uint256'
+ }
+ ],
+ stateMutability: 'view',
+ type: 'function'
+ },
+ {
+ inputs: [
+ {
+ internalType: 'address',
+ name: '',
+ type: 'address'
+ }
+ ],
+ name: 'lastSignerUpdate',
+ outputs: [
+ {
+ internalType: 'uint256',
+ name: '',
+ type: 'uint256'
+ }
+ ],
+ stateMutability: 'view',
+ type: 'function'
+ },
+ {
+ inputs: [
+ {
+ internalType: 'address',
+ name: '',
+ type: 'address'
+ }
+ ],
+ name: 'lastWalletUpdate',
+ outputs: [
+ {
+ internalType: 'uint256',
+ name: '',
+ type: 'uint256'
+ }
+ ],
+ stateMutability: 'view',
+ type: 'function'
+ },
+ {
+ inputs: [
+ {
+ components: [
+ {
+ internalType: 'bool',
+ name: 'delegateCall',
+ type: 'bool'
+ },
+ {
+ internalType: 'bool',
+ name: 'revertOnError',
+ type: 'bool'
+ },
+ {
+ internalType: 'uint256',
+ name: 'gasLimit',
+ type: 'uint256'
+ },
+ {
+ internalType: 'address',
+ name: 'target',
+ type: 'address'
+ },
+ {
+ internalType: 'uint256',
+ name: 'value',
+ type: 'uint256'
+ },
+ {
+ internalType: 'bytes',
+ name: 'data',
+ type: 'bytes'
+ }
+ ],
+ internalType: 'struct IModuleCalls.Transaction[]',
+ name: '_txs',
+ type: 'tuple[]'
+ }
+ ],
+ name: 'multiCall',
+ outputs: [
+ {
+ internalType: 'bool[]',
+ name: '_successes',
+ type: 'bool[]'
+ },
+ {
+ internalType: 'bytes[]',
+ name: '_results',
+ type: 'bytes[]'
+ }
+ ],
+ stateMutability: 'payable',
+ type: 'function'
+ },
+ {
+ inputs: [
+ {
+ internalType: 'address',
+ name: '_wallet',
+ type: 'address'
+ },
+ {
+ internalType: 'uint256',
+ name: '_threshold',
+ type: 'uint256'
+ },
+ {
+ components: [
+ {
+ internalType: 'uint256',
+ name: 'weight',
+ type: 'uint256'
+ },
+ {
+ internalType: 'address',
+ name: 'signer',
+ type: 'address'
+ }
+ ],
+ internalType: 'struct RequireUtils.Member[]',
+ name: '_members',
+ type: 'tuple[]'
+ },
+ {
+ internalType: 'bool',
+ name: '_index',
+ type: 'bool'
+ }
+ ],
+ name: 'publishConfig',
+ outputs: [],
+ stateMutability: 'nonpayable',
+ type: 'function'
+ },
+ {
+ inputs: [
+ {
+ internalType: 'address',
+ name: '_wallet',
+ type: 'address'
+ },
+ {
+ internalType: 'bytes32',
+ name: '_hash',
+ type: 'bytes32'
+ },
+ {
+ internalType: 'uint256',
+ name: '_sizeMembers',
+ type: 'uint256'
+ },
+ {
+ internalType: 'bytes',
+ name: '_signature',
+ type: 'bytes'
+ },
+ {
+ internalType: 'bool',
+ name: '_index',
+ type: 'bool'
+ }
+ ],
+ name: 'publishInitialSigners',
+ outputs: [],
+ stateMutability: 'nonpayable',
+ type: 'function'
+ },
+ {
+ inputs: [
+ {
+ internalType: 'address',
+ name: '_wallet',
+ type: 'address'
+ },
+ {
+ internalType: 'uint256',
+ name: '_nonce',
+ type: 'uint256'
+ }
+ ],
+ name: 'requireMinNonce',
+ outputs: [],
+ stateMutability: 'view',
+ type: 'function'
+ },
+ {
+ inputs: [
+ {
+ internalType: 'uint256',
+ name: '_expiration',
+ type: 'uint256'
+ }
+ ],
+ name: 'requireNonExpired',
+ outputs: [],
+ stateMutability: 'view',
+ type: 'function'
+ }
+]
diff --git a/packages/account/CHANGELOG.md b/packages/account/CHANGELOG.md
new file mode 100644
index 0000000000..c506f50538
--- /dev/null
+++ b/packages/account/CHANGELOG.md
@@ -0,0 +1,1770 @@
+# @0xsequence/account
+
+## 2.0.0
+
+### Major Changes
+
+- changeset
+
+### Patch Changes
+
+- Updated dependencies
+ - @0xsequence/abi@2.0.0
+ - @0xsequence/core@2.0.0
+ - @0xsequence/migration@2.0.0
+ - @0xsequence/network@2.0.0
+ - @0xsequence/relayer@2.0.0
+ - @0xsequence/sessions@2.0.0
+ - @0xsequence/utils@2.0.0
+ - @0xsequence/wallet@2.0.0
+
+## 1.10.14
+
+### Patch Changes
+
+- network: add borne-testnet to allNetworks
+- Updated dependencies
+ - @0xsequence/abi@1.10.14
+ - @0xsequence/core@1.10.14
+ - @0xsequence/migration@1.10.14
+ - @0xsequence/network@1.10.14
+ - @0xsequence/relayer@1.10.14
+ - @0xsequence/sessions@1.10.14
+ - @0xsequence/utils@1.10.14
+ - @0xsequence/wallet@1.10.14
+
+## 1.10.13
+
+### Patch Changes
+
+- network: add borne testnet
+- Updated dependencies
+ - @0xsequence/abi@1.10.13
+ - @0xsequence/core@1.10.13
+ - @0xsequence/migration@1.10.13
+ - @0xsequence/network@1.10.13
+ - @0xsequence/relayer@1.10.13
+ - @0xsequence/sessions@1.10.13
+ - @0xsequence/utils@1.10.13
+ - @0xsequence/wallet@1.10.13
+
+## 1.10.12
+
+### Patch Changes
+
+- api: update bindings
+- global/window -> globalThis
+- Updated dependencies
+- Updated dependencies
+ - @0xsequence/abi@1.10.12
+ - @0xsequence/core@1.10.12
+ - @0xsequence/migration@1.10.12
+ - @0xsequence/network@1.10.12
+ - @0xsequence/relayer@1.10.12
+ - @0xsequence/sessions@1.10.12
+ - @0xsequence/utils@1.10.12
+ - @0xsequence/wallet@1.10.12
+
+## 1.10.11
+
+### Patch Changes
+
+- waas: updated intent.gen without webrpc types, errors exported from authenticator.gen
+- Updated dependencies
+ - @0xsequence/abi@1.10.11
+ - @0xsequence/core@1.10.11
+ - @0xsequence/migration@1.10.11
+ - @0xsequence/network@1.10.11
+ - @0xsequence/relayer@1.10.11
+ - @0xsequence/sessions@1.10.11
+ - @0xsequence/utils@1.10.11
+ - @0xsequence/wallet@1.10.11
+
+## 1.10.10
+
+### Patch Changes
+
+- metadata: update bindings with new contract collections api
+- Updated dependencies
+ - @0xsequence/abi@1.10.10
+ - @0xsequence/core@1.10.10
+ - @0xsequence/migration@1.10.10
+ - @0xsequence/network@1.10.10
+ - @0xsequence/relayer@1.10.10
+ - @0xsequence/sessions@1.10.10
+ - @0xsequence/utils@1.10.10
+ - @0xsequence/wallet@1.10.10
+
+## 1.10.9
+
+### Patch Changes
+
+- waas minor update
+- Updated dependencies
+ - @0xsequence/abi@1.10.9
+ - @0xsequence/core@1.10.9
+ - @0xsequence/migration@1.10.9
+ - @0xsequence/network@1.10.9
+ - @0xsequence/relayer@1.10.9
+ - @0xsequence/sessions@1.10.9
+ - @0xsequence/utils@1.10.9
+ - @0xsequence/wallet@1.10.9
+
+## 1.10.8
+
+### Patch Changes
+
+- update metadata bindings
+- Updated dependencies
+ - @0xsequence/abi@1.10.8
+ - @0xsequence/core@1.10.8
+ - @0xsequence/migration@1.10.8
+ - @0xsequence/network@1.10.8
+ - @0xsequence/relayer@1.10.8
+ - @0xsequence/sessions@1.10.8
+ - @0xsequence/utils@1.10.8
+ - @0xsequence/wallet@1.10.8
+
+## 1.10.7
+
+### Patch Changes
+
+- minor fixes to waas client
+- Updated dependencies
+ - @0xsequence/abi@1.10.7
+ - @0xsequence/core@1.10.7
+ - @0xsequence/migration@1.10.7
+ - @0xsequence/network@1.10.7
+ - @0xsequence/relayer@1.10.7
+ - @0xsequence/sessions@1.10.7
+ - @0xsequence/utils@1.10.7
+ - @0xsequence/wallet@1.10.7
+
+## 1.10.6
+
+### Patch Changes
+
+- metadata: update bindings
+- Updated dependencies
+ - @0xsequence/abi@1.10.6
+ - @0xsequence/core@1.10.6
+ - @0xsequence/migration@1.10.6
+ - @0xsequence/network@1.10.6
+ - @0xsequence/relayer@1.10.6
+ - @0xsequence/sessions@1.10.6
+ - @0xsequence/utils@1.10.6
+ - @0xsequence/wallet@1.10.6
+
+## 1.10.5
+
+### Patch Changes
+
+- network: ape-chain-testnet -> apechain-testnet
+- Updated dependencies
+ - @0xsequence/abi@1.10.5
+ - @0xsequence/core@1.10.5
+ - @0xsequence/migration@1.10.5
+ - @0xsequence/network@1.10.5
+ - @0xsequence/relayer@1.10.5
+ - @0xsequence/sessions@1.10.5
+ - @0xsequence/utils@1.10.5
+ - @0xsequence/wallet@1.10.5
+
+## 1.10.4
+
+### Patch Changes
+
+- network: add b3-sepolia, ape-chain-testnet, blast, blast-sepolia
+- Updated dependencies
+ - @0xsequence/abi@1.10.4
+ - @0xsequence/core@1.10.4
+ - @0xsequence/migration@1.10.4
+ - @0xsequence/network@1.10.4
+ - @0xsequence/relayer@1.10.4
+ - @0xsequence/sessions@1.10.4
+ - @0xsequence/utils@1.10.4
+ - @0xsequence/wallet@1.10.4
+
+## 1.10.3
+
+### Patch Changes
+
+- typing fix
+- Updated dependencies
+ - @0xsequence/abi@1.10.3
+ - @0xsequence/core@1.10.3
+ - @0xsequence/migration@1.10.3
+ - @0xsequence/network@1.10.3
+ - @0xsequence/relayer@1.10.3
+ - @0xsequence/sessions@1.10.3
+ - @0xsequence/utils@1.10.3
+ - @0xsequence/wallet@1.10.3
+
+## 1.10.2
+
+### Patch Changes
+
+- - waas: add getIdToken method
+ - indexer: update api client
+- Updated dependencies
+ - @0xsequence/abi@1.10.2
+ - @0xsequence/core@1.10.2
+ - @0xsequence/migration@1.10.2
+ - @0xsequence/network@1.10.2
+ - @0xsequence/relayer@1.10.2
+ - @0xsequence/sessions@1.10.2
+ - @0xsequence/utils@1.10.2
+ - @0xsequence/wallet@1.10.2
+
+## 1.10.1
+
+### Patch Changes
+
+- metadata: update bindings
+- Updated dependencies
+ - @0xsequence/abi@1.10.1
+ - @0xsequence/core@1.10.1
+ - @0xsequence/migration@1.10.1
+ - @0xsequence/network@1.10.1
+ - @0xsequence/relayer@1.10.1
+ - @0xsequence/sessions@1.10.1
+ - @0xsequence/utils@1.10.1
+ - @0xsequence/wallet@1.10.1
+
+## 1.10.0
+
+### Minor Changes
+
+- waas release v1.3.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @0xsequence/abi@1.10.0
+ - @0xsequence/core@1.10.0
+ - @0xsequence/migration@1.10.0
+ - @0xsequence/network@1.10.0
+ - @0xsequence/relayer@1.10.0
+ - @0xsequence/sessions@1.10.0
+ - @0xsequence/utils@1.10.0
+ - @0xsequence/wallet@1.10.0
+
+## 1.9.37
+
+### Patch Changes
+
+- network: adds nativeToken data to NetworkMetadata constants
+- Updated dependencies
+ - @0xsequence/abi@1.9.37
+ - @0xsequence/core@1.9.37
+ - @0xsequence/migration@1.9.37
+ - @0xsequence/network@1.9.37
+ - @0xsequence/relayer@1.9.37
+ - @0xsequence/sessions@1.9.37
+ - @0xsequence/utils@1.9.37
+ - @0xsequence/wallet@1.9.37
+
+## 1.9.36
+
+### Patch Changes
+
+- guard: export client
+- Updated dependencies
+ - @0xsequence/abi@1.9.36
+ - @0xsequence/core@1.9.36
+ - @0xsequence/migration@1.9.36
+ - @0xsequence/network@1.9.36
+ - @0xsequence/relayer@1.9.36
+ - @0xsequence/sessions@1.9.36
+ - @0xsequence/utils@1.9.36
+ - @0xsequence/wallet@1.9.36
+
+## 1.9.35
+
+### Patch Changes
+
+- guard: update bindings
+- Updated dependencies
+ - @0xsequence/abi@1.9.35
+ - @0xsequence/core@1.9.35
+ - @0xsequence/migration@1.9.35
+ - @0xsequence/network@1.9.35
+ - @0xsequence/relayer@1.9.35
+ - @0xsequence/sessions@1.9.35
+ - @0xsequence/utils@1.9.35
+ - @0xsequence/wallet@1.9.35
+
+## 1.9.34
+
+### Patch Changes
+
+- waas: always use lowercase email
+- Updated dependencies
+ - @0xsequence/abi@1.9.34
+ - @0xsequence/core@1.9.34
+ - @0xsequence/migration@1.9.34
+ - @0xsequence/network@1.9.34
+ - @0xsequence/relayer@1.9.34
+ - @0xsequence/sessions@1.9.34
+ - @0xsequence/utils@1.9.34
+ - @0xsequence/wallet@1.9.34
+
+## 1.9.33
+
+### Patch Changes
+
+- waas: umd build
+- Updated dependencies
+ - @0xsequence/abi@1.9.33
+ - @0xsequence/core@1.9.33
+ - @0xsequence/migration@1.9.33
+ - @0xsequence/network@1.9.33
+ - @0xsequence/relayer@1.9.33
+ - @0xsequence/sessions@1.9.33
+ - @0xsequence/utils@1.9.33
+ - @0xsequence/wallet@1.9.33
+
+## 1.9.32
+
+### Patch Changes
+
+- indexer: update bindings
+- Updated dependencies
+ - @0xsequence/abi@1.9.32
+ - @0xsequence/core@1.9.32
+ - @0xsequence/migration@1.9.32
+ - @0xsequence/network@1.9.32
+ - @0xsequence/relayer@1.9.32
+ - @0xsequence/sessions@1.9.32
+ - @0xsequence/utils@1.9.32
+ - @0xsequence/wallet@1.9.32
+
+## 1.9.31
+
+### Patch Changes
+
+- metadata: token directory changes
+- Updated dependencies
+ - @0xsequence/abi@1.9.31
+ - @0xsequence/core@1.9.31
+ - @0xsequence/migration@1.9.31
+ - @0xsequence/network@1.9.31
+ - @0xsequence/relayer@1.9.31
+ - @0xsequence/sessions@1.9.31
+ - @0xsequence/utils@1.9.31
+ - @0xsequence/wallet@1.9.31
+
+## 1.9.30
+
+### Patch Changes
+
+- update
+- Updated dependencies
+ - @0xsequence/abi@1.9.30
+ - @0xsequence/core@1.9.30
+ - @0xsequence/migration@1.9.30
+ - @0xsequence/network@1.9.30
+ - @0xsequence/relayer@1.9.30
+ - @0xsequence/sessions@1.9.30
+ - @0xsequence/utils@1.9.30
+ - @0xsequence/wallet@1.9.30
+
+## 1.9.29
+
+### Patch Changes
+
+- disable gnosis chain
+- Updated dependencies
+ - @0xsequence/abi@1.9.29
+ - @0xsequence/core@1.9.29
+ - @0xsequence/migration@1.9.29
+ - @0xsequence/network@1.9.29
+ - @0xsequence/relayer@1.9.29
+ - @0xsequence/sessions@1.9.29
+ - @0xsequence/utils@1.9.29
+ - @0xsequence/wallet@1.9.29
+
+## 1.9.28
+
+### Patch Changes
+
+- add utils/merkletree
+- Updated dependencies
+ - @0xsequence/abi@1.9.28
+ - @0xsequence/core@1.9.28
+ - @0xsequence/migration@1.9.28
+ - @0xsequence/network@1.9.28
+ - @0xsequence/relayer@1.9.28
+ - @0xsequence/sessions@1.9.28
+ - @0xsequence/utils@1.9.28
+ - @0xsequence/wallet@1.9.28
+
+## 1.9.27
+
+### Patch Changes
+
+- network: optimistic -> optimism
+- waas: remove defaults
+- api, sessions: update bindings
+- Updated dependencies
+- Updated dependencies
+- Updated dependencies
+ - @0xsequence/abi@1.9.27
+ - @0xsequence/core@1.9.27
+ - @0xsequence/migration@1.9.27
+ - @0xsequence/network@1.9.27
+ - @0xsequence/relayer@1.9.27
+ - @0xsequence/sessions@1.9.27
+ - @0xsequence/utils@1.9.27
+ - @0xsequence/wallet@1.9.27
+
+## 1.9.26
+
+### Patch Changes
+
+- - add backend interfaces for pluggable interfaces
+ - introduce @0xsequence/react-native
+ - update pnpm to lockfile v9
+- Updated dependencies
+ - @0xsequence/abi@1.9.26
+ - @0xsequence/core@1.9.26
+ - @0xsequence/migration@1.9.26
+ - @0xsequence/network@1.9.26
+ - @0xsequence/relayer@1.9.26
+ - @0xsequence/sessions@1.9.26
+ - @0xsequence/utils@1.9.26
+ - @0xsequence/wallet@1.9.26
+
+## 1.9.25
+
+### Patch Changes
+
+- update webrpc clients with new error types
+- Updated dependencies
+ - @0xsequence/abi@1.9.25
+ - @0xsequence/core@1.9.25
+ - @0xsequence/migration@1.9.25
+ - @0xsequence/network@1.9.25
+ - @0xsequence/relayer@1.9.25
+ - @0xsequence/sessions@1.9.25
+ - @0xsequence/utils@1.9.25
+ - @0xsequence/wallet@1.9.25
+
+## 1.9.24
+
+### Patch Changes
+
+- waas: add memoryStore backend to localStore
+- Updated dependencies
+ - @0xsequence/abi@1.9.24
+ - @0xsequence/core@1.9.24
+ - @0xsequence/migration@1.9.24
+ - @0xsequence/network@1.9.24
+ - @0xsequence/relayer@1.9.24
+ - @0xsequence/sessions@1.9.24
+ - @0xsequence/utils@1.9.24
+ - @0xsequence/wallet@1.9.24
+
+## 1.9.23
+
+### Patch Changes
+
+- update api client bindings
+- Updated dependencies
+ - @0xsequence/abi@1.9.23
+ - @0xsequence/core@1.9.23
+ - @0xsequence/migration@1.9.23
+ - @0xsequence/network@1.9.23
+ - @0xsequence/relayer@1.9.23
+ - @0xsequence/sessions@1.9.23
+ - @0xsequence/utils@1.9.23
+ - @0xsequence/wallet@1.9.23
+
+## 1.9.22
+
+### Patch Changes
+
+- update metadata client bindings
+- Updated dependencies
+ - @0xsequence/abi@1.9.22
+ - @0xsequence/core@1.9.22
+ - @0xsequence/migration@1.9.22
+ - @0xsequence/network@1.9.22
+ - @0xsequence/relayer@1.9.22
+ - @0xsequence/sessions@1.9.22
+ - @0xsequence/utils@1.9.22
+ - @0xsequence/wallet@1.9.22
+
+## 1.9.21
+
+### Patch Changes
+
+- api client bindings
+- Updated dependencies
+ - @0xsequence/abi@1.9.21
+ - @0xsequence/core@1.9.21
+ - @0xsequence/migration@1.9.21
+ - @0xsequence/network@1.9.21
+ - @0xsequence/relayer@1.9.21
+ - @0xsequence/sessions@1.9.21
+ - @0xsequence/utils@1.9.21
+ - @0xsequence/wallet@1.9.21
+
+## 1.9.20
+
+### Patch Changes
+
+- api client bindings update
+- Updated dependencies
+ - @0xsequence/abi@1.9.20
+ - @0xsequence/core@1.9.20
+ - @0xsequence/migration@1.9.20
+ - @0xsequence/network@1.9.20
+ - @0xsequence/relayer@1.9.20
+ - @0xsequence/sessions@1.9.20
+ - @0xsequence/utils@1.9.20
+ - @0xsequence/wallet@1.9.20
+
+## 1.9.19
+
+### Patch Changes
+
+- waas update
+- Updated dependencies
+ - @0xsequence/abi@1.9.19
+ - @0xsequence/core@1.9.19
+ - @0xsequence/migration@1.9.19
+ - @0xsequence/network@1.9.19
+ - @0xsequence/relayer@1.9.19
+ - @0xsequence/sessions@1.9.19
+ - @0xsequence/utils@1.9.19
+ - @0xsequence/wallet@1.9.19
+
+## 1.9.18
+
+### Patch Changes
+
+- provider: prohibit dangerous functions
+- Updated dependencies
+ - @0xsequence/abi@1.9.18
+ - @0xsequence/core@1.9.18
+ - @0xsequence/migration@1.9.18
+ - @0xsequence/network@1.9.18
+ - @0xsequence/relayer@1.9.18
+ - @0xsequence/sessions@1.9.18
+ - @0xsequence/utils@1.9.18
+ - @0xsequence/wallet@1.9.18
+
+## 1.9.17
+
+### Patch Changes
+
+- network: add xr-sepolia
+- Updated dependencies
+ - @0xsequence/network@1.9.17
+ - @0xsequence/abi@1.9.17
+ - @0xsequence/core@1.9.17
+ - @0xsequence/migration@1.9.17
+ - @0xsequence/relayer@1.9.17
+ - @0xsequence/sessions@1.9.17
+ - @0xsequence/utils@1.9.17
+ - @0xsequence/wallet@1.9.17
+
+## 1.9.16
+
+### Patch Changes
+
+- waas: sequence.feeOptions
+- Updated dependencies
+ - @0xsequence/abi@1.9.16
+ - @0xsequence/core@1.9.16
+ - @0xsequence/migration@1.9.16
+ - @0xsequence/network@1.9.16
+ - @0xsequence/relayer@1.9.16
+ - @0xsequence/sessions@1.9.16
+ - @0xsequence/utils@1.9.16
+ - @0xsequence/wallet@1.9.16
+
+## 1.9.15
+
+### Patch Changes
+
+- metadata: collection external_link field name fix
+- Updated dependencies
+ - @0xsequence/abi@1.9.15
+ - @0xsequence/core@1.9.15
+ - @0xsequence/migration@1.9.15
+ - @0xsequence/network@1.9.15
+ - @0xsequence/relayer@1.9.15
+ - @0xsequence/sessions@1.9.15
+ - @0xsequence/utils@1.9.15
+ - @0xsequence/wallet@1.9.15
+
+## 1.9.14
+
+### Patch Changes
+
+- network: astar-zkatana -> astar-zkyoto
+- network: deprecate polygon mumbai network
+- network: add xai and polygon amoy
+- Updated dependencies
+- Updated dependencies
+- Updated dependencies
+ - @0xsequence/abi@1.9.14
+ - @0xsequence/core@1.9.14
+ - @0xsequence/migration@1.9.14
+ - @0xsequence/network@1.9.14
+ - @0xsequence/relayer@1.9.14
+ - @0xsequence/sessions@1.9.14
+ - @0xsequence/utils@1.9.14
+ - @0xsequence/wallet@1.9.14
+
+## 1.9.13
+
+### Patch Changes
+
+- waas: fix @0xsequence/network dependency
+- Updated dependencies
+ - @0xsequence/abi@1.9.13
+ - @0xsequence/core@1.9.13
+ - @0xsequence/migration@1.9.13
+ - @0xsequence/network@1.9.13
+ - @0xsequence/relayer@1.9.13
+ - @0xsequence/sessions@1.9.13
+ - @0xsequence/utils@1.9.13
+ - @0xsequence/wallet@1.9.13
+
+## 1.9.12
+
+### Patch Changes
+
+- indexer: update rpc bindings
+- provider: signMessage: Serialize the BytesLike or string message into hexstring before sending
+- waas: SessionAuthProof
+- Updated dependencies
+- Updated dependencies
+- Updated dependencies
+ - @0xsequence/abi@1.9.12
+ - @0xsequence/core@1.9.12
+ - @0xsequence/migration@1.9.12
+ - @0xsequence/network@1.9.12
+ - @0xsequence/relayer@1.9.12
+ - @0xsequence/sessions@1.9.12
+ - @0xsequence/utils@1.9.12
+ - @0xsequence/wallet@1.9.12
+
+## 1.9.11
+
+### Patch Changes
+
+- metdata, update rpc bindings
+- Updated dependencies
+ - @0xsequence/abi@1.9.11
+ - @0xsequence/core@1.9.11
+ - @0xsequence/migration@1.9.11
+ - @0xsequence/network@1.9.11
+ - @0xsequence/relayer@1.9.11
+ - @0xsequence/sessions@1.9.11
+ - @0xsequence/utils@1.9.11
+ - @0xsequence/wallet@1.9.11
+
+## 1.9.10
+
+### Patch Changes
+
+- update metadata rpc bindings
+- Updated dependencies
+ - @0xsequence/abi@1.9.10
+ - @0xsequence/core@1.9.10
+ - @0xsequence/migration@1.9.10
+ - @0xsequence/network@1.9.10
+ - @0xsequence/relayer@1.9.10
+ - @0xsequence/sessions@1.9.10
+ - @0xsequence/utils@1.9.10
+ - @0xsequence/wallet@1.9.10
+
+## 1.9.9
+
+### Patch Changes
+
+- metadata, add SequenceCollections rpc client
+- Updated dependencies
+ - @0xsequence/abi@1.9.9
+ - @0xsequence/core@1.9.9
+ - @0xsequence/migration@1.9.9
+ - @0xsequence/network@1.9.9
+ - @0xsequence/relayer@1.9.9
+ - @0xsequence/sessions@1.9.9
+ - @0xsequence/utils@1.9.9
+ - @0xsequence/wallet@1.9.9
+
+## 1.9.8
+
+### Patch Changes
+
+- waas client update
+- Updated dependencies
+ - @0xsequence/abi@1.9.8
+ - @0xsequence/core@1.9.8
+ - @0xsequence/migration@1.9.8
+ - @0xsequence/network@1.9.8
+ - @0xsequence/relayer@1.9.8
+ - @0xsequence/sessions@1.9.8
+ - @0xsequence/utils@1.9.8
+ - @0xsequence/wallet@1.9.8
+
+## 1.9.7
+
+### Patch Changes
+
+- update rpc client bindings for api, metadata and relayer
+- Updated dependencies
+ - @0xsequence/abi@1.9.7
+ - @0xsequence/core@1.9.7
+ - @0xsequence/migration@1.9.7
+ - @0xsequence/network@1.9.7
+ - @0xsequence/relayer@1.9.7
+ - @0xsequence/sessions@1.9.7
+ - @0xsequence/utils@1.9.7
+ - @0xsequence/wallet@1.9.7
+
+## 1.9.6
+
+### Patch Changes
+
+- waas package update
+- Updated dependencies
+ - @0xsequence/abi@1.9.6
+ - @0xsequence/core@1.9.6
+ - @0xsequence/migration@1.9.6
+ - @0xsequence/network@1.9.6
+ - @0xsequence/relayer@1.9.6
+ - @0xsequence/sessions@1.9.6
+ - @0xsequence/utils@1.9.6
+ - @0xsequence/wallet@1.9.6
+
+## 1.9.5
+
+### Patch Changes
+
+- RpcRelayer prioritize project access key
+- Updated dependencies
+ - @0xsequence/abi@1.9.5
+ - @0xsequence/core@1.9.5
+ - @0xsequence/migration@1.9.5
+ - @0xsequence/network@1.9.5
+ - @0xsequence/relayer@1.9.5
+ - @0xsequence/sessions@1.9.5
+ - @0xsequence/utils@1.9.5
+ - @0xsequence/wallet@1.9.5
+
+## 1.9.4
+
+### Patch Changes
+
+- waas: fix network dependency
+- Updated dependencies
+ - @0xsequence/abi@1.9.4
+ - @0xsequence/core@1.9.4
+ - @0xsequence/migration@1.9.4
+ - @0xsequence/network@1.9.4
+ - @0xsequence/relayer@1.9.4
+ - @0xsequence/sessions@1.9.4
+ - @0xsequence/utils@1.9.4
+ - @0xsequence/wallet@1.9.4
+
+## 1.9.3
+
+### Patch Changes
+
+- provider: don't append access key to RPC url if user has already provided it
+- Updated dependencies
+ - @0xsequence/abi@1.9.3
+ - @0xsequence/core@1.9.3
+ - @0xsequence/migration@1.9.3
+ - @0xsequence/network@1.9.3
+ - @0xsequence/relayer@1.9.3
+ - @0xsequence/sessions@1.9.3
+ - @0xsequence/utils@1.9.3
+ - @0xsequence/wallet@1.9.3
+
+## 1.9.2
+
+### Patch Changes
+
+- network: add xai-sepolia
+- Updated dependencies
+ - @0xsequence/abi@1.9.2
+ - @0xsequence/core@1.9.2
+ - @0xsequence/migration@1.9.2
+ - @0xsequence/network@1.9.2
+ - @0xsequence/relayer@1.9.2
+ - @0xsequence/sessions@1.9.2
+ - @0xsequence/utils@1.9.2
+ - @0xsequence/wallet@1.9.2
+
+## 1.9.1
+
+### Patch Changes
+
+- analytics fix
+- Updated dependencies
+ - @0xsequence/abi@1.9.1
+ - @0xsequence/core@1.9.1
+ - @0xsequence/migration@1.9.1
+ - @0xsequence/network@1.9.1
+ - @0xsequence/relayer@1.9.1
+ - @0xsequence/sessions@1.9.1
+ - @0xsequence/utils@1.9.1
+ - @0xsequence/wallet@1.9.1
+
+## 1.9.0
+
+### Minor Changes
+
+- waas release
+
+### Patch Changes
+
+- Updated dependencies
+ - @0xsequence/abi@1.9.0
+ - @0xsequence/core@1.9.0
+ - @0xsequence/migration@1.9.0
+ - @0xsequence/network@1.9.0
+ - @0xsequence/relayer@1.9.0
+ - @0xsequence/sessions@1.9.0
+ - @0xsequence/utils@1.9.0
+ - @0xsequence/wallet@1.9.0
+
+## 1.8.8
+
+### Patch Changes
+
+- update metadata bindings
+- Updated dependencies
+ - @0xsequence/abi@1.8.8
+ - @0xsequence/core@1.8.8
+ - @0xsequence/migration@1.8.8
+ - @0xsequence/network@1.8.8
+ - @0xsequence/relayer@1.8.8
+ - @0xsequence/sessions@1.8.8
+ - @0xsequence/utils@1.8.8
+ - @0xsequence/wallet@1.8.8
+
+## 1.8.7
+
+### Patch Changes
+
+- provider: update databeat to 0.9.1
+- Updated dependencies
+ - @0xsequence/abi@1.8.7
+ - @0xsequence/core@1.8.7
+ - @0xsequence/migration@1.8.7
+ - @0xsequence/network@1.8.7
+ - @0xsequence/relayer@1.8.7
+ - @0xsequence/sessions@1.8.7
+ - @0xsequence/utils@1.8.7
+ - @0xsequence/wallet@1.8.7
+
+## 1.8.6
+
+### Patch Changes
+
+- guard: SignedOwnershipProof
+- Updated dependencies
+ - @0xsequence/abi@1.8.6
+ - @0xsequence/core@1.8.6
+ - @0xsequence/migration@1.8.6
+ - @0xsequence/network@1.8.6
+ - @0xsequence/relayer@1.8.6
+ - @0xsequence/sessions@1.8.6
+ - @0xsequence/utils@1.8.6
+ - @0xsequence/wallet@1.8.6
+
+## 1.8.5
+
+### Patch Changes
+
+- guard: signOwnershipProof and isSignedOwnershipProof
+- Updated dependencies
+ - @0xsequence/abi@1.8.5
+ - @0xsequence/core@1.8.5
+ - @0xsequence/migration@1.8.5
+ - @0xsequence/network@1.8.5
+ - @0xsequence/relayer@1.8.5
+ - @0xsequence/sessions@1.8.5
+ - @0xsequence/utils@1.8.5
+ - @0xsequence/wallet@1.8.5
+
+## 1.8.4
+
+### Patch Changes
+
+- network: add homeverse to networks list
+- Updated dependencies
+ - @0xsequence/abi@1.8.4
+ - @0xsequence/core@1.8.4
+ - @0xsequence/migration@1.8.4
+ - @0xsequence/network@1.8.4
+ - @0xsequence/relayer@1.8.4
+ - @0xsequence/sessions@1.8.4
+ - @0xsequence/utils@1.8.4
+ - @0xsequence/wallet@1.8.4
+
+## 1.8.3
+
+### Patch Changes
+
+- api: introduce basic linked wallet support
+- Updated dependencies
+ - @0xsequence/abi@1.8.3
+ - @0xsequence/core@1.8.3
+ - @0xsequence/migration@1.8.3
+ - @0xsequence/network@1.8.3
+ - @0xsequence/relayer@1.8.3
+ - @0xsequence/sessions@1.8.3
+ - @0xsequence/utils@1.8.3
+ - @0xsequence/wallet@1.8.3
+
+## 1.8.2
+
+### Patch Changes
+
+- provider: don't initialize analytics unless explicitly requested
+- Updated dependencies
+ - @0xsequence/abi@1.8.2
+ - @0xsequence/core@1.8.2
+ - @0xsequence/migration@1.8.2
+ - @0xsequence/network@1.8.2
+ - @0xsequence/relayer@1.8.2
+ - @0xsequence/sessions@1.8.2
+ - @0xsequence/utils@1.8.2
+ - @0xsequence/wallet@1.8.2
+
+## 1.8.1
+
+### Patch Changes
+
+- update to analytics provider
+- Updated dependencies
+ - @0xsequence/abi@1.8.1
+ - @0xsequence/core@1.8.1
+ - @0xsequence/migration@1.8.1
+ - @0xsequence/network@1.8.1
+ - @0xsequence/relayer@1.8.1
+ - @0xsequence/sessions@1.8.1
+ - @0xsequence/utils@1.8.1
+ - @0xsequence/wallet@1.8.1
+
+## 1.8.0
+
+### Minor Changes
+
+- provider: project analytics
+
+### Patch Changes
+
+- Updated dependencies
+ - @0xsequence/abi@1.8.0
+ - @0xsequence/core@1.8.0
+ - @0xsequence/migration@1.8.0
+ - @0xsequence/network@1.8.0
+ - @0xsequence/relayer@1.8.0
+ - @0xsequence/sessions@1.8.0
+ - @0xsequence/utils@1.8.0
+ - @0xsequence/wallet@1.8.0
+
+## 1.7.2
+
+### Patch Changes
+
+- 0xsequence: ChainId should not be exported as a type
+- account, wallet: fix nonce selection
+- Updated dependencies
+- Updated dependencies
+ - @0xsequence/abi@1.7.2
+ - @0xsequence/core@1.7.2
+ - @0xsequence/migration@1.7.2
+ - @0xsequence/network@1.7.2
+ - @0xsequence/relayer@1.7.2
+ - @0xsequence/sessions@1.7.2
+ - @0xsequence/utils@1.7.2
+ - @0xsequence/wallet@1.7.2
+
+## 1.7.1
+
+### Patch Changes
+
+- network: add missing avalanche logoURI
+- Updated dependencies
+ - @0xsequence/abi@1.7.1
+ - @0xsequence/core@1.7.1
+ - @0xsequence/migration@1.7.1
+ - @0xsequence/network@1.7.1
+ - @0xsequence/relayer@1.7.1
+ - @0xsequence/sessions@1.7.1
+ - @0xsequence/utils@1.7.1
+ - @0xsequence/wallet@1.7.1
+
+## 1.7.0
+
+### Minor Changes
+
+- provider: projectAccessKey is now required
+
+### Patch Changes
+
+- network: add NetworkMetadata.logoURI property for all networks
+- Updated dependencies
+- Updated dependencies
+ - @0xsequence/abi@1.7.0
+ - @0xsequence/core@1.7.0
+ - @0xsequence/migration@1.7.0
+ - @0xsequence/network@1.7.0
+ - @0xsequence/relayer@1.7.0
+ - @0xsequence/sessions@1.7.0
+ - @0xsequence/utils@1.7.0
+ - @0xsequence/wallet@1.7.0
+
+## 1.6.3
+
+### Patch Changes
+
+- network list update
+- Updated dependencies
+ - @0xsequence/abi@1.6.3
+ - @0xsequence/core@1.6.3
+ - @0xsequence/migration@1.6.3
+ - @0xsequence/network@1.6.3
+ - @0xsequence/relayer@1.6.3
+ - @0xsequence/sessions@1.6.3
+ - @0xsequence/utils@1.6.3
+ - @0xsequence/wallet@1.6.3
+
+## 1.6.2
+
+### Patch Changes
+
+- auth: projectAccessKey option
+- wallet: use 12 bytes for random space
+- Updated dependencies
+- Updated dependencies
+ - @0xsequence/abi@1.6.2
+ - @0xsequence/core@1.6.2
+ - @0xsequence/migration@1.6.2
+ - @0xsequence/network@1.6.2
+ - @0xsequence/relayer@1.6.2
+ - @0xsequence/sessions@1.6.2
+ - @0xsequence/utils@1.6.2
+ - @0xsequence/wallet@1.6.2
+
+## 1.6.1
+
+### Patch Changes
+
+- core: add simple config from subdigest support
+- core: fix encode tree with subdigest
+- account: implement buildOnChainSignature on Account
+- Updated dependencies
+- Updated dependencies
+- Updated dependencies
+ - @0xsequence/abi@1.6.1
+ - @0xsequence/core@1.6.1
+ - @0xsequence/migration@1.6.1
+ - @0xsequence/network@1.6.1
+ - @0xsequence/relayer@1.6.1
+ - @0xsequence/sessions@1.6.1
+ - @0xsequence/utils@1.6.1
+ - @0xsequence/wallet@1.6.1
+
+## 1.6.0
+
+### Minor Changes
+
+- account, wallet: parallel transactions by default
+
+### Patch Changes
+
+- provider: emit disconnect on sign out
+- Updated dependencies
+- Updated dependencies
+ - @0xsequence/core@1.6.0
+ - @0xsequence/migration@1.6.0
+ - @0xsequence/network@1.6.0
+ - @0xsequence/relayer@1.6.0
+ - @0xsequence/sessions@1.6.0
+ - @0xsequence/utils@1.6.0
+ - @0xsequence/wallet@1.6.0
+
+## 1.5.0
+
+### Minor Changes
+
+- signhub: add 'signing' signer status
+
+### Patch Changes
+
+- auth: Session.open: onAccountAddress callback
+- account: allow empty transaction bundles
+- Updated dependencies
+- Updated dependencies
+- Updated dependencies
+ - @0xsequence/core@1.5.0
+ - @0xsequence/migration@1.5.0
+ - @0xsequence/network@1.5.0
+ - @0xsequence/relayer@1.5.0
+ - @0xsequence/sessions@1.5.0
+ - @0xsequence/utils@1.5.0
+ - @0xsequence/wallet@1.5.0
+
+## 1.4.9
+
+### Patch Changes
+
+- rename SequenceMetadataClient to SequenceMetadata
+- Updated dependencies
+ - @0xsequence/core@1.4.9
+ - @0xsequence/migration@1.4.9
+ - @0xsequence/network@1.4.9
+ - @0xsequence/relayer@1.4.9
+ - @0xsequence/sessions@1.4.9
+ - @0xsequence/utils@1.4.9
+ - @0xsequence/wallet@1.4.9
+
+## 1.4.8
+
+### Patch Changes
+
+- account: Account.getSigners
+- Updated dependencies
+ - @0xsequence/core@1.4.8
+ - @0xsequence/migration@1.4.8
+ - @0xsequence/network@1.4.8
+ - @0xsequence/relayer@1.4.8
+ - @0xsequence/sessions@1.4.8
+ - @0xsequence/utils@1.4.8
+ - @0xsequence/wallet@1.4.8
+
+## 1.4.7
+
+### Patch Changes
+
+- update indexer client bindings
+- Updated dependencies
+ - @0xsequence/core@1.4.7
+ - @0xsequence/migration@1.4.7
+ - @0xsequence/network@1.4.7
+ - @0xsequence/relayer@1.4.7
+ - @0xsequence/sessions@1.4.7
+ - @0xsequence/utils@1.4.7
+ - @0xsequence/wallet@1.4.7
+
+## 1.4.6
+
+### Patch Changes
+
+- - add sepolia networks, mark goerli as deprecated
+ - update indexer client bindings
+- Updated dependencies
+ - @0xsequence/core@1.4.6
+ - @0xsequence/migration@1.4.6
+ - @0xsequence/network@1.4.6
+ - @0xsequence/relayer@1.4.6
+ - @0xsequence/sessions@1.4.6
+ - @0xsequence/utils@1.4.6
+ - @0xsequence/wallet@1.4.6
+
+## 1.4.5
+
+### Patch Changes
+
+- indexer/metadata: update client bindings
+- auth: selectWallet with new address
+- Updated dependencies
+- Updated dependencies
+ - @0xsequence/core@1.4.5
+ - @0xsequence/migration@1.4.5
+ - @0xsequence/network@1.4.5
+ - @0xsequence/relayer@1.4.5
+ - @0xsequence/sessions@1.4.5
+ - @0xsequence/utils@1.4.5
+ - @0xsequence/wallet@1.4.5
+
+## 1.4.4
+
+### Patch Changes
+
+- indexer: update bindings
+- auth: handle jwt expiry
+- Updated dependencies
+- Updated dependencies
+ - @0xsequence/core@1.4.4
+ - @0xsequence/migration@1.4.4
+ - @0xsequence/network@1.4.4
+ - @0xsequence/relayer@1.4.4
+ - @0xsequence/sessions@1.4.4
+ - @0xsequence/utils@1.4.4
+ - @0xsequence/wallet@1.4.4
+
+## 1.4.3
+
+### Patch Changes
+
+- guard: return active status from GuardSigner.getAuthMethods
+- Updated dependencies
+ - @0xsequence/core@1.4.3
+ - @0xsequence/migration@1.4.3
+ - @0xsequence/network@1.4.3
+ - @0xsequence/relayer@1.4.3
+ - @0xsequence/sessions@1.4.3
+ - @0xsequence/utils@1.4.3
+ - @0xsequence/wallet@1.4.3
+
+## 1.4.2
+
+### Patch Changes
+
+- guard: update bindings
+- Updated dependencies
+ - @0xsequence/core@1.4.2
+ - @0xsequence/migration@1.4.2
+ - @0xsequence/network@1.4.2
+ - @0xsequence/relayer@1.4.2
+ - @0xsequence/sessions@1.4.2
+ - @0xsequence/utils@1.4.2
+ - @0xsequence/wallet@1.4.2
+
+## 1.4.1
+
+### Patch Changes
+
+- network: remove unused networks
+- signhub: orchestrator interface
+- guard: auth methods interface
+- guard: update bindings for pin and totp
+- guard: no more retry logic
+- Updated dependencies
+- Updated dependencies
+- Updated dependencies
+- Updated dependencies
+- Updated dependencies
+ - @0xsequence/core@1.4.1
+ - @0xsequence/migration@1.4.1
+ - @0xsequence/network@1.4.1
+ - @0xsequence/relayer@1.4.1
+ - @0xsequence/sessions@1.4.1
+ - @0xsequence/utils@1.4.1
+ - @0xsequence/wallet@1.4.1
+
+## 1.4.0
+
+### Minor Changes
+
+- project access key support
+
+### Patch Changes
+
+- Updated dependencies
+ - @0xsequence/core@1.4.0
+ - @0xsequence/migration@1.4.0
+ - @0xsequence/network@1.4.0
+ - @0xsequence/relayer@1.4.0
+ - @0xsequence/sessions@1.4.0
+ - @0xsequence/utils@1.4.0
+ - @0xsequence/wallet@1.4.0
+
+## 1.3.0
+
+### Minor Changes
+
+- signhub: account children
+
+### Patch Changes
+
+- guard: do not throw when building deploy transaction
+- network: snowtrace.io -> subnets.avax.network/c-chain
+- Updated dependencies
+- Updated dependencies
+- Updated dependencies
+ - @0xsequence/core@1.3.0
+ - @0xsequence/migration@1.3.0
+ - @0xsequence/network@1.3.0
+ - @0xsequence/relayer@1.3.0
+ - @0xsequence/sessions@1.3.0
+ - @0xsequence/utils@1.3.0
+ - @0xsequence/wallet@1.3.0
+
+## 1.2.9
+
+### Patch Changes
+
+- account: AccountSigner.sendTransaction simulateForFeeOptions
+- relayer: update bindings
+- Updated dependencies
+- Updated dependencies
+ - @0xsequence/core@1.2.9
+ - @0xsequence/migration@1.2.9
+ - @0xsequence/network@1.2.9
+ - @0xsequence/relayer@1.2.9
+ - @0xsequence/sessions@1.2.9
+ - @0xsequence/utils@1.2.9
+ - @0xsequence/wallet@1.2.9
+
+## 1.2.8
+
+### Patch Changes
+
+- rename X-Sequence-Token-Key header to X-Access-Key
+- Updated dependencies
+ - @0xsequence/core@1.2.8
+ - @0xsequence/migration@1.2.8
+ - @0xsequence/network@1.2.8
+ - @0xsequence/relayer@1.2.8
+ - @0xsequence/sessions@1.2.8
+ - @0xsequence/utils@1.2.8
+ - @0xsequence/wallet@1.2.8
+
+## 1.2.7
+
+### Patch Changes
+
+- add x-sequence-token-key to clients
+- Updated dependencies
+ - @0xsequence/core@1.2.7
+ - @0xsequence/migration@1.2.7
+ - @0xsequence/network@1.2.7
+ - @0xsequence/relayer@1.2.7
+ - @0xsequence/sessions@1.2.7
+ - @0xsequence/utils@1.2.7
+ - @0xsequence/wallet@1.2.7
+
+## 1.2.6
+
+### Patch Changes
+
+- Fix bind multicall provider
+- Updated dependencies
+ - @0xsequence/core@1.2.6
+ - @0xsequence/migration@1.2.6
+ - @0xsequence/network@1.2.6
+ - @0xsequence/relayer@1.2.6
+ - @0xsequence/sessions@1.2.6
+ - @0xsequence/utils@1.2.6
+ - @0xsequence/wallet@1.2.6
+
+## 1.2.5
+
+### Patch Changes
+
+- Multicall default configuration fixes
+- Updated dependencies
+ - @0xsequence/core@1.2.5
+ - @0xsequence/migration@1.2.5
+ - @0xsequence/network@1.2.5
+ - @0xsequence/relayer@1.2.5
+ - @0xsequence/sessions@1.2.5
+ - @0xsequence/utils@1.2.5
+ - @0xsequence/wallet@1.2.5
+
+## 1.2.4
+
+### Patch Changes
+
+- provider: Adding missing payment provider types to PaymentProviderOption
+- provider: WalletRequestHandler.notifyChainChanged
+- Updated dependencies
+- Updated dependencies
+ - @0xsequence/core@1.2.4
+ - @0xsequence/migration@1.2.4
+ - @0xsequence/network@1.2.4
+ - @0xsequence/relayer@1.2.4
+ - @0xsequence/sessions@1.2.4
+ - @0xsequence/utils@1.2.4
+ - @0xsequence/wallet@1.2.4
+
+## 1.2.3
+
+### Patch Changes
+
+- auth, provider: connect to accept optional authorizeNonce
+- Updated dependencies
+ - @0xsequence/core@1.2.3
+ - @0xsequence/migration@1.2.3
+ - @0xsequence/network@1.2.3
+ - @0xsequence/relayer@1.2.3
+ - @0xsequence/sessions@1.2.3
+ - @0xsequence/utils@1.2.3
+ - @0xsequence/wallet@1.2.3
+
+## 1.2.2
+
+### Patch Changes
+
+- provider: allow createContract calls
+- core: check for explicit zero address in contract deployments
+- Updated dependencies
+- Updated dependencies
+ - @0xsequence/core@1.2.2
+ - @0xsequence/migration@1.2.2
+ - @0xsequence/network@1.2.2
+ - @0xsequence/relayer@1.2.2
+ - @0xsequence/sessions@1.2.2
+ - @0xsequence/utils@1.2.2
+ - @0xsequence/wallet@1.2.2
+
+## 1.2.1
+
+### Patch Changes
+
+- auth: use sequence api chain id as reference chain id if available
+- Updated dependencies
+ - @0xsequence/core@1.2.1
+ - @0xsequence/migration@1.2.1
+ - @0xsequence/network@1.2.1
+ - @0xsequence/relayer@1.2.1
+ - @0xsequence/sessions@1.2.1
+ - @0xsequence/utils@1.2.1
+ - @0xsequence/wallet@1.2.1
+
+## 1.2.0
+
+### Minor Changes
+
+- split services from session, better local support
+
+### Patch Changes
+
+- Updated dependencies
+ - @0xsequence/core@1.2.0
+ - @0xsequence/migration@1.2.0
+ - @0xsequence/network@1.2.0
+ - @0xsequence/relayer@1.2.0
+ - @0xsequence/sessions@1.2.0
+ - @0xsequence/utils@1.2.0
+ - @0xsequence/wallet@1.2.0
+
+## 1.1.15
+
+### Patch Changes
+
+- guard: remove error filtering
+- Updated dependencies
+ - @0xsequence/core@1.1.15
+ - @0xsequence/migration@1.1.15
+ - @0xsequence/network@1.1.15
+ - @0xsequence/relayer@1.1.15
+ - @0xsequence/sessions@1.1.15
+ - @0xsequence/utils@1.1.15
+ - @0xsequence/wallet@1.1.15
+
+## 1.1.14
+
+### Patch Changes
+
+- guard: add GuardSigner.onError
+- Updated dependencies
+ - @0xsequence/core@1.1.14
+ - @0xsequence/migration@1.1.14
+ - @0xsequence/network@1.1.14
+ - @0xsequence/relayer@1.1.14
+ - @0xsequence/sessions@1.1.14
+ - @0xsequence/utils@1.1.14
+ - @0xsequence/wallet@1.1.14
+
+## 1.1.13
+
+### Patch Changes
+
+- provider: pass client version with connect options
+- provider: removing large from BannerSize
+- Updated dependencies
+- Updated dependencies
+ - @0xsequence/core@1.1.13
+ - @0xsequence/migration@1.1.13
+ - @0xsequence/network@1.1.13
+ - @0xsequence/relayer@1.1.13
+ - @0xsequence/sessions@1.1.13
+ - @0xsequence/utils@1.1.13
+ - @0xsequence/wallet@1.1.13
+
+## 1.1.12
+
+### Patch Changes
+
+- provider: adding bannerSize to ConnectOptions
+- Updated dependencies
+ - @0xsequence/core@1.1.12
+ - @0xsequence/migration@1.1.12
+ - @0xsequence/network@1.1.12
+ - @0xsequence/relayer@1.1.12
+ - @0xsequence/sessions@1.1.12
+ - @0xsequence/utils@1.1.12
+ - @0xsequence/wallet@1.1.12
+
+## 1.1.11
+
+### Patch Changes
+
+- add homeverse configs
+- Updated dependencies
+ - @0xsequence/core@1.1.11
+ - @0xsequence/migration@1.1.11
+ - @0xsequence/network@1.1.11
+ - @0xsequence/relayer@1.1.11
+ - @0xsequence/sessions@1.1.11
+ - @0xsequence/utils@1.1.11
+ - @0xsequence/wallet@1.1.11
+
+## 1.1.10
+
+### Patch Changes
+
+- handle default EIP6492 on send
+- Updated dependencies
+ - @0xsequence/core@1.1.10
+ - @0xsequence/migration@1.1.10
+ - @0xsequence/network@1.1.10
+ - @0xsequence/relayer@1.1.10
+ - @0xsequence/sessions@1.1.10
+ - @0xsequence/utils@1.1.10
+ - @0xsequence/wallet@1.1.10
+
+## 1.1.9
+
+### Patch Changes
+
+- Custom default EIP6492 on client
+- Updated dependencies
+ - @0xsequence/core@1.1.9
+ - @0xsequence/migration@1.1.9
+ - @0xsequence/network@1.1.9
+ - @0xsequence/relayer@1.1.9
+ - @0xsequence/sessions@1.1.9
+ - @0xsequence/utils@1.1.9
+ - @0xsequence/wallet@1.1.9
+
+## 1.1.8
+
+### Patch Changes
+
+- metadata: searchMetadata: add types filter
+- Updated dependencies
+ - @0xsequence/core@1.1.8
+ - @0xsequence/migration@1.1.8
+ - @0xsequence/network@1.1.8
+ - @0xsequence/relayer@1.1.8
+ - @0xsequence/sessions@1.1.8
+ - @0xsequence/utils@1.1.8
+ - @0xsequence/wallet@1.1.8
+
+## 1.1.7
+
+### Patch Changes
+
+- adding signInWith connect settings option to allow dapps to automatically login their users with a certain provider optimizing the normal authentication flow
+- Updated dependencies
+ - @0xsequence/core@1.1.7
+ - @0xsequence/migration@1.1.7
+ - @0xsequence/network@1.1.7
+ - @0xsequence/relayer@1.1.7
+ - @0xsequence/sessions@1.1.7
+ - @0xsequence/utils@1.1.7
+ - @0xsequence/wallet@1.1.7
+
+## 1.1.6
+
+### Patch Changes
+
+- metadata: searchMetadata: add chainID and excludeTokenMetadata filters
+- Updated dependencies
+ - @0xsequence/core@1.1.6
+ - @0xsequence/migration@1.1.6
+ - @0xsequence/network@1.1.6
+ - @0xsequence/relayer@1.1.6
+ - @0xsequence/sessions@1.1.6
+ - @0xsequence/utils@1.1.6
+ - @0xsequence/wallet@1.1.6
+
+## 1.1.5
+
+### Patch Changes
+
+- account: re-compute meta-transaction id for wallet deployment transactions
+- Updated dependencies
+ - @0xsequence/core@1.1.5
+ - @0xsequence/migration@1.1.5
+ - @0xsequence/network@1.1.5
+ - @0xsequence/relayer@1.1.5
+ - @0xsequence/sessions@1.1.5
+ - @0xsequence/utils@1.1.5
+ - @0xsequence/wallet@1.1.5
+
+## 1.1.4
+
+### Patch Changes
+
+- network: rename base-mainnet to base
+- provider: override isDefaultChain with ConnectOptions.networkId if provided
+- Updated dependencies
+- Updated dependencies
+ - @0xsequence/core@1.1.4
+ - @0xsequence/migration@1.1.4
+ - @0xsequence/network@1.1.4
+ - @0xsequence/relayer@1.1.4
+ - @0xsequence/sessions@1.1.4
+ - @0xsequence/utils@1.1.4
+ - @0xsequence/wallet@1.1.4
+
+## 1.1.3
+
+### Patch Changes
+
+- provider: use network id from transport session
+- provider: sign authorization using ConnectOptions.networkId if provided
+- Updated dependencies
+- Updated dependencies
+ - @0xsequence/core@1.1.3
+ - @0xsequence/migration@1.1.3
+ - @0xsequence/network@1.1.3
+ - @0xsequence/relayer@1.1.3
+ - @0xsequence/sessions@1.1.3
+ - @0xsequence/utils@1.1.3
+ - @0xsequence/wallet@1.1.3
+
+## 1.1.2
+
+### Patch Changes
+
+- provider: jsonrpc chain id fixes
+- Updated dependencies
+ - @0xsequence/core@1.1.2
+ - @0xsequence/migration@1.1.2
+ - @0xsequence/network@1.1.2
+ - @0xsequence/relayer@1.1.2
+ - @0xsequence/sessions@1.1.2
+ - @0xsequence/utils@1.1.2
+ - @0xsequence/wallet@1.1.2
+
+## 1.1.1
+
+### Patch Changes
+
+- network: add base mainnet and sepolia
+- provider: reject toxic transaction requests
+- Updated dependencies
+- Updated dependencies
+ - @0xsequence/core@1.1.1
+ - @0xsequence/migration@1.1.1
+ - @0xsequence/network@1.1.1
+ - @0xsequence/relayer@1.1.1
+ - @0xsequence/sessions@1.1.1
+ - @0xsequence/utils@1.1.1
+ - @0xsequence/wallet@1.1.1
+
+## 1.1.0
+
+### Minor Changes
+
+- Refactor dapp facing provider
+
+### Patch Changes
+
+- Updated dependencies
+ - @0xsequence/core@1.1.0
+ - @0xsequence/migration@1.1.0
+ - @0xsequence/network@1.1.0
+ - @0xsequence/relayer@1.1.0
+ - @0xsequence/sessions@1.1.0
+ - @0xsequence/utils@1.1.0
+ - @0xsequence/wallet@1.1.0
+
+## 1.0.5
+
+### Patch Changes
+
+- network: export network constants
+- guard: use the correct global for fetch
+- network: nova-explorer.arbitrum.io -> nova.arbiscan.io
+- Updated dependencies
+- Updated dependencies
+- Updated dependencies
+ - @0xsequence/core@1.0.5
+ - @0xsequence/migration@1.0.5
+ - @0xsequence/network@1.0.5
+ - @0xsequence/relayer@1.0.5
+ - @0xsequence/sessions@1.0.5
+ - @0xsequence/utils@1.0.5
+ - @0xsequence/wallet@1.0.5
+
+## 1.0.4
+
+### Patch Changes
+
+- provider: accept name or number for networkId
+- Updated dependencies
+ - @0xsequence/core@1.0.4
+ - @0xsequence/migration@1.0.4
+ - @0xsequence/network@1.0.4
+ - @0xsequence/relayer@1.0.4
+ - @0xsequence/sessions@1.0.4
+ - @0xsequence/utils@1.0.4
+ - @0xsequence/wallet@1.0.4
+
+## 1.0.3
+
+### Patch Changes
+
+- Simpler isValidSignature helpers
+- Updated dependencies
+ - @0xsequence/core@1.0.3
+ - @0xsequence/migration@1.0.3
+ - @0xsequence/network@1.0.3
+ - @0xsequence/relayer@1.0.3
+ - @0xsequence/sessions@1.0.3
+ - @0xsequence/utils@1.0.3
+ - @0xsequence/wallet@1.0.3
+
+## 1.0.2
+
+### Patch Changes
+
+- add extra signature validation utils methods
+- Updated dependencies
+ - @0xsequence/core@1.0.2
+ - @0xsequence/migration@1.0.2
+ - @0xsequence/network@1.0.2
+ - @0xsequence/relayer@1.0.2
+ - @0xsequence/sessions@1.0.2
+ - @0xsequence/utils@1.0.2
+ - @0xsequence/wallet@1.0.2
+
+## 1.0.1
+
+### Patch Changes
+
+- add homeverse testnet
+- Updated dependencies
+ - @0xsequence/core@1.0.1
+ - @0xsequence/migration@1.0.1
+ - @0xsequence/network@1.0.1
+ - @0xsequence/relayer@1.0.1
+ - @0xsequence/sessions@1.0.1
+ - @0xsequence/utils@1.0.1
+ - @0xsequence/wallet@1.0.1
+
+## 1.0.0
+
+### Major Changes
+
+- https://sequence.xyz/blog/sequence-wallet-light-state-sync-full-merkle-wallets
+
+### Patch Changes
+
+- Updated dependencies
+ - @0xsequence/core@1.0.0
+ - @0xsequence/migration@1.0.0
+ - @0xsequence/network@1.0.0
+ - @0xsequence/relayer@1.0.0
+ - @0xsequence/sessions@1.0.0
+ - @0xsequence/utils@1.0.0
+ - @0xsequence/wallet@1.0.0
diff --git a/packages/account/hardhat.config.js b/packages/account/hardhat.config.js
new file mode 100644
index 0000000000..9e73336b07
--- /dev/null
+++ b/packages/account/hardhat.config.js
@@ -0,0 +1,12 @@
+
+module.exports = {
+ networks: {
+ hardhat: {
+ chainId: 31337,
+ port: 7146,
+ accounts: {
+ mnemonic: 'ripple axis someone ridge uniform wrist prosper there frog rate olympic knee'
+ },
+ },
+ }
+}
diff --git a/packages/account/hardhat2.config.js b/packages/account/hardhat2.config.js
new file mode 100644
index 0000000000..e984fc2e79
--- /dev/null
+++ b/packages/account/hardhat2.config.js
@@ -0,0 +1,11 @@
+
+module.exports = {
+ networks: {
+ hardhat: {
+ chainId: 31338,
+ accounts: {
+ mnemonic: 'ripple axis someone ridge uniform wrist prosper there frog rate olympic knee'
+ }
+ }
+ }
+}
diff --git a/packages/account/package.json b/packages/account/package.json
new file mode 100644
index 0000000000..ddaefabe13
--- /dev/null
+++ b/packages/account/package.json
@@ -0,0 +1,40 @@
+{
+ "name": "@0xsequence/account",
+ "version": "2.0.0",
+ "description": "tools for migrating sequence wallets to new versions",
+ "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/account",
+ "source": "src/index.ts",
+ "main": "dist/0xsequence-account.cjs.js",
+ "module": "dist/0xsequence-account.esm.js",
+ "author": "Horizon Blockchain Games",
+ "license": "Apache-2.0",
+ "scripts": {
+ "test": "pnpm test:concurrently 'pnpm test:run'",
+ "test:run": "pnpm test:file tests/**/*.spec.ts",
+ "test:file": "TS_NODE_PROJECT=../../tsconfig.test.json mocha -r ts-node/register --timeout 120000",
+ "test:concurrently": "concurrently -k --success first 'pnpm start:hardhat2 > /dev/null'",
+ "start:hardhat2": "hardhat node --hostname 0.0.0.0 --port 7048 --config ./hardhat2.config.js",
+ "test:coverage": "nyc pnpm test"
+ },
+ "dependencies": {
+ "@0xsequence/abi": "workspace:*",
+ "@0xsequence/core": "workspace:*",
+ "@0xsequence/migration": "workspace:*",
+ "@0xsequence/network": "workspace:*",
+ "@0xsequence/relayer": "workspace:*",
+ "@0xsequence/sessions": "workspace:*",
+ "@0xsequence/utils": "workspace:*",
+ "@0xsequence/wallet": "workspace:*",
+ "ethers": "^5.5.2"
+ },
+ "devDependencies": {
+ "@0xsequence/signhub": "workspace:*",
+ "@0xsequence/tests": "workspace:*",
+ "@istanbuljs/nyc-config-typescript": "^1.0.2",
+ "nyc": "^15.1.0"
+ },
+ "files": [
+ "src",
+ "dist"
+ ]
+}
diff --git a/packages/account/src/account.ts b/packages/account/src/account.ts
new file mode 100644
index 0000000000..3243842eb8
--- /dev/null
+++ b/packages/account/src/account.ts
@@ -0,0 +1,1085 @@
+import { walletContracts } from '@0xsequence/abi'
+import { commons, universal } from '@0xsequence/core'
+import { WalletSignRequestMetadata } from '@0xsequence/core/src/commons'
+import { migrator, defaults, version } from '@0xsequence/migration'
+import { ChainId, NetworkConfig } from '@0xsequence/network'
+import { FeeOption, FeeQuote, isRelayer, Relayer, RpcRelayer } from '@0xsequence/relayer'
+import { tracker } from '@0xsequence/sessions'
+import { SignatureOrchestrator } from '@0xsequence/signhub'
+import { encodeTypedDataDigest, getEthersConnectionInfo } from '@0xsequence/utils'
+import { Wallet } from '@0xsequence/wallet'
+import { ethers, TypedDataDomain, TypedDataField } from 'ethers'
+import { AccountSigner, AccountSignerOptions } from './signer'
+
+export type AccountStatus = {
+ original: {
+ version: number
+ imageHash: string
+ context: commons.context.WalletContext
+ }
+ onChain: {
+ imageHash: string
+ config: commons.config.Config
+ version: number
+ deployed: boolean
+ }
+ fullyMigrated: boolean
+ signedMigrations: migrator.SignedMigration[]
+ version: number
+ presignedConfigurations: tracker.PresignedConfigLink[]
+ imageHash: string
+ config: commons.config.Config
+ checkpoint: ethers.BigNumberish
+ canOnchainValidate: boolean
+}
+
+export type AccountOptions = {
+ // The only unique identifier for a wallet is the address
+ address: string
+
+ // The config tracker keeps track of chained configs,
+ // counterfactual addresses and reverse lookups for configurations
+ // it must implement both the ConfigTracker and MigrationTracker
+ tracker: tracker.ConfigTracker & migrator.PresignedMigrationTracker
+
+ // Versioned contexts contains the context information for each Sequence version
+ contexts: commons.context.VersionedContext
+
+ // Optional list of migrations, if not provided, the default migrations will be used
+ // NOTICE: the last vestion is considered the "current" version for the account
+ migrations?: migrator.Migrations
+
+ // Orchestrator manages signing messages and transactions
+ orchestrator: SignatureOrchestrator
+
+ // Networks information and providers
+ networks: NetworkConfig[]
+
+ // Jwt
+ jwt?: string
+
+ // Project access key
+ projectAccessKey?: string
+}
+
+export interface PreparedTransactions {
+ transactions: commons.transaction.SimulatedTransaction[]
+ flatDecorated: commons.transaction.Transaction[]
+ feeOptions: FeeOption[]
+ feeQuote?: FeeQuote
+}
+
+class Chain0Reader implements commons.reader.Reader {
+ async isDeployed(_wallet: string): Promise {
+ return false
+ }
+
+ async implementation(_wallet: string): Promise {
+ return undefined
+ }
+
+ async imageHash(_wallet: string): Promise {
+ return undefined
+ }
+
+ async nonce(_wallet: string, _space: ethers.BigNumberish): Promise {
+ return ethers.constants.Zero
+ }
+
+ async isValidSignature(_wallet: string, _digest: ethers.utils.BytesLike, _signature: ethers.utils.BytesLike): Promise {
+ throw new Error('Method not supported.')
+ }
+}
+
+export class Account {
+ public readonly address: string
+
+ public readonly networks: NetworkConfig[]
+ public readonly tracker: tracker.ConfigTracker & migrator.PresignedMigrationTracker
+ public readonly contexts: commons.context.VersionedContext
+
+ public readonly migrator: migrator.Migrator
+ public readonly migrations: migrator.Migrations
+
+ private orchestrator: SignatureOrchestrator
+
+ private jwt?: string
+
+ private projectAccessKey?: string
+
+ constructor(options: AccountOptions) {
+ this.address = ethers.utils.getAddress(options.address)
+
+ this.contexts = options.contexts
+ this.tracker = options.tracker
+ this.networks = options.networks
+ this.orchestrator = options.orchestrator
+ this.jwt = options.jwt
+ this.projectAccessKey = options.projectAccessKey
+
+ this.migrations = options.migrations || defaults.DefaultMigrations
+ this.migrator = new migrator.Migrator(options.tracker, this.migrations, this.contexts)
+ }
+
+ getSigner(chainId: ChainId, options?: AccountSignerOptions): AccountSigner {
+ return new AccountSigner(this, chainId, options)
+ }
+
+ static async new(options: {
+ config: commons.config.SimpleConfig
+ tracker: tracker.ConfigTracker & migrator.PresignedMigrationTracker
+ contexts: commons.context.VersionedContext
+ orchestrator: SignatureOrchestrator
+ networks: NetworkConfig[]
+ migrations?: migrator.Migrations
+ projectAccessKey?: string
+ }): Promise {
+ const mig = new migrator.Migrator(options.tracker, options.migrations ?? defaults.DefaultMigrations, options.contexts)
+
+ const lastMigration = mig.lastMigration()
+ const lastCoder = lastMigration.configCoder
+
+ const config = lastCoder.fromSimple(options.config)
+ const imageHash = lastCoder.imageHashOf(config)
+ const context = options.contexts[lastMigration.version]
+ const address = commons.context.addressOf(context, imageHash)
+
+ await options.tracker.saveCounterfactualWallet({ config, context: Object.values(options.contexts) })
+
+ return new Account({
+ address,
+ tracker: options.tracker,
+ contexts: options.contexts,
+ networks: options.networks,
+ orchestrator: options.orchestrator,
+ migrations: options.migrations,
+ projectAccessKey: options.projectAccessKey
+ })
+ }
+
+ getAddress(): Promise {
+ return Promise.resolve(this.address)
+ }
+
+ get version(): number {
+ return this.migrator.lastMigration().version
+ }
+
+ get coders(): {
+ signature: commons.signature.SignatureCoder
+ config: commons.config.ConfigCoder
+ } {
+ const lastMigration = this.migrator.lastMigration()
+
+ return {
+ signature: lastMigration.signatureCoder,
+ config: lastMigration.configCoder
+ }
+ }
+
+ network(chainId: ethers.BigNumberish): NetworkConfig {
+ const tcid = ethers.BigNumber.from(chainId)
+ const found = this.networks.find(n => tcid.eq(n.chainId))
+ if (!found) throw new Error(`Network not found for chainId ${chainId}`)
+ return found
+ }
+
+ providerFor(chainId: ethers.BigNumberish): ethers.providers.Provider {
+ const found = this.network(chainId)
+ if (!found.provider && !found.rpcUrl) throw new Error(`Provider not found for chainId ${chainId}`)
+ return (
+ found.provider ||
+ new ethers.providers.StaticJsonRpcProvider(getEthersConnectionInfo(found.rpcUrl, this.projectAccessKey, this.jwt), {
+ name: '',
+ chainId: ethers.BigNumber.from(chainId).toNumber()
+ })
+ )
+ }
+
+ reader(chainId: ethers.BigNumberish): commons.reader.Reader {
+ if (ethers.constants.Zero.eq(chainId)) return new Chain0Reader()
+
+ // TODO: Networks should be able to provide a reader directly
+ // and we should default to the on-chain reader
+ return new commons.reader.OnChainReader(this.providerFor(chainId))
+ }
+
+ relayer(chainId: ethers.BigNumberish): Relayer {
+ const found = this.network(chainId)
+ if (!found.relayer) throw new Error(`Relayer not found for chainId ${chainId}`)
+ if (isRelayer(found.relayer)) return found.relayer
+ return new RpcRelayer({
+ ...found.relayer,
+ // If there's an access key, we don't pass the JWT, because browser-side usage of this code mandates an access key
+ // and passing a JWT causes a CORS error.
+ ...(this.projectAccessKey ? { projectAccessKey: this.projectAccessKey } : { jwtAuth: this.jwt })
+ })
+ }
+
+ setOrchestrator(orchestrator: SignatureOrchestrator) {
+ this.orchestrator = orchestrator
+ }
+
+ setJwt(jwt: string) {
+ this.jwt = jwt
+ }
+
+ contextFor(version: number): commons.context.WalletContext {
+ const ctx = this.contexts[version]
+ if (!ctx) throw new Error(`Context not found for version ${version}`)
+ return ctx
+ }
+
+ walletForStatus(chainId: ethers.BigNumberish, status: Pick & Pick): Wallet {
+ const coder = universal.coderFor(status.version)
+ return this.walletFor(chainId, this.contextFor(status.version), status.config, coder)
+ }
+
+ walletFor(
+ chainId: ethers.BigNumberish,
+ context: commons.context.WalletContext,
+ config: commons.config.Config,
+ coders: typeof this.coders
+ ): Wallet {
+ const isNetworkZero = ethers.constants.Zero.eq(chainId)
+ return new Wallet({
+ config,
+ context,
+ chainId,
+ coders,
+ relayer: isNetworkZero ? undefined : this.relayer(chainId),
+ address: this.address,
+ orchestrator: this.orchestrator,
+ reader: this.reader(chainId)
+ })
+ }
+
+ // Get the status of the account on a given network
+ // this does the following process:
+ // 1. Get the current on-chain status of the wallet (version + imageHash)
+ // 2. Get any pending migrations that have been signed by the wallet
+ // 3. Get any pending configuration updates that have been signed by the wallet
+ // 4. Fetch reverse lookups for both on-chain and pending configurations
+ async status(chainId: ethers.BigNumberish, longestPath: boolean = false): Promise {
+ const isDeployedPromise = this.reader(chainId).isDeployed(this.address)
+
+ const counterfactualImageHashPromise = this.tracker
+ .imageHashOfCounterfactualWallet({
+ wallet: this.address
+ })
+ .then(r => {
+ if (!r) throw new Error(`Counterfactual imageHash not found for wallet ${this.address}`)
+ return r
+ })
+
+ const counterFactualVersionPromise = counterfactualImageHashPromise.then(r => {
+ return version.counterfactualVersion(this.address, r.imageHash, Object.values(this.contexts))
+ })
+
+ const onChainVersionPromise = (async () => {
+ const isDeployed = await isDeployedPromise
+ if (!isDeployed) return counterFactualVersionPromise
+
+ const implementation = await this.reader(chainId).implementation(this.address)
+ if (!implementation) throw new Error(`Implementation not found for wallet ${this.address}`)
+
+ const versions = Object.values(this.contexts)
+ for (let i = 0; i < versions.length; i++) {
+ if (versions[i].mainModule === implementation || versions[i].mainModuleUpgradable === implementation) {
+ return versions[i].version
+ }
+ }
+
+ throw new Error(`Version not found for implementation ${implementation}`)
+ })()
+
+ const onChainImageHashPromise = (async () => {
+ const deployedImageHash = await this.reader(chainId).imageHash(this.address)
+ if (deployedImageHash) return deployedImageHash
+ const counterfactualImageHash = await counterfactualImageHashPromise
+ if (counterfactualImageHash) return counterfactualImageHash.imageHash
+ throw new Error(`On-chain imageHash not found for wallet ${this.address}`)
+ })()
+
+ const onChainConfigPromise = (async () => {
+ const onChainImageHash = await onChainImageHashPromise
+ const onChainConfig = await this.tracker.configOfImageHash({ imageHash: onChainImageHash })
+ if (onChainConfig) return onChainConfig
+ throw new Error(`On-chain config not found for imageHash ${onChainImageHash}`)
+ })()
+
+ const onChainVersion = await onChainVersionPromise
+ const onChainImageHash = await onChainImageHashPromise
+
+ let fromImageHash = onChainImageHash
+ let lastVersion = onChainVersion
+ let signedMigrations: migrator.SignedMigration[] = []
+
+ if (onChainVersion !== this.version) {
+ // We either need to use the presigned configuration updates, or we haven't performed
+ // any updates yet, so we can only use the on-chain imageHash as-is
+ const presignedMigrate = await this.migrator.getAllMigratePresignedTransaction({
+ address: this.address,
+ fromImageHash: onChainImageHash,
+ fromVersion: onChainVersion,
+ chainId
+ })
+
+ // The migrator returns the original version and imageHash
+ // if no presigned migration is found, so no need to check here
+ fromImageHash = presignedMigrate.lastImageHash
+ lastVersion = presignedMigrate.lastVersion
+
+ signedMigrations = presignedMigrate.signedMigrations
+ }
+
+ const presigned = await this.tracker.loadPresignedConfiguration({
+ wallet: this.address,
+ fromImageHash: fromImageHash,
+ longestPath
+ })
+
+ const imageHash = presigned && presigned.length > 0 ? presigned[presigned.length - 1].nextImageHash : fromImageHash
+ const config = await this.tracker.configOfImageHash({ imageHash })
+ if (!config) {
+ throw new Error(`Config not found for imageHash ${imageHash}`)
+ }
+
+ const isDeployed = await isDeployedPromise
+ const counterfactualImageHash = await counterfactualImageHashPromise
+ const checkpoint = universal.coderFor(lastVersion).config.checkpointOf(config as any)
+
+ return {
+ original: {
+ ...counterfactualImageHash,
+ version: await counterFactualVersionPromise
+ },
+ onChain: {
+ imageHash: onChainImageHash,
+ config: await onChainConfigPromise,
+ version: onChainVersion,
+ deployed: isDeployed
+ },
+ fullyMigrated: lastVersion === this.version,
+ signedMigrations,
+ version: lastVersion,
+ presignedConfigurations: presigned,
+ imageHash,
+ config,
+ checkpoint,
+ canOnchainValidate: onChainVersion === this.version && isDeployed
+ }
+ }
+
+ private mustBeFullyMigrated(status: AccountStatus) {
+ if (!status.fullyMigrated) {
+ throw new Error(`Wallet ${this.address} is not fully migrated`)
+ }
+ }
+
+ async predecorateSignedTransactions(
+ status: AccountStatus,
+ chainId: ethers.BigNumberish
+ ): Promise {
+ // Request signed predecorate transactions from child wallets
+ const bundles = await this.orchestrator.predecorateSignedTransactions({ chainId })
+ // Get signed predecorate transaction
+ const predecorated = await this.predecorateTransactions([], status, chainId)
+ if (commons.transaction.fromTransactionish(this.address, predecorated).length > 0) {
+ // Sign it
+ bundles.push(await this.signTransactions(predecorated, chainId))
+ }
+ return bundles
+ }
+
+ async predecorateTransactions(
+ txs: commons.transaction.Transactionish,
+ status: AccountStatus,
+ chainId: ethers.BigNumberish
+ ): Promise {
+ // if onchain wallet config is not up to date
+ // then we should append an extra transaction that updates it
+ // to the latest "lazy" state
+ if (status.onChain.imageHash !== status.imageHash) {
+ const wallet = this.walletForStatus(chainId, status)
+ const updateConfig = await wallet.buildUpdateConfigurationTransaction(status.config)
+ return [Array.isArray(txs) ? txs : [txs], updateConfig.transactions].flat()
+ }
+
+ return txs
+ }
+
+ async decorateTransactions(
+ bundles: commons.transaction.IntendedTransactionBundle | commons.transaction.IntendedTransactionBundle[],
+ status: AccountStatus,
+ chainId?: ethers.BigNumberish
+ ): Promise {
+ if (!Array.isArray(bundles)) {
+ // Recurse with array
+ return this.decorateTransactions([bundles], status, chainId)
+ }
+
+ // Default to chainId of first bundle when not supplied
+ chainId = chainId ?? bundles[0].chainId
+
+ const bootstrapBundle = await this.buildBootstrapTransactions(status, chainId)
+ const hasBootstrapTxs = bootstrapBundle.transactions.length > 0
+
+ if (!hasBootstrapTxs && bundles.length === 1) {
+ return bundles[0]
+ }
+
+ // Intent defaults to first bundle when no bootstrap transaction
+ const { entrypoint } = hasBootstrapTxs ? bootstrapBundle : bundles[0]
+
+ const decoratedBundle = {
+ entrypoint,
+ chainId,
+ // Intent of the first bundle is used
+ intent: bundles[0]?.intent,
+ transactions: [
+ ...bootstrapBundle.transactions,
+ ...bundles.map(
+ (bundle): commons.transaction.Transaction => ({
+ to: bundle.entrypoint,
+ data: commons.transaction.encodeBundleExecData(bundle),
+ gasLimit: 0,
+ delegateCall: false,
+ revertOnError: true,
+ value: 0
+ })
+ )
+ ]
+ }
+
+ // Re-compute the meta-transaction id to use the guest module subdigest
+ if (!status.onChain.deployed) {
+ const id = commons.transaction.subdigestOfGuestModuleTransactions(
+ this.contexts[this.version].guestModule,
+ chainId,
+ decoratedBundle.transactions
+ )
+
+ if (decoratedBundle.intent === undefined) {
+ decoratedBundle.intent = { id, wallet: this.address }
+ } else {
+ decoratedBundle.intent.id = id
+ }
+ }
+
+ return decoratedBundle
+ }
+
+ async decorateSignature(
+ signature: T,
+ status: Partial>
+ ): Promise {
+ if (!status.presignedConfigurations || status.presignedConfigurations.length === 0) {
+ return signature
+ }
+
+ const coder = this.coders.signature
+
+ const chain = status.presignedConfigurations.map(c => c.signature)
+ const chainedSignature = coder.chainSignatures(signature, chain)
+ return coder.trim(chainedSignature)
+ }
+
+ async publishWitness(): Promise {
+ const digest = ethers.utils.keccak256(ethers.utils.toUtf8Bytes(`This is a Sequence account woo! ${Date.now()}`))
+ const signature = await this.signDigest(digest, 0, false)
+ const decoded = this.coders.signature.decode(signature)
+ const signatures = this.coders.signature.signaturesOfDecoded(decoded)
+ return this.tracker.saveWitnesses({ wallet: this.address, digest, chainId: 0, signatures })
+ }
+
+ async signDigest(
+ digest: ethers.BytesLike,
+ chainId: ethers.BigNumberish,
+ decorate: boolean = true,
+ cantValidateBehavior: 'ignore' | 'eip6492' | 'throw' = 'ignore',
+ metadata?: object
+ ): Promise {
+ // If we are signing a digest for chainId zero then we can never be fully migrated
+ // because Sequence v1 doesn't allow for signing a message on "all chains"
+
+ // So we ignore the state on "chain zero" and instead use one of the states of the networks
+ // wallet-webapp should ensure the wallet is as migrated as possible, trying to mimic
+ // the behaviour of being migrated on all chains
+ const chainRef = ethers.constants.Zero.eq(chainId) ? this.networks[0].chainId : chainId
+ const status = await this.status(chainRef)
+ this.mustBeFullyMigrated(status)
+
+ // Check if we can validate onchain and what to do if we can't
+ // revert early, since there is no point in signing a digest now
+ if (!status.canOnchainValidate && cantValidateBehavior === 'throw') {
+ throw new Error('Wallet cannot validate onchain')
+ }
+
+ const wallet = this.walletForStatus(chainId, status)
+ const signature = await wallet.signDigest(digest, metadata)
+
+ const decorated = decorate ? this.decorateSignature(signature, status) : signature
+
+ // If the wallet can't validate onchain then we
+ // need to prefix the decorated signature with all deployments and migrations
+ // aka doing a bootstrap using EIP-6492
+ if (!status.canOnchainValidate) {
+ switch (cantValidateBehavior) {
+ // NOTICE: We covered this case before signing the digest
+ // case 'throw':
+ // throw new Error('Wallet cannot validate on-chain')
+ case 'ignore':
+ return decorated
+
+ case 'eip6492':
+ return this.buildEIP6492Signature(await decorated, status, chainId)
+ }
+ }
+
+ return decorated
+ }
+
+ buildOnChainSignature(digest: ethers.BytesLike): { bundle: commons.transaction.TransactionBundle; signature: string } {
+ const subdigest = commons.signature.subdigestOf({ digest: ethers.utils.hexlify(digest), chainId: 0, address: this.address })
+ const hexSubdigest = ethers.utils.hexlify(subdigest)
+ const config = this.coders.config.fromSimple({
+ // Threshold *only* needs to be > 0, this is not a magic number
+ // we only use 2 ** 15 because it may lead to lower gas costs in some chains
+ threshold: 32768,
+ checkpoint: 0,
+ signers: [],
+ subdigests: [hexSubdigest]
+ })
+
+ const walletInterface = new ethers.utils.Interface(walletContracts.mainModule.abi)
+ const bundle: commons.transaction.TransactionBundle = {
+ entrypoint: this.address,
+ transactions: [
+ {
+ to: this.address,
+ data: walletInterface.encodeFunctionData(
+ // *NEVER* use updateImageHash here, as it would effectively destroy the wallet
+ // setExtraImageHash sets an additional imageHash, without changing the current one
+ 'setExtraImageHash',
+ [
+ this.coders.config.imageHashOf(config),
+ // 2 ** 255 instead of max uint256, to have more zeros in the calldata
+ '57896044618658097711785492504343953926634992332820282019728792003956564819968'
+ ]
+ ),
+ // Conservative gas limit, used because the current relayer
+ // has trouble estimating gas for this transaction
+ gasLimit: 250000
+ }
+ ]
+ }
+
+ // Fire and forget request to save the config
+ this.tracker.saveWalletConfig({ config })
+
+ // Encode a signature proof for the given subdigest
+ // use `chainId = 0` to make it simpler, as this signature is only a proof
+ const signature = this.coders.signature.encodeSigners(config, new Map(), [hexSubdigest], 0).encoded
+ return { bundle, signature }
+ }
+
+ private async buildEIP6492Signature(signature: string, status: AccountStatus, chainId: ethers.BigNumberish): Promise {
+ const bootstrapBundle = await this.buildBootstrapTransactions(status, chainId)
+ if (bootstrapBundle.transactions.length === 0) {
+ throw new Error('Cannot build EIP-6492 signature without bootstrap transactions')
+ }
+
+ const encoded = ethers.utils.defaultAbiCoder.encode(
+ ['address', 'bytes', 'bytes'],
+ [bootstrapBundle.entrypoint, commons.transaction.encodeBundleExecData(bootstrapBundle), signature]
+ )
+
+ return ethers.utils.solidityPack(['bytes', 'bytes32'], [encoded, commons.EIP6492.EIP_6492_SUFFIX])
+ }
+
+ async editConfig(changes: {
+ add?: commons.config.SimpleSigner[]
+ remove?: string[]
+ threshold?: ethers.BigNumberish
+ }): Promise {
+ const currentConfig = await this.status(0).then(s => s.config)
+ const newConfig = this.coders.config.editConfig(currentConfig, {
+ ...changes,
+ checkpoint: this.coders.config.checkpointOf(currentConfig).add(1)
+ })
+
+ return this.updateConfig(newConfig)
+ }
+
+ async updateConfig(config: commons.config.Config): Promise {
+ // config should be for the current version of the wallet
+ if (!this.coders.config.isWalletConfig(config)) {
+ throw new Error(`Invalid config for wallet ${this.address}`)
+ }
+
+ const nextImageHash = this.coders.config.imageHashOf(config)
+
+ // sign an update config struct
+ const updateStruct = this.coders.signature.hashSetImageHash(nextImageHash)
+
+ // sign the update struct, using chain id 0
+ const signature = await this.signDigest(updateStruct, 0, false)
+
+ // save the presigned transaction to the sessions tracker
+ await this.tracker.savePresignedConfiguration({
+ wallet: this.address,
+ nextConfig: config,
+ signature
+ })
+
+ // safety check, tracker should have a reverse lookup for the imageHash
+ // outside of the local cache
+ const reverseConfig = await this.tracker.configOfImageHash({
+ imageHash: nextImageHash,
+ noCache: true
+ })
+
+ if (!reverseConfig || this.coders.config.imageHashOf(reverseConfig) !== nextImageHash) {
+ throw Error(`Reverse lookup failed for imageHash ${nextImageHash}`)
+ }
+ }
+
+ /**
+ * This method is used to bootstrap the wallet on a given chain.
+ * this deploys the wallets and executes all the necessary transactions
+ * for that wallet to start working with the given version.
+ *
+ * This usually involves: (a) deploying the wallet, (b) executing migrations
+ *
+ * Notice: It should NOT explicitly include chained signatures. Unless internally used
+ * by any of the migrations.
+ *
+ */
+ async buildBootstrapTransactions(
+ status: AccountStatus,
+ chainId: ethers.BigNumberish
+ ): Promise {
+ const bundle = await this.orchestrator.buildDeployTransaction({ chainId })
+ const transactions: commons.transaction.Transaction[] = bundle?.transactions ?? []
+
+ // Add wallet deployment if needed
+ if (!status.onChain.deployed) {
+ // Wallet deployment will vary depending on the version
+ // so we need to use the context to get the correct deployment
+ const deployTransaction = Wallet.buildDeployTransaction(status.original.context, status.original.imageHash)
+
+ transactions.push(...deployTransaction.transactions)
+ }
+ const len = transactions.length
+
+ // Get pending migrations
+ transactions.push(
+ ...status.signedMigrations.map(m => ({
+ to: m.tx.entrypoint,
+ data: commons.transaction.encodeBundleExecData(m.tx),
+ value: 0,
+ gasLimit: 0,
+ revertOnError: true,
+ delegateCall: false
+ }))
+ )
+
+ // Build the transaction intent, if the transaction has migrations
+ // then we should use one of the intents of the migrations (anyone will do)
+ // if it doesn't, then the only intent we could use if the GuestModule one
+ // ... but this may fail if the relayer uses a different GuestModule
+ const id =
+ status.signedMigrations.length > 0
+ ? status.signedMigrations[0].tx.intent.id
+ : commons.transaction.subdigestOfGuestModuleTransactions(this.contexts[this.version].guestModule, chainId, transactions)
+
+ // Everything is encoded as a bundle
+ // using the GuestModule of the account version
+ const { guestModule } = this.contextFor(status.version)
+ return { entrypoint: guestModule, transactions, chainId, intent: { id, wallet: this.address } }
+ }
+
+ async bootstrapTransactions(
+ chainId: ethers.BigNumberish,
+ prestatus?: AccountStatus
+ ): Promise> {
+ const status = prestatus || (await this.status(chainId))
+ return this.buildBootstrapTransactions(status, chainId)
+ }
+
+ async doBootstrap(chainId: ethers.BigNumberish, feeQuote?: FeeQuote, prestatus?: AccountStatus) {
+ const bootstrapTxs = await this.bootstrapTransactions(chainId, prestatus)
+ return this.relayer(chainId).relay({ ...bootstrapTxs, chainId }, feeQuote)
+ }
+
+ signMessage(
+ message: ethers.BytesLike,
+ chainId: ethers.BigNumberish,
+ cantValidateBehavior: 'ignore' | 'eip6492' | 'throw' = 'ignore'
+ ): Promise {
+ return this.signDigest(ethers.utils.keccak256(message), chainId, true, cantValidateBehavior)
+ }
+
+ async signTransactions(
+ txs: commons.transaction.Transactionish,
+ chainId: ethers.BigNumberish,
+ pstatus?: AccountStatus,
+ options?: {
+ nonceSpace?: ethers.BigNumberish
+ serial?: boolean
+ }
+ ): Promise {
+ const status = pstatus || (await this.status(chainId))
+ this.mustBeFullyMigrated(status)
+
+ const wallet = this.walletForStatus(chainId, status)
+
+ const metadata: WalletSignRequestMetadata = {
+ address: this.address,
+ digest: '', // Set in wallet.signTransactions
+ chainId,
+ config: { version: this.version },
+ decorate: true,
+ cantValidateBehavior: 'ignore'
+ }
+
+ const nonceOptions = options?.serial
+ ? { serial: true }
+ : options?.nonceSpace !== undefined
+ ? { space: options.nonceSpace }
+ : undefined
+
+ const signed = await wallet.signTransactions(txs, nonceOptions, metadata)
+
+ return {
+ ...signed,
+ signature: await this.decorateSignature(signed.signature, status)
+ }
+ }
+
+ async signMigrations(
+ chainId: ethers.BigNumberish,
+ editConfig: (prevConfig: commons.config.Config) => commons.config.Config
+ ): Promise {
+ const status = await this.status(chainId)
+ if (status.fullyMigrated) return false
+
+ const wallet = this.walletForStatus(chainId, status)
+ const nextConfig = editConfig(wallet.config)
+ const signed = await this.migrator.signNextMigration(this.address, status.version, wallet, nextConfig)
+ if (!signed) return false
+
+ // Make sure the tracker has a copy of the config
+ // before attempting to save the migration
+ // otherwise if this second step fails the tracker could end up
+ // with a migration to an unknown config
+ await this.tracker.saveWalletConfig({ config: nextConfig })
+ const nextCoder = universal.coderFor(nextConfig.version).config
+ const nextImageHash = nextCoder.imageHashOf(nextConfig as any)
+ const reverseConfig = await this.tracker.configOfImageHash({ imageHash: nextImageHash, noCache: true })
+ if (!reverseConfig || nextCoder.imageHashOf(reverseConfig as any) !== nextImageHash) {
+ throw Error(`Reverse lookup failed for imageHash ${nextImageHash}`)
+ }
+
+ await this.tracker.saveMigration(this.address, signed, this.contexts)
+
+ return true
+ }
+
+ async signAllMigrations(
+ editConfig: (prevConfig: commons.config.Config) => commons.config.Config
+ ): Promise<{ signedMigrations: Array; failedChains: number[] }> {
+ const failedChains: number[] = []
+ const signedMigrations = await Promise.all(
+ this.networks.map(async n => {
+ try {
+ // Signing migrations for each chain
+ return await this.signMigrations(n.chainId, editConfig)
+ } catch (error) {
+ console.warn(`Failed to sign migrations for chain ${n.chainId}`, error)
+
+ // Adding failed chainId to the failedChains array
+ failedChains.push(n.chainId)
+ // Using null as a placeholder for failed chains
+ return null
+ }
+ })
+ )
+
+ // Filter out null values to get only the successful signed migrations
+ const successfulSignedMigrations = signedMigrations.filter(migration => migration !== null)
+
+ return { signedMigrations: successfulSignedMigrations, failedChains }
+ }
+
+ async isMigratedAllChains(): Promise<{ migratedAllChains: boolean; failedChains: number[] }> {
+ const failedChains: number[] = []
+ const statuses = await Promise.all(
+ this.networks.map(async n => {
+ try {
+ return await this.status(n.chainId)
+ } catch (error) {
+ failedChains.push(n.chainId)
+
+ console.warn(`Failed to get status for chain ${n.chainId}`, error)
+
+ // default to true for failed chains
+ return { fullyMigrated: true }
+ }
+ })
+ )
+
+ const migratedAllChains = statuses.every(s => s.fullyMigrated)
+ return { migratedAllChains, failedChains }
+ }
+
+ async sendSignedTransactions(
+ signedBundle: commons.transaction.IntendedTransactionBundle | commons.transaction.IntendedTransactionBundle[],
+ chainId: ethers.BigNumberish,
+ quote?: FeeQuote,
+ pstatus?: AccountStatus,
+ callback?: (bundle: commons.transaction.IntendedTransactionBundle) => void
+ ): Promise {
+ if (!Array.isArray(signedBundle)) {
+ return this.sendSignedTransactions([signedBundle], chainId, quote, pstatus, callback)
+ }
+ const status = pstatus || (await this.status(chainId))
+ this.mustBeFullyMigrated(status)
+
+ const decoratedBundle = await this.decorateTransactions(signedBundle, status, chainId)
+ callback?.(decoratedBundle)
+
+ return this.relayer(chainId).relay(decoratedBundle, quote)
+ }
+
+ async fillGasLimits(
+ txs: commons.transaction.Transactionish,
+ chainId: ethers.BigNumberish,
+ status?: AccountStatus
+ ): Promise {
+ const wallet = this.walletForStatus(chainId, status || (await this.status(chainId)))
+ return wallet.fillGasLimits(txs)
+ }
+
+ async gasRefundQuotes(
+ txs: commons.transaction.Transactionish,
+ chainId: ethers.BigNumberish,
+ stubSignatureOverrides: Map,
+ status?: AccountStatus,
+ options?: {
+ simulate?: boolean
+ }
+ ): Promise<{
+ options: FeeOption[]
+ quote?: FeeQuote
+ decorated: commons.transaction.IntendedTransactionBundle
+ }> {
+ const wstatus = status || (await this.status(chainId))
+ const wallet = this.walletForStatus(chainId, wstatus)
+
+ const predecorated = await this.predecorateTransactions(txs, wstatus, chainId)
+ const transactions = commons.transaction.fromTransactionish(this.address, predecorated)
+
+ // We can't sign the transactions (because we don't want to bother the user)
+ // so we use the latest configuration to build a "stub" signature, the relayer
+ // knows to ignore the wallet signatures
+ const stubSignature = wallet.coders.config.buildStubSignature(wallet.config, stubSignatureOverrides)
+
+ // Now we can decorate the transactions as always, but we need to manually build the signed bundle
+ const intentId = ethers.utils.hexlify(ethers.utils.randomBytes(32))
+ const signedBundle: commons.transaction.SignedTransactionBundle = {
+ chainId,
+ intent: {
+ id: intentId,
+ wallet: this.address
+ },
+ signature: stubSignature,
+ transactions,
+ entrypoint: this.address,
+ nonce: 0 // The relayer also ignored the nonce
+ }
+
+ const decoratedBundle = await this.decorateTransactions(signedBundle, wstatus)
+ const data = commons.transaction.encodeBundleExecData(decoratedBundle)
+ const res = await this.relayer(chainId).getFeeOptionsRaw(decoratedBundle.entrypoint, data, options)
+ return { ...res, decorated: decoratedBundle }
+ }
+
+ async prepareTransactions(args: {
+ txs: commons.transaction.Transactionish
+ chainId: ethers.BigNumberish
+ stubSignatureOverrides: Map
+ simulateForFeeOptions?: boolean
+ }): Promise {
+ const status = await this.status(args.chainId)
+
+ const transactions = await this.fillGasLimits(args.txs, args.chainId, status)
+ const gasRefundQuote = await this.gasRefundQuotes(transactions, args.chainId, args.stubSignatureOverrides, status, {
+ simulate: args.simulateForFeeOptions
+ })
+ const flatDecorated = commons.transaction.unwind(this.address, gasRefundQuote.decorated.transactions)
+
+ return {
+ transactions,
+ flatDecorated,
+ feeOptions: gasRefundQuote.options,
+ feeQuote: gasRefundQuote.quote
+ }
+ }
+
+ async sendTransaction(
+ txs: commons.transaction.Transactionish,
+ chainId: ethers.BigNumberish,
+ quote?: FeeQuote,
+ skipPreDecorate: boolean = false,
+ callback?: (bundle: commons.transaction.IntendedTransactionBundle) => void,
+ options?: {
+ nonceSpace?: ethers.BigNumberish
+ serial?: boolean
+ }
+ ): Promise {
+ const status = await this.status(chainId)
+
+ const predecorated = skipPreDecorate ? txs : await this.predecorateTransactions(txs, status, chainId)
+ const hasTxs = commons.transaction.fromTransactionish(this.address, predecorated).length > 0
+ const signed = hasTxs ? await this.signTransactions(predecorated, chainId, undefined, options) : undefined
+
+ const childBundles = await this.orchestrator.predecorateSignedTransactions({ chainId })
+
+ const bundles: commons.transaction.SignedTransactionBundle[] = []
+ if (signed !== undefined && signed.transactions.length > 0) {
+ bundles.push(signed)
+ }
+ bundles.push(...childBundles.filter(b => b.transactions.length > 0))
+
+ return this.sendSignedTransactions(bundles, chainId, quote, undefined, callback)
+ }
+
+ async signTypedData(
+ domain: TypedDataDomain,
+ types: Record>,
+ message: Record,
+ chainId: ethers.BigNumberish,
+ cantValidateBehavior: 'ignore' | 'eip6492' | 'throw' = 'ignore'
+ ): Promise {
+ const digest = encodeTypedDataDigest({ domain, types, message })
+ return this.signDigest(digest, chainId, true, cantValidateBehavior)
+ }
+
+ async getSigners(): Promise> {
+ const last = (ts: T[]): T | undefined => (ts.length ? ts[ts.length - 1] : undefined)
+
+ return (
+ await Promise.all(
+ this.networks.map(async ({ chainId, name }) => {
+ try {
+ const status = await this.status(chainId)
+
+ let latestImageHash = last(status.presignedConfigurations)?.nextImageHash
+ if (!latestImageHash) {
+ if (status.onChain.version !== status.version) {
+ const migration = last(status.signedMigrations)
+ if (migration) {
+ const { toVersion, toConfig } = migration
+ const coder = universal.genericCoderFor(toVersion)
+ latestImageHash = coder.config.imageHashOf(toConfig)
+ }
+ }
+ }
+ if (!latestImageHash) {
+ latestImageHash = status.onChain.imageHash
+ }
+
+ const latestConfig = await this.tracker.configOfImageHash({ imageHash: latestImageHash })
+ if (!latestConfig) {
+ throw new Error(`unable to find config for image hash ${latestImageHash}`)
+ }
+
+ const coder = universal.genericCoderFor(latestConfig.version)
+ const signers = coder.config.signersOf(latestConfig)
+
+ return signers.map(signer => ({ ...signer, network: chainId }))
+ } catch (error) {
+ console.warn(`unable to get signers on network ${chainId} ${name}`, error)
+ return []
+ }
+ })
+ )
+ ).flat()
+ }
+
+ async getAllSigners(): Promise<
+ {
+ address: string
+ weight: number
+ network: number
+ flaggedForRemoval: boolean
+ }[]
+ > {
+ const allSigners: {
+ address: string
+ weight: number
+ network: number
+ flaggedForRemoval: boolean
+ }[] = []
+
+ // We need to get the signers for each status
+ await Promise.all(
+ this.networks.map(async network => {
+ const chainId = network.chainId
+
+ // Getting the status with `longestPath` set to true will give us all the possible configurations
+ // between the current onChain config and the latest config, including the ones "flagged for removal"
+ const status = await this.status(chainId, true)
+
+ const fullChain = [
+ status.onChain.imageHash,
+ ...(status.onChain.version !== status.version
+ ? status.signedMigrations.map(m => universal.coderFor(m.toVersion).config.imageHashOf(m.toConfig as any))
+ : []),
+ ...status.presignedConfigurations.map(update => update.nextImageHash)
+ ]
+
+ return Promise.all(
+ fullChain.map(async (nextImageHash, iconf) => {
+ const isLast = iconf === fullChain.length - 1
+ const config = await this.tracker.configOfImageHash({ imageHash: nextImageHash })
+
+ if (!config) {
+ console.warn(`AllSigners may be incomplete, config not found for imageHash ${nextImageHash}`)
+ return
+ }
+
+ const coder = universal.genericCoderFor(config.version)
+ const signers = coder.config.signersOf(config)
+
+ signers.forEach(signer => {
+ const exists = allSigners.find(s => s.address === signer.address && s.network === chainId)
+
+ if (exists && isLast && exists.flaggedForRemoval) {
+ exists.flaggedForRemoval = false
+ return
+ }
+
+ if (exists) return
+
+ allSigners.push({
+ address: signer.address,
+ weight: signer.weight,
+ network: chainId,
+ flaggedForRemoval: !isLast
+ })
+ })
+ })
+ )
+ })
+ )
+
+ return allSigners
+ }
+}
+
+export function isAccount(value: any): value is Account {
+ return value instanceof Account
+}
diff --git a/packages/account/src/index.ts b/packages/account/src/index.ts
new file mode 100644
index 0000000000..8a695b2e25
--- /dev/null
+++ b/packages/account/src/index.ts
@@ -0,0 +1 @@
+export * from './account'
diff --git a/packages/account/src/orchestrator/wrapper.ts b/packages/account/src/orchestrator/wrapper.ts
new file mode 100644
index 0000000000..ab9e16c3fd
--- /dev/null
+++ b/packages/account/src/orchestrator/wrapper.ts
@@ -0,0 +1,69 @@
+import { commons } from '@0xsequence/core'
+import { signers, Status } from '@0xsequence/signhub'
+import { ethers } from 'ethers'
+import { Account } from '../account'
+
+export type MetadataWithChainId = {
+ chainId: ethers.BigNumberish
+}
+
+// Implements a wrapper for using Sequence accounts as nested signers in the signhub orchestrator.
+export class AccountOrchestratorWrapper implements signers.SapientSigner {
+ constructor(public account: Account) {}
+
+ async getAddress(): Promise {
+ return this.account.address
+ }
+
+ getChainIdFromMetadata(metadata: object): ethers.BigNumber {
+ try {
+ const { chainId } = metadata as MetadataWithChainId
+ return ethers.BigNumber.from(chainId)
+ } catch (err) {
+ // Invalid metadata object
+ throw new Error('AccountOrchestratorWrapper only supports metadata with chain id')
+ }
+ }
+
+ async buildDeployTransaction(metadata: object): Promise {
+ const chainId = this.getChainIdFromMetadata(metadata)
+ const status = await this.account.status(chainId)
+ return this.account.buildBootstrapTransactions(status, chainId)
+ }
+
+ async predecorateSignedTransactions(metadata: object): Promise {
+ const chainId = this.getChainIdFromMetadata(metadata)
+ const status = await this.account.status(chainId)
+ return this.account.predecorateSignedTransactions(status, chainId)
+ }
+
+ async decorateTransactions(
+ bundle: commons.transaction.IntendedTransactionBundle,
+ metadata: object
+ ): Promise {
+ const chainId = this.getChainIdFromMetadata(metadata)
+ const status = await this.account.status(chainId)
+ return this.account.decorateTransactions(bundle, status)
+ }
+
+ sign(message: ethers.utils.BytesLike, metadata: object): Promise {
+ if (!commons.isWalletSignRequestMetadata(metadata)) {
+ throw new Error('AccountOrchestratorWrapper only supports wallet metadata requests')
+ }
+
+ const { chainId, decorate } = metadata
+ // EIP-6492 not supported on nested signatures
+ // Default to throw instead of ignore. Ignoring should be explicit
+ const cantValidateBehavior = metadata.cantValidateBehavior ?? 'throw'
+
+ // For Sequence nested signatures we must use `signDigest` and not `signMessage`
+ // otherwise the account will hash the digest and the signature will be invalid.
+ return this.account.signDigest(message, chainId, decorate, cantValidateBehavior, metadata)
+ }
+
+ notifyStatusChange(_i: string, _s: Status, _m: object): void {}
+
+ suffix(): ethers.utils.BytesLike {
+ return [3]
+ }
+}
diff --git a/packages/account/src/signer.ts b/packages/account/src/signer.ts
new file mode 100644
index 0000000000..770752e29f
--- /dev/null
+++ b/packages/account/src/signer.ts
@@ -0,0 +1,223 @@
+import { ChainId } from '@0xsequence/network'
+import { Account } from './account'
+import { ethers } from 'ethers'
+import { commons } from '@0xsequence/core'
+import { FeeOption, proto } from '@0xsequence/relayer'
+import { isDeferrable } from './utils'
+
+export type AccountSignerOptions = {
+ nonceSpace?: ethers.BigNumberish
+ cantValidateBehavior?: 'ignore' | 'eip6492' | 'throw'
+ stubSignatureOverrides?: Map
+ selectFee?: (
+ txs: ethers.utils.Deferrable | commons.transaction.Transactionish,
+ options: FeeOption[]
+ ) => Promise
+}
+
+function encodeGasRefundTransaction(option?: FeeOption) {
+ if (!option) return []
+
+ const value = ethers.BigNumber.from(option.value)
+
+ switch (option.token.type) {
+ case proto.FeeTokenType.UNKNOWN:
+ return [
+ {
+ delegateCall: false,
+ revertOnError: true,
+ gasLimit: option.gasLimit,
+ to: option.to,
+ value: value.toHexString(),
+ data: []
+ }
+ ]
+
+ case proto.FeeTokenType.ERC20_TOKEN:
+ if (!option.token.contractAddress) {
+ throw new Error(`No contract address for ERC-20 fee option`)
+ }
+
+ return [
+ {
+ delegateCall: false,
+ revertOnError: true,
+ gasLimit: option.gasLimit,
+ to: option.token.contractAddress,
+ value: 0,
+ data: new ethers.utils.Interface([
+ {
+ constant: false,
+ inputs: [{ type: 'address' }, { type: 'uint256' }],
+ name: 'transfer',
+ outputs: [],
+ type: 'function'
+ }
+ ]).encodeFunctionData('transfer', [option.to, value.toHexString()])
+ }
+ ]
+
+ default:
+ throw new Error(`Unhandled fee token type ${option.token.type}`)
+ }
+}
+
+export class AccountSigner implements ethers.Signer {
+ public readonly _isSigner = true
+
+ constructor(
+ public account: Account,
+ public chainId: ChainId,
+ public readonly options?: AccountSignerOptions
+ ) {}
+
+ get provider() {
+ return this.account.providerFor(this.chainId)
+ }
+
+ async getAddress(): Promise {
+ return this.account.address
+ }
+
+ signMessage(message: string | ethers.utils.Bytes): Promise {
+ return this.account.signMessage(message, this.chainId, this.options?.cantValidateBehavior ?? 'throw')
+ }
+
+ private async defaultSelectFee(
+ _txs: ethers.utils.Deferrable | commons.transaction.Transactionish,
+ options: FeeOption[]
+ ): Promise {
+ // If no options, return undefined
+ if (options.length === 0) return undefined
+
+ // If there are multiple options, try them one by one
+ // until we find one that satisfies the balance requirement
+ const balanceOfAbi = [
+ {
+ constant: true,
+ inputs: [{ type: 'address' }],
+ name: 'balanceOf',
+ outputs: [{ type: 'uint256' }],
+ type: 'function'
+ }
+ ]
+
+ for (const option of options) {
+ if (option.token.type === proto.FeeTokenType.UNKNOWN) {
+ // Native token
+ const balance = await this.getBalance()
+ if (balance.gte(ethers.BigNumber.from(option.value))) {
+ return option
+ }
+ } else if (option.token.contractAddress && option.token.type === proto.FeeTokenType.ERC20_TOKEN) {
+ // ERC20 token
+ const token = new ethers.Contract(option.token.contractAddress, balanceOfAbi, this.provider)
+ const balance = await token.balanceOf(this.account.address)
+ if (balance.gte(ethers.BigNumber.from(option.value))) {
+ return option
+ }
+ } else {
+ // Unsupported token type
+ }
+ }
+
+ throw new Error('No fee option available - not enough balance')
+ }
+
+ async sendTransaction(
+ txsPromise: ethers.utils.Deferrable | commons.transaction.Transactionish,
+ options?: {
+ simulateForFeeOptions?: boolean
+ }
+ ): Promise {
+ const txs = isDeferrable(txsPromise)
+ ? await ethers.utils.resolveProperties(txsPromise as ethers.utils.Deferrable)
+ : txsPromise
+
+ const prepare = await this.account.prepareTransactions({
+ txs,
+ chainId: this.chainId,
+ stubSignatureOverrides: this.options?.stubSignatureOverrides ?? new Map(),
+ simulateForFeeOptions: options?.simulateForFeeOptions
+ })
+
+ const selectMethod = this.options?.selectFee ?? this.defaultSelectFee.bind(this)
+ const feeOption = await selectMethod(txs, prepare.feeOptions)
+
+ const finalTransactions = [...prepare.transactions, ...encodeGasRefundTransaction(feeOption)]
+
+ return this.account.sendTransaction(
+ finalTransactions,
+ this.chainId,
+ prepare.feeQuote,
+ undefined,
+ undefined,
+ this.options?.nonceSpace !== undefined
+ ? {
+ nonceSpace: this.options.nonceSpace
+ }
+ : undefined
+ ) as Promise // Will always have a transaction response
+ }
+
+ getBalance(blockTag?: ethers.providers.BlockTag | undefined): Promise {
+ return this.provider.getBalance(this.account.address, blockTag)
+ }
+
+ call(
+ transaction: ethers.utils.Deferrable,
+ blockTag?: ethers.providers.BlockTag | undefined
+ ): Promise {
+ return this.provider.call(transaction, blockTag)
+ }
+
+ async resolveName(name: string): Promise {
+ const res = await this.provider.resolveName(name)
+ if (!res) throw new Error(`Could not resolve name ${name}`)
+ return res
+ }
+
+ connect(_provider: ethers.providers.Provider): ethers.Signer {
+ throw new Error('Method not implemented.')
+ }
+
+ signTransaction(transaction: ethers.utils.Deferrable): Promise {
+ throw new Error('Method not implemented.')
+ }
+
+ getTransactionCount(blockTag?: ethers.providers.BlockTag | undefined): Promise {
+ throw new Error('Method not implemented.')
+ }
+
+ estimateGas(transaction: ethers.utils.Deferrable): Promise {
+ throw new Error('Method not implemented.')
+ }
+
+ getChainId(): Promise {
+ return Promise.resolve(ethers.BigNumber.from(this.chainId).toNumber())
+ }
+
+ getGasPrice(): Promise {
+ throw new Error('Method not implemented.')
+ }
+
+ getFeeData(): Promise {
+ throw new Error('Method not implemented.')
+ }
+
+ checkTransaction(
+ transaction: ethers.utils.Deferrable
+ ): ethers.utils.Deferrable {
+ throw new Error('Method not implemented.')
+ }
+
+ populateTransaction(
+ transaction: ethers.utils.Deferrable
+ ): Promise {
+ throw new Error('Method not implemented.')
+ }
+
+ _checkProvider(operation?: string | undefined): void {
+ throw new Error('Method not implemented.')
+ }
+}
diff --git a/packages/account/src/utils.ts b/packages/account/src/utils.ts
new file mode 100644
index 0000000000..b8d715ec6c
--- /dev/null
+++ b/packages/account/src/utils.ts
@@ -0,0 +1,14 @@
+import { ethers } from 'ethers'
+
+function isPromise(value: any): value is Promise {
+ return !!value && typeof value.then === 'function'
+}
+
+export function isDeferrable(value: any): value is ethers.utils.Deferrable {
+ // The value is deferrable if any of the properties is a Promises
+ if (typeof value === 'object') {
+ return Object.keys(value).some(key => isPromise(value[key]))
+ }
+
+ return false
+}
diff --git a/packages/account/tests/account.spec.ts b/packages/account/tests/account.spec.ts
new file mode 100644
index 0000000000..056e226861
--- /dev/null
+++ b/packages/account/tests/account.spec.ts
@@ -0,0 +1,1536 @@
+import { walletContracts } from '@0xsequence/abi'
+import { commons, v1, v2 } from '@0xsequence/core'
+import { migrator } from '@0xsequence/migration'
+import { NetworkConfig } from '@0xsequence/network'
+import { LocalRelayer, Relayer } from '@0xsequence/relayer'
+import { tracker, trackers } from '@0xsequence/sessions'
+import { Orchestrator } from '@0xsequence/signhub'
+import * as utils from '@0xsequence/tests'
+import { Wallet } from '@0xsequence/wallet'
+import * as chai from 'chai'
+import chaiAsPromised from 'chai-as-promised'
+import { ethers } from 'ethers'
+import hardhat from 'hardhat'
+
+import { Account } from '../src/account'
+import { AccountOrchestratorWrapper } from '../src/orchestrator/wrapper'
+
+const { expect } = chai.use(chaiAsPromised)
+
+const deterministic = false
+
+describe('Account', () => {
+ let provider1: ethers.providers.JsonRpcProvider
+ let provider2: ethers.providers.JsonRpcProvider
+
+ let signer1: ethers.Signer
+ let signer2: ethers.Signer
+
+ let contexts: commons.context.VersionedContext
+ let networks: NetworkConfig[]
+
+ let tracker: tracker.ConfigTracker & migrator.PresignedMigrationTracker
+
+ let defaultArgs: {
+ contexts: commons.context.VersionedContext
+ networks: NetworkConfig[]
+ tracker: tracker.ConfigTracker & migrator.PresignedMigrationTracker
+ }
+
+ let defaultTx: commons.transaction.Transaction
+
+ const createNestedAccount = async (entropy: string, bootstrapInner = true, bootstrapOuter = true) => {
+ const signer = randomWallet(entropy)
+
+ const configInner = {
+ threshold: 1,
+ checkpoint: Math.floor(now() / 1000),
+ signers: [{ address: signer.address, weight: 1 }]
+ }
+ const accountInner = await Account.new({
+ ...defaultArgs,
+ config: configInner,
+ orchestrator: new Orchestrator([signer])
+ })
+ if (bootstrapInner) {
+ await accountInner.doBootstrap(networks[0].chainId)
+ }
+
+ const configOuter = {
+ threshold: 1,
+ checkpoint: Math.floor(now() / 1000),
+ signers: [{ address: accountInner.address, weight: 1 }]
+ }
+ const accountOuter = await Account.new({
+ ...defaultArgs,
+ config: configOuter,
+ orchestrator: new Orchestrator([new AccountOrchestratorWrapper(accountInner)])
+ })
+ if (bootstrapOuter) {
+ await accountOuter.doBootstrap(networks[0].chainId)
+ }
+
+ return { signer, accountInner, accountOuter }
+ }
+
+ const getEth = async (address: string, signer?: ethers.Signer) => {
+ if (signer === undefined) {
+ // Do both networks
+ await getEth(address, signer1)
+ await getEth(address, signer2)
+ return
+ }
+ // Signer sends the address some ETH for defaultTx use
+ const tx = await signer.sendTransaction({
+ to: address,
+ value: 10 // Should be plenty
+ })
+ await tx.wait()
+ }
+
+ before(async () => {
+ provider1 = new ethers.providers.Web3Provider(hardhat.network.provider as any)
+ provider2 = new ethers.providers.JsonRpcProvider('http://127.0.0.1:7048')
+
+ // TODO: Implement migrations on local config tracker
+ tracker = new trackers.local.LocalConfigTracker(provider1)
+
+ signer1 = provider1.getSigner()
+ signer2 = provider2.getSigner()
+
+ networks = [
+ {
+ chainId: 31337,
+ name: 'hardhat',
+ provider: provider1,
+ rpcUrl: '',
+ relayer: new LocalRelayer(signer1),
+ nativeToken: {
+ symbol: 'ETH',
+ name: 'Ether',
+ decimals: 18
+ }
+ },
+ {
+ chainId: 31338,
+ name: 'hardhat2',
+ provider: provider2,
+ rpcUrl: 'http://127.0.0.1:7048',
+ relayer: new LocalRelayer(signer2),
+ nativeToken: {
+ symbol: 'ETH',
+ name: 'Ether',
+ decimals: 18
+ }
+ }
+ ]
+
+ const context1 = utils.context.deploySequenceContexts(signer1)
+ const context2 = utils.context.deploySequenceContexts(signer2)
+ expect(await context1).to.deep.equal(await context2)
+ contexts = await context1
+
+ defaultArgs = {
+ contexts,
+ networks,
+ tracker
+ }
+
+ defaultTx = {
+ to: await signer1.getAddress(),
+ value: 1
+ }
+ })
+
+ describe('New account', () => {
+ it('Should create a new account', async () => {
+ const signer = randomWallet('Should create a new account')
+ const config = {
+ threshold: 1,
+ checkpoint: Math.floor(now() / 1000),
+ signers: [{ address: signer.address, weight: 1 }]
+ }
+
+ const account = await Account.new({
+ ...defaultArgs,
+ config,
+ orchestrator: new Orchestrator([signer])
+ })
+
+ expect(account).to.be.instanceOf(Account)
+ expect(account.address).to.not.be.undefined
+
+ await getEth(account.address)
+ const tx = await account.sendTransaction([defaultTx], networks[0].chainId)
+ expect(tx).to.not.be.undefined
+
+ const status = await account.status(networks[0].chainId)
+ expect(status.fullyMigrated).to.be.true
+ expect(status.onChain.deployed).to.be.true
+ expect(status.onChain.version).to.equal(2)
+ })
+
+ it('Should create new nested accounts', async () => {
+ const { accountInner, accountOuter } = await createNestedAccount('create new nested accounts', false, false)
+
+ await getEth(accountOuter.address)
+ await accountOuter.sendTransaction([defaultTx], networks[0].chainId)
+
+ const statusOuter = await accountOuter.status(networks[0].chainId)
+
+ expect(statusOuter.fullyMigrated).to.be.true
+ expect(statusOuter.onChain.deployed).to.be.true
+ expect(statusOuter.onChain.version).to.equal(2)
+
+ const statusInner = await accountInner.status(networks[0].chainId)
+ expect(statusInner.fullyMigrated).to.be.true
+ expect(statusInner.onChain.deployed).to.be.true
+ expect(statusInner.onChain.version).to.equal(2)
+ })
+
+ it('Should send tx on nested accounts', async () => {
+ const { accountInner, accountOuter } = await createNestedAccount('sent tx on nested accounts', true, true)
+
+ await getEth(accountOuter.address)
+ await accountOuter.sendTransaction([defaultTx], networks[0].chainId)
+
+ const statusOuter = await accountOuter.status(networks[0].chainId)
+
+ expect(statusOuter.fullyMigrated).to.be.true
+ expect(statusOuter.onChain.deployed).to.be.true
+ expect(statusOuter.onChain.version).to.equal(2)
+
+ const statusInner = await accountInner.status(networks[0].chainId)
+ expect(statusInner.fullyMigrated).to.be.true
+ expect(statusInner.onChain.deployed).to.be.true
+ expect(statusInner.onChain.version).to.equal(2)
+ })
+
+ it('Should send transactions on multiple networks', async () => {
+ const signer = randomWallet('Should send transactions on multiple networks')
+ const config = {
+ threshold: 1,
+ checkpoint: Math.floor(now() / 1000),
+ signers: [{ address: signer.address, weight: 1 }]
+ }
+
+ const account = await Account.new({
+ ...defaultArgs,
+ config,
+ orchestrator: new Orchestrator([signer])
+ })
+
+ await getEth(account.address)
+ await account.sendTransaction([defaultTx], networks[0].chainId)
+ await account.sendTransaction([defaultTx], networks[1].chainId)
+
+ const status1 = await account.status(networks[0].chainId)
+ const status2 = await account.status(networks[1].chainId)
+
+ expect(status1.fullyMigrated).to.be.true
+ expect(status1.onChain.deployed).to.be.true
+ expect(status1.onChain.version).to.equal(2)
+
+ expect(status2.fullyMigrated).to.be.true
+ expect(status2.onChain.deployed).to.be.true
+ expect(status2.onChain.version).to.equal(2)
+ })
+
+ it('Should create a new account with many signers', async () => {
+ const signers = new Array(24).fill(0).map(() => randomWallet('Should create a new account with many signers'))
+ const config = {
+ threshold: 3,
+ checkpoint: Math.floor(now() / 1000),
+ signers: signers.map(signer => ({
+ address: signer.address,
+ weight: 1
+ }))
+ }
+
+ const rsigners = signers.sort(() => randomFraction('Should create a new account with many signers 2') - 0.5)
+ const account = await Account.new({
+ ...defaultArgs,
+ config,
+ orchestrator: new Orchestrator(rsigners.slice(0, 4))
+ })
+
+ await getEth(account.address)
+ await account.sendTransaction([defaultTx], networks[0].chainId)
+
+ const status = await account.status(networks[0].chainId)
+ expect(status.fullyMigrated).to.be.true
+ expect(status.onChain.deployed).to.be.true
+ expect(status.onChain.version).to.equal(2)
+ })
+
+ it('Should sign and validate a message', async () => {
+ const signer = randomWallet('Should sign and validate a message')
+ const config = {
+ threshold: 1,
+ checkpoint: Math.floor(now() / 1000),
+ signers: [{ address: signer.address, weight: 1 }]
+ }
+
+ const account = await Account.new({
+ ...defaultArgs,
+ config,
+ orchestrator: new Orchestrator([signer])
+ })
+
+ await account.doBootstrap(networks[0].chainId)
+
+ const msg = ethers.utils.toUtf8Bytes('Hello World')
+ const sig = await account.signMessage(msg, networks[0].chainId)
+
+ const valid = await commons.EIP1271.isValidEIP1271Signature(
+ account.address,
+ ethers.utils.keccak256(msg),
+ sig,
+ networks[0].provider!
+ )
+
+ expect(valid).to.be.true
+ })
+
+ it('Should sign and validate a message with nested account', async () => {
+ const { accountOuter } = await createNestedAccount('sign and validate nested')
+
+ const msg = ethers.utils.toUtf8Bytes('Hello World')
+ const sig = await accountOuter.signMessage(msg, networks[0].chainId)
+
+ const valid = await commons.EIP1271.isValidEIP1271Signature(
+ accountOuter.address,
+ ethers.utils.keccak256(msg),
+ sig,
+ networks[0].provider!
+ )
+
+ expect(valid).to.be.true
+ })
+
+ it('Should update account to new configuration', async () => {
+ const signer = randomWallet('Should update account to new configuration')
+ const simpleConfig1 = {
+ threshold: 1,
+ checkpoint: Math.floor(now() / 1000),
+ signers: [{ address: signer.address, weight: 1 }]
+ }
+ const config1 = v2.config.ConfigCoder.fromSimple(simpleConfig1)
+
+ const account = await Account.new({
+ ...defaultArgs,
+ config: simpleConfig1,
+ orchestrator: new Orchestrator([signer])
+ })
+
+ const signer2a = randomWallet('Should update account to new configuration 2')
+ const signer2b = randomWallet('Should update account to new configuration 3')
+
+ const simpleConfig2 = {
+ threshold: 4,
+ checkpoint: Math.floor(now() / 1000) + 1,
+ signers: [
+ {
+ address: signer2a.address,
+ weight: 2
+ },
+ {
+ address: signer2b.address,
+ weight: 2
+ }
+ ]
+ }
+
+ const config2 = v2.config.ConfigCoder.fromSimple(simpleConfig2)
+ await account.updateConfig(config2)
+
+ const status2 = await account.status(networks[0].chainId)
+ expect(status2.fullyMigrated).to.be.true
+ expect(status2.onChain.deployed).to.be.false
+ expect(status2.onChain.version).to.equal(2)
+ expect(status2.onChain.imageHash).to.deep.equal(v2.config.ConfigCoder.imageHashOf(config1))
+ expect(status2.imageHash).to.deep.equal(v2.config.ConfigCoder.imageHashOf(config2))
+ })
+
+ it('Should sign and validate a message without being deployed', async () => {
+ const signer = randomWallet('Should sign and validate a message without being deployed')
+ const config = {
+ threshold: 1,
+ checkpoint: Math.floor(now() / 1000),
+ signers: [{ address: signer.address, weight: 1 }]
+ }
+
+ const account = await Account.new({
+ ...defaultArgs,
+ config,
+ orchestrator: new Orchestrator([signer])
+ })
+
+ const msg = ethers.utils.toUtf8Bytes('Hello World')
+ const sig = await account.signMessage(msg, networks[0].chainId, 'eip6492')
+
+ const valid = await account.reader(networks[0].chainId).isValidSignature(account.address, ethers.utils.keccak256(msg), sig)
+
+ expect(valid).to.be.true
+ })
+
+ it('Should sign and validate a message without being deployed with nested account', async () => {
+ const { accountOuter } = await createNestedAccount('sign and validate nested undeployed', true, false)
+
+ const msg = ethers.utils.toUtf8Bytes('Hello World')
+ const sig = await accountOuter.signMessage(msg, networks[0].chainId, 'eip6492')
+
+ const valid = await accountOuter
+ .reader(networks[0].chainId)
+ .isValidSignature(accountOuter.address, ethers.utils.keccak256(msg), sig)
+
+ expect(valid).to.be.true
+ })
+
+ it('Should sign and validate a message with undeployed nested account and signer', async () => {
+ // Testing that an undeployed account doesn't error as other signer can satisfy threshold
+ const signerA = randomWallet('Nested account signer A')
+ const signerB = randomWallet('Nested account signer B')
+
+ const configInner = {
+ threshold: 1,
+ checkpoint: Math.floor(now() / 1000),
+ signers: [{ address: signerA.address, weight: 1 }]
+ }
+ const accountInner = await Account.new({
+ ...defaultArgs,
+ config: configInner,
+ orchestrator: new Orchestrator([signerA])
+ }) // Undeployed
+
+ const configOuter = {
+ threshold: 1,
+ checkpoint: Math.floor(now() / 1000),
+ signers: [
+ { address: accountInner.address, weight: 1 },
+ { address: signerB.address, weight: 1 }
+ ]
+ }
+ const accountOuter = await Account.new({
+ ...defaultArgs,
+ config: configOuter,
+ orchestrator: new Orchestrator([new AccountOrchestratorWrapper(accountInner), signerB])
+ })
+ await accountOuter.doBootstrap(networks[0].chainId)
+
+ const msg = ethers.utils.toUtf8Bytes('Hello World')
+ const sig = await accountOuter.signMessage(msg, networks[0].chainId)
+
+ const valid = await accountOuter
+ .reader(networks[0].chainId)
+ .isValidSignature(accountOuter.address, ethers.utils.keccak256(msg), sig)
+
+ expect(valid).to.be.true
+ })
+
+ it('Should refuse to sign when not deployed', async () => {
+ const signer = randomWallet('Should refuse to sign when not deployed')
+ const config = {
+ threshold: 1,
+ checkpoint: Math.floor(now() / 1000),
+ signers: [{ address: signer.address, weight: 1 }]
+ }
+
+ const account = await Account.new({
+ ...defaultArgs,
+ config,
+ orchestrator: new Orchestrator([signer])
+ })
+
+ const msg = ethers.utils.toUtf8Bytes('Hello World')
+ const sig = account.signMessage(msg, networks[0].chainId, 'throw')
+
+ expect(sig).to.be.rejected
+ })
+
+ it('Should refuse to sign when not deployed (nested)', async () => {
+ const { accountOuter } = await createNestedAccount('refuse to sign undeployed', false, false)
+
+ const msg = ethers.utils.toUtf8Bytes('Hello World')
+ const sig = accountOuter.signMessage(msg, networks[0].chainId, 'eip6492') // Note EIP-6492 throws when nested not deployed
+
+ expect(sig).to.be.rejected
+ })
+
+ describe('After upgrading', () => {
+ let account: Account
+
+ let signer1: ethers.Wallet
+ let signer2a: ethers.Wallet
+ let signer2b: ethers.Wallet
+ let signerIndex = 1
+
+ beforeEach(async () => {
+ signer1 = randomWallet(`After upgrading ${signerIndex++}`)
+ const simpleConfig1 = {
+ threshold: 1,
+ checkpoint: Math.floor(now() / 1000) + 1,
+ signers: [{ address: signer1.address, weight: 1 }]
+ }
+
+ account = await Account.new({
+ ...defaultArgs,
+ config: simpleConfig1,
+ orchestrator: new Orchestrator([signer1])
+ })
+ await getEth(account.address)
+
+ signer2a = randomWallet(`After upgrading ${signerIndex++}`)
+ signer2b = randomWallet(`After upgrading ${signerIndex++}`)
+
+ const simpleConfig2 = {
+ threshold: 4,
+ checkpoint: await account.status(0).then(s => ethers.BigNumber.from(s.checkpoint).add(1)),
+ signers: [
+ {
+ address: signer2a.address,
+ weight: 2
+ },
+ {
+ address: signer2b.address,
+ weight: 2
+ }
+ ]
+ }
+
+ const config2 = v2.config.ConfigCoder.fromSimple(simpleConfig2)
+ await account.updateConfig(config2)
+ account.setOrchestrator(new Orchestrator([signer2a, signer2b]))
+ })
+
+ it('Should send a transaction', async () => {
+ const tx = await account.sendTransaction([defaultTx], networks[0].chainId)
+ expect(tx).to.not.be.undefined
+
+ const status = await account.status(networks[0].chainId)
+ expect(status.fullyMigrated).to.be.true
+ expect(status.onChain.deployed).to.be.true
+ expect(status.onChain.imageHash).to.equal(status.imageHash)
+ })
+
+ it('Should send a transaction on nested account', async () => {
+ const configOuter = {
+ threshold: 1,
+ checkpoint: Math.floor(now() / 1000),
+ signers: [{ address: account.address, weight: 1 }]
+ }
+ const accountOuter = await Account.new({
+ ...defaultArgs,
+ config: configOuter,
+ orchestrator: new Orchestrator([new AccountOrchestratorWrapper(account)])
+ })
+
+ await accountOuter.doBootstrap(networks[0].chainId)
+
+ const tx = await accountOuter.sendTransaction([], networks[0].chainId)
+ expect(tx).to.not.be.undefined
+
+ const statusOuter = await accountOuter.status(networks[0].chainId)
+ expect(statusOuter.fullyMigrated).to.be.true
+ expect(statusOuter.onChain.deployed).to.be.true
+ expect(statusOuter.onChain.imageHash).to.equal(statusOuter.imageHash)
+
+ const status = await account.status(networks[0].chainId)
+ expect(status.fullyMigrated).to.be.true
+ expect(status.onChain.deployed).to.be.true
+ expect(status.onChain.imageHash).to.equal(status.imageHash)
+ })
+
+ it('Should send a transaction on undeployed nested account', async () => {
+ const configOuter = {
+ threshold: 1,
+ checkpoint: Math.floor(now() / 1000),
+ signers: [{ address: account.address, weight: 1 }]
+ }
+ const accountOuter = await Account.new({
+ ...defaultArgs,
+ config: configOuter,
+ orchestrator: new Orchestrator([new AccountOrchestratorWrapper(account)])
+ })
+
+ await getEth(accountOuter.address)
+ const tx = await accountOuter.sendTransaction([defaultTx], networks[0].chainId)
+ expect(tx).to.not.be.undefined
+
+ const status = await account.status(networks[0].chainId)
+ expect(status.fullyMigrated).to.be.true
+ expect(status.onChain.deployed).to.be.true
+ expect(status.onChain.imageHash).to.equal(status.imageHash)
+ })
+
+ it('Should sign a message', async () => {
+ const msg = ethers.utils.toUtf8Bytes('Hello World')
+ const sig = await account.signMessage(msg, networks[0].chainId)
+
+ const canOnchainValidate = await account.status(networks[0].chainId).then(s => s.canOnchainValidate)
+ expect(canOnchainValidate).to.be.false
+ await account.doBootstrap(networks[0].chainId)
+
+ const valid = await commons.EIP1271.isValidEIP1271Signature(
+ account.address,
+ ethers.utils.keccak256(msg),
+ sig,
+ networks[0].provider!
+ )
+
+ expect(valid).to.be.true
+ })
+
+ it('Should fail to use old signer', async () => {
+ account.setOrchestrator(new Orchestrator([signer1]))
+ const tx = account.sendTransaction([defaultTx], networks[0].chainId)
+ await expect(tx).to.be.rejected
+ })
+
+ it('Should send a transaction on a different network', async () => {
+ const tx = await account.sendTransaction([defaultTx], networks[1].chainId)
+ expect(tx).to.not.be.undefined
+
+ const status = await account.status(networks[1].chainId)
+ expect(status.fullyMigrated).to.be.true
+ expect(status.onChain.deployed).to.be.true
+ expect(status.onChain.imageHash).to.equal(status.imageHash)
+ })
+
+ describe('After reloading the account', () => {
+ beforeEach(async () => {
+ account = new Account({
+ ...defaultArgs,
+ address: account.address,
+ orchestrator: new Orchestrator([signer2a, signer2b])
+ })
+ await getEth(account.address)
+ })
+
+ it('Should send a transaction', async () => {
+ const tx = await account.sendTransaction([defaultTx], networks[0].chainId)
+ expect(tx).to.not.be.undefined
+
+ const status = await account.status(networks[0].chainId)
+ expect(status.fullyMigrated).to.be.true
+ expect(status.onChain.deployed).to.be.true
+ expect(status.onChain.imageHash).to.equal(status.imageHash)
+ })
+
+ it('Should sign a message', async () => {
+ const msg = ethers.utils.toUtf8Bytes('Hello World')
+ const sig = await account.signMessage(msg, networks[0].chainId)
+
+ const canOnchainValidate = await account.status(networks[0].chainId).then(s => s.canOnchainValidate)
+ expect(canOnchainValidate).to.be.false
+ await account.doBootstrap(networks[0].chainId)
+
+ const valid = await commons.EIP1271.isValidEIP1271Signature(
+ account.address,
+ ethers.utils.keccak256(msg),
+ sig,
+ networks[0].provider!
+ )
+
+ expect(valid).to.be.true
+ })
+ })
+
+ describe('After updating the config again', () => {
+ let signer3a: ethers.Wallet
+ let signer3b: ethers.Wallet
+ let signer3c: ethers.Wallet
+ let signerIndex = 1
+
+ let config3: v2.config.WalletConfig
+
+ beforeEach(async () => {
+ signer3a = randomWallet(`After updating the config again ${signerIndex++}`)
+ signer3b = randomWallet(`After updating the config again ${signerIndex++}`)
+ signer3c = randomWallet(`After updating the config again ${signerIndex++}`)
+
+ const simpleConfig3 = {
+ threshold: 5,
+ checkpoint: await account.status(0).then(s => ethers.BigNumber.from(s.checkpoint).add(1)),
+ signers: [
+ {
+ address: signer3a.address,
+ weight: 2
+ },
+ {
+ address: signer3b.address,
+ weight: 2
+ },
+ {
+ address: signer3c.address,
+ weight: 1
+ }
+ ]
+ }
+
+ config3 = v2.config.ConfigCoder.fromSimple(simpleConfig3)
+
+ await account.updateConfig(config3)
+ account.setOrchestrator(new Orchestrator([signer3a, signer3b, signer3c]))
+ })
+
+ it('Should update account status', async () => {
+ const status = await account.status(networks[0].chainId)
+ expect(status.fullyMigrated).to.be.true
+ expect(status.onChain.deployed).to.be.false
+ expect(status.imageHash).to.equal(v2.config.ConfigCoder.imageHashOf(config3))
+ expect(status.presignedConfigurations.length).to.equal(2)
+ })
+
+ it('Should send a transaction', async () => {
+ const tx = await account.sendTransaction([defaultTx], networks[0].chainId)
+ expect(tx).to.not.be.undefined
+
+ const status = await account.status(networks[0].chainId)
+ expect(status.fullyMigrated).to.be.true
+ expect(status.onChain.deployed).to.be.true
+ expect(status.onChain.imageHash).to.equal(status.imageHash)
+ })
+
+ it('Should sign a message', async () => {
+ const msg = ethers.utils.toUtf8Bytes('Hello World')
+ const sig = await account.signMessage(msg, networks[0].chainId)
+
+ const canOnchainValidate = await account.status(networks[0].chainId).then(s => s.canOnchainValidate)
+ expect(canOnchainValidate).to.be.false
+ await account.doBootstrap(networks[0].chainId)
+
+ const status = await account.status(networks[0].chainId)
+ expect(status.onChain.imageHash).to.not.equal(status.imageHash)
+
+ const valid = await commons.EIP1271.isValidEIP1271Signature(
+ account.address,
+ ethers.utils.keccak256(msg),
+ sig,
+ networks[0].provider!
+ )
+
+ expect(valid).to.be.true
+ })
+ })
+
+ describe('After sending a transaction', () => {
+ beforeEach(async () => {
+ await account.sendTransaction([defaultTx], networks[0].chainId)
+ })
+
+ it('Should send a transaction in a different network', async () => {
+ const tx = await account.sendTransaction([defaultTx], networks[1].chainId)
+ expect(tx).to.not.be.undefined
+
+ const status = await account.status(networks[1].chainId)
+ expect(status.fullyMigrated).to.be.true
+ expect(status.onChain.deployed).to.be.true
+ expect(status.onChain.imageHash).to.equal(status.imageHash)
+ })
+
+ it('Should send a second transaction', async () => {
+ const tx = await account.sendTransaction([defaultTx], networks[0].chainId)
+ expect(tx).to.not.be.undefined
+ })
+
+ let signerIndex = 1
+ it('Should update the configuration again', async () => {
+ const signer2a = randomWallet(`Should update the configuration again ${signerIndex++}`)
+ const signer2b = randomWallet(`Should update the configuration again ${signerIndex++}`)
+ const signer2c = randomWallet(`Should update the configuration again ${signerIndex++}`)
+
+ const simpleConfig2 = {
+ threshold: 6,
+ checkpoint: await account.status(0).then(s => ethers.BigNumber.from(s.checkpoint).add(1)),
+ signers: [
+ {
+ address: signer2a.address,
+ weight: 3
+ },
+ {
+ address: signer2b.address,
+ weight: 3
+ },
+ {
+ address: signer2c.address,
+ weight: 3
+ }
+ ]
+ }
+
+ const ogOnchainImageHash = await account.status(0).then(s => s.onChain.imageHash)
+ const imageHash1 = await account.status(0).then(s => s.imageHash)
+
+ const config2 = v2.config.ConfigCoder.fromSimple(simpleConfig2)
+ await account.updateConfig(config2)
+
+ const status1 = await account.status(networks[0].chainId)
+ const status2 = await account.status(networks[1].chainId)
+
+ expect(status1.fullyMigrated).to.be.true
+ expect(status1.onChain.deployed).to.be.true
+ expect(status1.onChain.imageHash).to.equal(imageHash1)
+ expect(status1.imageHash).to.equal(v2.config.ConfigCoder.imageHashOf(config2))
+ expect(status1.presignedConfigurations.length).to.equal(1)
+
+ expect(status2.fullyMigrated).to.be.true
+ expect(status2.onChain.deployed).to.be.false
+ expect(status2.onChain.imageHash).to.equal(ogOnchainImageHash)
+ expect(status2.imageHash).to.equal(v2.config.ConfigCoder.imageHashOf(config2))
+ expect(status2.presignedConfigurations.length).to.equal(2)
+ })
+ })
+ })
+ })
+
+ describe('Migrated wallet', () => {
+ it('Should migrate undeployed account', async () => {
+ // Old account may be an address that's not even deployed
+ const signer1 = randomWallet('Should migrate undeployed account')
+
+ const simpleConfig = {
+ threshold: 1,
+ checkpoint: 0,
+ signers: [
+ {
+ address: signer1.address,
+ weight: 1
+ }
+ ]
+ }
+
+ const config = v1.config.ConfigCoder.fromSimple(simpleConfig)
+ const configv2 = v2.config.ConfigCoder.fromSimple(simpleConfig)
+
+ const imageHash = v1.config.ConfigCoder.imageHashOf(config)
+ const address = commons.context.addressOf(contexts[1], imageHash)
+
+ // Sessions server MUST have information about the old wallet
+ // in production this is retrieved from SequenceUtils contract
+ await tracker.saveCounterfactualWallet({ config, context: [contexts[1]] })
+
+ // Importing the account should work!
+ const account = new Account({ ...defaultArgs, address, orchestrator: new Orchestrator([signer1]) })
+
+ const status = await account.status(0)
+ expect(status.fullyMigrated).to.be.false
+ expect(status.onChain.deployed).to.be.false
+ expect(status.onChain.imageHash).to.equal(imageHash)
+ expect(status.imageHash).to.equal(imageHash)
+ expect(status.version).to.equal(1)
+
+ // Sending a transaction should fail (not fully migrated)
+ await getEth(account.address)
+ await expect(account.sendTransaction([defaultTx], networks[0].chainId)).to.be.rejected
+
+ // Should sign migration using the account
+ await account.signAllMigrations(c => c)
+
+ const status2 = await account.status(networks[0].chainId)
+ expect(status2.fullyMigrated).to.be.true
+ expect(status2.onChain.deployed).to.be.false
+ expect(status2.onChain.imageHash).to.equal(imageHash)
+ expect(status2.onChain.version).to.equal(1)
+ expect(status2.imageHash).to.equal(v2.config.ConfigCoder.imageHashOf(configv2))
+ expect(status2.version).to.equal(2)
+
+ // Send a transaction
+ const tx = await account.sendTransaction([defaultTx], networks[0].chainId)
+ expect(tx).to.not.be.undefined
+
+ const status3 = await account.status(networks[0].chainId)
+ expect(status3.fullyMigrated).to.be.true
+ expect(status3.onChain.deployed).to.be.true
+ expect(status3.onChain.imageHash).to.equal(v2.config.ConfigCoder.imageHashOf(configv2))
+ expect(status3.onChain.version).to.equal(2)
+ expect(status3.imageHash).to.equal(v2.config.ConfigCoder.imageHashOf(configv2))
+ expect(status3.version).to.equal(2)
+
+ // Send another transaction on another chain
+ const tx2 = await account.sendTransaction([defaultTx], networks[1].chainId)
+ expect(tx2).to.not.be.undefined
+
+ const status4 = await account.status(networks[1].chainId)
+ expect(status4.fullyMigrated).to.be.true
+ expect(status4.onChain.deployed).to.be.true
+ expect(status4.onChain.imageHash).to.equal(v2.config.ConfigCoder.imageHashOf(configv2))
+ expect(status4.onChain.version).to.equal(2)
+ expect(status4.imageHash).to.equal(v2.config.ConfigCoder.imageHashOf(configv2))
+ expect(status4.version).to.equal(2)
+ })
+
+ it('Should migrate a half-deployed account', async () => {
+ // Old account created with 3 signers, and already deployed
+ // in one of the chains
+ const signer1 = randomWallet('Should migrate a half-deployed account')
+ const signer2 = randomWallet('Should migrate a half-deployed account 2')
+ const signer3 = randomWallet('Should migrate a half-deployed account 3')
+
+ const simpleConfig = {
+ threshold: 2,
+ checkpoint: 0,
+ signers: [
+ {
+ address: signer1.address,
+ weight: 1
+ },
+ {
+ address: signer2.address,
+ weight: 1
+ },
+ {
+ address: signer3.address,
+ weight: 1
+ }
+ ]
+ }
+
+ const config = v1.config.ConfigCoder.fromSimple(simpleConfig)
+ const imageHash = v1.config.ConfigCoder.imageHashOf(config)
+ const address = commons.context.addressOf(contexts[1], imageHash)
+
+ // Deploy the wallet on network 0
+ const deployTx = Wallet.buildDeployTransaction(contexts[1], imageHash)
+ await (networks[0].relayer! as Relayer).relay({
+ ...deployTx,
+ chainId: networks[0].chainId,
+ intent: {
+ id: '0x00',
+ wallet: address
+ }
+ })
+
+ // Feed all information to sequence-sessions
+ // (on prod this would be imported from SequenceUtils)
+ await tracker.saveCounterfactualWallet({ config, context: Object.values(contexts) })
+
+ // Importing the account should work!
+ const account = new Account({
+ ...defaultArgs,
+ address,
+ orchestrator: new Orchestrator([signer1, signer3])
+ })
+
+ // Status on network 0 should be deployed, network 1 not
+ // both should not be migrated, and use the original imageHash
+ const status1 = await account.status(networks[0].chainId)
+ expect(status1.fullyMigrated).to.be.false
+ expect(status1.onChain.deployed).to.be.true
+ expect(status1.onChain.imageHash).to.equal(imageHash)
+ expect(status1.onChain.version).to.equal(1)
+ expect(status1.imageHash).to.equal(imageHash)
+ expect(status1.version).to.equal(1)
+
+ const status2 = await account.status(networks[1].chainId)
+ expect(status2.fullyMigrated).to.be.false
+ expect(status2.onChain.deployed).to.be.false
+ expect(status2.onChain.imageHash).to.equal(imageHash)
+ expect(status2.onChain.version).to.equal(1)
+ expect(status2.imageHash).to.equal(imageHash)
+ expect(status2.version).to.equal(1)
+
+ // Signing transactions (on both networks) and signing messages should fail
+ await getEth(account.address)
+ await expect(account.sendTransaction([defaultTx], networks[0].chainId)).to.be.rejected
+ await expect(account.sendTransaction([defaultTx], networks[1].chainId)).to.be.rejected
+ await expect(account.signMessage('0x00', networks[0].chainId)).to.be.rejected
+ await expect(account.signMessage('0x00', networks[1].chainId)).to.be.rejected
+
+ await account.signAllMigrations(c => c)
+
+ // Sign a transaction on network 0 and network 1, both should work
+ // and should take the wallet on-chain up to speed
+ const configv2 = v2.config.ConfigCoder.fromSimple(simpleConfig)
+
+ const tx1 = await account.sendTransaction([defaultTx], networks[0].chainId)
+ expect(tx1).to.not.be.undefined
+
+ const status1b = await account.status(networks[0].chainId)
+ expect(status1b.fullyMigrated).to.be.true
+ expect(status1b.onChain.deployed).to.be.true
+ expect(status1b.onChain.imageHash).to.equal(v2.config.ConfigCoder.imageHashOf(configv2))
+ expect(status1b.onChain.version).to.equal(2)
+ expect(status1b.imageHash).to.equal(v2.config.ConfigCoder.imageHashOf(configv2))
+ expect(status1b.version).to.equal(2)
+
+ const tx2 = await account.sendTransaction([defaultTx], networks[1].chainId)
+ expect(tx2).to.not.be.undefined
+
+ const status2b = await account.status(networks[1].chainId)
+ expect(status2b).to.be.deep.equal(status1b)
+ })
+
+ it('Should migrate an upgraded wallet', async () => {
+ const signer1 = randomWallet('Should migrate an upgraded wallet')
+ const signer2 = randomWallet('Should migrate an upgraded wallet 2')
+ const signer3 = randomWallet('Should migrate an upgraded wallet 3')
+ const signer4 = randomWallet('Should migrate an upgraded wallet 4')
+
+ const simpleConfig1a = {
+ threshold: 3,
+ checkpoint: 0,
+ signers: [
+ {
+ address: signer1.address,
+ weight: 2
+ },
+ {
+ address: signer2.address,
+ weight: 2
+ },
+ {
+ address: signer3.address,
+ weight: 2
+ }
+ ]
+ }
+
+ const config1a = v1.config.ConfigCoder.fromSimple(simpleConfig1a)
+ const imageHash1a = v1.config.ConfigCoder.imageHashOf(config1a)
+ const address = commons.context.addressOf(contexts[1], imageHash1a)
+
+ const simpleConfig1b = {
+ threshold: 3,
+ checkpoint: 0,
+ signers: [
+ {
+ address: signer1.address,
+ weight: 2
+ },
+ {
+ address: signer2.address,
+ weight: 2
+ },
+ {
+ address: signer4.address,
+ weight: 2
+ }
+ ]
+ }
+
+ const config1b = v1.config.ConfigCoder.fromSimple(simpleConfig1b)
+ const imageHash1b = v1.config.ConfigCoder.imageHashOf(config1b)
+
+ // Update wallet to config 1b (on network 0)
+ const wallet = new Wallet({
+ coders: {
+ signature: v1.signature.SignatureCoder,
+ config: v1.config.ConfigCoder
+ },
+ context: contexts[1],
+ config: config1a,
+ chainId: networks[0].chainId,
+ address,
+ orchestrator: new Orchestrator([signer1, signer3]),
+ relayer: (networks[0].relayer as Relayer)!,
+ provider: networks[0].provider!
+ })
+
+ const utx = await wallet.buildUpdateConfigurationTransaction(config1b)
+ const signed = await wallet.signTransactionBundle(utx)
+ const decorated = await wallet.decorateTransactions(signed)
+ await (networks[0].relayer as Relayer).relay(decorated)
+
+ // Importing the account should work!
+ const account = new Account({
+ ...defaultArgs,
+ address,
+ orchestrator: new Orchestrator([signer1, signer3])
+ })
+
+ // Feed the tracker with all the data
+ await tracker.saveCounterfactualWallet({ config: config1a, context: [contexts[1]] })
+ await tracker.saveWalletConfig({ config: config1b })
+
+ // Status on network 0 should be deployed, network 1 not
+ // and the configuration on network 0 should be the B one
+ const status1 = await account.status(networks[0].chainId)
+ expect(status1.fullyMigrated).to.be.false
+ expect(status1.onChain.deployed).to.be.true
+ expect(status1.onChain.imageHash).to.equal(imageHash1b)
+ expect(status1.onChain.version).to.equal(1)
+ expect(status1.imageHash).to.equal(imageHash1b)
+
+ const status2 = await account.status(networks[1].chainId)
+ expect(status2.fullyMigrated).to.be.false
+ expect(status2.onChain.deployed).to.be.false
+ expect(status2.onChain.imageHash).to.equal(imageHash1a)
+ expect(status2.onChain.version).to.equal(1)
+ expect(status2.imageHash).to.equal(imageHash1a)
+
+ // Signing transactions (on both networks) and signing messages should fail
+ await getEth(account.address)
+ await expect(account.sendTransaction([defaultTx], networks[0].chainId)).to.be.rejected
+ await expect(account.sendTransaction([defaultTx], networks[1].chainId)).to.be.rejected
+ await expect(account.signMessage('0x00', networks[0].chainId)).to.be.rejected
+ await expect(account.signMessage('0x00', networks[1].chainId)).to.be.rejected
+
+ // Sign all migrations should only have signers1 and 2
+ // so the migration should only be available on network 1 (the one not updated)
+ await account.signAllMigrations(c => c)
+
+ const config2a = v2.config.ConfigCoder.fromSimple(simpleConfig1a)
+ const config2b = v2.config.ConfigCoder.fromSimple(simpleConfig1b)
+ const imageHash2a = v2.config.ConfigCoder.imageHashOf(config2a)
+
+ const status1b = await account.status(networks[0].chainId)
+ expect(status1b.fullyMigrated).to.be.false
+ expect(status1b.onChain.deployed).to.be.true
+ expect(status1b.onChain.imageHash).to.equal(imageHash1b)
+ expect(status1b.onChain.version).to.equal(1)
+ expect(status1b.imageHash).to.equal(imageHash1b)
+ expect(status1b.version).to.equal(1)
+
+ const status2b = await account.status(networks[1].chainId)
+ expect(status2b.fullyMigrated).to.be.true
+ expect(status2b.onChain.deployed).to.be.false
+ expect(status2b.onChain.imageHash).to.equal(imageHash1a)
+ expect(status2b.onChain.version).to.equal(1)
+ expect(status2b.imageHash).to.equal(imageHash2a)
+ expect(status2b.version).to.equal(2)
+
+ // Sending a transaction should work for network 1
+ // but fail for network 0, same with signing messages
+ await expect(account.sendTransaction([defaultTx], networks[0].chainId)).to.be.rejected
+ await expect(account.sendTransaction([defaultTx], networks[1].chainId)).to.be.fulfilled
+
+ await expect(account.signMessage('0x00', networks[0].chainId)).to.be.rejected
+ await expect(account.signMessage('0x00', networks[1].chainId)).to.be.fulfilled
+
+ // Signing another migration with signers1 and 2 should put both in sync
+ account.setOrchestrator(new Orchestrator([signer1, signer2]))
+ await account.signAllMigrations(c => c)
+
+ await expect(account.sendTransaction([defaultTx], networks[0].chainId)).to.be.fulfilled
+ await expect(account.sendTransaction([defaultTx], networks[1].chainId)).to.be.fulfilled
+
+ await expect(account.signMessage('0x00', networks[0].chainId)).to.be.fulfilled
+ await expect(account.signMessage('0x00', networks[1].chainId)).to.be.fulfilled
+
+ const status1c = await account.status(networks[0].chainId)
+ const status2c = await account.status(networks[1].chainId)
+
+ expect(status1c.fullyMigrated).to.be.true
+ expect(status2c.fullyMigrated).to.be.true
+
+ // Configs are still different!
+ expect(status1c.imageHash).to.not.equal(status2c.imageHash)
+
+ const simpleConfig4 = {
+ threshold: 2,
+ checkpoint: 1,
+ signers: [
+ {
+ address: signer1.address,
+ weight: 1
+ },
+ {
+ address: signer2.address,
+ weight: 1
+ },
+ {
+ address: signer4.address,
+ weight: 1
+ }
+ ]
+ }
+
+ const config4 = v2.config.ConfigCoder.fromSimple(simpleConfig4)
+
+ await account.updateConfig(config4)
+
+ const status1d = await account.status(networks[0].chainId)
+ const status2d = await account.status(networks[1].chainId)
+
+ // Configs are now the same!
+ expect(status1d.imageHash).to.be.equal(status2d.imageHash)
+ })
+
+ it('Should edit the configuration during the migration', async () => {
+ // Old account may be an address that's not even deployed
+ const signer1 = randomWallet('Should edit the configuration during the migration')
+ const signer2 = randomWallet('Should edit the configuration during the migration 2')
+
+ const simpleConfig1 = {
+ threshold: 1,
+ checkpoint: 0,
+ signers: [
+ {
+ address: signer1.address,
+ weight: 1
+ }
+ ]
+ }
+
+ const simpleConfig2 = {
+ threshold: 1,
+ checkpoint: 0,
+ signers: [
+ {
+ address: signer2.address,
+ weight: 1
+ }
+ ]
+ }
+
+ const config = v1.config.ConfigCoder.fromSimple(simpleConfig1)
+ const configv2 = v2.config.ConfigCoder.fromSimple(simpleConfig2)
+
+ const imageHash = v1.config.ConfigCoder.imageHashOf(config)
+ const address = commons.context.addressOf(contexts[1], imageHash)
+
+ // Sessions server MUST have information about the old wallet
+ // in production this is retrieved from SequenceUtils contract
+ await tracker.saveCounterfactualWallet({ config, context: [contexts[1]] })
+
+ // Importing the account should work!
+ const orchestrator = new Orchestrator([signer1])
+ const account = new Account({ ...defaultArgs, address, orchestrator: orchestrator })
+
+ const status = await account.status(0)
+ expect(status.fullyMigrated).to.be.false
+ expect(status.onChain.deployed).to.be.false
+ expect(status.onChain.imageHash).to.equal(imageHash)
+ expect(status.imageHash).to.equal(imageHash)
+ expect(status.version).to.equal(1)
+
+ // Sending a transaction should fail (not fully migrated)
+ await getEth(account.address)
+ await expect(account.sendTransaction([defaultTx], networks[0].chainId)).to.be.rejected
+
+ // Should sign migration using the account
+ await account.signAllMigrations(c => {
+ expect(v1.config.ConfigCoder.imageHashOf(c as any)).to.equal(v1.config.ConfigCoder.imageHashOf(config))
+ return configv2
+ })
+
+ const status2 = await account.status(networks[0].chainId)
+ expect(status2.fullyMigrated).to.be.true
+ expect(status2.onChain.deployed).to.be.false
+ expect(status2.onChain.imageHash).to.equal(imageHash)
+ expect(status2.onChain.version).to.equal(1)
+ expect(status2.imageHash).to.equal(v2.config.ConfigCoder.imageHashOf(configv2))
+ expect(status2.version).to.equal(2)
+
+ // Send a transaction
+ orchestrator.setSigners([signer2])
+ const tx = await account.sendTransaction([defaultTx], networks[0].chainId)
+ expect(tx).to.not.be.undefined
+
+ const status3 = await account.status(networks[0].chainId)
+ expect(status3.fullyMigrated).to.be.true
+ expect(status3.onChain.deployed).to.be.true
+ expect(status3.onChain.imageHash).to.equal(v2.config.ConfigCoder.imageHashOf(configv2))
+ expect(status3.onChain.version).to.equal(2)
+ expect(status3.imageHash).to.equal(v2.config.ConfigCoder.imageHashOf(configv2))
+ expect(status3.version).to.equal(2)
+
+ // Send another transaction on another chain
+ const tx2 = await account.sendTransaction([defaultTx], networks[1].chainId)
+ expect(tx2).to.not.be.undefined
+
+ const status4 = await account.status(networks[1].chainId)
+ expect(status4.fullyMigrated).to.be.true
+ expect(status4.onChain.deployed).to.be.true
+ expect(status4.onChain.imageHash).to.equal(v2.config.ConfigCoder.imageHashOf(configv2))
+ expect(status4.onChain.version).to.equal(2)
+ expect(status4.imageHash).to.equal(v2.config.ConfigCoder.imageHashOf(configv2))
+ expect(status4.version).to.equal(2)
+ })
+
+ context('Signing messages', async () => {
+ context('After migrating', async () => {
+ let account: Account
+ let imageHash: string
+
+ beforeEach(async () => {
+ // Old account may be an address that's not even deployed
+ const signer1 = randomWallet(
+ 'Signing messages - After migrating' + account?.address ?? '' // Append prev address to entropy to avoid collisions
+ )
+
+ const simpleConfig = {
+ threshold: 1,
+ checkpoint: 0,
+ signers: [
+ {
+ address: signer1.address,
+ weight: 1
+ }
+ ]
+ }
+
+ const config = v1.config.ConfigCoder.fromSimple(simpleConfig)
+ imageHash = v1.config.ConfigCoder.imageHashOf(config)
+ const address = commons.context.addressOf(contexts[1], imageHash)
+
+ // Sessions server MUST have information about the old wallet
+ // in production this is retrieved from SequenceUtils contract
+ await tracker.saveCounterfactualWallet({ config, context: [contexts[1]] })
+
+ account = new Account({ ...defaultArgs, address, orchestrator: new Orchestrator([signer1]) })
+
+ // Should sign migration using the account
+ await account.signAllMigrations(c => c)
+ })
+
+ it('Should validate a message signed by undeployed migrated wallet', async () => {
+ const msg = ethers.utils.toUtf8Bytes('I like that you are reading our tests')
+ const sig = await account.signMessage(msg, networks[0].chainId, 'eip6492')
+
+ const valid = await account
+ .reader(networks[0].chainId)
+ .isValidSignature(account.address, ethers.utils.keccak256(msg), sig)
+
+ expect(valid).to.be.true
+ })
+
+ it('Should reject a message signed by undeployed migrated wallet (if set the throw)', async () => {
+ const msg = ethers.utils.toUtf8Bytes('I do not know what to write here anymore')
+ const sig = account.signMessage(msg, networks[0].chainId, 'throw')
+
+ await expect(sig).to.be.rejected
+ })
+
+ it('Should return an invalid signature by undeployed migrated wallet (if set to ignore)', async () => {
+ const msg = ethers.utils.toUtf8Bytes('Sending a hug')
+ const sig = await account.signMessage(msg, networks[0].chainId, 'ignore')
+
+ const valid = await account
+ .reader(networks[0].chainId)
+ .isValidSignature(account.address, ethers.utils.keccak256(msg), sig)
+
+ expect(valid).to.be.false
+ })
+
+ it('Should validate a message signed by deployed migrated wallet (deployed with v1)', async () => {
+ const deployTx = Wallet.buildDeployTransaction(contexts[1], imageHash)
+ await signer1.sendTransaction({
+ to: deployTx.entrypoint,
+ data: commons.transaction.encodeBundleExecData(deployTx)
+ })
+
+ expect(await networks[0].provider!.getCode(account.address).then(c => ethers.utils.arrayify(c).length)).to.not.equal(0)
+
+ const msg = ethers.utils.toUtf8Bytes('Everything seems to be working fine so far')
+ const sig = await account.signMessage(msg, networks[0].chainId, 'eip6492')
+
+ const valid = await account
+ .reader(networks[0].chainId)
+ .isValidSignature(account.address, ethers.utils.keccak256(msg), sig)
+
+ expect(valid).to.be.true
+ })
+
+ it('Should fail to sign a message signed by deployed migrated wallet (deployed with v1) if throw', async () => {
+ const deployTx = Wallet.buildDeployTransaction(contexts[1], imageHash)
+ await signer1.sendTransaction({
+ to: deployTx.entrypoint,
+ data: commons.transaction.encodeBundleExecData(deployTx)
+ })
+
+ expect(await networks[0].provider!.getCode(account.address).then(c => ethers.utils.arrayify(c).length)).to.not.equal(0)
+
+ const msg = ethers.utils.toUtf8Bytes('Everything seems to be working fine so far')
+ const sig = account.signMessage(msg, networks[0].chainId, 'throw')
+ expect(sig).to.be.rejected
+ })
+
+ it('Should return an invalid signature by deployed migrated wallet (deployed with v1) if ignore', async () => {
+ const deployTx = Wallet.buildDeployTransaction(contexts[1], imageHash)
+ await signer1.sendTransaction({
+ to: deployTx.entrypoint,
+ data: commons.transaction.encodeBundleExecData(deployTx)
+ })
+
+ expect(await networks[0].provider!.getCode(account.address).then(c => ethers.utils.arrayify(c).length)).to.not.equal(0)
+
+ const msg = ethers.utils.toUtf8Bytes('Everything seems to be working fine so far')
+ const sig = await account.signMessage(msg, networks[0].chainId, 'ignore')
+ const valid = await account
+ .reader(networks[0].chainId)
+ .isValidSignature(account.address, ethers.utils.keccak256(msg), sig)
+
+ expect(valid).to.be.false
+ })
+ })
+ })
+ })
+
+ describe('Nonce selection', async () => {
+ let signer: ethers.Wallet
+ let account: Account
+
+ let getNonce: (response: ethers.providers.TransactionResponse) => { space: ethers.BigNumber; nonce: ethers.BigNumber }
+
+ before(async () => {
+ const mainModule = new ethers.utils.Interface(walletContracts.mainModule.abi)
+
+ getNonce = ({ data }) => {
+ const [_, encoded] = mainModule.decodeFunctionData('execute', data)
+ const [space, nonce] = commons.transaction.decodeNonce(encoded)
+ return { space, nonce }
+ }
+
+ signer = randomWallet('Nonce selection')
+
+ const config = {
+ threshold: 1,
+ checkpoint: Math.floor(now() / 1000),
+ signers: [{ address: signer.address, weight: 1 }]
+ }
+
+ account = await Account.new({
+ ...defaultArgs,
+ config,
+ orchestrator: new Orchestrator([signer])
+ })
+
+ // use a deployed account, otherwise we end up testing the decorated bundle nonce
+ const response = await account.sendTransaction([], networks[0].chainId)
+ await response?.wait()
+
+ await getEth(account.address, signer1)
+ await getEth(account.address, signer2)
+ })
+
+ it('Should use explicitly set nonces', async () => {
+ let response = await account.sendTransaction(
+ { to: await signer1.getAddress(), value: 1 },
+ networks[0].chainId,
+ undefined,
+ undefined,
+ undefined,
+ { nonceSpace: 6492 }
+ )
+ if (!response) {
+ throw new Error('expected response')
+ }
+
+ let { space, nonce } = getNonce(response)
+
+ expect(space.eq(6492)).to.be.true
+ expect(nonce.eq(0)).to.be.true
+
+ await response.wait()
+
+ response = await account.sendTransaction(
+ { to: await signer1.getAddress(), value: 1 },
+ networks[0].chainId,
+ undefined,
+ undefined,
+ undefined,
+ { nonceSpace: 6492 }
+ )
+ if (!response) {
+ throw new Error('expected response')
+ }
+
+ const encoded = getNonce(response)
+ space = encoded.space
+ nonce = encoded.nonce
+
+ expect(space.eq(6492)).to.be.true
+ expect(nonce.eq(1)).to.be.true
+ })
+
+ it('Should select random nonces by default', async () => {
+ let response = await account.sendTransaction({ to: await signer1.getAddress(), value: 1 }, networks[0].chainId)
+ if (!response) {
+ throw new Error('expected response')
+ }
+
+ const { space: firstSpace, nonce: firstNonce } = getNonce(response)
+
+ expect(firstSpace.eq(0)).to.be.false
+ expect(firstNonce.eq(0)).to.be.true
+
+ // not necessary, parallel execution is ok:
+ // await response.wait()
+
+ response = await account.sendTransaction({ to: await signer1.getAddress(), value: 1 }, networks[0].chainId)
+ if (!response) {
+ throw new Error('expected response')
+ }
+
+ const { space: secondSpace, nonce: secondNonce } = getNonce(response)
+
+ expect(secondSpace.eq(0)).to.be.false
+ expect(secondNonce.eq(0)).to.be.true
+
+ expect(secondSpace.eq(firstSpace)).to.be.false
+ })
+
+ it('Should respect the serial option', async () => {
+ let response = await account.sendTransaction(
+ { to: await signer1.getAddress(), value: 1 },
+ networks[0].chainId,
+ undefined,
+ undefined,
+ undefined,
+ { serial: true }
+ )
+ if (!response) {
+ throw new Error('expected response')
+ }
+
+ let { space, nonce } = getNonce(response)
+
+ expect(space.eq(0)).to.be.true
+ expect(nonce.eq(0)).to.be.true
+
+ await response.wait()
+
+ response = await account.sendTransaction(
+ { to: await signer1.getAddress(), value: 1 },
+ networks[0].chainId,
+ undefined,
+ undefined,
+ undefined,
+ { serial: true }
+ )
+ if (!response) {
+ throw new Error('expected response')
+ }
+
+ const encoded = getNonce(response)
+ space = encoded.space
+ nonce = encoded.nonce
+
+ expect(space.eq(0)).to.be.true
+ expect(nonce.eq(1)).to.be.true
+ })
+ })
+})
+
+let nowCalls = 0
+export function now(): number {
+ if (deterministic) {
+ return Date.parse('2023-02-14T00:00:00.000Z') + 1000 * nowCalls++
+ } else {
+ return Date.now()
+ }
+}
+
+export function randomWallet(entropy: number | string): ethers.Wallet {
+ return new ethers.Wallet(randomBytes(32, entropy))
+}
+
+export function randomFraction(entropy: number | string): number {
+ const bytes = randomBytes(7, entropy)
+ bytes[0] &= 0x1f
+ return bytes.reduce((sum, byte) => 256 * sum + byte) / Number.MAX_SAFE_INTEGER
+}
+
+export function randomBytes(length: number, entropy: number | string): Uint8Array {
+ if (deterministic) {
+ let bytes = ''
+ while (bytes.length < 2 * length) {
+ bytes += ethers.utils.id(`${bytes}${entropy}`).slice(2)
+ }
+ return ethers.utils.arrayify(`0x${bytes.slice(0, 2 * length)}`)
+ } else {
+ return ethers.utils.randomBytes(length)
+ }
+}
diff --git a/packages/account/tests/signer.spec.ts b/packages/account/tests/signer.spec.ts
new file mode 100644
index 0000000000..cdc8aede44
--- /dev/null
+++ b/packages/account/tests/signer.spec.ts
@@ -0,0 +1,896 @@
+import { commons, v1, v2 } from '@0xsequence/core'
+import { migrator } from '@0xsequence/migration'
+import { NetworkConfig } from '@0xsequence/network'
+import { FeeOption, FeeQuote, LocalRelayer, LocalRelayerOptions, Relayer, proto } from '@0xsequence/relayer'
+import { tracker, trackers } from '@0xsequence/sessions'
+import { Orchestrator } from '@0xsequence/signhub'
+import * as utils from '@0xsequence/tests'
+import { Wallet } from '@0xsequence/wallet'
+import * as chai from 'chai'
+import chaiAsPromised from 'chai-as-promised'
+import { ethers } from 'ethers'
+import hardhat from 'hardhat'
+
+import { Account } from '../src/account'
+import { now, randomWallet } from './account.spec'
+import { createERC20 } from '@0xsequence/tests/src/tokens/erc20'
+
+const { expect } = chai.use(chaiAsPromised)
+
+describe('Account signer', () => {
+ let provider1: ethers.providers.JsonRpcProvider
+ let provider2: ethers.providers.JsonRpcProvider
+
+ let signer1: ethers.Signer
+ let signer2: ethers.Signer
+
+ let contexts: commons.context.VersionedContext
+ let networks: NetworkConfig[]
+
+ let tracker: tracker.ConfigTracker & migrator.PresignedMigrationTracker
+
+ let defaultArgs: {
+ contexts: commons.context.VersionedContext
+ networks: NetworkConfig[]
+ tracker: tracker.ConfigTracker & migrator.PresignedMigrationTracker
+ }
+
+ before(async () => {
+ provider1 = new ethers.providers.Web3Provider(hardhat.network.provider as any)
+ provider2 = new ethers.providers.JsonRpcProvider('http://127.0.0.1:7048')
+
+ // TODO: Implement migrations on local config tracker
+ tracker = new trackers.local.LocalConfigTracker(provider1) as any
+
+ networks = [
+ {
+ chainId: 31337,
+ name: 'hardhat',
+ provider: provider1,
+ rpcUrl: '',
+ relayer: new LocalRelayer(provider1.getSigner()),
+ nativeToken: {
+ symbol: 'ETH',
+ name: 'Ether',
+ decimals: 18
+ }
+ },
+ {
+ chainId: 31338,
+ name: 'hardhat2',
+ provider: provider2,
+ rpcUrl: 'http://127.0.0.1:7048',
+ relayer: new LocalRelayer(provider2.getSigner()),
+ nativeToken: {
+ symbol: 'ETH',
+ name: 'Ether',
+ decimals: 18
+ }
+ }
+ ]
+
+ signer1 = provider1.getSigner()
+ signer2 = provider2.getSigner()
+
+ contexts = await utils.context.deploySequenceContexts(signer1)
+ const context2 = await utils.context.deploySequenceContexts(signer2)
+
+ expect(contexts).to.deep.equal(context2)
+
+ defaultArgs = {
+ contexts,
+ networks,
+ tracker
+ }
+ })
+
+ describe('with new account', () => {
+ var account: Account
+ var config: any
+ var accountSigner: ethers.Wallet
+
+ beforeEach(async () => {
+ accountSigner = randomWallet('Should create a new account')
+ config = {
+ threshold: 1,
+ checkpoint: Math.floor(now() / 1000),
+ signers: [{ address: accountSigner.address, weight: 1 }]
+ }
+
+ account = await Account.new({
+ ...defaultArgs,
+ config,
+ orchestrator: new Orchestrator([accountSigner])
+ })
+ })
+ ;[31337, 31338].map((chainId: number) => {
+ context(`for chain ${chainId}`, () => {
+ it('should send transaction', async () => {
+ const signer = account.getSigner(chainId)
+
+ const res = await signer.sendTransaction({
+ to: ethers.Wallet.createRandom().address
+ })
+
+ expect(res).to.exist
+ expect(res.hash).to.exist
+
+ expect(await signer.provider.getTransaction(res.hash)).to.exist
+ })
+
+ it('should send batch transaction', async () => {
+ const signer = account.getSigner(chainId)
+
+ const res = await signer.sendTransaction([
+ {
+ to: ethers.Wallet.createRandom().address
+ },
+ {
+ to: ethers.Wallet.createRandom().address
+ }
+ ])
+
+ expect(res).to.exist
+ expect(res.hash).to.exist
+
+ expect(await signer.provider.getTransaction(res.hash)).to.exist
+ })
+
+ it('should send two transactions (one has deploy)', async () => {
+ const signer = account.getSigner(chainId)
+
+ expect(await signer.provider.getCode(account.address)).to.equal('0x')
+
+ await signer.sendTransaction({
+ to: ethers.Wallet.createRandom().address
+ })
+
+ expect(await signer.provider.getCode(account.address)).to.not.equal('0x')
+
+ const res = await signer.sendTransaction({
+ to: ethers.Wallet.createRandom().address
+ })
+
+ expect(res).to.exist
+ expect(res.hash).to.exist
+
+ expect(await signer.provider.getTransaction(res.hash)).to.exist
+ })
+
+ it('should fail to sign message because not deployed', async () => {
+ const signer = account.getSigner(chainId)
+
+ await expect(signer.signMessage(ethers.utils.randomBytes(32))).to.be.rejectedWith('Wallet cannot validate onchain')
+ })
+
+ it('should sign message after deployment', async () => {
+ const signer = account.getSigner(chainId)
+
+ await signer.sendTransaction({
+ to: ethers.Wallet.createRandom().address
+ })
+
+ expect(await signer.provider.getCode(account.address)).to.not.equal('0x')
+
+ const signature = await signer.signMessage(ethers.utils.randomBytes(32))
+ expect(signature).to.exist
+ expect(signature).to.not.equal('0x')
+ })
+
+ it('should sign a message (undeployed) when using EIP6492', async () => {
+ const signer = account.getSigner(chainId, { cantValidateBehavior: 'eip6492' })
+
+ const signature = await signer.signMessage(ethers.utils.randomBytes(32))
+ expect(signature).to.exist
+ expect(signature).to.not.equal('0x')
+ })
+
+ it('should return account address', async () => {
+ expect(account.address).to.equal(await account.getSigner(chainId).getAddress())
+ })
+
+ it('should return chainId', async () => {
+ expect(chainId).to.equal(await account.getSigner(chainId).getChainId())
+ })
+
+ it('should call select fee even if there is no fee', async () => {
+ let callsToSelectFee = 0
+
+ const tx = {
+ to: ethers.Wallet.createRandom().address
+ }
+
+ const signer = account.getSigner(chainId, {
+ selectFee: async (txs: any, options: FeeOption[]) => {
+ callsToSelectFee++
+ expect(txs).to.deep.equal(tx)
+ expect(options).to.deep.equal([])
+ return undefined
+ }
+ })
+
+ const res = await signer.sendTransaction(tx)
+
+ expect(callsToSelectFee).to.equal(1)
+
+ expect(res).to.exist
+ expect(res.hash).to.exist
+
+ expect(await signer.provider.getTransaction(res.hash)).to.exist
+ })
+
+ describe('select fee', () => {
+ var account: never
+ var getAccount: (feeOptions: FeeOption[], feeQuote: FeeQuote) => Promise
+
+ beforeEach(async () => {
+ class LocalRelayerWithFee extends LocalRelayer {
+ constructor(
+ options: LocalRelayerOptions | ethers.Signer,
+ public feeOptions: FeeOption[],
+ public quote: FeeQuote
+ ) {
+ super(options)
+ }
+
+ async getFeeOptions(
+ _address: string,
+ ..._transactions: commons.transaction.Transaction[]
+ ): Promise<{ options: FeeOption[] }> {
+ return { options: this.feeOptions, quote: this.quote } as any
+ }
+
+ async getFeeOptionsRaw(
+ _entrypoint: string,
+ _data: ethers.utils.BytesLike,
+ _options?: { simulate?: boolean }
+ ): Promise<{ options: FeeOption[] }> {
+ return { options: this.feeOptions, quote: this.quote } as any
+ }
+
+ async gasRefundOptions(
+ _address: string,
+ ..._transactions: commons.transaction.Transaction[]
+ ): Promise {
+ return this.feeOptions
+ }
+
+ async relay(
+ signedTxs: commons.transaction.IntendedTransactionBundle,
+ quote?: FeeQuote | undefined,
+ waitForReceipt?: boolean | undefined
+ ): Promise> {
+ expect(quote).to.equal(this.quote)
+ return super.relay(signedTxs, quote, waitForReceipt)
+ }
+ }
+
+ getAccount = async (feeOptions: FeeOption[], feeQuote: FeeQuote) => {
+ return Account.new({
+ ...defaultArgs,
+ networks: defaultArgs.networks.map(n => {
+ return {
+ ...n,
+ relayer: new LocalRelayerWithFee(chainId === 31337 ? signer1 : signer2, feeOptions, feeQuote)
+ }
+ }),
+ config,
+ orchestrator: new Orchestrator([accountSigner])
+ })
+ }
+ })
+
+ it('should automatically select native fee', async () => {
+ const feeOptions: FeeOption[] = [
+ {
+ token: {
+ chainId,
+ name: 'native',
+ symbol: 'ETH',
+ type: proto.FeeTokenType.UNKNOWN,
+ logoURL: ''
+ },
+ to: ethers.Wallet.createRandom().address,
+ value: '12',
+ gasLimit: 100000
+ }
+ ]
+
+ const feeQuote: FeeQuote = {
+ _tag: 'FeeQuote',
+ _quote: ethers.utils.randomBytes(99)
+ }
+
+ const account = await getAccount(feeOptions, feeQuote)
+ const signer = account.getSigner(chainId)
+
+ await (chainId === 31337 ? signer1 : signer2).sendTransaction({
+ to: account.address,
+ value: 12
+ })
+
+ const res = await signer.sendTransaction({
+ to: ethers.Wallet.createRandom().address
+ })
+
+ expect(res).to.exist
+ expect(res.hash).to.exist
+
+ expect(await signer.provider.getTransaction(res.hash)).to.exist
+ })
+
+ it('should reject if balance is not enough', async () => {
+ const feeOptions: FeeOption[] = [
+ {
+ token: {
+ chainId,
+ name: 'native',
+ symbol: 'ETH',
+ type: proto.FeeTokenType.UNKNOWN,
+ logoURL: ''
+ },
+ to: ethers.Wallet.createRandom().address,
+ value: ethers.utils.parseEther('12').toString(),
+ gasLimit: 100000
+ }
+ ]
+
+ const feeQuote: FeeQuote = {
+ _tag: 'FeeQuote',
+ _quote: ethers.utils.randomBytes(99)
+ }
+
+ const account = await getAccount(feeOptions, feeQuote)
+ const signer = account.getSigner(chainId)
+
+ await (chainId === 31337 ? signer1 : signer2).sendTransaction({
+ to: account.address,
+ value: 11
+ })
+
+ const res = signer.sendTransaction({
+ to: ethers.Wallet.createRandom().address
+ })
+
+ expect(res).to.be.rejectedWith('No fee option available - not enough balance')
+ })
+
+ it('should automatically select ERC20 fee', async () => {
+ const token = await createERC20(chainId === 31337 ? signer1 : signer2, 'Test Token', 'TEST', 18)
+
+ const recipient = ethers.Wallet.createRandom().address
+ const feeOptions: FeeOption[] = [
+ {
+ token: {
+ chainId,
+ name: 'TEST',
+ symbol: 'TEST',
+ type: proto.FeeTokenType.ERC20_TOKEN,
+ logoURL: '',
+ contractAddress: token.address
+ },
+ to: recipient,
+ value: ethers.utils.parseEther('250').toString(),
+ gasLimit: 400000
+ }
+ ]
+
+ const feeQuote: FeeQuote = {
+ _tag: 'FeeQuote',
+ _quote: ethers.utils.randomBytes(99)
+ }
+
+ const account = await getAccount(feeOptions, feeQuote)
+ const signer = account.getSigner(chainId)
+
+ await token.mint(account.address, ethers.utils.parseEther('6000'))
+
+ const res = await signer.sendTransaction({
+ to: ethers.Wallet.createRandom().address
+ })
+
+ expect(res).to.exist
+ expect(res.hash).to.exist
+
+ expect(await signer.provider.getTransaction(res.hash)).to.exist
+ expect(await token.balanceOf(recipient)).to.deep.equal(ethers.utils.parseEther('250'))
+ })
+
+ it('should reject ERC20 fee if not enough balance', async () => {
+ const token = await createERC20(chainId === 31337 ? signer1 : signer2, 'Test Token', 'TEST', 18)
+
+ const recipient = ethers.Wallet.createRandom().address
+ const feeOptions: FeeOption[] = [
+ {
+ token: {
+ chainId,
+ name: 'TEST',
+ symbol: 'TEST',
+ type: proto.FeeTokenType.ERC20_TOKEN,
+ logoURL: '',
+ contractAddress: token.address
+ },
+ to: recipient,
+ value: ethers.utils.parseEther('250').toString(),
+ gasLimit: 400000
+ }
+ ]
+
+ const feeQuote: FeeQuote = {
+ _tag: 'FeeQuote',
+ _quote: ethers.utils.randomBytes(99)
+ }
+
+ const account = await getAccount(feeOptions, feeQuote)
+ const signer = account.getSigner(chainId)
+
+ const res = signer.sendTransaction({
+ to: ethers.Wallet.createRandom().address
+ })
+
+ expect(res).to.be.rejectedWith('No fee option available - not enough balance')
+ })
+
+ it('should automatically select ERC20 fee if user has no ETH', async () => {
+ const token = await createERC20(chainId === 31337 ? signer1 : signer2, 'Test Token', 'TEST', 18)
+
+ const recipient = ethers.Wallet.createRandom().address
+ const feeOptions: FeeOption[] = [
+ {
+ token: {
+ chainId,
+ name: 'native',
+ symbol: 'ETH',
+ type: proto.FeeTokenType.UNKNOWN,
+ logoURL: ''
+ },
+ to: recipient,
+ value: ethers.utils.parseEther('12').toString(),
+ gasLimit: 100000
+ },
+ {
+ token: {
+ chainId,
+ name: 'TEST',
+ symbol: 'TEST',
+ type: proto.FeeTokenType.ERC20_TOKEN,
+ logoURL: '',
+ contractAddress: token.address
+ },
+ to: recipient,
+ value: ethers.utils.parseEther('11').toString(),
+ gasLimit: 400000
+ }
+ ]
+
+ const feeQuote: FeeQuote = {
+ _tag: 'FeeQuote',
+ _quote: ethers.utils.randomBytes(99)
+ }
+
+ const account = await getAccount(feeOptions, feeQuote)
+ const signer = account.getSigner(chainId)
+
+ await token.mint(account.address, ethers.utils.parseEther('11'))
+
+ const res = await signer.sendTransaction({
+ to: ethers.Wallet.createRandom().address
+ })
+
+ expect(res).to.exist
+ expect(res.hash).to.exist
+
+ expect(await signer.provider.getTransaction(res.hash)).to.exist
+ expect(await token.balanceOf(recipient)).to.deep.equal(ethers.utils.parseEther('11'))
+ })
+
+ it('should select fee using callback (first option)', async () => {
+ const recipient = ethers.Wallet.createRandom().address
+
+ const token = await createERC20(chainId === 31337 ? signer1 : signer2, 'Test Token', 'TEST', 18)
+
+ const feeOptions: FeeOption[] = [
+ {
+ token: {
+ chainId,
+ name: 'native',
+ symbol: 'ETH',
+ type: proto.FeeTokenType.UNKNOWN,
+ logoURL: ''
+ },
+ to: recipient,
+ value: '5',
+ gasLimit: 100000
+ },
+ {
+ token: {
+ chainId,
+ name: 'TEST',
+ symbol: 'TEST',
+ type: proto.FeeTokenType.ERC20_TOKEN,
+ logoURL: '',
+ contractAddress: token.address
+ },
+ to: recipient,
+ value: ethers.utils.parseEther('11').toString(),
+ gasLimit: 400000
+ }
+ ]
+
+ const feeQuote: FeeQuote = {
+ _tag: 'FeeQuote',
+ _quote: ethers.utils.randomBytes(99)
+ }
+
+ const account = await getAccount(feeOptions, feeQuote)
+ const signer = account.getSigner(chainId, {
+ selectFee: async (_txs: any, options: FeeOption[]) => {
+ expect(options).to.deep.equal(feeOptions)
+ return options[0]
+ }
+ })
+
+ await (chainId === 31337 ? signer1 : signer2).sendTransaction({
+ to: account.address,
+ value: 5
+ })
+
+ const res = await signer.sendTransaction({
+ to: ethers.Wallet.createRandom().address
+ })
+
+ expect(res).to.exist
+ expect(res.hash).to.exist
+
+ expect(await signer.provider.getTransaction(res.hash)).to.exist
+ expect(await signer.provider.getBalance(recipient)).to.deep.equal(ethers.BigNumber.from('5'))
+ expect(await token.balanceOf(recipient)).to.deep.equal(ethers.utils.parseEther('0'))
+ })
+
+ it('should select fee using callback (second option)', async () => {
+ const recipient = ethers.Wallet.createRandom().address
+
+ const token = await createERC20(chainId === 31337 ? signer1 : signer2, 'Test Token', 'TEST', 18)
+
+ const feeOptions: FeeOption[] = [
+ {
+ token: {
+ chainId,
+ name: 'native',
+ symbol: 'ETH',
+ type: proto.FeeTokenType.UNKNOWN,
+ logoURL: ''
+ },
+ to: recipient,
+ value: '5',
+ gasLimit: 100000
+ },
+ {
+ token: {
+ chainId,
+ name: 'TEST',
+ symbol: 'TEST',
+ type: proto.FeeTokenType.ERC20_TOKEN,
+ logoURL: '',
+ contractAddress: token.address
+ },
+ to: recipient,
+ value: ethers.utils.parseEther('11').toString(),
+ gasLimit: 400000
+ }
+ ]
+
+ const feeQuote: FeeQuote = {
+ _tag: 'FeeQuote',
+ _quote: ethers.utils.randomBytes(99)
+ }
+
+ const account = await getAccount(feeOptions, feeQuote)
+ const signer = account.getSigner(chainId, {
+ selectFee: async (_txs: any, options: FeeOption[]) => {
+ expect(options).to.deep.equal(feeOptions)
+ return options[1]
+ }
+ })
+
+ await token.mint(account.address, ethers.utils.parseEther('11'))
+
+ const res = await signer.sendTransaction({
+ to: ethers.Wallet.createRandom().address
+ })
+
+ expect(res).to.exist
+ expect(res.hash).to.exist
+
+ expect(await signer.provider.getTransaction(res.hash)).to.exist
+ expect(await signer.provider.getBalance(recipient)).to.deep.equal(ethers.BigNumber.from('0'))
+ expect(await token.balanceOf(recipient)).to.deep.equal(ethers.utils.parseEther('11'))
+ })
+ })
+ })
+
+ it('should send transactions on multiple nonce spaces one by one', async () => {
+ const signer1 = account.getSigner(chainId, { nonceSpace: '0x01' })
+ const signer2 = account.getSigner(chainId, { nonceSpace: 2 })
+ const randomSpace = ethers.BigNumber.from(ethers.utils.hexlify(ethers.utils.randomBytes(12)))
+ const signer3 = account.getSigner(chainId, {
+ nonceSpace: randomSpace
+ })
+ const signer4 = account.getSigner(chainId, { nonceSpace: '0x04' })
+ const signer5 = account.getSigner(chainId, { nonceSpace: '0xffffffffffffffffffffffffffffffffffffffff' })
+
+ await signer1.sendTransaction({
+ to: ethers.Wallet.createRandom().address
+ })
+
+ await signer2.sendTransaction({
+ to: ethers.Wallet.createRandom().address
+ })
+
+ await signer3.sendTransaction({
+ to: ethers.Wallet.createRandom().address
+ })
+
+ await signer4.sendTransaction({
+ to: ethers.Wallet.createRandom().address
+ })
+
+ await signer5.sendTransaction({
+ to: ethers.Wallet.createRandom().address
+ })
+
+ // Should have used all spaces
+ const wallet = account.walletForStatus(chainId, await account.status(chainId))
+
+ const nonceSpace1 = await wallet.getNonce('0x01').then(r => ethers.BigNumber.from(r))
+ expect(nonceSpace1.toString()).to.equal('1')
+
+ const nonceSpace2 = await wallet.getNonce(2).then(r => ethers.BigNumber.from(r))
+ expect(nonceSpace2.toString()).to.equal('1')
+
+ const nonceSpace3 = await wallet.getNonce(randomSpace).then(r => ethers.BigNumber.from(r))
+ expect(nonceSpace3.toString()).to.equal('1')
+
+ const nonceSpace4 = await wallet.getNonce('0x04').then(r => ethers.BigNumber.from(r))
+ expect(nonceSpace4.toString()).to.equal('1')
+
+ const nonceSpace5 = await wallet
+ .getNonce('0xffffffffffffffffffffffffffffffffffffffff')
+ .then(r => ethers.BigNumber.from(r))
+ expect(nonceSpace5.toString()).to.equal('1')
+
+ // Unused space should have nonce 0
+ const nonceSpace6 = await wallet.getNonce('0x06').then(r => ethers.BigNumber.from(r))
+ expect(nonceSpace6.toString()).to.equal('0')
+
+ // Using a space should consume it
+ await signer1.sendTransaction({
+ to: ethers.Wallet.createRandom().address
+ })
+
+ const nonceSpace1b = await wallet.getNonce('0x01').then(r => ethers.BigNumber.from(r))
+ expect(nonceSpace1b.toString()).to.equal('2')
+ })
+
+ // Skip if using external network (chainId 31338)
+ // it randomly fails using node 20, it does not seem to be a bug
+ // on sequence.js, instead the external node returns empty data when calling
+ // `getNonce()`, when it should return a value
+ ;(chainId === 31338 ? describe.skip : describe)('multiple nonce spaces', async () => {
+ it('should send transactions on multiple nonce spaces at once', async () => {
+ const signer1 = account.getSigner(chainId, { nonceSpace: '0x01' })
+ const signer2 = account.getSigner(chainId, { nonceSpace: 2 })
+ const randomSpace = ethers.BigNumber.from(ethers.utils.hexlify(ethers.utils.randomBytes(12)))
+ const signer3 = account.getSigner(chainId, {
+ nonceSpace: randomSpace
+ })
+ const signer4 = account.getSigner(chainId, { nonceSpace: '0x04' })
+ const signer5 = account.getSigner(chainId, { nonceSpace: '0xffffffffffffffffffffffffffffffffffffffff' })
+
+ const results = await Promise.all([
+ signer1.sendTransaction({
+ to: ethers.Wallet.createRandom().address
+ }),
+ signer2.sendTransaction({
+ to: ethers.Wallet.createRandom().address
+ }),
+ signer3.sendTransaction({
+ to: ethers.Wallet.createRandom().address
+ }),
+ signer4.sendTransaction({
+ to: ethers.Wallet.createRandom().address
+ }),
+ signer5.sendTransaction({
+ to: ethers.Wallet.createRandom().address
+ })
+ ])
+
+ expect(results).to.have.lengthOf(5)
+ expect(results[0]).to.exist
+ expect(results[0].hash).to.exist
+ expect(results[1]).to.exist
+ expect(results[1].hash).to.exist
+ expect(results[2]).to.exist
+ expect(results[2].hash).to.exist
+ expect(results[3]).to.exist
+ expect(results[3].hash).to.exist
+ expect(results[4]).to.exist
+ expect(results[4].hash).to.exist
+
+ // hashes should be different
+ for (let i = 0; i < results.length; i++) {
+ for (let j = i + 1; j < results.length; j++) {
+ expect(results[i].hash).to.not.equal(results[j].hash)
+ }
+ }
+
+ // Should have used all spaces
+ const wallet = account.walletForStatus(chainId, await account.status(chainId))
+
+ const nonceSpace1 = await wallet.getNonce('0x01').then(r => ethers.BigNumber.from(r))
+ expect(nonceSpace1.toString()).to.equal('1')
+
+ const nonceSpace2 = await wallet.getNonce(2).then(r => ethers.BigNumber.from(r))
+ expect(nonceSpace2.toString()).to.equal('1')
+
+ const nonceSpace3 = await wallet.getNonce(randomSpace).then(r => ethers.BigNumber.from(r))
+ expect(nonceSpace3.toString()).to.equal('1')
+
+ const nonceSpace4 = await wallet.getNonce('0x04').then(r => ethers.BigNumber.from(r))
+ expect(nonceSpace4.toString()).to.equal('1')
+
+ const nonceSpace5 = await wallet
+ .getNonce('0xffffffffffffffffffffffffffffffffffffffff')
+ .then(r => ethers.BigNumber.from(r))
+ expect(nonceSpace5.toString()).to.equal('1')
+
+ // Unused space should have nonce 0
+ const nonceSpace6 = await wallet.getNonce('0x06').then(r => ethers.BigNumber.from(r))
+ expect(nonceSpace6.toString()).to.equal('0')
+
+ // Using a space should consume it
+ await signer1.sendTransaction({
+ to: ethers.Wallet.createRandom().address
+ })
+
+ const nonceSpace1b = await wallet.getNonce('0x01').then(r => ethers.BigNumber.from(r))
+ expect(nonceSpace1b.toString()).to.equal('2')
+ })
+
+ it('should send 100 parallel transactions using different spaces', async () => {
+ const signers = new Array(100).fill(0).map(() =>
+ account.getSigner(chainId, {
+ nonceSpace: ethers.BigNumber.from(ethers.utils.hexlify(ethers.utils.randomBytes(12)))
+ })
+ )
+
+ // Send a random transaction on each one of them
+ await Promise.all(
+ signers.map(signer =>
+ signer.sendTransaction({
+ to: ethers.Wallet.createRandom().address
+ })
+ )
+ )
+
+ // Send another
+ await Promise.all(
+ signers.map(signer =>
+ signer.sendTransaction({
+ to: ethers.Wallet.createRandom().address
+ })
+ )
+ )
+
+ /// ... and another
+ await Promise.all(
+ signers.map(signer =>
+ signer.sendTransaction({
+ to: ethers.Wallet.createRandom().address
+ })
+ )
+ )
+ })
+
+ it('should send multiple transactions on multiple nonce spaces at once', async () => {
+ const signer1 = account.getSigner(chainId, { nonceSpace: '0x01' })
+ const signer2 = account.getSigner(chainId, { nonceSpace: 2 })
+ const randomSpace = ethers.BigNumber.from(ethers.utils.hexlify(ethers.utils.randomBytes(12)))
+
+ const signer3 = account.getSigner(chainId, {
+ nonceSpace: randomSpace
+ })
+ const signer4 = account.getSigner(chainId, { nonceSpace: '0x04' })
+ const signer5 = account.getSigner(chainId, { nonceSpace: '0xffffffffffffffffffffffffffffffffffffffff' })
+
+ await Promise.all([
+ signer1.sendTransaction({
+ to: ethers.Wallet.createRandom().address
+ }),
+ signer2.sendTransaction({
+ to: ethers.Wallet.createRandom().address
+ }),
+ signer3.sendTransaction({
+ to: ethers.Wallet.createRandom().address
+ }),
+ signer4.sendTransaction({
+ to: ethers.Wallet.createRandom().address
+ }),
+ signer5.sendTransaction({
+ to: ethers.Wallet.createRandom().address
+ })
+ ])
+
+ const results = await Promise.all([
+ signer1.sendTransaction({
+ to: ethers.Wallet.createRandom().address
+ }),
+ signer2.sendTransaction({
+ to: ethers.Wallet.createRandom().address
+ }),
+ signer3.sendTransaction({
+ to: ethers.Wallet.createRandom().address
+ }),
+ signer4.sendTransaction({
+ to: ethers.Wallet.createRandom().address
+ }),
+ signer5.sendTransaction({
+ to: ethers.Wallet.createRandom().address
+ })
+ ])
+
+ expect(results).to.have.lengthOf(5)
+ expect(results[0]).to.exist
+ expect(results[0].hash).to.exist
+ expect(results[1]).to.exist
+ expect(results[1].hash).to.exist
+ expect(results[2]).to.exist
+ expect(results[2].hash).to.exist
+ expect(results[3]).to.exist
+ expect(results[3].hash).to.exist
+ expect(results[4]).to.exist
+ expect(results[4].hash).to.exist
+
+ // hashes should be different
+ for (let i = 0; i < results.length; i++) {
+ for (let j = i + 1; j < results.length; j++) {
+ expect(results[i].hash).to.not.equal(results[j].hash)
+ }
+ }
+
+ // Should have used all spaces
+ const wallet = account.walletForStatus(chainId, await account.status(chainId))
+
+ const nonceSpace2 = await wallet.getNonce(2).then(r => ethers.BigNumber.from(r))
+ expect(nonceSpace2.toString()).to.equal('2')
+
+ const nonceSpace1 = await wallet.getNonce('0x01').then(r => ethers.BigNumber.from(r))
+ expect(nonceSpace1.toString()).to.equal('2')
+
+ const nonceSpace3 = await wallet.getNonce(randomSpace).then(r => ethers.BigNumber.from(r))
+ expect(nonceSpace3.toString()).to.equal('2')
+
+ const nonceSpace4 = await wallet.getNonce('0x04').then(r => ethers.BigNumber.from(r))
+ expect(nonceSpace4.toString()).to.equal('2')
+
+ const nonceSpace5 = await wallet
+ .getNonce('0xffffffffffffffffffffffffffffffffffffffff')
+ .then(r => ethers.BigNumber.from(r))
+ expect(nonceSpace5.toString()).to.equal('2')
+
+ // Unused space should have nonce 0
+ const nonceSpace6 = await wallet.getNonce('0x06').then(r => ethers.BigNumber.from(r))
+ expect(nonceSpace6.toString()).to.equal('0')
+
+ // Using a space should consume it
+ await signer1.sendTransaction({
+ to: ethers.Wallet.createRandom().address
+ })
+
+ const nonceSpace1b = await wallet.getNonce('0x01').then(r => ethers.BigNumber.from(r))
+ expect(nonceSpace1b.toString()).to.equal('3')
+ })
+ })
+ })
+ })
+})
diff --git a/packages/api/CHANGELOG.md b/packages/api/CHANGELOG.md
new file mode 100644
index 0000000000..abd71e7933
--- /dev/null
+++ b/packages/api/CHANGELOG.md
@@ -0,0 +1,1733 @@
+# @0xsequence/api
+
+## 1.10.8
+
+### Patch Changes
+
+- update metadata bindings
+
+## 1.10.7
+
+### Patch Changes
+
+- minor fixes to waas client
+
+## 1.10.6
+
+### Patch Changes
+
+- metadata: update bindings
+
+## 1.10.5
+
+### Patch Changes
+
+- network: ape-chain-testnet -> apechain-testnet
+
+## 1.10.4
+
+### Patch Changes
+
+- network: add b3-sepolia, ape-chain-testnet, blast, blast-sepolia
+
+## 1.10.3
+
+### Patch Changes
+
+- typing fix
+
+## 1.10.2
+
+### Patch Changes
+
+- - waas: add getIdToken method
+ - indexer: update api client
+
+## 1.10.1
+
+### Patch Changes
+
+- metadata: update bindings
+
+## 1.10.0
+
+### Minor Changes
+
+- waas release v1.3.0
+
+## 1.9.37
+
+### Patch Changes
+
+- network: adds nativeToken data to NetworkMetadata constants
+
+## 1.9.36
+
+### Patch Changes
+
+- guard: export client
+
+## 1.9.35
+
+### Patch Changes
+
+- guard: update bindings
+
+## 1.9.34
+
+### Patch Changes
+
+- waas: always use lowercase email
+
+## 1.9.33
+
+### Patch Changes
+
+- waas: umd build
+
+## 1.9.32
+
+### Patch Changes
+
+- indexer: update bindings
+
+## 1.9.31
+
+### Patch Changes
+
+- metadata: token directory changes
+
+## 1.9.30
+
+### Patch Changes
+
+- update
+
+## 1.9.29
+
+### Patch Changes
+
+- disable gnosis chain
+
+## 1.9.28
+
+### Patch Changes
+
+- add utils/merkletree
+
+## 1.9.27
+
+### Patch Changes
+
+- network: optimistic -> optimism
+- waas: remove defaults
+- api, sessions: update bindings
+
+## 1.9.26
+
+### Patch Changes
+
+- - add backend interfaces for pluggable interfaces
+ - introduce @0xsequence/react-native
+ - update pnpm to lockfile v9
+
+## 1.9.25
+
+### Patch Changes
+
+- update webrpc clients with new error types
+
+## 1.9.24
+
+### Patch Changes
+
+- waas: add memoryStore backend to localStore
+
+## 1.9.23
+
+### Patch Changes
+
+- update api client bindings
+
+## 1.9.22
+
+### Patch Changes
+
+- update metadata client bindings
+
+## 1.9.21
+
+### Patch Changes
+
+- api client bindings
+
+## 1.9.20
+
+### Patch Changes
+
+- api client bindings update
+
+## 1.9.19
+
+### Patch Changes
+
+- waas update
+
+## 1.9.18
+
+### Patch Changes
+
+- provider: prohibit dangerous functions
+
+## 1.9.17
+
+### Patch Changes
+
+- network: add xr-sepolia
+
+## 1.9.16
+
+### Patch Changes
+
+- waas: sequence.feeOptions
+
+## 1.9.15
+
+### Patch Changes
+
+- metadata: collection external_link field name fix
+
+## 1.9.14
+
+### Patch Changes
+
+- network: astar-zkatana -> astar-zkyoto
+- network: deprecate polygon mumbai network
+- network: add xai and polygon amoy
+
+## 1.9.13
+
+### Patch Changes
+
+- waas: fix @0xsequence/network dependency
+
+## 1.9.12
+
+### Patch Changes
+
+- indexer: update rpc bindings
+- provider: signMessage: Serialize the BytesLike or string message into hexstring before sending
+- waas: SessionAuthProof
+
+## 1.9.11
+
+### Patch Changes
+
+- metdata, update rpc bindings
+
+## 1.9.10
+
+### Patch Changes
+
+- update metadata rpc bindings
+
+## 1.9.9
+
+### Patch Changes
+
+- metadata, add SequenceCollections rpc client
+
+## 1.9.8
+
+### Patch Changes
+
+- waas client update
+
+## 1.9.7
+
+### Patch Changes
+
+- update rpc client bindings for api, metadata and relayer
+
+## 1.9.6
+
+### Patch Changes
+
+- waas package update
+
+## 1.9.5
+
+### Patch Changes
+
+- RpcRelayer prioritize project access key
+
+## 1.9.4
+
+### Patch Changes
+
+- waas: fix network dependency
+
+## 1.9.3
+
+### Patch Changes
+
+- provider: don't append access key to RPC url if user has already provided it
+
+## 1.9.2
+
+### Patch Changes
+
+- network: add xai-sepolia
+
+## 1.9.1
+
+### Patch Changes
+
+- analytics fix
+
+## 1.9.0
+
+### Minor Changes
+
+- waas release
+
+## 1.8.8
+
+### Patch Changes
+
+- update metadata bindings
+
+## 1.8.7
+
+### Patch Changes
+
+- provider: update databeat to 0.9.1
+
+## 1.8.6
+
+### Patch Changes
+
+- guard: SignedOwnershipProof
+
+## 1.8.5
+
+### Patch Changes
+
+- guard: signOwnershipProof and isSignedOwnershipProof
+
+## 1.8.4
+
+### Patch Changes
+
+- network: add homeverse to networks list
+
+## 1.8.3
+
+### Patch Changes
+
+- api: introduce basic linked wallet support
+
+## 1.8.2
+
+### Patch Changes
+
+- provider: don't initialize analytics unless explicitly requested
+
+## 1.8.1
+
+### Patch Changes
+
+- update to analytics provider
+
+## 1.8.0
+
+### Minor Changes
+
+- provider: project analytics
+
+## 1.7.2
+
+### Patch Changes
+
+- 0xsequence: ChainId should not be exported as a type
+- account, wallet: fix nonce selection
+
+## 1.7.1
+
+### Patch Changes
+
+- network: add missing avalanche logoURI
+
+## 1.7.0
+
+### Minor Changes
+
+- provider: projectAccessKey is now required
+
+### Patch Changes
+
+- network: add NetworkMetadata.logoURI property for all networks
+
+## 1.6.3
+
+### Patch Changes
+
+- network list update
+
+## 1.6.2
+
+### Patch Changes
+
+- auth: projectAccessKey option
+- wallet: use 12 bytes for random space
+
+## 1.6.1
+
+### Patch Changes
+
+- core: add simple config from subdigest support
+- core: fix encode tree with subdigest
+- account: implement buildOnChainSignature on Account
+
+## 1.6.0
+
+### Minor Changes
+
+- account, wallet: parallel transactions by default
+
+### Patch Changes
+
+- provider: emit disconnect on sign out
+
+## 1.5.0
+
+### Minor Changes
+
+- signhub: add 'signing' signer status
+
+### Patch Changes
+
+- auth: Session.open: onAccountAddress callback
+- account: allow empty transaction bundles
+
+## 1.4.9
+
+### Patch Changes
+
+- rename SequenceMetadataClient to SequenceMetadata
+
+## 1.4.8
+
+### Patch Changes
+
+- account: Account.getSigners
+
+## 1.4.7
+
+### Patch Changes
+
+- update indexer client bindings
+
+## 1.4.6
+
+### Patch Changes
+
+- - add sepolia networks, mark goerli as deprecated
+ - update indexer client bindings
+
+## 1.4.5
+
+### Patch Changes
+
+- indexer/metadata: update client bindings
+- auth: selectWallet with new address
+
+## 1.4.4
+
+### Patch Changes
+
+- indexer: update bindings
+- auth: handle jwt expiry
+
+## 1.4.3
+
+### Patch Changes
+
+- guard: return active status from GuardSigner.getAuthMethods
+
+## 1.4.2
+
+### Patch Changes
+
+- guard: update bindings
+
+## 1.4.1
+
+### Patch Changes
+
+- network: remove unused networks
+- signhub: orchestrator interface
+- guard: auth methods interface
+- guard: update bindings for pin and totp
+- guard: no more retry logic
+
+## 1.4.0
+
+### Minor Changes
+
+- project access key support
+
+## 1.3.0
+
+### Minor Changes
+
+- signhub: account children
+
+### Patch Changes
+
+- guard: do not throw when building deploy transaction
+- network: snowtrace.io -> subnets.avax.network/c-chain
+
+## 1.2.9
+
+### Patch Changes
+
+- account: AccountSigner.sendTransaction simulateForFeeOptions
+- relayer: update bindings
+
+## 1.2.8
+
+### Patch Changes
+
+- rename X-Sequence-Token-Key header to X-Access-Key
+
+## 1.2.7
+
+### Patch Changes
+
+- add x-sequence-token-key to clients
+
+## 1.2.6
+
+### Patch Changes
+
+- Fix bind multicall provider
+
+## 1.2.5
+
+### Patch Changes
+
+- Multicall default configuration fixes
+
+## 1.2.4
+
+### Patch Changes
+
+- provider: Adding missing payment provider types to PaymentProviderOption
+- provider: WalletRequestHandler.notifyChainChanged
+
+## 1.2.3
+
+### Patch Changes
+
+- auth, provider: connect to accept optional authorizeNonce
+
+## 1.2.2
+
+### Patch Changes
+
+- provider: allow createContract calls
+- core: check for explicit zero address in contract deployments
+
+## 1.2.1
+
+### Patch Changes
+
+- auth: use sequence api chain id as reference chain id if available
+
+## 1.2.0
+
+### Minor Changes
+
+- split services from session, better local support
+
+## 1.1.15
+
+### Patch Changes
+
+- guard: remove error filtering
+
+## 1.1.14
+
+### Patch Changes
+
+- guard: add GuardSigner.onError
+
+## 1.1.13
+
+### Patch Changes
+
+- provider: pass client version with connect options
+- provider: removing large from BannerSize
+
+## 1.1.12
+
+### Patch Changes
+
+- provider: adding bannerSize to ConnectOptions
+
+## 1.1.11
+
+### Patch Changes
+
+- add homeverse configs
+
+## 1.1.10
+
+### Patch Changes
+
+- handle default EIP6492 on send
+
+## 1.1.9
+
+### Patch Changes
+
+- Custom default EIP6492 on client
+
+## 1.1.8
+
+### Patch Changes
+
+- metadata: searchMetadata: add types filter
+
+## 1.1.7
+
+### Patch Changes
+
+- adding signInWith connect settings option to allow dapps to automatically login their users with a certain provider optimizing the normal authentication flow
+
+## 1.1.6
+
+### Patch Changes
+
+- metadata: searchMetadata: add chainID and excludeTokenMetadata filters
+
+## 1.1.5
+
+### Patch Changes
+
+- account: re-compute meta-transaction id for wallet deployment transactions
+
+## 1.1.4
+
+### Patch Changes
+
+- network: rename base-mainnet to base
+- provider: override isDefaultChain with ConnectOptions.networkId if provided
+
+## 1.1.3
+
+### Patch Changes
+
+- provider: use network id from transport session
+- provider: sign authorization using ConnectOptions.networkId if provided
+
+## 1.1.2
+
+### Patch Changes
+
+- provider: jsonrpc chain id fixes
+
+## 1.1.1
+
+### Patch Changes
+
+- network: add base mainnet and sepolia
+- provider: reject toxic transaction requests
+
+## 1.1.0
+
+### Minor Changes
+
+- Refactor dapp facing provider
+
+## 1.0.5
+
+### Patch Changes
+
+- network: export network constants
+- guard: use the correct global for fetch
+- network: nova-explorer.arbitrum.io -> nova.arbiscan.io
+
+## 1.0.4
+
+### Patch Changes
+
+- provider: accept name or number for networkId
+
+## 1.0.3
+
+### Patch Changes
+
+- Simpler isValidSignature helpers
+
+## 1.0.2
+
+### Patch Changes
+
+- add extra signature validation utils methods
+
+## 1.0.1
+
+### Patch Changes
+
+- add homeverse testnet
+
+## 1.0.0
+
+### Major Changes
+
+- https://sequence.xyz/blog/sequence-wallet-light-state-sync-full-merkle-wallets
+
+## 0.43.34
+
+### Patch Changes
+
+- auth: no jwt for indexer
+
+## 0.43.33
+
+### Patch Changes
+
+- Adding onConnectOptionsChange handler to WalletRequestHandler
+
+## 0.43.32
+
+### Patch Changes
+
+- add Base Goerli network
+
+## 0.43.31
+
+### Patch Changes
+
+- remove AuxDataProvider, add promptSignInConnect
+
+## 0.43.30
+
+### Patch Changes
+
+- add arbitrum goerli testnet
+
+## 0.43.29
+
+### Patch Changes
+
+- provider: check availability of window object
+
+## 0.43.28
+
+### Patch Changes
+
+- update api bindings
+
+## 0.43.27
+
+### Patch Changes
+
+- Add rpc is sequence method
+
+## 0.43.26
+
+### Patch Changes
+
+- add zkevm url to enum
+
+## 0.43.25
+
+### Patch Changes
+
+- added polygon zkevm to mainnet networks
+
+## 0.43.24
+
+### Patch Changes
+
+- name change from zkevm to polygon-zkevm
+
+## 0.43.23
+
+### Patch Changes
+
+- update zkEVM name to Polygon zkEVM
+
+## 0.43.22
+
+### Patch Changes
+
+- add zkevm chain
+
+## 0.43.21
+
+### Patch Changes
+
+- api: update client bindings
+
+## 0.43.20
+
+### Patch Changes
+
+- indexer: update bindings
+
+## 0.43.19
+
+### Patch Changes
+
+- session proof update
+
+## 0.43.18
+
+### Patch Changes
+
+- rpc client global check, hardening
+
+## 0.43.17
+
+### Patch Changes
+
+- rpc clients, check of 'global' is defined
+
+## 0.43.16
+
+### Patch Changes
+
+- ethers peerDep to v5, update rpc client global use
+
+## 0.43.15
+
+### Patch Changes
+
+- - provider: expand receiver type on some util methods
+
+## 0.43.14
+
+### Patch Changes
+
+- bump
+
+## 0.43.13
+
+### Patch Changes
+
+- update rpc bindings
+
+## 0.43.12
+
+### Patch Changes
+
+- provider: single wallet init, and add new unregisterWallet() method
+
+## 0.43.11
+
+### Patch Changes
+
+- fix lockfiles
+- re-add mocha type deleter
+
+## 0.43.10
+
+### Patch Changes
+
+- various improvements
+
+## 0.43.9
+
+### Patch Changes
+
+- update deps
+
+## 0.43.8
+
+### Patch Changes
+
+- network: JsonRpcProvider with caching
+
+## 0.43.7
+
+### Patch Changes
+
+- provider: fix wallet network init
+
+## 0.43.6
+
+### Patch Changes
+
+- metadatata: update rpc bindings
+
+## 0.43.5
+
+### Patch Changes
+
+- provider: do not set default network for connect messages
+- provider: forward missing error message
+
+## 0.43.4
+
+### Patch Changes
+
+- no-change version bump to fix incorrectly tagged snapshot build
+
+## 0.43.3
+
+### Patch Changes
+
+- metadata: update bindings
+
+## 0.43.2
+
+### Patch Changes
+
+- provider: implement connectUnchecked
+
+## 0.43.1
+
+### Patch Changes
+
+- update to latest ethauth dep
+
+## 0.43.0
+
+### Minor Changes
+
+- move ethers to a peer dependency
+
+## 0.42.10
+
+### Patch Changes
+
+- add auxDataProvider
+
+## 0.42.9
+
+### Patch Changes
+
+- provider: add eip-191 exceptions
+
+## 0.42.8
+
+### Patch Changes
+
+- provider: skip setting intent origin if we're unity plugin
+
+## 0.42.7
+
+### Patch Changes
+
+- Add sign in options to connection settings
+
+## 0.42.6
+
+### Patch Changes
+
+- api bindings update
+
+## 0.42.5
+
+### Patch Changes
+
+- relayer: don't treat missing receipt as hard failure
+
+## 0.42.4
+
+### Patch Changes
+
+- provider: add custom app protocol to connect options
+
+## 0.42.3
+
+### Patch Changes
+
+- update api bindings
+
+## 0.42.2
+
+### Patch Changes
+
+- disable rinkeby network
+
+## 0.42.1
+
+### Patch Changes
+
+- wallet: optional waitForReceipt parameter
+
+## 0.42.0
+
+### Minor Changes
+
+- relayer: estimateGasLimits -> simulate
+- add simulator package
+
+### Patch Changes
+
+- transactions: fix flattenAuxTransactions
+- provider: only filter nullish values
+- provider: re-map transaction 'gas' back to 'gasLimit'
+
+## 0.41.3
+
+### Patch Changes
+
+- api bindings update
+
+## 0.41.2
+
+### Patch Changes
+
+- api bindings update
+
+## 0.41.1
+
+### Patch Changes
+
+- update default networks
+
+## 0.41.0
+
+### Minor Changes
+
+- relayer: fix Relayer.wait() interface
+
+ The interface for calling Relayer.wait() has changed. Instead of a single optional ill-defined timeout/delay parameter, there are three optional parameters, in order:
+
+ - timeout: the maximum time to wait for the transaction receipt
+ - delay: the polling interval, i.e. the time to wait between requests
+ - maxFails: the maximum number of hard failures to tolerate before giving up
+
+ Please update your codebase accordingly.
+
+- relayer: add optional waitForReceipt parameter to Relayer.relay
+
+ The behaviour of Relayer.relay() was not well-defined with respect to whether or not it waited for a receipt.
+ This change allows the caller to specify whether to wait or not, with the default behaviour being to wait.
+
+### Patch Changes
+
+- relayer: wait receipt retry logic
+- fix wrapped object error
+- provider: forward delegateCall and revertOnError transaction fields
+
+## 0.40.6
+
+### Patch Changes
+
+- add arbitrum-nova chain
+
+## 0.40.5
+
+### Patch Changes
+
+- api: update bindings
+
+## 0.40.4
+
+### Patch Changes
+
+- add unreal transport
+
+## 0.40.3
+
+### Patch Changes
+
+- provider: fix MessageToSign message type
+
+## 0.40.2
+
+### Patch Changes
+
+- Wallet provider, loadSession method
+
+## 0.40.1
+
+### Patch Changes
+
+- export sequence.initWallet and sequence.getWallet
+
+## 0.40.0
+
+### Minor Changes
+
+- add sequence.initWallet(network, config) and sequence.getWallet() helper methods
+
+## 0.39.6
+
+### Patch Changes
+
+- indexer: update client bindings
+
+## 0.39.5
+
+### Patch Changes
+
+- provider: fix networkRpcUrl config option
+
+## 0.39.4
+
+### Patch Changes
+
+- api: update client bindings
+
+## 0.39.3
+
+### Patch Changes
+
+- add request method on Web3Provider
+
+## 0.39.2
+
+### Patch Changes
+
+- update umd name
+
+## 0.39.1
+
+### Patch Changes
+
+- add Aurora network
+- add origin info for accountsChanged event to handle it per dapp
+
+## 0.39.0
+
+### Minor Changes
+
+- abstract window.localStorage to interface type
+
+## 0.38.2
+
+### Patch Changes
+
+- provider: add Settings.defaultPurchaseAmount
+
+## 0.38.1
+
+### Patch Changes
+
+- update api and metadata rpc bindings
+
+## 0.38.0
+
+### Minor Changes
+
+- api: update bindings, change TokenPrice interface
+- bridge: remove @0xsequence/bridge package
+- api: update bindings, rename ContractCallArg to TupleComponent
+
+## 0.37.1
+
+### Patch Changes
+
+- Add back sortNetworks - Removing sorting was a breaking change for dapps on older versions which directly integrate sequence.
+
+## 0.37.0
+
+### Minor Changes
+
+- network related fixes and improvements
+- api: bindings: exchange rate lookups
+
+## 0.36.13
+
+### Patch Changes
+
+- api: update bindings with new price endpoints
+
+## 0.36.12
+
+### Patch Changes
+
+- wallet: skip remote signers if not needed
+- auth: check that signature meets threshold before requesting auth token
+
+## 0.36.11
+
+### Patch Changes
+
+- Prefix EIP191 message on wallet-request-handler
+
+## 0.36.10
+
+### Patch Changes
+
+- support bannerUrl on connect
+
+## 0.36.9
+
+### Patch Changes
+
+- minor dev xp improvements
+
+## 0.36.8
+
+### Patch Changes
+
+- more connect options (theme, payment providers, funding currencies)
+
+## 0.36.7
+
+### Patch Changes
+
+- fix missing break
+
+## 0.36.6
+
+### Patch Changes
+
+- wallet_switchEthereumChain support
+
+## 0.36.5
+
+### Patch Changes
+
+- auth: bump ethauth to 0.7.0
+ network, wallet: don't assume position of auth network in list
+ api/indexer/metadata: trim trailing slash on hostname, and add endpoint urls
+ relayer: Allow to specify local relayer transaction parameters like gas price or gas limit
+
+## 0.36.4
+
+### Patch Changes
+
+- Updating list of chain ids to include other ethereum compatible chains
+
+## 0.36.3
+
+### Patch Changes
+
+- provider: pass connect options to prompter methods
+
+## 0.36.2
+
+### Patch Changes
+
+- transactions: Setting target to 0x0 when empty to during SequenceTxAbiEncode
+
+## 0.36.1
+
+### Patch Changes
+
+- metadata: update client with more fields
+
+## 0.36.0
+
+### Minor Changes
+
+- relayer, wallet: fee quote support
+
+## 0.35.12
+
+### Patch Changes
+
+- provider: rename wallet.commands to wallet.utils
+
+## 0.35.11
+
+### Patch Changes
+
+- provider/utils: smoother message validation
+
+## 0.35.10
+
+### Patch Changes
+
+- upgrade deps
+
+## 0.35.9
+
+### Patch Changes
+
+- provider: window-transport override event handlers with new wallet instance
+
+## 0.35.8
+
+### Patch Changes
+
+- provider: async wallet sign in improvements
+
+## 0.35.7
+
+### Patch Changes
+
+- config: cache wallet configs
+
+## 0.35.6
+
+### Patch Changes
+
+- provider: support async signin of wallet request handler
+
+## 0.35.5
+
+### Patch Changes
+
+- wallet: skip threshold check during fee estimation
+
+## 0.35.4
+
+### Patch Changes
+
+- - browser extension mode, center window
+
+## 0.35.3
+
+### Patch Changes
+
+- - update window position when in browser extension mode
+
+## 0.35.2
+
+### Patch Changes
+
+- - provider: WindowMessageHandler accept optional windowHref
+
+## 0.35.1
+
+### Patch Changes
+
+- wallet: update config on undeployed too
+
+## 0.35.0
+
+### Minor Changes
+
+- - config: add buildStubSignature
+ - provider: add checks to signing cases for wallet deployment and config statuses
+ - provider: add prompt for wallet deployment
+ - relayer: add BaseRelayer.prependWalletDeploy
+ - relayer: add Relayer.feeOptions
+ - relayer: account for wallet deployment in fee estimation
+ - transactions: add fromTransactionish
+ - wallet: add Account.prependConfigUpdate
+ - wallet: add Account.getFeeOptions
+
+## 0.34.0
+
+### Minor Changes
+
+- - upgrade deps
+
+## 0.33.1
+
+### Patch Changes
+
+- update bindings
+
+## 0.31.0
+
+### Minor Changes
+
+- - upgrading to ethers v5.5
+
+## 0.30.0
+
+### Minor Changes
+
+- - upgrade most deps
+
+## 0.29.9
+
+### Patch Changes
+
+- update client
+
+## 0.29.8
+
+### Patch Changes
+
+- update api
+
+## 0.29.4
+
+### Patch Changes
+
+- api: update rpc bindings
+
+## 0.29.1
+
+### Patch Changes
+
+- metadata: ContractInfo.decimals is now optional, i.e. may be undefined
+
+ api: new APIs for user storage and isUsingGoogleMail
+
+## 0.29.0
+
+### Minor Changes
+
+- major architectural changes in Sequence design
+
+ - only one API instance, API is no longer a per-chain service
+ - separate per-chain indexer service, API no longer handles indexing
+ - single contract metadata service, API no longer serves metadata
+
+ chaind package has been removed, indexer and metadata packages have been added
+
+ stronger typing with new explicit ChainId type
+
+ multicall fixes and improvements
+
+ forbid "wait" transactions in sendTransactionBatch calls
+
+## 0.28.0
+
+### Minor Changes
+
+- extension provider
+
+## 0.27.0
+
+### Minor Changes
+
+- Add requireFreshSigner lib to sessions
+
+## 0.25.1
+
+### Patch Changes
+
+- Fix build typescrypt issue
+
+## 0.25.0
+
+### Minor Changes
+
+- 10c8af8: Add estimator package
+ Fix multicall few calls bug
+
+## 0.24.0
+
+### Minor Changes
+
+- pass wallet config and nonce to GetMetaTxnNetworkFeeOptions
+
+## 0.23.0
+
+### Minor Changes
+
+- - relayer: offer variety of gas fee options from the relayer service"
+
+## 0.22.2
+
+### Patch Changes
+
+- e1c109e: Fix authProof on expired sessions
+
+## 0.22.1
+
+### Patch Changes
+
+- transport session cache
+
+## 0.22.0
+
+### Minor Changes
+
+- e667b65: Expose all relayer options on networks
+
+## 0.21.5
+
+### Patch Changes
+
+- Give priority to metaTxnId returned by relayer
+
+## 0.21.4
+
+### Patch Changes
+
+- Add has enough signers method
+
+## 0.21.3
+
+### Patch Changes
+
+- add window session cache
+
+## 0.21.2
+
+### Patch Changes
+
+- exception handlind in relayer
+
+## 0.21.0
+
+### Minor Changes
+
+- - fix gas estimation on wallets with large number of signers
+ - update to session handling and wallet config construction upon auth
+
+## 0.20.0
+
+### Minor Changes
+
+- revert JWT request piggybacking
+
+## 0.19.3
+
+### Patch Changes
+
+- jwtAuth visibility, package version sync
+
+## 0.19.0
+
+### Minor Changes
+
+- - provider, improve dapp / wallet transport io
+
+## 0.18.0
+
+### Minor Changes
+
+- relayer improvements and pending transaction handling
+
+## 0.17.0
+
+### Minor Changes
+
+- ArcadeumAPIClient no longer exposes jwtAuth
+
+## 0.16.1
+
+### Patch Changes
+
+- api: add legacy types for bw compat
+
+## 0.16.0
+
+### Minor Changes
+
+- relayer as its own service separate from chaind
+
+## 0.15.1
+
+### Patch Changes
+
+- update api clients
+
+## 0.15.0
+
+### Patch Changes
+
+- - update chaind and api bindings
+ - replace EstimateMetaTxnGasReceipt with UpdateMetaTxnGasLimits and GetMetaTxnNetworkFeeOptions
+
+## 0.14.3
+
+### Patch Changes
+
+- Fix 0xSequence relayer dependencies
+
+## 0.14.2
+
+### Patch Changes
+
+- Add debug logs to rpc-relayer
+
+## 0.14.1
+
+### Patch Changes
+
+- update api client
+
+## 0.14.0
+
+### Minor Changes
+
+- update sequence utils finder which includes optimization
+
+## 0.13.0
+
+### Minor Changes
+
+- Update SequenceUtils deployed contract
+
+## 0.12.1
+
+### Patch Changes
+
+- npm bump
+
+## 0.12.0
+
+### Minor Changes
+
+- provider: improvements to window transport
+
+## 0.11.4
+
+### Patch Changes
+
+- update api client
+
+## 0.11.3
+
+### Patch Changes
+
+- improve openWindow state options handling
+
+## 0.11.2
+
+### Patch Changes
+
+- Fix multicall proxy scopes
+
+## 0.11.1
+
+### Patch Changes
+
+- Add support for dynamic and nested signatures
+
+## 0.11.0
+
+### Minor Changes
+
+- Update wallet context to 1.7 contracts
+
+## 0.10.9
+
+### Patch Changes
+
+- add support for public addresses as signers in session.open
+
+## 0.10.8
+
+### Patch Changes
+
+- Multicall production configuration
+
+## 0.10.7
+
+### Patch Changes
+
+- allow provider transport to force disconnect
+
+## 0.10.6
+
+### Patch Changes
+
+- - fix getWalletState method
+
+## 0.10.5
+
+### Patch Changes
+
+- update relayer gas refund options
+
+## 0.10.4
+
+### Patch Changes
+
+- Update api proto
+
+## 0.10.3
+
+### Patch Changes
+
+- Fix loading config cross-chain
+
+## 0.10.2
+
+### Patch Changes
+
+- - message digest fix
+
+## 0.10.1
+
+### Patch Changes
+
+- upgrade deps
+
+## 0.10.0
+
+### Minor Changes
+
+- Deployed new contracts with ERC1271 signer support
+
+## 0.9.6
+
+### Patch Changes
+
+- Update ABIs for latest sequence contracts
+
+## 0.9.5
+
+### Patch Changes
+
+- Implemented session class
+
+## 0.9.3
+
+### Patch Changes
+
+- - minor improvements
+
+## 0.9.2
+
+### Patch Changes
+
+- - Update api client
+
+## 0.9.1
+
+### Patch Changes
+
+- - patch bump
+
+## 0.9.0
+
+### Minor Changes
+
+- - provider transport hardening
+
+## 0.8.5
+
+### Patch Changes
+
+- - use latest wallet-contracts
+
+## 0.8.4
+
+### Patch Changes
+
+- - minor improvements, name updates and comments
+
+## 0.8.3
+
+### Patch Changes
+
+- - refinements
+
+ - normalize signer address in config
+
+ - provider: getWalletState() method to WalletProvider
+
+## 0.8.2
+
+### Patch Changes
+
+- - field rename and ethauth dependency bump
+
+## 0.8.1
+
+### Patch Changes
+
+- - variety of optimizations
+
+## 0.8.0
+
+### Minor Changes
+
+- - changeset fix
+
+## 0.7.0
+
+### Patch Changes
+
+- 6f11ed7: sequence.js, init release
diff --git a/packages/api/README.md b/packages/api/README.md
new file mode 100644
index 0000000000..6ac423e4d9
--- /dev/null
+++ b/packages/api/README.md
@@ -0,0 +1,4 @@
+@0xsequence/api
+===============
+
+See [0xsequence project page](https://github.com/0xsequence/sequence.js).
diff --git a/packages/services/userdata/eslint.config.js b/packages/api/eslint.config.js
similarity index 100%
rename from packages/services/userdata/eslint.config.js
rename to packages/api/eslint.config.js
diff --git a/packages/api/package.json b/packages/api/package.json
new file mode 100644
index 0000000000..e46e1fe230
--- /dev/null
+++ b/packages/api/package.json
@@ -0,0 +1,22 @@
+{
+ "name": "@0xsequence/api",
+ "version": "2.0.0",
+ "description": "api sub-package for Sequence",
+ "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/api",
+ "source": "src/index.ts",
+ "main": "dist/0xsequence-api.cjs.js",
+ "module": "dist/0xsequence-api.esm.js",
+ "author": "Horizon Blockchain Games",
+ "license": "Apache-2.0",
+ "scripts": {
+ "test": "echo",
+ "typecheck": "tsc --noEmit"
+ },
+ "dependencies": {},
+ "peerDependencies": {},
+ "devDependencies": {},
+ "files": [
+ "src",
+ "dist"
+ ]
+}
diff --git a/packages/api/src/api.gen.ts b/packages/api/src/api.gen.ts
new file mode 100644
index 0000000000..09dc0423b6
--- /dev/null
+++ b/packages/api/src/api.gen.ts
@@ -0,0 +1,1745 @@
+/* eslint-disable */
+// sequence-api v0.4.0 da72de09959c34a964bb84662ed6bd510f78f5cb
+// --
+// Code generated by webrpc-gen@v0.18.6 with typescript generator. DO NOT EDIT.
+//
+// webrpc-gen -schema=api.ridl -target=typescript -client -out=./clients/api.gen.ts
+
+// WebRPC description and code-gen version
+export const WebRPCVersion = 'v1'
+
+// Schema version of your RIDL schema
+export const WebRPCSchemaVersion = 'v0.4.0'
+
+// Schema hash generated from your RIDL schema
+export const WebRPCSchemaHash = 'da72de09959c34a964bb84662ed6bd510f78f5cb'
+
+//
+// Types
+//
+
+export enum SortOrder {
+ DESC = 'DESC',
+ ASC = 'ASC'
+}
+
+export interface Version {
+ webrpcVersion: string
+ schemaVersion: string
+ schemaHash: string
+ appVersion: string
+}
+
+export interface RuntimeStatus {
+ healthOK: boolean
+ startTime: string
+ uptime: number
+ ver: string
+ branch: string
+ commitHash: string
+ checks: RuntimeChecks
+ numTxnsRelayed: { [key: string]: NumTxnsRelayed }
+}
+
+export interface NumTxnsRelayed {
+ chainID: number
+ prev: number
+ current: number
+ period: number
+}
+
+export interface RuntimeChecks {}
+
+export interface SequenceContext {
+ factory: string
+ mainModule: string
+ mainModuleUpgradable: string
+ guestModule: string
+ utils: string
+}
+
+export interface User {
+ address: string
+ username: string
+ avatar: string
+ bio: string
+ location: string
+ locale: string
+ backup?: boolean
+ backupConfirmed?: boolean
+ maxInvites?: number
+ updatedAt?: string
+ createdAt?: string
+}
+
+export interface WalletBackup {
+ accountAddress: string
+ secretHash: string
+ encryptedWallet: string
+ userConfirmed: boolean
+ updatedAt?: string
+ createdAt?: string
+}
+
+export interface Friend {
+ id: number
+ userAddress: string
+ friendAddress: string
+ nickname: string
+ user?: User
+ createdAt?: string
+}
+
+export interface InviteCode {
+ usesLeft: number
+ ownerAccount: string
+ email?: string
+ url: string
+ createdAt?: string
+ expiresAt?: string
+}
+
+export interface InviteCodeAccount {
+ claimedByUserAddress: string
+ claimedAt?: string
+}
+
+export interface InviteInfo {
+ expiryInHours: number
+ max: number
+ invites: Array
+}
+
+export interface ContractCall {
+ signature: string
+ function: string
+ args: Array
+}
+
+export interface TupleComponent {
+ name?: string
+ type: string
+ value: any
+}
+
+export interface Transaction {
+ delegateCall: boolean
+ revertOnError: boolean
+ gasLimit: string
+ target: string
+ value: string
+ data: string
+ call?: ContractCall
+}
+
+export interface UserStorage {
+ userAddress: string
+ key: string
+ value: any
+}
+
+export interface Token {
+ chainId: number
+ contractAddress: string
+ tokenId?: string
+}
+
+export interface Price {
+ value: number
+ currency: string
+}
+
+export interface TokenPrice {
+ token: Token
+ price?: Price
+ price24hChange?: Price
+ floorPrice: Price
+ buyPrice: Price
+ sellPrice: Price
+ updatedAt: string
+}
+
+export interface ExchangeRate {
+ name: string
+ symbol: string
+ value: number
+ vsCurrency: string
+ currencyType: string
+}
+
+export interface LinkedWallet {
+ id: number
+ walletAddress: string
+ linkedWalletAddress: string
+ createdAt?: string
+}
+
+export interface Page {
+ pageSize?: number
+ page?: number
+ totalRecords?: number
+ column?: string
+ before?: any
+ after?: any
+ sort?: Array
+ more?: boolean
+}
+
+export interface SortBy {
+ column: string
+ order: SortOrder
+}
+
+export interface NftCheckoutParams {
+ name: string
+ imageUrl: string
+ network: string
+ recipientAddress: string
+ blockchainNftId: string
+ contractAddress: string
+ quantity: number
+ decimals?: number
+}
+
+export interface NftCheckout {
+ token: string
+ expiresAt: string
+ orderId: string
+}
+
+export interface SardineOrder {
+ id: string
+ createdAt?: string
+ referenceId: string
+ status: string
+ fiatCurrency: string
+ fiatExchangeRateUSD: number
+ transactionId: string
+ expiresAt?: string
+ total: number
+ subTotal: number
+ transactionFee: number
+ networkFee: number
+ paymentCurrency?: string
+ paymentMethodType?: string
+ transactionType: string
+ name: string
+ price: number
+ imageUrl: string
+ contractAddress?: string
+ transactionHash?: string
+ recipientAddress: string
+}
+
+export interface API {
+ ping(headers?: object, signal?: AbortSignal): Promise
+ version(headers?: object, signal?: AbortSignal): Promise
+ runtimeStatus(headers?: object, signal?: AbortSignal): Promise
+ clock(headers?: object, signal?: AbortSignal): Promise
+ getSequenceContext(headers?: object, signal?: AbortSignal): Promise
+ getAuthToken(args: GetAuthTokenArgs, headers?: object, signal?: AbortSignal): Promise
+ getAuthToken2(args: GetAuthToken2Args, headers?: object, signal?: AbortSignal): Promise
+ sendPasswordlessLink(
+ args: SendPasswordlessLinkArgs,
+ headers?: object,
+ signal?: AbortSignal
+ ): Promise
+ friendList(args: FriendListArgs, headers?: object, signal?: AbortSignal): Promise
+ getFriendByAddress(args: GetFriendByAddressArgs, headers?: object, signal?: AbortSignal): Promise
+ searchFriends(args: SearchFriendsArgs, headers?: object, signal?: AbortSignal): Promise
+ addFriend(args: AddFriendArgs, headers?: object, signal?: AbortSignal): Promise
+ updateFriendNickname(
+ args: UpdateFriendNicknameArgs,
+ headers?: object,
+ signal?: AbortSignal
+ ): Promise
+ removeFriend(args: RemoveFriendArgs, headers?: object, signal?: AbortSignal): Promise
+ contractCall(args: ContractCallArgs, headers?: object, signal?: AbortSignal): Promise
+ decodeContractCall(args: DecodeContractCallArgs, headers?: object, signal?: AbortSignal): Promise
+ lookupContractCallSelectors(
+ args: LookupContractCallSelectorsArgs,
+ headers?: object,
+ signal?: AbortSignal
+ ): Promise
+ userStorageFetch(args: UserStorageFetchArgs, headers?: object, signal?: AbortSignal): Promise
+ userStorageSave(args: UserStorageSaveArgs, headers?: object, signal?: AbortSignal): Promise
+ userStorageDelete(args: UserStorageDeleteArgs, headers?: object, signal?: AbortSignal): Promise
+ userStorageFetchAll(args: UserStorageFetchAllArgs, headers?: object, signal?: AbortSignal): Promise
+ getMoonpayLink(args: GetMoonpayLinkArgs, headers?: object, signal?: AbortSignal): Promise
+ getSardineClientToken(headers?: object, signal?: AbortSignal): Promise
+ getSardineNFTCheckoutToken(
+ args: GetSardineNFTCheckoutTokenArgs,
+ headers?: object,
+ signal?: AbortSignal
+ ): Promise
+ getSardineNFTCheckoutOrderStatus(
+ args: GetSardineNFTCheckoutOrderStatusArgs,
+ headers?: object,
+ signal?: AbortSignal
+ ): Promise
+ resolveENSAddress(args: ResolveENSAddressArgs, headers?: object, signal?: AbortSignal): Promise
+ isValidSignature(args: IsValidSignatureArgs, headers?: object, signal?: AbortSignal): Promise
+ isValidMessageSignature(
+ args: IsValidMessageSignatureArgs,
+ headers?: object,
+ signal?: AbortSignal
+ ): Promise
+ isValidTypedDataSignature(
+ args: IsValidTypedDataSignatureArgs,
+ headers?: object,
+ signal?: AbortSignal
+ ): Promise
+ isValidETHAuthProof(args: IsValidETHAuthProofArgs, headers?: object, signal?: AbortSignal): Promise
+ getCoinPrices(args: GetCoinPricesArgs, headers?: object, signal?: AbortSignal): Promise
+ getCollectiblePrices(
+ args: GetCollectiblePricesArgs,
+ headers?: object,
+ signal?: AbortSignal
+ ): Promise
+ getExchangeRate(args: GetExchangeRateArgs, headers?: object, signal?: AbortSignal): Promise
+ memoryStore(args: MemoryStoreArgs, headers?: object, signal?: AbortSignal): Promise
+ memoryLoad(args: MemoryLoadArgs, headers?: object, signal?: AbortSignal): Promise
+ getInviteInfo(headers?: object, signal?: AbortSignal): Promise
+ isValidAccessCode(args: IsValidAccessCodeArgs, headers?: object, signal?: AbortSignal): Promise
+ internalClaimAccessCode(
+ args: InternalClaimAccessCodeArgs,
+ headers?: object,
+ signal?: AbortSignal
+ ): Promise
+ blockNumberAtTime(args: BlockNumberAtTimeArgs, headers?: object, signal?: AbortSignal): Promise
+ paperSessionSecret(args: PaperSessionSecretArgs, headers?: object, signal?: AbortSignal): Promise
+ paperSessionSecret2(args: PaperSessionSecret2Args, headers?: object, signal?: AbortSignal): Promise
+ linkWallet(args: LinkWalletArgs, headers?: object, signal?: AbortSignal): Promise
+ getLinkedWallets(args: GetLinkedWalletsArgs, headers?: object, signal?: AbortSignal): Promise
+}
+
+export interface PingArgs {}
+
+export interface PingReturn {
+ status: boolean
+}
+export interface VersionArgs {}
+
+export interface VersionReturn {
+ version: Version
+}
+export interface RuntimeStatusArgs {}
+
+export interface RuntimeStatusReturn {
+ status: RuntimeStatus
+}
+export interface ClockArgs {}
+
+export interface ClockReturn {
+ serverTime: string
+}
+export interface GetSequenceContextArgs {}
+
+export interface GetSequenceContextReturn {
+ data: SequenceContext
+}
+export interface GetAuthTokenArgs {
+ ewtString: string
+ testnetMode?: boolean
+}
+
+export interface GetAuthTokenReturn {
+ status: boolean
+ jwtToken: string
+ address: string
+ user?: User
+}
+export interface GetAuthToken2Args {
+ ewtString: string
+ chainID: string
+}
+
+export interface GetAuthToken2Return {
+ status: boolean
+ jwtToken: string
+ address: string
+ user?: User
+}
+export interface SendPasswordlessLinkArgs {
+ email: string
+ redirectUri: string
+ intent: string
+}
+
+export interface SendPasswordlessLinkReturn {
+ status: boolean
+}
+export interface FriendListArgs {
+ nickname?: string
+ page?: Page
+}
+
+export interface FriendListReturn {
+ page: Page
+ friends: Array
+}
+export interface GetFriendByAddressArgs {
+ friendAddress: string
+}
+
+export interface GetFriendByAddressReturn {
+ status: boolean
+ friend: Friend
+}
+export interface SearchFriendsArgs {
+ filterUsername: string
+ page?: Page
+}
+
+export interface SearchFriendsReturn {
+ friends: Array
+}
+export interface AddFriendArgs {
+ friendAddress: string
+ optionalNickname?: string
+}
+
+export interface AddFriendReturn {
+ status: boolean
+ friend?: Friend
+}
+export interface UpdateFriendNicknameArgs {
+ friendAddress: string
+ nickname: string
+}
+
+export interface UpdateFriendNicknameReturn {
+ status: boolean
+ friend?: Friend
+}
+export interface RemoveFriendArgs {
+ friendAddress: string
+}
+
+export interface RemoveFriendReturn {
+ status: boolean
+}
+export interface ContractCallArgs {
+ chainID: string
+ contract: string
+ inputExpr: string
+ outputExpr: string
+ args: Array
+}
+
+export interface ContractCallReturn {
+ returns: Array
+}
+export interface DecodeContractCallArgs {
+ callData: string
+}
+
+export interface DecodeContractCallReturn {
+ call: ContractCall
+}
+export interface LookupContractCallSelectorsArgs {
+ selectors: Array
+}
+
+export interface LookupContractCallSelectorsReturn {
+ signatures: Array>
+}
+export interface UserStorageFetchArgs {
+ key: string
+}
+
+export interface UserStorageFetchReturn {
+ object: any
+}
+export interface UserStorageSaveArgs {
+ key: string
+ object: any
+}
+
+export interface UserStorageSaveReturn {
+ ok: boolean
+}
+export interface UserStorageDeleteArgs {
+ key: string
+}
+
+export interface UserStorageDeleteReturn {
+ ok: boolean
+}
+export interface UserStorageFetchAllArgs {
+ keys?: Array
+}
+
+export interface UserStorageFetchAllReturn {
+ objects: { [key: string]: any }
+}
+export interface GetMoonpayLinkArgs {
+ url: string
+}
+
+export interface GetMoonpayLinkReturn {
+ signedUrl: string
+}
+export interface GetSardineClientTokenArgs {}
+
+export interface GetSardineClientTokenReturn {
+ token: string
+}
+export interface GetSardineNFTCheckoutTokenArgs {
+ params: NftCheckoutParams
+}
+
+export interface GetSardineNFTCheckoutTokenReturn {
+ resp: NftCheckout
+}
+export interface GetSardineNFTCheckoutOrderStatusArgs {
+ orderId: string
+}
+
+export interface GetSardineNFTCheckoutOrderStatusReturn {
+ resp: SardineOrder
+}
+export interface ResolveENSAddressArgs {
+ ens: string
+}
+
+export interface ResolveENSAddressReturn {
+ address: string
+ ok: boolean
+}
+export interface IsValidSignatureArgs {
+ chainId: string
+ walletAddress: string
+ digest: string
+ signature: string
+}
+
+export interface IsValidSignatureReturn {
+ isValid: boolean
+}
+export interface IsValidMessageSignatureArgs {
+ chainId: string
+ walletAddress: string
+ message: string
+ signature: string
+}
+
+export interface IsValidMessageSignatureReturn {
+ isValid: boolean
+}
+export interface IsValidTypedDataSignatureArgs {
+ chainId: string
+ walletAddress: string
+ typedData: any
+ signature: string
+}
+
+export interface IsValidTypedDataSignatureReturn {
+ isValid: boolean
+}
+export interface IsValidETHAuthProofArgs {
+ chainId: string
+ walletAddress: string
+ ethAuthProofString: string
+}
+
+export interface IsValidETHAuthProofReturn {
+ isValid: boolean
+}
+export interface GetCoinPricesArgs {
+ tokens: Array
+}
+
+export interface GetCoinPricesReturn {
+ tokenPrices: Array
+}
+export interface GetCollectiblePricesArgs {
+ tokens: Array
+}
+
+export interface GetCollectiblePricesReturn {
+ tokenPrices: Array
+}
+export interface GetExchangeRateArgs {
+ toCurrency: string
+}
+
+export interface GetExchangeRateReturn {
+ exchangeRate: ExchangeRate
+}
+export interface MemoryStoreArgs {
+ key: string
+ value: string
+}
+
+export interface MemoryStoreReturn {
+ ok: boolean
+}
+export interface MemoryLoadArgs {
+ key: string
+}
+
+export interface MemoryLoadReturn {
+ value: string
+}
+export interface GetInviteInfoArgs {}
+
+export interface GetInviteInfoReturn {
+ inviteInfo: InviteInfo
+}
+export interface IsValidAccessCodeArgs {
+ accessCode: string
+}
+
+export interface IsValidAccessCodeReturn {
+ status: boolean
+}
+export interface InternalClaimAccessCodeArgs {
+ address: string
+ accessCode: string
+}
+
+export interface InternalClaimAccessCodeReturn {
+ status: boolean
+}
+export interface BlockNumberAtTimeArgs {
+ chainId: number
+ timestamps: Array
+}
+
+export interface BlockNumberAtTimeReturn {
+ blocks: Array
+}
+export interface PaperSessionSecretArgs {
+ chainName: string
+ contractAddress: string
+ paramsJson: string
+ contractType: string
+}
+
+export interface PaperSessionSecretReturn {
+ secret: string
+}
+export interface PaperSessionSecret2Args {
+ chainName: string
+ contractAddress: string
+ paramsJson: string
+ abi: string
+}
+
+export interface PaperSessionSecret2Return {
+ secret: string
+}
+export interface LinkWalletArgs {
+ chainId: string
+ walletAddress: string
+ ethAuthProofString: string
+ linkedWalletMessage: string
+ linkedWalletSignature: string
+}
+
+export interface LinkWalletReturn {
+ status: boolean
+ linkedWalletAddress: string
+}
+export interface GetLinkedWalletsArgs {
+ walletAddress: string
+}
+
+export interface GetLinkedWalletsReturn {
+ linkedWallets: Array
+}
+
+//
+// Client
+//
+export class API implements API {
+ protected hostname: string
+ protected fetch: Fetch
+ protected path = '/rpc/API/'
+
+ constructor(hostname: string, fetch: Fetch) {
+ this.hostname = hostname
+ this.fetch = (input: RequestInfo, init?: RequestInit) => fetch(input, init)
+ }
+
+ private url(name: string): string {
+ return this.hostname + this.path + name
+ }
+
+ ping = (headers?: object, signal?: AbortSignal): Promise => {
+ return this.fetch(this.url('Ping'), createHTTPRequest({}, headers, signal)).then(
+ res => {
+ return buildResponse(res).then(_data => {
+ return {
+ status: _data.status
+ }
+ })
+ },
+ error => {
+ throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` })
+ }
+ )
+ }
+
+ version = (headers?: object, signal?: AbortSignal): Promise => {
+ return this.fetch(this.url('Version'), createHTTPRequest({}, headers, signal)).then(
+ res => {
+ return buildResponse(res).then(_data => {
+ return {
+ version: _data.version
+ }
+ })
+ },
+ error => {
+ throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` })
+ }
+ )
+ }
+
+ runtimeStatus = (headers?: object, signal?: AbortSignal): Promise => {
+ return this.fetch(this.url('RuntimeStatus'), createHTTPRequest({}, headers, signal)).then(
+ res => {
+ return buildResponse(res).then(_data => {
+ return {
+ status: _data.status
+ }
+ })
+ },
+ error => {
+ throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` })
+ }
+ )
+ }
+
+ clock = (headers?: object, signal?: AbortSignal): Promise => {
+ return this.fetch(this.url('Clock'), createHTTPRequest({}, headers, signal)).then(
+ res => {
+ return buildResponse(res).then(_data => {
+ return {
+ serverTime: _data.serverTime
+ }
+ })
+ },
+ error => {
+ throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` })
+ }
+ )
+ }
+
+ getSequenceContext = (headers?: object, signal?: AbortSignal): Promise => {
+ return this.fetch(this.url('GetSequenceContext'), createHTTPRequest({}, headers, signal)).then(
+ res => {
+ return buildResponse(res).then(_data => {
+ return {
+ data: _data.data
+ }
+ })
+ },
+ error => {
+ throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` })
+ }
+ )
+ }
+
+ getAuthToken = (args: GetAuthTokenArgs, headers?: object, signal?: AbortSignal): Promise => {
+ return this.fetch(this.url('GetAuthToken'), createHTTPRequest(args, headers, signal)).then(
+ res => {
+ return buildResponse(res).then(_data => {
+ return {
+ status: _data.status,
+ jwtToken: _data.jwtToken,
+ address: _data.address,
+ user: _data.user
+ }
+ })
+ },
+ error => {
+ throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` })
+ }
+ )
+ }
+
+ getAuthToken2 = (args: GetAuthToken2Args, headers?: object, signal?: AbortSignal): Promise => {
+ return this.fetch(this.url('GetAuthToken2'), createHTTPRequest(args, headers, signal)).then(
+ res => {
+ return buildResponse(res).then(_data => {
+ return {
+ status: _data.status,
+ jwtToken: _data.jwtToken,
+ address: _data.address,
+ user: _data.user
+ }
+ })
+ },
+ error => {
+ throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` })
+ }
+ )
+ }
+
+ sendPasswordlessLink = (
+ args: SendPasswordlessLinkArgs,
+ headers?: object,
+ signal?: AbortSignal
+ ): Promise => {
+ return this.fetch(this.url('SendPasswordlessLink'), createHTTPRequest(args, headers, signal)).then(
+ res => {
+ return buildResponse(res).then(_data => {
+ return {
+ status: _data.status
+ }
+ })
+ },
+ error => {
+ throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` })
+ }
+ )
+ }
+
+ friendList = (args: FriendListArgs, headers?: object, signal?: AbortSignal): Promise => {
+ return this.fetch(this.url('FriendList'), createHTTPRequest(args, headers, signal)).then(
+ res => {
+ return buildResponse(res).then(_data => {
+ return {
+ page: _data.page,
+ friends: >_data.friends
+ }
+ })
+ },
+ error => {
+ throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` })
+ }
+ )
+ }
+
+ getFriendByAddress = (
+ args: GetFriendByAddressArgs,
+ headers?: object,
+ signal?: AbortSignal
+ ): Promise => {
+ return this.fetch(this.url('GetFriendByAddress'), createHTTPRequest(args, headers, signal)).then(
+ res => {
+ return buildResponse(res).then(_data => {
+ return {
+ status: _data.status,
+ friend: _data.friend
+ }
+ })
+ },
+ error => {
+ throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` })
+ }
+ )
+ }
+
+ searchFriends = (args: SearchFriendsArgs, headers?: object, signal?: AbortSignal): Promise => {
+ return this.fetch(this.url('SearchFriends'), createHTTPRequest(args, headers, signal)).then(
+ res => {
+ return buildResponse(res).then(_data => {
+ return {
+ friends: >_data.friends
+ }
+ })
+ },
+ error => {
+ throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` })
+ }
+ )
+ }
+
+ addFriend = (args: AddFriendArgs, headers?: object, signal?: AbortSignal): Promise => {
+ return this.fetch(this.url('AddFriend'), createHTTPRequest(args, headers, signal)).then(
+ res => {
+ return buildResponse(res).then(_data => {
+ return {
+ status: _data.status,
+ friend: _data.friend
+ }
+ })
+ },
+ error => {
+ throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` })
+ }
+ )
+ }
+
+ updateFriendNickname = (
+ args: UpdateFriendNicknameArgs,
+ headers?: object,
+ signal?: AbortSignal
+ ): Promise => {
+ return this.fetch(this.url('UpdateFriendNickname'), createHTTPRequest(args, headers, signal)).then(
+ res => {
+ return buildResponse(res).then(_data => {
+ return {
+ status: _data.status,
+ friend: _data.friend
+ }
+ })
+ },
+ error => {
+ throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` })
+ }
+ )
+ }
+
+ removeFriend = (args: RemoveFriendArgs, headers?: object, signal?: AbortSignal): Promise => {
+ return this.fetch(this.url('RemoveFriend'), createHTTPRequest(args, headers, signal)).then(
+ res => {
+ return buildResponse(res).then(_data => {
+ return {
+ status: _data.status
+ }
+ })
+ },
+ error => {
+ throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` })
+ }
+ )
+ }
+
+ contractCall = (args: ContractCallArgs, headers?: object, signal?: AbortSignal): Promise => {
+ return this.fetch(this.url('ContractCall'), createHTTPRequest(args, headers, signal)).then(
+ res => {
+ return buildResponse(res).then(_data => {
+ return {
+ returns: >_data.returns
+ }
+ })
+ },
+ error => {
+ throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` })
+ }
+ )
+ }
+
+ decodeContractCall = (
+ args: DecodeContractCallArgs,
+ headers?: object,
+ signal?: AbortSignal
+ ): Promise => {
+ return this.fetch(this.url('DecodeContractCall'), createHTTPRequest(args, headers, signal)).then(
+ res => {
+ return buildResponse(res).then(_data => {
+ return {
+ call: _data.call
+ }
+ })
+ },
+ error => {
+ throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` })
+ }
+ )
+ }
+
+ lookupContractCallSelectors = (
+ args: LookupContractCallSelectorsArgs,
+ headers?: object,
+ signal?: AbortSignal
+ ): Promise => {
+ return this.fetch(this.url('LookupContractCallSelectors'), createHTTPRequest(args, headers, signal)).then(
+ res => {
+ return buildResponse(res).then(_data => {
+ return {
+ signatures: >>_data.signatures
+ }
+ })
+ },
+ error => {
+ throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` })
+ }
+ )
+ }
+
+ userStorageFetch = (args: UserStorageFetchArgs, headers?: object, signal?: AbortSignal): Promise => {
+ return this.fetch(this.url('UserStorageFetch'), createHTTPRequest(args, headers, signal)).then(
+ res => {
+ return buildResponse(res).then(_data => {
+ return {
+ object: _data.object
+ }
+ })
+ },
+ error => {
+ throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` })
+ }
+ )
+ }
+
+ userStorageSave = (args: UserStorageSaveArgs, headers?: object, signal?: AbortSignal): Promise => {
+ return this.fetch(this.url('UserStorageSave'), createHTTPRequest(args, headers, signal)).then(
+ res => {
+ return buildResponse(res).then(_data => {
+ return {
+ ok: _data.ok
+ }
+ })
+ },
+ error => {
+ throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` })
+ }
+ )
+ }
+
+ userStorageDelete = (args: UserStorageDeleteArgs, headers?: object, signal?: AbortSignal): Promise => {
+ return this.fetch(this.url('UserStorageDelete'), createHTTPRequest(args, headers, signal)).then(
+ res => {
+ return buildResponse(res).then(_data => {
+ return {
+ ok: _data.ok
+ }
+ })
+ },
+ error => {
+ throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` })
+ }
+ )
+ }
+
+ userStorageFetchAll = (
+ args: UserStorageFetchAllArgs,
+ headers?: object,
+ signal?: AbortSignal
+ ): Promise => {
+ return this.fetch(this.url('UserStorageFetchAll'), createHTTPRequest(args, headers, signal)).then(
+ res => {
+ return buildResponse(res).then(_data => {
+ return {
+ objects: <{ [key: string]: any }>_data.objects
+ }
+ })
+ },
+ error => {
+ throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` })
+ }
+ )
+ }
+
+ getMoonpayLink = (args: GetMoonpayLinkArgs, headers?: object, signal?: AbortSignal): Promise => {
+ return this.fetch(this.url('GetMoonpayLink'), createHTTPRequest(args, headers, signal)).then(
+ res => {
+ return buildResponse(res).then(_data => {
+ return {
+ signedUrl: _data.signedUrl
+ }
+ })
+ },
+ error => {
+ throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` })
+ }
+ )
+ }
+
+ getSardineClientToken = (headers?: object, signal?: AbortSignal): Promise => {
+ return this.fetch(this.url('GetSardineClientToken'), createHTTPRequest({}, headers, signal)).then(
+ res => {
+ return buildResponse(res).then(_data => {
+ return {
+ token: _data.token
+ }
+ })
+ },
+ error => {
+ throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` })
+ }
+ )
+ }
+
+ getSardineNFTCheckoutToken = (
+ args: GetSardineNFTCheckoutTokenArgs,
+ headers?: object,
+ signal?: AbortSignal
+ ): Promise => {
+ return this.fetch(this.url('GetSardineNFTCheckoutToken'), createHTTPRequest(args, headers, signal)).then(
+ res => {
+ return buildResponse(res).then(_data => {
+ return {
+ resp: _data.resp
+ }
+ })
+ },
+ error => {
+ throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` })
+ }
+ )
+ }
+
+ getSardineNFTCheckoutOrderStatus = (
+ args: GetSardineNFTCheckoutOrderStatusArgs,
+ headers?: object,
+ signal?: AbortSignal
+ ): Promise => {
+ return this.fetch(this.url('GetSardineNFTCheckoutOrderStatus'), createHTTPRequest(args, headers, signal)).then(
+ res => {
+ return buildResponse(res).then(_data => {
+ return {
+ resp: _data.resp
+ }
+ })
+ },
+ error => {
+ throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` })
+ }
+ )
+ }
+
+ resolveENSAddress = (args: ResolveENSAddressArgs, headers?: object, signal?: AbortSignal): Promise => {
+ return this.fetch(this.url('ResolveENSAddress'), createHTTPRequest(args, headers, signal)).then(
+ res => {
+ return buildResponse(res).then(_data => {
+ return {
+ address: _data.address,
+ ok: _data.ok
+ }
+ })
+ },
+ error => {
+ throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` })
+ }
+ )
+ }
+
+ isValidSignature = (args: IsValidSignatureArgs, headers?: object, signal?: AbortSignal): Promise => {
+ return this.fetch(this.url('IsValidSignature'), createHTTPRequest(args, headers, signal)).then(
+ res => {
+ return buildResponse(res).then(_data => {
+ return {
+ isValid: _data.isValid
+ }
+ })
+ },
+ error => {
+ throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` })
+ }
+ )
+ }
+
+ isValidMessageSignature = (
+ args: IsValidMessageSignatureArgs,
+ headers?: object,
+ signal?: AbortSignal
+ ): Promise => {
+ return this.fetch(this.url('IsValidMessageSignature'), createHTTPRequest(args, headers, signal)).then(
+ res => {
+ return buildResponse(res).then(_data => {
+ return {
+ isValid: _data.isValid
+ }
+ })
+ },
+ error => {
+ throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` })
+ }
+ )
+ }
+
+ isValidTypedDataSignature = (
+ args: IsValidTypedDataSignatureArgs,
+ headers?: object,
+ signal?: AbortSignal
+ ): Promise => {
+ return this.fetch(this.url('IsValidTypedDataSignature'), createHTTPRequest(args, headers, signal)).then(
+ res => {
+ return buildResponse(res).then(_data => {
+ return {
+ isValid: _data.isValid
+ }
+ })
+ },
+ error => {
+ throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` })
+ }
+ )
+ }
+
+ isValidETHAuthProof = (
+ args: IsValidETHAuthProofArgs,
+ headers?: object,
+ signal?: AbortSignal
+ ): Promise => {
+ return this.fetch(this.url('IsValidETHAuthProof'), createHTTPRequest(args, headers, signal)).then(
+ res => {
+ return buildResponse(res).then(_data => {
+ return {
+ isValid: _data.isValid
+ }
+ })
+ },
+ error => {
+ throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` })
+ }
+ )
+ }
+
+ getCoinPrices = (args: GetCoinPricesArgs, headers?: object, signal?: AbortSignal): Promise => {
+ return this.fetch(this.url('GetCoinPrices'), createHTTPRequest(args, headers, signal)).then(
+ res => {
+ return buildResponse(res).then(_data => {
+ return {
+ tokenPrices: >_data.tokenPrices
+ }
+ })
+ },
+ error => {
+ throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` })
+ }
+ )
+ }
+
+ getCollectiblePrices = (
+ args: GetCollectiblePricesArgs,
+ headers?: object,
+ signal?: AbortSignal
+ ): Promise => {
+ return this.fetch(this.url('GetCollectiblePrices'), createHTTPRequest(args, headers, signal)).then(
+ res => {
+ return buildResponse(res).then(_data => {
+ return {
+ tokenPrices: >_data.tokenPrices
+ }
+ })
+ },
+ error => {
+ throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` })
+ }
+ )
+ }
+
+ getExchangeRate = (args: GetExchangeRateArgs, headers?: object, signal?: AbortSignal): Promise => {
+ return this.fetch(this.url('GetExchangeRate'), createHTTPRequest(args, headers, signal)).then(
+ res => {
+ return buildResponse(res).then(_data => {
+ return {
+ exchangeRate: _data.exchangeRate
+ }
+ })
+ },
+ error => {
+ throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` })
+ }
+ )
+ }
+
+ memoryStore = (args: MemoryStoreArgs, headers?: object, signal?: AbortSignal): Promise => {
+ return this.fetch(this.url('MemoryStore'), createHTTPRequest(args, headers, signal)).then(
+ res => {
+ return buildResponse(res).then(_data => {
+ return {
+ ok: _data.ok
+ }
+ })
+ },
+ error => {
+ throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` })
+ }
+ )
+ }
+
+ memoryLoad = (args: MemoryLoadArgs, headers?: object, signal?: AbortSignal): Promise => {
+ return this.fetch(this.url('MemoryLoad'), createHTTPRequest(args, headers, signal)).then(
+ res => {
+ return buildResponse(res).then(_data => {
+ return {
+ value: _data.value
+ }
+ })
+ },
+ error => {
+ throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` })
+ }
+ )
+ }
+
+ getInviteInfo = (headers?: object, signal?: AbortSignal): Promise => {
+ return this.fetch(this.url('GetInviteInfo'), createHTTPRequest({}, headers, signal)).then(
+ res => {
+ return buildResponse(res).then(_data => {
+ return {
+ inviteInfo: _data.inviteInfo
+ }
+ })
+ },
+ error => {
+ throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` })
+ }
+ )
+ }
+
+ isValidAccessCode = (args: IsValidAccessCodeArgs, headers?: object, signal?: AbortSignal): Promise => {
+ return this.fetch(this.url('IsValidAccessCode'), createHTTPRequest(args, headers, signal)).then(
+ res => {
+ return buildResponse(res).then(_data => {
+ return {
+ status: _data.status
+ }
+ })
+ },
+ error => {
+ throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` })
+ }
+ )
+ }
+
+ internalClaimAccessCode = (
+ args: InternalClaimAccessCodeArgs,
+ headers?: object,
+ signal?: AbortSignal
+ ): Promise => {
+ return this.fetch(this.url('InternalClaimAccessCode'), createHTTPRequest(args, headers, signal)).then(
+ res => {
+ return buildResponse(res).then(_data => {
+ return {
+ status: _data.status
+ }
+ })
+ },
+ error => {
+ throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` })
+ }
+ )
+ }
+
+ blockNumberAtTime = (args: BlockNumberAtTimeArgs, headers?: object, signal?: AbortSignal): Promise => {
+ return this.fetch(this.url('BlockNumberAtTime'), createHTTPRequest(args, headers, signal)).then(
+ res => {
+ return buildResponse(res).then(_data => {
+ return {
+ blocks: >_data.blocks
+ }
+ })
+ },
+ error => {
+ throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` })
+ }
+ )
+ }
+
+ paperSessionSecret = (
+ args: PaperSessionSecretArgs,
+ headers?: object,
+ signal?: AbortSignal
+ ): Promise => {
+ return this.fetch(this.url('PaperSessionSecret'), createHTTPRequest(args, headers, signal)).then(
+ res => {
+ return buildResponse(res).then(_data => {
+ return {
+ secret: _data.secret
+ }
+ })
+ },
+ error => {
+ throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` })
+ }
+ )
+ }
+
+ paperSessionSecret2 = (
+ args: PaperSessionSecret2Args,
+ headers?: object,
+ signal?: AbortSignal
+ ): Promise => {
+ return this.fetch(this.url('PaperSessionSecret2'), createHTTPRequest(args, headers, signal)).then(
+ res => {
+ return buildResponse(res).then(_data => {
+ return {
+ secret: _data.secret
+ }
+ })
+ },
+ error => {
+ throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` })
+ }
+ )
+ }
+
+ linkWallet = (args: LinkWalletArgs, headers?: object, signal?: AbortSignal): Promise => {
+ return this.fetch(this.url('LinkWallet'), createHTTPRequest(args, headers, signal)).then(
+ res => {
+ return buildResponse(res).then(_data => {
+ return {
+ status: _data.status,
+ linkedWalletAddress: _data.linkedWalletAddress
+ }
+ })
+ },
+ error => {
+ throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` })
+ }
+ )
+ }
+
+ getLinkedWallets = (args: GetLinkedWalletsArgs, headers?: object, signal?: AbortSignal): Promise => {
+ return this.fetch(this.url('GetLinkedWallets'), createHTTPRequest(args, headers, signal)).then(
+ res => {
+ return buildResponse(res).then(_data => {
+ return {
+ linkedWallets: >_data.linkedWallets
+ }
+ })
+ },
+ error => {
+ throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` })
+ }
+ )
+ }
+}
+
+const createHTTPRequest = (body: object = {}, headers: object = {}, signal: AbortSignal | null = null): object => {
+ return {
+ method: 'POST',
+ headers: { ...headers, 'Content-Type': 'application/json' },
+ body: JSON.stringify(body || {}),
+ signal
+ }
+}
+
+const buildResponse = (res: Response): Promise => {
+ return res.text().then(text => {
+ let data
+ try {
+ data = JSON.parse(text)
+ } catch (error) {
+ let message = ''
+ if (error instanceof Error) {
+ message = error.message
+ }
+ throw WebrpcBadResponseError.new({
+ status: res.status,
+ cause: `JSON.parse(): ${message}: response text: ${text}`
+ })
+ }
+ if (!res.ok) {
+ const code: number = typeof data.code === 'number' ? data.code : 0
+ throw (webrpcErrorByCode[code] || WebrpcError).new(data)
+ }
+ return data
+ })
+}
+
+//
+// Errors
+//
+
+export class WebrpcError extends Error {
+ name: string
+ code: number
+ message: string
+ status: number
+ cause?: string
+
+ /** @deprecated Use message instead of msg. Deprecated in webrpc v0.11.0. */
+ msg: string
+
+ constructor(name: string, code: number, message: string, status: number, cause?: string) {
+ super(message)
+ this.name = name || 'WebrpcError'
+ this.code = typeof code === 'number' ? code : 0
+ this.message = message || `endpoint error ${this.code}`
+ this.msg = this.message
+ this.status = typeof status === 'number' ? status : 0
+ this.cause = cause
+ Object.setPrototypeOf(this, WebrpcError.prototype)
+ }
+
+ static new(payload: any): WebrpcError {
+ return new this(payload.error, payload.code, payload.message || payload.msg, payload.status, payload.cause)
+ }
+}
+
+// Webrpc errors
+
+export class WebrpcEndpointError extends WebrpcError {
+ constructor(
+ name: string = 'WebrpcEndpoint',
+ code: number = 0,
+ message: string = 'endpoint error',
+ status: number = 0,
+ cause?: string
+ ) {
+ super(name, code, message, status, cause)
+ Object.setPrototypeOf(this, WebrpcEndpointError.prototype)
+ }
+}
+
+export class WebrpcRequestFailedError extends WebrpcError {
+ constructor(
+ name: string = 'WebrpcRequestFailed',
+ code: number = -1,
+ message: string = 'request failed',
+ status: number = 0,
+ cause?: string
+ ) {
+ super(name, code, message, status, cause)
+ Object.setPrototypeOf(this, WebrpcRequestFailedError.prototype)
+ }
+}
+
+export class WebrpcBadRouteError extends WebrpcError {
+ constructor(
+ name: string = 'WebrpcBadRoute',
+ code: number = -2,
+ message: string = 'bad route',
+ status: number = 0,
+ cause?: string
+ ) {
+ super(name, code, message, status, cause)
+ Object.setPrototypeOf(this, WebrpcBadRouteError.prototype)
+ }
+}
+
+export class WebrpcBadMethodError extends WebrpcError {
+ constructor(
+ name: string = 'WebrpcBadMethod',
+ code: number = -3,
+ message: string = 'bad method',
+ status: number = 0,
+ cause?: string
+ ) {
+ super(name, code, message, status, cause)
+ Object.setPrototypeOf(this, WebrpcBadMethodError.prototype)
+ }
+}
+
+export class WebrpcBadRequestError extends WebrpcError {
+ constructor(
+ name: string = 'WebrpcBadRequest',
+ code: number = -4,
+ message: string = 'bad request',
+ status: number = 0,
+ cause?: string
+ ) {
+ super(name, code, message, status, cause)
+ Object.setPrototypeOf(this, WebrpcBadRequestError.prototype)
+ }
+}
+
+export class WebrpcBadResponseError extends WebrpcError {
+ constructor(
+ name: string = 'WebrpcBadResponse',
+ code: number = -5,
+ message: string = 'bad response',
+ status: number = 0,
+ cause?: string
+ ) {
+ super(name, code, message, status, cause)
+ Object.setPrototypeOf(this, WebrpcBadResponseError.prototype)
+ }
+}
+
+export class WebrpcServerPanicError extends WebrpcError {
+ constructor(
+ name: string = 'WebrpcServerPanic',
+ code: number = -6,
+ message: string = 'server panic',
+ status: number = 0,
+ cause?: string
+ ) {
+ super(name, code, message, status, cause)
+ Object.setPrototypeOf(this, WebrpcServerPanicError.prototype)
+ }
+}
+
+export class WebrpcInternalErrorError extends WebrpcError {
+ constructor(
+ name: string = 'WebrpcInternalError',
+ code: number = -7,
+ message: string = 'internal error',
+ status: number = 0,
+ cause?: string
+ ) {
+ super(name, code, message, status, cause)
+ Object.setPrototypeOf(this, WebrpcInternalErrorError.prototype)
+ }
+}
+
+export class WebrpcClientDisconnectedError extends WebrpcError {
+ constructor(
+ name: string = 'WebrpcClientDisconnected',
+ code: number = -8,
+ message: string = 'client disconnected',
+ status: number = 0,
+ cause?: string
+ ) {
+ super(name, code, message, status, cause)
+ Object.setPrototypeOf(this, WebrpcClientDisconnectedError.prototype)
+ }
+}
+
+export class WebrpcStreamLostError extends WebrpcError {
+ constructor(
+ name: string = 'WebrpcStreamLost',
+ code: number = -9,
+ message: string = 'stream lost',
+ status: number = 0,
+ cause?: string
+ ) {
+ super(name, code, message, status, cause)
+ Object.setPrototypeOf(this, WebrpcStreamLostError.prototype)
+ }
+}
+
+export class WebrpcStreamFinishedError extends WebrpcError {
+ constructor(
+ name: string = 'WebrpcStreamFinished',
+ code: number = -10,
+ message: string = 'stream finished',
+ status: number = 0,
+ cause?: string
+ ) {
+ super(name, code, message, status, cause)
+ Object.setPrototypeOf(this, WebrpcStreamFinishedError.prototype)
+ }
+}
+
+// Schema errors
+
+export class UnauthorizedError extends WebrpcError {
+ constructor(
+ name: string = 'Unauthorized',
+ code: number = 1000,
+ message: string = 'Unauthorized access',
+ status: number = 0,
+ cause?: string
+ ) {
+ super(name, code, message, status, cause)
+ Object.setPrototypeOf(this, UnauthorizedError.prototype)
+ }
+}
+
+export class PermissionDeniedError extends WebrpcError {
+ constructor(
+ name: string = 'PermissionDenied',
+ code: number = 1001,
+ message: string = 'Permission denied',
+ status: number = 0,
+ cause?: string
+ ) {
+ super(name, code, message, status, cause)
+ Object.setPrototypeOf(this, PermissionDeniedError.prototype)
+ }
+}
+
+export class SessionExpiredError extends WebrpcError {
+ constructor(
+ name: string = 'SessionExpired',
+ code: number = 1002,
+ message: string = 'Session expired',
+ status: number = 0,
+ cause?: string
+ ) {
+ super(name, code, message, status, cause)
+ Object.setPrototypeOf(this, SessionExpiredError.prototype)
+ }
+}
+
+export class AbortedError extends WebrpcError {
+ constructor(
+ name: string = 'Aborted',
+ code: number = 1005,
+ message: string = 'Request aborted',
+ status: number = 0,
+ cause?: string
+ ) {
+ super(name, code, message, status, cause)
+ Object.setPrototypeOf(this, AbortedError.prototype)
+ }
+}
+
+export class InvalidArgumentError extends WebrpcError {
+ constructor(
+ name: string = 'InvalidArgument',
+ code: number = 2000,
+ message: string = 'Invalid argument',
+ status: number = 0,
+ cause?: string
+ ) {
+ super(name, code, message, status, cause)
+ Object.setPrototypeOf(this, InvalidArgumentError.prototype)
+ }
+}
+
+export class UnavailableError extends WebrpcError {
+ constructor(
+ name: string = 'Unavailable',
+ code: number = 2002,
+ message: string = 'Unavailable resource',
+ status: number = 0,
+ cause?: string
+ ) {
+ super(name, code, message, status, cause)
+ Object.setPrototypeOf(this, UnavailableError.prototype)
+ }
+}
+
+export class QueryFailedError extends WebrpcError {
+ constructor(
+ name: string = 'QueryFailed',
+ code: number = 2003,
+ message: string = 'Query failed',
+ status: number = 0,
+ cause?: string
+ ) {
+ super(name, code, message, status, cause)
+ Object.setPrototypeOf(this, QueryFailedError.prototype)
+ }
+}
+
+export class NotFoundError extends WebrpcError {
+ constructor(
+ name: string = 'NotFound',
+ code: number = 3000,
+ message: string = 'Resource not found',
+ status: number = 0,
+ cause?: string
+ ) {
+ super(name, code, message, status, cause)
+ Object.setPrototypeOf(this, NotFoundError.prototype)
+ }
+}
+
+export enum errors {
+ WebrpcEndpoint = 'WebrpcEndpoint',
+ WebrpcRequestFailed = 'WebrpcRequestFailed',
+ WebrpcBadRoute = 'WebrpcBadRoute',
+ WebrpcBadMethod = 'WebrpcBadMethod',
+ WebrpcBadRequest = 'WebrpcBadRequest',
+ WebrpcBadResponse = 'WebrpcBadResponse',
+ WebrpcServerPanic = 'WebrpcServerPanic',
+ WebrpcInternalError = 'WebrpcInternalError',
+ WebrpcClientDisconnected = 'WebrpcClientDisconnected',
+ WebrpcStreamLost = 'WebrpcStreamLost',
+ WebrpcStreamFinished = 'WebrpcStreamFinished',
+ Unauthorized = 'Unauthorized',
+ PermissionDenied = 'PermissionDenied',
+ SessionExpired = 'SessionExpired',
+ Aborted = 'Aborted',
+ InvalidArgument = 'InvalidArgument',
+ Unavailable = 'Unavailable',
+ QueryFailed = 'QueryFailed',
+ NotFound = 'NotFound'
+}
+
+const webrpcErrorByCode: { [code: number]: any } = {
+ [0]: WebrpcEndpointError,
+ [-1]: WebrpcRequestFailedError,
+ [-2]: WebrpcBadRouteError,
+ [-3]: WebrpcBadMethodError,
+ [-4]: WebrpcBadRequestError,
+ [-5]: WebrpcBadResponseError,
+ [-6]: WebrpcServerPanicError,
+ [-7]: WebrpcInternalErrorError,
+ [-8]: WebrpcClientDisconnectedError,
+ [-9]: WebrpcStreamLostError,
+ [-10]: WebrpcStreamFinishedError,
+ [1000]: UnauthorizedError,
+ [1001]: PermissionDeniedError,
+ [1002]: SessionExpiredError,
+ [1005]: AbortedError,
+ [2000]: InvalidArgumentError,
+ [2002]: UnavailableError,
+ [2003]: QueryFailedError,
+ [3000]: NotFoundError
+}
+
+export type Fetch = (input: RequestInfo, init?: RequestInit) => Promise
diff --git a/packages/api/src/index.ts b/packages/api/src/index.ts
new file mode 100644
index 0000000000..63b8559678
--- /dev/null
+++ b/packages/api/src/index.ts
@@ -0,0 +1,36 @@
+export * from './userdata.gen.js'
+
+import { UserData as UserdataRpc } from './userdata.gen.js'
+
+export class SequenceUserdataClient extends UserdataRpc {
+ constructor(
+ hostname: string,
+ public projectAccessKey?: string,
+ public jwtAuth?: string,
+ ) {
+ super(hostname.endsWith('/') ? hostname.slice(0, -1) : hostname, fetch)
+ this.fetch = this._fetch
+ }
+
+ _fetch = (input: RequestInfo, init?: RequestInit): Promise => {
+ // automatically include jwt and access key auth header to requests
+ // if its been set on the api client
+ const headers: Record = {}
+
+ const jwtAuth = this.jwtAuth
+ const projectAccessKey = this.projectAccessKey
+
+ if (jwtAuth && jwtAuth.length > 0) {
+ headers['Authorization'] = `BEARER ${jwtAuth}`
+ }
+
+ if (projectAccessKey && projectAccessKey.length > 0) {
+ headers['X-Access-Key'] = projectAccessKey
+ }
+
+ // before the request is made
+ init!.headers = { ...init!.headers, ...headers }
+
+ return fetch(input, init)
+ }
+}
diff --git a/packages/auth/CHANGELOG.md b/packages/auth/CHANGELOG.md
new file mode 100644
index 0000000000..37751e73a0
--- /dev/null
+++ b/packages/auth/CHANGELOG.md
@@ -0,0 +1,4782 @@
+# @0xsequence/auth
+
+## 2.0.0
+
+### Major Changes
+
+- changeset
+
+### Patch Changes
+
+- Updated dependencies
+ - @0xsequence/abi@2.0.0
+ - @0xsequence/account@2.0.0
+ - @0xsequence/api@2.0.0
+ - @0xsequence/core@2.0.0
+ - @0xsequence/indexer@2.0.0
+ - @0xsequence/metadata@2.0.0
+ - @0xsequence/migration@2.0.0
+ - @0xsequence/network@2.0.0
+ - @0xsequence/sessions@2.0.0
+ - @0xsequence/signhub@2.0.0
+ - @0xsequence/utils@2.0.0
+ - @0xsequence/wallet@2.0.0
+
+## 1.10.14
+
+### Patch Changes
+
+- network: add borne-testnet to allNetworks
+- Updated dependencies
+ - @0xsequence/abi@1.10.14
+ - @0xsequence/account@1.10.14
+ - @0xsequence/api@1.10.14
+ - @0xsequence/core@1.10.14
+ - @0xsequence/indexer@1.10.14
+ - @0xsequence/metadata@1.10.14
+ - @0xsequence/migration@1.10.14
+ - @0xsequence/network@1.10.14
+ - @0xsequence/sessions@1.10.14
+ - @0xsequence/signhub@1.10.14
+ - @0xsequence/utils@1.10.14
+ - @0xsequence/wallet@1.10.14
+
+## 1.10.13
+
+### Patch Changes
+
+- network: add borne testnet
+- Updated dependencies
+ - @0xsequence/abi@1.10.13
+ - @0xsequence/account@1.10.13
+ - @0xsequence/api@1.10.13
+ - @0xsequence/core@1.10.13
+ - @0xsequence/indexer@1.10.13
+ - @0xsequence/metadata@1.10.13
+ - @0xsequence/migration@1.10.13
+ - @0xsequence/network@1.10.13
+ - @0xsequence/sessions@1.10.13
+ - @0xsequence/signhub@1.10.13
+ - @0xsequence/utils@1.10.13
+ - @0xsequence/wallet@1.10.13
+
+## 1.10.12
+
+### Patch Changes
+
+- api: update bindings
+- global/window -> globalThis
+- Updated dependencies
+- Updated dependencies
+ - @0xsequence/abi@1.10.12
+ - @0xsequence/account@1.10.12
+ - @0xsequence/api@1.10.12
+ - @0xsequence/core@1.10.12
+ - @0xsequence/indexer@1.10.12
+ - @0xsequence/metadata@1.10.12
+ - @0xsequence/migration@1.10.12
+ - @0xsequence/network@1.10.12
+ - @0xsequence/sessions@1.10.12
+ - @0xsequence/signhub@1.10.12
+ - @0xsequence/utils@1.10.12
+ - @0xsequence/wallet@1.10.12
+
+## 1.10.11
+
+### Patch Changes
+
+- waas: updated intent.gen without webrpc types, errors exported from authenticator.gen
+- Updated dependencies
+ - @0xsequence/abi@1.10.11
+ - @0xsequence/account@1.10.11
+ - @0xsequence/api@1.10.11
+ - @0xsequence/core@1.10.11
+ - @0xsequence/indexer@1.10.11
+ - @0xsequence/metadata@1.10.11
+ - @0xsequence/migration@1.10.11
+ - @0xsequence/network@1.10.11
+ - @0xsequence/sessions@1.10.11
+ - @0xsequence/signhub@1.10.11
+ - @0xsequence/utils@1.10.11
+ - @0xsequence/wallet@1.10.11
+
+## 1.10.10
+
+### Patch Changes
+
+- metadata: update bindings with new contract collections api
+- Updated dependencies
+ - @0xsequence/abi@1.10.10
+ - @0xsequence/account@1.10.10
+ - @0xsequence/api@1.10.10
+ - @0xsequence/core@1.10.10
+ - @0xsequence/indexer@1.10.10
+ - @0xsequence/metadata@1.10.10
+ - @0xsequence/migration@1.10.10
+ - @0xsequence/network@1.10.10
+ - @0xsequence/sessions@1.10.10
+ - @0xsequence/signhub@1.10.10
+ - @0xsequence/utils@1.10.10
+ - @0xsequence/wallet@1.10.10
+
+## 1.10.9
+
+### Patch Changes
+
+- waas minor update
+- Updated dependencies
+ - @0xsequence/abi@1.10.9
+ - @0xsequence/account@1.10.9
+ - @0xsequence/api@1.10.9
+ - @0xsequence/core@1.10.9
+ - @0xsequence/indexer@1.10.9
+ - @0xsequence/metadata@1.10.9
+ - @0xsequence/migration@1.10.9
+ - @0xsequence/network@1.10.9
+ - @0xsequence/sessions@1.10.9
+ - @0xsequence/signhub@1.10.9
+ - @0xsequence/utils@1.10.9
+ - @0xsequence/wallet@1.10.9
+
+## 1.10.8
+
+### Patch Changes
+
+- update metadata bindings
+- Updated dependencies
+ - @0xsequence/abi@1.10.8
+ - @0xsequence/account@1.10.8
+ - @0xsequence/api@1.10.8
+ - @0xsequence/core@1.10.8
+ - @0xsequence/indexer@1.10.8
+ - @0xsequence/metadata@1.10.8
+ - @0xsequence/migration@1.10.8
+ - @0xsequence/network@1.10.8
+ - @0xsequence/sessions@1.10.8
+ - @0xsequence/signhub@1.10.8
+ - @0xsequence/utils@1.10.8
+ - @0xsequence/wallet@1.10.8
+
+## 1.10.7
+
+### Patch Changes
+
+- minor fixes to waas client
+- Updated dependencies
+ - @0xsequence/abi@1.10.7
+ - @0xsequence/account@1.10.7
+ - @0xsequence/api@1.10.7
+ - @0xsequence/core@1.10.7
+ - @0xsequence/indexer@1.10.7
+ - @0xsequence/metadata@1.10.7
+ - @0xsequence/migration@1.10.7
+ - @0xsequence/network@1.10.7
+ - @0xsequence/sessions@1.10.7
+ - @0xsequence/signhub@1.10.7
+ - @0xsequence/utils@1.10.7
+ - @0xsequence/wallet@1.10.7
+
+## 1.10.6
+
+### Patch Changes
+
+- metadata: update bindings
+- Updated dependencies
+ - @0xsequence/abi@1.10.6
+ - @0xsequence/account@1.10.6
+ - @0xsequence/api@1.10.6
+ - @0xsequence/core@1.10.6
+ - @0xsequence/indexer@1.10.6
+ - @0xsequence/metadata@1.10.6
+ - @0xsequence/migration@1.10.6
+ - @0xsequence/network@1.10.6
+ - @0xsequence/sessions@1.10.6
+ - @0xsequence/signhub@1.10.6
+ - @0xsequence/utils@1.10.6
+ - @0xsequence/wallet@1.10.6
+
+## 1.10.5
+
+### Patch Changes
+
+- network: ape-chain-testnet -> apechain-testnet
+- Updated dependencies
+ - @0xsequence/abi@1.10.5
+ - @0xsequence/account@1.10.5
+ - @0xsequence/api@1.10.5
+ - @0xsequence/core@1.10.5
+ - @0xsequence/indexer@1.10.5
+ - @0xsequence/metadata@1.10.5
+ - @0xsequence/migration@1.10.5
+ - @0xsequence/network@1.10.5
+ - @0xsequence/sessions@1.10.5
+ - @0xsequence/signhub@1.10.5
+ - @0xsequence/utils@1.10.5
+ - @0xsequence/wallet@1.10.5
+
+## 1.10.4
+
+### Patch Changes
+
+- network: add b3-sepolia, ape-chain-testnet, blast, blast-sepolia
+- Updated dependencies
+ - @0xsequence/abi@1.10.4
+ - @0xsequence/account@1.10.4
+ - @0xsequence/api@1.10.4
+ - @0xsequence/core@1.10.4
+ - @0xsequence/indexer@1.10.4
+ - @0xsequence/metadata@1.10.4
+ - @0xsequence/migration@1.10.4
+ - @0xsequence/network@1.10.4
+ - @0xsequence/sessions@1.10.4
+ - @0xsequence/signhub@1.10.4
+ - @0xsequence/utils@1.10.4
+ - @0xsequence/wallet@1.10.4
+
+## 1.10.3
+
+### Patch Changes
+
+- typing fix
+- Updated dependencies
+ - @0xsequence/abi@1.10.3
+ - @0xsequence/account@1.10.3
+ - @0xsequence/api@1.10.3
+ - @0xsequence/core@1.10.3
+ - @0xsequence/indexer@1.10.3
+ - @0xsequence/metadata@1.10.3
+ - @0xsequence/migration@1.10.3
+ - @0xsequence/network@1.10.3
+ - @0xsequence/sessions@1.10.3
+ - @0xsequence/signhub@1.10.3
+ - @0xsequence/utils@1.10.3
+ - @0xsequence/wallet@1.10.3
+
+## 1.10.2
+
+### Patch Changes
+
+- - waas: add getIdToken method
+ - indexer: update api client
+- Updated dependencies
+ - @0xsequence/abi@1.10.2
+ - @0xsequence/account@1.10.2
+ - @0xsequence/api@1.10.2
+ - @0xsequence/core@1.10.2
+ - @0xsequence/indexer@1.10.2
+ - @0xsequence/metadata@1.10.2
+ - @0xsequence/migration@1.10.2
+ - @0xsequence/network@1.10.2
+ - @0xsequence/sessions@1.10.2
+ - @0xsequence/signhub@1.10.2
+ - @0xsequence/utils@1.10.2
+ - @0xsequence/wallet@1.10.2
+
+## 1.10.1
+
+### Patch Changes
+
+- metadata: update bindings
+- Updated dependencies
+ - @0xsequence/abi@1.10.1
+ - @0xsequence/account@1.10.1
+ - @0xsequence/api@1.10.1
+ - @0xsequence/core@1.10.1
+ - @0xsequence/indexer@1.10.1
+ - @0xsequence/metadata@1.10.1
+ - @0xsequence/migration@1.10.1
+ - @0xsequence/network@1.10.1
+ - @0xsequence/sessions@1.10.1
+ - @0xsequence/signhub@1.10.1
+ - @0xsequence/utils@1.10.1
+ - @0xsequence/wallet@1.10.1
+
+## 1.10.0
+
+### Minor Changes
+
+- waas release v1.3.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @0xsequence/abi@1.10.0
+ - @0xsequence/account@1.10.0
+ - @0xsequence/api@1.10.0
+ - @0xsequence/core@1.10.0
+ - @0xsequence/indexer@1.10.0
+ - @0xsequence/metadata@1.10.0
+ - @0xsequence/migration@1.10.0
+ - @0xsequence/network@1.10.0
+ - @0xsequence/sessions@1.10.0
+ - @0xsequence/signhub@1.10.0
+ - @0xsequence/utils@1.10.0
+ - @0xsequence/wallet@1.10.0
+
+## 1.9.37
+
+### Patch Changes
+
+- network: adds nativeToken data to NetworkMetadata constants
+- Updated dependencies
+ - @0xsequence/abi@1.9.37
+ - @0xsequence/account@1.9.37
+ - @0xsequence/api@1.9.37
+ - @0xsequence/core@1.9.37
+ - @0xsequence/indexer@1.9.37
+ - @0xsequence/metadata@1.9.37
+ - @0xsequence/migration@1.9.37
+ - @0xsequence/network@1.9.37
+ - @0xsequence/sessions@1.9.37
+ - @0xsequence/signhub@1.9.37
+ - @0xsequence/utils@1.9.37
+ - @0xsequence/wallet@1.9.37
+
+## 1.9.36
+
+### Patch Changes
+
+- guard: export client
+- Updated dependencies
+ - @0xsequence/abi@1.9.36
+ - @0xsequence/account@1.9.36
+ - @0xsequence/api@1.9.36
+ - @0xsequence/core@1.9.36
+ - @0xsequence/indexer@1.9.36
+ - @0xsequence/metadata@1.9.36
+ - @0xsequence/migration@1.9.36
+ - @0xsequence/network@1.9.36
+ - @0xsequence/sessions@1.9.36
+ - @0xsequence/signhub@1.9.36
+ - @0xsequence/utils@1.9.36
+ - @0xsequence/wallet@1.9.36
+
+## 1.9.35
+
+### Patch Changes
+
+- guard: update bindings
+- Updated dependencies
+ - @0xsequence/abi@1.9.35
+ - @0xsequence/account@1.9.35
+ - @0xsequence/api@1.9.35
+ - @0xsequence/core@1.9.35
+ - @0xsequence/indexer@1.9.35
+ - @0xsequence/metadata@1.9.35
+ - @0xsequence/migration@1.9.35
+ - @0xsequence/network@1.9.35
+ - @0xsequence/sessions@1.9.35
+ - @0xsequence/signhub@1.9.35
+ - @0xsequence/utils@1.9.35
+ - @0xsequence/wallet@1.9.35
+
+## 1.9.34
+
+### Patch Changes
+
+- waas: always use lowercase email
+- Updated dependencies
+ - @0xsequence/abi@1.9.34
+ - @0xsequence/account@1.9.34
+ - @0xsequence/api@1.9.34
+ - @0xsequence/core@1.9.34
+ - @0xsequence/indexer@1.9.34
+ - @0xsequence/metadata@1.9.34
+ - @0xsequence/migration@1.9.34
+ - @0xsequence/network@1.9.34
+ - @0xsequence/sessions@1.9.34
+ - @0xsequence/signhub@1.9.34
+ - @0xsequence/utils@1.9.34
+ - @0xsequence/wallet@1.9.34
+
+## 1.9.33
+
+### Patch Changes
+
+- waas: umd build
+- Updated dependencies
+ - @0xsequence/abi@1.9.33
+ - @0xsequence/account@1.9.33
+ - @0xsequence/api@1.9.33
+ - @0xsequence/core@1.9.33
+ - @0xsequence/indexer@1.9.33
+ - @0xsequence/metadata@1.9.33
+ - @0xsequence/migration@1.9.33
+ - @0xsequence/network@1.9.33
+ - @0xsequence/sessions@1.9.33
+ - @0xsequence/signhub@1.9.33
+ - @0xsequence/utils@1.9.33
+ - @0xsequence/wallet@1.9.33
+
+## 1.9.32
+
+### Patch Changes
+
+- indexer: update bindings
+- Updated dependencies
+ - @0xsequence/abi@1.9.32
+ - @0xsequence/account@1.9.32
+ - @0xsequence/api@1.9.32
+ - @0xsequence/core@1.9.32
+ - @0xsequence/indexer@1.9.32
+ - @0xsequence/metadata@1.9.32
+ - @0xsequence/migration@1.9.32
+ - @0xsequence/network@1.9.32
+ - @0xsequence/sessions@1.9.32
+ - @0xsequence/signhub@1.9.32
+ - @0xsequence/utils@1.9.32
+ - @0xsequence/wallet@1.9.32
+
+## 1.9.31
+
+### Patch Changes
+
+- metadata: token directory changes
+- Updated dependencies
+ - @0xsequence/abi@1.9.31
+ - @0xsequence/account@1.9.31
+ - @0xsequence/api@1.9.31
+ - @0xsequence/core@1.9.31
+ - @0xsequence/indexer@1.9.31
+ - @0xsequence/metadata@1.9.31
+ - @0xsequence/migration@1.9.31
+ - @0xsequence/network@1.9.31
+ - @0xsequence/sessions@1.9.31
+ - @0xsequence/signhub@1.9.31
+ - @0xsequence/utils@1.9.31
+ - @0xsequence/wallet@1.9.31
+
+## 1.9.30
+
+### Patch Changes
+
+- update
+- Updated dependencies
+ - @0xsequence/abi@1.9.30
+ - @0xsequence/account@1.9.30
+ - @0xsequence/api@1.9.30
+ - @0xsequence/core@1.9.30
+ - @0xsequence/indexer@1.9.30
+ - @0xsequence/metadata@1.9.30
+ - @0xsequence/migration@1.9.30
+ - @0xsequence/network@1.9.30
+ - @0xsequence/sessions@1.9.30
+ - @0xsequence/signhub@1.9.30
+ - @0xsequence/utils@1.9.30
+ - @0xsequence/wallet@1.9.30
+
+## 1.9.29
+
+### Patch Changes
+
+- disable gnosis chain
+- Updated dependencies
+ - @0xsequence/abi@1.9.29
+ - @0xsequence/account@1.9.29
+ - @0xsequence/api@1.9.29
+ - @0xsequence/core@1.9.29
+ - @0xsequence/indexer@1.9.29
+ - @0xsequence/metadata@1.9.29
+ - @0xsequence/migration@1.9.29
+ - @0xsequence/network@1.9.29
+ - @0xsequence/sessions@1.9.29
+ - @0xsequence/signhub@1.9.29
+ - @0xsequence/utils@1.9.29
+ - @0xsequence/wallet@1.9.29
+
+## 1.9.28
+
+### Patch Changes
+
+- add utils/merkletree
+- Updated dependencies
+ - @0xsequence/abi@1.9.28
+ - @0xsequence/account@1.9.28
+ - @0xsequence/api@1.9.28
+ - @0xsequence/core@1.9.28
+ - @0xsequence/indexer@1.9.28
+ - @0xsequence/metadata@1.9.28
+ - @0xsequence/migration@1.9.28
+ - @0xsequence/network@1.9.28
+ - @0xsequence/sessions@1.9.28
+ - @0xsequence/signhub@1.9.28
+ - @0xsequence/utils@1.9.28
+ - @0xsequence/wallet@1.9.28
+
+## 1.9.27
+
+### Patch Changes
+
+- network: optimistic -> optimism
+- waas: remove defaults
+- api, sessions: update bindings
+- Updated dependencies
+- Updated dependencies
+- Updated dependencies
+ - @0xsequence/abi@1.9.27
+ - @0xsequence/account@1.9.27
+ - @0xsequence/api@1.9.27
+ - @0xsequence/core@1.9.27
+ - @0xsequence/indexer@1.9.27
+ - @0xsequence/metadata@1.9.27
+ - @0xsequence/migration@1.9.27
+ - @0xsequence/network@1.9.27
+ - @0xsequence/sessions@1.9.27
+ - @0xsequence/signhub@1.9.27
+ - @0xsequence/utils@1.9.27
+ - @0xsequence/wallet@1.9.27
+
+## 1.9.26
+
+### Patch Changes
+
+- - add backend interfaces for pluggable interfaces
+ - introduce @0xsequence/react-native
+ - update pnpm to lockfile v9
+- Updated dependencies
+ - @0xsequence/abi@1.9.26
+ - @0xsequence/account@1.9.26
+ - @0xsequence/api@1.9.26
+ - @0xsequence/core@1.9.26
+ - @0xsequence/indexer@1.9.26
+ - @0xsequence/metadata@1.9.26
+ - @0xsequence/migration@1.9.26
+ - @0xsequence/network@1.9.26
+ - @0xsequence/sessions@1.9.26
+ - @0xsequence/signhub@1.9.26
+ - @0xsequence/utils@1.9.26
+ - @0xsequence/wallet@1.9.26
+
+## 1.9.25
+
+### Patch Changes
+
+- update webrpc clients with new error types
+- Updated dependencies
+ - @0xsequence/abi@1.9.25
+ - @0xsequence/account@1.9.25
+ - @0xsequence/api@1.9.25
+ - @0xsequence/core@1.9.25
+ - @0xsequence/indexer@1.9.25
+ - @0xsequence/metadata@1.9.25
+ - @0xsequence/migration@1.9.25
+ - @0xsequence/network@1.9.25
+ - @0xsequence/sessions@1.9.25
+ - @0xsequence/signhub@1.9.25
+ - @0xsequence/utils@1.9.25
+ - @0xsequence/wallet@1.9.25
+
+## 1.9.24
+
+### Patch Changes
+
+- waas: add memoryStore backend to localStore
+- Updated dependencies
+ - @0xsequence/abi@1.9.24
+ - @0xsequence/account@1.9.24
+ - @0xsequence/api@1.9.24
+ - @0xsequence/core@1.9.24
+ - @0xsequence/indexer@1.9.24
+ - @0xsequence/metadata@1.9.24
+ - @0xsequence/migration@1.9.24
+ - @0xsequence/network@1.9.24
+ - @0xsequence/sessions@1.9.24
+ - @0xsequence/signhub@1.9.24
+ - @0xsequence/utils@1.9.24
+ - @0xsequence/wallet@1.9.24
+
+## 1.9.23
+
+### Patch Changes
+
+- update api client bindings
+- Updated dependencies
+ - @0xsequence/abi@1.9.23
+ - @0xsequence/account@1.9.23
+ - @0xsequence/api@1.9.23
+ - @0xsequence/core@1.9.23
+ - @0xsequence/indexer@1.9.23
+ - @0xsequence/metadata@1.9.23
+ - @0xsequence/migration@1.9.23
+ - @0xsequence/network@1.9.23
+ - @0xsequence/sessions@1.9.23
+ - @0xsequence/signhub@1.9.23
+ - @0xsequence/utils@1.9.23
+ - @0xsequence/wallet@1.9.23
+
+## 1.9.22
+
+### Patch Changes
+
+- update metadata client bindings
+- Updated dependencies
+ - @0xsequence/abi@1.9.22
+ - @0xsequence/account@1.9.22
+ - @0xsequence/api@1.9.22
+ - @0xsequence/core@1.9.22
+ - @0xsequence/indexer@1.9.22
+ - @0xsequence/metadata@1.9.22
+ - @0xsequence/migration@1.9.22
+ - @0xsequence/network@1.9.22
+ - @0xsequence/sessions@1.9.22
+ - @0xsequence/signhub@1.9.22
+ - @0xsequence/utils@1.9.22
+ - @0xsequence/wallet@1.9.22
+
+## 1.9.21
+
+### Patch Changes
+
+- api client bindings
+- Updated dependencies
+ - @0xsequence/abi@1.9.21
+ - @0xsequence/account@1.9.21
+ - @0xsequence/api@1.9.21
+ - @0xsequence/core@1.9.21
+ - @0xsequence/indexer@1.9.21
+ - @0xsequence/metadata@1.9.21
+ - @0xsequence/migration@1.9.21
+ - @0xsequence/network@1.9.21
+ - @0xsequence/sessions@1.9.21
+ - @0xsequence/signhub@1.9.21
+ - @0xsequence/utils@1.9.21
+ - @0xsequence/wallet@1.9.21
+
+## 1.9.20
+
+### Patch Changes
+
+- api client bindings update
+- Updated dependencies
+ - @0xsequence/abi@1.9.20
+ - @0xsequence/account@1.9.20
+ - @0xsequence/api@1.9.20
+ - @0xsequence/core@1.9.20
+ - @0xsequence/indexer@1.9.20
+ - @0xsequence/metadata@1.9.20
+ - @0xsequence/migration@1.9.20
+ - @0xsequence/network@1.9.20
+ - @0xsequence/sessions@1.9.20
+ - @0xsequence/signhub@1.9.20
+ - @0xsequence/utils@1.9.20
+ - @0xsequence/wallet@1.9.20
+
+## 1.9.19
+
+### Patch Changes
+
+- waas update
+- Updated dependencies
+ - @0xsequence/abi@1.9.19
+ - @0xsequence/account@1.9.19
+ - @0xsequence/api@1.9.19
+ - @0xsequence/core@1.9.19
+ - @0xsequence/indexer@1.9.19
+ - @0xsequence/metadata@1.9.19
+ - @0xsequence/migration@1.9.19
+ - @0xsequence/network@1.9.19
+ - @0xsequence/sessions@1.9.19
+ - @0xsequence/signhub@1.9.19
+ - @0xsequence/utils@1.9.19
+ - @0xsequence/wallet@1.9.19
+
+## 1.9.18
+
+### Patch Changes
+
+- provider: prohibit dangerous functions
+- Updated dependencies
+ - @0xsequence/abi@1.9.18
+ - @0xsequence/account@1.9.18
+ - @0xsequence/api@1.9.18
+ - @0xsequence/core@1.9.18
+ - @0xsequence/indexer@1.9.18
+ - @0xsequence/metadata@1.9.18
+ - @0xsequence/migration@1.9.18
+ - @0xsequence/network@1.9.18
+ - @0xsequence/sessions@1.9.18
+ - @0xsequence/signhub@1.9.18
+ - @0xsequence/utils@1.9.18
+ - @0xsequence/wallet@1.9.18
+
+## 1.9.17
+
+### Patch Changes
+
+- network: add xr-sepolia
+- Updated dependencies
+ - @0xsequence/network@1.9.17
+ - @0xsequence/abi@1.9.17
+ - @0xsequence/account@1.9.17
+ - @0xsequence/api@1.9.17
+ - @0xsequence/core@1.9.17
+ - @0xsequence/indexer@1.9.17
+ - @0xsequence/metadata@1.9.17
+ - @0xsequence/migration@1.9.17
+ - @0xsequence/sessions@1.9.17
+ - @0xsequence/signhub@1.9.17
+ - @0xsequence/utils@1.9.17
+ - @0xsequence/wallet@1.9.17
+
+## 1.9.16
+
+### Patch Changes
+
+- waas: sequence.feeOptions
+- Updated dependencies
+ - @0xsequence/abi@1.9.16
+ - @0xsequence/account@1.9.16
+ - @0xsequence/api@1.9.16
+ - @0xsequence/core@1.9.16
+ - @0xsequence/indexer@1.9.16
+ - @0xsequence/metadata@1.9.16
+ - @0xsequence/migration@1.9.16
+ - @0xsequence/network@1.9.16
+ - @0xsequence/sessions@1.9.16
+ - @0xsequence/signhub@1.9.16
+ - @0xsequence/utils@1.9.16
+ - @0xsequence/wallet@1.9.16
+
+## 1.9.15
+
+### Patch Changes
+
+- metadata: collection external_link field name fix
+- Updated dependencies
+ - @0xsequence/abi@1.9.15
+ - @0xsequence/account@1.9.15
+ - @0xsequence/api@1.9.15
+ - @0xsequence/core@1.9.15
+ - @0xsequence/indexer@1.9.15
+ - @0xsequence/metadata@1.9.15
+ - @0xsequence/migration@1.9.15
+ - @0xsequence/network@1.9.15
+ - @0xsequence/sessions@1.9.15
+ - @0xsequence/signhub@1.9.15
+ - @0xsequence/utils@1.9.15
+ - @0xsequence/wallet@1.9.15
+
+## 1.9.14
+
+### Patch Changes
+
+- network: astar-zkatana -> astar-zkyoto
+- network: deprecate polygon mumbai network
+- network: add xai and polygon amoy
+- Updated dependencies
+- Updated dependencies
+- Updated dependencies
+ - @0xsequence/abi@1.9.14
+ - @0xsequence/account@1.9.14
+ - @0xsequence/api@1.9.14
+ - @0xsequence/core@1.9.14
+ - @0xsequence/indexer@1.9.14
+ - @0xsequence/metadata@1.9.14
+ - @0xsequence/migration@1.9.14
+ - @0xsequence/network@1.9.14
+ - @0xsequence/sessions@1.9.14
+ - @0xsequence/signhub@1.9.14
+ - @0xsequence/utils@1.9.14
+ - @0xsequence/wallet@1.9.14
+
+## 1.9.13
+
+### Patch Changes
+
+- waas: fix @0xsequence/network dependency
+- Updated dependencies
+ - @0xsequence/abi@1.9.13
+ - @0xsequence/account@1.9.13
+ - @0xsequence/api@1.9.13
+ - @0xsequence/core@1.9.13
+ - @0xsequence/indexer@1.9.13
+ - @0xsequence/metadata@1.9.13
+ - @0xsequence/migration@1.9.13
+ - @0xsequence/network@1.9.13
+ - @0xsequence/sessions@1.9.13
+ - @0xsequence/signhub@1.9.13
+ - @0xsequence/utils@1.9.13
+ - @0xsequence/wallet@1.9.13
+
+## 1.9.12
+
+### Patch Changes
+
+- indexer: update rpc bindings
+- provider: signMessage: Serialize the BytesLike or string message into hexstring before sending
+- waas: SessionAuthProof
+- Updated dependencies
+- Updated dependencies
+- Updated dependencies
+ - @0xsequence/abi@1.9.12
+ - @0xsequence/account@1.9.12
+ - @0xsequence/api@1.9.12
+ - @0xsequence/core@1.9.12
+ - @0xsequence/indexer@1.9.12
+ - @0xsequence/metadata@1.9.12
+ - @0xsequence/migration@1.9.12
+ - @0xsequence/network@1.9.12
+ - @0xsequence/sessions@1.9.12
+ - @0xsequence/signhub@1.9.12
+ - @0xsequence/utils@1.9.12
+ - @0xsequence/wallet@1.9.12
+
+## 1.9.11
+
+### Patch Changes
+
+- metdata, update rpc bindings
+- Updated dependencies
+ - @0xsequence/abi@1.9.11
+ - @0xsequence/account@1.9.11
+ - @0xsequence/api@1.9.11
+ - @0xsequence/core@1.9.11
+ - @0xsequence/indexer@1.9.11
+ - @0xsequence/metadata@1.9.11
+ - @0xsequence/migration@1.9.11
+ - @0xsequence/network@1.9.11
+ - @0xsequence/sessions@1.9.11
+ - @0xsequence/signhub@1.9.11
+ - @0xsequence/utils@1.9.11
+ - @0xsequence/wallet@1.9.11
+
+## 1.9.10
+
+### Patch Changes
+
+- update metadata rpc bindings
+- Updated dependencies
+ - @0xsequence/abi@1.9.10
+ - @0xsequence/account@1.9.10
+ - @0xsequence/api@1.9.10
+ - @0xsequence/core@1.9.10
+ - @0xsequence/indexer@1.9.10
+ - @0xsequence/metadata@1.9.10
+ - @0xsequence/migration@1.9.10
+ - @0xsequence/network@1.9.10
+ - @0xsequence/sessions@1.9.10
+ - @0xsequence/signhub@1.9.10
+ - @0xsequence/utils@1.9.10
+ - @0xsequence/wallet@1.9.10
+
+## 1.9.9
+
+### Patch Changes
+
+- metadata, add SequenceCollections rpc client
+- Updated dependencies
+ - @0xsequence/abi@1.9.9
+ - @0xsequence/account@1.9.9
+ - @0xsequence/api@1.9.9
+ - @0xsequence/core@1.9.9
+ - @0xsequence/indexer@1.9.9
+ - @0xsequence/metadata@1.9.9
+ - @0xsequence/migration@1.9.9
+ - @0xsequence/network@1.9.9
+ - @0xsequence/sessions@1.9.9
+ - @0xsequence/signhub@1.9.9
+ - @0xsequence/utils@1.9.9
+ - @0xsequence/wallet@1.9.9
+
+## 1.9.8
+
+### Patch Changes
+
+- waas client update
+- Updated dependencies
+ - @0xsequence/abi@1.9.8
+ - @0xsequence/account@1.9.8
+ - @0xsequence/api@1.9.8
+ - @0xsequence/core@1.9.8
+ - @0xsequence/indexer@1.9.8
+ - @0xsequence/metadata@1.9.8
+ - @0xsequence/migration@1.9.8
+ - @0xsequence/network@1.9.8
+ - @0xsequence/sessions@1.9.8
+ - @0xsequence/signhub@1.9.8
+ - @0xsequence/utils@1.9.8
+ - @0xsequence/wallet@1.9.8
+
+## 1.9.7
+
+### Patch Changes
+
+- update rpc client bindings for api, metadata and relayer
+- Updated dependencies
+ - @0xsequence/abi@1.9.7
+ - @0xsequence/account@1.9.7
+ - @0xsequence/api@1.9.7
+ - @0xsequence/core@1.9.7
+ - @0xsequence/indexer@1.9.7
+ - @0xsequence/metadata@1.9.7
+ - @0xsequence/migration@1.9.7
+ - @0xsequence/network@1.9.7
+ - @0xsequence/sessions@1.9.7
+ - @0xsequence/signhub@1.9.7
+ - @0xsequence/utils@1.9.7
+ - @0xsequence/wallet@1.9.7
+
+## 1.9.6
+
+### Patch Changes
+
+- waas package update
+- Updated dependencies
+ - @0xsequence/abi@1.9.6
+ - @0xsequence/account@1.9.6
+ - @0xsequence/api@1.9.6
+ - @0xsequence/core@1.9.6
+ - @0xsequence/indexer@1.9.6
+ - @0xsequence/metadata@1.9.6
+ - @0xsequence/migration@1.9.6
+ - @0xsequence/network@1.9.6
+ - @0xsequence/sessions@1.9.6
+ - @0xsequence/signhub@1.9.6
+ - @0xsequence/utils@1.9.6
+ - @0xsequence/wallet@1.9.6
+
+## 1.9.5
+
+### Patch Changes
+
+- RpcRelayer prioritize project access key
+- Updated dependencies
+ - @0xsequence/abi@1.9.5
+ - @0xsequence/account@1.9.5
+ - @0xsequence/api@1.9.5
+ - @0xsequence/core@1.9.5
+ - @0xsequence/indexer@1.9.5
+ - @0xsequence/metadata@1.9.5
+ - @0xsequence/migration@1.9.5
+ - @0xsequence/network@1.9.5
+ - @0xsequence/sessions@1.9.5
+ - @0xsequence/signhub@1.9.5
+ - @0xsequence/utils@1.9.5
+ - @0xsequence/wallet@1.9.5
+
+## 1.9.4
+
+### Patch Changes
+
+- waas: fix network dependency
+- Updated dependencies
+ - @0xsequence/abi@1.9.4
+ - @0xsequence/account@1.9.4
+ - @0xsequence/api@1.9.4
+ - @0xsequence/core@1.9.4
+ - @0xsequence/indexer@1.9.4
+ - @0xsequence/metadata@1.9.4
+ - @0xsequence/migration@1.9.4
+ - @0xsequence/network@1.9.4
+ - @0xsequence/sessions@1.9.4
+ - @0xsequence/signhub@1.9.4
+ - @0xsequence/utils@1.9.4
+ - @0xsequence/wallet@1.9.4
+
+## 1.9.3
+
+### Patch Changes
+
+- provider: don't append access key to RPC url if user has already provided it
+- Updated dependencies
+ - @0xsequence/abi@1.9.3
+ - @0xsequence/account@1.9.3
+ - @0xsequence/api@1.9.3
+ - @0xsequence/core@1.9.3
+ - @0xsequence/indexer@1.9.3
+ - @0xsequence/metadata@1.9.3
+ - @0xsequence/migration@1.9.3
+ - @0xsequence/network@1.9.3
+ - @0xsequence/sessions@1.9.3
+ - @0xsequence/signhub@1.9.3
+ - @0xsequence/utils@1.9.3
+ - @0xsequence/wallet@1.9.3
+
+## 1.9.2
+
+### Patch Changes
+
+- network: add xai-sepolia
+- Updated dependencies
+ - @0xsequence/abi@1.9.2
+ - @0xsequence/account@1.9.2
+ - @0xsequence/api@1.9.2
+ - @0xsequence/core@1.9.2
+ - @0xsequence/indexer@1.9.2
+ - @0xsequence/metadata@1.9.2
+ - @0xsequence/migration@1.9.2
+ - @0xsequence/network@1.9.2
+ - @0xsequence/sessions@1.9.2
+ - @0xsequence/signhub@1.9.2
+ - @0xsequence/utils@1.9.2
+ - @0xsequence/wallet@1.9.2
+
+## 1.9.1
+
+### Patch Changes
+
+- analytics fix
+- Updated dependencies
+ - @0xsequence/abi@1.9.1
+ - @0xsequence/account@1.9.1
+ - @0xsequence/api@1.9.1
+ - @0xsequence/core@1.9.1
+ - @0xsequence/indexer@1.9.1
+ - @0xsequence/metadata@1.9.1
+ - @0xsequence/migration@1.9.1
+ - @0xsequence/network@1.9.1
+ - @0xsequence/sessions@1.9.1
+ - @0xsequence/signhub@1.9.1
+ - @0xsequence/utils@1.9.1
+ - @0xsequence/wallet@1.9.1
+
+## 1.9.0
+
+### Minor Changes
+
+- waas release
+
+### Patch Changes
+
+- Updated dependencies
+ - @0xsequence/abi@1.9.0
+ - @0xsequence/account@1.9.0
+ - @0xsequence/api@1.9.0
+ - @0xsequence/core@1.9.0
+ - @0xsequence/indexer@1.9.0
+ - @0xsequence/metadata@1.9.0
+ - @0xsequence/migration@1.9.0
+ - @0xsequence/network@1.9.0
+ - @0xsequence/sessions@1.9.0
+ - @0xsequence/signhub@1.9.0
+ - @0xsequence/utils@1.9.0
+ - @0xsequence/wallet@1.9.0
+
+## 1.8.8
+
+### Patch Changes
+
+- update metadata bindings
+- Updated dependencies
+ - @0xsequence/abi@1.8.8
+ - @0xsequence/account@1.8.8
+ - @0xsequence/api@1.8.8
+ - @0xsequence/core@1.8.8
+ - @0xsequence/indexer@1.8.8
+ - @0xsequence/metadata@1.8.8
+ - @0xsequence/migration@1.8.8
+ - @0xsequence/network@1.8.8
+ - @0xsequence/sessions@1.8.8
+ - @0xsequence/signhub@1.8.8
+ - @0xsequence/utils@1.8.8
+ - @0xsequence/wallet@1.8.8
+
+## 1.8.7
+
+### Patch Changes
+
+- provider: update databeat to 0.9.1
+- Updated dependencies
+ - @0xsequence/abi@1.8.7
+ - @0xsequence/account@1.8.7
+ - @0xsequence/api@1.8.7
+ - @0xsequence/core@1.8.7
+ - @0xsequence/indexer@1.8.7
+ - @0xsequence/metadata@1.8.7
+ - @0xsequence/migration@1.8.7
+ - @0xsequence/network@1.8.7
+ - @0xsequence/sessions@1.8.7
+ - @0xsequence/signhub@1.8.7
+ - @0xsequence/utils@1.8.7
+ - @0xsequence/wallet@1.8.7
+
+## 1.8.6
+
+### Patch Changes
+
+- guard: SignedOwnershipProof
+- Updated dependencies
+ - @0xsequence/abi@1.8.6
+ - @0xsequence/account@1.8.6
+ - @0xsequence/api@1.8.6
+ - @0xsequence/core@1.8.6
+ - @0xsequence/indexer@1.8.6
+ - @0xsequence/metadata@1.8.6
+ - @0xsequence/migration@1.8.6
+ - @0xsequence/network@1.8.6
+ - @0xsequence/sessions@1.8.6
+ - @0xsequence/signhub@1.8.6
+ - @0xsequence/utils@1.8.6
+ - @0xsequence/wallet@1.8.6
+
+## 1.8.5
+
+### Patch Changes
+
+- guard: signOwnershipProof and isSignedOwnershipProof
+- Updated dependencies
+ - @0xsequence/abi@1.8.5
+ - @0xsequence/account@1.8.5
+ - @0xsequence/api@1.8.5
+ - @0xsequence/core@1.8.5
+ - @0xsequence/indexer@1.8.5
+ - @0xsequence/metadata@1.8.5
+ - @0xsequence/migration@1.8.5
+ - @0xsequence/network@1.8.5
+ - @0xsequence/sessions@1.8.5
+ - @0xsequence/signhub@1.8.5
+ - @0xsequence/utils@1.8.5
+ - @0xsequence/wallet@1.8.5
+
+## 1.8.4
+
+### Patch Changes
+
+- network: add homeverse to networks list
+- Updated dependencies
+ - @0xsequence/abi@1.8.4
+ - @0xsequence/account@1.8.4
+ - @0xsequence/api@1.8.4
+ - @0xsequence/core@1.8.4
+ - @0xsequence/indexer@1.8.4
+ - @0xsequence/metadata@1.8.4
+ - @0xsequence/migration@1.8.4
+ - @0xsequence/network@1.8.4
+ - @0xsequence/sessions@1.8.4
+ - @0xsequence/signhub@1.8.4
+ - @0xsequence/utils@1.8.4
+ - @0xsequence/wallet@1.8.4
+
+## 1.8.3
+
+### Patch Changes
+
+- api: introduce basic linked wallet support
+- Updated dependencies
+ - @0xsequence/abi@1.8.3
+ - @0xsequence/account@1.8.3
+ - @0xsequence/api@1.8.3
+ - @0xsequence/core@1.8.3
+ - @0xsequence/indexer@1.8.3
+ - @0xsequence/metadata@1.8.3
+ - @0xsequence/migration@1.8.3
+ - @0xsequence/network@1.8.3
+ - @0xsequence/sessions@1.8.3
+ - @0xsequence/signhub@1.8.3
+ - @0xsequence/utils@1.8.3
+ - @0xsequence/wallet@1.8.3
+
+## 1.8.2
+
+### Patch Changes
+
+- provider: don't initialize analytics unless explicitly requested
+- Updated dependencies
+ - @0xsequence/abi@1.8.2
+ - @0xsequence/account@1.8.2
+ - @0xsequence/api@1.8.2
+ - @0xsequence/core@1.8.2
+ - @0xsequence/indexer@1.8.2
+ - @0xsequence/metadata@1.8.2
+ - @0xsequence/migration@1.8.2
+ - @0xsequence/network@1.8.2
+ - @0xsequence/sessions@1.8.2
+ - @0xsequence/signhub@1.8.2
+ - @0xsequence/utils@1.8.2
+ - @0xsequence/wallet@1.8.2
+
+## 1.8.1
+
+### Patch Changes
+
+- update to analytics provider
+- Updated dependencies
+ - @0xsequence/abi@1.8.1
+ - @0xsequence/account@1.8.1
+ - @0xsequence/api@1.8.1
+ - @0xsequence/core@1.8.1
+ - @0xsequence/indexer@1.8.1
+ - @0xsequence/metadata@1.8.1
+ - @0xsequence/migration@1.8.1
+ - @0xsequence/network@1.8.1
+ - @0xsequence/sessions@1.8.1
+ - @0xsequence/signhub@1.8.1
+ - @0xsequence/utils@1.8.1
+ - @0xsequence/wallet@1.8.1
+
+## 1.8.0
+
+### Minor Changes
+
+- provider: project analytics
+
+### Patch Changes
+
+- Updated dependencies
+ - @0xsequence/abi@1.8.0
+ - @0xsequence/account@1.8.0
+ - @0xsequence/api@1.8.0
+ - @0xsequence/core@1.8.0
+ - @0xsequence/indexer@1.8.0
+ - @0xsequence/metadata@1.8.0
+ - @0xsequence/migration@1.8.0
+ - @0xsequence/network@1.8.0
+ - @0xsequence/sessions@1.8.0
+ - @0xsequence/signhub@1.8.0
+ - @0xsequence/utils@1.8.0
+ - @0xsequence/wallet@1.8.0
+
+## 1.7.2
+
+### Patch Changes
+
+- 0xsequence: ChainId should not be exported as a type
+- account, wallet: fix nonce selection
+- Updated dependencies
+- Updated dependencies
+ - @0xsequence/abi@1.7.2
+ - @0xsequence/account@1.7.2
+ - @0xsequence/api@1.7.2
+ - @0xsequence/core@1.7.2
+ - @0xsequence/indexer@1.7.2
+ - @0xsequence/metadata@1.7.2
+ - @0xsequence/migration@1.7.2
+ - @0xsequence/network@1.7.2
+ - @0xsequence/sessions@1.7.2
+ - @0xsequence/signhub@1.7.2
+ - @0xsequence/utils@1.7.2
+ - @0xsequence/wallet@1.7.2
+
+## 1.7.1
+
+### Patch Changes
+
+- network: add missing avalanche logoURI
+- Updated dependencies
+ - @0xsequence/abi@1.7.1
+ - @0xsequence/account@1.7.1
+ - @0xsequence/api@1.7.1
+ - @0xsequence/core@1.7.1
+ - @0xsequence/indexer@1.7.1
+ - @0xsequence/metadata@1.7.1
+ - @0xsequence/migration@1.7.1
+ - @0xsequence/network@1.7.1
+ - @0xsequence/sessions@1.7.1
+ - @0xsequence/signhub@1.7.1
+ - @0xsequence/utils@1.7.1
+ - @0xsequence/wallet@1.7.1
+
+## 1.7.0
+
+### Minor Changes
+
+- provider: projectAccessKey is now required
+
+### Patch Changes
+
+- network: add NetworkMetadata.logoURI property for all networks
+- Updated dependencies
+- Updated dependencies
+ - @0xsequence/abi@1.7.0
+ - @0xsequence/account@1.7.0
+ - @0xsequence/api@1.7.0
+ - @0xsequence/core@1.7.0
+ - @0xsequence/indexer@1.7.0
+ - @0xsequence/metadata@1.7.0
+ - @0xsequence/migration@1.7.0
+ - @0xsequence/network@1.7.0
+ - @0xsequence/sessions@1.7.0
+ - @0xsequence/signhub@1.7.0
+ - @0xsequence/utils@1.7.0
+ - @0xsequence/wallet@1.7.0
+
+## 1.6.3
+
+### Patch Changes
+
+- network list update
+- Updated dependencies
+ - @0xsequence/abi@1.6.3
+ - @0xsequence/account@1.6.3
+ - @0xsequence/api@1.6.3
+ - @0xsequence/core@1.6.3
+ - @0xsequence/indexer@1.6.3
+ - @0xsequence/metadata@1.6.3
+ - @0xsequence/migration@1.6.3
+ - @0xsequence/network@1.6.3
+ - @0xsequence/sessions@1.6.3
+ - @0xsequence/signhub@1.6.3
+ - @0xsequence/utils@1.6.3
+ - @0xsequence/wallet@1.6.3
+
+## 1.6.2
+
+### Patch Changes
+
+- auth: projectAccessKey option
+- wallet: use 12 bytes for random space
+- Updated dependencies
+- Updated dependencies
+ - @0xsequence/abi@1.6.2
+ - @0xsequence/account@1.6.2
+ - @0xsequence/api@1.6.2
+ - @0xsequence/core@1.6.2
+ - @0xsequence/indexer@1.6.2
+ - @0xsequence/metadata@1.6.2
+ - @0xsequence/migration@1.6.2
+ - @0xsequence/network@1.6.2
+ - @0xsequence/sessions@1.6.2
+ - @0xsequence/signhub@1.6.2
+ - @0xsequence/utils@1.6.2
+ - @0xsequence/wallet@1.6.2
+
+## 1.6.1
+
+### Patch Changes
+
+- core: add simple config from subdigest support
+- core: fix encode tree with subdigest
+- account: implement buildOnChainSignature on Account
+- Updated dependencies
+- Updated dependencies
+- Updated dependencies
+ - @0xsequence/abi@1.6.1
+ - @0xsequence/account@1.6.1
+ - @0xsequence/api@1.6.1
+ - @0xsequence/core@1.6.1
+ - @0xsequence/indexer@1.6.1
+ - @0xsequence/metadata@1.6.1
+ - @0xsequence/migration@1.6.1
+ - @0xsequence/network@1.6.1
+ - @0xsequence/sessions@1.6.1
+ - @0xsequence/signhub@1.6.1
+ - @0xsequence/utils@1.6.1
+ - @0xsequence/wallet@1.6.1
+
+## 1.6.0
+
+### Minor Changes
+
+- account, wallet: parallel transactions by default
+
+### Patch Changes
+
+- provider: emit disconnect on sign out
+- Updated dependencies
+- Updated dependencies
+ - @0xsequence/abi@1.6.0
+ - @0xsequence/account@1.6.0
+ - @0xsequence/api@1.6.0
+ - @0xsequence/core@1.6.0
+ - @0xsequence/indexer@1.6.0
+ - @0xsequence/metadata@1.6.0
+ - @0xsequence/migration@1.6.0
+ - @0xsequence/network@1.6.0
+ - @0xsequence/sessions@1.6.0
+ - @0xsequence/signhub@1.6.0
+ - @0xsequence/utils@1.6.0
+ - @0xsequence/wallet@1.6.0
+
+## 1.5.0
+
+### Minor Changes
+
+- signhub: add 'signing' signer status
+
+### Patch Changes
+
+- auth: Session.open: onAccountAddress callback
+- account: allow empty transaction bundles
+- Updated dependencies
+- Updated dependencies
+- Updated dependencies
+ - @0xsequence/abi@1.5.0
+ - @0xsequence/account@1.5.0
+ - @0xsequence/api@1.5.0
+ - @0xsequence/core@1.5.0
+ - @0xsequence/indexer@1.5.0
+ - @0xsequence/metadata@1.5.0
+ - @0xsequence/migration@1.5.0
+ - @0xsequence/network@1.5.0
+ - @0xsequence/sessions@1.5.0
+ - @0xsequence/signhub@1.5.0
+ - @0xsequence/utils@1.5.0
+ - @0xsequence/wallet@1.5.0
+
+## 1.4.9
+
+### Patch Changes
+
+- rename SequenceMetadataClient to SequenceMetadata
+- Updated dependencies
+ - @0xsequence/abi@1.4.9
+ - @0xsequence/account@1.4.9
+ - @0xsequence/api@1.4.9
+ - @0xsequence/core@1.4.9
+ - @0xsequence/indexer@1.4.9
+ - @0xsequence/metadata@1.4.9
+ - @0xsequence/migration@1.4.9
+ - @0xsequence/network@1.4.9
+ - @0xsequence/sessions@1.4.9
+ - @0xsequence/signhub@1.4.9
+ - @0xsequence/utils@1.4.9
+ - @0xsequence/wallet@1.4.9
+
+## 1.4.8
+
+### Patch Changes
+
+- account: Account.getSigners
+- Updated dependencies
+ - @0xsequence/abi@1.4.8
+ - @0xsequence/account@1.4.8
+ - @0xsequence/api@1.4.8
+ - @0xsequence/core@1.4.8
+ - @0xsequence/indexer@1.4.8
+ - @0xsequence/metadata@1.4.8
+ - @0xsequence/migration@1.4.8
+ - @0xsequence/network@1.4.8
+ - @0xsequence/sessions@1.4.8
+ - @0xsequence/signhub@1.4.8
+ - @0xsequence/utils@1.4.8
+ - @0xsequence/wallet@1.4.8
+
+## 1.4.7
+
+### Patch Changes
+
+- update indexer client bindings
+- Updated dependencies
+ - @0xsequence/abi@1.4.7
+ - @0xsequence/account@1.4.7
+ - @0xsequence/api@1.4.7
+ - @0xsequence/core@1.4.7
+ - @0xsequence/indexer@1.4.7
+ - @0xsequence/metadata@1.4.7
+ - @0xsequence/migration@1.4.7
+ - @0xsequence/network@1.4.7
+ - @0xsequence/sessions@1.4.7
+ - @0xsequence/signhub@1.4.7
+ - @0xsequence/utils@1.4.7
+ - @0xsequence/wallet@1.4.7
+
+## 1.4.6
+
+### Patch Changes
+
+- - add sepolia networks, mark goerli as deprecated
+ - update indexer client bindings
+- Updated dependencies
+ - @0xsequence/abi@1.4.6
+ - @0xsequence/account@1.4.6
+ - @0xsequence/api@1.4.6
+ - @0xsequence/core@1.4.6
+ - @0xsequence/indexer@1.4.6
+ - @0xsequence/metadata@1.4.6
+ - @0xsequence/migration@1.4.6
+ - @0xsequence/network@1.4.6
+ - @0xsequence/sessions@1.4.6
+ - @0xsequence/signhub@1.4.6
+ - @0xsequence/utils@1.4.6
+ - @0xsequence/wallet@1.4.6
+
+## 1.4.5
+
+### Patch Changes
+
+- indexer/metadata: update client bindings
+- auth: selectWallet with new address
+- Updated dependencies
+- Updated dependencies
+ - @0xsequence/abi@1.4.5
+ - @0xsequence/account@1.4.5
+ - @0xsequence/api@1.4.5
+ - @0xsequence/core@1.4.5
+ - @0xsequence/indexer@1.4.5
+ - @0xsequence/metadata@1.4.5
+ - @0xsequence/migration@1.4.5
+ - @0xsequence/network@1.4.5
+ - @0xsequence/sessions@1.4.5
+ - @0xsequence/signhub@1.4.5
+ - @0xsequence/utils@1.4.5
+ - @0xsequence/wallet@1.4.5
+
+## 1.4.4
+
+### Patch Changes
+
+- indexer: update bindings
+- auth: handle jwt expiry
+- Updated dependencies
+- Updated dependencies
+ - @0xsequence/abi@1.4.4
+ - @0xsequence/account@1.4.4
+ - @0xsequence/api@1.4.4
+ - @0xsequence/core@1.4.4
+ - @0xsequence/indexer@1.4.4
+ - @0xsequence/metadata@1.4.4
+ - @0xsequence/migration@1.4.4
+ - @0xsequence/network@1.4.4
+ - @0xsequence/sessions@1.4.4
+ - @0xsequence/signhub@1.4.4
+ - @0xsequence/utils@1.4.4
+ - @0xsequence/wallet@1.4.4
+
+## 1.4.3
+
+### Patch Changes
+
+- guard: return active status from GuardSigner.getAuthMethods
+- Updated dependencies
+ - @0xsequence/abi@1.4.3
+ - @0xsequence/account@1.4.3
+ - @0xsequence/api@1.4.3
+ - @0xsequence/core@1.4.3
+ - @0xsequence/indexer@1.4.3
+ - @0xsequence/metadata@1.4.3
+ - @0xsequence/migration@1.4.3
+ - @0xsequence/network@1.4.3
+ - @0xsequence/sessions@1.4.3
+ - @0xsequence/signhub@1.4.3
+ - @0xsequence/utils@1.4.3
+ - @0xsequence/wallet@1.4.3
+
+## 1.4.2
+
+### Patch Changes
+
+- guard: update bindings
+- Updated dependencies
+ - @0xsequence/abi@1.4.2
+ - @0xsequence/account@1.4.2
+ - @0xsequence/api@1.4.2
+ - @0xsequence/core@1.4.2
+ - @0xsequence/indexer@1.4.2
+ - @0xsequence/metadata@1.4.2
+ - @0xsequence/migration@1.4.2
+ - @0xsequence/network@1.4.2
+ - @0xsequence/sessions@1.4.2
+ - @0xsequence/signhub@1.4.2
+ - @0xsequence/utils@1.4.2
+ - @0xsequence/wallet@1.4.2
+
+## 1.4.1
+
+### Patch Changes
+
+- network: remove unused networks
+- signhub: orchestrator interface
+- guard: auth methods interface
+- guard: update bindings for pin and totp
+- guard: no more retry logic
+- Updated dependencies
+- Updated dependencies
+- Updated dependencies
+- Updated dependencies
+- Updated dependencies
+ - @0xsequence/abi@1.4.1
+ - @0xsequence/account@1.4.1
+ - @0xsequence/api@1.4.1
+ - @0xsequence/core@1.4.1
+ - @0xsequence/indexer@1.4.1
+ - @0xsequence/metadata@1.4.1
+ - @0xsequence/migration@1.4.1
+ - @0xsequence/network@1.4.1
+ - @0xsequence/sessions@1.4.1
+ - @0xsequence/signhub@1.4.1
+ - @0xsequence/utils@1.4.1
+ - @0xsequence/wallet@1.4.1
+
+## 1.4.0
+
+### Minor Changes
+
+- project access key support
+
+### Patch Changes
+
+- Updated dependencies
+ - @0xsequence/abi@1.4.0
+ - @0xsequence/account@1.4.0
+ - @0xsequence/api@1.4.0
+ - @0xsequence/core@1.4.0
+ - @0xsequence/indexer@1.4.0
+ - @0xsequence/metadata@1.4.0
+ - @0xsequence/migration@1.4.0
+ - @0xsequence/network@1.4.0
+ - @0xsequence/sessions@1.4.0
+ - @0xsequence/signhub@1.4.0
+ - @0xsequence/utils@1.4.0
+ - @0xsequence/wallet@1.4.0
+
+## 1.3.0
+
+### Minor Changes
+
+- signhub: account children
+
+### Patch Changes
+
+- guard: do not throw when building deploy transaction
+- network: snowtrace.io -> subnets.avax.network/c-chain
+- Updated dependencies
+- Updated dependencies
+- Updated dependencies
+ - @0xsequence/abi@1.3.0
+ - @0xsequence/account@1.3.0
+ - @0xsequence/api@1.3.0
+ - @0xsequence/core@1.3.0
+ - @0xsequence/indexer@1.3.0
+ - @0xsequence/metadata@1.3.0
+ - @0xsequence/migration@1.3.0
+ - @0xsequence/network@1.3.0
+ - @0xsequence/sessions@1.3.0
+ - @0xsequence/signhub@1.3.0
+ - @0xsequence/utils@1.3.0
+ - @0xsequence/wallet@1.3.0
+
+## 1.2.9
+
+### Patch Changes
+
+- account: AccountSigner.sendTransaction simulateForFeeOptions
+- relayer: update bindings
+- Updated dependencies
+- Updated dependencies
+ - @0xsequence/abi@1.2.9
+ - @0xsequence/account@1.2.9
+ - @0xsequence/api@1.2.9
+ - @0xsequence/core@1.2.9
+ - @0xsequence/indexer@1.2.9
+ - @0xsequence/metadata@1.2.9
+ - @0xsequence/migration@1.2.9
+ - @0xsequence/network@1.2.9
+ - @0xsequence/sessions@1.2.9
+ - @0xsequence/signhub@1.2.9
+ - @0xsequence/utils@1.2.9
+ - @0xsequence/wallet@1.2.9
+
+## 1.2.8
+
+### Patch Changes
+
+- rename X-Sequence-Token-Key header to X-Access-Key
+- Updated dependencies
+ - @0xsequence/abi@1.2.8
+ - @0xsequence/account@1.2.8
+ - @0xsequence/api@1.2.8
+ - @0xsequence/core@1.2.8
+ - @0xsequence/indexer@1.2.8
+ - @0xsequence/metadata@1.2.8
+ - @0xsequence/migration@1.2.8
+ - @0xsequence/network@1.2.8
+ - @0xsequence/sessions@1.2.8
+ - @0xsequence/signhub@1.2.8
+ - @0xsequence/utils@1.2.8
+ - @0xsequence/wallet@1.2.8
+
+## 1.2.7
+
+### Patch Changes
+
+- add x-sequence-token-key to clients
+- Updated dependencies
+ - @0xsequence/abi@1.2.7
+ - @0xsequence/account@1.2.7
+ - @0xsequence/api@1.2.7
+ - @0xsequence/core@1.2.7
+ - @0xsequence/indexer@1.2.7
+ - @0xsequence/metadata@1.2.7
+ - @0xsequence/migration@1.2.7
+ - @0xsequence/network@1.2.7
+ - @0xsequence/sessions@1.2.7
+ - @0xsequence/signhub@1.2.7
+ - @0xsequence/utils@1.2.7
+ - @0xsequence/wallet@1.2.7
+
+## 1.2.6
+
+### Patch Changes
+
+- Fix bind multicall provider
+- Updated dependencies
+ - @0xsequence/abi@1.2.6
+ - @0xsequence/account@1.2.6
+ - @0xsequence/api@1.2.6
+ - @0xsequence/core@1.2.6
+ - @0xsequence/indexer@1.2.6
+ - @0xsequence/metadata@1.2.6
+ - @0xsequence/migration@1.2.6
+ - @0xsequence/network@1.2.6
+ - @0xsequence/sessions@1.2.6
+ - @0xsequence/signhub@1.2.6
+ - @0xsequence/utils@1.2.6
+ - @0xsequence/wallet@1.2.6
+
+## 1.2.5
+
+### Patch Changes
+
+- Multicall default configuration fixes
+- Updated dependencies
+ - @0xsequence/abi@1.2.5
+ - @0xsequence/account@1.2.5
+ - @0xsequence/api@1.2.5
+ - @0xsequence/core@1.2.5
+ - @0xsequence/indexer@1.2.5
+ - @0xsequence/metadata@1.2.5
+ - @0xsequence/migration@1.2.5
+ - @0xsequence/network@1.2.5
+ - @0xsequence/sessions@1.2.5
+ - @0xsequence/signhub@1.2.5
+ - @0xsequence/utils@1.2.5
+ - @0xsequence/wallet@1.2.5
+
+## 1.2.4
+
+### Patch Changes
+
+- provider: Adding missing payment provider types to PaymentProviderOption
+- provider: WalletRequestHandler.notifyChainChanged
+- Updated dependencies
+- Updated dependencies
+ - @0xsequence/abi@1.2.4
+ - @0xsequence/account@1.2.4
+ - @0xsequence/api@1.2.4
+ - @0xsequence/core@1.2.4
+ - @0xsequence/indexer@1.2.4
+ - @0xsequence/metadata@1.2.4
+ - @0xsequence/migration@1.2.4
+ - @0xsequence/network@1.2.4
+ - @0xsequence/sessions@1.2.4
+ - @0xsequence/signhub@1.2.4
+ - @0xsequence/utils@1.2.4
+ - @0xsequence/wallet@1.2.4
+
+## 1.2.3
+
+### Patch Changes
+
+- auth, provider: connect to accept optional authorizeNonce
+- Updated dependencies
+ - @0xsequence/abi@1.2.3
+ - @0xsequence/account@1.2.3
+ - @0xsequence/api@1.2.3
+ - @0xsequence/core@1.2.3
+ - @0xsequence/indexer@1.2.3
+ - @0xsequence/metadata@1.2.3
+ - @0xsequence/migration@1.2.3
+ - @0xsequence/network@1.2.3
+ - @0xsequence/sessions@1.2.3
+ - @0xsequence/signhub@1.2.3
+ - @0xsequence/utils@1.2.3
+ - @0xsequence/wallet@1.2.3
+
+## 1.2.2
+
+### Patch Changes
+
+- provider: allow createContract calls
+- core: check for explicit zero address in contract deployments
+- Updated dependencies
+- Updated dependencies
+ - @0xsequence/abi@1.2.2
+ - @0xsequence/account@1.2.2
+ - @0xsequence/api@1.2.2
+ - @0xsequence/core@1.2.2
+ - @0xsequence/indexer@1.2.2
+ - @0xsequence/metadata@1.2.2
+ - @0xsequence/migration@1.2.2
+ - @0xsequence/network@1.2.2
+ - @0xsequence/sessions@1.2.2
+ - @0xsequence/signhub@1.2.2
+ - @0xsequence/utils@1.2.2
+ - @0xsequence/wallet@1.2.2
+
+## 1.2.1
+
+### Patch Changes
+
+- auth: use sequence api chain id as reference chain id if available
+- Updated dependencies
+ - @0xsequence/abi@1.2.1
+ - @0xsequence/account@1.2.1
+ - @0xsequence/api@1.2.1
+ - @0xsequence/core@1.2.1
+ - @0xsequence/indexer@1.2.1
+ - @0xsequence/metadata@1.2.1
+ - @0xsequence/migration@1.2.1
+ - @0xsequence/network@1.2.1
+ - @0xsequence/sessions@1.2.1
+ - @0xsequence/signhub@1.2.1
+ - @0xsequence/utils@1.2.1
+ - @0xsequence/wallet@1.2.1
+
+## 1.2.0
+
+### Minor Changes
+
+- split services from session, better local support
+
+### Patch Changes
+
+- Updated dependencies
+ - @0xsequence/abi@1.2.0
+ - @0xsequence/account@1.2.0
+ - @0xsequence/api@1.2.0
+ - @0xsequence/core@1.2.0
+ - @0xsequence/indexer@1.2.0
+ - @0xsequence/metadata@1.2.0
+ - @0xsequence/migration@1.2.0
+ - @0xsequence/network@1.2.0
+ - @0xsequence/sessions@1.2.0
+ - @0xsequence/signhub@1.2.0
+ - @0xsequence/utils@1.2.0
+ - @0xsequence/wallet@1.2.0
+
+## 1.1.15
+
+### Patch Changes
+
+- guard: remove error filtering
+- Updated dependencies
+ - @0xsequence/abi@1.1.15
+ - @0xsequence/account@1.1.15
+ - @0xsequence/api@1.1.15
+ - @0xsequence/core@1.1.15
+ - @0xsequence/indexer@1.1.15
+ - @0xsequence/metadata@1.1.15
+ - @0xsequence/migration@1.1.15
+ - @0xsequence/network@1.1.15
+ - @0xsequence/sessions@1.1.15
+ - @0xsequence/signhub@1.1.15
+ - @0xsequence/utils@1.1.15
+ - @0xsequence/wallet@1.1.15
+
+## 1.1.14
+
+### Patch Changes
+
+- guard: add GuardSigner.onError
+- Updated dependencies
+ - @0xsequence/abi@1.1.14
+ - @0xsequence/account@1.1.14
+ - @0xsequence/api@1.1.14
+ - @0xsequence/core@1.1.14
+ - @0xsequence/indexer@1.1.14
+ - @0xsequence/metadata@1.1.14
+ - @0xsequence/migration@1.1.14
+ - @0xsequence/network@1.1.14
+ - @0xsequence/sessions@1.1.14
+ - @0xsequence/signhub@1.1.14
+ - @0xsequence/utils@1.1.14
+ - @0xsequence/wallet@1.1.14
+
+## 1.1.13
+
+### Patch Changes
+
+- provider: pass client version with connect options
+- provider: removing large from BannerSize
+- Updated dependencies
+- Updated dependencies
+ - @0xsequence/abi@1.1.13
+ - @0xsequence/account@1.1.13
+ - @0xsequence/api@1.1.13
+ - @0xsequence/core@1.1.13
+ - @0xsequence/indexer@1.1.13
+ - @0xsequence/metadata@1.1.13
+ - @0xsequence/migration@1.1.13
+ - @0xsequence/network@1.1.13
+ - @0xsequence/sessions@1.1.13
+ - @0xsequence/signhub@1.1.13
+ - @0xsequence/utils@1.1.13
+ - @0xsequence/wallet@1.1.13
+
+## 1.1.12
+
+### Patch Changes
+
+- provider: adding bannerSize to ConnectOptions
+- Updated dependencies
+ - @0xsequence/abi@1.1.12
+ - @0xsequence/account@1.1.12
+ - @0xsequence/api@1.1.12
+ - @0xsequence/core@1.1.12
+ - @0xsequence/indexer@1.1.12
+ - @0xsequence/metadata@1.1.12
+ - @0xsequence/migration@1.1.12
+ - @0xsequence/network@1.1.12
+ - @0xsequence/sessions@1.1.12
+ - @0xsequence/signhub@1.1.12
+ - @0xsequence/utils@1.1.12
+ - @0xsequence/wallet@1.1.12
+
+## 1.1.11
+
+### Patch Changes
+
+- add homeverse configs
+- Updated dependencies
+ - @0xsequence/abi@1.1.11
+ - @0xsequence/account@1.1.11
+ - @0xsequence/api@1.1.11
+ - @0xsequence/core@1.1.11
+ - @0xsequence/indexer@1.1.11
+ - @0xsequence/metadata@1.1.11
+ - @0xsequence/migration@1.1.11
+ - @0xsequence/network@1.1.11
+ - @0xsequence/sessions@1.1.11
+ - @0xsequence/signhub@1.1.11
+ - @0xsequence/utils@1.1.11
+ - @0xsequence/wallet@1.1.11
+
+## 1.1.10
+
+### Patch Changes
+
+- handle default EIP6492 on send
+- Updated dependencies
+ - @0xsequence/abi@1.1.10
+ - @0xsequence/account@1.1.10
+ - @0xsequence/api@1.1.10
+ - @0xsequence/core@1.1.10
+ - @0xsequence/indexer@1.1.10
+ - @0xsequence/metadata@1.1.10
+ - @0xsequence/migration@1.1.10
+ - @0xsequence/network@1.1.10
+ - @0xsequence/sessions@1.1.10
+ - @0xsequence/signhub@1.1.10
+ - @0xsequence/utils@1.1.10
+ - @0xsequence/wallet@1.1.10
+
+## 1.1.9
+
+### Patch Changes
+
+- Custom default EIP6492 on client
+- Updated dependencies
+ - @0xsequence/abi@1.1.9
+ - @0xsequence/account@1.1.9
+ - @0xsequence/api@1.1.9
+ - @0xsequence/core@1.1.9
+ - @0xsequence/indexer@1.1.9
+ - @0xsequence/metadata@1.1.9
+ - @0xsequence/migration@1.1.9
+ - @0xsequence/network@1.1.9
+ - @0xsequence/sessions@1.1.9
+ - @0xsequence/signhub@1.1.9
+ - @0xsequence/utils@1.1.9
+ - @0xsequence/wallet@1.1.9
+
+## 1.1.8
+
+### Patch Changes
+
+- metadata: searchMetadata: add types filter
+- Updated dependencies
+ - @0xsequence/abi@1.1.8
+ - @0xsequence/account@1.1.8
+ - @0xsequence/api@1.1.8
+ - @0xsequence/core@1.1.8
+ - @0xsequence/indexer@1.1.8
+ - @0xsequence/metadata@1.1.8
+ - @0xsequence/migration@1.1.8
+ - @0xsequence/network@1.1.8
+ - @0xsequence/sessions@1.1.8
+ - @0xsequence/signhub@1.1.8
+ - @0xsequence/utils@1.1.8
+ - @0xsequence/wallet@1.1.8
+
+## 1.1.7
+
+### Patch Changes
+
+- adding signInWith connect settings option to allow dapps to automatically login their users with a certain provider optimizing the normal authentication flow
+- Updated dependencies
+ - @0xsequence/abi@1.1.7
+ - @0xsequence/account@1.1.7
+ - @0xsequence/api@1.1.7
+ - @0xsequence/core@1.1.7
+ - @0xsequence/indexer@1.1.7
+ - @0xsequence/metadata@1.1.7
+ - @0xsequence/migration@1.1.7
+ - @0xsequence/network@1.1.7
+ - @0xsequence/sessions@1.1.7
+ - @0xsequence/signhub@1.1.7
+ - @0xsequence/utils@1.1.7
+ - @0xsequence/wallet@1.1.7
+
+## 1.1.6
+
+### Patch Changes
+
+- metadata: searchMetadata: add chainID and excludeTokenMetadata filters
+- Updated dependencies
+ - @0xsequence/abi@1.1.6
+ - @0xsequence/account@1.1.6
+ - @0xsequence/api@1.1.6
+ - @0xsequence/core@1.1.6
+ - @0xsequence/indexer@1.1.6
+ - @0xsequence/metadata@1.1.6
+ - @0xsequence/migration@1.1.6
+ - @0xsequence/network@1.1.6
+ - @0xsequence/sessions@1.1.6
+ - @0xsequence/signhub@1.1.6
+ - @0xsequence/utils@1.1.6
+ - @0xsequence/wallet@1.1.6
+
+## 1.1.5
+
+### Patch Changes
+
+- account: re-compute meta-transaction id for wallet deployment transactions
+- Updated dependencies
+ - @0xsequence/abi@1.1.5
+ - @0xsequence/account@1.1.5
+ - @0xsequence/api@1.1.5
+ - @0xsequence/core@1.1.5
+ - @0xsequence/indexer@1.1.5
+ - @0xsequence/metadata@1.1.5
+ - @0xsequence/migration@1.1.5
+ - @0xsequence/network@1.1.5
+ - @0xsequence/sessions@1.1.5
+ - @0xsequence/signhub@1.1.5
+ - @0xsequence/utils@1.1.5
+ - @0xsequence/wallet@1.1.5
+
+## 1.1.4
+
+### Patch Changes
+
+- network: rename base-mainnet to base
+- provider: override isDefaultChain with ConnectOptions.networkId if provided
+- Updated dependencies
+- Updated dependencies
+ - @0xsequence/abi@1.1.4
+ - @0xsequence/account@1.1.4
+ - @0xsequence/api@1.1.4
+ - @0xsequence/core@1.1.4
+ - @0xsequence/indexer@1.1.4
+ - @0xsequence/metadata@1.1.4
+ - @0xsequence/migration@1.1.4
+ - @0xsequence/network@1.1.4
+ - @0xsequence/sessions@1.1.4
+ - @0xsequence/signhub@1.1.4
+ - @0xsequence/utils@1.1.4
+ - @0xsequence/wallet@1.1.4
+
+## 1.1.3
+
+### Patch Changes
+
+- provider: use network id from transport session
+- provider: sign authorization using ConnectOptions.networkId if provided
+- Updated dependencies
+- Updated dependencies
+ - @0xsequence/abi@1.1.3
+ - @0xsequence/account@1.1.3
+ - @0xsequence/api@1.1.3
+ - @0xsequence/core@1.1.3
+ - @0xsequence/indexer@1.1.3
+ - @0xsequence/metadata@1.1.3
+ - @0xsequence/migration@1.1.3
+ - @0xsequence/network@1.1.3
+ - @0xsequence/sessions@1.1.3
+ - @0xsequence/signhub@1.1.3
+ - @0xsequence/utils@1.1.3
+ - @0xsequence/wallet@1.1.3
+
+## 1.1.2
+
+### Patch Changes
+
+- provider: jsonrpc chain id fixes
+- Updated dependencies
+ - @0xsequence/abi@1.1.2
+ - @0xsequence/account@1.1.2
+ - @0xsequence/api@1.1.2
+ - @0xsequence/core@1.1.2
+ - @0xsequence/indexer@1.1.2
+ - @0xsequence/metadata@1.1.2
+ - @0xsequence/migration@1.1.2
+ - @0xsequence/network@1.1.2
+ - @0xsequence/sessions@1.1.2
+ - @0xsequence/signhub@1.1.2
+ - @0xsequence/utils@1.1.2
+ - @0xsequence/wallet@1.1.2
+
+## 1.1.1
+
+### Patch Changes
+
+- network: add base mainnet and sepolia
+- provider: reject toxic transaction requests
+- Updated dependencies
+- Updated dependencies
+ - @0xsequence/abi@1.1.1
+ - @0xsequence/account@1.1.1
+ - @0xsequence/api@1.1.1
+ - @0xsequence/core@1.1.1
+ - @0xsequence/indexer@1.1.1
+ - @0xsequence/metadata@1.1.1
+ - @0xsequence/migration@1.1.1
+ - @0xsequence/network@1.1.1
+ - @0xsequence/sessions@1.1.1
+ - @0xsequence/signhub@1.1.1
+ - @0xsequence/utils@1.1.1
+ - @0xsequence/wallet@1.1.1
+
+## 1.1.0
+
+### Minor Changes
+
+- Refactor dapp facing provider
+
+### Patch Changes
+
+- Updated dependencies
+ - @0xsequence/abi@1.1.0
+ - @0xsequence/account@1.1.0
+ - @0xsequence/api@1.1.0
+ - @0xsequence/core@1.1.0
+ - @0xsequence/indexer@1.1.0
+ - @0xsequence/metadata@1.1.0
+ - @0xsequence/migration@1.1.0
+ - @0xsequence/network@1.1.0
+ - @0xsequence/sessions@1.1.0
+ - @0xsequence/signhub@1.1.0
+ - @0xsequence/utils@1.1.0
+ - @0xsequence/wallet@1.1.0
+
+## 1.0.5
+
+### Patch Changes
+
+- network: export network constants
+- guard: use the correct global for fetch
+- network: nova-explorer.arbitrum.io -> nova.arbiscan.io
+- Updated dependencies
+- Updated dependencies
+- Updated dependencies
+ - @0xsequence/abi@1.0.5
+ - @0xsequence/account@1.0.5
+ - @0xsequence/api@1.0.5
+ - @0xsequence/core@1.0.5
+ - @0xsequence/indexer@1.0.5
+ - @0xsequence/metadata@1.0.5
+ - @0xsequence/migration@1.0.5
+ - @0xsequence/network@1.0.5
+ - @0xsequence/sessions@1.0.5
+ - @0xsequence/signhub@1.0.5
+ - @0xsequence/utils@1.0.5
+ - @0xsequence/wallet@1.0.5
+
+## 1.0.4
+
+### Patch Changes
+
+- provider: accept name or number for networkId
+- Updated dependencies
+ - @0xsequence/abi@1.0.4
+ - @0xsequence/account@1.0.4
+ - @0xsequence/api@1.0.4
+ - @0xsequence/core@1.0.4
+ - @0xsequence/indexer@1.0.4
+ - @0xsequence/metadata@1.0.4
+ - @0xsequence/migration@1.0.4
+ - @0xsequence/network@1.0.4
+ - @0xsequence/sessions@1.0.4
+ - @0xsequence/signhub@1.0.4
+ - @0xsequence/utils@1.0.4
+ - @0xsequence/wallet@1.0.4
+
+## 1.0.3
+
+### Patch Changes
+
+- Simpler isValidSignature helpers
+- Updated dependencies
+ - @0xsequence/abi@1.0.3
+ - @0xsequence/account@1.0.3
+ - @0xsequence/api@1.0.3
+ - @0xsequence/core@1.0.3
+ - @0xsequence/indexer@1.0.3
+ - @0xsequence/metadata@1.0.3
+ - @0xsequence/migration@1.0.3
+ - @0xsequence/network@1.0.3
+ - @0xsequence/sessions@1.0.3
+ - @0xsequence/signhub@1.0.3
+ - @0xsequence/utils@1.0.3
+ - @0xsequence/wallet@1.0.3
+
+## 1.0.2
+
+### Patch Changes
+
+- add extra signature validation utils methods
+- Updated dependencies
+ - @0xsequence/abi@1.0.2
+ - @0xsequence/account@1.0.2
+ - @0xsequence/api@1.0.2
+ - @0xsequence/core@1.0.2
+ - @0xsequence/indexer@1.0.2
+ - @0xsequence/metadata@1.0.2
+ - @0xsequence/migration@1.0.2
+ - @0xsequence/network@1.0.2
+ - @0xsequence/sessions@1.0.2
+ - @0xsequence/signhub@1.0.2
+ - @0xsequence/utils@1.0.2
+ - @0xsequence/wallet@1.0.2
+
+## 1.0.1
+
+### Patch Changes
+
+- add homeverse testnet
+- Updated dependencies
+ - @0xsequence/abi@1.0.1
+ - @0xsequence/account@1.0.1
+ - @0xsequence/api@1.0.1
+ - @0xsequence/core@1.0.1
+ - @0xsequence/indexer@1.0.1
+ - @0xsequence/metadata@1.0.1
+ - @0xsequence/migration@1.0.1
+ - @0xsequence/network@1.0.1
+ - @0xsequence/sessions@1.0.1
+ - @0xsequence/signhub@1.0.1
+ - @0xsequence/utils@1.0.1
+ - @0xsequence/wallet@1.0.1
+
+## 1.0.0
+
+### Major Changes
+
+- https://sequence.xyz/blog/sequence-wallet-light-state-sync-full-merkle-wallets
+
+### Patch Changes
+
+- Updated dependencies
+ - @0xsequence/abi@1.0.0
+ - @0xsequence/account@1.0.0
+ - @0xsequence/api@1.0.0
+ - @0xsequence/core@1.0.0
+ - @0xsequence/indexer@1.0.0
+ - @0xsequence/metadata@1.0.0
+ - @0xsequence/migration@1.0.0
+ - @0xsequence/network@1.0.0
+ - @0xsequence/sessions@1.0.0
+ - @0xsequence/signhub@1.0.0
+ - @0xsequence/utils@1.0.0
+ - @0xsequence/wallet@1.0.0
+
+## 0.43.34
+
+### Patch Changes
+
+- auth: no jwt for indexer
+- Updated dependencies
+ - @0xsequence/abi@0.43.34
+ - @0xsequence/api@0.43.34
+ - @0xsequence/config@0.43.34
+ - @0xsequence/indexer@0.43.34
+ - @0xsequence/metadata@0.43.34
+ - @0xsequence/network@0.43.34
+ - @0xsequence/provider@0.43.34
+ - @0xsequence/utils@0.43.34
+ - @0xsequence/wallet@0.43.34
+
+## 0.43.33
+
+### Patch Changes
+
+- Adding onConnectOptionsChange handler to WalletRequestHandler
+- Updated dependencies
+ - @0xsequence/abi@0.43.33
+ - @0xsequence/api@0.43.33
+ - @0xsequence/config@0.43.33
+ - @0xsequence/indexer@0.43.33
+ - @0xsequence/metadata@0.43.33
+ - @0xsequence/network@0.43.33
+ - @0xsequence/provider@0.43.33
+ - @0xsequence/utils@0.43.33
+ - @0xsequence/wallet@0.43.33
+
+## 0.43.32
+
+### Patch Changes
+
+- add Base Goerli network
+- Updated dependencies
+ - @0xsequence/abi@0.43.32
+ - @0xsequence/api@0.43.32
+ - @0xsequence/config@0.43.32
+ - @0xsequence/indexer@0.43.32
+ - @0xsequence/metadata@0.43.32
+ - @0xsequence/network@0.43.32
+ - @0xsequence/provider@0.43.32
+ - @0xsequence/utils@0.43.32
+ - @0xsequence/wallet@0.43.32
+
+## 0.43.31
+
+### Patch Changes
+
+- remove AuxDataProvider, add promptSignInConnect
+- Updated dependencies
+ - @0xsequence/abi@0.43.31
+ - @0xsequence/api@0.43.31
+ - @0xsequence/config@0.43.31
+ - @0xsequence/indexer@0.43.31
+ - @0xsequence/metadata@0.43.31
+ - @0xsequence/network@0.43.31
+ - @0xsequence/provider@0.43.31
+ - @0xsequence/utils@0.43.31
+ - @0xsequence/wallet@0.43.31
+
+## 0.43.30
+
+### Patch Changes
+
+- add arbitrum goerli testnet
+- Updated dependencies
+ - @0xsequence/abi@0.43.30
+ - @0xsequence/api@0.43.30
+ - @0xsequence/config@0.43.30
+ - @0xsequence/indexer@0.43.30
+ - @0xsequence/metadata@0.43.30
+ - @0xsequence/network@0.43.30
+ - @0xsequence/provider@0.43.30
+ - @0xsequence/utils@0.43.30
+ - @0xsequence/wallet@0.43.30
+
+## 0.43.29
+
+### Patch Changes
+
+- provider: check availability of window object
+- Updated dependencies
+ - @0xsequence/abi@0.43.29
+ - @0xsequence/api@0.43.29
+ - @0xsequence/config@0.43.29
+ - @0xsequence/indexer@0.43.29
+ - @0xsequence/metadata@0.43.29
+ - @0xsequence/network@0.43.29
+ - @0xsequence/provider@0.43.29
+ - @0xsequence/utils@0.43.29
+ - @0xsequence/wallet@0.43.29
+
+## 0.43.28
+
+### Patch Changes
+
+- update api bindings
+- Updated dependencies
+ - @0xsequence/abi@0.43.28
+ - @0xsequence/api@0.43.28
+ - @0xsequence/config@0.43.28
+ - @0xsequence/indexer@0.43.28
+ - @0xsequence/metadata@0.43.28
+ - @0xsequence/network@0.43.28
+ - @0xsequence/provider@0.43.28
+ - @0xsequence/utils@0.43.28
+ - @0xsequence/wallet@0.43.28
+
+## 0.43.27
+
+### Patch Changes
+
+- Add rpc is sequence method
+- Updated dependencies
+ - @0xsequence/abi@0.43.27
+ - @0xsequence/api@0.43.27
+ - @0xsequence/config@0.43.27
+ - @0xsequence/indexer@0.43.27
+ - @0xsequence/metadata@0.43.27
+ - @0xsequence/network@0.43.27
+ - @0xsequence/provider@0.43.27
+ - @0xsequence/utils@0.43.27
+ - @0xsequence/wallet@0.43.27
+
+## 0.43.26
+
+### Patch Changes
+
+- add zkevm url to enum
+- Updated dependencies
+ - @0xsequence/abi@0.43.26
+ - @0xsequence/api@0.43.26
+ - @0xsequence/config@0.43.26
+ - @0xsequence/indexer@0.43.26
+ - @0xsequence/metadata@0.43.26
+ - @0xsequence/network@0.43.26
+ - @0xsequence/provider@0.43.26
+ - @0xsequence/utils@0.43.26
+ - @0xsequence/wallet@0.43.26
+
+## 0.43.25
+
+### Patch Changes
+
+- added polygon zkevm to mainnet networks
+- Updated dependencies
+ - @0xsequence/abi@0.43.25
+ - @0xsequence/api@0.43.25
+ - @0xsequence/config@0.43.25
+ - @0xsequence/indexer@0.43.25
+ - @0xsequence/metadata@0.43.25
+ - @0xsequence/network@0.43.25
+ - @0xsequence/provider@0.43.25
+ - @0xsequence/utils@0.43.25
+ - @0xsequence/wallet@0.43.25
+
+## 0.43.24
+
+### Patch Changes
+
+- name change from zkevm to polygon-zkevm
+- Updated dependencies
+ - @0xsequence/abi@0.43.24
+ - @0xsequence/api@0.43.24
+ - @0xsequence/config@0.43.24
+ - @0xsequence/indexer@0.43.24
+ - @0xsequence/metadata@0.43.24
+ - @0xsequence/network@0.43.24
+ - @0xsequence/provider@0.43.24
+ - @0xsequence/utils@0.43.24
+ - @0xsequence/wallet@0.43.24
+
+## 0.43.23
+
+### Patch Changes
+
+- update zkEVM name to Polygon zkEVM
+- Updated dependencies
+ - @0xsequence/abi@0.43.23
+ - @0xsequence/api@0.43.23
+ - @0xsequence/config@0.43.23
+ - @0xsequence/indexer@0.43.23
+ - @0xsequence/metadata@0.43.23
+ - @0xsequence/network@0.43.23
+ - @0xsequence/provider@0.43.23
+ - @0xsequence/utils@0.43.23
+ - @0xsequence/wallet@0.43.23
+
+## 0.43.22
+
+### Patch Changes
+
+- add zkevm chain
+- Updated dependencies
+ - @0xsequence/abi@0.43.22
+ - @0xsequence/api@0.43.22
+ - @0xsequence/config@0.43.22
+ - @0xsequence/indexer@0.43.22
+ - @0xsequence/metadata@0.43.22
+ - @0xsequence/network@0.43.22
+ - @0xsequence/provider@0.43.22
+ - @0xsequence/utils@0.43.22
+ - @0xsequence/wallet@0.43.22
+
+## 0.43.21
+
+### Patch Changes
+
+- api: update client bindings
+- Updated dependencies
+ - @0xsequence/abi@0.43.21
+ - @0xsequence/api@0.43.21
+ - @0xsequence/config@0.43.21
+ - @0xsequence/indexer@0.43.21
+ - @0xsequence/metadata@0.43.21
+ - @0xsequence/network@0.43.21
+ - @0xsequence/provider@0.43.21
+ - @0xsequence/utils@0.43.21
+ - @0xsequence/wallet@0.43.21
+
+## 0.43.20
+
+### Patch Changes
+
+- indexer: update bindings
+- Updated dependencies
+ - @0xsequence/abi@0.43.20
+ - @0xsequence/api@0.43.20
+ - @0xsequence/config@0.43.20
+ - @0xsequence/indexer@0.43.20
+ - @0xsequence/metadata@0.43.20
+ - @0xsequence/network@0.43.20
+ - @0xsequence/provider@0.43.20
+ - @0xsequence/utils@0.43.20
+ - @0xsequence/wallet@0.43.20
+
+## 0.43.19
+
+### Patch Changes
+
+- session proof update
+- Updated dependencies
+ - @0xsequence/abi@0.43.19
+ - @0xsequence/api@0.43.19
+ - @0xsequence/config@0.43.19
+ - @0xsequence/indexer@0.43.19
+ - @0xsequence/metadata@0.43.19
+ - @0xsequence/network@0.43.19
+ - @0xsequence/provider@0.43.19
+ - @0xsequence/utils@0.43.19
+ - @0xsequence/wallet@0.43.19
+
+## 0.43.18
+
+### Patch Changes
+
+- rpc client global check, hardening
+- Updated dependencies
+ - @0xsequence/abi@0.43.18
+ - @0xsequence/api@0.43.18
+ - @0xsequence/config@0.43.18
+ - @0xsequence/indexer@0.43.18
+ - @0xsequence/metadata@0.43.18
+ - @0xsequence/network@0.43.18
+ - @0xsequence/provider@0.43.18
+ - @0xsequence/utils@0.43.18
+ - @0xsequence/wallet@0.43.18
+
+## 0.43.17
+
+### Patch Changes
+
+- rpc clients, check of 'global' is defined
+- Updated dependencies
+ - @0xsequence/abi@0.43.17
+ - @0xsequence/api@0.43.17
+ - @0xsequence/config@0.43.17
+ - @0xsequence/indexer@0.43.17
+ - @0xsequence/metadata@0.43.17
+ - @0xsequence/network@0.43.17
+ - @0xsequence/provider@0.43.17
+ - @0xsequence/utils@0.43.17
+ - @0xsequence/wallet@0.43.17
+
+## 0.43.16
+
+### Patch Changes
+
+- ethers peerDep to v5, update rpc client global use
+- Updated dependencies
+ - @0xsequence/abi@0.43.16
+ - @0xsequence/api@0.43.16
+ - @0xsequence/config@0.43.16
+ - @0xsequence/indexer@0.43.16
+ - @0xsequence/metadata@0.43.16
+ - @0xsequence/network@0.43.16
+ - @0xsequence/provider@0.43.16
+ - @0xsequence/utils@0.43.16
+ - @0xsequence/wallet@0.43.16
+
+## 0.43.15
+
+### Patch Changes
+
+- - provider: expand receiver type on some util methods
+- Updated dependencies
+ - @0xsequence/abi@0.43.15
+ - @0xsequence/api@0.43.15
+ - @0xsequence/config@0.43.15
+ - @0xsequence/indexer@0.43.15
+ - @0xsequence/metadata@0.43.15
+ - @0xsequence/network@0.43.15
+ - @0xsequence/provider@0.43.15
+ - @0xsequence/utils@0.43.15
+ - @0xsequence/wallet@0.43.15
+
+## 0.43.14
+
+### Patch Changes
+
+- bump
+- Updated dependencies
+ - @0xsequence/abi@0.43.14
+ - @0xsequence/api@0.43.14
+ - @0xsequence/config@0.43.14
+ - @0xsequence/indexer@0.43.14
+ - @0xsequence/metadata@0.43.14
+ - @0xsequence/network@0.43.14
+ - @0xsequence/provider@0.43.14
+ - @0xsequence/utils@0.43.14
+ - @0xsequence/wallet@0.43.14
+
+## 0.43.13
+
+### Patch Changes
+
+- update rpc bindings
+- Updated dependencies
+ - @0xsequence/abi@0.43.13
+ - @0xsequence/api@0.43.13
+ - @0xsequence/config@0.43.13
+ - @0xsequence/indexer@0.43.13
+ - @0xsequence/metadata@0.43.13
+ - @0xsequence/network@0.43.13
+ - @0xsequence/provider@0.43.13
+ - @0xsequence/utils@0.43.13
+ - @0xsequence/wallet@0.43.13
+
+## 0.43.12
+
+### Patch Changes
+
+- provider: single wallet init, and add new unregisterWallet() method
+- Updated dependencies
+ - @0xsequence/abi@0.43.12
+ - @0xsequence/api@0.43.12
+ - @0xsequence/config@0.43.12
+ - @0xsequence/indexer@0.43.12
+ - @0xsequence/metadata@0.43.12
+ - @0xsequence/network@0.43.12
+ - @0xsequence/provider@0.43.12
+ - @0xsequence/utils@0.43.12
+ - @0xsequence/wallet@0.43.12
+
+## 0.43.11
+
+### Patch Changes
+
+- fix lockfiles
+- re-add mocha type deleter
+- Updated dependencies
+- Updated dependencies
+ - @0xsequence/abi@0.43.11
+ - @0xsequence/api@0.43.11
+ - @0xsequence/config@0.43.11
+ - @0xsequence/indexer@0.43.11
+ - @0xsequence/metadata@0.43.11
+ - @0xsequence/network@0.43.11
+ - @0xsequence/provider@0.43.11
+ - @0xsequence/utils@0.43.11
+ - @0xsequence/wallet@0.43.11
+
+## 0.43.10
+
+### Patch Changes
+
+- various improvements
+- Updated dependencies
+ - @0xsequence/abi@0.43.10
+ - @0xsequence/api@0.43.10
+ - @0xsequence/config@0.43.10
+ - @0xsequence/indexer@0.43.10
+ - @0xsequence/metadata@0.43.10
+ - @0xsequence/network@0.43.10
+ - @0xsequence/provider@0.43.10
+ - @0xsequence/utils@0.43.10
+ - @0xsequence/wallet@0.43.10
+
+## 0.43.9
+
+### Patch Changes
+
+- update deps
+- Updated dependencies
+ - @0xsequence/abi@0.43.9
+ - @0xsequence/api@0.43.9
+ - @0xsequence/config@0.43.9
+ - @0xsequence/indexer@0.43.9
+ - @0xsequence/metadata@0.43.9
+ - @0xsequence/network@0.43.9
+ - @0xsequence/provider@0.43.9
+ - @0xsequence/utils@0.43.9
+ - @0xsequence/wallet@0.43.9
+
+## 0.43.8
+
+### Patch Changes
+
+- network: JsonRpcProvider with caching
+- Updated dependencies
+ - @0xsequence/abi@0.43.8
+ - @0xsequence/api@0.43.8
+ - @0xsequence/config@0.43.8
+ - @0xsequence/indexer@0.43.8
+ - @0xsequence/metadata@0.43.8
+ - @0xsequence/network@0.43.8
+ - @0xsequence/provider@0.43.8
+ - @0xsequence/utils@0.43.8
+ - @0xsequence/wallet@0.43.8
+
+## 0.43.7
+
+### Patch Changes
+
+- provider: fix wallet network init
+- Updated dependencies
+ - @0xsequence/abi@0.43.7
+ - @0xsequence/api@0.43.7
+ - @0xsequence/config@0.43.7
+ - @0xsequence/indexer@0.43.7
+ - @0xsequence/metadata@0.43.7
+ - @0xsequence/network@0.43.7
+ - @0xsequence/utils@0.43.7
+ - @0xsequence/wallet@0.43.7
+
+## 0.43.6
+
+### Patch Changes
+
+- metadatata: update rpc bindings
+- Updated dependencies
+ - @0xsequence/abi@0.43.6
+ - @0xsequence/api@0.43.6
+ - @0xsequence/config@0.43.6
+ - @0xsequence/indexer@0.43.6
+ - @0xsequence/metadata@0.43.6
+ - @0xsequence/network@0.43.6
+ - @0xsequence/utils@0.43.6
+ - @0xsequence/wallet@0.43.6
+
+## 0.43.5
+
+### Patch Changes
+
+- provider: do not set default network for connect messages
+- provider: forward missing error message
+- Updated dependencies
+- Updated dependencies
+ - @0xsequence/abi@0.43.5
+ - @0xsequence/api@0.43.5
+ - @0xsequence/config@0.43.5
+ - @0xsequence/indexer@0.43.5
+ - @0xsequence/metadata@0.43.5
+ - @0xsequence/network@0.43.5
+ - @0xsequence/utils@0.43.5
+ - @0xsequence/wallet@0.43.5
+
+## 0.43.4
+
+### Patch Changes
+
+- no-change version bump to fix incorrectly tagged snapshot build
+- Updated dependencies
+ - @0xsequence/abi@0.43.4
+ - @0xsequence/api@0.43.4
+ - @0xsequence/config@0.43.4
+ - @0xsequence/indexer@0.43.4
+ - @0xsequence/metadata@0.43.4
+ - @0xsequence/network@0.43.4
+ - @0xsequence/utils@0.43.4
+ - @0xsequence/wallet@0.43.4
+
+## 0.43.3
+
+### Patch Changes
+
+- metadata: update bindings
+- Updated dependencies
+ - @0xsequence/abi@0.43.3
+ - @0xsequence/api@0.43.3
+ - @0xsequence/config@0.43.3
+ - @0xsequence/indexer@0.43.3
+ - @0xsequence/metadata@0.43.3
+ - @0xsequence/network@0.43.3
+ - @0xsequence/utils@0.43.3
+ - @0xsequence/wallet@0.43.3
+
+## 0.43.2
+
+### Patch Changes
+
+- provider: implement connectUnchecked
+- Updated dependencies
+ - @0xsequence/abi@0.43.2
+ - @0xsequence/api@0.43.2
+ - @0xsequence/config@0.43.2
+ - @0xsequence/indexer@0.43.2
+ - @0xsequence/metadata@0.43.2
+ - @0xsequence/network@0.43.2
+ - @0xsequence/utils@0.43.2
+ - @0xsequence/wallet@0.43.2
+
+## 0.43.1
+
+### Patch Changes
+
+- update to latest ethauth dep
+- Updated dependencies
+ - @0xsequence/abi@0.43.1
+ - @0xsequence/api@0.43.1
+ - @0xsequence/config@0.43.1
+ - @0xsequence/indexer@0.43.1
+ - @0xsequence/metadata@0.43.1
+ - @0xsequence/network@0.43.1
+ - @0xsequence/utils@0.43.1
+ - @0xsequence/wallet@0.43.1
+
+## 0.43.0
+
+### Minor Changes
+
+- move ethers to a peer dependency
+
+### Patch Changes
+
+- Updated dependencies
+ - @0xsequence/abi@0.43.0
+ - @0xsequence/api@0.43.0
+ - @0xsequence/config@0.43.0
+ - @0xsequence/indexer@0.43.0
+ - @0xsequence/metadata@0.43.0
+ - @0xsequence/network@0.43.0
+ - @0xsequence/utils@0.43.0
+ - @0xsequence/wallet@0.43.0
+
+## 0.42.10
+
+### Patch Changes
+
+- add auxDataProvider
+- Updated dependencies
+ - @0xsequence/abi@0.42.10
+ - @0xsequence/api@0.42.10
+ - @0xsequence/config@0.42.10
+ - @0xsequence/indexer@0.42.10
+ - @0xsequence/metadata@0.42.10
+ - @0xsequence/network@0.42.10
+ - @0xsequence/utils@0.42.10
+ - @0xsequence/wallet@0.42.10
+
+## 0.42.9
+
+### Patch Changes
+
+- provider: add eip-191 exceptions
+- Updated dependencies
+ - @0xsequence/abi@0.42.9
+ - @0xsequence/api@0.42.9
+ - @0xsequence/config@0.42.9
+ - @0xsequence/indexer@0.42.9
+ - @0xsequence/metadata@0.42.9
+ - @0xsequence/network@0.42.9
+ - @0xsequence/utils@0.42.9
+ - @0xsequence/wallet@0.42.9
+
+## 0.42.8
+
+### Patch Changes
+
+- provider: skip setting intent origin if we're unity plugin
+- Updated dependencies
+ - @0xsequence/abi@0.42.8
+ - @0xsequence/api@0.42.8
+ - @0xsequence/config@0.42.8
+ - @0xsequence/indexer@0.42.8
+ - @0xsequence/metadata@0.42.8
+ - @0xsequence/network@0.42.8
+ - @0xsequence/utils@0.42.8
+ - @0xsequence/wallet@0.42.8
+
+## 0.42.7
+
+### Patch Changes
+
+- Add sign in options to connection settings
+- Updated dependencies
+ - @0xsequence/abi@0.42.7
+ - @0xsequence/api@0.42.7
+ - @0xsequence/config@0.42.7
+ - @0xsequence/indexer@0.42.7
+ - @0xsequence/metadata@0.42.7
+ - @0xsequence/network@0.42.7
+ - @0xsequence/utils@0.42.7
+ - @0xsequence/wallet@0.42.7
+
+## 0.42.6
+
+### Patch Changes
+
+- api bindings update
+- Updated dependencies
+ - @0xsequence/abi@0.42.6
+ - @0xsequence/api@0.42.6
+ - @0xsequence/config@0.42.6
+ - @0xsequence/indexer@0.42.6
+ - @0xsequence/metadata@0.42.6
+ - @0xsequence/network@0.42.6
+ - @0xsequence/utils@0.42.6
+ - @0xsequence/wallet@0.42.6
+
+## 0.42.5
+
+### Patch Changes
+
+- relayer: don't treat missing receipt as hard failure
+- Updated dependencies
+ - @0xsequence/abi@0.42.5
+ - @0xsequence/api@0.42.5
+ - @0xsequence/config@0.42.5
+ - @0xsequence/indexer@0.42.5
+ - @0xsequence/metadata@0.42.5
+ - @0xsequence/network@0.42.5
+ - @0xsequence/utils@0.42.5
+ - @0xsequence/wallet@0.42.5
+
+## 0.42.4
+
+### Patch Changes
+
+- provider: add custom app protocol to connect options
+- Updated dependencies
+ - @0xsequence/abi@0.42.4
+ - @0xsequence/api@0.42.4
+ - @0xsequence/config@0.42.4
+ - @0xsequence/indexer@0.42.4
+ - @0xsequence/metadata@0.42.4
+ - @0xsequence/network@0.42.4
+ - @0xsequence/utils@0.42.4
+ - @0xsequence/wallet@0.42.4
+
+## 0.42.3
+
+### Patch Changes
+
+- update api bindings
+- Updated dependencies
+ - @0xsequence/abi@0.42.3
+ - @0xsequence/api@0.42.3
+ - @0xsequence/config@0.42.3
+ - @0xsequence/indexer@0.42.3
+ - @0xsequence/metadata@0.42.3
+ - @0xsequence/network@0.42.3
+ - @0xsequence/utils@0.42.3
+ - @0xsequence/wallet@0.42.3
+
+## 0.42.2
+
+### Patch Changes
+
+- disable rinkeby network
+- Updated dependencies
+ - @0xsequence/abi@0.42.2
+ - @0xsequence/api@0.42.2
+ - @0xsequence/config@0.42.2
+ - @0xsequence/indexer@0.42.2
+ - @0xsequence/metadata@0.42.2
+ - @0xsequence/network@0.42.2
+ - @0xsequence/utils@0.42.2
+ - @0xsequence/wallet@0.42.2
+
+## 0.42.1
+
+### Patch Changes
+
+- wallet: optional waitForReceipt parameter
+- Updated dependencies
+ - @0xsequence/abi@0.42.1
+ - @0xsequence/api@0.42.1
+ - @0xsequence/config@0.42.1
+ - @0xsequence/indexer@0.42.1
+ - @0xsequence/metadata@0.42.1
+ - @0xsequence/network@0.42.1
+ - @0xsequence/utils@0.42.1
+ - @0xsequence/wallet@0.42.1
+
+## 0.42.0
+
+### Minor Changes
+
+- relayer: estimateGasLimits -> simulate
+- add simulator package
+
+### Patch Changes
+
+- transactions: fix flattenAuxTransactions
+- provider: only filter nullish values
+- provider: re-map transaction 'gas' back to 'gasLimit'
+- Updated dependencies
+- Updated dependencies
+- Updated dependencies
+- Updated dependencies
+- Updated dependencies
+ - @0xsequence/abi@0.42.0
+ - @0xsequence/api@0.42.0
+ - @0xsequence/config@0.42.0
+ - @0xsequence/indexer@0.42.0
+ - @0xsequence/metadata@0.42.0
+ - @0xsequence/network@0.42.0
+ - @0xsequence/utils@0.42.0
+ - @0xsequence/wallet@0.42.0
+
+## 0.41.3
+
+### Patch Changes
+
+- api bindings update
+- Updated dependencies
+ - @0xsequence/abi@0.41.3
+ - @0xsequence/api@0.41.3
+ - @0xsequence/config@0.41.3
+ - @0xsequence/indexer@0.41.3
+ - @0xsequence/metadata@0.41.3
+ - @0xsequence/network@0.41.3
+ - @0xsequence/utils@0.41.3
+ - @0xsequence/wallet@0.41.3
+
+## 0.41.2
+
+### Patch Changes
+
+- api bindings update
+- Updated dependencies
+ - @0xsequence/abi@0.41.2
+ - @0xsequence/api@0.41.2
+ - @0xsequence/config@0.41.2
+ - @0xsequence/indexer@0.41.2
+ - @0xsequence/metadata@0.41.2
+ - @0xsequence/network@0.41.2
+ - @0xsequence/utils@0.41.2
+ - @0xsequence/wallet@0.41.2
+
+## 0.41.1
+
+### Patch Changes
+
+- update default networks
+- Updated dependencies
+ - @0xsequence/abi@0.41.1
+ - @0xsequence/api@0.41.1
+ - @0xsequence/config@0.41.1
+ - @0xsequence/indexer@0.41.1
+ - @0xsequence/metadata@0.41.1
+ - @0xsequence/network@0.41.1
+ - @0xsequence/utils@0.41.1
+ - @0xsequence/wallet@0.41.1
+
+## 0.41.0
+
+### Minor Changes
+
+- relayer: fix Relayer.wait() interface
+
+ The interface for calling Relayer.wait() has changed. Instead of a single optional ill-defined timeout/delay parameter, there are three optional parameters, in order:
+
+ - timeout: the maximum time to wait for the transaction receipt
+ - delay: the polling interval, i.e. the time to wait between requests
+ - maxFails: the maximum number of hard failures to tolerate before giving up
+
+ Please update your codebase accordingly.
+
+- relayer: add optional waitForReceipt parameter to Relayer.relay
+
+ The behaviour of Relayer.relay() was not well-defined with respect to whether or not it waited for a receipt.
+ This change allows the caller to specify whether to wait or not, with the default behaviour being to wait.
+
+### Patch Changes
+
+- relayer: wait receipt retry logic
+- fix wrapped object error
+- provider: forward delegateCall and revertOnError transaction fields
+- Updated dependencies
+- Updated dependencies
+- Updated dependencies
+- Updated dependencies
+- Updated dependencies
+ - @0xsequence/abi@0.41.0
+ - @0xsequence/api@0.41.0
+ - @0xsequence/config@0.41.0
+ - @0xsequence/indexer@0.41.0
+ - @0xsequence/metadata@0.41.0
+ - @0xsequence/network@0.41.0
+ - @0xsequence/utils@0.41.0
+ - @0xsequence/wallet@0.41.0
+
+## 0.40.6
+
+### Patch Changes
+
+- add arbitrum-nova chain
+- Updated dependencies
+ - @0xsequence/abi@0.40.6
+ - @0xsequence/api@0.40.6
+ - @0xsequence/config@0.40.6
+ - @0xsequence/indexer@0.40.6
+ - @0xsequence/metadata@0.40.6
+ - @0xsequence/network@0.40.6
+ - @0xsequence/utils@0.40.6
+ - @0xsequence/wallet@0.40.6
+
+## 0.40.5
+
+### Patch Changes
+
+- api: update bindings
+- Updated dependencies
+ - @0xsequence/abi@0.40.5
+ - @0xsequence/api@0.40.5
+ - @0xsequence/config@0.40.5
+ - @0xsequence/indexer@0.40.5
+ - @0xsequence/metadata@0.40.5
+ - @0xsequence/network@0.40.5
+ - @0xsequence/utils@0.40.5
+ - @0xsequence/wallet@0.40.5
+
+## 0.40.4
+
+### Patch Changes
+
+- add unreal transport
+- Updated dependencies
+ - @0xsequence/abi@0.40.4
+ - @0xsequence/api@0.40.4
+ - @0xsequence/config@0.40.4
+ - @0xsequence/indexer@0.40.4
+ - @0xsequence/metadata@0.40.4
+ - @0xsequence/network@0.40.4
+ - @0xsequence/utils@0.40.4
+ - @0xsequence/wallet@0.40.4
+
+## 0.40.3
+
+### Patch Changes
+
+- provider: fix MessageToSign message type
+- Updated dependencies
+ - @0xsequence/abi@0.40.3
+ - @0xsequence/api@0.40.3
+ - @0xsequence/config@0.40.3
+ - @0xsequence/indexer@0.40.3
+ - @0xsequence/metadata@0.40.3
+ - @0xsequence/network@0.40.3
+ - @0xsequence/utils@0.40.3
+ - @0xsequence/wallet@0.40.3
+
+## 0.40.2
+
+### Patch Changes
+
+- Wallet provider, loadSession method
+- Updated dependencies
+ - @0xsequence/abi@0.40.2
+ - @0xsequence/api@0.40.2
+ - @0xsequence/config@0.40.2
+ - @0xsequence/indexer@0.40.2
+ - @0xsequence/metadata@0.40.2
+ - @0xsequence/network@0.40.2
+ - @0xsequence/utils@0.40.2
+ - @0xsequence/wallet@0.40.2
+
+## 0.40.1
+
+### Patch Changes
+
+- export sequence.initWallet and sequence.getWallet
+- Updated dependencies
+ - @0xsequence/abi@0.40.1
+ - @0xsequence/api@0.40.1
+ - @0xsequence/config@0.40.1
+ - @0xsequence/indexer@0.40.1
+ - @0xsequence/metadata@0.40.1
+ - @0xsequence/network@0.40.1
+ - @0xsequence/utils@0.40.1
+ - @0xsequence/wallet@0.40.1
+
+## 0.40.0
+
+### Minor Changes
+
+- add sequence.initWallet(network, config) and sequence.getWallet() helper methods
+
+### Patch Changes
+
+- Updated dependencies
+ - @0xsequence/abi@0.40.0
+ - @0xsequence/api@0.40.0
+ - @0xsequence/config@0.40.0
+ - @0xsequence/indexer@0.40.0
+ - @0xsequence/metadata@0.40.0
+ - @0xsequence/network@0.40.0
+ - @0xsequence/utils@0.40.0
+ - @0xsequence/wallet@0.40.0
+
+## 0.39.6
+
+### Patch Changes
+
+- indexer: update client bindings
+- Updated dependencies
+ - @0xsequence/abi@0.39.6
+ - @0xsequence/api@0.39.6
+ - @0xsequence/config@0.39.6
+ - @0xsequence/indexer@0.39.6
+ - @0xsequence/metadata@0.39.6
+ - @0xsequence/network@0.39.6
+ - @0xsequence/utils@0.39.6
+ - @0xsequence/wallet@0.39.6
+
+## 0.39.5
+
+### Patch Changes
+
+- provider: fix networkRpcUrl config option
+- Updated dependencies
+ - @0xsequence/abi@0.39.5
+ - @0xsequence/api@0.39.5
+ - @0xsequence/config@0.39.5
+ - @0xsequence/indexer@0.39.5
+ - @0xsequence/metadata@0.39.5
+ - @0xsequence/network@0.39.5
+ - @0xsequence/utils@0.39.5
+ - @0xsequence/wallet@0.39.5
+
+## 0.39.4
+
+### Patch Changes
+
+- api: update client bindings
+- Updated dependencies
+ - @0xsequence/abi@0.39.4
+ - @0xsequence/api@0.39.4
+ - @0xsequence/config@0.39.4
+ - @0xsequence/indexer@0.39.4
+ - @0xsequence/metadata@0.39.4
+ - @0xsequence/network@0.39.4
+ - @0xsequence/utils@0.39.4
+ - @0xsequence/wallet@0.39.4
+
+## 0.39.3
+
+### Patch Changes
+
+- add request method on Web3Provider
+- Updated dependencies
+ - @0xsequence/abi@0.39.3
+ - @0xsequence/api@0.39.3
+ - @0xsequence/config@0.39.3
+ - @0xsequence/indexer@0.39.3
+ - @0xsequence/metadata@0.39.3
+ - @0xsequence/network@0.39.3
+ - @0xsequence/utils@0.39.3
+ - @0xsequence/wallet@0.39.3
+
+## 0.39.2
+
+### Patch Changes
+
+- update umd name
+- Updated dependencies
+ - @0xsequence/abi@0.39.2
+ - @0xsequence/api@0.39.2
+ - @0xsequence/config@0.39.2
+ - @0xsequence/indexer@0.39.2
+ - @0xsequence/metadata@0.39.2
+ - @0xsequence/network@0.39.2
+ - @0xsequence/utils@0.39.2
+ - @0xsequence/wallet@0.39.2
+
+## 0.39.1
+
+### Patch Changes
+
+- add Aurora network
+- add origin info for accountsChanged event to handle it per dapp
+- Updated dependencies
+- Updated dependencies
+ - @0xsequence/abi@0.39.1
+ - @0xsequence/api@0.39.1
+ - @0xsequence/config@0.39.1
+ - @0xsequence/indexer@0.39.1
+ - @0xsequence/metadata@0.39.1
+ - @0xsequence/network@0.39.1
+ - @0xsequence/utils@0.39.1
+ - @0xsequence/wallet@0.39.1
+
+## 0.39.0
+
+### Minor Changes
+
+- abstract window.localStorage to interface type
+
+### Patch Changes
+
+- Updated dependencies
+ - @0xsequence/abi@0.39.0
+ - @0xsequence/api@0.39.0
+ - @0xsequence/config@0.39.0
+ - @0xsequence/indexer@0.39.0
+ - @0xsequence/metadata@0.39.0
+ - @0xsequence/network@0.39.0
+ - @0xsequence/utils@0.39.0
+ - @0xsequence/wallet@0.39.0
+
+## 0.38.2
+
+### Patch Changes
+
+- provider: add Settings.defaultPurchaseAmount
+- Updated dependencies
+ - @0xsequence/abi@0.38.2
+ - @0xsequence/api@0.38.2
+ - @0xsequence/config@0.38.2
+ - @0xsequence/indexer@0.38.2
+ - @0xsequence/metadata@0.38.2
+ - @0xsequence/network@0.38.2
+ - @0xsequence/utils@0.38.2
+ - @0xsequence/wallet@0.38.2
+
+## 0.38.1
+
+### Patch Changes
+
+- update api and metadata rpc bindings
+- Updated dependencies
+ - @0xsequence/abi@0.38.1
+ - @0xsequence/api@0.38.1
+ - @0xsequence/config@0.38.1
+ - @0xsequence/indexer@0.38.1
+ - @0xsequence/metadata@0.38.1
+ - @0xsequence/network@0.38.1
+ - @0xsequence/utils@0.38.1
+ - @0xsequence/wallet@0.38.1
+
+## 0.38.0
+
+### Minor Changes
+
+- api: update bindings, change TokenPrice interface
+- bridge: remove @0xsequence/bridge package
+- api: update bindings, rename ContractCallArg to TupleComponent
+
+### Patch Changes
+
+- Updated dependencies
+- Updated dependencies
+- Updated dependencies
+ - @0xsequence/abi@0.38.0
+ - @0xsequence/api@0.38.0
+ - @0xsequence/config@0.38.0
+ - @0xsequence/indexer@0.38.0
+ - @0xsequence/metadata@0.38.0
+ - @0xsequence/network@0.38.0
+ - @0xsequence/utils@0.38.0
+ - @0xsequence/wallet@0.38.0
+
+## 0.37.1
+
+### Patch Changes
+
+- Add back sortNetworks - Removing sorting was a breaking change for dapps on older versions which directly integrate sequence.
+- Updated dependencies
+ - @0xsequence/abi@0.37.1
+ - @0xsequence/api@0.37.1
+ - @0xsequence/config@0.37.1
+ - @0xsequence/indexer@0.37.1
+ - @0xsequence/metadata@0.37.1
+ - @0xsequence/network@0.37.1
+ - @0xsequence/utils@0.37.1
+ - @0xsequence/wallet@0.37.1
+
+## 0.37.0
+
+### Minor Changes
+
+- network related fixes and improvements
+- api: bindings: exchange rate lookups
+
+### Patch Changes
+
+- Updated dependencies
+- Updated dependencies
+ - @0xsequence/abi@0.37.0
+ - @0xsequence/api@0.37.0
+ - @0xsequence/config@0.37.0
+ - @0xsequence/indexer@0.37.0
+ - @0xsequence/metadata@0.37.0
+ - @0xsequence/network@0.37.0
+ - @0xsequence/utils@0.37.0
+ - @0xsequence/wallet@0.37.0
+
+## 0.36.13
+
+### Patch Changes
+
+- api: update bindings with new price endpoints
+- Updated dependencies
+ - @0xsequence/abi@0.36.13
+ - @0xsequence/api@0.36.13
+ - @0xsequence/config@0.36.13
+ - @0xsequence/indexer@0.36.13
+ - @0xsequence/metadata@0.36.13
+ - @0xsequence/network@0.36.13
+ - @0xsequence/utils@0.36.13
+ - @0xsequence/wallet@0.36.13
+
+## 0.36.12
+
+### Patch Changes
+
+- wallet: skip remote signers if not needed
+- auth: check that signature meets threshold before requesting auth token
+- Updated dependencies
+- Updated dependencies
+ - @0xsequence/abi@0.36.12
+ - @0xsequence/api@0.36.12
+ - @0xsequence/config@0.36.12
+ - @0xsequence/indexer@0.36.12
+ - @0xsequence/metadata@0.36.12
+ - @0xsequence/network@0.36.12
+ - @0xsequence/utils@0.36.12
+ - @0xsequence/wallet@0.36.12
+
+## 0.36.11
+
+### Patch Changes
+
+- Prefix EIP191 message on wallet-request-handler
+- Updated dependencies
+ - @0xsequence/abi@0.36.11
+ - @0xsequence/api@0.36.11
+ - @0xsequence/config@0.36.11
+ - @0xsequence/indexer@0.36.11
+ - @0xsequence/metadata@0.36.11
+ - @0xsequence/network@0.36.11
+ - @0xsequence/utils@0.36.11
+ - @0xsequence/wallet@0.36.11
+
+## 0.36.10
+
+### Patch Changes
+
+- support bannerUrl on connect
+- Updated dependencies
+ - @0xsequence/abi@0.36.10
+ - @0xsequence/api@0.36.10
+ - @0xsequence/config@0.36.10
+ - @0xsequence/indexer@0.36.10
+ - @0xsequence/metadata@0.36.10
+ - @0xsequence/network@0.36.10
+ - @0xsequence/utils@0.36.10
+ - @0xsequence/wallet@0.36.10
+
+## 0.36.9
+
+### Patch Changes
+
+- minor dev xp improvements
+- Updated dependencies
+ - @0xsequence/abi@0.36.9
+ - @0xsequence/api@0.36.9
+ - @0xsequence/config@0.36.9
+ - @0xsequence/indexer@0.36.9
+ - @0xsequence/metadata@0.36.9
+ - @0xsequence/network@0.36.9
+ - @0xsequence/utils@0.36.9
+ - @0xsequence/wallet@0.36.9
+
+## 0.36.8
+
+### Patch Changes
+
+- more connect options (theme, payment providers, funding currencies)
+- Updated dependencies
+ - @0xsequence/abi@0.36.8
+ - @0xsequence/api@0.36.8
+ - @0xsequence/config@0.36.8
+ - @0xsequence/indexer@0.36.8
+ - @0xsequence/metadata@0.36.8
+ - @0xsequence/network@0.36.8
+ - @0xsequence/utils@0.36.8
+ - @0xsequence/wallet@0.36.8
+
+## 0.36.7
+
+### Patch Changes
+
+- fix missing break
+- Updated dependencies
+ - @0xsequence/abi@0.36.7
+ - @0xsequence/api@0.36.7
+ - @0xsequence/config@0.36.7
+ - @0xsequence/indexer@0.36.7
+ - @0xsequence/metadata@0.36.7
+ - @0xsequence/network@0.36.7
+ - @0xsequence/utils@0.36.7
+ - @0xsequence/wallet@0.36.7
+
+## 0.36.6
+
+### Patch Changes
+
+- wallet_switchEthereumChain support
+- Updated dependencies
+ - @0xsequence/abi@0.36.6
+ - @0xsequence/api@0.36.6
+ - @0xsequence/config@0.36.6
+ - @0xsequence/indexer@0.36.6
+ - @0xsequence/metadata@0.36.6
+ - @0xsequence/network@0.36.6
+ - @0xsequence/utils@0.36.6
+ - @0xsequence/wallet@0.36.6
+
+## 0.36.5
+
+### Patch Changes
+
+- auth: bump ethauth to 0.7.0
+ network, wallet: don't assume position of auth network in list
+ api/indexer/metadata: trim trailing slash on hostname, and add endpoint urls
+ relayer: Allow to specify local relayer transaction parameters like gas price or gas limit
+- Updated dependencies
+ - @0xsequence/abi@0.36.5
+ - @0xsequence/api@0.36.5
+ - @0xsequence/config@0.36.5
+ - @0xsequence/indexer@0.36.5
+ - @0xsequence/metadata@0.36.5
+ - @0xsequence/network@0.36.5
+ - @0xsequence/utils@0.36.5
+ - @0xsequence/wallet@0.36.5
+
+## 0.36.4
+
+### Patch Changes
+
+- Updating list of chain ids to include other ethereum compatible chains
+- Updated dependencies
+ - @0xsequence/abi@0.36.4
+ - @0xsequence/api@0.36.4
+ - @0xsequence/config@0.36.4
+ - @0xsequence/indexer@0.36.4
+ - @0xsequence/metadata@0.36.4
+ - @0xsequence/network@0.36.4
+ - @0xsequence/utils@0.36.4
+ - @0xsequence/wallet@0.36.4
+
+## 0.36.3
+
+### Patch Changes
+
+- provider: pass connect options to prompter methods
+- Updated dependencies
+ - @0xsequence/abi@0.36.3
+ - @0xsequence/api@0.36.3
+ - @0xsequence/config@0.36.3
+ - @0xsequence/indexer@0.36.3
+ - @0xsequence/metadata@0.36.3
+ - @0xsequence/network@0.36.3
+ - @0xsequence/utils@0.36.3
+ - @0xsequence/wallet@0.36.3
+
+## 0.36.2
+
+### Patch Changes
+
+- transactions: Setting target to 0x0 when empty to during SequenceTxAbiEncode
+- Updated dependencies
+ - @0xsequence/abi@0.36.2
+ - @0xsequence/api@0.36.2
+ - @0xsequence/config@0.36.2
+ - @0xsequence/indexer@0.36.2
+ - @0xsequence/metadata@0.36.2
+ - @0xsequence/network@0.36.2
+ - @0xsequence/utils@0.36.2
+ - @0xsequence/wallet@0.36.2
+
+## 0.36.1
+
+### Patch Changes
+
+- metadata: update client with more fields
+- Updated dependencies
+ - @0xsequence/abi@0.36.1
+ - @0xsequence/api@0.36.1
+ - @0xsequence/config@0.36.1
+ - @0xsequence/indexer@0.36.1
+ - @0xsequence/metadata@0.36.1
+ - @0xsequence/network@0.36.1
+ - @0xsequence/utils@0.36.1
+ - @0xsequence/wallet@0.36.1
+
+## 0.36.0
+
+### Minor Changes
+
+- relayer, wallet: fee quote support
+
+### Patch Changes
+
+- Updated dependencies
+ - @0xsequence/abi@0.36.0
+ - @0xsequence/api@0.36.0
+ - @0xsequence/config@0.36.0
+ - @0xsequence/indexer@0.36.0
+ - @0xsequence/metadata@0.36.0
+ - @0xsequence/network@0.36.0
+ - @0xsequence/utils@0.36.0
+ - @0xsequence/wallet@0.36.0
+
+## 0.35.12
+
+### Patch Changes
+
+- provider: rename wallet.commands to wallet.utils
+- Updated dependencies
+ - @0xsequence/abi@0.35.12
+ - @0xsequence/api@0.35.12
+ - @0xsequence/config@0.35.12
+ - @0xsequence/indexer@0.35.12
+ - @0xsequence/metadata@0.35.12
+ - @0xsequence/network@0.35.12
+ - @0xsequence/utils@0.35.12
+ - @0xsequence/wallet@0.35.12
+
+## 0.35.11
+
+### Patch Changes
+
+- provider/utils: smoother message validation
+- Updated dependencies
+ - @0xsequence/abi@0.35.11
+ - @0xsequence/api@0.35.11
+ - @0xsequence/config@0.35.11
+ - @0xsequence/indexer@0.35.11
+ - @0xsequence/metadata@0.35.11
+ - @0xsequence/network@0.35.11
+ - @0xsequence/utils@0.35.11
+ - @0xsequence/wallet@0.35.11
+
+## 0.35.10
+
+### Patch Changes
+
+- upgrade deps
+- Updated dependencies
+ - @0xsequence/abi@0.35.10
+ - @0xsequence/api@0.35.10
+ - @0xsequence/config@0.35.10
+ - @0xsequence/indexer@0.35.10
+ - @0xsequence/metadata@0.35.10
+ - @0xsequence/network@0.35.10
+ - @0xsequence/utils@0.35.10
+ - @0xsequence/wallet@0.35.10
+
+## 0.35.9
+
+### Patch Changes
+
+- provider: window-transport override event handlers with new wallet instance
+- Updated dependencies
+ - @0xsequence/abi@0.35.9
+ - @0xsequence/api@0.35.9
+ - @0xsequence/config@0.35.9
+ - @0xsequence/indexer@0.35.9
+ - @0xsequence/metadata@0.35.9
+ - @0xsequence/network@0.35.9
+ - @0xsequence/utils@0.35.9
+ - @0xsequence/wallet@0.35.9
+
+## 0.35.8
+
+### Patch Changes
+
+- provider: async wallet sign in improvements
+- Updated dependencies
+ - @0xsequence/abi@0.35.8
+ - @0xsequence/api@0.35.8
+ - @0xsequence/config@0.35.8
+ - @0xsequence/indexer@0.35.8
+ - @0xsequence/metadata@0.35.8
+ - @0xsequence/network@0.35.8
+ - @0xsequence/utils@0.35.8
+ - @0xsequence/wallet@0.35.8
+
+## 0.35.7
+
+### Patch Changes
+
+- config: cache wallet configs
+- Updated dependencies
+ - @0xsequence/abi@0.35.7
+ - @0xsequence/api@0.35.7
+ - @0xsequence/config@0.35.7
+ - @0xsequence/indexer@0.35.7
+ - @0xsequence/metadata@0.35.7
+ - @0xsequence/network@0.35.7
+ - @0xsequence/utils@0.35.7
+ - @0xsequence/wallet@0.35.7
+
+## 0.35.6
+
+### Patch Changes
+
+- provider: support async signin of wallet request handler
+- Updated dependencies
+ - @0xsequence/abi@0.35.6
+ - @0xsequence/api@0.35.6
+ - @0xsequence/config@0.35.6
+ - @0xsequence/indexer@0.35.6
+ - @0xsequence/metadata@0.35.6
+ - @0xsequence/network@0.35.6
+ - @0xsequence/utils@0.35.6
+ - @0xsequence/wallet@0.35.6
+
+## 0.35.5
+
+### Patch Changes
+
+- wallet: skip threshold check during fee estimation
+- Updated dependencies
+ - @0xsequence/abi@0.35.5
+ - @0xsequence/api@0.35.5
+ - @0xsequence/config@0.35.5
+ - @0xsequence/indexer@0.35.5
+ - @0xsequence/metadata@0.35.5
+ - @0xsequence/network@0.35.5
+ - @0xsequence/utils@0.35.5
+ - @0xsequence/wallet@0.35.5
+
+## 0.35.4
+
+### Patch Changes
+
+- - browser extension mode, center window
+- Updated dependencies
+ - @0xsequence/abi@0.35.4
+ - @0xsequence/api@0.35.4
+ - @0xsequence/config@0.35.4
+ - @0xsequence/indexer@0.35.4
+ - @0xsequence/metadata@0.35.4
+ - @0xsequence/network@0.35.4
+ - @0xsequence/utils@0.35.4
+ - @0xsequence/wallet@0.35.4
+
+## 0.35.3
+
+### Patch Changes
+
+- - update window position when in browser extension mode
+- Updated dependencies
+ - @0xsequence/abi@0.35.3
+ - @0xsequence/api@0.35.3
+ - @0xsequence/config@0.35.3
+ - @0xsequence/indexer@0.35.3
+ - @0xsequence/metadata@0.35.3
+ - @0xsequence/network@0.35.3
+ - @0xsequence/utils@0.35.3
+ - @0xsequence/wallet@0.35.3
+
+## 0.35.2
+
+### Patch Changes
+
+- - provider: WindowMessageHandler accept optional windowHref
+- Updated dependencies
+ - @0xsequence/abi@0.35.2
+ - @0xsequence/api@0.35.2
+ - @0xsequence/config@0.35.2
+ - @0xsequence/indexer@0.35.2
+ - @0xsequence/metadata@0.35.2
+ - @0xsequence/network@0.35.2
+ - @0xsequence/utils@0.35.2
+ - @0xsequence/wallet@0.35.2
+
+## 0.35.1
+
+### Patch Changes
+
+- wallet: update config on undeployed too
+- Updated dependencies
+ - @0xsequence/abi@0.35.1
+ - @0xsequence/api@0.35.1
+ - @0xsequence/config@0.35.1
+ - @0xsequence/indexer@0.35.1
+ - @0xsequence/metadata@0.35.1
+ - @0xsequence/network@0.35.1
+ - @0xsequence/utils@0.35.1
+ - @0xsequence/wallet@0.35.1
+
+## 0.35.0
+
+### Minor Changes
+
+- - config: add buildStubSignature
+ - provider: add checks to signing cases for wallet deployment and config statuses
+ - provider: add prompt for wallet deployment
+ - relayer: add BaseRelayer.prependWalletDeploy
+ - relayer: add Relayer.feeOptions
+ - relayer: account for wallet deployment in fee estimation
+ - transactions: add fromTransactionish
+ - wallet: add Account.prependConfigUpdate
+ - wallet: add Account.getFeeOptions
+
+### Patch Changes
+
+- Updated dependencies
+ - @0xsequence/abi@0.35.0
+ - @0xsequence/api@0.35.0
+ - @0xsequence/config@0.35.0
+ - @0xsequence/indexer@0.35.0
+ - @0xsequence/metadata@0.35.0
+ - @0xsequence/network@0.35.0
+ - @0xsequence/utils@0.35.0
+ - @0xsequence/wallet@0.35.0
+
+## 0.34.1
+
+### Patch Changes
+
+- upgrade ethauth dep
+
+## 0.34.0
+
+### Minor Changes
+
+- - upgrade deps
+
+### Patch Changes
+
+- Updated dependencies
+ - @0xsequence/abi@0.34.0
+ - @0xsequence/api@0.34.0
+ - @0xsequence/config@0.34.0
+ - @0xsequence/indexer@0.34.0
+ - @0xsequence/metadata@0.34.0
+ - @0xsequence/network@0.34.0
+ - @0xsequence/utils@0.34.0
+ - @0xsequence/wallet@0.34.0
+
+## 0.33.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @0xsequence/wallet@0.33.3
+
+## 0.33.2
+
+### Patch Changes
+
+- @0xsequence/wallet@0.33.2
+
+## 0.33.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @0xsequence/api@0.33.1
+
+## 0.33.0
+
+### Minor Changes
+
+- auth: fix spelling of 'thershold' to 'threshold'
+
+## 0.31.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @0xsequence/metadata@0.31.3
+
+## 0.31.1
+
+### Patch Changes
+
+- @0xsequence/wallet@0.31.1
+
+## 0.31.0
+
+### Minor Changes
+
+- - upgrading to ethers v5.5
+
+### Patch Changes
+
+- Updated dependencies
+ - @0xsequence/abi@0.31.0
+ - @0xsequence/api@0.31.0
+ - @0xsequence/config@0.31.0
+ - @0xsequence/indexer@0.31.0
+ - @0xsequence/metadata@0.31.0
+ - @0xsequence/network@0.31.0
+ - @0xsequence/utils@0.31.0
+ - @0xsequence/wallet@0.31.0
+
+## 0.30.0
+
+### Minor Changes
+
+- - upgrade most deps
+
+### Patch Changes
+
+- Updated dependencies
+ - @0xsequence/abi@0.30.0
+ - @0xsequence/api@0.30.0
+ - @0xsequence/config@0.30.0
+ - @0xsequence/indexer@0.30.0
+ - @0xsequence/metadata@0.30.0
+ - @0xsequence/network@0.30.0
+ - @0xsequence/utils@0.30.0
+ - @0xsequence/wallet@0.30.0
+
+## 0.29.9
+
+### Patch Changes
+
+- Updated dependencies [undefined]
+ - @0xsequence/api@0.29.9
+
+## 0.29.8
+
+### Patch Changes
+
+- update api
+- Updated dependencies [undefined]
+ - @0xsequence/abi@0.29.8
+ - @0xsequence/api@0.29.8
+ - @0xsequence/config@0.29.8
+ - @0xsequence/indexer@0.29.8
+ - @0xsequence/metadata@0.29.8
+ - @0xsequence/network@0.29.8
+ - @0xsequence/utils@0.29.8
+ - @0xsequence/wallet@0.29.8
+
+## 0.29.7
+
+### Patch Changes
+
+- Updated dependencies [undefined]
+ - @0xsequence/wallet@0.29.7
+
+## 0.29.6
+
+### Patch Changes
+
+- Updated dependencies [undefined]
+ - @0xsequence/network@0.29.6
+ - @0xsequence/config@0.29.6
+ - @0xsequence/wallet@0.29.6
+
+## 0.29.5
+
+### Patch Changes
+
+- auth: pass testnetMode flag depending on network
+- Updated dependencies [undefined]
+ - @0xsequence/config@0.29.5
+ - @0xsequence/wallet@0.29.5
+
+## 0.29.4
+
+### Patch Changes
+
+- Updated dependencies [undefined]
+ - @0xsequence/api@0.29.4
+
+## 0.29.3
+
+### Patch Changes
+
+- Updated dependencies [undefined]
+ - @0xsequence/indexer@0.29.3
+
+## 0.29.2
+
+### Patch Changes
+
+- @0xsequence/wallet@0.29.2
+
+## 0.29.1
+
+### Patch Changes
+
+- Updated dependencies [undefined]
+ - @0xsequence/api@0.29.1
+ - @0xsequence/metadata@0.29.1
+
+## 0.29.0
+
+### Minor Changes
+
+- major architectural changes in Sequence design
+
+ - only one API instance, API is no longer a per-chain service
+ - separate per-chain indexer service, API no longer handles indexing
+ - single contract metadata service, API no longer serves metadata
+
+ chaind package has been removed, indexer and metadata packages have been added
+
+ stronger typing with new explicit ChainId type
+
+ multicall fixes and improvements
+
+ forbid "wait" transactions in sendTransactionBatch calls
+
+### Patch Changes
+
+- Updated dependencies [undefined]
+ - @0xsequence/api@0.29.0
+ - @0xsequence/config@0.29.0
+ - @0xsequence/indexer@0.29.0
+ - @0xsequence/metadata@0.29.0
+ - @0xsequence/network@0.29.0
+ - @0xsequence/abi@0.29.0
+ - @0xsequence/utils@0.29.0
+ - @0xsequence/wallet@0.29.0
+
+## 0.28.0
+
+### Minor Changes
+
+- extension provider
+
+### Patch Changes
+
+- Updated dependencies [undefined]
+ - @0xsequence/abi@0.28.0
+ - @0xsequence/api@0.28.0
+ - @0xsequence/config@0.28.0
+ - @0xsequence/network@0.28.0
+ - @0xsequence/utils@0.28.0
+ - @0xsequence/wallet@0.28.0
+
+## 0.27.2
+
+### Patch Changes
+
+- Updated dependencies [undefined]
+ - @0xsequence/wallet@0.27.2
+
+## 0.27.1
+
+### Patch Changes
+
+- @0xsequence/wallet@0.27.1
+
+## 0.27.0
+
+### Minor Changes
+
+- Add requireFreshSigner lib to sessions
+
+### Patch Changes
+
+- Updated dependencies [undefined]
+ - @0xsequence/abi@0.27.0
+ - @0xsequence/api@0.27.0
+ - @0xsequence/config@0.27.0
+ - @0xsequence/network@0.27.0
+ - @0xsequence/utils@0.27.0
+ - @0xsequence/wallet@0.27.0
+
+## 0.26.0
+
+### Minor Changes
+
+- update relayer client bindings
+ provide the wallet's address for calls to SendMetaTxn
+ modify the semantics of Relayer.getNonce() to allow relayers to select nonce spaces for clients
+
+### Patch Changes
+
+- Updated dependencies [undefined]
+ - @0xsequence/wallet@0.26.0
+
+## 0.25.1
+
+### Patch Changes
+
+- Fix build typescrypt issue
+- Updated dependencies [undefined]
+ - @0xsequence/abi@0.25.1
+ - @0xsequence/api@0.25.1
+ - @0xsequence/config@0.25.1
+ - @0xsequence/network@0.25.1
+ - @0xsequence/utils@0.25.1
+ - @0xsequence/wallet@0.25.1
+
+## 0.25.0
+
+### Minor Changes
+
+- 10c8af8: Add estimator package
+ Fix multicall few calls bug
+
+### Patch Changes
+
+- Updated dependencies [10c8af8]
+ - @0xsequence/abi@0.25.0
+ - @0xsequence/api@0.25.0
+ - @0xsequence/config@0.25.0
+ - @0xsequence/network@0.25.0
+ - @0xsequence/utils@0.25.0
+ - @0xsequence/wallet@0.25.0
+
+## 0.24.1
+
+### Patch Changes
+
+- @0xsequence/wallet@0.24.1
+
+## 0.24.0
+
+### Patch Changes
+
+- Updated dependencies [undefined]
+ - @0xsequence/api@0.24.0
+ - @0xsequence/wallet@0.24.0
+
+## 0.23.0
+
+### Minor Changes
+
+- - relayer: offer variety of gas fee options from the relayer service"
+
+### Patch Changes
+
+- Updated dependencies [undefined]
+ - @0xsequence/abi@0.23.0
+ - @0xsequence/api@0.23.0
+ - @0xsequence/config@0.23.0
+ - @0xsequence/network@0.23.0
+ - @0xsequence/utils@0.23.0
+ - @0xsequence/wallet@0.23.0
+
+## 0.22.2
+
+### Patch Changes
+
+- e1c109e: Fix authProof on expired sessions
+- Updated dependencies [e1c109e]
+ - @0xsequence/abi@0.22.2
+ - @0xsequence/api@0.22.2
+ - @0xsequence/config@0.22.2
+ - @0xsequence/network@0.22.2
+ - @0xsequence/utils@0.22.2
+ - @0xsequence/wallet@0.22.2
+
+## 0.22.1
+
+### Patch Changes
+
+- transport session cache
+- Updated dependencies [undefined]
+ - @0xsequence/abi@0.22.1
+ - @0xsequence/api@0.22.1
+ - @0xsequence/config@0.22.1
+ - @0xsequence/network@0.22.1
+ - @0xsequence/utils@0.22.1
+ - @0xsequence/wallet@0.22.1
+
+## 0.22.0
+
+### Minor Changes
+
+- e667b65: Expose all relayer options on networks
+
+### Patch Changes
+
+- Updated dependencies [e667b65]
+ - @0xsequence/abi@0.22.0
+ - @0xsequence/network@0.22.0
+ - @0xsequence/utils@0.22.0
+ - @0xsequence/wallet@0.22.0
+ - @0xsequence/api@0.22.0
+ - @0xsequence/config@0.22.0
+
+## 0.21.5
+
+### Patch Changes
+
+- Give priority to metaTxnId returned by relayer
+- Updated dependencies [undefined]
+ - @0xsequence/abi@0.21.5
+ - @0xsequence/api@0.21.5
+ - @0xsequence/config@0.21.5
+ - @0xsequence/network@0.21.5
+ - @0xsequence/utils@0.21.5
+ - @0xsequence/wallet@0.21.5
+
+## 0.21.4
+
+### Patch Changes
+
+- Add has enough signers method
+- Updated dependencies [undefined]
+ - @0xsequence/abi@0.21.4
+ - @0xsequence/api@0.21.4
+ - @0xsequence/config@0.21.4
+ - @0xsequence/network@0.21.4
+ - @0xsequence/utils@0.21.4
+ - @0xsequence/wallet@0.21.4
+
+## 0.21.3
+
+### Patch Changes
+
+- add window session cache
+- Updated dependencies [undefined]
+ - @0xsequence/abi@0.21.3
+ - @0xsequence/api@0.21.3
+ - @0xsequence/config@0.21.3
+ - @0xsequence/network@0.21.3
+ - @0xsequence/utils@0.21.3
+ - @0xsequence/wallet@0.21.3
+
+## 0.21.2
+
+### Patch Changes
+
+- exception handlind in relayer
+- Updated dependencies [undefined]
+ - @0xsequence/abi@0.21.2
+ - @0xsequence/api@0.21.2
+ - @0xsequence/config@0.21.2
+ - @0xsequence/network@0.21.2
+ - @0xsequence/utils@0.21.2
+ - @0xsequence/wallet@0.21.2
+
+## 0.21.1
+
+### Patch Changes
+
+- Updated dependencies [undefined]
+ - @0xsequence/wallet@0.21.1
+
+## 0.21.0
+
+### Minor Changes
+
+- - fix gas estimation on wallets with large number of signers
+ - update to session handling and wallet config construction upon auth
+
+### Patch Changes
+
+- Updated dependencies [undefined]
+ - @0xsequence/abi@0.21.0
+ - @0xsequence/api@0.21.0
+ - @0xsequence/config@0.21.0
+ - @0xsequence/network@0.21.0
+ - @0xsequence/utils@0.21.0
+ - @0xsequence/wallet@0.21.0
+
+## 0.20.0
+
+### Minor Changes
+
+- revert JWT request piggybacking
+
+### Patch Changes
+
+- Updated dependencies [undefined]
+ - @0xsequence/api@0.20.0
+
+## 0.19.3
+
+### Patch Changes
+
+- jwtAuth visibility, package version sync
+- Updated dependencies [undefined]
+ - @0xsequence/abi@0.19.3
+ - @0xsequence/api@0.19.3
+ - @0xsequence/config@0.19.3
+ - @0xsequence/network@0.19.3
+ - @0xsequence/utils@0.19.3
+ - @0xsequence/wallet@0.19.3
+
+## 0.19.2
+
+### Patch Changes
+
+- Updated dependencies [undefined]
+ - @0xsequence/abi@0.19.2
+ - @0xsequence/config@0.19.2
+ - @0xsequence/wallet@0.19.2
+
+## 0.19.0
+
+### Minor Changes
+
+- - provider, improve dapp / wallet transport io
+
+### Patch Changes
+
+- Updated dependencies [undefined]
+ - @0xsequence/abi@0.19.0
+ - @0xsequence/api@0.19.0
+ - @0xsequence/config@0.19.0
+ - @0xsequence/network@0.19.0
+ - @0xsequence/utils@0.19.0
+ - @0xsequence/wallet@0.19.0
+
+## 0.18.0
+
+### Minor Changes
+
+- relayer improvements and pending transaction handling
+
+### Patch Changes
+
+- Updated dependencies [undefined]
+ - @0xsequence/abi@0.18.0
+ - @0xsequence/api@0.18.0
+ - @0xsequence/config@0.18.0
+ - @0xsequence/network@0.18.0
+ - @0xsequence/wallet@0.18.0
+
+## 0.17.0
+
+### Minor Changes
+
+- piggyback on already pending JWT and signing requests
+
+### Patch Changes
+
+- Updated dependencies [undefined]
+ - @0xsequence/api@0.17.0
+
+## 0.16.1
+
+### Patch Changes
+
+- Updated dependencies [undefined]
+ - @0xsequence/api@0.16.1
+
+## 0.16.0
+
+### Minor Changes
+
+- relayer as its own service separate from chaind
+
+### Patch Changes
+
+- Updated dependencies [undefined]
+ - @0xsequence/abi@0.16.0
+ - @0xsequence/api@0.16.0
+ - @0xsequence/config@0.16.0
+ - @0xsequence/network@0.16.0
+ - @0xsequence/wallet@0.16.0
+
+## 0.15.1
+
+### Patch Changes
+
+- update api clients
+- Updated dependencies [undefined]
+ - @0xsequence/abi@0.15.1
+ - @0xsequence/api@0.15.1
+ - @0xsequence/config@0.15.1
+ - @0xsequence/network@0.15.1
+ - @0xsequence/wallet@0.15.1
+
+## 0.15.0
+
+### Patch Changes
+
+- Updated dependencies [undefined]
+ - @0xsequence/api@0.15.0
+ - @0xsequence/wallet@0.15.0
+
+## 0.14.3
+
+### Patch Changes
+
+- Fix 0xSequence relayer dependencies
+- Updated dependencies [undefined]
+ - @0xsequence/abi@0.14.3
+ - @0xsequence/api@0.14.3
+ - @0xsequence/config@0.14.3
+ - @0xsequence/network@0.14.3
+ - @0xsequence/wallet@0.14.3
+
+## 0.14.2
+
+### Patch Changes
+
+- Add debug logs to rpc-relayer
+- Updated dependencies [undefined]
+ - @0xsequence/abi@0.14.2
+ - @0xsequence/api@0.14.2
+ - @0xsequence/config@0.14.2
+ - @0xsequence/network@0.14.2
+ - @0xsequence/wallet@0.14.2
+
+## 0.14.0
+
+### Minor Changes
+
+- update sequence utils finder which includes optimization
+
+### Patch Changes
+
+- Updated dependencies [undefined]
+ - @0xsequence/abi@0.14.0
+ - @0xsequence/api@0.14.0
+ - @0xsequence/config@0.14.0
+ - @0xsequence/network@0.14.0
+ - @0xsequence/wallet@0.14.0
+
+## 0.13.0
+
+### Minor Changes
+
+- Update SequenceUtils deployed contract
+
+### Patch Changes
+
+- Updated dependencies [undefined]
+ - @0xsequence/abi@0.13.0
+ - @0xsequence/api@0.13.0
+ - @0xsequence/config@0.13.0
+ - @0xsequence/network@0.13.0
+ - @0xsequence/wallet@0.13.0
+
+## 0.12.1
+
+### Patch Changes
+
+- npm bump
+- Updated dependencies [undefined]
+ - @0xsequence/abi@0.12.1
+ - @0xsequence/api@0.12.1
+ - @0xsequence/config@0.12.1
+ - @0xsequence/network@0.12.1
+ - @0xsequence/wallet@0.12.1
+
+## 0.12.0
+
+### Minor Changes
+
+- provider: improvements to window transport
+
+### Patch Changes
+
+- Updated dependencies [undefined]
+ - @0xsequence/abi@0.12.0
+ - @0xsequence/api@0.12.0
+ - @0xsequence/config@0.12.0
+ - @0xsequence/network@0.12.0
+ - @0xsequence/wallet@0.12.0
+
+## 0.11.4
+
+### Patch Changes
+
+- update api client
+- Updated dependencies [undefined]
+ - @0xsequence/api@0.11.4
+ - @0xsequence/abi@0.11.4
+ - @0xsequence/config@0.11.4
+ - @0xsequence/network@0.11.4
+ - @0xsequence/wallet@0.11.4
+
+## 0.11.3
+
+### Patch Changes
+
+- improve openWindow state options handling
+- Updated dependencies [undefined]
+ - @0xsequence/abi@0.11.3
+ - @0xsequence/api@0.11.3
+ - @0xsequence/config@0.11.3
+ - @0xsequence/network@0.11.3
+ - @0xsequence/wallet@0.11.3
+
+## 0.11.2
+
+### Patch Changes
+
+- Fix multicall proxy scopes
+- Updated dependencies [undefined]
+ - @0xsequence/abi@0.11.2
+ - @0xsequence/api@0.11.2
+ - @0xsequence/config@0.11.2
+ - @0xsequence/network@0.11.2
+ - @0xsequence/wallet@0.11.2
+
+## 0.11.1
+
+### Patch Changes
+
+- Add support for dynamic and nested signatures
+- Updated dependencies [undefined]
+ - @0xsequence/abi@0.11.1
+ - @0xsequence/api@0.11.1
+ - @0xsequence/config@0.11.1
+ - @0xsequence/network@0.11.1
+ - @0xsequence/wallet@0.11.1
+
+## 0.11.0
+
+### Minor Changes
+
+- Update wallet context to 1.7 contracts
+
+### Patch Changes
+
+- Updated dependencies [undefined]
+ - @0xsequence/abi@0.11.0
+ - @0xsequence/api@0.11.0
+ - @0xsequence/config@0.11.0
+ - @0xsequence/network@0.11.0
+ - @0xsequence/wallet@0.11.0
+
+## 0.10.9
+
+### Patch Changes
+
+- add support for public addresses as signers in session.open
+- Updated dependencies [undefined]
+ - @0xsequence/abi@0.10.9
+ - @0xsequence/api@0.10.9
+ - @0xsequence/config@0.10.9
+ - @0xsequence/network@0.10.9
+ - @0xsequence/wallet@0.10.9
+
+## 0.10.8
+
+### Patch Changes
+
+- Multicall production configuration
+- Updated dependencies [undefined]
+ - @0xsequence/abi@0.10.8
+ - @0xsequence/api@0.10.8
+ - @0xsequence/config@0.10.8
+ - @0xsequence/network@0.10.8
+ - @0xsequence/wallet@0.10.8
+
+## 0.10.7
+
+### Patch Changes
+
+- allow provider transport to force disconnect
+- Updated dependencies [undefined]
+ - @0xsequence/abi@0.10.7
+ - @0xsequence/api@0.10.7
+ - @0xsequence/config@0.10.7
+ - @0xsequence/network@0.10.7
+ - @0xsequence/wallet@0.10.7
+
+## 0.10.6
+
+### Patch Changes
+
+- - fix getWalletState method
+- Updated dependencies [undefined]
+ - @0xsequence/abi@0.10.6
+ - @0xsequence/api@0.10.6
+ - @0xsequence/config@0.10.6
+ - @0xsequence/network@0.10.6
+ - @0xsequence/wallet@0.10.6
+
+## 0.10.5
+
+### Patch Changes
+
+- update relayer gas refund options
+- Updated dependencies [undefined]
+ - @0xsequence/abi@0.10.5
+ - @0xsequence/api@0.10.5
+ - @0xsequence/config@0.10.5
+ - @0xsequence/network@0.10.5
+ - @0xsequence/wallet@0.10.5
+
+## 0.10.4
+
+### Patch Changes
+
+- Update api proto
+- Updated dependencies [undefined]
+ - @0xsequence/abi@0.10.4
+ - @0xsequence/api@0.10.4
+ - @0xsequence/config@0.10.4
+ - @0xsequence/network@0.10.4
+ - @0xsequence/wallet@0.10.4
+
+## 0.10.3
+
+### Patch Changes
+
+- Fix loading config cross-chain
+- Updated dependencies [undefined]
+ - @0xsequence/abi@0.10.3
+ - @0xsequence/api@0.10.3
+ - @0xsequence/config@0.10.3
+ - @0xsequence/network@0.10.3
+ - @0xsequence/wallet@0.10.3
+
+## 0.10.2
+
+### Patch Changes
+
+- - message digest fix
+- Updated dependencies [undefined]
+ - @0xsequence/abi@0.10.2
+ - @0xsequence/api@0.10.2
+ - @0xsequence/config@0.10.2
+ - @0xsequence/network@0.10.2
+ - @0xsequence/wallet@0.10.2
+
+## 0.10.1
+
+### Patch Changes
+
+- upgrade deps
+- Updated dependencies [undefined]
+ - @0xsequence/abi@0.10.1
+ - @0xsequence/api@0.10.1
+ - @0xsequence/config@0.10.1
+ - @0xsequence/network@0.10.1
+ - @0xsequence/wallet@0.10.1
+
+## 0.10.0
+
+### Minor Changes
+
+- Deployed new contracts with ERC1271 signer support
+
+### Patch Changes
+
+- Updated dependencies [undefined]
+ - @0xsequence/abi@0.10.0
+ - @0xsequence/api@0.10.0
+ - @0xsequence/config@0.10.0
+ - @0xsequence/network@0.10.0
+ - @0xsequence/wallet@0.10.0
+
+## 0.9.6
+
+### Patch Changes
+
+- Update ABIs for latest sequence contracts
+- Updated dependencies [undefined]
+ - @0xsequence/api@0.9.6
+ - @0xsequence/config@0.9.6
+ - @0xsequence/network@0.9.6
+ - @0xsequence/wallet@0.9.6
+ - @0xsequence/abi@0.9.6
+
+## 0.9.5
+
+### Patch Changes
+
+- Implemented session class
+- Updated dependencies [undefined]
+ - @0xsequence/api@0.9.5
+ - @0xsequence/config@0.9.5
+ - @0xsequence/network@0.9.5
+ - @0xsequence/wallet@0.9.5
+
+## 0.9.3
+
+### Patch Changes
+
+- - minor improvements
+- Updated dependencies [undefined]
+ - @0xsequence/abi@0.9.3
+ - @0xsequence/network@0.9.3
+ - @0xsequence/wallet@0.9.3
+
+## 0.9.1
+
+### Patch Changes
+
+- - patch bump
+- Updated dependencies [undefined]
+ - @0xsequence/abi@0.9.1
+ - @0xsequence/network@0.9.1
+ - @0xsequence/wallet@0.9.1
+
+## 0.9.0
+
+### Minor Changes
+
+- - provider transport hardening
+
+### Patch Changes
+
+- Updated dependencies [undefined]
+ - @0xsequence/abi@0.9.0
+ - @0xsequence/network@0.9.0
+ - @0xsequence/wallet@0.9.0
+
+## 0.8.5
+
+### Patch Changes
+
+- - use latest wallet-contracts
+- Updated dependencies [undefined]
+ - @0xsequence/abi@0.8.5
+ - @0xsequence/network@0.8.5
+ - @0xsequence/wallet@0.8.5
+
+## 0.8.4
+
+### Patch Changes
+
+- - minor improvements, name updates and comments
+- Updated dependencies [undefined]
+ - @0xsequence/abi@0.8.4
+ - @0xsequence/network@0.8.4
+ - @0xsequence/wallet@0.8.4
+
+## 0.8.3
+
+### Patch Changes
+
+- - refinements
+
+ - normalize signer address in config
+
+ - provider: getWalletState() method to WalletProvider
+
+- Updated dependencies [undefined]
+ - @0xsequence/abi@0.8.3
+ - @0xsequence/network@0.8.3
+ - @0xsequence/wallet@0.8.3
+
+## 0.8.2
+
+### Patch Changes
+
+- - field rename and ethauth dependency bump
+- Updated dependencies [undefined]
+ - @0xsequence/abi@0.8.2
+ - @0xsequence/network@0.8.2
+ - @0xsequence/wallet@0.8.2
+
+## 0.8.1
+
+### Patch Changes
+
+- - variety of optimizations
+- Updated dependencies [undefined]
+ - @0xsequence/abi@0.8.1
+ - @0xsequence/network@0.8.1
+ - @0xsequence/wallet@0.8.1
+
+## 0.8.0
+
+### Minor Changes
+
+- - changeset fix
+
+### Patch Changes
+
+- Updated dependencies [undefined]
+ - @0xsequence/abi@0.8.0
+ - @0xsequence/network@0.8.0
+ - @0xsequence/wallet@0.8.0
+
+## 0.7.2
+
+### Patch Changes
+
+- package.json fix
+
+## 0.7.0
+
+### Patch Changes
+
+- 6f11ed7: sequence.js, init release
+- Updated dependencies [6f11ed7]
+ - @0xsequence/abi@0.7.0
+ - @0xsequence/network@0.7.0
+ - @0xsequence/wallet@0.7.0
diff --git a/packages/auth/README.md b/packages/auth/README.md
new file mode 100644
index 0000000000..33f7072359
--- /dev/null
+++ b/packages/auth/README.md
@@ -0,0 +1,4 @@
+@0xsequence/auth
+================
+
+See [0xsequence project page](https://github.com/0xsequence/sequence.js).
diff --git a/packages/auth/hardhat.config.js b/packages/auth/hardhat.config.js
new file mode 100644
index 0000000000..eaca505314
--- /dev/null
+++ b/packages/auth/hardhat.config.js
@@ -0,0 +1,15 @@
+/**
+ * @type import('hardhat/config').HardhatUserConfig
+ */
+module.exports = {
+ solidity: '0.7.6',
+
+ networks: {
+ hardhat: {
+ chainId: 31337,
+ accounts: {
+ mnemonic: 'ripple axis someone ridge uniform wrist prosper there frog rate olympic knee'
+ }
+ }
+ }
+}
diff --git a/packages/auth/package.json b/packages/auth/package.json
new file mode 100644
index 0000000000..945ca4f2d8
--- /dev/null
+++ b/packages/auth/package.json
@@ -0,0 +1,49 @@
+{
+ "name": "@0xsequence/auth",
+ "version": "2.0.0",
+ "description": "auth sub-package for Sequence",
+ "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/auth",
+ "source": "src/index.ts",
+ "main": "dist/0xsequence-auth.cjs.js",
+ "module": "dist/0xsequence-auth.esm.js",
+ "author": "Horizon Blockchain Games",
+ "license": "Apache-2.0",
+ "scripts": {
+ "test": "pnpm test:concurrently 'pnpm test:run'",
+ "test:run": "pnpm test:file tests/**/*.spec.ts",
+ "test:file": "NODE_OPTIONS='--import tsx' mocha --timeout 30000",
+ "test:concurrently": "concurrently -k --success first 'pnpm start:hardhat > /dev/null' ",
+ "start:hardhat": "hardhat node --port 9546",
+ "typecheck": "tsc --noEmit"
+ },
+ "dependencies": {
+ "@0xsequence/abi": "workspace:*",
+ "@0xsequence/account": "workspace:*",
+ "@0xsequence/api": "workspace:*",
+ "@0xsequence/core": "workspace:*",
+ "@0xsequence/ethauth": "^0.8.1",
+ "@0xsequence/indexer": "workspace:*",
+ "@0xsequence/metadata": "workspace:*",
+ "@0xsequence/migration": "workspace:*",
+ "@0xsequence/network": "workspace:*",
+ "@0xsequence/sessions": "workspace:*",
+ "@0xsequence/signhub": "workspace:*",
+ "@0xsequence/wallet": "workspace:*",
+ "@0xsequence/utils": "workspace:*"
+ },
+ "peerDependencies": {
+ "ethers": ">=5.5 < 6"
+ },
+ "devDependencies": {
+ "@0xsequence/tests": "workspace:*",
+ "@0xsequence/wallet-contracts": "^1.10.0",
+ "concurrently": "^7.5.0",
+ "ethers": "^5.7.2",
+ "hardhat": "^2.20.1",
+ "mockttp": "^3.6.0"
+ },
+ "files": [
+ "src",
+ "dist"
+ ]
+}
diff --git a/packages/auth/src/authorization.ts b/packages/auth/src/authorization.ts
new file mode 100644
index 0000000000..103c2b2a79
--- /dev/null
+++ b/packages/auth/src/authorization.ts
@@ -0,0 +1,81 @@
+import { ethers } from 'ethers'
+import { ETHAuth, Proof } from '@0xsequence/ethauth'
+import { ChainIdLike, toChainIdNumber } from '@0xsequence/network'
+import { TypedData } from '@0xsequence/utils'
+import { Signer } from '@0xsequence/wallet'
+import { Account } from '@0xsequence/account'
+import { DEFAULT_SESSION_EXPIRATION } from './services'
+
+export interface AuthorizationOptions {
+ // app name string, ie 'Skyweaver'
+ app?: string
+
+ // origin hostname of encoded in the message, ie. 'play.skyweaver.net'
+ origin?: string
+
+ // expiry in seconds encoded in the message
+ expiry?: number
+
+ // nonce for the authorization request
+ nonce?: number
+}
+
+export interface ETHAuthProof {
+ // eip712 typed-data payload for ETHAuth domain as input
+ typedData: TypedData
+
+ // signature encoded in an ETHAuth proof string
+ proofString: string
+}
+
+// signAuthorization will perform an EIP712 typed-data message signing of ETHAuth domain via the provided
+// Signer and authorization options.
+export const signAuthorization = async (
+ signer: Signer | Account,
+ chainId: ChainIdLike,
+ options: AuthorizationOptions
+): Promise => {
+ const address = ethers.utils.getAddress(await signer.getAddress())
+ if (!address || address === '' || address === '0x') {
+ throw ErrAccountIsRequired
+ }
+
+ const proof = new Proof()
+ proof.address = address
+
+ if (!options || !options.app || options.app === '') {
+ throw new AuthError('authorization options requires app to be set')
+ }
+ proof.claims.app = options.app
+ proof.claims.ogn = options.origin
+ proof.claims.n = options.nonce
+
+ proof.setExpiryIn(options.expiry ? Math.max(options.expiry, 200) : DEFAULT_SESSION_EXPIRATION)
+
+ const typedData = proof.messageTypedData()
+
+ const chainIdNumber = toChainIdNumber(chainId)
+
+ proof.signature = await (signer instanceof Account
+ ? // Account can sign EIP-6492 signatures, so it doesn't require deploying the wallet
+ signer.signTypedData(typedData.domain, typedData.types, typedData.message, chainIdNumber, 'eip6492')
+ : signer.signTypedData(typedData.domain, typedData.types, typedData.message, chainIdNumber))
+
+ const ethAuth = new ETHAuth()
+ const proofString = await ethAuth.encodeProof(proof, true)
+
+ return {
+ typedData,
+ proofString
+ }
+}
+
+// TODO: review......
+export class AuthError extends Error {
+ constructor(message?: string) {
+ super(message)
+ this.name = 'AuthError'
+ }
+}
+
+export const ErrAccountIsRequired = new AuthError('auth error: account address is empty')
diff --git a/packages/auth/src/index.ts b/packages/auth/src/index.ts
new file mode 100644
index 0000000000..af64af8df0
--- /dev/null
+++ b/packages/auth/src/index.ts
@@ -0,0 +1,3 @@
+export * from './authorization'
+export * from './session'
+export * from './proof'
diff --git a/packages/auth/src/proof.ts b/packages/auth/src/proof.ts
new file mode 100644
index 0000000000..23051fde69
--- /dev/null
+++ b/packages/auth/src/proof.ts
@@ -0,0 +1,16 @@
+import { commons } from '@0xsequence/core'
+import { Proof, ValidatorFunc } from '@0xsequence/ethauth'
+import { tracker } from '@0xsequence/sessions'
+import { ethers } from 'ethers'
+
+export const ValidateSequenceWalletProof = (
+ readerFor: (chainId: number) => commons.reader.Reader,
+ tracker: tracker.ConfigTracker,
+ context: commons.context.WalletContext
+): ValidatorFunc => {
+ return async (_provider: ethers.providers.JsonRpcProvider, chainId: number, proof: Proof): Promise<{ isValid: boolean }> => {
+ const digest = proof.messageDigest()
+ const isValid = await readerFor(chainId).isValidSignature(proof.address, digest, proof.signature)
+ return { isValid }
+ }
+}
diff --git a/packages/auth/src/services.ts b/packages/auth/src/services.ts
new file mode 100644
index 0000000000..6db53a216d
--- /dev/null
+++ b/packages/auth/src/services.ts
@@ -0,0 +1,337 @@
+import { Account } from '@0xsequence/account'
+import { SequenceAPIClient } from '@0xsequence/api'
+import { ETHAuth, Proof } from '@0xsequence/ethauth'
+import { Indexer, SequenceIndexer } from '@0xsequence/indexer'
+import { SequenceMetadata } from '@0xsequence/metadata'
+import { ChainIdLike, findNetworkConfig } from '@0xsequence/network'
+import { getEthersConnectionInfo } from '@0xsequence/utils'
+import { ethers } from 'ethers'
+
+export type SessionMeta = {
+ // name of the app requesting the session, used with ETHAuth
+ name: string
+
+ // expiration in seconds for a session before it expires, used with ETHAuth
+ expiration?: number
+}
+
+export type ServicesSettings = {
+ metadata: SessionMeta
+ sequenceApiUrl: string
+ sequenceApiChainId: ethers.BigNumberish
+ sequenceMetadataUrl: string
+}
+
+export type SessionJWT = {
+ token: string
+ expiration: number
+}
+
+export type SessionJWTPromise = {
+ token: Promise
+ expiration: number
+}
+
+export type ProofStringPromise = {
+ proofString: Promise