diff --git a/.changeset/all-rings-bow.md b/.changeset/all-rings-bow.md new file mode 100644 index 000000000..402bc8aee --- /dev/null +++ b/.changeset/all-rings-bow.md @@ -0,0 +1,18 @@ +--- +'@0xsequence/api': patch +'@0xsequence/builder': patch +'@0xsequence/guard': patch +'@0xsequence/identity-instrument': patch +'@0xsequence/indexer': patch +'@0xsequence/marketplace': patch +'@0xsequence/metadata': patch +'@0xsequence/relayer': patch +'@0xsequence/userdata': patch +'@0xsequence/abi': patch +'@0xsequence/wallet-core': patch +'@0xsequence/dapp-client': patch +'@0xsequence/wallet-primitives': patch +'@0xsequence/wallet-wdk': patch +--- + +ethauth support diff --git a/.changeset/brave-papayas-join.md b/.changeset/brave-papayas-join.md new file mode 100644 index 000000000..bd37b6ba8 --- /dev/null +++ b/.changeset/brave-papayas-join.md @@ -0,0 +1,18 @@ +--- +'@0xsequence/api': patch +'@0xsequence/builder': patch +'@0xsequence/guard': patch +'@0xsequence/identity-instrument': patch +'@0xsequence/indexer': patch +'@0xsequence/marketplace': patch +'@0xsequence/metadata': patch +'@0xsequence/relayer': patch +'@0xsequence/userdata': patch +'@0xsequence/abi': patch +'@0xsequence/wallet-core': patch +'@0xsequence/dapp-client': patch +'@0xsequence/wallet-primitives': patch +'@0xsequence/wallet-wdk': patch +--- + +New chains, minor fixes diff --git a/.changeset/pre.json b/.changeset/pre.json index 6c2320499..49368d22d 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -4,25 +4,27 @@ "initialVersions": { "docs": "0.1.0", "web": "0.1.0", - "@0xsequence/api": "3.0.0-beta.13", - "@0xsequence/builder": "3.0.0-beta.13", - "@0xsequence/guard": "3.0.0-beta.13", - "@0xsequence/identity-instrument": "3.0.0-beta.13", - "@0xsequence/indexer": "3.0.0-beta.13", - "@0xsequence/marketplace": "3.0.0-beta.13", - "@0xsequence/metadata": "3.0.0-beta.13", - "@0xsequence/relayer": "3.0.0-beta.13", - "@0xsequence/userdata": "3.0.0-beta.13", - "@0xsequence/abi": "3.0.0-beta.13", - "@0xsequence/wallet-core": "3.0.0-beta.13", - "@0xsequence/dapp-client": "3.0.0-beta.13", - "@0xsequence/wallet-primitives": "3.0.0-beta.13", - "@0xsequence/wallet-wdk": "3.0.0-beta.13", + "@0xsequence/api": "3.0.0-beta.15", + "@0xsequence/builder": "3.0.0-beta.15", + "@0xsequence/guard": "3.0.0-beta.15", + "@0xsequence/identity-instrument": "3.0.0-beta.15", + "@0xsequence/indexer": "3.0.0-beta.15", + "@0xsequence/marketplace": "3.0.0-beta.15", + "@0xsequence/metadata": "3.0.0-beta.15", + "@0xsequence/relayer": "3.0.0-beta.15", + "@0xsequence/userdata": "3.0.0-beta.15", + "@0xsequence/abi": "3.0.0-beta.15", + "@0xsequence/wallet-core": "3.0.0-beta.15", + "@0xsequence/dapp-client": "3.0.0-beta.15", + "@0xsequence/wallet-primitives": "3.0.0-beta.15", + "@0xsequence/wallet-wdk": "3.0.0-beta.15", "@repo/eslint-config": "0.0.1-beta.1", "@repo/typescript-config": "0.0.1-beta.1", "@repo/ui": "0.0.1-beta.1" }, "changesets": [ + "all-rings-bow", + "brave-papayas-join", "bright-pots-hope", "crisp-zoos-retire", "cyan-radios-relax", diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 000000000..ad53a8e49 --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,26 @@ +# Use the latest 2.1 version of CircleCI pipeline process engine. +# See: https://circleci.com/docs/configuration-reference + +version: 2.1 +executors: + my-custom-executor: + docker: + - image: cimg/base:stable + auth: + # ensure you have first added these secrets + # visit app.circleci.com/settings/project/github/Dargon789/foundry/environment-variables + username: $DOCKER_HUB_USER + password: $DOCKER_HUB_PASSWORD +jobs: + web3-defi-game-project-: + + executor: my-custom-executor + steps: + - checkout + - run: | + # echo Hello, World! + +workflows: + my-custom-workflow: + jobs: + - web3-defi-game-project- diff --git a/.codesandbox/tasks.json b/.codesandbox/tasks.json new file mode 100644 index 000000000..5be606cdf --- /dev/null +++ b/.codesandbox/tasks.json @@ -0,0 +1,118 @@ +{ + // These tasks will run in order when initializing your CodeSandbox project. + "setupTasks": [ + { + "name": "Install Dependencies", + "command": "pnpm install" + } + ], + + // These tasks can be run from CodeSandbox. Running one will open a log in the app. + "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/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 000000000..81c7b58d8 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,38 @@ +--- +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. + +**Desktop (please complete the following information):** + - OS: [e.g. iOS] + - Browser [e.g. chrome, safari] + - Version [e.g. 22] + +**Smartphone (please complete the following information):** + - Device: [e.g. iPhone6] + - OS: [e.g. iOS8.1] + - Browser [e.g. stock browser, safari] + - Version [e.g. 22] + +**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 000000000..48d5f81fa --- /dev/null +++ b/.github/ISSUE_TEMPLATE/custom.md @@ -0,0 +1,10 @@ +--- +name: Custom issue template +about: Describe this issue template's purpose here. +title: '' +labels: '' +assignees: '' + +--- + + diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 000000000..36014cde5 --- /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/workflows/on_pr_pnpm-format-label.yml b/.github/workflows/on_pr_pnpm-format-label.yml index 84fb27cb3..83f23775a 100644 --- a/.github/workflows/on_pr_pnpm-format-label.yml +++ b/.github/workflows/on_pr_pnpm-format-label.yml @@ -1,5 +1,9 @@ name: pnpm-format-label +permissions: + contents: read + issues: write + on: pull_request: types: [labeled] diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 20d477729..00f6206aa 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -9,6 +9,7 @@ jobs: steps: - uses: actions/checkout@v4 - uses: ./.github/actions/install-dependencies + - run: pnpm install --no-frozen-lockfile build: name: Run build diff --git a/CNAME b/CNAME new file mode 100644 index 000000000..aa0085b19 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +sequence.app \ No newline at end of file diff --git a/FUNDING.json b/FUNDING.json new file mode 100644 index 000000000..cb7bbaf78 --- /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 000000000..6112730aa --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,19 @@ +# 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. + +Tell them to email [your-security-email@example.com], and they can expect an initial response within 48 hours. We will provide regular updates on the status of the reported vulnerability. diff --git a/azure-pipelines.yml b/azure-pipelines.yml new file mode 100644 index 000000000..676233afa --- /dev/null +++ b/azure-pipelines.yml @@ -0,0 +1,21 @@ +# 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/packages/services/api/CHANGELOG.md b/packages/services/api/CHANGELOG.md index b128c5ff3..bc1959686 100644 --- a/packages/services/api/CHANGELOG.md +++ b/packages/services/api/CHANGELOG.md @@ -1,5 +1,17 @@ # @0xsequence/api +## 3.0.0-beta.16 + +### Patch Changes + +- ethauth support + +## 3.0.0-beta.15 + +### Patch Changes + +- New chains, minor fixes + ## 3.0.0-beta.14 ### Patch Changes diff --git a/packages/services/api/package.json b/packages/services/api/package.json index bc3cb01f9..4b86f2030 100644 --- a/packages/services/api/package.json +++ b/packages/services/api/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/api", - "version": "3.0.0-beta.14", + "version": "3.0.0-beta.16", "description": "api sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/api", "author": "Sequence Platforms Inc.", diff --git a/packages/services/builder/CHANGELOG.md b/packages/services/builder/CHANGELOG.md index ebe8b517a..0721cdb8d 100644 --- a/packages/services/builder/CHANGELOG.md +++ b/packages/services/builder/CHANGELOG.md @@ -1,5 +1,17 @@ # @0xsequence/builder +## 3.0.0-beta.16 + +### Patch Changes + +- ethauth support + +## 3.0.0-beta.15 + +### Patch Changes + +- New chains, minor fixes + ## 3.0.0-beta.14 ### Patch Changes diff --git a/packages/services/builder/package.json b/packages/services/builder/package.json index 9735708a1..c641a4b48 100644 --- a/packages/services/builder/package.json +++ b/packages/services/builder/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/builder", - "version": "3.0.0-beta.14", + "version": "3.0.0-beta.16", "description": "builder sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/builder", "author": "Sequence Platforms Inc.", diff --git a/packages/services/guard/CHANGELOG.md b/packages/services/guard/CHANGELOG.md index 9eec36307..b8a0a9514 100644 --- a/packages/services/guard/CHANGELOG.md +++ b/packages/services/guard/CHANGELOG.md @@ -1,5 +1,17 @@ # @0xsequence/guard +## 3.0.0-beta.16 + +### Patch Changes + +- ethauth support + +## 3.0.0-beta.15 + +### Patch Changes + +- New chains, minor fixes + ## 3.0.0-beta.14 ### Patch Changes diff --git a/packages/services/guard/package.json b/packages/services/guard/package.json index 648b82da9..52dbd589d 100644 --- a/packages/services/guard/package.json +++ b/packages/services/guard/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/guard", - "version": "3.0.0-beta.14", + "version": "3.0.0-beta.16", "description": "guard sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/guard", "author": "Sequence Platforms Inc.", diff --git a/packages/services/identity-instrument/CHANGELOG.md b/packages/services/identity-instrument/CHANGELOG.md index 339d2ea9b..d5f8af0d3 100644 --- a/packages/services/identity-instrument/CHANGELOG.md +++ b/packages/services/identity-instrument/CHANGELOG.md @@ -1,5 +1,17 @@ # @0xsequence/identity-instrument +## 3.0.0-beta.16 + +### Patch Changes + +- ethauth support + +## 3.0.0-beta.15 + +### Patch Changes + +- New chains, minor fixes + ## 3.0.0-beta.14 ### Patch Changes diff --git a/packages/services/identity-instrument/package.json b/packages/services/identity-instrument/package.json index bccdc0fcf..bc77f0edf 100644 --- a/packages/services/identity-instrument/package.json +++ b/packages/services/identity-instrument/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/identity-instrument", - "version": "3.0.0-beta.14", + "version": "3.0.0-beta.16", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/services/identity-instrument/src/index.ts b/packages/services/identity-instrument/src/index.ts index f7b477b6c..12eb0f0ff 100644 --- a/packages/services/identity-instrument/src/index.ts +++ b/packages/services/identity-instrument/src/index.ts @@ -65,7 +65,7 @@ export class IdentityInstrument { keyType: KeyType.Ethereum_Secp256k1, }, digest: Hex.fromBytes(digest), - nonce: Hex.fromNumber(Date.now()), + nonce: Hex.random(16), } const res = await this.rpc.sign({ params, diff --git a/packages/services/indexer/CHANGELOG.md b/packages/services/indexer/CHANGELOG.md index a8b473d85..ca665306f 100644 --- a/packages/services/indexer/CHANGELOG.md +++ b/packages/services/indexer/CHANGELOG.md @@ -1,5 +1,17 @@ # @0xsequence/indexer +## 3.0.0-beta.16 + +### Patch Changes + +- ethauth support + +## 3.0.0-beta.15 + +### Patch Changes + +- New chains, minor fixes + ## 3.0.0-beta.14 ### Patch Changes diff --git a/packages/services/indexer/package.json b/packages/services/indexer/package.json index 97d083ce8..e5084709b 100644 --- a/packages/services/indexer/package.json +++ b/packages/services/indexer/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/indexer", - "version": "3.0.0-beta.14", + "version": "3.0.0-beta.16", "description": "indexer sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/indexer", "author": "Sequence Platforms Inc.", diff --git a/packages/services/marketplace/CHANGELOG.md b/packages/services/marketplace/CHANGELOG.md index a2a38e2b2..a92109365 100644 --- a/packages/services/marketplace/CHANGELOG.md +++ b/packages/services/marketplace/CHANGELOG.md @@ -1,5 +1,17 @@ # @0xsequence/marketplace +## 3.0.0-beta.16 + +### Patch Changes + +- ethauth support + +## 3.0.0-beta.15 + +### Patch Changes + +- New chains, minor fixes + ## 3.0.0-beta.14 ### Patch Changes diff --git a/packages/services/marketplace/package.json b/packages/services/marketplace/package.json index 77327c24d..36f2c2324 100644 --- a/packages/services/marketplace/package.json +++ b/packages/services/marketplace/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/marketplace", - "version": "3.0.0-beta.14", + "version": "3.0.0-beta.16", "description": "marketplace sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/marketplace", "author": "Sequence Platforms Inc.", diff --git a/packages/services/metadata/CHANGELOG.md b/packages/services/metadata/CHANGELOG.md index beafb27e4..e5c41b32e 100644 --- a/packages/services/metadata/CHANGELOG.md +++ b/packages/services/metadata/CHANGELOG.md @@ -1,5 +1,17 @@ # @0xsequence/metadata +## 3.0.0-beta.16 + +### Patch Changes + +- ethauth support + +## 3.0.0-beta.15 + +### Patch Changes + +- New chains, minor fixes + ## 3.0.0-beta.14 ### Patch Changes diff --git a/packages/services/metadata/package.json b/packages/services/metadata/package.json index e7244a1c1..de32e8041 100644 --- a/packages/services/metadata/package.json +++ b/packages/services/metadata/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/metadata", - "version": "3.0.0-beta.14", + "version": "3.0.0-beta.16", "publishConfig": { "access": "public" }, diff --git a/packages/services/relayer/CHANGELOG.md b/packages/services/relayer/CHANGELOG.md index c87be6901..f2c87bf54 100644 --- a/packages/services/relayer/CHANGELOG.md +++ b/packages/services/relayer/CHANGELOG.md @@ -1,5 +1,21 @@ # @0xsequence/relayer +## 3.0.0-beta.16 + +### Patch Changes + +- ethauth support +- Updated dependencies + - @0xsequence/wallet-primitives@3.0.0-beta.16 + +## 3.0.0-beta.15 + +### Patch Changes + +- New chains, minor fixes +- Updated dependencies + - @0xsequence/wallet-primitives@3.0.0-beta.15 + ## 3.0.0-beta.14 ### Patch Changes diff --git a/packages/services/relayer/package.json b/packages/services/relayer/package.json index d901e8922..1640229a2 100644 --- a/packages/services/relayer/package.json +++ b/packages/services/relayer/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/relayer", - "version": "3.0.0-beta.14", + "version": "3.0.0-beta.16", "type": "module", "publishConfig": { "access": "public" diff --git a/packages/services/userdata/CHANGELOG.md b/packages/services/userdata/CHANGELOG.md index f8ad642d9..774faa865 100644 --- a/packages/services/userdata/CHANGELOG.md +++ b/packages/services/userdata/CHANGELOG.md @@ -1,5 +1,17 @@ # @0xsequence/userdata +## 3.0.0-beta.16 + +### Patch Changes + +- ethauth support + +## 3.0.0-beta.15 + +### Patch Changes + +- New chains, minor fixes + ## 3.0.0-beta.14 ### Patch Changes diff --git a/packages/services/userdata/package.json b/packages/services/userdata/package.json index e0925a77b..6f1aa2bfb 100644 --- a/packages/services/userdata/package.json +++ b/packages/services/userdata/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/userdata", - "version": "3.0.0-beta.14", + "version": "3.0.0-beta.16", "description": "userdata sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/userdata", "author": "Sequence Platforms Inc.", diff --git a/packages/utils/abi/CHANGELOG.md b/packages/utils/abi/CHANGELOG.md index b79fc18fa..f62406f83 100644 --- a/packages/utils/abi/CHANGELOG.md +++ b/packages/utils/abi/CHANGELOG.md @@ -1,5 +1,17 @@ # @0xsequence/abi +## 3.0.0-beta.16 + +### Patch Changes + +- ethauth support + +## 3.0.0-beta.15 + +### Patch Changes + +- New chains, minor fixes + ## 3.0.0-beta.14 ### Patch Changes diff --git a/packages/utils/abi/package.json b/packages/utils/abi/package.json index 42d3c4bca..07d57a345 100644 --- a/packages/utils/abi/package.json +++ b/packages/utils/abi/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/abi", - "version": "3.0.0-beta.14", + "version": "3.0.0-beta.16", "description": "abi sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/utils/abi", "author": "Sequence Platforms Inc.", diff --git a/packages/wallet/core/CHANGELOG.md b/packages/wallet/core/CHANGELOG.md index b5a4f5c70..752a46056 100644 --- a/packages/wallet/core/CHANGELOG.md +++ b/packages/wallet/core/CHANGELOG.md @@ -1,5 +1,25 @@ # @0xsequence/wallet-core +## 3.0.0-beta.16 + +### Patch Changes + +- ethauth support +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.16 + - @0xsequence/relayer@3.0.0-beta.16 + - @0xsequence/wallet-primitives@3.0.0-beta.16 + +## 3.0.0-beta.15 + +### Patch Changes + +- New chains, minor fixes +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.15 + - @0xsequence/relayer@3.0.0-beta.15 + - @0xsequence/wallet-primitives@3.0.0-beta.15 + ## 3.0.0-beta.14 ### Patch Changes diff --git a/packages/wallet/core/package.json b/packages/wallet/core/package.json index 4467fec0c..3295b9a3a 100644 --- a/packages/wallet/core/package.json +++ b/packages/wallet/core/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-core", - "version": "3.0.0-beta.14", + "version": "3.0.0-beta.16", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/core/src/bundler/bundlers/pimlico.ts b/packages/wallet/core/src/bundler/bundlers/pimlico.ts index e2d95ec33..cc28079a6 100644 --- a/packages/wallet/core/src/bundler/bundlers/pimlico.ts +++ b/packages/wallet/core/src/bundler/bundlers/pimlico.ts @@ -21,11 +21,17 @@ export class PimlicoBundler implements Bundler { public readonly provider: Provider.Provider public readonly bundlerRpcUrl: string + private readonly fetcher: typeof fetch - constructor(bundlerRpcUrl: string, provider: Provider.Provider | string) { + constructor(bundlerRpcUrl: string, provider: Provider.Provider | string, fetcher?: typeof fetch) { this.id = `pimlico-erc4337-${bundlerRpcUrl}` this.provider = typeof provider === 'string' ? Provider.from(RpcTransport.fromHttp(provider)) : provider this.bundlerRpcUrl = bundlerRpcUrl + const resolvedFetch = fetcher ?? (globalThis as any).fetch + if (!resolvedFetch) { + throw new Error('fetch is not available') + } + this.fetcher = resolvedFetch } async isAvailable(entrypoint: Address.Address, chainId: number): Promise { @@ -165,7 +171,7 @@ export class PimlicoBundler implements Bundler { private async bundlerRpc(method: string, params: any[]): Promise { const body = JSON.stringify({ jsonrpc: '2.0', id: 1, method, params }) - const res = await fetch(this.bundlerRpcUrl, { + const res = await this.fetcher(this.bundlerRpcUrl, { method: 'POST', headers: { 'content-type': 'application/json' }, body, diff --git a/packages/wallet/core/src/env.ts b/packages/wallet/core/src/env.ts new file mode 100644 index 000000000..0a463dd1d --- /dev/null +++ b/packages/wallet/core/src/env.ts @@ -0,0 +1,68 @@ +export type StorageLike = { + getItem: (key: string) => string | null + setItem: (key: string, value: string) => void + removeItem: (key: string) => void +} + +export type CryptoLike = { + subtle: SubtleCrypto + getRandomValues: (array: T) => T +} + +export type TextEncodingLike = { + TextEncoder: typeof TextEncoder + TextDecoder: typeof TextDecoder +} + +export type CoreEnv = { + fetch?: typeof fetch + crypto?: CryptoLike + storage?: StorageLike + indexedDB?: IDBFactory + text?: Partial +} + +function isStorageLike(value: unknown): value is StorageLike { + if (!value || typeof value !== 'object') return false + const candidate = value as StorageLike + return ( + typeof candidate.getItem === 'function' && + typeof candidate.setItem === 'function' && + typeof candidate.removeItem === 'function' + ) +} + +export function resolveCoreEnv(env?: CoreEnv): CoreEnv { + const globalObj = globalThis as any + const windowObj = typeof window !== 'undefined' ? window : (globalObj.window ?? {}) + let storage: StorageLike | undefined + let text: Partial | undefined + + if (isStorageLike(env?.storage)) { + storage = env.storage + } else if (isStorageLike(windowObj.localStorage)) { + storage = windowObj.localStorage + } else if (isStorageLike(globalObj.localStorage)) { + storage = globalObj.localStorage + } + + if (env?.text) { + if (!env.text.TextEncoder || !env.text.TextDecoder) { + throw new Error('env.text must provide both TextEncoder and TextDecoder') + } + text = env.text + } else { + text = { + TextEncoder: windowObj.TextEncoder ?? globalObj.TextEncoder, + TextDecoder: windowObj.TextDecoder ?? globalObj.TextDecoder, + } + } + + return { + fetch: env?.fetch ?? windowObj.fetch ?? globalObj.fetch, + crypto: env?.crypto ?? windowObj.crypto ?? globalObj.crypto, + storage, + indexedDB: env?.indexedDB ?? windowObj.indexedDB ?? globalObj.indexedDB, + text, + } +} diff --git a/packages/wallet/core/src/index.ts b/packages/wallet/core/src/index.ts index b36e917ca..27c54b8f5 100644 --- a/packages/wallet/core/src/index.ts +++ b/packages/wallet/core/src/index.ts @@ -5,6 +5,7 @@ export * as State from './state/index.js' export * as Bundler from './bundler/index.js' export * as Envelope from './envelope.js' export * as Utils from './utils/index.js' +export * from './env.js' export { type ExplicitSessionConfig, type ExplicitSession, diff --git a/packages/wallet/core/src/signers/passkey.ts b/packages/wallet/core/src/signers/passkey.ts index 0cc7cacab..62c6d1886 100644 --- a/packages/wallet/core/src/signers/passkey.ts +++ b/packages/wallet/core/src/signers/passkey.ts @@ -5,12 +5,15 @@ import { WebAuthnP256 } from 'ox' import { State } from '../index.js' import { SapientSigner, Witnessable } from './index.js' +export type WebAuthnLike = Pick + export type PasskeyOptions = { extensions: Pick publicKey: Extensions.Passkeys.PublicKey credentialId: string embedMetadata?: boolean metadata?: Extensions.Passkeys.PasskeyMetadata + webauthn?: WebAuthnLike } export type CreatePasskeyOptions = { @@ -18,6 +21,11 @@ export type CreatePasskeyOptions = { requireUserVerification?: boolean credentialName?: string embedMetadata?: boolean + webauthn?: WebAuthnLike +} + +export type FindPasskeyOptions = { + webauthn?: WebAuthnLike } export type WitnessMessage = { @@ -45,6 +53,7 @@ export class Passkey implements SapientSigner, Witnessable { public readonly imageHash: Hex.Hex public readonly embedMetadata: boolean public readonly metadata?: Extensions.Passkeys.PasskeyMetadata + private readonly webauthn: WebAuthnLike constructor(options: PasskeyOptions) { this.address = options.extensions.passkeys @@ -53,6 +62,7 @@ export class Passkey implements SapientSigner, Witnessable { this.embedMetadata = options.embedMetadata ?? false this.imageHash = Extensions.Passkeys.rootFor(options.publicKey) this.metadata = options.metadata + this.webauthn = options.webauthn ?? WebAuthnP256 } static async loadFromWitness( @@ -60,6 +70,7 @@ export class Passkey implements SapientSigner, Witnessable { extensions: Pick, wallet: Address.Address, imageHash: Hex.Hex, + options?: FindPasskeyOptions, ) { // In the witness we will find the public key, and may find the credential id const witness = await stateReader.getWitnessForSapient(wallet, extensions.passkeys, imageHash) @@ -90,13 +101,15 @@ export class Passkey implements SapientSigner, Witnessable { publicKey: message.publicKey, embedMetadata: decodedSignature.embedMetadata, metadata, + webauthn: options?.webauthn, }) } static async create(extensions: Pick, options?: CreatePasskeyOptions) { + const webauthn = options?.webauthn ?? WebAuthnP256 const name = options?.credentialName ?? `Sequence (${Date.now()})` - const credential = await WebAuthnP256.createCredential({ + const credential = await webauthn.createCredential({ user: { name, }, @@ -120,6 +133,7 @@ export class Passkey implements SapientSigner, Witnessable { }, embedMetadata: options?.embedMetadata, metadata, + webauthn, }) if (options?.stateProvider) { @@ -132,8 +146,10 @@ export class Passkey implements SapientSigner, Witnessable { static async find( stateReader: State.Reader, extensions: Pick, + options?: FindPasskeyOptions, ): Promise { - const response = await WebAuthnP256.sign({ challenge: Hex.random(32) }) + const webauthn = options?.webauthn ?? WebAuthnP256 + const response = await webauthn.sign({ challenge: Hex.random(32) }) if (!response.raw) throw new Error('No credential returned') const authenticatorDataBytes = Bytes.fromHex(response.metadata.authenticatorData) @@ -218,7 +234,7 @@ export class Passkey implements SapientSigner, Witnessable { console.warn('Multiple signers found for passkey', flattened) } - return Passkey.loadFromWitness(stateReader, extensions, flattened[0]!.wallet, flattened[0]!.imageHash) + return Passkey.loadFromWitness(stateReader, extensions, flattened[0]!.wallet, flattened[0]!.imageHash, options) } async signSapient( @@ -234,7 +250,7 @@ export class Passkey implements SapientSigner, Witnessable { const challenge = Hex.fromBytes(Payload.hash(wallet, chainId, payload)) - const response = await WebAuthnP256.sign({ + const response = await this.webauthn.sign({ challenge, credentialId: this.credentialId, userVerification: this.publicKey.requireUserVerification ? 'required' : 'discouraged', diff --git a/packages/wallet/core/src/signers/pk/encrypted.ts b/packages/wallet/core/src/signers/pk/encrypted.ts index c75bc57f9..dce0eb3cc 100644 --- a/packages/wallet/core/src/signers/pk/encrypted.ts +++ b/packages/wallet/core/src/signers/pk/encrypted.ts @@ -1,4 +1,5 @@ import { Hex, Address, PublicKey, Secp256k1, Bytes } from 'ox' +import { resolveCoreEnv, type CoreEnv, type CryptoLike, type StorageLike, type TextEncodingLike } from '../../env.js' import { PkStore } from './index.js' export interface EncryptedData { @@ -17,6 +18,7 @@ export class EncryptedPksDb { constructor( private readonly localStorageKeyPrefix: string = 'e_pk_key_', tableName: string = 'e_pk', + private readonly env?: CoreEnv, ) { this.tableName = tableName } @@ -25,9 +27,59 @@ export class EncryptedPksDb { return `pk_${address.toLowerCase()}` } + private getIndexedDB(): IDBFactory { + const globalObj = globalThis as any + const indexedDb = this.env?.indexedDB ?? globalObj.indexedDB ?? globalObj.window?.indexedDB + if (!indexedDb) { + throw new Error('indexedDB is not available') + } + return indexedDb + } + + private getStorage(): StorageLike { + const storage = resolveCoreEnv(this.env).storage + if (!storage) { + throw new Error('storage is not available') + } + return storage + } + + private getCrypto(): CryptoLike { + const globalObj = globalThis as any + const crypto = this.env?.crypto ?? globalObj.crypto ?? globalObj.window?.crypto + if (!crypto?.subtle || !crypto?.getRandomValues) { + throw new Error('crypto.subtle is not available') + } + return crypto + } + + private getTextEncoderCtor(): TextEncodingLike['TextEncoder'] { + const globalObj = globalThis as any + if (this.env?.text && (!this.env.text.TextEncoder || !this.env.text.TextDecoder)) { + throw new Error('env.text must provide both TextEncoder and TextDecoder') + } + const encoderCtor = this.env?.text?.TextEncoder ?? globalObj.TextEncoder ?? globalObj.window?.TextEncoder + if (!encoderCtor) { + throw new Error('TextEncoder is not available') + } + return encoderCtor + } + + private getTextDecoderCtor(): TextEncodingLike['TextDecoder'] { + const globalObj = globalThis as any + if (this.env?.text && (!this.env.text.TextEncoder || !this.env.text.TextDecoder)) { + throw new Error('env.text must provide both TextEncoder and TextDecoder') + } + const decoderCtor = this.env?.text?.TextDecoder ?? globalObj.TextDecoder ?? globalObj.window?.TextDecoder + if (!decoderCtor) { + throw new Error('TextDecoder is not available') + } + return decoderCtor + } + private openDB(): Promise { return new Promise((resolve, reject) => { - const request = indexedDB.open(this.dbName, this.dbVersion) + const request = this.getIndexedDB().open(this.dbName, this.dbVersion) request.onupgradeneeded = () => { const db = request.result if (!db.objectStoreNames.contains(this.tableName)) { @@ -73,7 +125,11 @@ export class EncryptedPksDb { } async generateAndStore(): Promise { - const encryptionKey = await window.crypto.subtle.generateKey({ name: 'AES-GCM', length: 256 }, true, [ + const crypto = this.getCrypto() + const storage = this.getStorage() + const TextEncoderCtor = this.getTextEncoderCtor() + + const encryptionKey = await crypto.subtle.generateKey({ name: 'AES-GCM', length: 256 }, true, [ 'encrypt', 'decrypt', ]) @@ -84,13 +140,13 @@ export class EncryptedPksDb { const address = Address.fromPublicKey(publicKey) const keyPointer = this.localStorageKeyPrefix + address - const exportedKey = await window.crypto.subtle.exportKey('jwk', encryptionKey) - window.localStorage.setItem(keyPointer, JSON.stringify(exportedKey)) + const exportedKey = await crypto.subtle.exportKey('jwk', encryptionKey) + storage.setItem(keyPointer, JSON.stringify(exportedKey)) - const encoder = new TextEncoder() + const encoder = new TextEncoderCtor() const encodedPk = encoder.encode(privateKey) - const iv = window.crypto.getRandomValues(new Uint8Array(12)) - const encryptedBuffer = await window.crypto.subtle.encrypt({ name: 'AES-GCM', iv }, encryptionKey, encodedPk) + const iv = crypto.getRandomValues(new Uint8Array(12)) + const encryptedBuffer = await crypto.subtle.encrypt({ name: 'AES-GCM', iv }, encryptionKey, encodedPk) const encrypted: EncryptedData = { iv, @@ -113,7 +169,7 @@ export class EncryptedPksDb { async getEncryptedPkStore(address: Address.Address): Promise { const entry = await this.getEncryptedEntry(address) if (!entry) return - return new EncryptedPkStore(entry) + return new EncryptedPkStore(entry, this.env) } async listAddresses(): Promise { @@ -125,12 +181,41 @@ export class EncryptedPksDb { const dbKey = this.computeDbKey(address) await this.putData(dbKey, undefined) const keyPointer = this.localStorageKeyPrefix + address - window.localStorage.removeItem(keyPointer) + this.getStorage().removeItem(keyPointer) } } export class EncryptedPkStore implements PkStore { - constructor(private readonly encrypted: EncryptedData) {} + constructor( + private readonly encrypted: EncryptedData, + private readonly env?: CoreEnv, + ) {} + + private getStorage(): StorageLike { + const storage = resolveCoreEnv(this.env).storage + if (!storage) { + throw new Error('storage is not available') + } + return storage + } + + private getCrypto(): CryptoLike { + const globalObj = globalThis as any + const crypto = this.env?.crypto ?? globalObj.crypto ?? globalObj.window?.crypto + if (!crypto?.subtle) { + throw new Error('crypto.subtle is not available') + } + return crypto + } + + private getTextDecoderCtor(): TextEncodingLike['TextDecoder'] { + const globalObj = globalThis as any + const decoderCtor = this.env?.text?.TextDecoder ?? globalObj.TextDecoder ?? globalObj.window?.TextDecoder + if (!decoderCtor) { + throw new Error('TextDecoder is not available') + } + return decoderCtor + } address(): Address.Address { return this.encrypted.address @@ -141,16 +226,20 @@ export class EncryptedPkStore implements PkStore { } async signDigest(digest: Bytes.Bytes): Promise<{ r: bigint; s: bigint; yParity: number }> { - const keyJson = window.localStorage.getItem(this.encrypted.keyPointer) + const storage = this.getStorage() + const crypto = this.getCrypto() + const TextDecoderCtor = this.getTextDecoderCtor() + + const keyJson = storage.getItem(this.encrypted.keyPointer) if (!keyJson) throw new Error('Encryption key not found in localStorage') const jwk = JSON.parse(keyJson) - const encryptionKey = await window.crypto.subtle.importKey('jwk', jwk, { name: 'AES-GCM' }, false, ['decrypt']) - const decryptedBuffer = await window.crypto.subtle.decrypt( + const encryptionKey = await crypto.subtle.importKey('jwk', jwk, { name: 'AES-GCM' }, false, ['decrypt']) + const decryptedBuffer = await crypto.subtle.decrypt( { name: 'AES-GCM', iv: this.encrypted.iv }, encryptionKey, this.encrypted.data, ) - const decoder = new TextDecoder() + const decoder = new TextDecoderCtor() const privateKey = decoder.decode(decryptedBuffer) as Hex.Hex return Secp256k1.sign({ payload: digest, privateKey }) } diff --git a/packages/wallet/core/src/state/local/indexed-db.ts b/packages/wallet/core/src/state/local/indexed-db.ts index 98a43743c..eeb5cd346 100644 --- a/packages/wallet/core/src/state/local/indexed-db.ts +++ b/packages/wallet/core/src/state/local/indexed-db.ts @@ -1,5 +1,6 @@ import { Context, Payload, Signature, Config, GenericTree } from '@0xsequence/wallet-primitives' import { Address, Hex } from 'ox' +import type { CoreEnv } from '../../env.js' import { Store } from './index.js' const DB_VERSION = 1 @@ -16,15 +17,27 @@ export class IndexedDbStore implements Store { private _db: IDBDatabase | null = null private dbName: string - constructor(dbName: string = 'sequence-indexeddb') { + constructor( + dbName: string = 'sequence-indexeddb', + private readonly env?: CoreEnv, + ) { this.dbName = dbName } + private getIndexedDB(): IDBFactory { + const globalObj = globalThis as any + const indexedDb = this.env?.indexedDB ?? globalObj.indexedDB ?? globalObj.window?.indexedDB + if (!indexedDb) { + throw new Error('indexedDB is not available') + } + return indexedDb + } + private async openDB(): Promise { if (this._db) return this._db return new Promise((resolve, reject) => { - const request = indexedDB.open(this.dbName, DB_VERSION) + const request = this.getIndexedDB().open(this.dbName, DB_VERSION) request.onupgradeneeded = () => { const db = request.result diff --git a/packages/wallet/core/src/state/remote/dev-http.ts b/packages/wallet/core/src/state/remote/dev-http.ts index d7fe0f492..357263711 100644 --- a/packages/wallet/core/src/state/remote/dev-http.ts +++ b/packages/wallet/core/src/state/remote/dev-http.ts @@ -4,10 +4,16 @@ import { Provider } from '../index.js' export class DevHttpProvider implements Provider { private readonly baseUrl: string + private readonly fetcher: typeof fetch - constructor(baseUrl: string) { + constructor(baseUrl: string, fetcher?: typeof fetch) { // Remove trailing slash if present this.baseUrl = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl + const resolvedFetch = fetcher ?? (globalThis as any).fetch + if (!resolvedFetch) { + throw new Error('fetch is not available') + } + this.fetcher = resolvedFetch } private async request(method: 'GET' | 'POST', path: string, body?: any): Promise { @@ -24,7 +30,7 @@ export class DevHttpProvider implements Provider { let response: Response try { - response = await fetch(url, options) + response = await this.fetcher(url, options) } catch (networkError) { // Handle immediate network errors (e.g., DNS resolution failure, refused connection) console.error(`Network error during ${method} request to ${url}:`, networkError) diff --git a/packages/wallet/core/src/state/sequence/index.ts b/packages/wallet/core/src/state/sequence/index.ts index 3712f2aa5..a016e640d 100644 --- a/packages/wallet/core/src/state/sequence/index.ts +++ b/packages/wallet/core/src/state/sequence/index.ts @@ -9,13 +9,17 @@ import { TransactionRequest, } from 'ox' import { normalizeAddressKeys, Provider as ProviderInterface } from '../index.js' -import { Sessions, SignatureType } from './sessions.gen.js' +import { Sessions, SignatureType, type Fetch } from './sessions.gen.js' export class Provider implements ProviderInterface { private readonly service: Sessions - constructor(host = 'https://keymachine.sequence.app') { - this.service = new Sessions(host, fetch) + constructor(host = 'https://keymachine.sequence.app', fetcher?: Fetch) { + const resolvedFetch = fetcher ?? (globalThis as any).fetch + if (!resolvedFetch) { + throw new Error('fetch is not available') + } + this.service = new Sessions(host, resolvedFetch) } async getConfiguration(imageHash: Hex.Hex): Promise { diff --git a/packages/wallet/dapp-client/CHANGELOG.md b/packages/wallet/dapp-client/CHANGELOG.md index 39d1471c6..4cf425c05 100644 --- a/packages/wallet/dapp-client/CHANGELOG.md +++ b/packages/wallet/dapp-client/CHANGELOG.md @@ -1,5 +1,27 @@ # @0xsequence/dapp-client +## 3.0.0-beta.16 + +### Patch Changes + +- ethauth support +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.16 + - @0xsequence/relayer@3.0.0-beta.16 + - @0xsequence/wallet-core@3.0.0-beta.16 + - @0xsequence/wallet-primitives@3.0.0-beta.16 + +## 3.0.0-beta.15 + +### Patch Changes + +- New chains, minor fixes +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.15 + - @0xsequence/relayer@3.0.0-beta.15 + - @0xsequence/wallet-core@3.0.0-beta.15 + - @0xsequence/wallet-primitives@3.0.0-beta.15 + ## 3.0.0-beta.14 ### Patch Changes diff --git a/packages/wallet/dapp-client/package.json b/packages/wallet/dapp-client/package.json index 99f617253..3db8b8bf9 100644 --- a/packages/wallet/dapp-client/package.json +++ b/packages/wallet/dapp-client/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/dapp-client", - "version": "3.0.0-beta.14", + "version": "3.0.0-beta.16", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/dapp-client/src/ChainSessionManager.ts b/packages/wallet/dapp-client/src/ChainSessionManager.ts index 229db1ea3..095d07107 100644 --- a/packages/wallet/dapp-client/src/ChainSessionManager.ts +++ b/packages/wallet/dapp-client/src/ChainSessionManager.ts @@ -37,12 +37,14 @@ import { TransportMode, GuardConfig, CreateNewSessionPayload, + EthAuthSettings, ModifyExplicitSessionPayload, SessionResponse, AddExplicitSessionPayload, FeeOption, OperationFailedStatus, OperationStatus, + ETHAuthProof, } from './types/index.js' import { CACHE_DB_NAME, VALUE_FORWARDER_ADDRESS } from './utils/constants.js' import { ExplicitSession, ImplicitSession, ExplicitSessionConfig } from './index.js' @@ -285,6 +287,7 @@ export class ChainSessionManager { preferredLoginMethod?: LoginMethod email?: string includeImplicitSession?: boolean + ethAuth?: EthAuthSettings } = {}, ): Promise { if (this.isInitialized) { @@ -311,6 +314,7 @@ export class ChainSessionManager { origin, session: completeSession as ExplicitSession | undefined, includeImplicitSession: options.includeImplicitSession ?? false, + ethAuth: options.ethAuth, preferredLoginMethod: options.preferredLoginMethod, email: options.preferredLoginMethod === 'email' ? options.email : undefined, } @@ -377,6 +381,10 @@ export class ChainSessionManager { this.guard = guard } + if (payload.ethAuth) { + await this._saveEthAuthProofIfProvided(connectResponse.ethAuthProof) + } + if (this.transport.mode === TransportMode.POPUP) { this.transport.closeWallet() } @@ -596,6 +604,10 @@ export class ChainSessionManager { this.userEmail = userEmail ?? null this.guard = guard } + + if (savedPayload?.ethAuth) { + await this._saveEthAuthProofIfProvided(connectResponse.ethAuthProof) + } } else if (response.action === RequestActionType.ADD_EXPLICIT_SESSION) { if (!this.walletAddress || !Address.isEqual(receivedAddress, this.walletAddress)) { throw new InitializationError('Received an explicit session for a wallet that is not active.') @@ -1104,6 +1116,13 @@ export class ChainSessionManager { await this.sequenceStorage.clearSessionlessConnection() } + private async _saveEthAuthProofIfProvided(ethAuthProof?: ETHAuthProof): Promise { + if (!ethAuthProof) { + return + } + await this.sequenceStorage.saveEthAuthProof(ethAuthProof) + } + private _getCachedSignedCall(calls: Payload.Call[]): { to: Address.Address; data: Hex.Hex } | null { if (!this.lastSignedCallCache) { return null diff --git a/packages/wallet/dapp-client/src/DappClient.ts b/packages/wallet/dapp-client/src/DappClient.ts index 3c5a29cba..a2b73afd7 100644 --- a/packages/wallet/dapp-client/src/DappClient.ts +++ b/packages/wallet/dapp-client/src/DappClient.ts @@ -14,8 +14,10 @@ import { GetFeeTokensResponse, GuardConfig, LoginMethod, + EthAuthSettings, RandomPrivateKeyFn, RequestActionType, + ETHAuthProof, SendWalletTransactionPayload, SequenceSessionStorage, SignMessagePayload, @@ -407,6 +409,13 @@ export class DappClient { } } + /** + * Returns the latest persisted ETHAuth proof, if one has been received from the wallet. + */ + public async getEthAuthProof(): Promise { + return this.sequenceStorage.getEthAuthProof() + } + /** * Restores a sessionless connection that was previously persisted via {@link disconnect} or a connect flow. * @returns A promise that resolves to true if a sessionless connection was applied. @@ -559,6 +568,7 @@ export class DappClient { preferredLoginMethod?: LoginMethod email?: string includeImplicitSession?: boolean + ethAuth?: EthAuthSettings } = {}, ): Promise { if (this.isInitialized) { @@ -614,6 +624,7 @@ export class DappClient { preferredLoginMethod?: LoginMethod email?: string includeImplicitSession?: boolean + ethAuth?: EthAuthSettings } = {}, ): Promise { if (!this.isInitialized || !this.hasSessionlessConnection || !this.walletAddress) { diff --git a/packages/wallet/dapp-client/src/DappTransport.ts b/packages/wallet/dapp-client/src/DappTransport.ts index 090b1070b..7b4f3c5d2 100644 --- a/packages/wallet/dapp-client/src/DappTransport.ts +++ b/packages/wallet/dapp-client/src/DappTransport.ts @@ -560,6 +560,10 @@ export class DappTransport { } private generateId(): string { - return `${Date.now().toString(36)}-${Math.random().toString(36).substring(2, 9)}` + // Use crypto.getRandomValues for cryptographically secure randomness + const array = new Uint32Array(2); + window.crypto.getRandomValues(array); + const randStr = (array[0].toString(36) + array[1].toString(36)).slice(0, 9); + return `${Date.now().toString(36)}-${randStr}`; } } diff --git a/packages/wallet/dapp-client/src/index.ts b/packages/wallet/dapp-client/src/index.ts index c2315b138..ce976c13d 100644 --- a/packages/wallet/dapp-client/src/index.ts +++ b/packages/wallet/dapp-client/src/index.ts @@ -24,6 +24,8 @@ export type { FeeToken, FeeOption, TransportMessage, + EthAuthSettings, + ETHAuthProof, } from './types/index.js' export { RequestActionType, TransportMode, MessageType } from './types/index.js' export { diff --git a/packages/wallet/dapp-client/src/types/index.ts b/packages/wallet/dapp-client/src/types/index.ts index 6a0eb08da..0f023c2bb 100644 --- a/packages/wallet/dapp-client/src/types/index.ts +++ b/packages/wallet/dapp-client/src/types/index.ts @@ -28,12 +28,32 @@ export interface GuardConfig { moduleAddresses: Map } +export interface EthAuthSettings { + app?: string + /** expiry number (in seconds) that is used for ETHAuth proof. Default is 1 week in seconds. */ + expiry?: number + /** origin hint of the dapp's host opening the wallet. This value will automatically + * be determined and verified for integrity, and can be omitted. */ + origin?: string + /** authorizeNonce is an optional number to be passed as ETHAuth's nonce claim for replay protection. **/ + nonce?: number +} + +export interface ETHAuthProof { + // eip712 typed-data payload for ETHAuth domain as input + typedData: Payload.TypedDataToSign + + // signature encoded in an ETHAuth proof string + ewtString: string +} + // --- Payloads for Transport --- export interface CreateNewSessionPayload { origin?: string session?: ExplicitSession includeImplicitSession?: boolean + ethAuth?: EthAuthSettings preferredLoginMethod?: LoginMethod email?: string } @@ -81,6 +101,7 @@ export interface CreateNewSessionResponse { userEmail?: string loginMethod?: LoginMethod guard?: GuardConfig + ethAuthProof?: ETHAuthProof } export interface SignatureResponse { diff --git a/packages/wallet/dapp-client/src/utils/storage.ts b/packages/wallet/dapp-client/src/utils/storage.ts index 8928d354e..8a56015ba 100644 --- a/packages/wallet/dapp-client/src/utils/storage.ts +++ b/packages/wallet/dapp-client/src/utils/storage.ts @@ -5,6 +5,7 @@ import { SignMessagePayload, SignTypedDataPayload, GuardConfig, + ETHAuthProof, SendWalletTransactionPayload, ModifyExplicitSessionPayload, CreateNewSessionPayload, @@ -81,6 +82,10 @@ export interface SequenceStorage { getSessionlessConnection(): Promise clearSessionlessConnection(): Promise + saveEthAuthProof(proof: ETHAuthProof): Promise + getEthAuthProof(): Promise + clearEthAuthProof(): Promise + saveSessionlessConnectionSnapshot?(sessionData: SessionlessConnectionData): Promise getSessionlessConnectionSnapshot?(): Promise clearSessionlessConnectionSnapshot?(): Promise @@ -94,6 +99,7 @@ const STORE_NAME = 'userKeys' const IMPLICIT_SESSIONS_IDB_KEY = 'SequenceImplicitSession' const EXPLICIT_SESSIONS_IDB_KEY = 'SequenceExplicitSession' const SESSIONLESS_CONNECTION_IDB_KEY = 'SequenceSessionlessConnection' +const ETH_AUTH_PROOF_IDB_KEY = 'SequenceEthAuthProof' const SESSIONLESS_CONNECTION_SNAPSHOT_IDB_KEY = 'SequenceSessionlessConnectionSnapshot' const PENDING_REDIRECT_REQUEST_KEY = 'SequencePendingRedirect' @@ -305,6 +311,15 @@ export class WebStorage implements SequenceStorage { } } + async saveEthAuthProof(proof: ETHAuthProof): Promise { + try { + await this.setIDBItem(ETH_AUTH_PROOF_IDB_KEY, proof) + } catch (error) { + console.error('Failed to save ETHAuth proof:', error) + throw error + } + } + async getSessionlessConnection(): Promise { try { return (await this.getIDBItem(SESSIONLESS_CONNECTION_IDB_KEY)) ?? null @@ -314,6 +329,15 @@ export class WebStorage implements SequenceStorage { } } + async getEthAuthProof(): Promise { + try { + return (await this.getIDBItem(ETH_AUTH_PROOF_IDB_KEY)) ?? null + } catch (error) { + console.error('Failed to retrieve ETHAuth proof:', error) + return null + } + } + async clearSessionlessConnection(): Promise { try { await this.deleteIDBItem(SESSIONLESS_CONNECTION_IDB_KEY) @@ -323,6 +347,15 @@ export class WebStorage implements SequenceStorage { } } + async clearEthAuthProof(): Promise { + try { + await this.deleteIDBItem(ETH_AUTH_PROOF_IDB_KEY) + } catch (error) { + console.error('Failed to clear ETHAuth proof:', error) + throw error + } + } + async saveSessionlessConnectionSnapshot(sessionData: SessionlessConnectionData): Promise { try { await this.setIDBItem(SESSIONLESS_CONNECTION_SNAPSHOT_IDB_KEY, sessionData) @@ -363,6 +396,7 @@ export class WebStorage implements SequenceStorage { await this.clearExplicitSessions() await this.clearImplicitSession() await this.clearSessionlessConnection() + await this.clearEthAuthProof() await this.clearSessionlessConnectionSnapshot() } catch (error) { console.error('Failed to clear all data:', error) diff --git a/packages/wallet/dapp-client/test/ethauth-proof.test.ts b/packages/wallet/dapp-client/test/ethauth-proof.test.ts new file mode 100644 index 000000000..9d26306b7 --- /dev/null +++ b/packages/wallet/dapp-client/test/ethauth-proof.test.ts @@ -0,0 +1,208 @@ +import { afterEach, describe, expect, it, vi } from 'vitest' + +import { DappClient } from '../src/DappClient.js' +import { DappTransport } from '../src/DappTransport.js' +import { RequestActionType, TransportMode } from '../src/types/index.js' +import { WebStorage } from '../src/utils/storage.js' + +describe('ETHAuth proof persistence', () => { + afterEach(() => { + vi.restoreAllMocks() + vi.unstubAllGlobals() + }) + + const createSequenceStorageMock = () => + ({ + setPendingRedirectRequest: vi.fn().mockResolvedValue(undefined), + isRedirectRequestPending: vi.fn().mockResolvedValue(false), + saveTempSessionPk: vi.fn().mockResolvedValue(undefined), + getAndClearTempSessionPk: vi.fn().mockResolvedValue(null), + savePendingRequest: vi.fn().mockResolvedValue(undefined), + getAndClearPendingRequest: vi.fn().mockResolvedValue(null), + peekPendingRequest: vi.fn().mockResolvedValue(null), + saveExplicitSession: vi.fn().mockResolvedValue(undefined), + getExplicitSessions: vi.fn().mockResolvedValue([]), + clearExplicitSessions: vi.fn().mockResolvedValue(undefined), + saveImplicitSession: vi.fn().mockResolvedValue(undefined), + getImplicitSession: vi.fn().mockResolvedValue(null), + clearImplicitSession: vi.fn().mockResolvedValue(undefined), + saveSessionlessConnection: vi.fn().mockResolvedValue(undefined), + getSessionlessConnection: vi.fn().mockResolvedValue(null), + clearSessionlessConnection: vi.fn().mockResolvedValue(undefined), + saveEthAuthProof: vi.fn().mockResolvedValue(undefined), + getEthAuthProof: vi.fn().mockResolvedValue(null), + clearEthAuthProof: vi.fn().mockResolvedValue(undefined), + clearAllData: vi.fn().mockResolvedValue(undefined), + }) as any + + it('persists ETHAuth proof when connect requests ethAuth in redirect mode', async () => { + const fetchMock = vi.fn() + vi.stubGlobal('fetch', fetchMock) + vi.stubGlobal('window', { fetch: fetchMock } as any) + + const ethAuthProof = { + typedData: { + domain: {}, + types: {}, + message: {}, + }, + ewtString: 'proof-string', + } as any + + const sequenceStorage = createSequenceStorageMock() + const sendRequestMock = vi.spyOn(DappTransport.prototype, 'sendRequest').mockResolvedValue({ + walletAddress: '0x1111111111111111111111111111111111111111', + ethAuthProof, + } as any) + + const client = new DappClient('https://wallet.example', 'https://dapp.example', 'test-project-access-key', { + sequenceStorage, + transportMode: TransportMode.REDIRECT, + canUseIndexedDb: false, + redirectActionHandler: vi.fn(), + }) + + await client.connect(1, undefined, { + ethAuth: { + app: 'app-name', + }, + }) + + expect(sendRequestMock).toHaveBeenCalledWith( + RequestActionType.CREATE_NEW_SESSION, + 'https://dapp.example', + expect.objectContaining({ + ethAuth: { + app: 'app-name', + }, + }), + expect.any(Object), + ) + expect(sequenceStorage.saveEthAuthProof).toHaveBeenCalledWith(ethAuthProof) + }) + + it('persists ETHAuth proof when connect requests ethAuth in popup mode', async () => { + const fetchMock = vi.fn() + vi.stubGlobal('fetch', fetchMock) + vi.stubGlobal('window', { fetch: fetchMock } as any) + vi.stubGlobal('document', {} as any) + + const ethAuthProof = { + typedData: { + domain: {}, + types: {}, + message: {}, + }, + ewtString: 'proof-string', + } as any + + const sequenceStorage = createSequenceStorageMock() + const sendRequestMock = vi.spyOn(DappTransport.prototype, 'sendRequest').mockResolvedValue({ + walletAddress: '0x1111111111111111111111111111111111111111', + ethAuthProof, + } as any) + + const client = new DappClient('https://wallet.example', 'https://dapp.example', 'test-project-access-key', { + sequenceStorage, + transportMode: TransportMode.POPUP, + canUseIndexedDb: false, + }) + + await client.connect(1, undefined, { + ethAuth: { + app: 'app-name', + }, + }) + + expect(sendRequestMock).toHaveBeenCalledWith( + RequestActionType.CREATE_NEW_SESSION, + 'https://dapp.example', + expect.objectContaining({ + ethAuth: { + app: 'app-name', + }, + }), + expect.any(Object), + ) + expect(sequenceStorage.saveEthAuthProof).toHaveBeenCalledWith(ethAuthProof) + }) + + it('does not persist ETHAuth proof when connect does not request ethAuth', async () => { + const fetchMock = vi.fn() + vi.stubGlobal('fetch', fetchMock) + vi.stubGlobal('window', { fetch: fetchMock } as any) + + const ethAuthProof = { + typedData: { + domain: {}, + types: {}, + message: {}, + }, + ewtString: 'proof-string', + } as any + + const sequenceStorage = createSequenceStorageMock() + const sendRequestMock = vi.spyOn(DappTransport.prototype, 'sendRequest').mockResolvedValue({ + walletAddress: '0x1111111111111111111111111111111111111111', + ethAuthProof, + } as any) + + const client = new DappClient('https://wallet.example', 'https://dapp.example', 'test-project-access-key', { + sequenceStorage, + transportMode: TransportMode.REDIRECT, + canUseIndexedDb: false, + redirectActionHandler: vi.fn(), + }) + + await client.connect(1) + + expect(sendRequestMock).toHaveBeenCalledWith( + RequestActionType.CREATE_NEW_SESSION, + 'https://dapp.example', + expect.not.objectContaining({ + ethAuth: expect.anything(), + }), + expect.any(Object), + ) + expect(sequenceStorage.saveEthAuthProof).not.toHaveBeenCalled() + }) + + it('clears ETHAuth proof on disconnect', async () => { + const fetchMock = vi.fn() + vi.stubGlobal('fetch', fetchMock) + vi.stubGlobal('window', { fetch: fetchMock } as any) + + const ethAuthProof = { + typedData: { + domain: {}, + types: {}, + message: {}, + }, + ewtString: 'proof-string', + } as any + + vi.spyOn(DappTransport.prototype, 'sendRequest').mockResolvedValue({ + walletAddress: '0x1111111111111111111111111111111111111111', + ethAuthProof, + } as any) + + const client = new DappClient('https://wallet.example', 'https://dapp.example', 'test-project-access-key', { + sequenceStorage: new WebStorage(), + transportMode: TransportMode.REDIRECT, + canUseIndexedDb: false, + redirectActionHandler: vi.fn(), + }) + + await client.connect(1, undefined, { + ethAuth: { + app: 'app-name', + }, + }) + + expect(await client.getEthAuthProof()).toEqual(ethAuthProof) + + await client.disconnect() + + expect(await client.getEthAuthProof()).toBeNull() + }) +}) diff --git a/packages/wallet/primitives-cli/src/subcommands/server.ts b/packages/wallet/primitives-cli/src/subcommands/server.ts index 29c5e1118..ab999c454 100644 --- a/packages/wallet/primitives-cli/src/subcommands/server.ts +++ b/packages/wallet/primitives-cli/src/subcommands/server.ts @@ -327,7 +327,8 @@ async function handleHttpRequest(req: IncomingMessage, res: ServerResponse, debu } catch (error) { if (!silent) console.log(`[${new Date().toISOString()}] JSON parse error:`, error) res.statusCode = 400 - res.end(JSON.stringify(errorResponse(undefined, -32700, 'Parse error', String(error)))) + // Return a generic parse error without exposing internal error details to the client + res.end(JSON.stringify(errorResponse(undefined, -32700, 'Parse error'))) return } diff --git a/packages/wallet/primitives/CHANGELOG.md b/packages/wallet/primitives/CHANGELOG.md index e494722cd..9da2119c2 100644 --- a/packages/wallet/primitives/CHANGELOG.md +++ b/packages/wallet/primitives/CHANGELOG.md @@ -1,5 +1,17 @@ # @0xsequence/wallet-primitives +## 3.0.0-beta.16 + +### Patch Changes + +- ethauth support + +## 3.0.0-beta.15 + +### Patch Changes + +- New chains, minor fixes + ## 3.0.0-beta.14 ### Patch Changes diff --git a/packages/wallet/primitives/package.json b/packages/wallet/primitives/package.json index f975a0622..660ec6136 100644 --- a/packages/wallet/primitives/package.json +++ b/packages/wallet/primitives/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-primitives", - "version": "3.0.0-beta.14", + "version": "3.0.0-beta.16", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/primitives/src/extensions/recovery.ts b/packages/wallet/primitives/src/extensions/recovery.ts index 7073272e5..cb8c93868 100644 --- a/packages/wallet/primitives/src/extensions/recovery.ts +++ b/packages/wallet/primitives/src/extensions/recovery.ts @@ -203,7 +203,7 @@ export function parseBranch(encoded: Bytes.Bytes): { nodes: Tree[]; leftover: By */ export function trimTopology(topology: Tree, signer: Address.Address): Tree { if (isRecoveryLeaf(topology)) { - if (topology.signer === signer) { + if (Address.isEqual(topology.signer, signer)) { return topology } else { return hashConfiguration(topology) diff --git a/packages/wallet/primitives/src/network.ts b/packages/wallet/primitives/src/network.ts index b0ef2bbde..e3ddfb6d8 100644 --- a/packages/wallet/primitives/src/network.ts +++ b/packages/wallet/primitives/src/network.ts @@ -105,6 +105,7 @@ export const ChainId = { // ETHERLINK ETHERLINK: 42793, ETHERLINK_TESTNET: 128123, + ETHERLINK_SHADOWNET_TESTNET: 127823, // MOONBEAM MOONBEAM: 1284, @@ -799,15 +800,15 @@ export const ALL: Network[] = [ }, }, { - chainId: ChainId.ETHERLINK_TESTNET, + chainId: ChainId.ETHERLINK_SHADOWNET_TESTNET, type: NetworkType.TESTNET, - name: 'etherlink-testnet', - title: 'Etherlink Testnet', - rpcUrl: getRpcUrl('etherlink-testnet'), - logoUrl: getLogoUrl(ChainId.ETHERLINK_TESTNET), + name: 'etherlink-shadownet-testnet', + title: 'Etherlink Shadownet Testnet', + rpcUrl: getRpcUrl('etherlink-shadownet-testnet'), + logoUrl: getLogoUrl(ChainId.ETHERLINK_SHADOWNET_TESTNET), blockExplorer: { - name: 'Etherlink Testnet Explorer', - url: 'https://testnet.explorer.etherlink.com/', + name: 'Etherlink Shadownet Testnet Explorer', + url: 'https://shadownet.explorer.etherlink.com/', }, nativeCurrency: { symbol: 'XTZ', diff --git a/packages/wallet/wdk/CHANGELOG.md b/packages/wallet/wdk/CHANGELOG.md index e0feded72..7fb4e804c 100644 --- a/packages/wallet/wdk/CHANGELOG.md +++ b/packages/wallet/wdk/CHANGELOG.md @@ -1,5 +1,29 @@ # @0xsequence/wallet-wdk +## 3.0.0-beta.16 + +### Patch Changes + +- ethauth support +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.16 + - @0xsequence/identity-instrument@3.0.0-beta.16 + - @0xsequence/relayer@3.0.0-beta.16 + - @0xsequence/wallet-core@3.0.0-beta.16 + - @0xsequence/wallet-primitives@3.0.0-beta.16 + +## 3.0.0-beta.15 + +### Patch Changes + +- New chains, minor fixes +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.15 + - @0xsequence/identity-instrument@3.0.0-beta.15 + - @0xsequence/relayer@3.0.0-beta.15 + - @0xsequence/wallet-core@3.0.0-beta.15 + - @0xsequence/wallet-primitives@3.0.0-beta.15 + ## 3.0.0-beta.14 ### Patch Changes diff --git a/packages/wallet/wdk/package.json b/packages/wallet/wdk/package.json index bc69bdc1f..bd0777bca 100644 --- a/packages/wallet/wdk/package.json +++ b/packages/wallet/wdk/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-wdk", - "version": "3.0.0-beta.14", + "version": "3.0.0-beta.16", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/wdk/src/dbs/auth-keys.ts b/packages/wallet/wdk/src/dbs/auth-keys.ts index 56cf1ddf9..4f851f0b3 100644 --- a/packages/wallet/wdk/src/dbs/auth-keys.ts +++ b/packages/wallet/wdk/src/dbs/auth-keys.ts @@ -1,5 +1,6 @@ import { Generic, Migration } from './generic.js' import { IDBPDatabase, IDBPTransaction } from 'idb' +import type { WdkEnv } from '../env.js' const TABLE_NAME = 'auth-keys' @@ -11,9 +12,12 @@ export type AuthKey = { } export class AuthKeys extends Generic { - private expirationTimers = new Map() + private expirationTimers = new Map>() - constructor(dbName: string = 'sequence-auth-keys') { + constructor( + dbName: string = 'sequence-auth-keys', + private readonly env?: WdkEnv, + ) { super(dbName, TABLE_NAME, 'address', [ ( db: IDBPDatabase, @@ -64,7 +68,10 @@ export class AuthKeys extends Generic { if (result !== undefined) { return result } else if (attempt < 2) { - await new Promise((resolve) => setTimeout(resolve, 50)) + const setTimeoutFn = this.env?.timers?.setTimeout ?? (globalThis as any).setTimeout + if (setTimeoutFn) { + await new Promise((resolve) => setTimeoutFn(resolve, 50)) + } return this.getBySigner(signer, attempt + 1) } else { try { @@ -108,7 +115,11 @@ export class AuthKeys extends Generic { await this.del(authKey.address.toLowerCase()) return } - const timer = window.setTimeout(() => { + const setTimeoutFn = this.env?.timers?.setTimeout ?? (globalThis as any).setTimeout + if (!setTimeoutFn) { + return + } + const timer = setTimeoutFn(() => { console.log('removing expired auth key', authKey) this.del(authKey.address.toLowerCase()) }, delay) @@ -118,7 +129,10 @@ export class AuthKeys extends Generic { private clearExpiration(address: string): void { const timer = this.expirationTimers.get(address.toLowerCase()) if (timer) { - window.clearTimeout(timer) + const clearTimeoutFn = this.env?.timers?.clearTimeout ?? (globalThis as any).clearTimeout + if (clearTimeoutFn) { + clearTimeoutFn(timer) + } this.expirationTimers.delete(address.toLowerCase()) } } diff --git a/packages/wallet/wdk/src/env.ts b/packages/wallet/wdk/src/env.ts new file mode 100644 index 000000000..4e3cecb1a --- /dev/null +++ b/packages/wallet/wdk/src/env.ts @@ -0,0 +1,58 @@ +import type { CoreEnv } from '@0xsequence/wallet-core' +import { resolveCoreEnv } from '@0xsequence/wallet-core' + +export type TimersLike = { + setTimeout: typeof setTimeout + clearTimeout: typeof clearTimeout + setInterval: typeof setInterval + clearInterval: typeof clearInterval +} + +export type LockManagerLike = { + request: (name: string, callback: (lock: Lock | null) => Promise | void) => Promise +} + +export type NavigationLike = { + getPathname: () => string + redirect: (url: string) => void +} + +export type WdkEnv = CoreEnv & { + timers?: TimersLike + locks?: LockManagerLike + navigation?: NavigationLike + urlSearchParams?: typeof URLSearchParams +} + +export function resolveWdkEnv(env?: WdkEnv): WdkEnv { + const core = resolveCoreEnv(env) + const globalObj = globalThis as any + const windowObj = typeof window !== 'undefined' ? window : (globalObj.window ?? {}) + const location = windowObj.location ?? globalObj.location + + return { + ...core, + timers: + env?.timers ?? + (typeof globalObj.setTimeout === 'function' + ? { + setTimeout: globalObj.setTimeout.bind(globalObj), + clearTimeout: globalObj.clearTimeout.bind(globalObj), + setInterval: globalObj.setInterval.bind(globalObj), + clearInterval: globalObj.clearInterval.bind(globalObj), + } + : undefined), + locks: env?.locks ?? globalObj.navigator?.locks ?? windowObj.navigator?.locks, + navigation: + env?.navigation ?? + (location + ? { + getPathname: () => location.pathname, + redirect: (url: string) => { + location.href = url + }, + } + : undefined), + urlSearchParams: env?.urlSearchParams ?? globalObj.URLSearchParams ?? windowObj.URLSearchParams, + } +} diff --git a/packages/wallet/wdk/src/identity/signer.ts b/packages/wallet/wdk/src/identity/signer.ts index fdc53ca41..0bd7162c9 100644 --- a/packages/wallet/wdk/src/identity/signer.ts +++ b/packages/wallet/wdk/src/identity/signer.ts @@ -1,17 +1,22 @@ import { Address, Signature, Hex, Bytes, PersonalMessage } from 'ox' -import { Signers, State } from '@0xsequence/wallet-core' +import { Signers, State, type CryptoLike } from '@0xsequence/wallet-core' import { IdentityInstrument, KeyType } from '@0xsequence/identity-instrument' import { AuthKey } from '../dbs/auth-keys.js' import { Payload, Signature as SequenceSignature } from '@0xsequence/wallet-primitives' import * as Identity from '@0xsequence/identity-instrument' -export function toIdentityAuthKey(authKey: AuthKey): Identity.AuthKey { +export function toIdentityAuthKey(authKey: AuthKey, crypto?: CryptoLike): Identity.AuthKey { + const globalObj = globalThis as any + const resolvedCrypto = crypto ?? globalObj.window?.crypto ?? globalObj.crypto + if (!resolvedCrypto?.subtle) { + throw new Error('crypto.subtle is not available') + } return { address: authKey.address, keyType: Identity.KeyType.WebCrypto_Secp256r1, signer: authKey.identitySigner, async sign(digest: Bytes.Bytes) { - const authKeySignature = await window.crypto.subtle.sign( + const authKeySignature = await resolvedCrypto.subtle.sign( { name: 'ECDSA', hash: 'SHA-256', @@ -28,6 +33,7 @@ export class IdentitySigner implements Signers.Signer { constructor( readonly identityInstrument: IdentityInstrument, readonly authKey: AuthKey, + private readonly crypto?: CryptoLike, ) {} get address(): Address.Address { @@ -47,7 +53,7 @@ export class IdentitySigner implements Signers.Signer { } async signDigest(digest: Bytes.Bytes): Promise { - const sigHex = await this.identityInstrument.sign(toIdentityAuthKey(this.authKey), digest) + const sigHex = await this.identityInstrument.sign(toIdentityAuthKey(this.authKey, this.crypto), digest) const sig = Signature.fromHex(sigHex) return { type: 'hash', diff --git a/packages/wallet/wdk/src/index.ts b/packages/wallet/wdk/src/index.ts index 973ec785a..003abdd72 100644 --- a/packages/wallet/wdk/src/index.ts +++ b/packages/wallet/wdk/src/index.ts @@ -1,2 +1,3 @@ export * as Identity from './identity/signer.js' export * as Sequence from './sequence/index.js' +export * from './env.js' diff --git a/packages/wallet/wdk/src/sequence/cron.ts b/packages/wallet/wdk/src/sequence/cron.ts index a1640a7cf..f95117109 100644 --- a/packages/wallet/wdk/src/sequence/cron.ts +++ b/packages/wallet/wdk/src/sequence/cron.ts @@ -17,12 +17,14 @@ export class Cron { private readonly STORAGE_KEY = 'sequence-cron-jobs' private isStopping: boolean = false private currentCheckJobsPromise: Promise = Promise.resolve() + private readonly env: Shared['env'] /** * Initializes the Cron scheduler and starts the periodic job checker. * @param shared Shared context for modules and logging. */ constructor(private readonly shared: Shared) { + this.env = shared.env this.start() } @@ -33,7 +35,11 @@ export class Cron { private start() { if (this.isStopping) return this.executeCheckJobsChain() - this.checkInterval = setInterval(() => this.executeCheckJobsChain(), 60 * 1000) + const setIntervalFn = this.env.timers?.setInterval ?? (globalThis as any).setInterval + if (!setIntervalFn) { + return + } + this.checkInterval = setIntervalFn(() => this.executeCheckJobsChain(), 60 * 1000) } /** @@ -58,7 +64,10 @@ export class Cron { this.isStopping = true if (this.checkInterval) { - clearInterval(this.checkInterval) + const clearIntervalFn = this.env.timers?.clearInterval ?? (globalThis as any).clearInterval + if (clearIntervalFn) { + clearIntervalFn(this.checkInterval) + } this.checkInterval = undefined this.shared.modules.logger.log('Cron: Interval cleared.') } @@ -104,48 +113,22 @@ export class Cron { } try { - await navigator.locks.request('sequence-cron-jobs', async (lock: Lock | null) => { - if (this.isStopping) { - return - } - if (!lock) { - return - } - - const now = Date.now() - const storage = await this.getStorageState() - - for (const [id, job] of this.jobs) { + const locks = this.env.locks ?? (globalThis as any).navigator?.locks + if (locks?.request) { + await locks.request('sequence-cron-jobs', async (lock: Lock | null) => { if (this.isStopping) { - break + return } - - const lastRun = storage.get(id)?.lastRun ?? job.lastRun - const timeSinceLastRun = now - lastRun - - if (timeSinceLastRun >= job.interval) { - try { - await job.handler() - if (!this.isStopping) { - job.lastRun = now - storage.set(id, { lastRun: now }) - } - } catch (error) { - if (error instanceof DOMException && error.name === 'AbortError') { - this.shared.modules.logger.log(`Cron: Job ${id} was aborted.`) - } else { - console.error(`Cron job ${id} failed:`, error) - } - } + if (!lock) { + return } - } - - if (!this.isStopping) { - await this.syncWithStorage() - } - }) + await this.runJobs() + }) + } else { + await this.runJobs() + } } catch (error) { - if (error instanceof DOMException && error.name === 'AbortError') { + if (this.isAbortError(error)) { this.shared.modules.logger.log('Cron: navigator.locks.request was aborted.') } else { console.error('Cron: Error in navigator.locks.request:', error) @@ -153,13 +136,51 @@ export class Cron { } } + private async runJobs(): Promise { + const now = Date.now() + const storage = await this.getStorageState() + + for (const [id, job] of this.jobs) { + if (this.isStopping) { + break + } + + const lastRun = storage.get(id)?.lastRun ?? job.lastRun + const timeSinceLastRun = now - lastRun + + if (timeSinceLastRun >= job.interval) { + try { + await job.handler() + if (!this.isStopping) { + job.lastRun = now + storage.set(id, { lastRun: now }) + } + } catch (error) { + if (this.isAbortError(error)) { + this.shared.modules.logger.log(`Cron: Job ${id} was aborted.`) + } else { + console.error(`Cron job ${id} failed:`, error) + } + } + } + } + + if (!this.isStopping) { + await this.syncWithStorage() + } + } + /** * Loads the persisted last run times for jobs from localStorage. * @returns Map of job IDs to their last run times. */ private async getStorageState(): Promise> { if (this.isStopping) return new Map() - const state = localStorage.getItem(this.STORAGE_KEY) + const storage = this.env.storage + if (!storage) { + return new Map() + } + const state = storage.getItem(this.STORAGE_KEY) return new Map(state ? JSON.parse(state) : []) } @@ -168,7 +189,19 @@ export class Cron { */ private async syncWithStorage() { if (this.isStopping) return + const storage = this.env.storage + if (!storage) { + return + } const state = Array.from(this.jobs.entries()).map(([id, job]) => [id, { lastRun: job.lastRun }]) - localStorage.setItem(this.STORAGE_KEY, JSON.stringify(state)) + storage.setItem(this.STORAGE_KEY, JSON.stringify(state)) + } + + private isAbortError(error: unknown): boolean { + const domException = (globalThis as any).DOMException + if (domException && error instanceof domException) { + return (error as DOMException).name === 'AbortError' + } + return (error as any)?.name === 'AbortError' } } diff --git a/packages/wallet/wdk/src/sequence/handlers/authcode-pkce.ts b/packages/wallet/wdk/src/sequence/handlers/authcode-pkce.ts index 0b4706c0e..94d456d3e 100644 --- a/packages/wallet/wdk/src/sequence/handlers/authcode-pkce.ts +++ b/packages/wallet/wdk/src/sequence/handlers/authcode-pkce.ts @@ -5,6 +5,7 @@ import { Signatures } from '../signatures.js' import * as Identity from '@0xsequence/identity-instrument' import { IdentitySigner } from '../../identity/signer.js' import { AuthCodeHandler } from './authcode.js' +import type { WdkEnv } from '../../env.js' export class AuthCodePkceHandler extends AuthCodeHandler implements Handler { constructor( @@ -16,8 +17,9 @@ export class AuthCodePkceHandler extends AuthCodeHandler implements Handler { signatures: Signatures, commitments: Db.AuthCommitments, authKeys: Db.AuthKeys, + env?: WdkEnv, ) { - super(signupKind, issuer, oauthUrl, audience, nitro, signatures, commitments, authKeys) + super(signupKind, issuer, oauthUrl, audience, nitro, signatures, commitments, authKeys, env) } public async commitAuth(target: string, isSignUp: boolean, state?: string, signer?: string) { @@ -40,7 +42,7 @@ export class AuthCodePkceHandler extends AuthCodeHandler implements Handler { isSignUp, }) - const searchParams = new URLSearchParams({ + const searchParams = this.serializeQuery({ code_challenge: codeChallenge, code_challenge_method: 'S256', client_id: this.audience, @@ -51,7 +53,7 @@ export class AuthCodePkceHandler extends AuthCodeHandler implements Handler { state, }) - return `${this.oauthUrl}?${searchParams.toString()}` + return `${this.oauthUrl}?${searchParams}` } public async completeAuth( diff --git a/packages/wallet/wdk/src/sequence/handlers/authcode.ts b/packages/wallet/wdk/src/sequence/handlers/authcode.ts index 74ad9ee93..8e98745e8 100644 --- a/packages/wallet/wdk/src/sequence/handlers/authcode.ts +++ b/packages/wallet/wdk/src/sequence/handlers/authcode.ts @@ -6,6 +6,7 @@ import * as Identity from '@0xsequence/identity-instrument' import { SignerUnavailable, SignerReady, SignerActionable, BaseSignatureRequest } from '../types/signature-request.js' import { IdentitySigner } from '../../identity/signer.js' import { IdentityHandler } from './identity.js' +import type { NavigationLike, WdkEnv } from '../../env.js' export class AuthCodeHandler extends IdentityHandler implements Handler { protected redirectUri: string = '' @@ -19,8 +20,9 @@ export class AuthCodeHandler extends IdentityHandler implements Handler { signatures: Signatures, protected readonly commitments: Db.AuthCommitments, authKeys: Db.AuthKeys, + env?: WdkEnv, ) { - super(nitro, authKeys, signatures, Identity.IdentityType.OIDC) + super(nitro, authKeys, signatures, Identity.IdentityType.OIDC, env) } public get kind() { @@ -45,7 +47,7 @@ export class AuthCodeHandler extends IdentityHandler implements Handler { isSignUp, }) - const searchParams = new URLSearchParams({ + const searchParams = this.serializeQuery({ client_id: this.audience, redirect_uri: this.redirectUri, response_type: 'code', @@ -53,7 +55,7 @@ export class AuthCodeHandler extends IdentityHandler implements Handler { ...(this.signupKind === 'apple' ? {} : { scope: 'openid profile email' }), }) - return `${this.oauthUrl}?${searchParams.toString()}` + return `${this.oauthUrl}?${searchParams}` } public async completeAuth( @@ -94,10 +96,29 @@ export class AuthCodeHandler extends IdentityHandler implements Handler { status: 'actionable', message: 'request-redirect', handle: async () => { - const url = await this.commitAuth(window.location.pathname, false, request.id, address) - window.location.href = url + const navigation = this.getNavigation() + const url = await this.commitAuth(navigation.getPathname(), false, request.id, address) + navigation.redirect(url) return true }, } } + + protected serializeQuery(params: Record): string { + const searchParamsCtor = this.env.urlSearchParams ?? (globalThis as any).URLSearchParams + if (searchParamsCtor) { + return new searchParamsCtor(params).toString() + } + return Object.entries(params) + .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`) + .join('&') + } + + private getNavigation(): NavigationLike { + const navigation = this.env.navigation + if (!navigation) { + throw new Error('navigation is not available') + } + return navigation + } } diff --git a/packages/wallet/wdk/src/sequence/handlers/identity.ts b/packages/wallet/wdk/src/sequence/handlers/identity.ts index f18245222..815c4d385 100644 --- a/packages/wallet/wdk/src/sequence/handlers/identity.ts +++ b/packages/wallet/wdk/src/sequence/handlers/identity.ts @@ -4,6 +4,7 @@ import * as Identity from '@0xsequence/identity-instrument' import { Signatures } from '../signatures.js' import { BaseSignatureRequest } from '../types/signature-request.js' import { IdentitySigner, toIdentityAuthKey } from '../../identity/signer.js' +import { resolveWdkEnv, type WdkEnv } from '../../env.js' export const identityTypeToHex = (identityType?: Identity.IdentityType): Hex.Hex => { // Bytes4 @@ -19,12 +20,17 @@ export const identityTypeToHex = (identityType?: Identity.IdentityType): Hex.Hex } export class IdentityHandler { + protected readonly env: WdkEnv + constructor( private readonly nitro: Identity.IdentityInstrument, private readonly authKeys: Db.AuthKeys, private readonly signatures: Signatures, public readonly identityType: Identity.IdentityType, - ) {} + env?: WdkEnv, + ) { + this.env = resolveWdkEnv(env) + } public onStatusChange(cb: () => void): () => void { return this.authKeys.addListener(cb) @@ -37,7 +43,7 @@ export class IdentityHandler { throw new Error('no-auth-key') } - const res = await this.nitro.commitVerifier(toIdentityAuthKey(authKey), challenge) + const res = await this.nitro.commitVerifier(toIdentityAuthKey(authKey, this.env.crypto), challenge) return res } @@ -47,7 +53,7 @@ export class IdentityHandler { throw new Error('no-auth-key') } - const res = await this.nitro.completeAuth(toIdentityAuthKey(authKey), challenge) + const res = await this.nitro.completeAuth(toIdentityAuthKey(authKey, this.env.crypto), challenge) authKey.identitySigner = res.signer.address authKey.expiresAt = new Date(Date.now() + 1000 * 60 * 3) // 3 minutes @@ -55,7 +61,7 @@ export class IdentityHandler { await this.authKeys.delBySigner(authKey.identitySigner) await this.authKeys.set(authKey) - const signer = new IdentitySigner(this.nitro, authKey) + const signer = new IdentitySigner(this.nitro, authKey, this.env.crypto) return { signer, email: res.identity.email } } @@ -72,13 +78,17 @@ export class IdentityHandler { if (!authKey) { return undefined } - return new IdentitySigner(this.nitro, authKey) + return new IdentitySigner(this.nitro, authKey, this.env.crypto) } private async getAuthKey(signer: string): Promise { let authKey = await this.authKeys.getBySigner(signer) if (!signer && !authKey) { - const keyPair = await window.crypto.subtle.generateKey( + const crypto = this.env.crypto ?? (globalThis as any).crypto + if (!crypto?.subtle) { + throw new Error('crypto.subtle is not available') + } + const keyPair = await crypto.subtle.generateKey( { name: 'ECDSA', namedCurve: 'P-256', @@ -86,7 +96,7 @@ export class IdentityHandler { false, ['sign', 'verify'], ) - const publicKey = await window.crypto.subtle.exportKey('raw', keyPair.publicKey) + const publicKey = await crypto.subtle.exportKey('raw', keyPair.publicKey) authKey = { address: Hex.fromBytes(new Uint8Array(publicKey)), identitySigner: '', diff --git a/packages/wallet/wdk/src/sequence/handlers/otp.ts b/packages/wallet/wdk/src/sequence/handlers/otp.ts index f037189cb..a4e7b750b 100644 --- a/packages/wallet/wdk/src/sequence/handlers/otp.ts +++ b/packages/wallet/wdk/src/sequence/handlers/otp.ts @@ -8,6 +8,7 @@ import { SignerUnavailable, SignerReady, SignerActionable, BaseSignatureRequest import { Kinds } from '../types/signer.js' import { IdentityHandler } from './identity.js' import { AnswerIncorrectError, ChallengeExpiredError, TooManyAttemptsError } from '../errors.js' +import type { WdkEnv } from '../../env.js' type RespondFn = (otp: string) => Promise @@ -18,8 +19,8 @@ export class OtpHandler extends IdentityHandler implements Handler { private onPromptOtp: undefined | PromptOtpHandler - constructor(nitro: Identity.IdentityInstrument, signatures: Signatures, authKeys: Db.AuthKeys) { - super(nitro, authKeys, signatures, Identity.IdentityType.Email) + constructor(nitro: Identity.IdentityInstrument, signatures: Signatures, authKeys: Db.AuthKeys, env?: WdkEnv) { + super(nitro, authKeys, signatures, Identity.IdentityType.Email, env) } public registerUI(onPromptOtp: PromptOtpHandler) { diff --git a/packages/wallet/wdk/src/sequence/handlers/passkeys.ts b/packages/wallet/wdk/src/sequence/handlers/passkeys.ts index da3db7ff3..7f1e5050a 100644 --- a/packages/wallet/wdk/src/sequence/handlers/passkeys.ts +++ b/packages/wallet/wdk/src/sequence/handlers/passkeys.ts @@ -1,33 +1,35 @@ -import { Signers, State } from '@0xsequence/wallet-core' +import { State } from '@0xsequence/wallet-core' import { Address, Hex } from 'ox' import { Kinds } from '../types/signer.js' import { Signatures } from '../signatures.js' -import { Extensions } from '@0xsequence/wallet-primitives' +import { Config, Extensions } from '@0xsequence/wallet-primitives' import { Handler } from './handler.js' import { SignerActionable, SignerUnavailable, BaseSignatureRequest } from '../types/index.js' +import type { PasskeyProvider, PasskeySigner } from '../passkeys-provider.js' export class PasskeysHandler implements Handler { kind = Kinds.LoginPasskey - private readySigners = new Map() + private readySigners = new Map() constructor( private readonly signatures: Signatures, private readonly extensions: Pick, private readonly stateReader: State.Reader, + private readonly passkeyProvider: PasskeyProvider, ) {} onStatusChange(cb: () => void): () => void { return () => {} } - public addReadySigner(signer: Signers.Passkey.Passkey) { + public addReadySigner(signer: PasskeySigner) { // Use credentialId as key to match specific passkey instances this.readySigners.set(signer.credentialId, signer) } - private async loadPasskey(wallet: Address.Address, imageHash: Hex.Hex): Promise { + private async loadPasskey(wallet: Address.Address, imageHash: Hex.Hex): Promise { try { - return await Signers.Passkey.Passkey.loadFromWitness(this.stateReader, this.extensions, wallet, imageHash) + return await this.passkeyProvider.loadFromWitness(this.stateReader, this.extensions, wallet, imageHash) } catch (e) { console.warn('Failed to load passkey:', e) return undefined @@ -55,7 +57,7 @@ export class PasskeysHandler implements Handler { } // First check if we have a ready signer that matches the imageHash - let passkey: Signers.Passkey.Passkey | undefined + let passkey: PasskeySigner | undefined // Look for a ready signer with matching imageHash for (const readySigner of this.readySigners.values()) { @@ -91,12 +93,10 @@ export class PasskeysHandler implements Handler { message: 'request-interaction-with-passkey', imageHash: imageHash, handle: async () => { - const signature = await passkey.signSapient( - request.envelope.wallet, - request.envelope.chainId, - request.envelope.payload, - imageHash, + const normalized = Config.normalizeSignerSignature( + passkey.signSapient(request.envelope.wallet, request.envelope.chainId, request.envelope.payload, imageHash), ) + const signature = await normalized.signature await this.signatures.addSignature(request.id, { address, imageHash, diff --git a/packages/wallet/wdk/src/sequence/index.ts b/packages/wallet/wdk/src/sequence/index.ts index 37729a477..ed2f9e440 100644 --- a/packages/wallet/wdk/src/sequence/index.ts +++ b/packages/wallet/wdk/src/sequence/index.ts @@ -3,6 +3,8 @@ export { Network as Networks } export type { ManagerOptions, Databases, Sequence, Modules, Shared } from './manager.js' export { ManagerOptionsDefaults, CreateWalletOptionsDefaults, applyManagerOptionsDefaults, Manager } from './manager.js' +export { defaultPasskeyProvider } from './passkeys-provider.js' +export type { PasskeyProvider, PasskeySigner } from './passkeys-provider.js' export { Sessions } from './sessions.js' export { Signatures } from './signatures.js' export type { diff --git a/packages/wallet/wdk/src/sequence/manager.ts b/packages/wallet/wdk/src/sequence/manager.ts index ba27116cf..80ca1653c 100644 --- a/packages/wallet/wdk/src/sequence/manager.ts +++ b/packages/wallet/wdk/src/sequence/manager.ts @@ -5,6 +5,7 @@ import { createAttestationVerifyingFetch } from '@0xsequence/tee-verifier' import { Config, Constants, Context, Extensions, Network } from '@0xsequence/wallet-primitives' import { Address } from 'ox' import * as Db from '../dbs/index.js' +import { resolveWdkEnv, type WdkEnv } from '../env.js' import { Cron } from './cron.js' import { Devices } from './devices.js' import { Guards, GuardRole } from './guards.js' @@ -31,6 +32,7 @@ import { GuardHandler, PromptCodeHandler } from './handlers/guard.js' import { PasskeyCredential } from '../dbs/index.js' import { PromptMnemonicHandler } from './handlers/mnemonic.js' import { PromptOtpHandler } from './handlers/otp.js' +import { defaultPasskeyProvider, type PasskeyProvider } from './passkeys-provider.js' export type ManagerOptions = { verbose?: boolean @@ -52,6 +54,9 @@ export type ManagerOptions = { dbPruningInterval?: number + env?: WdkEnv + passkeyProvider?: PasskeyProvider + stateProvider?: State.Provider networks?: Network.Network[] relayers?: Relayer.Relayer[] | (() => Relayer.Relayer[]) @@ -70,7 +75,7 @@ export type ManagerOptions = { identity?: { url?: string - fetch?: typeof window.fetch + fetch?: typeof fetch verifyAttestation?: boolean expectedPcr0?: string[] scope?: string @@ -95,6 +100,72 @@ export type ManagerOptions = { } } +export type ResolvedIdentityOptions = { + url: string + fetch?: typeof fetch + verifyAttestation: boolean + expectedPcr0?: string[] + scope?: string + email: { + enabled: boolean + } + google: { + enabled: boolean + clientId: string + } + apple: { + enabled: boolean + clientId: string + } + customProviders?: { + kind: `custom-${string}` + authMethod: 'id-token' | 'authcode' | 'authcode-pkce' + issuer: string + oauthUrl: string + clientId: string + }[] +} + +export type ResolvedManagerOptions = { + verbose: boolean + + extensions: Extensions.Extensions + context: Context.Context + context4337: Context.Context + guest: Address.Address + + encryptedPksDb: CoreSigners.Pk.Encrypted.EncryptedPksDb + managerDb: Db.Wallets + transactionsDb: Db.Transactions + signaturesDb: Db.Signatures + messagesDb: Db.Messages + authCommitmentsDb: Db.AuthCommitments + authKeysDb: Db.AuthKeys + recoveryDb: Db.Recovery + passkeyCredentialsDb: Db.PasskeyCredentials + + dbPruningInterval: number + + env: WdkEnv + passkeyProvider: PasskeyProvider + + stateProvider: State.Provider + networks: Network.Network[] + relayers: Relayer.Relayer[] | (() => Relayer.Relayer[]) + bundlers: Bundler.Bundler[] + guardUrl: string + guardAddresses: Record + + nonWitnessableSigners: Address.Address[] + + defaultGuardTopology: Config.Topology + defaultRecoverySettings: RecoverySettings + + multiInjectedProviderDiscovery: boolean + + identity: ResolvedIdentityOptions +} + export const ManagerOptionsDefaults = { verbose: false, @@ -115,7 +186,9 @@ export const ManagerOptionsDefaults = { dbPruningInterval: 1000 * 60 * 60 * 24, // 24 hours - stateProvider: new State.Sequence.Provider(), + passkeyProvider: defaultPasskeyProvider, + + stateProvider: typeof fetch !== 'undefined' ? new State.Sequence.Provider(undefined, fetch) : undefined, networks: Network.ALL, relayers: () => { if (typeof window !== 'undefined') { @@ -186,13 +259,45 @@ export const CreateWalletOptionsDefaults = { useGuard: false, } -export function applyManagerOptionsDefaults(options?: ManagerOptions) { - const merged = { - ...ManagerOptionsDefaults, - ...options, - identity: { ...ManagerOptionsDefaults.identity, ...options?.identity }, +export function applyManagerOptionsDefaults(options?: ManagerOptions): ResolvedManagerOptions { + const env = resolveWdkEnv(options?.env) + + const identity: ResolvedIdentityOptions = { + ...ManagerOptionsDefaults.identity, + ...options?.identity, + email: { ...ManagerOptionsDefaults.identity.email, ...options?.identity?.email }, + google: { ...ManagerOptionsDefaults.identity.google, ...options?.identity?.google }, + apple: { ...ManagerOptionsDefaults.identity.apple, ...options?.identity?.apple }, + } + + if (!identity.fetch && env.fetch) { + identity.fetch = env.fetch + } + + let encryptedPksDb = options?.encryptedPksDb ?? ManagerOptionsDefaults.encryptedPksDb + if (!options?.encryptedPksDb && options?.env) { + encryptedPksDb = new CoreSigners.Pk.Encrypted.EncryptedPksDb(undefined, undefined, env) + } + + let authKeysDb = options?.authKeysDb ?? ManagerOptionsDefaults.authKeysDb + if (!options?.authKeysDb && options?.env) { + authKeysDb = new Db.AuthKeys(undefined, env) } + let stateProvider = options?.stateProvider ?? ManagerOptionsDefaults.stateProvider + if (!options?.stateProvider && options?.env?.fetch) { + stateProvider = new State.Sequence.Provider(undefined, options.env.fetch) + } else if (!stateProvider && env.fetch) { + stateProvider = new State.Sequence.Provider(undefined, env.fetch) + } + + if (!stateProvider) { + throw new Error('stateProvider is required. Provide ManagerOptions.stateProvider or env.fetch') + } + + const extensions = options?.extensions ?? ManagerOptionsDefaults.extensions + const defaultGuardTopology = options?.defaultGuardTopology ?? ManagerOptionsDefaults.defaultGuardTopology + // Merge and normalize non-witnessable signers. // We always include the sessions extension address for the active extensions set. const nonWitnessable = new Set() @@ -202,12 +307,12 @@ export function applyManagerOptionsDefaults(options?: ManagerOptions) { for (const address of options?.nonWitnessableSigners ?? []) { nonWitnessable.add(address.toLowerCase()) } - nonWitnessable.add(merged.extensions.sessions.toLowerCase()) + nonWitnessable.add(extensions.sessions.toLowerCase()) // Include static signer leaves from the guard topology (e.g. recovery guard signer), // but ignore the placeholder address that is later replaced per-role. - if (merged.defaultGuardTopology) { - const guardTopologySigners = Config.getSigners(merged.defaultGuardTopology) + if (defaultGuardTopology) { + const guardTopologySigners = Config.getSigners(defaultGuardTopology) for (const signer of guardTopologySigners.signers) { if (Address.isEqual(signer, Constants.PlaceholderAddress)) { continue @@ -219,9 +324,46 @@ export function applyManagerOptionsDefaults(options?: ManagerOptions) { } } - merged.nonWitnessableSigners = Array.from(nonWitnessable) as Address.Address[] + return { + verbose: options?.verbose ?? ManagerOptionsDefaults.verbose, - return merged + extensions, + context: options?.context ?? ManagerOptionsDefaults.context, + context4337: options?.context4337 ?? ManagerOptionsDefaults.context4337, + guest: options?.guest ?? ManagerOptionsDefaults.guest, + + encryptedPksDb, + managerDb: options?.managerDb ?? ManagerOptionsDefaults.managerDb, + transactionsDb: options?.transactionsDb ?? ManagerOptionsDefaults.transactionsDb, + signaturesDb: options?.signaturesDb ?? ManagerOptionsDefaults.signaturesDb, + messagesDb: options?.messagesDb ?? ManagerOptionsDefaults.messagesDb, + authCommitmentsDb: options?.authCommitmentsDb ?? ManagerOptionsDefaults.authCommitmentsDb, + recoveryDb: options?.recoveryDb ?? ManagerOptionsDefaults.recoveryDb, + authKeysDb, + passkeyCredentialsDb: options?.passkeyCredentialsDb ?? ManagerOptionsDefaults.passkeyCredentialsDb, + + dbPruningInterval: options?.dbPruningInterval ?? ManagerOptionsDefaults.dbPruningInterval, + + env, + passkeyProvider: options?.passkeyProvider ?? ManagerOptionsDefaults.passkeyProvider, + + stateProvider, + networks: options?.networks ?? ManagerOptionsDefaults.networks, + relayers: options?.relayers ?? ManagerOptionsDefaults.relayers, + bundlers: options?.bundlers ?? ManagerOptionsDefaults.bundlers, + guardUrl: options?.guardUrl ?? ManagerOptionsDefaults.guardUrl, + guardAddresses: options?.guardAddresses ?? ManagerOptionsDefaults.guardAddresses, + + nonWitnessableSigners: Array.from(nonWitnessable) as Address.Address[], + + defaultGuardTopology, + defaultRecoverySettings: options?.defaultRecoverySettings ?? ManagerOptionsDefaults.defaultRecoverySettings, + + multiInjectedProviderDiscovery: + options?.multiInjectedProviderDiscovery ?? ManagerOptionsDefaults.multiInjectedProviderDiscovery, + + identity, + } } export type RecoverySettings = { @@ -283,6 +425,8 @@ export type Shared = { readonly sequence: Sequence readonly databases: Databases + readonly env: WdkEnv + readonly passkeyProvider: PasskeyProvider readonly handlers: Map @@ -469,6 +613,9 @@ export class Manager { pruningInterval: ops.dbPruningInterval, }, + env: ops.env, + passkeyProvider: ops.passkeyProvider, + modules: {} as any, handlers: new Map(), } @@ -501,6 +648,7 @@ export class Manager { modules.signatures, shared.sequence.extensions, shared.sequence.stateProvider, + shared.passkeyProvider, ) shared.handlers.set(Kinds.LoginPasskey, this.passkeysHandler) @@ -523,7 +671,7 @@ export class Manager { const identityInstrument = new IdentityInstrument(ops.identity.url, ops.identity.scope, verifyingFetch) if (ops.identity.email?.enabled) { - this.otpHandler = new OtpHandler(identityInstrument, modules.signatures, shared.databases.authKeys) + this.otpHandler = new OtpHandler(identityInstrument, modules.signatures, shared.databases.authKeys, shared.env) shared.handlers.set(Kinds.LoginEmailOtp, this.otpHandler) } if (ops.identity.google?.enabled) { @@ -538,6 +686,7 @@ export class Manager { modules.signatures, shared.databases.authCommitments, shared.databases.authKeys, + shared.env, ), ) } @@ -553,6 +702,7 @@ export class Manager { modules.signatures, shared.databases.authCommitments, shared.databases.authKeys, + shared.env, ), ) } @@ -573,6 +723,7 @@ export class Manager { modules.signatures, shared.databases.authCommitments, shared.databases.authKeys, + shared.env, ), ) break @@ -588,6 +739,7 @@ export class Manager { modules.signatures, shared.databases.authCommitments, shared.databases.authKeys, + shared.env, ), ) break diff --git a/packages/wallet/wdk/src/sequence/passkeys-provider.ts b/packages/wallet/wdk/src/sequence/passkeys-provider.ts new file mode 100644 index 000000000..3ed2068fe --- /dev/null +++ b/packages/wallet/wdk/src/sequence/passkeys-provider.ts @@ -0,0 +1,55 @@ +import { Signers, State } from '@0xsequence/wallet-core' +import type { Extensions } from '@0xsequence/wallet-primitives' +import type { Address, Hex } from 'ox' + +export type PasskeySigner = Signers.SapientSigner & + Signers.Witnessable & { + credentialId: string + publicKey: Extensions.Passkeys.PublicKey + imageHash: Hex.Hex + } + +export type PasskeyProvider = { + create: ( + extensions: Pick, + options?: Signers.Passkey.CreatePasskeyOptions, + ) => Promise + find: ( + stateReader: State.Reader, + extensions: Pick, + options?: Signers.Passkey.FindPasskeyOptions, + ) => Promise + loadFromWitness: ( + stateReader: State.Reader, + extensions: Pick, + wallet: Address.Address, + imageHash: Hex.Hex, + options?: Signers.Passkey.FindPasskeyOptions, + ) => Promise + fromCredential: (args: { + credentialId: string + publicKey: Extensions.Passkeys.PublicKey + extensions: Pick + embedMetadata?: boolean + metadata?: Extensions.Passkeys.PasskeyMetadata + webauthn?: Signers.Passkey.WebAuthnLike + }) => PasskeySigner + isSigner?: (signer: unknown) => signer is PasskeySigner +} + +export const defaultPasskeyProvider: PasskeyProvider = { + create: (extensions, options) => Signers.Passkey.Passkey.create(extensions, options), + find: (stateReader, extensions, options) => Signers.Passkey.Passkey.find(stateReader, extensions, options), + loadFromWitness: (stateReader, extensions, wallet, imageHash, options) => + Signers.Passkey.Passkey.loadFromWitness(stateReader, extensions, wallet, imageHash, options), + fromCredential: ({ credentialId, publicKey, extensions, embedMetadata, metadata, webauthn }) => + new Signers.Passkey.Passkey({ + credentialId, + publicKey, + extensions, + embedMetadata, + metadata, + webauthn, + }), + isSigner: (signer: unknown): signer is PasskeySigner => signer instanceof Signers.Passkey.Passkey, +} diff --git a/packages/wallet/wdk/src/sequence/recovery.ts b/packages/wallet/wdk/src/sequence/recovery.ts index 600fb7674..b40b138f8 100644 --- a/packages/wallet/wdk/src/sequence/recovery.ts +++ b/packages/wallet/wdk/src/sequence/recovery.ts @@ -284,7 +284,7 @@ export class Recovery implements RecoveryInterface { } await this.updateRecoveryModule(modules, (leaves) => { - const next = leaves.filter((l) => l.signer !== address) + const next = leaves.filter((l) => !Address.isEqual(l.signer, address)) if (next.length === 0) { return [ { @@ -530,60 +530,64 @@ export class Recovery implements RecoveryInterface { for (const signer of signers) { for (const { chainId, provider } of providers) { - const totalPayloads = await Extensions.Recovery.totalQueuedPayloads( - provider, - this.shared.sequence.extensions.recovery, - wallet, - signer.address, - ) - - for (let i = 0n; i < totalPayloads; i++) { - const payloadHash = await Extensions.Recovery.queuedPayloadHashOf( + try { + const totalPayloads = await Extensions.Recovery.totalQueuedPayloads( provider, this.shared.sequence.extensions.recovery, wallet, signer.address, - i, ) - const timestamp = await Extensions.Recovery.timestampForQueuedPayload( - provider, - this.shared.sequence.extensions.recovery, - wallet, - signer.address, - payloadHash, - ) - - const payload = await this.shared.sequence.stateProvider.getPayload(payloadHash) + for (let i = 0n; i < totalPayloads; i++) { + const payloadHash = await Extensions.Recovery.queuedPayloadHashOf( + provider, + this.shared.sequence.extensions.recovery, + wallet, + signer.address, + i, + ) + + const timestamp = await Extensions.Recovery.timestampForQueuedPayload( + provider, + this.shared.sequence.extensions.recovery, + wallet, + signer.address, + payloadHash, + ) + + const payload = await this.shared.sequence.stateProvider.getPayload(payloadHash) + + // If ready, we need to check if it was executed already + // for this, we check if the wallet nonce for the given space + // is greater than the nonce in the payload + if (timestamp < Date.now() / 1000 && payload && Payload.isCalls(payload.payload)) { + const nonce = await this.shared.modules.wallets.getNonce(chainId, wallet, payload.payload.space) + if (nonce > i) { + continue + } + } - // If ready, we need to check if it was executed already - // for this, we check if the wallet nonce for the given space - // is greater than the nonce in the payload - if (timestamp < Date.now() / 1000 && payload && Payload.isCalls(payload.payload)) { - const nonce = await this.shared.modules.wallets.getNonce(chainId, wallet, payload.payload.space) - if (nonce > i) { - continue + // The id is the index + signer address + chainId + wallet address + const id = `${i}-${signer.address}-${chainId}-${wallet}` + + // Create a new payload + const payloadEntry: QueuedRecoveryPayload = { + id, + index: i, + recoveryModule: this.shared.sequence.extensions.recovery, + wallet: wallet, + signer: signer.address, + chainId, + startTimestamp: timestamp, + endTimestamp: timestamp + signer.requiredDeltaTime, + payloadHash, + payload: payload?.payload, } - } - // The id is the index + signer address + chainId + wallet address - const id = `${i}-${signer.address}-${chainId}-${wallet}` - - // Create a new payload - const payloadEntry: QueuedRecoveryPayload = { - id, - index: i, - recoveryModule: this.shared.sequence.extensions.recovery, - wallet: wallet, - signer: signer.address, - chainId, - startTimestamp: timestamp, - endTimestamp: timestamp + signer.requiredDeltaTime, - payloadHash, - payload: payload?.payload, + payloads.push(payloadEntry) } - - payloads.push(payloadEntry) + } catch (err) { + console.error('Recovery.fetchQueuedPayloads error', err) } } } diff --git a/packages/wallet/wdk/src/sequence/wallets.ts b/packages/wallet/wdk/src/sequence/wallets.ts index fd0320cc4..04fb9586a 100644 --- a/packages/wallet/wdk/src/sequence/wallets.ts +++ b/packages/wallet/wdk/src/sequence/wallets.ts @@ -12,6 +12,7 @@ import { Kinds, SignerWithKind, WitnessExtraSignerKind } from './types/signer.js import { Wallet, WalletSelectionUiHandler } from './types/wallet.js' import { PasskeysHandler } from './handlers/passkeys.js' import { GuardRole } from './guards.js' +import type { PasskeySigner } from './passkeys-provider.js' export type StartSignUpWithRedirectArgs = { kind: 'google-pkce' | 'apple' | `custom-${string}` @@ -626,7 +627,7 @@ export class Wallets implements WalletsInterface { }> { switch (args.kind) { case 'passkey': - const passkeySigner = await Signers.Passkey.Passkey.create(this.shared.sequence.extensions, { + const passkeySigner = await this.shared.passkeyProvider.create(this.shared.sequence.extensions, { stateProvider: this.shared.sequence.stateProvider, credentialName: args.name, }) @@ -891,7 +892,7 @@ export class Wallets implements WalletsInterface { } // Store passkey credential ID mapping if this is a passkey signup - if (args.kind === 'passkey' && loginSigner.signer instanceof Signers.Passkey.Passkey) { + if (args.kind === 'passkey' && this.isPasskeySigner(loginSigner.signer)) { try { await this.shared.databases.passkeyCredentials.saveCredential( loginSigner.signer.credentialId, @@ -1075,7 +1076,7 @@ export class Wallets implements WalletsInterface { } if (isLoginToPasskeyArgs(args)) { - let passkeySigner: Signers.Passkey.Passkey + let passkeySigner: PasskeySigner if (args.credentialId) { // Application-controlled login: use the provided credentialId @@ -1087,7 +1088,7 @@ export class Wallets implements WalletsInterface { } // Create passkey signer from stored credential - passkeySigner = new Signers.Passkey.Passkey({ + passkeySigner = this.shared.passkeyProvider.fromCredential({ credentialId: credential.credentialId, publicKey: credential.publicKey, extensions: this.shared.sequence.extensions, @@ -1098,7 +1099,7 @@ export class Wallets implements WalletsInterface { // Default discovery behavior: use WebAuthn discovery this.shared.modules.logger.log('No credentialId provided, using discovery method') - const foundPasskeySigner = await Signers.Passkey.Passkey.find( + const foundPasskeySigner = await this.shared.passkeyProvider.find( this.shared.sequence.stateProvider, this.shared.sequence.extensions, ) @@ -1153,6 +1154,20 @@ export class Wallets implements WalletsInterface { throw new Error('invalid-login-args') } + private isPasskeySigner(signer: unknown): signer is PasskeySigner { + const guard = this.shared.passkeyProvider.isSigner + if (guard) { + return guard(signer) + } + return ( + typeof signer === 'object' && + signer !== null && + 'credentialId' in signer && + 'publicKey' in signer && + 'imageHash' in signer + ) + } + async completeLogin(requestId: string) { const request = await this.shared.modules.signatures.get(requestId) diff --git a/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/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 000000000..0b31b7584 Binary files /dev/null and b/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/v8-compile-cache-0/x64/11.3.244.8-node.19/zSprojectzSsequence.jszSnode_moduleszS.pnpmzS@preconstruct+cli@2.8.7zSnode_moduleszS@preconstructzSclizSbin.js.MAP b/v8-compile-cache-0/x64/11.3.244.8-node.19/zSprojectzSsequence.jszSnode_moduleszS.pnpmzS@preconstruct+cli@2.8.7zSnode_moduleszS@preconstructzSclizSbin.js.MAP new file mode 100644 index 000000000..740454352 --- /dev/null +++ b/v8-compile-cache-0/x64/11.3.244.8-node.19/zSprojectzSsequence.jszSnode_moduleszS.pnpmzS@preconstruct+cli@2.8.7zSnode_moduleszS@preconstructzSclizSbin.js.MAP @@ -0,0 +1 @@ +{"/project/sequence.js/node_modules/.pnpm/@preconstruct+cli@2.8.7/node_modules/@preconstruct/cli/cli/dist/preconstruct-cli-cli.cjs.js":["8315344ea3ec2213ef0e4aaa37b41d90c77999cb",0,32424],"/project/sequence.js/node_modules/.pnpm/meow@7.1.1/node_modules/meow/index.js":["4a866f54ed797369e8e33d78cc06f5834ee7b7be",32424,34544],"/project/sequence.js/node_modules/.pnpm/minimist-options@4.1.0/node_modules/minimist-options/index.js":["0f0bff7fe31e97f7ea78636b1aca17e841e5f8e3",34544,36360],"/project/sequence.js/node_modules/.pnpm/is-plain-obj@1.1.0/node_modules/is-plain-obj/index.js":["16523ba84e3229bcd98780b380a4f4e323b8bf8b",36360,37088],"/project/sequence.js/node_modules/.pnpm/arrify@1.0.1/node_modules/arrify/index.js":["d91a789bdf6d6e7ea9014b0b1bacfef0d7621f47",37088,37760],"/project/sequence.js/node_modules/.pnpm/kind-of@6.0.3/node_modules/kind-of/index.js":["7de61d4d1e16e0c9b04660b8904d9488727a5d02",37760,39152],"/project/sequence.js/node_modules/.pnpm/yargs-parser@18.1.3/node_modules/yargs-parser/index.js":["ace83036108f3a4eb87218d76219768fee3520ed",39152,41760],"/project/sequence.js/node_modules/.pnpm/camelcase@5.3.1/node_modules/camelcase/index.js":["1d930d28c959c4323750d39d13464d7321c98058",41760,42536],"/project/sequence.js/node_modules/.pnpm/decamelize@1.2.0/node_modules/decamelize/index.js":["b2b327355fce3e54d2a2c542beb41ae803c33285",42536,43216],"/project/sequence.js/node_modules/.pnpm/yargs-parser@18.1.3/node_modules/yargs-parser/lib/tokenize-arg-string.js":["d6ba12849ef19788b046e6c733d39dc89ecca903",43216,43912],"/project/sequence.js/node_modules/.pnpm/camelcase-keys@6.2.2/node_modules/camelcase-keys/index.js":["5a26b7fde6dad796f3bd7397e7791eac3ab87aaf",43912,45152],"/project/sequence.js/node_modules/.pnpm/map-obj@4.3.0/node_modules/map-obj/index.js":["ac674b6338e4f5478f897777dfa0426f7ef08372",45152,46200],"/project/sequence.js/node_modules/.pnpm/quick-lru@4.0.1/node_modules/quick-lru/index.js":["e3a201d5356b92357346467daabe90da2e16a7db",46200,48056],"/project/sequence.js/node_modules/.pnpm/decamelize-keys@1.1.1/node_modules/decamelize-keys/index.js":["f14f033c88b7ad237428f9adfb5b0529f7ae1e64",48056,48904],"/project/sequence.js/node_modules/.pnpm/map-obj@1.0.1/node_modules/map-obj/index.js":["fa95683437abe12eed3217e281bddf5f4938d72b",48904,49576],"/project/sequence.js/node_modules/.pnpm/trim-newlines@3.0.1/node_modules/trim-newlines/index.js":["33ad59bfabca72daaaac5ce86b9a1b3a86ff862b",49576,50520],"/project/sequence.js/node_modules/.pnpm/redent@3.0.0/node_modules/redent/index.js":["d4bc13cc14753873aaaa2b18b42dac80e01a01b3",50520,51368],"/project/sequence.js/node_modules/.pnpm/strip-indent@3.0.0/node_modules/strip-indent/index.js":["354e99b30d73ccc0488c92c9b47a76d602a1a430",51368,52144],"/project/sequence.js/node_modules/.pnpm/min-indent@1.0.1/node_modules/min-indent/index.js":["37d5dc3ecc8998cb6d75b3783a762af9c1efff36",52144,52824],"/project/sequence.js/node_modules/.pnpm/indent-string@4.0.0/node_modules/indent-string/index.js":["9c4d9c2acd8fcff21a0b3be049caeb37e0db31bd",52824,53504],"/project/sequence.js/node_modules/.pnpm/read-pkg-up@7.0.1/node_modules/read-pkg-up/index.js":["df41751fdcc969bd93baf4c7d33321339af674d0",53504,54504],"/project/sequence.js/node_modules/.pnpm/find-up@4.1.0/node_modules/find-up/index.js":["94bdb702d37e75813308dfb1dd22d476b4505e46",54504,55672],"/project/sequence.js/node_modules/.pnpm/locate-path@5.0.0/node_modules/locate-path/index.js":["62506e005bad63217618acd7919ebb78fa2e210a",55672,57232],"/project/sequence.js/node_modules/.pnpm/p-locate@4.1.0/node_modules/p-locate/index.js":["dd5418f2eae9be067ba9b5041b19468c555b62fe",57232,58416],"/project/sequence.js/node_modules/.pnpm/p-limit@2.3.0/node_modules/p-limit/index.js":["a51ebba93599019f457cb181d15f65a823dd62ac",58416,59160],"/project/sequence.js/node_modules/.pnpm/p-try@2.2.0/node_modules/p-try/index.js":["885a5f2ed7229ecacb44d35396cd886fcec4e22a",59160,59816],"/project/sequence.js/node_modules/.pnpm/path-exists@4.0.0/node_modules/path-exists/index.js":["e67614299feaa6105ac0b8acff41fbad72d12215",59816,60832],"/project/sequence.js/node_modules/.pnpm/read-pkg@5.2.0/node_modules/read-pkg/index.js":["9036a71c8ec79c27e349e125db9cffc0c3ec08a3",60832,62032],"/project/sequence.js/node_modules/.pnpm/parse-json@5.2.0/node_modules/parse-json/index.js":["e858089e91151c1352634775bc2fdc50b3727f57",62032,63272],"/project/sequence.js/node_modules/.pnpm/error-ex@1.3.2/node_modules/error-ex/index.js":["2c9f804ca561680284eca33ab39c3de463428d9d",63272,64376],"/project/sequence.js/node_modules/.pnpm/is-arrayish@0.2.1/node_modules/is-arrayish/index.js":["6f9d636aff36876efe7d1cefbbdee98bfcc28c98",64376,65024],"/project/sequence.js/node_modules/.pnpm/json-parse-even-better-errors@2.3.1/node_modules/json-parse-even-better-errors/index.js":["d871279956a6953ab4aba74301e6e0dff6e5d0cf",65024,67120],"/project/sequence.js/node_modules/.pnpm/lines-and-columns@1.2.4/node_modules/lines-and-columns/build/index.js":["dfadef3f4dd9e0a529bd280d63072311d4003ae7",67120,68464],"/project/sequence.js/node_modules/.pnpm/@babel+code-frame@7.24.7/node_modules/@babel/code-frame/lib/index.js":["8f8903e03150fc590880556976c3e13bc778b741",68464,70472],"/project/sequence.js/node_modules/.pnpm/@babel+highlight@7.24.7/node_modules/@babel/highlight/lib/index.js":["5f222c37d8d679535861ff6eb8459fbebc371987",70472,73352],"/project/sequence.js/node_modules/.pnpm/js-tokens@4.0.0/node_modules/js-tokens/index.js":["0e440af0eefc12535ba7b998ca49db43f60bcda4",73352,74768],"/project/sequence.js/node_modules/.pnpm/@babel+helper-validator-identifier@7.24.7/node_modules/@babel/helper-validator-identifier/lib/index.js":["5813ad3628d945e124c7d95d0c68ba3a7243d270",74768,77312],"/project/sequence.js/node_modules/.pnpm/@babel+helper-validator-identifier@7.24.7/node_modules/@babel/helper-validator-identifier/lib/identifier.js":["cab8bd9b8c93b5cd09b51bdc0044debaaeff08b3",77312,88664],"/project/sequence.js/node_modules/.pnpm/@babel+helper-validator-identifier@7.24.7/node_modules/@babel/helper-validator-identifier/lib/keyword.js":["aaef241789a33ed11de7ca3608a030b92049763a",88664,91024],"/project/sequence.js/node_modules/.pnpm/picocolors@1.0.1/node_modules/picocolors/picocolors.js":["6ac3387abbd5230220acd0af2f617e74c57b243a",91024,92464],"/project/sequence.js/node_modules/.pnpm/hard-rejection@2.1.0/node_modules/hard-rejection/index.js":["fd2e90cbb49c0a3c0e0f70813f19994b587c2abe",92464,93256],"/project/sequence.js/node_modules/.pnpm/normalize-package-data@2.5.0/node_modules/normalize-package-data/lib/normalize.js":["e35e7e40659151ebe4d397135dfc7ae3e9aa8170",93256,94808],"/project/sequence.js/node_modules/.pnpm/normalize-package-data@2.5.0/node_modules/normalize-package-data/lib/fixer.js":["f7eebdfb540e7a39e1c006112140675045e2dfb0",94808,100184],"/project/sequence.js/node_modules/.pnpm/semver@5.7.2/node_modules/semver/semver.js":["4b85b5f963842409ab87e7714887d2d7cdd4c727",100184,114288],"/project/sequence.js/node_modules/.pnpm/validate-npm-package-license@3.0.4/node_modules/validate-npm-package-license/index.js":["f3b4c4411d93c2314997bcb06791fb22a39b0ce2",114288,115664],"/project/sequence.js/node_modules/.pnpm/spdx-expression-parse@3.0.1/node_modules/spdx-expression-parse/index.js":["7d9b17e093b4706955e0b8991ed0d48f5739a40f",115664,116488],"/project/sequence.js/node_modules/.pnpm/spdx-expression-parse@3.0.1/node_modules/spdx-expression-parse/scan.js":["6ce4f78704adba89f90f4420365a306cb1bbeee8",116488,117552],"/project/sequence.js/node_modules/.pnpm/spdx-expression-parse@3.0.1/node_modules/spdx-expression-parse/parse.js":["f86a533bd13ff24966957e11bdb506ee7a91dbaf",117552,118368],"/project/sequence.js/node_modules/.pnpm/spdx-correct@3.2.0/node_modules/spdx-correct/index.js":["bd8e631a674fd29f75548547da756954bb8253a7",118368,125976],"/project/sequence.js/node_modules/.pnpm/hosted-git-info@2.8.9/node_modules/hosted-git-info/index.js":["7d405138838d32a0444c13eb2a74beefb2a658b4",125976,127816],"/project/sequence.js/node_modules/.pnpm/hosted-git-info@2.8.9/node_modules/hosted-git-info/git-host-info.js":["f03c8e42c32672adb05b93be109daeb2585a6658",127816,132232],"/project/sequence.js/node_modules/.pnpm/hosted-git-info@2.8.9/node_modules/hosted-git-info/git-host.js":["1e81232714cc00492d5bb5a49e621d6b1d754dd4",132232,134872],"/project/sequence.js/node_modules/.pnpm/resolve@1.22.8/node_modules/resolve/index.js":["db23b5f633134f5f81380633d9b4666384e98591",134872,135680],"/project/sequence.js/node_modules/.pnpm/resolve@1.22.8/node_modules/resolve/lib/async.js":["5041f4330e1a476744145fb2469beeae1ac79d99",135680,138368],"/project/sequence.js/node_modules/.pnpm/resolve@1.22.8/node_modules/resolve/lib/homedir.js":["7c804908ed10d1aa264b880ea6e5c34b883f52ac",138368,139056],"/project/sequence.js/node_modules/.pnpm/resolve@1.22.8/node_modules/resolve/lib/caller.js":["a57f670bf054692c44ba92d17dd78274eda5d73b",139056,139760],"/project/sequence.js/node_modules/.pnpm/resolve@1.22.8/node_modules/resolve/lib/node-modules-paths.js":["9b3f1ddafeccbfacdbf36d84b1cb8d36ac631ed2",139760,140744],"/project/sequence.js/node_modules/.pnpm/resolve@1.22.8/node_modules/resolve/lib/normalize-options.js":["7e53322b0515bdbb435ab7e9623a7f5014ab2883",140744,141432],"/project/sequence.js/node_modules/.pnpm/is-core-module@2.15.0/node_modules/is-core-module/index.js":["8be68d231ccea32f9d3f5a7a2120864147079829",141432,142496],"/project/sequence.js/node_modules/.pnpm/hasown@2.0.2/node_modules/hasown/index.js":["668857f7a7f36a0f7b80c8b6992b543819ce3a82",142496,143232],"/project/sequence.js/node_modules/.pnpm/function-bind@1.1.2/node_modules/function-bind/index.js":["f761bc101bf315e6124f737d1691aaa77e507253",143232,143888],"/project/sequence.js/node_modules/.pnpm/function-bind@1.1.2/node_modules/function-bind/implementation.js":["42321136a108882e353520fff3411fbfcb798b5b",143888,145088],"/project/sequence.js/node_modules/.pnpm/resolve@1.22.8/node_modules/resolve/lib/core.js":["4f76a34a44fc8a71f77bc442edea6048f7f03cde",145088,145904],"/project/sequence.js/node_modules/.pnpm/resolve@1.22.8/node_modules/resolve/lib/is-core.js":["4d6318c847f3bc91dd1b0f647bfb98d5958d81aa",145904,146640],"/project/sequence.js/node_modules/.pnpm/resolve@1.22.8/node_modules/resolve/lib/sync.js":["f9aafa50a2ea04a14e085f1698ad17295cef2619",146640,148768],"/project/sequence.js/node_modules/.pnpm/normalize-package-data@2.5.0/node_modules/normalize-package-data/lib/extract_description.js":["1461754e50fbc41a07c9901c0134dd0fcd5d23c5",148768,149472],"/project/sequence.js/node_modules/.pnpm/normalize-package-data@2.5.0/node_modules/normalize-package-data/lib/make_warning.js":["9ab5d64a118d79b9aff4fe138d1357a1642c7d1c",149472,150400],"/project/sequence.js/node_modules/.pnpm/enquirer@2.4.1/node_modules/enquirer/index.js":["d12024026266df904fee11fb9f81da0d9e538ead",150400,153632],"/project/sequence.js/node_modules/.pnpm/enquirer@2.4.1/node_modules/enquirer/lib/utils.js":["c7ba15889c419cc86f9e8bd5713aeb7c10a6a779",153632,157960],"/project/sequence.js/node_modules/.pnpm/ansi-colors@4.1.3/node_modules/ansi-colors/index.js":["64b9e2dd7033a9c659dcbf02316ae560157e9f3c",157960,159024],"/project/sequence.js/node_modules/.pnpm/ansi-colors@4.1.3/node_modules/ansi-colors/symbols.js":["47c2659ee9c473f4453bc9ed9a715c06f790520d",159024,162120],"/project/sequence.js/node_modules/.pnpm/enquirer@2.4.1/node_modules/enquirer/lib/prompts/index.js":["07b26cee45ce2905f6031ecdbbe1ca34819e6284",162120,164408],"/project/sequence.js/node_modules/.pnpm/p-limit@3.1.0/node_modules/p-limit/index.js":["f4e1896d228ab6e93828fc6b0af02b151e100464",164408,165136],"/project/sequence.js/node_modules/.pnpm/yocto-queue@0.1.0/node_modules/yocto-queue/index.js":["ec0be6ffda71356067a94dd911e42b1ae0fd1db9",165136,166928],"/project/sequence.js/node_modules/.pnpm/dataloader@2.2.2/node_modules/dataloader/index.js":["89b95844305a89d1c23e9067a2709b2a9ef0991f",166928,169104],"/project/sequence.js/node_modules/.pnpm/chalk@4.1.2/node_modules/chalk/source/index.js":["8c580aa7500d9969056a236df949fefc3db41905",169104,173640],"/project/sequence.js/node_modules/.pnpm/ansi-styles@4.3.0/node_modules/ansi-styles/index.js":["5f96df8b074e4854c03db87ef309eb6c741f4618",173640,175096],"/project/sequence.js/node_modules/.pnpm/supports-color@7.2.0/node_modules/supports-color/index.js":["3773691818b7b49ed40595e91be318a3a98d7795",175096,177008],"/project/sequence.js/node_modules/.pnpm/has-flag@4.0.0/node_modules/has-flag/index.js":["74ec980a20fb60d8774b46096a70b7ab9246d743",177008,177680],"/project/sequence.js/node_modules/.pnpm/chalk@4.1.2/node_modules/chalk/source/util.js":["4cb1e8afae9bc10f49a678034e835399ab9c0bcd",177680,178472],"/project/sequence.js/node_modules/.pnpm/fast-glob@3.3.2/node_modules/fast-glob/out/index.js":["e459e2a093427ef6b495bf02eccd044848688322",178472,181296],"/project/sequence.js/node_modules/.pnpm/fast-glob@3.3.2/node_modules/fast-glob/out/managers/tasks.js":["bcc3b169966c3e7ece6bf4b54745016b214fa448",181296,182920],"/project/sequence.js/node_modules/.pnpm/fast-glob@3.3.2/node_modules/fast-glob/out/utils/index.js":["752a08e3c614cbc9ecbb1b79c75780efea89f946",182920,184072],"/project/sequence.js/node_modules/.pnpm/fast-glob@3.3.2/node_modules/fast-glob/out/utils/array.js":["c2a902949583d0f9f812600271cde83086d8c7e7",184072,184912],"/project/sequence.js/node_modules/.pnpm/fast-glob@3.3.2/node_modules/fast-glob/out/utils/errno.js":["265f68611c7a5e7ac568213260b2faf0f69464bc",184912,185680],"/project/sequence.js/node_modules/.pnpm/fast-glob@3.3.2/node_modules/fast-glob/out/utils/fs.js":["fde03242c8fbced0e1fffde9176db3248e76c9c7",185680,186752],"/project/sequence.js/node_modules/.pnpm/fast-glob@3.3.2/node_modules/fast-glob/out/utils/path.js":["95a433bd9329f461bb6323ef1b3712bf54f131df",186752,188928],"/project/sequence.js/node_modules/.pnpm/fast-glob@3.3.2/node_modules/fast-glob/out/utils/pattern.js":["52d53793ea40d1ba27e85c1edc26815836dd436c",188928,192888],"/project/sequence.js/node_modules/.pnpm/glob-parent@5.1.2/node_modules/glob-parent/index.js":["adc400be934bd3d9b969c3accac4bb34a566d723",192888,194232],"/project/sequence.js/node_modules/.pnpm/is-glob@4.0.3/node_modules/is-glob/index.js":["9d88806c840a6ff6661e8b62a2e4ecef20ac1bc1",194232,195216],"/project/sequence.js/node_modules/.pnpm/is-extglob@2.1.1/node_modules/is-extglob/index.js":["c9ca9e3ebf4c37b326c24dc95fb9e6983b3dc1fd",195216,195864],"/project/sequence.js/node_modules/.pnpm/micromatch@4.0.7/node_modules/micromatch/index.js":["ee8a80b6774f0ca72a8109fff9eab9fedb457918",195864,198480],"/project/sequence.js/node_modules/.pnpm/braces@3.0.3/node_modules/braces/index.js":["16c230770b5d4e51d6e73d9e72d593e76cc09521",198480,199920],"/project/sequence.js/node_modules/.pnpm/braces@3.0.3/node_modules/braces/lib/stringify.js":["4b3d950417ae2f39a7487e583e85f529236ef422",199920,200680],"/project/sequence.js/node_modules/.pnpm/braces@3.0.3/node_modules/braces/lib/utils.js":["335ac09154d707fd39d341ddaffa377c47124261",200680,202296],"/project/sequence.js/node_modules/.pnpm/braces@3.0.3/node_modules/braces/lib/compile.js":["c0c55adea947384d778a24f4f08283d506aac1eb",202296,203088],"/project/sequence.js/node_modules/.pnpm/fill-range@7.1.1/node_modules/fill-range/index.js":["f90521fa85611e26457ceaf685f459a993381d1e",203088,205296],"/project/sequence.js/node_modules/.pnpm/to-regex-range@5.0.1/node_modules/to-regex-range/index.js":["b522adef7fd77cfdda9929f8773fc7d635439dcb",205296,207336],"/project/sequence.js/node_modules/.pnpm/is-number@7.0.0/node_modules/is-number/index.js":["1ec86d46940af464d8385e8d06a6ea34956cc757",207336,208008],"/project/sequence.js/node_modules/.pnpm/braces@3.0.3/node_modules/braces/lib/expand.js":["1ba7f6969f32a48741ae584d3a6e7b1fe98a0b63",208008,208952],"/project/sequence.js/node_modules/.pnpm/braces@3.0.3/node_modules/braces/lib/parse.js":["550e4c01b40e2a9b6bcbfbfb4ecc2fc660a1147f",208952,210576],"/project/sequence.js/node_modules/.pnpm/braces@3.0.3/node_modules/braces/lib/constants.js":["421df8cc8911fd1bc575cce481980b22e8d6b4f2",210576,212768],"/project/sequence.js/node_modules/.pnpm/picomatch@2.3.1/node_modules/picomatch/index.js":["e318b5985ff7d918da503a0e9aefb106a72c963b",212768,213376],"/project/sequence.js/node_modules/.pnpm/picomatch@2.3.1/node_modules/picomatch/lib/picomatch.js":["f45463f2c399358b722530b870722abb104b5091",213376,215352],"/project/sequence.js/node_modules/.pnpm/picomatch@2.3.1/node_modules/picomatch/lib/scan.js":["b706e51f6ce0d3cd2be9f6351547c1dfcc6f3520",215352,217136],"/project/sequence.js/node_modules/.pnpm/picomatch@2.3.1/node_modules/picomatch/lib/utils.js":["a38e121509c23f130931e3df7e3fdba25ae5dc39",217136,219488],"/project/sequence.js/node_modules/.pnpm/picomatch@2.3.1/node_modules/picomatch/lib/constants.js":["fe77299a32f26e8f1c63ac2a07614f4ed7261590",219488,225336],"/project/sequence.js/node_modules/.pnpm/picomatch@2.3.1/node_modules/picomatch/lib/parse.js":["b470522cc3965d7bab5ed135e1d1b4567da5489f",225336,226776],"/project/sequence.js/node_modules/.pnpm/fast-glob@3.3.2/node_modules/fast-glob/out/utils/stream.js":["83ed77291806827d1bdb16227833311083a5da09",226776,227672],"/project/sequence.js/node_modules/.pnpm/merge2@1.4.1/node_modules/merge2/index.js":["ad80c35745c87c842494078cfa8da55cae9d1201",227672,228680],"/project/sequence.js/node_modules/.pnpm/fast-glob@3.3.2/node_modules/fast-glob/out/utils/string.js":["21f718c2bbef24ca3602de2cb9b1f5c5080dbcfd",228680,229512],"/project/sequence.js/node_modules/.pnpm/fast-glob@3.3.2/node_modules/fast-glob/out/providers/async.js":["540f1475cf17095a5590b87f623b4e7efc24cb00",229512,230792],"/project/sequence.js/node_modules/.pnpm/fast-glob@3.3.2/node_modules/fast-glob/out/readers/async.js":["a63fed54c57c8dea0aa270a756daa7f24a625082",230792,232128],"/project/sequence.js/node_modules/.pnpm/@nodelib+fs.walk@1.2.8/node_modules/@nodelib/fs.walk/out/index.js":["9a7b966c96d03e673ca4885659549a3686af2a3d",232128,233536],"/project/sequence.js/node_modules/.pnpm/@nodelib+fs.walk@1.2.8/node_modules/@nodelib/fs.walk/out/providers/async.js":["ca32b381c4bc54aea5a25767bc02ac66b49f977b",233536,234872],"/project/sequence.js/node_modules/.pnpm/@nodelib+fs.walk@1.2.8/node_modules/@nodelib/fs.walk/out/readers/async.js":["febbb01e24817ccb351997edf2888e7cf9e5656d",234872,237184],"/project/sequence.js/node_modules/.pnpm/@nodelib+fs.scandir@2.1.5/node_modules/@nodelib/fs.scandir/out/index.js":["71d2b5d9e9abd1d47d1e54b5c30815d3dd16b760",237184,238400],"/project/sequence.js/node_modules/.pnpm/@nodelib+fs.scandir@2.1.5/node_modules/@nodelib/fs.scandir/out/providers/async.js":["f9ba13340d69804ead7f16041ca7886e58f11b52",238400,240032],"/project/sequence.js/node_modules/.pnpm/@nodelib+fs.stat@2.0.5/node_modules/@nodelib/fs.stat/out/index.js":["048bb47c8f91cfd03154635590113a5e77aa5d56",240032,241240],"/project/sequence.js/node_modules/.pnpm/@nodelib+fs.stat@2.0.5/node_modules/@nodelib/fs.stat/out/providers/async.js":["69cbbe90cba363ba429223faa83438e1ec56ff71",241240,242200],"/project/sequence.js/node_modules/.pnpm/@nodelib+fs.stat@2.0.5/node_modules/@nodelib/fs.stat/out/providers/sync.js":["9ab973411ddd81c618800061019951e6b7d8dc76",242200,242968],"/project/sequence.js/node_modules/.pnpm/@nodelib+fs.stat@2.0.5/node_modules/@nodelib/fs.stat/out/settings.js":["b48a6628dc2be47a2701a2fbfced76e60f9fe413",242968,244120],"/project/sequence.js/node_modules/.pnpm/@nodelib+fs.stat@2.0.5/node_modules/@nodelib/fs.stat/out/adapters/fs.js":["fb2ccdc3491b88733ed6e8f3c1571efac4bf2922",244120,245208],"/project/sequence.js/node_modules/.pnpm/run-parallel@1.2.0/node_modules/run-parallel/index.js":["9e68d778658beb112f789fc35d3ea91122cb1c3d",245208,246088],"/project/sequence.js/node_modules/.pnpm/queue-microtask@1.2.3/node_modules/queue-microtask/index.js":["8f6d501ff6a7e34f852b3e9f04cc7cb16821baff",246088,246944],"/project/sequence.js/node_modules/.pnpm/@nodelib+fs.scandir@2.1.5/node_modules/@nodelib/fs.scandir/out/constants.js":["d62034ef78787932d063a3e5e7f807bfb68ed480",246944,248136],"/project/sequence.js/node_modules/.pnpm/@nodelib+fs.scandir@2.1.5/node_modules/@nodelib/fs.scandir/out/utils/index.js":["cf075300b99854c1007854f6a2832a47315faac7",248136,248880],"/project/sequence.js/node_modules/.pnpm/@nodelib+fs.scandir@2.1.5/node_modules/@nodelib/fs.scandir/out/utils/fs.js":["fde03242c8fbced0e1fffde9176db3248e76c9c7",248880,249976],"/project/sequence.js/node_modules/.pnpm/@nodelib+fs.scandir@2.1.5/node_modules/@nodelib/fs.scandir/out/providers/common.js":["f2fb9050a1cd10db8f4ceefae11c4e5495974d90",249976,250760],"/project/sequence.js/node_modules/.pnpm/@nodelib+fs.scandir@2.1.5/node_modules/@nodelib/fs.scandir/out/providers/sync.js":["fb31af2eb7ad22baffed26e90052b5ba3920aa20",250760,252040],"/project/sequence.js/node_modules/.pnpm/@nodelib+fs.scandir@2.1.5/node_modules/@nodelib/fs.scandir/out/settings.js":["e3045ee354afbe74ad821238dc41619daef57dc7",252040,253328],"/project/sequence.js/node_modules/.pnpm/@nodelib+fs.scandir@2.1.5/node_modules/@nodelib/fs.scandir/out/adapters/fs.js":["6cabb8bce0417d8cc98e1f5f770298927896331b",253328,254504],"/project/sequence.js/node_modules/.pnpm/fastq@1.17.1/node_modules/fastq/queue.js":["0e3aa14b503d0c504d2bb1384d2cbfc7a5dfaf40",254504,255880],"/project/sequence.js/node_modules/.pnpm/reusify@1.0.4/node_modules/reusify/reusify.js":["253f9c72d80869e32a2f49bc1b458dbaf453bb84",255880,256560],"/project/sequence.js/node_modules/.pnpm/@nodelib+fs.walk@1.2.8/node_modules/@nodelib/fs.walk/out/readers/common.js":["85a38c3201a80b4dd04a63cc44de7f7e4fdd62b5",256560,257632],"/project/sequence.js/node_modules/.pnpm/@nodelib+fs.walk@1.2.8/node_modules/@nodelib/fs.walk/out/readers/reader.js":["5430f71fe5a493cceeba149498a96837af343c5b",257632,258688],"/project/sequence.js/node_modules/.pnpm/@nodelib+fs.walk@1.2.8/node_modules/@nodelib/fs.walk/out/providers/stream.js":["26f2b34c349013452c47b069062d0621a93317d7",258688,259920],"/project/sequence.js/node_modules/.pnpm/@nodelib+fs.walk@1.2.8/node_modules/@nodelib/fs.walk/out/providers/sync.js":["302b2038047a50fba013ae099d123c374b91100f",259920,261080],"/project/sequence.js/node_modules/.pnpm/@nodelib+fs.walk@1.2.8/node_modules/@nodelib/fs.walk/out/readers/sync.js":["7062a53bb5549ff8246065cff5b58e3097fd2c2e",261080,262896],"/project/sequence.js/node_modules/.pnpm/@nodelib+fs.walk@1.2.8/node_modules/@nodelib/fs.walk/out/settings.js":["d71706774d784235174fcc85a1dd889df9f29f43",262896,264112],"/project/sequence.js/node_modules/.pnpm/fast-glob@3.3.2/node_modules/fast-glob/out/readers/reader.js":["fb048d626e8d852a631a12e4fb2ab03a74b9fa8f",264112,265568],"/project/sequence.js/node_modules/.pnpm/fast-glob@3.3.2/node_modules/fast-glob/out/readers/stream.js":["ffce4582bc9f79455950a7b9db8094ed69bd3d97",265568,267160],"/project/sequence.js/node_modules/.pnpm/fast-glob@3.3.2/node_modules/fast-glob/out/providers/provider.js":["e15e416490d6d4ccf4db4eb0bf841a19c9015166",267160,268792],"/project/sequence.js/node_modules/.pnpm/fast-glob@3.3.2/node_modules/fast-glob/out/providers/filters/deep.js":["c2545d906765459ab10d8617935ad32ef14b1564",268792,270816],"/project/sequence.js/node_modules/.pnpm/fast-glob@3.3.2/node_modules/fast-glob/out/providers/matchers/partial.js":["277c888be29835cf26d3f3f3959bf2b9d754fa2c",270816,271936],"/project/sequence.js/node_modules/.pnpm/fast-glob@3.3.2/node_modules/fast-glob/out/providers/matchers/matcher.js":["85b823e0a7460cacaee1b40fec036df06ca2c325",271936,273288],"/project/sequence.js/node_modules/.pnpm/fast-glob@3.3.2/node_modules/fast-glob/out/providers/filters/entry.js":["7186a847bc5bcacfae9bc54e1032a1be4c73eb7f",273288,275128],"/project/sequence.js/node_modules/.pnpm/fast-glob@3.3.2/node_modules/fast-glob/out/providers/filters/error.js":["aafc75d8e19c67e324aaa3038648476d91d78fca",275128,276376],"/project/sequence.js/node_modules/.pnpm/fast-glob@3.3.2/node_modules/fast-glob/out/providers/transformers/entry.js":["f22d8cfaf9fa87dc75f3ac0d6f6a9c228436af5d",276376,277632],"/project/sequence.js/node_modules/.pnpm/fast-glob@3.3.2/node_modules/fast-glob/out/providers/stream.js":["92fdbe24b22a3c5e0df8ee784c8b57daef062501",277632,278984],"/project/sequence.js/node_modules/.pnpm/fast-glob@3.3.2/node_modules/fast-glob/out/providers/sync.js":["0b0718406005523d486497e1d3fa41a048d4b7d3",278984,280264],"/project/sequence.js/node_modules/.pnpm/fast-glob@3.3.2/node_modules/fast-glob/out/readers/sync.js":["0267cf7fe5e9a3c15f87400f5ef46a59baa42cb8",280264,281776],"/project/sequence.js/node_modules/.pnpm/fast-glob@3.3.2/node_modules/fast-glob/out/settings.js":["ba6870a40cacb77f648125f1ec379224546891c1",281776,283504],"/project/sequence.js/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/index.js":["b7111abcfec63f3c14d78fa1ab083daadb2a70d0",283504,284776],"/project/sequence.js/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/fs/index.js":["5362fe9fd2c8d632b37b2602ded1a0926a273f6b",284776,287088],"/project/sequence.js/node_modules/.pnpm/universalify@2.0.1/node_modules/universalify/index.js":["b89986d9f8a85f0ed20f038ad79a69fcb68a8288",287088,287952],"/project/sequence.js/node_modules/.pnpm/graceful-fs@4.2.11/node_modules/graceful-fs/graceful-fs.js":["55efc5a24c26495d0341c7884f0de5eb36520efa",287952,291936],"/project/sequence.js/node_modules/.pnpm/graceful-fs@4.2.11/node_modules/graceful-fs/polyfills.js":["38f3028ea7d9ec6b57f56ef32128499522c87a7f",291936,294064],"/project/sequence.js/node_modules/.pnpm/graceful-fs@4.2.11/node_modules/graceful-fs/legacy-streams.js":["f4a3583d4c3e8b0c407ab8406bdafb02b4055b7f",294064,294872],"/project/sequence.js/node_modules/.pnpm/graceful-fs@4.2.11/node_modules/graceful-fs/clone.js":["c912f366fe0025ea74e0e76e58277147dc0a3167",294872,295640],"/project/sequence.js/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/copy-sync/index.js":["3cf1fca7a7d2c1aba4a508a38e31c344d7255108",295640,296320],"/project/sequence.js/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/copy-sync/copy-sync.js":["3577d8fb71b1143769781f886e5e91a28458591c",296320,298760],"/project/sequence.js/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/mkdirs/index.js":["b0d9fcf6032f19505d113a6ea1ba769600751f28",298760,299792],"/project/sequence.js/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/mkdirs/make-dir.js":["66271453d9f0bdaadba03b78c7c95a862c52e970",299792,301224],"/project/sequence.js/node_modules/.pnpm/at-least-node@1.0.0/node_modules/at-least-node/index.js":["9c002b0e9446eff8a384d0a4b1c3494bb49a1e1f",301224,301904],"/project/sequence.js/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/util/utimes.js":["dad744f8edf8218685028574c168f77f9f1d75a8",301904,302768],"/project/sequence.js/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/util/stat.js":["38d324d1535d3303f3eb12af0eccb268194d267e",302768,304640],"/project/sequence.js/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/copy/index.js":["f685df7a46989c967bf917a5632a587298e22e40",304640,305392],"/project/sequence.js/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/copy/copy.js":["7715091e1e3173e3f5375092f035992cba09b39e",305392,308216],"/project/sequence.js/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/path-exists/index.js":["6e6491c1ab3389433d1b39a33b3ac8760649a2c8",308216,309160],"/project/sequence.js/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/empty/index.js":["72cfa757c416b468768d363ece8e71b66527577e",309160,310432],"/project/sequence.js/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/remove/index.js":["43a7630664db987ce37fc634b7474b6b9428ab4e",310432,311248],"/project/sequence.js/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/remove/rimraf.js":["9aaf8a271693de5fad3f942d7ca303e10be07c40",311248,313000],"/project/sequence.js/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/ensure/index.js":["68e93d6534353e9665f5d954de79edb27297b68f",313000,314264],"/project/sequence.js/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/ensure/file.js":["80c2a847a193ab5a9732746b6f5953cb50593f33",314264,315384],"/project/sequence.js/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/ensure/link.js":["87a056a34d6f9e0afcc150c235c6b972afc8cf7f",315384,316592],"/project/sequence.js/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/ensure/symlink.js":["dfc14c66722e60dc6879221877aecf9481d96b91",316592,318144],"/project/sequence.js/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/ensure/symlink-paths.js":["50fbb32d40b697a96fde72b07259933a9a72411a",318144,319160],"/project/sequence.js/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/ensure/symlink-type.js":["60686b2062037afe9661f006a43e124441409353",319160,320032],"/project/sequence.js/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/json/index.js":["047cedb67b8047183dfded82b56969c688dc5008",320032,321248],"/project/sequence.js/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/json/jsonfile.js":["6631d5dab8ea65a104dd9113357b4f0a2ada6fcc",321248,322176],"/project/sequence.js/node_modules/.pnpm/jsonfile@6.1.0/node_modules/jsonfile/index.js":["91c9c57af8bd81ee9a62a5b25797ea32883c15b0",322176,323648],"/project/sequence.js/node_modules/.pnpm/jsonfile@6.1.0/node_modules/jsonfile/utils.js":["9fcb3c2e8d7b909360c945cd568cc32fe7cf4596",323648,324408],"/project/sequence.js/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/json/output-json.js":["7a5ab88d3e20934904d7bffb20995b852442c0bb",324408,325264],"/project/sequence.js/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/output/index.js":["1b0879db53a00bbfeddcfdc0c190901387bab7bd",325264,326432],"/project/sequence.js/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/json/output-json-sync.js":["2f46f4bf9814aea91b0f6763c5d0f07e0ea9de05",326432,327296],"/project/sequence.js/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/move-sync/index.js":["ac40f3d0062886869329d8c31810935ad7c34ff5",327296,327976],"/project/sequence.js/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/move-sync/move-sync.js":["a391900c2c6e74e81d81c4414d9ef2bea7dd8ad9",327976,329352],"/project/sequence.js/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/move/index.js":["482e376c2d37368c3c202905b93429f3d46c9914",329352,330104],"/project/sequence.js/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/move/move.js":["5f4c2db7135a3cfc04d9711474173fa4fb606c6a",330104,331544],"/project/sequence.js/node_modules/.pnpm/@babel+runtime@7.25.0/node_modules/@babel/runtime/helpers/objectSpread2.js":["f47c3a639c64b919d1099838ce6bd488211fd0a0",331544,332480],"/project/sequence.js/node_modules/.pnpm/@babel+runtime@7.25.0/node_modules/@babel/runtime/helpers/defineProperty.js":["1033ba95ff4616a295e4f849b2b7a34b931ae33f",332480,333320],"/project/sequence.js/node_modules/.pnpm/@babel+runtime@7.25.0/node_modules/@babel/runtime/helpers/toPropertyKey.js":["a2413a0eef7b66a7d1da8caa67567dfc3ba042b0",333320,334240],"/project/sequence.js/node_modules/.pnpm/@babel+runtime@7.25.0/node_modules/@babel/runtime/helpers/typeof.js":["ea88e31e0d68da436c784278c7b42f3ba928f5d7",334240,335064],"/project/sequence.js/node_modules/.pnpm/@babel+runtime@7.25.0/node_modules/@babel/runtime/helpers/toPrimitive.js":["002a87e71e7536e0c7f85c3bf97498ba4b956cdc",335064,335888],"/project/sequence.js/node_modules/.pnpm/detect-indent@6.1.0/node_modules/detect-indent/index.js":["a1c18640e5fee89596e01848e6e06f45cd34a884",335888,337216],"/project/sequence.js/node_modules/.pnpm/normalize-path@3.0.0/node_modules/normalize-path/index.js":["7af46f52994266092fb6890723ef7e1b059d1d20",337216,337904],"/project/sequence.js/node_modules/.pnpm/parse-glob@3.0.4/node_modules/parse-glob/index.js":["80de4342abc02723990d3849ef8f5710a3bfc2a0",337904,339296],"/project/sequence.js/node_modules/.pnpm/is-glob@2.0.1/node_modules/is-glob/index.js":["b3dcfb08edc51fa11b2f6a028e432f7f81c67ca8",339296,340024],"/project/sequence.js/node_modules/.pnpm/is-extglob@1.0.0/node_modules/is-extglob/index.js":["f2caa8e7efa77712cf91d0f349830dc563f1c9fa",340024,340672],"/project/sequence.js/node_modules/.pnpm/glob-base@0.3.0/node_modules/glob-base/index.js":["2f15588ede319f3f78ecb5b8be65c80f8c1570cf",340672,341568],"/project/sequence.js/node_modules/.pnpm/glob-parent@6.0.2/node_modules/glob-parent/index.js":["b59c2ce1188362fdc692963d4b287b2f3d79f90f",341568,342888],"/project/sequence.js/node_modules/.pnpm/is-dotfile@1.0.3/node_modules/is-dotfile/index.js":["01bfbcba70e3ab9c171f1053cdf5a833221fc990",342888,343568],"/project/sequence.js/node_modules/.pnpm/zod@3.23.8/node_modules/zod/lib/index.js":["e38dd5a234ca8c66d1a751b65a97806e7f54f247",343568,345640],"/project/sequence.js/node_modules/.pnpm/zod@3.23.8/node_modules/zod/lib/external.js":["f242d6d87258054f8b05e805f089ed43342608e3",345640,347440],"/project/sequence.js/node_modules/.pnpm/zod@3.23.8/node_modules/zod/lib/errors.js":["d4b049d999fe64a12780c2b7cfb11ce599044c8b",347440,348528],"/project/sequence.js/node_modules/.pnpm/zod@3.23.8/node_modules/zod/lib/locales/en.js":["060c7208a1d1040484e5710467a1f6e89d0a6524",348528,349424],"/project/sequence.js/node_modules/.pnpm/zod@3.23.8/node_modules/zod/lib/helpers/util.js":["ce2fae02571c61f6db07908470ae58060d8ea65a",349424,352576],"/project/sequence.js/node_modules/.pnpm/zod@3.23.8/node_modules/zod/lib/ZodError.js":["0ea1242578863570620d771906985661d97db604",352576,355352],"/project/sequence.js/node_modules/.pnpm/zod@3.23.8/node_modules/zod/lib/helpers/parseUtil.js":["764a5b48d07d7288bdaab33628d4eaa59af14d2f",355352,358080],"/project/sequence.js/node_modules/.pnpm/zod@3.23.8/node_modules/zod/lib/helpers/typeAliases.js":["b66edae489b6e4147ce7e1ec65a107e297219771",358080,358728],"/project/sequence.js/node_modules/.pnpm/zod@3.23.8/node_modules/zod/lib/types.js":["6820bcddccd12fecf7dbf4071c3bc96890b90efd",358728,403600],"/project/sequence.js/node_modules/.pnpm/zod@3.23.8/node_modules/zod/lib/helpers/errorUtil.js":["5dd3884a3b2637d4dac94d46dbd9342b99cb953d",403600,404696],"/project/sequence.js/node_modules/.pnpm/npm-packlist@2.2.2/node_modules/npm-packlist/index.js":["d123f52a824837376e369e3aec7507647a184883",404696,408624],"/project/sequence.js/node_modules/.pnpm/npm-bundled@1.1.2/node_modules/npm-bundled/index.js":["88712a69de7c4e83aa2d9430dc2214dfd10be5c0",408624,411936],"/project/sequence.js/node_modules/.pnpm/npm-normalize-package-bin@1.0.1/node_modules/npm-normalize-package-bin/index.js":["936296ddebc6348bed8f93e0063aa9b81e594a50",411936,413096],"/project/sequence.js/node_modules/.pnpm/ignore-walk@3.0.4/node_modules/ignore-walk/index.js":["44909c6d209ab59cd7a00c297c8f907baccb841f",413096,416352],"/project/sequence.js/node_modules/.pnpm/minimatch@3.1.2/node_modules/minimatch/minimatch.js":["f21a6b3c6d1d71bb65e4e6e0af1bf1baba3a207e",416352,420736],"/project/sequence.js/node_modules/.pnpm/brace-expansion@1.1.11/node_modules/brace-expansion/index.js":["a2f937621d39c20ce582f697c3e4273d1e14b2e0",420736,422784],"/project/sequence.js/node_modules/.pnpm/concat-map@0.0.1/node_modules/concat-map/index.js":["a3063f014cc693b320dbd64de3243a79247c1e05",422784,423568],"/project/sequence.js/node_modules/.pnpm/balanced-match@1.0.2/node_modules/balanced-match/index.js":["12161cfaa33be93568ec9a6fd3d9c357991a6a76",423568,424408],"/project/sequence.js/node_modules/.pnpm/glob@7.2.3/node_modules/glob/glob.js":["7b624669f35601648f8300b45c3b3861bd9c7ef6",424408,429480],"/project/sequence.js/node_modules/.pnpm/fs.realpath@1.0.0/node_modules/fs.realpath/index.js":["9b5cdf4ef79264959ed0a23e4c35efbe6d64b0df",429480,430944],"/project/sequence.js/node_modules/.pnpm/fs.realpath@1.0.0/node_modules/fs.realpath/old.js":["d2d656e98e4d0735902068408824f8d08aaea84c",430944,432792],"/project/sequence.js/node_modules/.pnpm/inherits@2.0.4/node_modules/inherits/inherits.js":["222da288a07d8f65b2aed9b88815948cfe0b42d9",432792,433576],"/project/sequence.js/node_modules/.pnpm/path-is-absolute@1.0.1/node_modules/path-is-absolute/index.js":["6de38a82f68960de2bd07fd9114541f02bee2f62",433576,434400],"/project/sequence.js/node_modules/.pnpm/glob@7.2.3/node_modules/glob/sync.js":["82b1c855e4bfca820ecbed219649cd174b0c2f62",434400,437480],"/project/sequence.js/node_modules/.pnpm/glob@7.2.3/node_modules/glob/common.js":["4890b7b6c34bc659a38802851951da90baad085d",437480,439232],"/project/sequence.js/node_modules/.pnpm/inflight@1.0.6/node_modules/inflight/inflight.js":["84aed0b47c15de35a85a5aa6c641342ba4dd5a88",439232,440264],"/project/sequence.js/node_modules/.pnpm/wrappy@1.0.2/node_modules/wrappy/wrappy.js":["7d5c1c908664b3df4a9b72400a126652ba0dd905",440264,440992],"/project/sequence.js/node_modules/.pnpm/once@1.4.0/node_modules/once/once.js":["f78c8cb8d754261b59d03e867f329c2ffdefae45",440992,441976],"/project/sequence.js/node_modules/.pnpm/fast-deep-equal@2.0.1/node_modules/fast-deep-equal/index.js":["7544a59317225a41d7c3b02605e87459a251ea54",441976,442832],"/project/sequence.js/node_modules/.pnpm/resolve-from@5.0.0/node_modules/resolve-from/index.js":["12204537847d8c5d27e3dbeb024c2def138bb3ae",442832,443880],"/project/sequence.js/node_modules/.pnpm/rollup@2.79.1/node_modules/rollup/dist/rollup.js":["528be32fbed11ca77d2ddc3fa5a4b83153c1a6f4",443880,445104],"/project/sequence.js/node_modules/.pnpm/rollup@2.79.1/node_modules/rollup/dist/shared/rollup.js":["1b070c5ac10253c28c8b66a3b89713db723a347e",445104,741848],"/project/sequence.js/node_modules/.pnpm/@rollup+plugin-node-resolve@11.2.1_rollup@2.79.1/node_modules/@rollup/plugin-node-resolve/dist/cjs/index.js":["4c7176cdf5a30cd0a7d1266fae5deac3a0b55858",741848,748488],"/project/sequence.js/node_modules/.pnpm/builtin-modules@3.3.0/node_modules/builtin-modules/index.js":["78b46fe2850f2a721658e7ee0494e2ac9967d969",748488,749528],"/project/sequence.js/node_modules/.pnpm/deepmerge@4.3.1/node_modules/deepmerge/dist/cjs.js":["30a374f658500f10d214d0c1b0aab81773cb6582",749528,751720],"/project/sequence.js/node_modules/.pnpm/is-module@1.0.0/node_modules/is-module/index.js":["eea7f2fb1af6df299384691d877d0cfd20060e1a",751720,752784],"/project/sequence.js/node_modules/.pnpm/@rollup+pluginutils@3.1.0_rollup@2.79.1/node_modules/@rollup/pluginutils/dist/cjs/index.js":["3f1a4e804542765b8ed26ef9c84451ad737a0e46",752784,758000],"/project/sequence.js/node_modules/.pnpm/@rollup+plugin-alias@3.1.9_rollup@2.79.1/node_modules/@rollup/plugin-alias/dist/index.js":["03c72c8b0000a9ae55e2629c7d348df1ec55d116",758000,758984],"/project/sequence.js/node_modules/.pnpm/@rollup+plugin-commonjs@15.1.0_rollup@2.79.1/node_modules/@rollup/plugin-commonjs/dist/index.js":["daa1dd2236b14ac67f24c4cac4d7ac04396b4fee",758984,771680],"/project/sequence.js/node_modules/.pnpm/commondir@1.0.1/node_modules/commondir/index.js":["62f48e7310292100f457fd315c1eaeabfb741a72",771680,772448],"/project/sequence.js/node_modules/.pnpm/estree-walker@2.0.2/node_modules/estree-walker/dist/umd/estree-walker.js":["12880a2841f321975ae59f2789d482753951bd1d",772448,775088],"/project/sequence.js/node_modules/.pnpm/magic-string@0.25.9/node_modules/magic-string/dist/magic-string.cjs.js":["f50cbc79c4a1f869984025ed5328e2da919fb6ba",775088,783208],"/project/sequence.js/node_modules/.pnpm/sourcemap-codec@1.4.8/node_modules/sourcemap-codec/dist/sourcemap-codec.umd.js":["dfa9b54ce6838473151cd191a4904db99063bcce",783208,784408],"/project/sequence.js/node_modules/.pnpm/is-reference@1.2.1/node_modules/is-reference/dist/is-reference.js":["568fec88af0aeead7c9719447c3968e506d4672b",784408,785672],"/project/sequence.js/node_modules/.pnpm/@rollup+plugin-replace@2.4.2_rollup@2.79.1/node_modules/@rollup/plugin-replace/dist/rollup-plugin-replace.cjs.js":["604d14be2deb4b6497cb252240415fac3753ec33",785672,787176],"/project/sequence.js/node_modules/.pnpm/magic-string@0.30.11/node_modules/magic-string/dist/magic-string.cjs.js":["a1b82214ad58aa225c3d8372a563a70c6df1753b",787176,797160],"/project/sequence.js/node_modules/.pnpm/@jridgewell+sourcemap-codec@1.5.0/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.umd.js":["f8c6b12bc867c6c3b76c14cd7bdab4e9c509048b",797160,801576],"/project/sequence.js/node_modules/.pnpm/@rollup+plugin-json@4.1.0_rollup@2.79.1/node_modules/@rollup/plugin-json/dist/index.js":["3adfd5d9369691483a6c1ef2087de488f2462a52",801576,802416],"/project/sequence.js/node_modules/.pnpm/jest-worker@26.6.2/node_modules/jest-worker/build/index.js":["69de41b40fe0bcb567f075c46d5c9e6221e71bbb",802416,804760],"/project/sequence.js/node_modules/.pnpm/jest-worker@26.6.2/node_modules/jest-worker/build/Farm.js":["5984ef8e7cd217ce38501bda08d5631a7e5a1d74",804760,806568],"/project/sequence.js/node_modules/.pnpm/jest-worker@26.6.2/node_modules/jest-worker/build/types.js":["6ac3d2e94b3e62de1635e2962750f77fbafc997f",806568,807664],"/project/sequence.js/node_modules/.pnpm/jest-worker@26.6.2/node_modules/jest-worker/build/WorkerPool.js":["5db5da39a2f1711c5bc5e13217a23a68d5b06860",807664,809080],"/project/sequence.js/node_modules/.pnpm/jest-worker@26.6.2/node_modules/jest-worker/build/base/BaseWorkerPool.js":["f17a88f0a0756a0e478bb4d1050f056c268639b5",809080,811496],"/project/sequence.js/node_modules/.pnpm/jest-worker@26.6.2/node_modules/jest-worker/build/workers/messageParent.js":["af373cbfef8bc3a2960cfdfcf21b056f591b75c8",811496,812512],"/project/sequence.js/node_modules/.pnpm/ci-info@3.9.0/node_modules/ci-info/index.js":["306147110a81e4d70b7952dedf1e7f2721b72866",812512,814096],"/project/sequence.js/node_modules/.pnpm/quick-lru@5.1.1/node_modules/quick-lru/index.js":["94a42747caa09e0af0d52f35c6ba68c78b9a6018",814096,815952],"/project/sequence.js/node_modules/.pnpm/semver@7.6.3/node_modules/semver/index.js":["c01f38060f8c1eea0a62ee127afc3a7601029818",815952,820192],"/project/sequence.js/node_modules/.pnpm/semver@7.6.3/node_modules/semver/internal/re.js":["4847405c77f0465eb4baebe1385b155e72b57f6a",820192,827392],"/project/sequence.js/node_modules/.pnpm/semver@7.6.3/node_modules/semver/internal/constants.js":["819a733e61b6014ca6feeb6a570304612afe2b52",827392,828624],"/project/sequence.js/node_modules/.pnpm/semver@7.6.3/node_modules/semver/internal/debug.js":["d6166e7a8eda16340619cb02ee09c19a422b8333",828624,829536],"/project/sequence.js/node_modules/.pnpm/semver@7.6.3/node_modules/semver/classes/semver.js":["209950c633d84021324a834a14dbcbf0fb3202f4",829536,831624],"/project/sequence.js/node_modules/.pnpm/semver@7.6.3/node_modules/semver/internal/parse-options.js":["19a8ad4d2c32f4386402bd9eb235df80c73a8f75",831624,832480],"/project/sequence.js/node_modules/.pnpm/semver@7.6.3/node_modules/semver/internal/identifiers.js":["510c174c5bfc993023542e3b4f699cd18e2e0559",832480,833352],"/project/sequence.js/node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/parse.js":["1bfe17569d11f23f9a539340cee18bba0e3f4f0a",833352,834096],"/project/sequence.js/node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/valid.js":["edc5b800b8f302ac7ce238a419a02810cdeed8f2",834096,834824],"/project/sequence.js/node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/clean.js":["92466e73dbb620c7b0c58b16e8d39a6d0ff22bc5",834824,835552],"/project/sequence.js/node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/inc.js":["5814d4948ca724f91f2b61213c011bf8034f112f",835552,836296],"/project/sequence.js/node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/diff.js":["a52f6ea79cf0224fda0d44968159b8dc13e36d7c",836296,837032],"/project/sequence.js/node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/major.js":["5e2668d635ca6c7bde9bc1b7f763f26674e83c11",837032,837776],"/project/sequence.js/node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/minor.js":["4bc0bc3ec293449f5fea1cbcfe976c8d2a26cce5",837776,838520],"/project/sequence.js/node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/patch.js":["a78ef0c69e82d2a7b1f4f697e620aef6ad1de458",838520,839264],"/project/sequence.js/node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/prerelease.js":["40a72fe55e64efcc0a5c6b859a0378ab030837db",839264,840000],"/project/sequence.js/node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/compare.js":["33ec903e117ba1fe05cddedb86a9601d94e193a7",840000,840728],"/project/sequence.js/node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/rcompare.js":["51f8192667aa9e1320e7fe0616b583039e8042c0",840728,841448],"/project/sequence.js/node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/compare-loose.js":["1c581d61f0ab057af7fed4ad01c66d0998d1aa03",841448,842184],"/project/sequence.js/node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/compare-build.js":["97ac51143c3f5c2255ba09c0ec0f952a2aecd8d1",842184,842944],"/project/sequence.js/node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/sort.js":["b7fc2bc365d5f6f9e2ad842441755e7b8b19de5c",842944,843688],"/project/sequence.js/node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/rsort.js":["1e99dcf8aa9518558b2a6945302273ac7b8d69bc",843688,844432],"/project/sequence.js/node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/gt.js":["d5e2d5e6294e56ee0a42e92e3a89d8cf294cb833",844432,845144],"/project/sequence.js/node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/lt.js":["fad43ee11cd4b18e2fbaf50593ae540f27365a87",845144,845856],"/project/sequence.js/node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/eq.js":["498639a97e5682386b94c24096f133db4fd163d0",845856,846568],"/project/sequence.js/node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/neq.js":["dfa93428b2368cff5aefd91d812bed067cb31ad6",846568,847288],"/project/sequence.js/node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/gte.js":["b9c50a385c8e3877108a001fb8548b122a155193",847288,848008],"/project/sequence.js/node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/lte.js":["bd1875ed01c16e0bf753352e775cfc3d993cc228",848008,848728],"/project/sequence.js/node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/cmp.js":["50a23a530aac08f1545e15bf6441bf031282789e",848728,849792],"/project/sequence.js/node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/coerce.js":["c64737eb38e2f78a361af16155116dc84c2af368",849792,850728],"/project/sequence.js/node_modules/.pnpm/semver@7.6.3/node_modules/semver/classes/comparator.js":["bbb95e311cc51af3911406848972f6cc50761d8f",850728,852712],"/project/sequence.js/node_modules/.pnpm/semver@7.6.3/node_modules/semver/classes/range.js":["49ea81742058369f806770d7d1b1a73192f0ca75",852712,856504],"/project/sequence.js/node_modules/.pnpm/semver@7.6.3/node_modules/semver/internal/lrucache.js":["26ae88faff2fd3ef9fbda59267979c98a1fea511",856504,857648],"/project/sequence.js/node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/satisfies.js":["47a3e3141433768a2ca6a03841c842d15cf419c2",857648,858392],"/project/sequence.js/node_modules/.pnpm/semver@7.6.3/node_modules/semver/ranges/to-comparators.js":["4d609454b2e81450d85be8f56109af8ba6b61b92",858392,859144],"/project/sequence.js/node_modules/.pnpm/semver@7.6.3/node_modules/semver/ranges/max-satisfying.js":["4dcef246781158eef12758041375d1bce437a383",859144,859976],"/project/sequence.js/node_modules/.pnpm/semver@7.6.3/node_modules/semver/ranges/min-satisfying.js":["2155aea4b92343159e1b803f878a47297ca9aa66",859976,860808],"/project/sequence.js/node_modules/.pnpm/semver@7.6.3/node_modules/semver/ranges/min-version.js":["04dab32f676a52ee4c81f440eb1b5d6c7511afa5",860808,861712],"/project/sequence.js/node_modules/.pnpm/semver@7.6.3/node_modules/semver/ranges/valid.js":["7a1c6afbe83e28264a384b43ab8f6765f7649114",861712,862448],"/project/sequence.js/node_modules/.pnpm/semver@7.6.3/node_modules/semver/ranges/outside.js":["c6f8b84ebd967e5479159e2f876f3ba27530eb97",862448,863808],"/project/sequence.js/node_modules/.pnpm/semver@7.6.3/node_modules/semver/ranges/gtr.js":["4f69fb02e28923fe7126531d80862dc85bf94c19",863808,864536],"/project/sequence.js/node_modules/.pnpm/semver@7.6.3/node_modules/semver/ranges/ltr.js":["d4948b6f660390895f8ac0cfe4cad97bc1f15190",864536,865248],"/project/sequence.js/node_modules/.pnpm/semver@7.6.3/node_modules/semver/ranges/intersects.js":["3763224a30a86582b56a4cdf1ebaa97b5038e1c8",865248,865992],"/project/sequence.js/node_modules/.pnpm/semver@7.6.3/node_modules/semver/ranges/simplify.js":["bc651999d477c5698289adcd2ed8773cf7a2da11",865992,866848],"/project/sequence.js/node_modules/.pnpm/semver@7.6.3/node_modules/semver/ranges/subset.js":["94dce217bb98598dad72f194de19c5e2f3246d7b",866848,868384],"/project/sequence.js/node_modules/.pnpm/ms@2.1.3/node_modules/ms/index.js":["ea869663486f513cc4d1ca8312ed52a165c417fa",868384,869520],"/project/sequence.js/node_modules/.pnpm/@babel+helpers@7.25.0/node_modules/@babel/helpers/lib/index.js":["357f5f097a45815db5a715e876269d5bfabd7dac",869520,871352],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/index.js":["b4a694814012bf73e5e969685037c929ba16bfe1",871352,892992],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/validators/react/isReactComponent.js":["95f5d5dc4b45810514357c0380914dc58241ba24",892992,893848],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/validators/buildMatchMemberExpression.js":["e5d43e99dde5f498e5a3a92e71f2e952b501aac3",893848,894792],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/validators/matchesPattern.js":["8454cf4b6cbd50a08bbc3c1de9ab5c16de493b00",894792,895680],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/validators/generated/index.js":["5397377964d899fec62d8c34ffefadcf2fc440db",895680,926856],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/utils/shallowEqual.js":["10edc2f8f2dc3288ac96e3945e4ec1c0488f6487",926856,927640],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/utils/deprecationWarning.js":["afa3da502a334e2761cdd333fd39352dc94fc835",927640,928640],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/validators/react/isCompatTag.js":["ff2f399e3c4be990b0da48d9bcba447ac6d461a2",928640,929440],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/builders/react/buildChildren.js":["9d4954881254318ce49c25a46c0e273cc92ed501",929440,930488],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/utils/react/cleanJSXElementLiteralChild.js":["6144987d113b19878587b0e55dbc45742bc61377",930488,931520],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/builders/generated/index.js":["09d118993950e33889672839e3812c3efd3524e0",931520,961360],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/builders/validateNode.js":["9f3d5f96da42cbf270e2324816aa2715fa7b8859",961360,962344],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/validators/validate.js":["23bcdbb590e36bbf25fc5cddd90dd95806ca36e6",962344,963408],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/definitions/index.js":["75473cc26234f822479cf98daa1deb187f85bf7e",963408,967408],"/project/sequence.js/node_modules/.pnpm/to-fast-properties@2.0.0/node_modules/to-fast-properties/index.js":["6308ff82e9bca6a67e7aa25111f0105f1fee89fc",967408,968224],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/definitions/core.js":["0c388d4068048171798d941e2e7fb357320b05ff",968224,1020112],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/validators/is.js":["ca3a7002a5b3266c519975795feb3df111781548",1020112,1021232],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/validators/isType.js":["c35549269452b8a2efed8d388de69e86d02446ad",1021232,1022096],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/validators/isPlaceholderType.js":["29b3523f38b94f9a08d792cc9719bac32db78d27",1022096,1023000],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/validators/isValidIdentifier.js":["2b54d4a54bd63122fc8ce0a01eb531972c85eebc",1023000,1023944],"/project/sequence.js/node_modules/.pnpm/@babel+helper-string-parser@7.24.8/node_modules/@babel/helper-string-parser/lib/index.js":["3208fae30d742f71f09711bad362b9f09c5a79a6",1023944,1026144],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/constants/index.js":["49f82c5373bcdc59fc1fe32267648bc6c5d9b0c2",1026144,1030376],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/definitions/utils.js":["94640118c885a5ce4b4172f1de7970677860a744",1030376,1034072],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/definitions/flow.js":["616514b741caeea6bb56cdcc38754dd10c9d1d72",1034072,1053376],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/definitions/jsx.js":["75150a8a7b5f295714f618445a43b5be5134b3df",1053376,1058928],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/definitions/misc.js":["81f57e1e1fb15e0918d7a46502025a4ab0d1f9d4",1058928,1060504],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/definitions/placeholders.js":["b2e696e21aeae96071880f487af8883f6e8be92d",1060504,1062232],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/definitions/experimental.js":["d79101cd151187ddfd0dd80c38f777759d01ae5d",1062232,1067752],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/definitions/typescript.js":["79cde51962b6d573285de195a91c6954d794ae8b",1067752,1086864],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/definitions/deprecated-aliases.js":["f29794e441858c3e2f2b1085aecb4c756d77d711",1086864,1087744],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/asserts/assertNode.js":["f1638bb583fe74ab8bb9a1bc6f454b491a348274",1087744,1088624],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/validators/isNode.js":["17f73842d38e0825ffa9f577e40f179503ee031b",1088624,1089488],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/asserts/generated/index.js":["148205bd999ad2039159ece59f6c8ac33a33606a",1089488,1122048],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/builders/flow/createTypeAnnotationBasedOnTypeof.js":["8769a998687162bc7550dcfe98a9e81f2d74a459",1122048,1123008],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/builders/flow/createFlowUnionType.js":["3c7a20f8b066ef7f858dcf14d6afcf1698ee141c",1123008,1124048],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/modifications/flow/removeTypeDuplicates.js":["f70e4d934e2b3b696ef00b1e34fee8ff252458e6",1124048,1125072],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/builders/typescript/createTSUnionType.js":["ac99b6bbdb3ee5879edb6ba5dbb012f987ef690b",1125072,1126216],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/modifications/typescript/removeTypeDuplicates.js":["54976f3b36b1e7db28188129aa2098282846f807",1126216,1127248],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/builders/generated/uppercase.js":["01146dc1a091c09905f4d4bd51bd9befcfc6013b",1127248,1183224],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/builders/productions.js":["5bf863371b472963ae72c1e64ac1b8630367ac2b",1183224,1184112],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/clone/cloneNode.js":["f15454de0a71e53a1e42faa07ef39ba7f8747f67",1184112,1185616],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/clone/clone.js":["00c128835dc3ef60c50001bc0e1372f29b797cd4",1185616,1186472],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/clone/cloneDeep.js":["0edb67fa97425f2d4079c8c64e097d0ddd5eb0cc",1186472,1187344],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/clone/cloneDeepWithoutLoc.js":["e7719f2ecf0c0657c5b6068c09af3c3bf0592068",1187344,1188248],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/clone/cloneWithoutLoc.js":["f63ebfbdab6d34badb74fd376c38f5cc8930423c",1188248,1189136],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/comments/addComment.js":["16f2d359874230847f36cb97742de44472f84594",1189136,1190016],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/comments/addComments.js":["c62e5ffd8cb9350cf9bc0589ca476d009ac85f9a",1190016,1190808],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/comments/inheritInnerComments.js":["d040738ed2802ba9d61a8394fe6c9ee65d734a76",1190808,1191720],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/utils/inherit.js":["5896fd13c8a775e0155b7185805c9727329f6730",1191720,1192488],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/comments/inheritLeadingComments.js":["f87077b689c318c639537f4c42698ed278e4f829",1192488,1193400],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/comments/inheritsComments.js":["42f6cbab43c95c7d831a62a991f7ae449cd9b5d8",1193400,1194528],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/comments/inheritTrailingComments.js":["5bd6c9b811fbe4893a2fbef744b7374e2c1e84c7",1194528,1195440],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/comments/removeComments.js":["a6564e4d0b4893afb3d965c187c6ee3c9990ee77",1195440,1196328],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/constants/generated/index.js":["150c5b7b3b23479f3e251f6341bd26ee2c70b185",1196328,1201792],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/converters/ensureBlock.js":["9546e15b033129e9d14e953a1e431f1f9bf88824",1201792,1202672],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/converters/toBlock.js":["e42f617eb9a3d06d9e088fa1e41225b663c2bff9",1202672,1203640],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/converters/toBindingIdentifierName.js":["26959a098e207bbb2842e79e7bccdbabe8323408",1203640,1204560],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/converters/toIdentifier.js":["bb776190e90daa84973bc9941adcdd8193bd1e5e",1204560,1205632],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/converters/toComputedKey.js":["9eecc51376934654679e0386cd244a8dda5f0baf",1205632,1206624],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/converters/toExpression.js":["c6891bc3f4882d86e3e6dbff896c85ce44923cb4",1206624,1207528],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/converters/toKeyAlias.js":["5fbdc0ac8dc95b5eabec0be50d71e6c0865ce35c",1207528,1208792],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/modifications/removePropertiesDeep.js":["23860ef1d6c45e8f71b8228a1f377668e8c96f1b",1208792,1209824],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/traverse/traverseFast.js":["67af8be359598f6a3aafc7637358f7046033aeca",1209824,1210720],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/modifications/removeProperties.js":["73107880504998df7f8c5b3bd7a278383e84c8bc",1210720,1211960],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/converters/toStatement.js":["574ede0cdc26b05072b0646e7d66221fa1da6558",1211960,1212960],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/converters/valueToNode.js":["8b5b35bc076f64bd9672753d23da7ec67b106fd8",1212960,1214288],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/modifications/appendToMemberExpression.js":["27439fd3e557f640b2f818d7361fc0c12f46cb43",1214288,1215216],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/modifications/inherits.js":["746ddefd49e0fbafb0f53d49ac490d9e5a67eccf",1215216,1216200],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/modifications/prependToMemberExpression.js":["5a713459848abc5691a7b9f14ad0112175c90ae5",1216200,1217216],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/retrievers/getAssignmentIdentifiers.js":["56001c75c4a7d7d9734e6f5410d5feef3c61a3c0",1217216,1218032],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/retrievers/getBindingIdentifiers.js":["09124ac3269656d268bb5bb4745670c8961541ff",1218032,1221448],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/retrievers/getOuterBindingIdentifiers.js":["d0c30354a56b626a2a1533a68dd36f03d75f35d1",1221448,1222424],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/retrievers/getFunctionName.js":["0fb9488c606146a2e06e65a956f17c5ed503955b",1222424,1223496],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/traverse/traverse.js":["7992ab182de5d6e2635aa63d27e20ae6119fd085",1223496,1224440],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/validators/isBinding.js":["4184b924d4bf2122e4d64d4661db34225e6ce581",1224440,1225352],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/validators/isBlockScoped.js":["551efbe73814fbdf9b09af1a6dbd9edab8ca12c9",1225352,1226320],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/validators/isLet.js":["3a0c0986cdca1871a5c5ed9260abcc71f3622c6d",1226320,1227272],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/validators/isImmutable.js":["87ce8fd906f5fe6fea21757f3b96e2dbf10d45b9",1227272,1228240],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/validators/isNodesEquivalent.js":["8de1678d5fea7521128e49da8471adb7ac189ad8",1228240,1229152],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/validators/isReferenced.js":["8759a5583bcae62a90768a3418d106c78e08f2fe",1229152,1229944],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/validators/isScope.js":["db0b7d08fe2f223e5bb846f2713a608d9c4d3204",1229944,1230808],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/validators/isSpecifierDefault.js":["8c8652248a736fc000db5f45ec1d1a0570acb952",1230808,1231720],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/validators/isValidES3Identifier.js":["49d11809665072371ec9b0d5fe83f5214001eb6f",1231720,1233200],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/validators/isVar.js":["a8ac19b347058fbb51e9c0b9b35a838cd9c6ef14",1233200,1234152],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/converters/toSequenceExpression.js":["9384f95b71f9748d64908bdc9b4b675c12d14104",1234152,1235096],"/project/sequence.js/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/converters/gatherSequenceExpressions.js":["ba5ecf63baf8dfbe57529a29490ad381b7c8625b",1235096,1236424],"/project/sequence.js/node_modules/.pnpm/@babel+helpers@7.25.0/node_modules/@babel/helpers/lib/helpers-generated.js":["bdfe68621914607bd09d0c2a3dc4e7a2d74a3b9f",1236424,1350008],"/project/sequence.js/node_modules/.pnpm/@babel+template@7.25.0/node_modules/@babel/template/lib/index.js":["9a3926ea29ec8d546e723aa8a1353306e0bd0ad5",1350008,1351328],"/project/sequence.js/node_modules/.pnpm/@babel+template@7.25.0/node_modules/@babel/template/lib/formatters.js":["f9b9d9a37cbf61be7616b0656d92b8b79fa52b1f",1351328,1353448],"/project/sequence.js/node_modules/.pnpm/@babel+template@7.25.0/node_modules/@babel/template/lib/builder.js":["f23864c5185e593ed3929af741bf8a1ee43b4603",1353448,1354712],"/project/sequence.js/node_modules/.pnpm/@babel+template@7.25.0/node_modules/@babel/template/lib/options.js":["a2154aa8b4523eac2c1c71ebfcba32308afcd31f",1354712,1355976],"/project/sequence.js/node_modules/.pnpm/@babel+template@7.25.0/node_modules/@babel/template/lib/string.js":["d4bd2d379e5c5247bb0e825aa911836b07a7ad72",1355976,1357000],"/project/sequence.js/node_modules/.pnpm/@babel+template@7.25.0/node_modules/@babel/template/lib/parse.js":["1a725f4ba5a1fe7a4fcd95195b3d01be192b747d",1357000,1358904],"/project/sequence.js/node_modules/.pnpm/@babel+parser@7.25.3/node_modules/@babel/parser/lib/index.js":["d150d62841d0f12e7f4b42f5291013c9b1ebde79",1358904,1501792],"/project/sequence.js/node_modules/.pnpm/@babel+template@7.25.0/node_modules/@babel/template/lib/populate.js":["77692699c5cb74c059e0c9c786e2ffb59a68f434",1501792,1503200],"/project/sequence.js/node_modules/.pnpm/@babel+template@7.25.0/node_modules/@babel/template/lib/literal.js":["9f9a7059025c507617ea6303f9106ee2e53ddcb9",1503200,1504392],"/project/sequence.js/node_modules/.pnpm/@babel+generator@7.25.0/node_modules/@babel/generator/lib/index.js":["c98c5ea2b11bbdb4bccf13ff70509990fad9919f",1504392,1505784],"/project/sequence.js/node_modules/.pnpm/@babel+generator@7.25.0/node_modules/@babel/generator/lib/source-map.js":["5b5a15c3b2d5fec4b5c62457f3016e8aa33a46f0",1505784,1507336],"/project/sequence.js/node_modules/.pnpm/@jridgewell+gen-mapping@0.3.5/node_modules/@jridgewell/gen-mapping/dist/gen-mapping.umd.js":["f59a96193c4d0050b224b915ec09303a0b363013",1507336,1511344],"/project/sequence.js/node_modules/.pnpm/@jridgewell+set-array@1.2.1/node_modules/@jridgewell/set-array/dist/set-array.umd.js":["20be9f5c3d323c9aca346a00e62f8d7e4a1fefa0",1511344,1513408],"/project/sequence.js/node_modules/.pnpm/@jridgewell+trace-mapping@0.3.25/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.umd.js":["d14969c9417dabccd90411b4770dc55726dea41d",1513408,1519576],"/project/sequence.js/node_modules/.pnpm/@jridgewell+resolve-uri@3.1.2/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.umd.js":["3d56b7861cb317124e76dc7f2caac7d4c8cf3a86",1519576,1522248],"/project/sequence.js/node_modules/.pnpm/@babel+generator@7.25.0/node_modules/@babel/generator/lib/printer.js":["87b6083bdeb088244d146ec7094b137c7d19ff47",1522248,1529232],"/project/sequence.js/node_modules/.pnpm/@babel+generator@7.25.0/node_modules/@babel/generator/lib/buffer.js":["1e5f3acd7d2127345524d342f8aeecb542146a50",1529232,1532440],"/project/sequence.js/node_modules/.pnpm/@babel+generator@7.25.0/node_modules/@babel/generator/lib/node/index.js":["84c5abeb85944041673e6fa57c883a880e59e2d0",1532440,1534840],"/project/sequence.js/node_modules/.pnpm/@babel+generator@7.25.0/node_modules/@babel/generator/lib/node/whitespace.js":["6432f37adcbacc354300b84a879ef6e0e504341a",1534840,1538560],"/project/sequence.js/node_modules/.pnpm/@babel+generator@7.25.0/node_modules/@babel/generator/lib/node/parentheses.js":["616888cbcfd6f0e0b898aff092aae10647710d25",1538560,1544136],"/project/sequence.js/node_modules/.pnpm/@babel+generator@7.25.0/node_modules/@babel/generator/lib/generators/index.js":["19e79ce1eedfd872c35b815d444f6288c4050140",1544136,1547024],"/project/sequence.js/node_modules/.pnpm/@babel+generator@7.25.0/node_modules/@babel/generator/lib/generators/template-literals.js":["9069eae70537e6d8145bdcd443a7322a884edbcb",1547024,1548016],"/project/sequence.js/node_modules/.pnpm/@babel+generator@7.25.0/node_modules/@babel/generator/lib/generators/expressions.js":["7c7d6368f96052f5613036cd7504ffdb1fbc5c67",1548016,1551560],"/project/sequence.js/node_modules/.pnpm/@babel+generator@7.25.0/node_modules/@babel/generator/lib/generators/statements.js":["bba4e7700a33a7c482fb2de6620782ce25e03a34",1551560,1554504],"/project/sequence.js/node_modules/.pnpm/@babel+generator@7.25.0/node_modules/@babel/generator/lib/generators/classes.js":["95b2bae54b2cda46b6bcfcf2bfc9f455f045fcdd",1554504,1556208],"/project/sequence.js/node_modules/.pnpm/@babel+generator@7.25.0/node_modules/@babel/generator/lib/generators/methods.js":["6f0304fea2d5eaa3884b09293ee074a50e0ecd45",1556208,1557984],"/project/sequence.js/node_modules/.pnpm/@babel+generator@7.25.0/node_modules/@babel/generator/lib/generators/modules.js":["437038a7e68f202f78dd78b70156899cf75e6ff5",1557984,1560488],"/project/sequence.js/node_modules/.pnpm/@babel+generator@7.25.0/node_modules/@babel/generator/lib/generators/types.js":["09778cd4447014d0bb8f4d6053d455da8b990f3a",1560488,1563440],"/project/sequence.js/node_modules/.pnpm/jsesc@2.5.2/node_modules/jsesc/jsesc.js":["1ddb9ef6ced291147886096f09527cb1980a5572",1563440,1565640],"/project/sequence.js/node_modules/.pnpm/@babel+generator@7.25.0/node_modules/@babel/generator/lib/generators/flow.js":["5d7383206f35f019e6364dbd6930405141c3c74a",1565640,1573640],"/project/sequence.js/node_modules/.pnpm/@babel+generator@7.25.0/node_modules/@babel/generator/lib/generators/base.js":["51d18e9c693ca992d7d0a779deac61c493cb0e32",1573640,1575120],"/project/sequence.js/node_modules/.pnpm/@babel+generator@7.25.0/node_modules/@babel/generator/lib/generators/jsx.js":["85bf426cf47cadb0aebb50eb9f23b2c7e1b24d7c",1575120,1577248],"/project/sequence.js/node_modules/.pnpm/@babel+generator@7.25.0/node_modules/@babel/generator/lib/generators/typescript.js":["9a4ed7457f46c3c1159be1b9847355edbe87c70c",1577248,1584680]} \ No newline at end of file diff --git a/v8-compile-cache-0/x64/11.3.244.8-node.19/zSprojectzSworkspacezSnode_moduleszS.pnpmzS@preconstruct+cli@2.8.7zSnode_moduleszS@preconstructzSclizSbin.js.BLOB b/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 000000000..5e6ea312b Binary files /dev/null and b/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/v8-compile-cache-0/x64/11.3.244.8-node.19/zSprojectzSworkspacezSnode_moduleszS.pnpmzS@preconstruct+cli@2.8.7zSnode_moduleszS@preconstructzSclizSbin.js.MAP b/v8-compile-cache-0/x64/11.3.244.8-node.19/zSprojectzSworkspacezSnode_moduleszS.pnpmzS@preconstruct+cli@2.8.7zSnode_moduleszS@preconstructzSclizSbin.js.MAP new file mode 100644 index 000000000..1d99dbbed --- /dev/null +++ b/v8-compile-cache-0/x64/11.3.244.8-node.19/zSprojectzSworkspacezSnode_moduleszS.pnpmzS@preconstruct+cli@2.8.7zSnode_moduleszS@preconstructzSclizSbin.js.MAP @@ -0,0 +1 @@ +{"/project/workspace/node_modules/.pnpm/@preconstruct+cli@2.8.7/node_modules/@preconstruct/cli/cli/dist/preconstruct-cli-cli.cjs.js":["8315344ea3ec2213ef0e4aaa37b41d90c77999cb",0,32424],"/project/workspace/node_modules/.pnpm/meow@7.1.1/node_modules/meow/index.js":["4a866f54ed797369e8e33d78cc06f5834ee7b7be",32424,34544],"/project/workspace/node_modules/.pnpm/minimist-options@4.1.0/node_modules/minimist-options/index.js":["0f0bff7fe31e97f7ea78636b1aca17e841e5f8e3",34544,36360],"/project/workspace/node_modules/.pnpm/is-plain-obj@1.1.0/node_modules/is-plain-obj/index.js":["16523ba84e3229bcd98780b380a4f4e323b8bf8b",36360,37088],"/project/workspace/node_modules/.pnpm/arrify@1.0.1/node_modules/arrify/index.js":["d91a789bdf6d6e7ea9014b0b1bacfef0d7621f47",37088,37752],"/project/workspace/node_modules/.pnpm/kind-of@6.0.3/node_modules/kind-of/index.js":["7de61d4d1e16e0c9b04660b8904d9488727a5d02",37752,39144],"/project/workspace/node_modules/.pnpm/yargs-parser@18.1.3/node_modules/yargs-parser/index.js":["ace83036108f3a4eb87218d76219768fee3520ed",39144,41752],"/project/workspace/node_modules/.pnpm/camelcase@5.3.1/node_modules/camelcase/index.js":["1d930d28c959c4323750d39d13464d7321c98058",41752,42528],"/project/workspace/node_modules/.pnpm/decamelize@1.2.0/node_modules/decamelize/index.js":["b2b327355fce3e54d2a2c542beb41ae803c33285",42528,43200],"/project/workspace/node_modules/.pnpm/yargs-parser@18.1.3/node_modules/yargs-parser/lib/tokenize-arg-string.js":["d6ba12849ef19788b046e6c733d39dc89ecca903",43200,43896],"/project/workspace/node_modules/.pnpm/camelcase-keys@6.2.2/node_modules/camelcase-keys/index.js":["5a26b7fde6dad796f3bd7397e7791eac3ab87aaf",43896,45128],"/project/workspace/node_modules/.pnpm/map-obj@4.3.0/node_modules/map-obj/index.js":["ac674b6338e4f5478f897777dfa0426f7ef08372",45128,46176],"/project/workspace/node_modules/.pnpm/quick-lru@4.0.1/node_modules/quick-lru/index.js":["e3a201d5356b92357346467daabe90da2e16a7db",46176,48024],"/project/workspace/node_modules/.pnpm/decamelize-keys@1.1.1/node_modules/decamelize-keys/index.js":["f14f033c88b7ad237428f9adfb5b0529f7ae1e64",48024,48872],"/project/workspace/node_modules/.pnpm/map-obj@1.0.1/node_modules/map-obj/index.js":["fa95683437abe12eed3217e281bddf5f4938d72b",48872,49544],"/project/workspace/node_modules/.pnpm/trim-newlines@3.0.1/node_modules/trim-newlines/index.js":["33ad59bfabca72daaaac5ce86b9a1b3a86ff862b",49544,50488],"/project/workspace/node_modules/.pnpm/redent@3.0.0/node_modules/redent/index.js":["d4bc13cc14753873aaaa2b18b42dac80e01a01b3",50488,51328],"/project/workspace/node_modules/.pnpm/strip-indent@3.0.0/node_modules/strip-indent/index.js":["354e99b30d73ccc0488c92c9b47a76d602a1a430",51328,52104],"/project/workspace/node_modules/.pnpm/min-indent@1.0.1/node_modules/min-indent/index.js":["37d5dc3ecc8998cb6d75b3783a762af9c1efff36",52104,52776],"/project/workspace/node_modules/.pnpm/indent-string@4.0.0/node_modules/indent-string/index.js":["9c4d9c2acd8fcff21a0b3be049caeb37e0db31bd",52776,53456],"/project/workspace/node_modules/.pnpm/read-pkg-up@7.0.1/node_modules/read-pkg-up/index.js":["df41751fdcc969bd93baf4c7d33321339af674d0",53456,54456],"/project/workspace/node_modules/.pnpm/find-up@4.1.0/node_modules/find-up/index.js":["94bdb702d37e75813308dfb1dd22d476b4505e46",54456,55624],"/project/workspace/node_modules/.pnpm/locate-path@5.0.0/node_modules/locate-path/index.js":["62506e005bad63217618acd7919ebb78fa2e210a",55624,57184],"/project/workspace/node_modules/.pnpm/p-locate@4.1.0/node_modules/p-locate/index.js":["dd5418f2eae9be067ba9b5041b19468c555b62fe",57184,58368],"/project/workspace/node_modules/.pnpm/p-limit@2.3.0/node_modules/p-limit/index.js":["a51ebba93599019f457cb181d15f65a823dd62ac",58368,59112],"/project/workspace/node_modules/.pnpm/p-try@2.2.0/node_modules/p-try/index.js":["885a5f2ed7229ecacb44d35396cd886fcec4e22a",59112,59768],"/project/workspace/node_modules/.pnpm/path-exists@4.0.0/node_modules/path-exists/index.js":["e67614299feaa6105ac0b8acff41fbad72d12215",59768,60784],"/project/workspace/node_modules/.pnpm/read-pkg@5.2.0/node_modules/read-pkg/index.js":["9036a71c8ec79c27e349e125db9cffc0c3ec08a3",60784,61984],"/project/workspace/node_modules/.pnpm/parse-json@5.2.0/node_modules/parse-json/index.js":["e858089e91151c1352634775bc2fdc50b3727f57",61984,63216],"/project/workspace/node_modules/.pnpm/error-ex@1.3.2/node_modules/error-ex/index.js":["2c9f804ca561680284eca33ab39c3de463428d9d",63216,64320],"/project/workspace/node_modules/.pnpm/is-arrayish@0.2.1/node_modules/is-arrayish/index.js":["6f9d636aff36876efe7d1cefbbdee98bfcc28c98",64320,64968],"/project/workspace/node_modules/.pnpm/json-parse-even-better-errors@2.3.1/node_modules/json-parse-even-better-errors/index.js":["d871279956a6953ab4aba74301e6e0dff6e5d0cf",64968,67064],"/project/workspace/node_modules/.pnpm/lines-and-columns@1.2.4/node_modules/lines-and-columns/build/index.js":["dfadef3f4dd9e0a529bd280d63072311d4003ae7",67064,68408],"/project/workspace/node_modules/.pnpm/@babel+code-frame@7.24.7/node_modules/@babel/code-frame/lib/index.js":["8f8903e03150fc590880556976c3e13bc778b741",68408,70416],"/project/workspace/node_modules/.pnpm/@babel+highlight@7.24.7/node_modules/@babel/highlight/lib/index.js":["5f222c37d8d679535861ff6eb8459fbebc371987",70416,73288],"/project/workspace/node_modules/.pnpm/js-tokens@4.0.0/node_modules/js-tokens/index.js":["0e440af0eefc12535ba7b998ca49db43f60bcda4",73288,74704],"/project/workspace/node_modules/.pnpm/@babel+helper-validator-identifier@7.24.7/node_modules/@babel/helper-validator-identifier/lib/index.js":["5813ad3628d945e124c7d95d0c68ba3a7243d270",74704,77248],"/project/workspace/node_modules/.pnpm/@babel+helper-validator-identifier@7.24.7/node_modules/@babel/helper-validator-identifier/lib/identifier.js":["cab8bd9b8c93b5cd09b51bdc0044debaaeff08b3",77248,88600],"/project/workspace/node_modules/.pnpm/@babel+helper-validator-identifier@7.24.7/node_modules/@babel/helper-validator-identifier/lib/keyword.js":["aaef241789a33ed11de7ca3608a030b92049763a",88600,90960],"/project/workspace/node_modules/.pnpm/picocolors@1.0.1/node_modules/picocolors/picocolors.js":["6ac3387abbd5230220acd0af2f617e74c57b243a",90960,92400],"/project/workspace/node_modules/.pnpm/hard-rejection@2.1.0/node_modules/hard-rejection/index.js":["fd2e90cbb49c0a3c0e0f70813f19994b587c2abe",92400,93184],"/project/workspace/node_modules/.pnpm/normalize-package-data@2.5.0/node_modules/normalize-package-data/lib/normalize.js":["e35e7e40659151ebe4d397135dfc7ae3e9aa8170",93184,94728],"/project/workspace/node_modules/.pnpm/normalize-package-data@2.5.0/node_modules/normalize-package-data/lib/fixer.js":["f7eebdfb540e7a39e1c006112140675045e2dfb0",94728,100104],"/project/workspace/node_modules/.pnpm/semver@5.7.2/node_modules/semver/semver.js":["4b85b5f963842409ab87e7714887d2d7cdd4c727",100104,114200],"/project/workspace/node_modules/.pnpm/validate-npm-package-license@3.0.4/node_modules/validate-npm-package-license/index.js":["f3b4c4411d93c2314997bcb06791fb22a39b0ce2",114200,115576],"/project/workspace/node_modules/.pnpm/spdx-expression-parse@3.0.1/node_modules/spdx-expression-parse/index.js":["7d9b17e093b4706955e0b8991ed0d48f5739a40f",115576,116400],"/project/workspace/node_modules/.pnpm/spdx-expression-parse@3.0.1/node_modules/spdx-expression-parse/scan.js":["6ce4f78704adba89f90f4420365a306cb1bbeee8",116400,117464],"/project/workspace/node_modules/.pnpm/spdx-expression-parse@3.0.1/node_modules/spdx-expression-parse/parse.js":["f86a533bd13ff24966957e11bdb506ee7a91dbaf",117464,118280],"/project/workspace/node_modules/.pnpm/spdx-correct@3.2.0/node_modules/spdx-correct/index.js":["bd8e631a674fd29f75548547da756954bb8253a7",118280,125888],"/project/workspace/node_modules/.pnpm/hosted-git-info@2.8.9/node_modules/hosted-git-info/index.js":["7d405138838d32a0444c13eb2a74beefb2a658b4",125888,127728],"/project/workspace/node_modules/.pnpm/hosted-git-info@2.8.9/node_modules/hosted-git-info/git-host-info.js":["f03c8e42c32672adb05b93be109daeb2585a6658",127728,132144],"/project/workspace/node_modules/.pnpm/hosted-git-info@2.8.9/node_modules/hosted-git-info/git-host.js":["1e81232714cc00492d5bb5a49e621d6b1d754dd4",132144,134784],"/project/workspace/node_modules/.pnpm/resolve@1.22.8/node_modules/resolve/index.js":["db23b5f633134f5f81380633d9b4666384e98591",134784,135592],"/project/workspace/node_modules/.pnpm/resolve@1.22.8/node_modules/resolve/lib/async.js":["5041f4330e1a476744145fb2469beeae1ac79d99",135592,138280],"/project/workspace/node_modules/.pnpm/resolve@1.22.8/node_modules/resolve/lib/homedir.js":["7c804908ed10d1aa264b880ea6e5c34b883f52ac",138280,138960],"/project/workspace/node_modules/.pnpm/resolve@1.22.8/node_modules/resolve/lib/caller.js":["a57f670bf054692c44ba92d17dd78274eda5d73b",138960,139656],"/project/workspace/node_modules/.pnpm/resolve@1.22.8/node_modules/resolve/lib/node-modules-paths.js":["9b3f1ddafeccbfacdbf36d84b1cb8d36ac631ed2",139656,140640],"/project/workspace/node_modules/.pnpm/resolve@1.22.8/node_modules/resolve/lib/normalize-options.js":["7e53322b0515bdbb435ab7e9623a7f5014ab2883",140640,141328],"/project/workspace/node_modules/.pnpm/is-core-module@2.15.0/node_modules/is-core-module/index.js":["8be68d231ccea32f9d3f5a7a2120864147079829",141328,142384],"/project/workspace/node_modules/.pnpm/hasown@2.0.2/node_modules/hasown/index.js":["668857f7a7f36a0f7b80c8b6992b543819ce3a82",142384,143112],"/project/workspace/node_modules/.pnpm/function-bind@1.1.2/node_modules/function-bind/index.js":["f761bc101bf315e6124f737d1691aaa77e507253",143112,143768],"/project/workspace/node_modules/.pnpm/function-bind@1.1.2/node_modules/function-bind/implementation.js":["42321136a108882e353520fff3411fbfcb798b5b",143768,144968],"/project/workspace/node_modules/.pnpm/resolve@1.22.8/node_modules/resolve/lib/core.js":["4f76a34a44fc8a71f77bc442edea6048f7f03cde",144968,145784],"/project/workspace/node_modules/.pnpm/resolve@1.22.8/node_modules/resolve/lib/is-core.js":["4d6318c847f3bc91dd1b0f647bfb98d5958d81aa",145784,146512],"/project/workspace/node_modules/.pnpm/resolve@1.22.8/node_modules/resolve/lib/sync.js":["f9aafa50a2ea04a14e085f1698ad17295cef2619",146512,148640],"/project/workspace/node_modules/.pnpm/normalize-package-data@2.5.0/node_modules/normalize-package-data/lib/extract_description.js":["1461754e50fbc41a07c9901c0134dd0fcd5d23c5",148640,149344],"/project/workspace/node_modules/.pnpm/normalize-package-data@2.5.0/node_modules/normalize-package-data/lib/make_warning.js":["9ab5d64a118d79b9aff4fe138d1357a1642c7d1c",149344,150272],"/project/workspace/node_modules/.pnpm/enquirer@2.4.1/node_modules/enquirer/index.js":["d12024026266df904fee11fb9f81da0d9e538ead",150272,153504],"/project/workspace/node_modules/.pnpm/enquirer@2.4.1/node_modules/enquirer/lib/utils.js":["c7ba15889c419cc86f9e8bd5713aeb7c10a6a779",153504,157824],"/project/workspace/node_modules/.pnpm/ansi-colors@4.1.3/node_modules/ansi-colors/index.js":["64b9e2dd7033a9c659dcbf02316ae560157e9f3c",157824,158888],"/project/workspace/node_modules/.pnpm/ansi-colors@4.1.3/node_modules/ansi-colors/symbols.js":["47c2659ee9c473f4453bc9ed9a715c06f790520d",158888,161984],"/project/workspace/node_modules/.pnpm/enquirer@2.4.1/node_modules/enquirer/lib/prompts/index.js":["07b26cee45ce2905f6031ecdbbe1ca34819e6284",161984,164264],"/project/workspace/node_modules/.pnpm/p-limit@3.1.0/node_modules/p-limit/index.js":["f4e1896d228ab6e93828fc6b0af02b151e100464",164264,164992],"/project/workspace/node_modules/.pnpm/yocto-queue@0.1.0/node_modules/yocto-queue/index.js":["ec0be6ffda71356067a94dd911e42b1ae0fd1db9",164992,166776],"/project/workspace/node_modules/.pnpm/dataloader@2.2.2/node_modules/dataloader/index.js":["89b95844305a89d1c23e9067a2709b2a9ef0991f",166776,168944],"/project/workspace/node_modules/.pnpm/chalk@4.1.2/node_modules/chalk/source/index.js":["8c580aa7500d9969056a236df949fefc3db41905",168944,173480],"/project/workspace/node_modules/.pnpm/ansi-styles@4.3.0/node_modules/ansi-styles/index.js":["5f96df8b074e4854c03db87ef309eb6c741f4618",173480,174936],"/project/workspace/node_modules/.pnpm/supports-color@7.2.0/node_modules/supports-color/index.js":["3773691818b7b49ed40595e91be318a3a98d7795",174936,176840],"/project/workspace/node_modules/.pnpm/has-flag@4.0.0/node_modules/has-flag/index.js":["74ec980a20fb60d8774b46096a70b7ab9246d743",176840,177512],"/project/workspace/node_modules/.pnpm/chalk@4.1.2/node_modules/chalk/source/util.js":["4cb1e8afae9bc10f49a678034e835399ab9c0bcd",177512,178304],"/project/workspace/node_modules/.pnpm/fast-glob@3.3.2/node_modules/fast-glob/out/index.js":["e459e2a093427ef6b495bf02eccd044848688322",178304,181128],"/project/workspace/node_modules/.pnpm/fast-glob@3.3.2/node_modules/fast-glob/out/managers/tasks.js":["bcc3b169966c3e7ece6bf4b54745016b214fa448",181128,182752],"/project/workspace/node_modules/.pnpm/fast-glob@3.3.2/node_modules/fast-glob/out/utils/index.js":["752a08e3c614cbc9ecbb1b79c75780efea89f946",182752,183896],"/project/workspace/node_modules/.pnpm/fast-glob@3.3.2/node_modules/fast-glob/out/utils/array.js":["c2a902949583d0f9f812600271cde83086d8c7e7",183896,184728],"/project/workspace/node_modules/.pnpm/fast-glob@3.3.2/node_modules/fast-glob/out/utils/errno.js":["265f68611c7a5e7ac568213260b2faf0f69464bc",184728,185488],"/project/workspace/node_modules/.pnpm/fast-glob@3.3.2/node_modules/fast-glob/out/utils/fs.js":["fde03242c8fbced0e1fffde9176db3248e76c9c7",185488,186560],"/project/workspace/node_modules/.pnpm/fast-glob@3.3.2/node_modules/fast-glob/out/utils/path.js":["95a433bd9329f461bb6323ef1b3712bf54f131df",186560,188736],"/project/workspace/node_modules/.pnpm/fast-glob@3.3.2/node_modules/fast-glob/out/utils/pattern.js":["52d53793ea40d1ba27e85c1edc26815836dd436c",188736,192696],"/project/workspace/node_modules/.pnpm/glob-parent@5.1.2/node_modules/glob-parent/index.js":["adc400be934bd3d9b969c3accac4bb34a566d723",192696,194040],"/project/workspace/node_modules/.pnpm/is-glob@4.0.3/node_modules/is-glob/index.js":["9d88806c840a6ff6661e8b62a2e4ecef20ac1bc1",194040,195024],"/project/workspace/node_modules/.pnpm/is-extglob@2.1.1/node_modules/is-extglob/index.js":["c9ca9e3ebf4c37b326c24dc95fb9e6983b3dc1fd",195024,195664],"/project/workspace/node_modules/.pnpm/micromatch@4.0.7/node_modules/micromatch/index.js":["ee8a80b6774f0ca72a8109fff9eab9fedb457918",195664,198272],"/project/workspace/node_modules/.pnpm/braces@3.0.3/node_modules/braces/index.js":["16c230770b5d4e51d6e73d9e72d593e76cc09521",198272,199704],"/project/workspace/node_modules/.pnpm/braces@3.0.3/node_modules/braces/lib/stringify.js":["4b3d950417ae2f39a7487e583e85f529236ef422",199704,200456],"/project/workspace/node_modules/.pnpm/braces@3.0.3/node_modules/braces/lib/utils.js":["335ac09154d707fd39d341ddaffa377c47124261",200456,202072],"/project/workspace/node_modules/.pnpm/braces@3.0.3/node_modules/braces/lib/compile.js":["c0c55adea947384d778a24f4f08283d506aac1eb",202072,202864],"/project/workspace/node_modules/.pnpm/fill-range@7.1.1/node_modules/fill-range/index.js":["f90521fa85611e26457ceaf685f459a993381d1e",202864,205064],"/project/workspace/node_modules/.pnpm/to-regex-range@5.0.1/node_modules/to-regex-range/index.js":["b522adef7fd77cfdda9929f8773fc7d635439dcb",205064,207096],"/project/workspace/node_modules/.pnpm/is-number@7.0.0/node_modules/is-number/index.js":["1ec86d46940af464d8385e8d06a6ea34956cc757",207096,207768],"/project/workspace/node_modules/.pnpm/braces@3.0.3/node_modules/braces/lib/expand.js":["1ba7f6969f32a48741ae584d3a6e7b1fe98a0b63",207768,208712],"/project/workspace/node_modules/.pnpm/braces@3.0.3/node_modules/braces/lib/parse.js":["550e4c01b40e2a9b6bcbfbfb4ecc2fc660a1147f",208712,210336],"/project/workspace/node_modules/.pnpm/braces@3.0.3/node_modules/braces/lib/constants.js":["421df8cc8911fd1bc575cce481980b22e8d6b4f2",210336,212520],"/project/workspace/node_modules/.pnpm/picomatch@2.3.1/node_modules/picomatch/index.js":["e318b5985ff7d918da503a0e9aefb106a72c963b",212520,213128],"/project/workspace/node_modules/.pnpm/picomatch@2.3.1/node_modules/picomatch/lib/picomatch.js":["f45463f2c399358b722530b870722abb104b5091",213128,215104],"/project/workspace/node_modules/.pnpm/picomatch@2.3.1/node_modules/picomatch/lib/scan.js":["b706e51f6ce0d3cd2be9f6351547c1dfcc6f3520",215104,216880],"/project/workspace/node_modules/.pnpm/picomatch@2.3.1/node_modules/picomatch/lib/utils.js":["a38e121509c23f130931e3df7e3fdba25ae5dc39",216880,219232],"/project/workspace/node_modules/.pnpm/picomatch@2.3.1/node_modules/picomatch/lib/constants.js":["fe77299a32f26e8f1c63ac2a07614f4ed7261590",219232,225080],"/project/workspace/node_modules/.pnpm/picomatch@2.3.1/node_modules/picomatch/lib/parse.js":["b470522cc3965d7bab5ed135e1d1b4567da5489f",225080,226520],"/project/workspace/node_modules/.pnpm/fast-glob@3.3.2/node_modules/fast-glob/out/utils/stream.js":["83ed77291806827d1bdb16227833311083a5da09",226520,227408],"/project/workspace/node_modules/.pnpm/merge2@1.4.1/node_modules/merge2/index.js":["ad80c35745c87c842494078cfa8da55cae9d1201",227408,228408],"/project/workspace/node_modules/.pnpm/fast-glob@3.3.2/node_modules/fast-glob/out/utils/string.js":["21f718c2bbef24ca3602de2cb9b1f5c5080dbcfd",228408,229232],"/project/workspace/node_modules/.pnpm/fast-glob@3.3.2/node_modules/fast-glob/out/providers/async.js":["540f1475cf17095a5590b87f623b4e7efc24cb00",229232,230512],"/project/workspace/node_modules/.pnpm/fast-glob@3.3.2/node_modules/fast-glob/out/readers/async.js":["a63fed54c57c8dea0aa270a756daa7f24a625082",230512,231848],"/project/workspace/node_modules/.pnpm/@nodelib+fs.walk@1.2.8/node_modules/@nodelib/fs.walk/out/index.js":["9a7b966c96d03e673ca4885659549a3686af2a3d",231848,233248],"/project/workspace/node_modules/.pnpm/@nodelib+fs.walk@1.2.8/node_modules/@nodelib/fs.walk/out/providers/async.js":["ca32b381c4bc54aea5a25767bc02ac66b49f977b",233248,234584],"/project/workspace/node_modules/.pnpm/@nodelib+fs.walk@1.2.8/node_modules/@nodelib/fs.walk/out/readers/async.js":["febbb01e24817ccb351997edf2888e7cf9e5656d",234584,236888],"/project/workspace/node_modules/.pnpm/@nodelib+fs.scandir@2.1.5/node_modules/@nodelib/fs.scandir/out/index.js":["71d2b5d9e9abd1d47d1e54b5c30815d3dd16b760",236888,238104],"/project/workspace/node_modules/.pnpm/@nodelib+fs.scandir@2.1.5/node_modules/@nodelib/fs.scandir/out/providers/async.js":["f9ba13340d69804ead7f16041ca7886e58f11b52",238104,239728],"/project/workspace/node_modules/.pnpm/@nodelib+fs.stat@2.0.5/node_modules/@nodelib/fs.stat/out/index.js":["048bb47c8f91cfd03154635590113a5e77aa5d56",239728,240928],"/project/workspace/node_modules/.pnpm/@nodelib+fs.stat@2.0.5/node_modules/@nodelib/fs.stat/out/providers/async.js":["69cbbe90cba363ba429223faa83438e1ec56ff71",240928,241888],"/project/workspace/node_modules/.pnpm/@nodelib+fs.stat@2.0.5/node_modules/@nodelib/fs.stat/out/providers/sync.js":["9ab973411ddd81c618800061019951e6b7d8dc76",241888,242648],"/project/workspace/node_modules/.pnpm/@nodelib+fs.stat@2.0.5/node_modules/@nodelib/fs.stat/out/settings.js":["b48a6628dc2be47a2701a2fbfced76e60f9fe413",242648,243800],"/project/workspace/node_modules/.pnpm/@nodelib+fs.stat@2.0.5/node_modules/@nodelib/fs.stat/out/adapters/fs.js":["fb2ccdc3491b88733ed6e8f3c1571efac4bf2922",243800,244888],"/project/workspace/node_modules/.pnpm/run-parallel@1.2.0/node_modules/run-parallel/index.js":["9e68d778658beb112f789fc35d3ea91122cb1c3d",244888,245768],"/project/workspace/node_modules/.pnpm/queue-microtask@1.2.3/node_modules/queue-microtask/index.js":["8f6d501ff6a7e34f852b3e9f04cc7cb16821baff",245768,246624],"/project/workspace/node_modules/.pnpm/@nodelib+fs.scandir@2.1.5/node_modules/@nodelib/fs.scandir/out/constants.js":["d62034ef78787932d063a3e5e7f807bfb68ed480",246624,247816],"/project/workspace/node_modules/.pnpm/@nodelib+fs.scandir@2.1.5/node_modules/@nodelib/fs.scandir/out/utils/index.js":["cf075300b99854c1007854f6a2832a47315faac7",247816,248560],"/project/workspace/node_modules/.pnpm/@nodelib+fs.scandir@2.1.5/node_modules/@nodelib/fs.scandir/out/utils/fs.js":["fde03242c8fbced0e1fffde9176db3248e76c9c7",248560,249648],"/project/workspace/node_modules/.pnpm/@nodelib+fs.scandir@2.1.5/node_modules/@nodelib/fs.scandir/out/providers/common.js":["f2fb9050a1cd10db8f4ceefae11c4e5495974d90",249648,250424],"/project/workspace/node_modules/.pnpm/@nodelib+fs.scandir@2.1.5/node_modules/@nodelib/fs.scandir/out/providers/sync.js":["fb31af2eb7ad22baffed26e90052b5ba3920aa20",250424,251704],"/project/workspace/node_modules/.pnpm/@nodelib+fs.scandir@2.1.5/node_modules/@nodelib/fs.scandir/out/settings.js":["e3045ee354afbe74ad821238dc41619daef57dc7",251704,252984],"/project/workspace/node_modules/.pnpm/@nodelib+fs.scandir@2.1.5/node_modules/@nodelib/fs.scandir/out/adapters/fs.js":["6cabb8bce0417d8cc98e1f5f770298927896331b",252984,254160],"/project/workspace/node_modules/.pnpm/fastq@1.17.1/node_modules/fastq/queue.js":["0e3aa14b503d0c504d2bb1384d2cbfc7a5dfaf40",254160,255536],"/project/workspace/node_modules/.pnpm/reusify@1.0.4/node_modules/reusify/reusify.js":["253f9c72d80869e32a2f49bc1b458dbaf453bb84",255536,256216],"/project/workspace/node_modules/.pnpm/@nodelib+fs.walk@1.2.8/node_modules/@nodelib/fs.walk/out/readers/common.js":["85a38c3201a80b4dd04a63cc44de7f7e4fdd62b5",256216,257280],"/project/workspace/node_modules/.pnpm/@nodelib+fs.walk@1.2.8/node_modules/@nodelib/fs.walk/out/readers/reader.js":["5430f71fe5a493cceeba149498a96837af343c5b",257280,258328],"/project/workspace/node_modules/.pnpm/@nodelib+fs.walk@1.2.8/node_modules/@nodelib/fs.walk/out/providers/stream.js":["26f2b34c349013452c47b069062d0621a93317d7",258328,259560],"/project/workspace/node_modules/.pnpm/@nodelib+fs.walk@1.2.8/node_modules/@nodelib/fs.walk/out/providers/sync.js":["302b2038047a50fba013ae099d123c374b91100f",259560,260712],"/project/workspace/node_modules/.pnpm/@nodelib+fs.walk@1.2.8/node_modules/@nodelib/fs.walk/out/readers/sync.js":["7062a53bb5549ff8246065cff5b58e3097fd2c2e",260712,262528],"/project/workspace/node_modules/.pnpm/@nodelib+fs.walk@1.2.8/node_modules/@nodelib/fs.walk/out/settings.js":["d71706774d784235174fcc85a1dd889df9f29f43",262528,263744],"/project/workspace/node_modules/.pnpm/fast-glob@3.3.2/node_modules/fast-glob/out/readers/reader.js":["fb048d626e8d852a631a12e4fb2ab03a74b9fa8f",263744,265200],"/project/workspace/node_modules/.pnpm/fast-glob@3.3.2/node_modules/fast-glob/out/readers/stream.js":["ffce4582bc9f79455950a7b9db8094ed69bd3d97",265200,266792],"/project/workspace/node_modules/.pnpm/fast-glob@3.3.2/node_modules/fast-glob/out/providers/provider.js":["e15e416490d6d4ccf4db4eb0bf841a19c9015166",266792,268424],"/project/workspace/node_modules/.pnpm/fast-glob@3.3.2/node_modules/fast-glob/out/providers/filters/deep.js":["c2545d906765459ab10d8617935ad32ef14b1564",268424,270448],"/project/workspace/node_modules/.pnpm/fast-glob@3.3.2/node_modules/fast-glob/out/providers/matchers/partial.js":["277c888be29835cf26d3f3f3959bf2b9d754fa2c",270448,271568],"/project/workspace/node_modules/.pnpm/fast-glob@3.3.2/node_modules/fast-glob/out/providers/matchers/matcher.js":["85b823e0a7460cacaee1b40fec036df06ca2c325",271568,272920],"/project/workspace/node_modules/.pnpm/fast-glob@3.3.2/node_modules/fast-glob/out/providers/filters/entry.js":["7186a847bc5bcacfae9bc54e1032a1be4c73eb7f",272920,274760],"/project/workspace/node_modules/.pnpm/fast-glob@3.3.2/node_modules/fast-glob/out/providers/filters/error.js":["aafc75d8e19c67e324aaa3038648476d91d78fca",274760,276008],"/project/workspace/node_modules/.pnpm/fast-glob@3.3.2/node_modules/fast-glob/out/providers/transformers/entry.js":["f22d8cfaf9fa87dc75f3ac0d6f6a9c228436af5d",276008,277256],"/project/workspace/node_modules/.pnpm/fast-glob@3.3.2/node_modules/fast-glob/out/providers/stream.js":["92fdbe24b22a3c5e0df8ee784c8b57daef062501",277256,278608],"/project/workspace/node_modules/.pnpm/fast-glob@3.3.2/node_modules/fast-glob/out/providers/sync.js":["0b0718406005523d486497e1d3fa41a048d4b7d3",278608,279888],"/project/workspace/node_modules/.pnpm/fast-glob@3.3.2/node_modules/fast-glob/out/readers/sync.js":["0267cf7fe5e9a3c15f87400f5ef46a59baa42cb8",279888,281392],"/project/workspace/node_modules/.pnpm/fast-glob@3.3.2/node_modules/fast-glob/out/settings.js":["ba6870a40cacb77f648125f1ec379224546891c1",281392,283120],"/project/workspace/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/index.js":["b7111abcfec63f3c14d78fa1ab083daadb2a70d0",283120,284384],"/project/workspace/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/fs/index.js":["5362fe9fd2c8d632b37b2602ded1a0926a273f6b",284384,286696],"/project/workspace/node_modules/.pnpm/universalify@2.0.1/node_modules/universalify/index.js":["b89986d9f8a85f0ed20f038ad79a69fcb68a8288",286696,287560],"/project/workspace/node_modules/.pnpm/graceful-fs@4.2.11/node_modules/graceful-fs/graceful-fs.js":["55efc5a24c26495d0341c7884f0de5eb36520efa",287560,291536],"/project/workspace/node_modules/.pnpm/graceful-fs@4.2.11/node_modules/graceful-fs/polyfills.js":["38f3028ea7d9ec6b57f56ef32128499522c87a7f",291536,293664],"/project/workspace/node_modules/.pnpm/graceful-fs@4.2.11/node_modules/graceful-fs/legacy-streams.js":["f4a3583d4c3e8b0c407ab8406bdafb02b4055b7f",293664,294472],"/project/workspace/node_modules/.pnpm/graceful-fs@4.2.11/node_modules/graceful-fs/clone.js":["c912f366fe0025ea74e0e76e58277147dc0a3167",294472,295240],"/project/workspace/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/copy-sync/index.js":["3cf1fca7a7d2c1aba4a508a38e31c344d7255108",295240,295920],"/project/workspace/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/copy-sync/copy-sync.js":["3577d8fb71b1143769781f886e5e91a28458591c",295920,298360],"/project/workspace/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/mkdirs/index.js":["b0d9fcf6032f19505d113a6ea1ba769600751f28",298360,299392],"/project/workspace/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/mkdirs/make-dir.js":["66271453d9f0bdaadba03b78c7c95a862c52e970",299392,300824],"/project/workspace/node_modules/.pnpm/at-least-node@1.0.0/node_modules/at-least-node/index.js":["9c002b0e9446eff8a384d0a4b1c3494bb49a1e1f",300824,301504],"/project/workspace/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/util/utimes.js":["dad744f8edf8218685028574c168f77f9f1d75a8",301504,302368],"/project/workspace/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/util/stat.js":["38d324d1535d3303f3eb12af0eccb268194d267e",302368,304240],"/project/workspace/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/copy/index.js":["f685df7a46989c967bf917a5632a587298e22e40",304240,304992],"/project/workspace/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/copy/copy.js":["7715091e1e3173e3f5375092f035992cba09b39e",304992,307816],"/project/workspace/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/path-exists/index.js":["6e6491c1ab3389433d1b39a33b3ac8760649a2c8",307816,308760],"/project/workspace/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/empty/index.js":["72cfa757c416b468768d363ece8e71b66527577e",308760,310032],"/project/workspace/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/remove/index.js":["43a7630664db987ce37fc634b7474b6b9428ab4e",310032,310848],"/project/workspace/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/remove/rimraf.js":["9aaf8a271693de5fad3f942d7ca303e10be07c40",310848,312592],"/project/workspace/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/ensure/index.js":["68e93d6534353e9665f5d954de79edb27297b68f",312592,313856],"/project/workspace/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/ensure/file.js":["80c2a847a193ab5a9732746b6f5953cb50593f33",313856,314976],"/project/workspace/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/ensure/link.js":["87a056a34d6f9e0afcc150c235c6b972afc8cf7f",314976,316184],"/project/workspace/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/ensure/symlink.js":["dfc14c66722e60dc6879221877aecf9481d96b91",316184,317728],"/project/workspace/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/ensure/symlink-paths.js":["50fbb32d40b697a96fde72b07259933a9a72411a",317728,318744],"/project/workspace/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/ensure/symlink-type.js":["60686b2062037afe9661f006a43e124441409353",318744,319616],"/project/workspace/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/json/index.js":["047cedb67b8047183dfded82b56969c688dc5008",319616,320832],"/project/workspace/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/json/jsonfile.js":["6631d5dab8ea65a104dd9113357b4f0a2ada6fcc",320832,321752],"/project/workspace/node_modules/.pnpm/jsonfile@6.1.0/node_modules/jsonfile/index.js":["91c9c57af8bd81ee9a62a5b25797ea32883c15b0",321752,323224],"/project/workspace/node_modules/.pnpm/jsonfile@6.1.0/node_modules/jsonfile/utils.js":["9fcb3c2e8d7b909360c945cd568cc32fe7cf4596",323224,323984],"/project/workspace/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/json/output-json.js":["7a5ab88d3e20934904d7bffb20995b852442c0bb",323984,324840],"/project/workspace/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/output/index.js":["1b0879db53a00bbfeddcfdc0c190901387bab7bd",324840,326008],"/project/workspace/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/json/output-json-sync.js":["2f46f4bf9814aea91b0f6763c5d0f07e0ea9de05",326008,326864],"/project/workspace/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/move-sync/index.js":["ac40f3d0062886869329d8c31810935ad7c34ff5",326864,327544],"/project/workspace/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/move-sync/move-sync.js":["a391900c2c6e74e81d81c4414d9ef2bea7dd8ad9",327544,328920],"/project/workspace/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/move/index.js":["482e376c2d37368c3c202905b93429f3d46c9914",328920,329672],"/project/workspace/node_modules/.pnpm/fs-extra@9.1.0/node_modules/fs-extra/lib/move/move.js":["5f4c2db7135a3cfc04d9711474173fa4fb606c6a",329672,331112],"/project/workspace/node_modules/.pnpm/@babel+runtime@7.25.0/node_modules/@babel/runtime/helpers/objectSpread2.js":["f47c3a639c64b919d1099838ce6bd488211fd0a0",331112,332040],"/project/workspace/node_modules/.pnpm/@babel+runtime@7.25.0/node_modules/@babel/runtime/helpers/defineProperty.js":["1033ba95ff4616a295e4f849b2b7a34b931ae33f",332040,332880],"/project/workspace/node_modules/.pnpm/@babel+runtime@7.25.0/node_modules/@babel/runtime/helpers/toPropertyKey.js":["a2413a0eef7b66a7d1da8caa67567dfc3ba042b0",332880,333792],"/project/workspace/node_modules/.pnpm/@babel+runtime@7.25.0/node_modules/@babel/runtime/helpers/typeof.js":["ea88e31e0d68da436c784278c7b42f3ba928f5d7",333792,334616],"/project/workspace/node_modules/.pnpm/@babel+runtime@7.25.0/node_modules/@babel/runtime/helpers/toPrimitive.js":["002a87e71e7536e0c7f85c3bf97498ba4b956cdc",334616,335440],"/project/workspace/node_modules/.pnpm/detect-indent@6.1.0/node_modules/detect-indent/index.js":["a1c18640e5fee89596e01848e6e06f45cd34a884",335440,336768],"/project/workspace/node_modules/.pnpm/normalize-path@3.0.0/node_modules/normalize-path/index.js":["7af46f52994266092fb6890723ef7e1b059d1d20",336768,337448],"/project/workspace/node_modules/.pnpm/parse-glob@3.0.4/node_modules/parse-glob/index.js":["80de4342abc02723990d3849ef8f5710a3bfc2a0",337448,338832],"/project/workspace/node_modules/.pnpm/is-glob@2.0.1/node_modules/is-glob/index.js":["b3dcfb08edc51fa11b2f6a028e432f7f81c67ca8",338832,339560],"/project/workspace/node_modules/.pnpm/is-extglob@1.0.0/node_modules/is-extglob/index.js":["f2caa8e7efa77712cf91d0f349830dc563f1c9fa",339560,340200],"/project/workspace/node_modules/.pnpm/glob-base@0.3.0/node_modules/glob-base/index.js":["2f15588ede319f3f78ecb5b8be65c80f8c1570cf",340200,341096],"/project/workspace/node_modules/.pnpm/glob-parent@6.0.2/node_modules/glob-parent/index.js":["b59c2ce1188362fdc692963d4b287b2f3d79f90f",341096,342416],"/project/workspace/node_modules/.pnpm/is-dotfile@1.0.3/node_modules/is-dotfile/index.js":["01bfbcba70e3ab9c171f1053cdf5a833221fc990",342416,343088],"/project/workspace/node_modules/.pnpm/zod@3.23.8/node_modules/zod/lib/index.js":["e38dd5a234ca8c66d1a751b65a97806e7f54f247",343088,345160],"/project/workspace/node_modules/.pnpm/zod@3.23.8/node_modules/zod/lib/external.js":["f242d6d87258054f8b05e805f089ed43342608e3",345160,346960],"/project/workspace/node_modules/.pnpm/zod@3.23.8/node_modules/zod/lib/errors.js":["d4b049d999fe64a12780c2b7cfb11ce599044c8b",346960,348040],"/project/workspace/node_modules/.pnpm/zod@3.23.8/node_modules/zod/lib/locales/en.js":["060c7208a1d1040484e5710467a1f6e89d0a6524",348040,348936],"/project/workspace/node_modules/.pnpm/zod@3.23.8/node_modules/zod/lib/helpers/util.js":["ce2fae02571c61f6db07908470ae58060d8ea65a",348936,352088],"/project/workspace/node_modules/.pnpm/zod@3.23.8/node_modules/zod/lib/ZodError.js":["0ea1242578863570620d771906985661d97db604",352088,354864],"/project/workspace/node_modules/.pnpm/zod@3.23.8/node_modules/zod/lib/helpers/parseUtil.js":["764a5b48d07d7288bdaab33628d4eaa59af14d2f",354864,357592],"/project/workspace/node_modules/.pnpm/zod@3.23.8/node_modules/zod/lib/helpers/typeAliases.js":["b66edae489b6e4147ce7e1ec65a107e297219771",357592,358240],"/project/workspace/node_modules/.pnpm/zod@3.23.8/node_modules/zod/lib/types.js":["6820bcddccd12fecf7dbf4071c3bc96890b90efd",358240,403112],"/project/workspace/node_modules/.pnpm/zod@3.23.8/node_modules/zod/lib/helpers/errorUtil.js":["5dd3884a3b2637d4dac94d46dbd9342b99cb953d",403112,404208],"/project/workspace/node_modules/.pnpm/npm-packlist@2.2.2/node_modules/npm-packlist/index.js":["d123f52a824837376e369e3aec7507647a184883",404208,408136],"/project/workspace/node_modules/.pnpm/npm-bundled@1.1.2/node_modules/npm-bundled/index.js":["88712a69de7c4e83aa2d9430dc2214dfd10be5c0",408136,411448],"/project/workspace/node_modules/.pnpm/npm-normalize-package-bin@1.0.1/node_modules/npm-normalize-package-bin/index.js":["936296ddebc6348bed8f93e0063aa9b81e594a50",411448,412608],"/project/workspace/node_modules/.pnpm/ignore-walk@3.0.4/node_modules/ignore-walk/index.js":["44909c6d209ab59cd7a00c297c8f907baccb841f",412608,415864],"/project/workspace/node_modules/.pnpm/minimatch@3.1.2/node_modules/minimatch/minimatch.js":["f21a6b3c6d1d71bb65e4e6e0af1bf1baba3a207e",415864,420248],"/project/workspace/node_modules/.pnpm/brace-expansion@1.1.11/node_modules/brace-expansion/index.js":["a2f937621d39c20ce582f697c3e4273d1e14b2e0",420248,422296],"/project/workspace/node_modules/.pnpm/concat-map@0.0.1/node_modules/concat-map/index.js":["a3063f014cc693b320dbd64de3243a79247c1e05",422296,423072],"/project/workspace/node_modules/.pnpm/balanced-match@1.0.2/node_modules/balanced-match/index.js":["12161cfaa33be93568ec9a6fd3d9c357991a6a76",423072,423904],"/project/workspace/node_modules/.pnpm/glob@7.2.3/node_modules/glob/glob.js":["7b624669f35601648f8300b45c3b3861bd9c7ef6",423904,428976],"/project/workspace/node_modules/.pnpm/fs.realpath@1.0.0/node_modules/fs.realpath/index.js":["9b5cdf4ef79264959ed0a23e4c35efbe6d64b0df",428976,430440],"/project/workspace/node_modules/.pnpm/fs.realpath@1.0.0/node_modules/fs.realpath/old.js":["d2d656e98e4d0735902068408824f8d08aaea84c",430440,432280],"/project/workspace/node_modules/.pnpm/inherits@2.0.4/node_modules/inherits/inherits.js":["222da288a07d8f65b2aed9b88815948cfe0b42d9",432280,433064],"/project/workspace/node_modules/.pnpm/path-is-absolute@1.0.1/node_modules/path-is-absolute/index.js":["6de38a82f68960de2bd07fd9114541f02bee2f62",433064,433888],"/project/workspace/node_modules/.pnpm/glob@7.2.3/node_modules/glob/sync.js":["82b1c855e4bfca820ecbed219649cd174b0c2f62",433888,436968],"/project/workspace/node_modules/.pnpm/glob@7.2.3/node_modules/glob/common.js":["4890b7b6c34bc659a38802851951da90baad085d",436968,438720],"/project/workspace/node_modules/.pnpm/inflight@1.0.6/node_modules/inflight/inflight.js":["84aed0b47c15de35a85a5aa6c641342ba4dd5a88",438720,439752],"/project/workspace/node_modules/.pnpm/wrappy@1.0.2/node_modules/wrappy/wrappy.js":["7d5c1c908664b3df4a9b72400a126652ba0dd905",439752,440472],"/project/workspace/node_modules/.pnpm/once@1.4.0/node_modules/once/once.js":["f78c8cb8d754261b59d03e867f329c2ffdefae45",440472,441456],"/project/workspace/node_modules/.pnpm/fast-deep-equal@2.0.1/node_modules/fast-deep-equal/index.js":["7544a59317225a41d7c3b02605e87459a251ea54",441456,442312],"/project/workspace/node_modules/.pnpm/resolve-from@5.0.0/node_modules/resolve-from/index.js":["12204537847d8c5d27e3dbeb024c2def138bb3ae",442312,443360],"/project/workspace/node_modules/.pnpm/rollup@2.79.1/node_modules/rollup/dist/rollup.js":["528be32fbed11ca77d2ddc3fa5a4b83153c1a6f4",443360,444584],"/project/workspace/node_modules/.pnpm/rollup@2.79.1/node_modules/rollup/dist/shared/rollup.js":["1b070c5ac10253c28c8b66a3b89713db723a347e",444584,741336],"/project/workspace/node_modules/.pnpm/@rollup+plugin-node-resolve@11.2.1_rollup@2.79.1/node_modules/@rollup/plugin-node-resolve/dist/cjs/index.js":["4c7176cdf5a30cd0a7d1266fae5deac3a0b55858",741336,747976],"/project/workspace/node_modules/.pnpm/builtin-modules@3.3.0/node_modules/builtin-modules/index.js":["78b46fe2850f2a721658e7ee0494e2ac9967d969",747976,749016],"/project/workspace/node_modules/.pnpm/deepmerge@4.3.1/node_modules/deepmerge/dist/cjs.js":["30a374f658500f10d214d0c1b0aab81773cb6582",749016,751200],"/project/workspace/node_modules/.pnpm/is-module@1.0.0/node_modules/is-module/index.js":["eea7f2fb1af6df299384691d877d0cfd20060e1a",751200,752264],"/project/workspace/node_modules/.pnpm/@rollup+pluginutils@3.1.0_rollup@2.79.1/node_modules/@rollup/pluginutils/dist/cjs/index.js":["3f1a4e804542765b8ed26ef9c84451ad737a0e46",752264,757472],"/project/workspace/node_modules/.pnpm/@rollup+plugin-alias@3.1.9_rollup@2.79.1/node_modules/@rollup/plugin-alias/dist/index.js":["03c72c8b0000a9ae55e2629c7d348df1ec55d116",757472,758456],"/project/workspace/node_modules/.pnpm/@rollup+plugin-commonjs@15.1.0_rollup@2.79.1/node_modules/@rollup/plugin-commonjs/dist/index.js":["daa1dd2236b14ac67f24c4cac4d7ac04396b4fee",758456,771152],"/project/workspace/node_modules/.pnpm/commondir@1.0.1/node_modules/commondir/index.js":["62f48e7310292100f457fd315c1eaeabfb741a72",771152,771920],"/project/workspace/node_modules/.pnpm/estree-walker@2.0.2/node_modules/estree-walker/dist/umd/estree-walker.js":["12880a2841f321975ae59f2789d482753951bd1d",771920,774560],"/project/workspace/node_modules/.pnpm/magic-string@0.25.9/node_modules/magic-string/dist/magic-string.cjs.js":["f50cbc79c4a1f869984025ed5328e2da919fb6ba",774560,782680],"/project/workspace/node_modules/.pnpm/sourcemap-codec@1.4.8/node_modules/sourcemap-codec/dist/sourcemap-codec.umd.js":["dfa9b54ce6838473151cd191a4904db99063bcce",782680,783880],"/project/workspace/node_modules/.pnpm/is-reference@1.2.1/node_modules/is-reference/dist/is-reference.js":["568fec88af0aeead7c9719447c3968e506d4672b",783880,785136],"/project/workspace/node_modules/.pnpm/@rollup+plugin-replace@2.4.2_rollup@2.79.1/node_modules/@rollup/plugin-replace/dist/rollup-plugin-replace.cjs.js":["604d14be2deb4b6497cb252240415fac3753ec33",785136,786640],"/project/workspace/node_modules/.pnpm/magic-string@0.30.11/node_modules/magic-string/dist/magic-string.cjs.js":["a1b82214ad58aa225c3d8372a563a70c6df1753b",786640,796624],"/project/workspace/node_modules/.pnpm/@jridgewell+sourcemap-codec@1.5.0/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.umd.js":["f8c6b12bc867c6c3b76c14cd7bdab4e9c509048b",796624,801040],"/project/workspace/node_modules/.pnpm/@rollup+plugin-json@4.1.0_rollup@2.79.1/node_modules/@rollup/plugin-json/dist/index.js":["3adfd5d9369691483a6c1ef2087de488f2462a52",801040,801880],"/project/workspace/node_modules/.pnpm/jest-worker@26.6.2/node_modules/jest-worker/build/index.js":["69de41b40fe0bcb567f075c46d5c9e6221e71bbb",801880,804216],"/project/workspace/node_modules/.pnpm/jest-worker@26.6.2/node_modules/jest-worker/build/Farm.js":["5984ef8e7cd217ce38501bda08d5631a7e5a1d74",804216,806016],"/project/workspace/node_modules/.pnpm/jest-worker@26.6.2/node_modules/jest-worker/build/types.js":["6ac3d2e94b3e62de1635e2962750f77fbafc997f",806016,807104],"/project/workspace/node_modules/.pnpm/jest-worker@26.6.2/node_modules/jest-worker/build/WorkerPool.js":["5db5da39a2f1711c5bc5e13217a23a68d5b06860",807104,808520],"/project/workspace/node_modules/.pnpm/jest-worker@26.6.2/node_modules/jest-worker/build/base/BaseWorkerPool.js":["f17a88f0a0756a0e478bb4d1050f056c268639b5",808520,810936],"/project/workspace/node_modules/.pnpm/jest-worker@26.6.2/node_modules/jest-worker/build/workers/messageParent.js":["af373cbfef8bc3a2960cfdfcf21b056f591b75c8",810936,811944],"/project/workspace/node_modules/.pnpm/ci-info@3.9.0/node_modules/ci-info/index.js":["306147110a81e4d70b7952dedf1e7f2721b72866",811944,813528],"/project/workspace/node_modules/.pnpm/quick-lru@5.1.1/node_modules/quick-lru/index.js":["94a42747caa09e0af0d52f35c6ba68c78b9a6018",813528,815376],"/project/workspace/node_modules/.pnpm/semver@7.6.3/node_modules/semver/index.js":["c01f38060f8c1eea0a62ee127afc3a7601029818",815376,819608],"/project/workspace/node_modules/.pnpm/semver@7.6.3/node_modules/semver/internal/re.js":["4847405c77f0465eb4baebe1385b155e72b57f6a",819608,826808],"/project/workspace/node_modules/.pnpm/semver@7.6.3/node_modules/semver/internal/constants.js":["819a733e61b6014ca6feeb6a570304612afe2b52",826808,828040],"/project/workspace/node_modules/.pnpm/semver@7.6.3/node_modules/semver/internal/debug.js":["d6166e7a8eda16340619cb02ee09c19a422b8333",828040,828944],"/project/workspace/node_modules/.pnpm/semver@7.6.3/node_modules/semver/classes/semver.js":["209950c633d84021324a834a14dbcbf0fb3202f4",828944,831024],"/project/workspace/node_modules/.pnpm/semver@7.6.3/node_modules/semver/internal/parse-options.js":["19a8ad4d2c32f4386402bd9eb235df80c73a8f75",831024,831872],"/project/workspace/node_modules/.pnpm/semver@7.6.3/node_modules/semver/internal/identifiers.js":["510c174c5bfc993023542e3b4f699cd18e2e0559",831872,832744],"/project/workspace/node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/parse.js":["1bfe17569d11f23f9a539340cee18bba0e3f4f0a",832744,833488],"/project/workspace/node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/valid.js":["edc5b800b8f302ac7ce238a419a02810cdeed8f2",833488,834216],"/project/workspace/node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/clean.js":["92466e73dbb620c7b0c58b16e8d39a6d0ff22bc5",834216,834944],"/project/workspace/node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/inc.js":["5814d4948ca724f91f2b61213c011bf8034f112f",834944,835680],"/project/workspace/node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/diff.js":["a52f6ea79cf0224fda0d44968159b8dc13e36d7c",835680,836408],"/project/workspace/node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/major.js":["5e2668d635ca6c7bde9bc1b7f763f26674e83c11",836408,837152],"/project/workspace/node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/minor.js":["4bc0bc3ec293449f5fea1cbcfe976c8d2a26cce5",837152,837896],"/project/workspace/node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/patch.js":["a78ef0c69e82d2a7b1f4f697e620aef6ad1de458",837896,838640],"/project/workspace/node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/prerelease.js":["40a72fe55e64efcc0a5c6b859a0378ab030837db",838640,839376],"/project/workspace/node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/compare.js":["33ec903e117ba1fe05cddedb86a9601d94e193a7",839376,840104],"/project/workspace/node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/rcompare.js":["51f8192667aa9e1320e7fe0616b583039e8042c0",840104,840824],"/project/workspace/node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/compare-loose.js":["1c581d61f0ab057af7fed4ad01c66d0998d1aa03",840824,841560],"/project/workspace/node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/compare-build.js":["97ac51143c3f5c2255ba09c0ec0f952a2aecd8d1",841560,842320],"/project/workspace/node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/sort.js":["b7fc2bc365d5f6f9e2ad842441755e7b8b19de5c",842320,843056],"/project/workspace/node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/rsort.js":["1e99dcf8aa9518558b2a6945302273ac7b8d69bc",843056,843800],"/project/workspace/node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/gt.js":["d5e2d5e6294e56ee0a42e92e3a89d8cf294cb833",843800,844512],"/project/workspace/node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/lt.js":["fad43ee11cd4b18e2fbaf50593ae540f27365a87",844512,845224],"/project/workspace/node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/eq.js":["498639a97e5682386b94c24096f133db4fd163d0",845224,845936],"/project/workspace/node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/neq.js":["dfa93428b2368cff5aefd91d812bed067cb31ad6",845936,846648],"/project/workspace/node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/gte.js":["b9c50a385c8e3877108a001fb8548b122a155193",846648,847360],"/project/workspace/node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/lte.js":["bd1875ed01c16e0bf753352e775cfc3d993cc228",847360,848072],"/project/workspace/node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/cmp.js":["50a23a530aac08f1545e15bf6441bf031282789e",848072,849128],"/project/workspace/node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/coerce.js":["c64737eb38e2f78a361af16155116dc84c2af368",849128,850064],"/project/workspace/node_modules/.pnpm/semver@7.6.3/node_modules/semver/classes/comparator.js":["bbb95e311cc51af3911406848972f6cc50761d8f",850064,852048],"/project/workspace/node_modules/.pnpm/semver@7.6.3/node_modules/semver/classes/range.js":["49ea81742058369f806770d7d1b1a73192f0ca75",852048,855832],"/project/workspace/node_modules/.pnpm/semver@7.6.3/node_modules/semver/internal/lrucache.js":["26ae88faff2fd3ef9fbda59267979c98a1fea511",855832,856976],"/project/workspace/node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/satisfies.js":["47a3e3141433768a2ca6a03841c842d15cf419c2",856976,857720],"/project/workspace/node_modules/.pnpm/semver@7.6.3/node_modules/semver/ranges/to-comparators.js":["4d609454b2e81450d85be8f56109af8ba6b61b92",857720,858464],"/project/workspace/node_modules/.pnpm/semver@7.6.3/node_modules/semver/ranges/max-satisfying.js":["4dcef246781158eef12758041375d1bce437a383",858464,859288],"/project/workspace/node_modules/.pnpm/semver@7.6.3/node_modules/semver/ranges/min-satisfying.js":["2155aea4b92343159e1b803f878a47297ca9aa66",859288,860112],"/project/workspace/node_modules/.pnpm/semver@7.6.3/node_modules/semver/ranges/min-version.js":["04dab32f676a52ee4c81f440eb1b5d6c7511afa5",860112,861016],"/project/workspace/node_modules/.pnpm/semver@7.6.3/node_modules/semver/ranges/valid.js":["7a1c6afbe83e28264a384b43ab8f6765f7649114",861016,861752],"/project/workspace/node_modules/.pnpm/semver@7.6.3/node_modules/semver/ranges/outside.js":["c6f8b84ebd967e5479159e2f876f3ba27530eb97",861752,863104],"/project/workspace/node_modules/.pnpm/semver@7.6.3/node_modules/semver/ranges/gtr.js":["4f69fb02e28923fe7126531d80862dc85bf94c19",863104,863832],"/project/workspace/node_modules/.pnpm/semver@7.6.3/node_modules/semver/ranges/ltr.js":["d4948b6f660390895f8ac0cfe4cad97bc1f15190",863832,864544],"/project/workspace/node_modules/.pnpm/semver@7.6.3/node_modules/semver/ranges/intersects.js":["3763224a30a86582b56a4cdf1ebaa97b5038e1c8",864544,865288],"/project/workspace/node_modules/.pnpm/semver@7.6.3/node_modules/semver/ranges/simplify.js":["bc651999d477c5698289adcd2ed8773cf7a2da11",865288,866144],"/project/workspace/node_modules/.pnpm/semver@7.6.3/node_modules/semver/ranges/subset.js":["94dce217bb98598dad72f194de19c5e2f3246d7b",866144,867672],"/project/workspace/node_modules/.pnpm/ms@2.1.3/node_modules/ms/index.js":["ea869663486f513cc4d1ca8312ed52a165c417fa",867672,868800],"/project/workspace/node_modules/.pnpm/@babel+helpers@7.25.0/node_modules/@babel/helpers/lib/index.js":["357f5f097a45815db5a715e876269d5bfabd7dac",868800,870632],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/index.js":["b4a694814012bf73e5e969685037c929ba16bfe1",870632,892264],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/validators/react/isReactComponent.js":["95f5d5dc4b45810514357c0380914dc58241ba24",892264,893120],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/validators/buildMatchMemberExpression.js":["e5d43e99dde5f498e5a3a92e71f2e952b501aac3",893120,894056],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/validators/matchesPattern.js":["8454cf4b6cbd50a08bbc3c1de9ab5c16de493b00",894056,894944],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/validators/generated/index.js":["5397377964d899fec62d8c34ffefadcf2fc440db",894944,926120],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/utils/shallowEqual.js":["10edc2f8f2dc3288ac96e3945e4ec1c0488f6487",926120,926904],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/utils/deprecationWarning.js":["afa3da502a334e2761cdd333fd39352dc94fc835",926904,927904],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/validators/react/isCompatTag.js":["ff2f399e3c4be990b0da48d9bcba447ac6d461a2",927904,928696],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/builders/react/buildChildren.js":["9d4954881254318ce49c25a46c0e273cc92ed501",928696,929736],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/utils/react/cleanJSXElementLiteralChild.js":["6144987d113b19878587b0e55dbc45742bc61377",929736,930768],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/builders/generated/index.js":["09d118993950e33889672839e3812c3efd3524e0",930768,960608],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/builders/validateNode.js":["9f3d5f96da42cbf270e2324816aa2715fa7b8859",960608,961584],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/validators/validate.js":["23bcdbb590e36bbf25fc5cddd90dd95806ca36e6",961584,962648],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/definitions/index.js":["75473cc26234f822479cf98daa1deb187f85bf7e",962648,966648],"/project/workspace/node_modules/.pnpm/to-fast-properties@2.0.0/node_modules/to-fast-properties/index.js":["6308ff82e9bca6a67e7aa25111f0105f1fee89fc",966648,967456],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/definitions/core.js":["0c388d4068048171798d941e2e7fb357320b05ff",967456,1019344],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/validators/is.js":["ca3a7002a5b3266c519975795feb3df111781548",1019344,1020456],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/validators/isType.js":["c35549269452b8a2efed8d388de69e86d02446ad",1020456,1021320],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/validators/isPlaceholderType.js":["29b3523f38b94f9a08d792cc9719bac32db78d27",1021320,1022216],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/validators/isValidIdentifier.js":["2b54d4a54bd63122fc8ce0a01eb531972c85eebc",1022216,1023152],"/project/workspace/node_modules/.pnpm/@babel+helper-string-parser@7.24.8/node_modules/@babel/helper-string-parser/lib/index.js":["3208fae30d742f71f09711bad362b9f09c5a79a6",1023152,1025352],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/constants/index.js":["49f82c5373bcdc59fc1fe32267648bc6c5d9b0c2",1025352,1029584],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/definitions/utils.js":["94640118c885a5ce4b4172f1de7970677860a744",1029584,1033280],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/definitions/flow.js":["616514b741caeea6bb56cdcc38754dd10c9d1d72",1033280,1052584],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/definitions/jsx.js":["75150a8a7b5f295714f618445a43b5be5134b3df",1052584,1058136],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/definitions/misc.js":["81f57e1e1fb15e0918d7a46502025a4ab0d1f9d4",1058136,1059712],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/definitions/placeholders.js":["b2e696e21aeae96071880f487af8883f6e8be92d",1059712,1061440],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/definitions/experimental.js":["d79101cd151187ddfd0dd80c38f777759d01ae5d",1061440,1066960],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/definitions/typescript.js":["79cde51962b6d573285de195a91c6954d794ae8b",1066960,1086072],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/definitions/deprecated-aliases.js":["f29794e441858c3e2f2b1085aecb4c756d77d711",1086072,1086952],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/asserts/assertNode.js":["f1638bb583fe74ab8bb9a1bc6f454b491a348274",1086952,1087832],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/validators/isNode.js":["17f73842d38e0825ffa9f577e40f179503ee031b",1087832,1088696],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/asserts/generated/index.js":["148205bd999ad2039159ece59f6c8ac33a33606a",1088696,1121256],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/builders/flow/createTypeAnnotationBasedOnTypeof.js":["8769a998687162bc7550dcfe98a9e81f2d74a459",1121256,1122216],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/builders/flow/createFlowUnionType.js":["3c7a20f8b066ef7f858dcf14d6afcf1698ee141c",1122216,1123256],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/modifications/flow/removeTypeDuplicates.js":["f70e4d934e2b3b696ef00b1e34fee8ff252458e6",1123256,1124280],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/builders/typescript/createTSUnionType.js":["ac99b6bbdb3ee5879edb6ba5dbb012f987ef690b",1124280,1125416],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/modifications/typescript/removeTypeDuplicates.js":["54976f3b36b1e7db28188129aa2098282846f807",1125416,1126440],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/builders/generated/uppercase.js":["01146dc1a091c09905f4d4bd51bd9befcfc6013b",1126440,1182408],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/builders/productions.js":["5bf863371b472963ae72c1e64ac1b8630367ac2b",1182408,1183288],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/clone/cloneNode.js":["f15454de0a71e53a1e42faa07ef39ba7f8747f67",1183288,1184792],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/clone/clone.js":["00c128835dc3ef60c50001bc0e1372f29b797cd4",1184792,1185648],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/clone/cloneDeep.js":["0edb67fa97425f2d4079c8c64e097d0ddd5eb0cc",1185648,1186520],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/clone/cloneDeepWithoutLoc.js":["e7719f2ecf0c0657c5b6068c09af3c3bf0592068",1186520,1187424],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/clone/cloneWithoutLoc.js":["f63ebfbdab6d34badb74fd376c38f5cc8930423c",1187424,1188304],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/comments/addComment.js":["16f2d359874230847f36cb97742de44472f84594",1188304,1189184],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/comments/addComments.js":["c62e5ffd8cb9350cf9bc0589ca476d009ac85f9a",1189184,1189968],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/comments/inheritInnerComments.js":["d040738ed2802ba9d61a8394fe6c9ee65d734a76",1189968,1190872],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/utils/inherit.js":["5896fd13c8a775e0155b7185805c9727329f6730",1190872,1191632],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/comments/inheritLeadingComments.js":["f87077b689c318c639537f4c42698ed278e4f829",1191632,1192544],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/comments/inheritsComments.js":["42f6cbab43c95c7d831a62a991f7ae449cd9b5d8",1192544,1193672],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/comments/inheritTrailingComments.js":["5bd6c9b811fbe4893a2fbef744b7374e2c1e84c7",1193672,1194584],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/comments/removeComments.js":["a6564e4d0b4893afb3d965c187c6ee3c9990ee77",1194584,1195472],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/constants/generated/index.js":["150c5b7b3b23479f3e251f6341bd26ee2c70b185",1195472,1200936],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/converters/ensureBlock.js":["9546e15b033129e9d14e953a1e431f1f9bf88824",1200936,1201816],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/converters/toBlock.js":["e42f617eb9a3d06d9e088fa1e41225b663c2bff9",1201816,1202784],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/converters/toBindingIdentifierName.js":["26959a098e207bbb2842e79e7bccdbabe8323408",1202784,1203704],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/converters/toIdentifier.js":["bb776190e90daa84973bc9941adcdd8193bd1e5e",1203704,1204776],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/converters/toComputedKey.js":["9eecc51376934654679e0386cd244a8dda5f0baf",1204776,1205768],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/converters/toExpression.js":["c6891bc3f4882d86e3e6dbff896c85ce44923cb4",1205768,1206672],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/converters/toKeyAlias.js":["5fbdc0ac8dc95b5eabec0be50d71e6c0865ce35c",1206672,1207928],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/modifications/removePropertiesDeep.js":["23860ef1d6c45e8f71b8228a1f377668e8c96f1b",1207928,1208960],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/traverse/traverseFast.js":["67af8be359598f6a3aafc7637358f7046033aeca",1208960,1209848],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/modifications/removeProperties.js":["73107880504998df7f8c5b3bd7a278383e84c8bc",1209848,1211088],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/converters/toStatement.js":["574ede0cdc26b05072b0646e7d66221fa1da6558",1211088,1212088],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/converters/valueToNode.js":["8b5b35bc076f64bd9672753d23da7ec67b106fd8",1212088,1213416],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/modifications/appendToMemberExpression.js":["27439fd3e557f640b2f818d7361fc0c12f46cb43",1213416,1214344],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/modifications/inherits.js":["746ddefd49e0fbafb0f53d49ac490d9e5a67eccf",1214344,1215328],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/modifications/prependToMemberExpression.js":["5a713459848abc5691a7b9f14ad0112175c90ae5",1215328,1216344],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/retrievers/getAssignmentIdentifiers.js":["56001c75c4a7d7d9734e6f5410d5feef3c61a3c0",1216344,1217160],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/retrievers/getBindingIdentifiers.js":["09124ac3269656d268bb5bb4745670c8961541ff",1217160,1220576],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/retrievers/getOuterBindingIdentifiers.js":["d0c30354a56b626a2a1533a68dd36f03d75f35d1",1220576,1221544],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/retrievers/getFunctionName.js":["0fb9488c606146a2e06e65a956f17c5ed503955b",1221544,1222616],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/traverse/traverse.js":["7992ab182de5d6e2635aa63d27e20ae6119fd085",1222616,1223560],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/validators/isBinding.js":["4184b924d4bf2122e4d64d4661db34225e6ce581",1223560,1224464],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/validators/isBlockScoped.js":["551efbe73814fbdf9b09af1a6dbd9edab8ca12c9",1224464,1225432],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/validators/isLet.js":["3a0c0986cdca1871a5c5ed9260abcc71f3622c6d",1225432,1226384],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/validators/isImmutable.js":["87ce8fd906f5fe6fea21757f3b96e2dbf10d45b9",1226384,1227352],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/validators/isNodesEquivalent.js":["8de1678d5fea7521128e49da8471adb7ac189ad8",1227352,1228256],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/validators/isReferenced.js":["8759a5583bcae62a90768a3418d106c78e08f2fe",1228256,1229048],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/validators/isScope.js":["db0b7d08fe2f223e5bb846f2713a608d9c4d3204",1229048,1229912],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/validators/isSpecifierDefault.js":["8c8652248a736fc000db5f45ec1d1a0570acb952",1229912,1230816],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/validators/isValidES3Identifier.js":["49d11809665072371ec9b0d5fe83f5214001eb6f",1230816,1232296],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/validators/isVar.js":["a8ac19b347058fbb51e9c0b9b35a838cd9c6ef14",1232296,1233248],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/converters/toSequenceExpression.js":["9384f95b71f9748d64908bdc9b4b675c12d14104",1233248,1234192],"/project/workspace/node_modules/.pnpm/@babel+types@7.25.2/node_modules/@babel/types/lib/converters/gatherSequenceExpressions.js":["ba5ecf63baf8dfbe57529a29490ad381b7c8625b",1234192,1235512],"/project/workspace/node_modules/.pnpm/@babel+helpers@7.25.0/node_modules/@babel/helpers/lib/helpers-generated.js":["bdfe68621914607bd09d0c2a3dc4e7a2d74a3b9f",1235512,1349088],"/project/workspace/node_modules/.pnpm/@babel+template@7.25.0/node_modules/@babel/template/lib/index.js":["9a3926ea29ec8d546e723aa8a1353306e0bd0ad5",1349088,1350408],"/project/workspace/node_modules/.pnpm/@babel+template@7.25.0/node_modules/@babel/template/lib/formatters.js":["f9b9d9a37cbf61be7616b0656d92b8b79fa52b1f",1350408,1352528],"/project/workspace/node_modules/.pnpm/@babel+template@7.25.0/node_modules/@babel/template/lib/builder.js":["f23864c5185e593ed3929af741bf8a1ee43b4603",1352528,1353784],"/project/workspace/node_modules/.pnpm/@babel+template@7.25.0/node_modules/@babel/template/lib/options.js":["a2154aa8b4523eac2c1c71ebfcba32308afcd31f",1353784,1355040],"/project/workspace/node_modules/.pnpm/@babel+template@7.25.0/node_modules/@babel/template/lib/string.js":["d4bd2d379e5c5247bb0e825aa911836b07a7ad72",1355040,1356056],"/project/workspace/node_modules/.pnpm/@babel+template@7.25.0/node_modules/@babel/template/lib/parse.js":["1a725f4ba5a1fe7a4fcd95195b3d01be192b747d",1356056,1357960],"/project/workspace/node_modules/.pnpm/@babel+parser@7.25.3/node_modules/@babel/parser/lib/index.js":["d150d62841d0f12e7f4b42f5291013c9b1ebde79",1357960,1500848],"/project/workspace/node_modules/.pnpm/@babel+template@7.25.0/node_modules/@babel/template/lib/populate.js":["77692699c5cb74c059e0c9c786e2ffb59a68f434",1500848,1502256],"/project/workspace/node_modules/.pnpm/@babel+template@7.25.0/node_modules/@babel/template/lib/literal.js":["9f9a7059025c507617ea6303f9106ee2e53ddcb9",1502256,1503440],"/project/workspace/node_modules/.pnpm/@babel+generator@7.25.0/node_modules/@babel/generator/lib/index.js":["c98c5ea2b11bbdb4bccf13ff70509990fad9919f",1503440,1504824],"/project/workspace/node_modules/.pnpm/@babel+generator@7.25.0/node_modules/@babel/generator/lib/source-map.js":["5b5a15c3b2d5fec4b5c62457f3016e8aa33a46f0",1504824,1506376],"/project/workspace/node_modules/.pnpm/@jridgewell+gen-mapping@0.3.5/node_modules/@jridgewell/gen-mapping/dist/gen-mapping.umd.js":["f59a96193c4d0050b224b915ec09303a0b363013",1506376,1510376],"/project/workspace/node_modules/.pnpm/@jridgewell+set-array@1.2.1/node_modules/@jridgewell/set-array/dist/set-array.umd.js":["20be9f5c3d323c9aca346a00e62f8d7e4a1fefa0",1510376,1512440],"/project/workspace/node_modules/.pnpm/@jridgewell+trace-mapping@0.3.25/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.umd.js":["d14969c9417dabccd90411b4770dc55726dea41d",1512440,1518600],"/project/workspace/node_modules/.pnpm/@jridgewell+resolve-uri@3.1.2/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.umd.js":["3d56b7861cb317124e76dc7f2caac7d4c8cf3a86",1518600,1521264],"/project/workspace/node_modules/.pnpm/@babel+generator@7.25.0/node_modules/@babel/generator/lib/printer.js":["87b6083bdeb088244d146ec7094b137c7d19ff47",1521264,1528248],"/project/workspace/node_modules/.pnpm/@babel+generator@7.25.0/node_modules/@babel/generator/lib/buffer.js":["1e5f3acd7d2127345524d342f8aeecb542146a50",1528248,1531456],"/project/workspace/node_modules/.pnpm/@babel+generator@7.25.0/node_modules/@babel/generator/lib/node/index.js":["84c5abeb85944041673e6fa57c883a880e59e2d0",1531456,1533856],"/project/workspace/node_modules/.pnpm/@babel+generator@7.25.0/node_modules/@babel/generator/lib/node/whitespace.js":["6432f37adcbacc354300b84a879ef6e0e504341a",1533856,1537576],"/project/workspace/node_modules/.pnpm/@babel+generator@7.25.0/node_modules/@babel/generator/lib/node/parentheses.js":["616888cbcfd6f0e0b898aff092aae10647710d25",1537576,1543152],"/project/workspace/node_modules/.pnpm/@babel+generator@7.25.0/node_modules/@babel/generator/lib/generators/index.js":["19e79ce1eedfd872c35b815d444f6288c4050140",1543152,1546040],"/project/workspace/node_modules/.pnpm/@babel+generator@7.25.0/node_modules/@babel/generator/lib/generators/template-literals.js":["9069eae70537e6d8145bdcd443a7322a884edbcb",1546040,1547024],"/project/workspace/node_modules/.pnpm/@babel+generator@7.25.0/node_modules/@babel/generator/lib/generators/expressions.js":["7c7d6368f96052f5613036cd7504ffdb1fbc5c67",1547024,1550568],"/project/workspace/node_modules/.pnpm/@babel+generator@7.25.0/node_modules/@babel/generator/lib/generators/statements.js":["bba4e7700a33a7c482fb2de6620782ce25e03a34",1550568,1553504],"/project/workspace/node_modules/.pnpm/@babel+generator@7.25.0/node_modules/@babel/generator/lib/generators/classes.js":["95b2bae54b2cda46b6bcfcf2bfc9f455f045fcdd",1553504,1555208],"/project/workspace/node_modules/.pnpm/@babel+generator@7.25.0/node_modules/@babel/generator/lib/generators/methods.js":["6f0304fea2d5eaa3884b09293ee074a50e0ecd45",1555208,1556984],"/project/workspace/node_modules/.pnpm/@babel+generator@7.25.0/node_modules/@babel/generator/lib/generators/modules.js":["437038a7e68f202f78dd78b70156899cf75e6ff5",1556984,1559488],"/project/workspace/node_modules/.pnpm/@babel+generator@7.25.0/node_modules/@babel/generator/lib/generators/types.js":["09778cd4447014d0bb8f4d6053d455da8b990f3a",1559488,1562440],"/project/workspace/node_modules/.pnpm/jsesc@2.5.2/node_modules/jsesc/jsesc.js":["1ddb9ef6ced291147886096f09527cb1980a5572",1562440,1564640],"/project/workspace/node_modules/.pnpm/@babel+generator@7.25.0/node_modules/@babel/generator/lib/generators/flow.js":["5d7383206f35f019e6364dbd6930405141c3c74a",1564640,1572640],"/project/workspace/node_modules/.pnpm/@babel+generator@7.25.0/node_modules/@babel/generator/lib/generators/base.js":["51d18e9c693ca992d7d0a779deac61c493cb0e32",1572640,1574120],"/project/workspace/node_modules/.pnpm/@babel+generator@7.25.0/node_modules/@babel/generator/lib/generators/jsx.js":["85bf426cf47cadb0aebb50eb9f23b2c7e1b24d7c",1574120,1576248],"/project/workspace/node_modules/.pnpm/@babel+generator@7.25.0/node_modules/@babel/generator/lib/generators/typescript.js":["9a4ed7457f46c3c1159be1b9847355edbe87c70c",1576248,1583672]} \ No newline at end of file diff --git a/wagmi-project/.gitignore b/wagmi-project/.gitignore new file mode 100644 index 000000000..fc5ae9f0c --- /dev/null +++ b/wagmi-project/.gitignore @@ -0,0 +1,25 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? +.vercel diff --git a/wagmi-project/.npmrc b/wagmi-project/.npmrc new file mode 100644 index 000000000..ca1e9d98b --- /dev/null +++ b/wagmi-project/.npmrc @@ -0,0 +1 @@ +legacy-peer-deps = true \ No newline at end of file diff --git a/wagmi-project/README.md b/wagmi-project/README.md new file mode 100644 index 000000000..15f6f7954 --- /dev/null +++ b/wagmi-project/README.md @@ -0,0 +1 @@ +This is a [Vite](https://vitejs.dev) project bootstrapped with [`create-wagmi`](https://github.com/wevm/wagmi/tree/main/packages/create-wagmi). diff --git a/wagmi-project/biome.json b/wagmi-project/biome.json new file mode 100644 index 000000000..08eb8a26a --- /dev/null +++ b/wagmi-project/biome.json @@ -0,0 +1,13 @@ +{ + "formatter": { + "enabled": true, + "indentStyle": "space", + "lineWidth": 120 + }, + "linter": { + "enabled": true + }, + "organizeImports": { + "enabled": true + } +} diff --git a/wagmi-project/index.html b/wagmi-project/index.html new file mode 100644 index 000000000..f519ce85a --- /dev/null +++ b/wagmi-project/index.html @@ -0,0 +1,12 @@ + + + + + + Create Wagmi + + +
+ + + diff --git a/wagmi-project/package.json b/wagmi-project/package.json new file mode 100644 index 000000000..b3a2bc03e --- /dev/null +++ b/wagmi-project/package.json @@ -0,0 +1,29 @@ +{ + "name": "wagmi-project", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "lint": "biome check .", + "preview": "vite preview" + }, + "dependencies": { + "@tanstack/react-query": "5.64.2", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "viem": "^2.x", + "wagmi": "~0.x.x" + }, + "devDependencies": { + "@biomejs/biome": "^1.8.0", + "@types/react": "^18.3.1", + "@types/react-dom": "^18.3.0", + "@vitejs/plugin-react": "^4.2.1", + "@wagmi/cli": "~2.8.0", + "buffer": "^6.0.3", + "typescript": "^5.4.5", + "vite": "^5.2.11" + } +} diff --git a/wagmi-project/src/App.tsx b/wagmi-project/src/App.tsx new file mode 100644 index 000000000..9f245fc45 --- /dev/null +++ b/wagmi-project/src/App.tsx @@ -0,0 +1,1362 @@ +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/ethauth' +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/skyweaver-banner.png' +import skyweaverBannerLargeUrl from './images/skyweaver-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.GOERLI +// 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) ?? environments.find(x => x.name === 'production') +if (!envConfig) { + throw new Error('Invalid environment configuration.') +} +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) + + useEffect(() => { + const handleChainChanged = (chainId: string) => { + setShowChainId(Number(BigInt(chainId))) + } + wallet.on('chainChanged', handleChainChanged) + return () => { + wallet.off('chainChanged', handleChainChanged) + } + }, [wallet]) + + useEffect(() => { + setIsWalletConnected(wallet.isConnected()) + }, [wallet]) + + useEffect(() => { + consoleWelcomeMessage() + // eslint-disable-next-line + }, [isWalletConnected]) + + useEffect(() => { + // Wallet events + const onOpen = () => { + console.log('wallet window opened') + } + wallet.client.on('open', onOpen) + + const onClose = () => { + console.log('wallet window closed') + } + wallet.client.on('close', onClose) + + return () => { + wallet.client.off('open', onOpen) + wallet.client.off('close', onClose) + } + }, [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 && connectDetails.proof) { + 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 ( + + + + logo + + + + + + 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 && ( + + wallet.setDefaultChainId(Number(value))} + value={String(showChainId)} + options={[ + ...Object.values(networks).map(network => ({ + label: ( + + + {network.title!} + + ), + value: String(network.chainId) + })) + ]} + /> + + + +