From a0d71be89f352c40d6a59402f7f6bede6d762c9d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 30 Mar 2024 07:24:31 +0000 Subject: [PATCH 001/119] Bump the npm_and_yarn group across 1 directory with 1 update Bumps the npm_and_yarn group with 1 update in the / directory: [express](https://github.com/expressjs/express). Updates `express` from 4.18.2 to 4.19.2 - [Release notes](https://github.com/expressjs/express/releases) - [Changelog](https://github.com/expressjs/express/blob/master/History.md) - [Commits](https://github.com/expressjs/express/compare/4.18.2...4.19.2) --- updated-dependencies: - dependency-name: express dependency-type: direct:development dependency-group: npm_and_yarn-security-group ... Signed-off-by: dependabot[bot] --- package.json | 2 +- pnpm-lock.yaml | 54 +++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 50 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 6eeb65e5ef..6e730882ad 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,7 @@ "eslint-plugin-import": "^2.27.5", "eslint-plugin-prettier": "^5.0.1", "ethers": "^5.7.2", - "express": "^4.18.2", + "express": "^4.19.2", "hardhat": "^2.20.1", "husky": "^8.0.0", "mocha": "^10.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a6b460b980..5a8f4cf43d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -129,8 +129,8 @@ importers: specifier: ^5.7.2 version: 5.7.2 express: - specifier: ^4.18.2 - version: 4.18.2(supports-color@6.1.0) + specifier: ^4.19.2 + version: 4.19.2 hardhat: specifier: ^2.20.1 version: 2.20.1(ts-node@10.9.2)(typescript@5.3.3) @@ -6948,6 +6948,11 @@ packages: engines: {node: '>= 0.6'} dev: true + /cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} + dev: true + /copy-descriptor@0.1.1: resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} engines: {node: '>=0.10.0'} @@ -8207,7 +8212,7 @@ packages: resolution: {integrity: sha512-iNZ576iTOGcfllftB73cPB5AN+XUQAT/T8xzsILsghXC1o8gJUqe3RHlcDqagu+biFpYQ61KQrZZJza8eRSYqw==} deprecated: Deprecated in favor of '@metamask/eth-sig-util' dependencies: - ethereumjs-abi: github.com/ethereumjs/ethereumjs-abi/ee3994657fa7a427238e6ba92a84d0b529bbcde0 + ethereumjs-abi: git/github.com+ethereumjs/ethereumjs-abi/ee3994657fa7a427238e6ba92a84d0b529bbcde0 ethereumjs-util: 5.2.1 dev: true @@ -8533,6 +8538,45 @@ packages: - supports-color dev: true + /express@4.19.2: + resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} + engines: {node: '>= 0.10.0'} + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.2 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.6.0 + cookie-signature: 1.0.6 + debug: 2.6.9(supports-color@6.1.0) + depd: 2.0.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.2.0(supports-color@6.1.0) + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.7 + qs: 6.11.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.18.0(supports-color@6.1.0) + serve-static: 1.15.0(supports-color@6.1.0) + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: true + /ext@1.7.0: resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} dependencies: @@ -15672,8 +15716,8 @@ packages: resolution: {integrity: sha512-KYnWoFWgGtWyQEKNnUcb3u8ZtKO8dn5d8u+oGpxPlopqsPyv60U8suDyfk7Z7UtAO6Sk5i1aVcAs9RbaB1n36A==} dev: true - github.com/ethereumjs/ethereumjs-abi/ee3994657fa7a427238e6ba92a84d0b529bbcde0: - resolution: {tarball: https://codeload.github.com/ethereumjs/ethereumjs-abi/tar.gz/ee3994657fa7a427238e6ba92a84d0b529bbcde0} + git/github.com+ethereumjs/ethereumjs-abi/ee3994657fa7a427238e6ba92a84d0b529bbcde0: + resolution: {commit: ee3994657fa7a427238e6ba92a84d0b529bbcde0, repo: git@github.com:ethereumjs/ethereumjs-abi.git, type: git} name: ethereumjs-abi version: 0.6.8 dependencies: From ca06c8f4b06fc596ddf6b8a39359703dc02187e3 Mon Sep 17 00:00:00 2001 From: Legion's <64915515+Dargon789@users.noreply.github.com> Date: Sat, 30 Mar 2024 14:25:04 +0700 Subject: [PATCH 002/119] Create SECURITY.md --- SECURITY.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 SECURITY.md diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000000..034e848032 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,21 @@ +# 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 where to go, how often they can expect to get an update on a +reported vulnerability, what to expect if the vulnerability is accepted or +declined, etc. From 3af5a887a6727387ab08ddf05681ed1af44a2fc2 Mon Sep 17 00:00:00 2001 From: Legion's <64915515+Dargon789@users.noreply.github.com> Date: Sat, 13 Apr 2024 00:34:46 +0700 Subject: [PATCH 003/119] Set up CI with Azure Pipelines [skip ci] --- azure-pipelines.yml | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 azure-pipelines.yml diff --git a/azure-pipelines.yml b/azure-pipelines.yml new file mode 100644 index 0000000000..676233afaf --- /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' From 1275488cc4694f82c5633237cbc890d5ebac0027 Mon Sep 17 00:00:00 2001 From: Legion's <64915515+Dargon789@users.noreply.github.com> Date: Wed, 7 Aug 2024 15:56:12 +0700 Subject: [PATCH 004/119] Create CNAME --- CNAME | 1 + 1 file changed, 1 insertion(+) create mode 100644 CNAME diff --git a/CNAME b/CNAME new file mode 100644 index 0000000000..c9903e895b --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +wagmi-project-two.vercel.app \ No newline at end of file From b12a5dc904ee7fba7fbfc058f132844ced59e149 Mon Sep 17 00:00:00 2001 From: Legion's <64915515+Dargon789@users.noreply.github.com> Date: Fri, 11 Oct 2024 22:27:24 -0700 Subject: [PATCH 005/119] Create fortify.yml --- .github/workflows/fortify.yml | 84 +++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 .github/workflows/fortify.yml diff --git a/.github/workflows/fortify.yml b/.github/workflows/fortify.yml new file mode 100644 index 0000000000..e8a93615c1 --- /dev/null +++ b/.github/workflows/fortify.yml @@ -0,0 +1,84 @@ +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. + +################################################################################################################################################ +# Fortify Application Security provides your team with solutions to empower DevSecOps practices, enable cloud transformation, and secure your # +# software supply chain. To learn more about Fortify, start a free trial or contact our sales team, visit fortify.com. # +# # +# Use this starter workflow as a basis for integrating Fortify Application Security Testing into your GitHub workflows. This template # +# demonstrates the steps to package the code+dependencies, initiate a scan, and optionally import SAST vulnerabilities into GitHub Security # +# Code Scanning Alerts. Additional information is available in the workflow comments and the Fortify AST Action / fcli / Fortify product # +# documentation. If you need additional assistance, please contact Fortify support. # +################################################################################################################################################ + +name: Fortify AST Scan + +# Customize trigger events based on your DevSecOps process and/or policy +on: + push: + branches: [ "master" ] + pull_request: + # The branches below must be a subset of the branches above + branches: [ "master" ] + schedule: + - cron: '31 12 * * 4' + workflow_dispatch: + +jobs: + Fortify-AST-Scan: + # Use the appropriate runner for building your source code. Ensure dev tools required to build your code are present and configured appropriately (MSBuild, Python, etc). + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + security-events: write + + steps: + # Check out source code + - name: Check Out Source Code + uses: actions/checkout@v4 + + # Java is required to run the various Fortify utilities. Ensuring proper version is installed on the runner. + - name: Setup Java + uses: actions/setup-java@v4 + with: + java-version: 17 + distribution: 'temurin' + + # Perform SAST and optionally SCA scan via Fortify on Demand/Fortify Hosted/Software Security Center, then + # optionally export SAST results to the GitHub code scanning dashboard. In case further customization is + # required, you can use sub-actions like fortify/github-action/setup@v1 to set up the various Fortify tools + # and run them directly from within your pipeline; see https://github.com/fortify/github-action#readme for + # details. + - name: Run FoD SAST Scan + uses: fortify/github-action@a92347297e02391b857e7015792cd1926a4cd418 + with: + sast-scan: true + env: + ### Required configuration when integrating with Fortify on Demand + FOD_URL: https://ams.fortify.com + FOD_TENANT: ${{secrets.FOD_TENANT}} + FOD_USER: ${{secrets.FOD_USER}} + FOD_PASSWORD: ${{secrets.FOD_PAT}} + ### Optional configuration when integrating with Fortify on Demand + # EXTRA_PACKAGE_OPTS: -oss # Extra 'scancentral package' options, like '-oss'' if + # Debricked SCA scan is enabled on Fortify on Demand + # EXTRA_FOD_LOGIN_OPTS: --socket-timeout=60s # Extra 'fcli fod session login' options + # FOD_RELEASE: MyApp:MyRelease # FoD release name, default: /:; may + # replace app+release name with numeric release ID + # DO_WAIT: true # Wait for scan completion, implied if 'DO_EXPORT: true' + # DO_EXPORT: true # Export SAST results to GitHub code scanning dashboard + ### Required configuration when integrating with Fortify Hosted / Software Security Center & ScanCentral + # SSC_URL: ${{secrets.SSC_URL}} # SSC URL + # SSC_TOKEN: ${{secrets.SSC_TOKEN}} # SSC CIToken or AutomationToken + # SC_SAST_TOKEN: ${{secrets.SC_SAST_TOKEN}} # ScanCentral SAST client auth token + # SC_SAST_SENSOR_VERSION: ${{vars.SC_SAST_SENSOR_VERSION}} # Sensor version on which to run the scan; + # usually defined as organization or repo variable + ### Optional configuration when integrating with Fortify Hosted / Software Security Center & ScanCentral + # EXTRA_SC_SAST_LOGIN_OPTS: --socket-timeout=60s # Extra 'fcli sc-sast session login' options + # SSC_APPVERSION: MyApp:MyVersion # SSC application version, default: /: + # EXTRA_PACKAGE_OPTS: -bv myCustomPom.xml # Extra 'scancentral package' options + # DO_WAIT: true # Wait for scan completion, implied if 'DO_EXPORT: true' + # DO_EXPORT: true # Export SAST results to GitHub code scanning dashboard From 5cbdca4038cbcbe7512a32b67e7fc83052d8b413 Mon Sep 17 00:00:00 2001 From: Legion's <64915515+Dargon789@users.noreply.github.com> Date: Sat, 12 Oct 2024 00:45:06 -0700 Subject: [PATCH 006/119] Update issue templates --- .github/ISSUE_TEMPLATE/bug_report.md | 38 +++++++++++++++++++++++ .github/ISSUE_TEMPLATE/custom.md | 10 ++++++ .github/ISSUE_TEMPLATE/feature_request.md | 20 ++++++++++++ 3 files changed, 68 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/custom.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000000..dd84ea7824 --- /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: '' +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 0000000000..48d5f81fa4 --- /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 0000000000..bbcbbe7d61 --- /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: '' +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. From 1d8c21cb5b58f4867472d1642089ab2b839ced40 Mon Sep 17 00:00:00 2001 From: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Date: Fri, 21 Feb 2025 23:53:45 +0700 Subject: [PATCH 007/119] Update CNAME --- CNAME | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CNAME b/CNAME index c9903e895b..aa0085b19f 100644 --- a/CNAME +++ b/CNAME @@ -1 +1 @@ -wagmi-project-two.vercel.app \ No newline at end of file +sequence.app \ No newline at end of file From a5b1d913152cd9589ef7662efdee15cbe03ec6c3 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Sun, 16 Feb 2025 00:14:56 +0000 Subject: [PATCH 008/119] fix: upgrade @tanstack/react-query from 5.45.1 to 5.64.2 Snyk has created this PR to upgrade @tanstack/react-query from 5.45.1 to 5.64.2. See this package in npm: @tanstack/react-query See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr --- wagmi-project/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wagmi-project/package.json b/wagmi-project/package.json index 298a76bbc6..206445bb31 100644 --- a/wagmi-project/package.json +++ b/wagmi-project/package.json @@ -10,7 +10,7 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/react-query": "5.45.1", + "@tanstack/react-query": "5.64.2", "react": "^18.3.1", "react-dom": "^18.3.1", "viem": "latest", From 3e905fe55ce83ec1e29094d0b3501ae1b6369ae7 Mon Sep 17 00:00:00 2001 From: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Date: Sun, 13 Jul 2025 23:35:42 +0700 Subject: [PATCH 009/119] Create config.yml (#46) Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> --- .circleci/config.yml | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 .circleci/config.yml diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 0000000000..709c9a7474 --- /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/hardhat-project/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- From 2e02a661f2d8842cd11adba290b1f9751972b7b3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 Sep 2025 14:49:25 +0000 Subject: [PATCH 010/119] Bump next in the npm_and_yarn group across 1 directory Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.4.2 to 15.4.7 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.4.2...v15.4.7) --- updated-dependencies: - dependency-name: next dependency-version: 15.4.7 dependency-type: direct:production dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] --- extras/docs/package.json | 2 +- extras/web/package.json | 2 +- pnpm-lock.yaml | 354 ++++++++++++++++++--------------------- 3 files changed, 166 insertions(+), 192 deletions(-) diff --git a/extras/docs/package.json b/extras/docs/package.json index 6c2fe2de2d..d88f6aab18 100644 --- a/extras/docs/package.json +++ b/extras/docs/package.json @@ -13,7 +13,7 @@ }, "dependencies": { "@repo/ui": "workspace:*", - "next": "^15.3.3", + "next": "^15.4.7", "react": "^19.1.0", "react-dom": "^19.1.0" }, diff --git a/extras/web/package.json b/extras/web/package.json index d908edc2d6..8a0ffdf213 100644 --- a/extras/web/package.json +++ b/extras/web/package.json @@ -13,7 +13,7 @@ }, "dependencies": { "@repo/ui": "workspace:*", - "next": "^15.3.3", + "next": "^15.4.7", "react": "^19.1.0", "react-dom": "^19.1.0" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 555a669efe..494683100a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -33,8 +33,8 @@ importers: specifier: workspace:* version: link:../../repo/ui next: - specifier: ^15.3.3 - version: 15.4.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + specifier: ^15.4.7 + version: 15.4.7(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: specifier: ^19.1.0 version: 19.1.0 @@ -67,8 +67,8 @@ importers: specifier: workspace:* version: link:../../repo/ui next: - specifier: ^15.3.3 - version: 15.4.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + specifier: ^15.4.7 + version: 15.4.7(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: specifier: ^19.1.0 version: 19.1.0 @@ -586,8 +586,8 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@emnapi/runtime@1.4.5': - resolution: {integrity: sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==} + '@emnapi/runtime@1.5.0': + resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} '@esbuild/aix-ppc64@0.25.8': resolution: {integrity: sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==} @@ -803,124 +803,128 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} - '@img/sharp-darwin-arm64@0.34.3': - resolution: {integrity: sha512-ryFMfvxxpQRsgZJqBd4wsttYQbCxsJksrv9Lw/v798JcQ8+w84mBWuXwl+TT0WJ/WrYOLaYpwQXi3sA9nTIaIg==} + '@img/colour@1.0.0': + resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} + engines: {node: '>=18'} + + '@img/sharp-darwin-arm64@0.34.4': + resolution: {integrity: sha512-sitdlPzDVyvmINUdJle3TNHl+AG9QcwiAMsXmccqsCOMZNIdW2/7S26w0LyU8euiLVzFBL3dXPwVCq/ODnf2vA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [darwin] - '@img/sharp-darwin-x64@0.34.3': - resolution: {integrity: sha512-yHpJYynROAj12TA6qil58hmPmAwxKKC7reUqtGLzsOHfP7/rniNGTL8tjWX6L3CTV4+5P4ypcS7Pp+7OB+8ihA==} + '@img/sharp-darwin-x64@0.34.4': + resolution: {integrity: sha512-rZheupWIoa3+SOdF/IcUe1ah4ZDpKBGWcsPX6MT0lYniH9micvIU7HQkYTfrx5Xi8u+YqwLtxC/3vl8TQN6rMg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [darwin] - '@img/sharp-libvips-darwin-arm64@1.2.0': - resolution: {integrity: sha512-sBZmpwmxqwlqG9ueWFXtockhsxefaV6O84BMOrhtg/YqbTaRdqDE7hxraVE3y6gVM4eExmfzW4a8el9ArLeEiQ==} + '@img/sharp-libvips-darwin-arm64@1.2.3': + resolution: {integrity: sha512-QzWAKo7kpHxbuHqUC28DZ9pIKpSi2ts2OJnoIGI26+HMgq92ZZ4vk8iJd4XsxN+tYfNJxzH6W62X5eTcsBymHw==} cpu: [arm64] os: [darwin] - '@img/sharp-libvips-darwin-x64@1.2.0': - resolution: {integrity: sha512-M64XVuL94OgiNHa5/m2YvEQI5q2cl9d/wk0qFTDVXcYzi43lxuiFTftMR1tOnFQovVXNZJ5TURSDK2pNe9Yzqg==} + '@img/sharp-libvips-darwin-x64@1.2.3': + resolution: {integrity: sha512-Ju+g2xn1E2AKO6YBhxjj+ACcsPQRHT0bhpglxcEf+3uyPY+/gL8veniKoo96335ZaPo03bdDXMv0t+BBFAbmRA==} cpu: [x64] os: [darwin] - '@img/sharp-libvips-linux-arm64@1.2.0': - resolution: {integrity: sha512-RXwd0CgG+uPRX5YYrkzKyalt2OJYRiJQ8ED/fi1tq9WQW2jsQIn0tqrlR5l5dr/rjqq6AHAxURhj2DVjyQWSOA==} + '@img/sharp-libvips-linux-arm64@1.2.3': + resolution: {integrity: sha512-I4RxkXU90cpufazhGPyVujYwfIm9Nk1QDEmiIsaPwdnm013F7RIceaCc87kAH+oUB1ezqEvC6ga4m7MSlqsJvQ==} cpu: [arm64] os: [linux] - '@img/sharp-libvips-linux-arm@1.2.0': - resolution: {integrity: sha512-mWd2uWvDtL/nvIzThLq3fr2nnGfyr/XMXlq8ZJ9WMR6PXijHlC3ksp0IpuhK6bougvQrchUAfzRLnbsen0Cqvw==} + '@img/sharp-libvips-linux-arm@1.2.3': + resolution: {integrity: sha512-x1uE93lyP6wEwGvgAIV0gP6zmaL/a0tGzJs/BIDDG0zeBhMnuUPm7ptxGhUbcGs4okDJrk4nxgrmxpib9g6HpA==} cpu: [arm] os: [linux] - '@img/sharp-libvips-linux-ppc64@1.2.0': - resolution: {integrity: sha512-Xod/7KaDDHkYu2phxxfeEPXfVXFKx70EAFZ0qyUdOjCcxbjqyJOEUpDe6RIyaunGxT34Anf9ue/wuWOqBW2WcQ==} + '@img/sharp-libvips-linux-ppc64@1.2.3': + resolution: {integrity: sha512-Y2T7IsQvJLMCBM+pmPbM3bKT/yYJvVtLJGfCs4Sp95SjvnFIjynbjzsa7dY1fRJX45FTSfDksbTp6AGWudiyCg==} cpu: [ppc64] os: [linux] - '@img/sharp-libvips-linux-s390x@1.2.0': - resolution: {integrity: sha512-eMKfzDxLGT8mnmPJTNMcjfO33fLiTDsrMlUVcp6b96ETbnJmd4uvZxVJSKPQfS+odwfVaGifhsB07J1LynFehw==} + '@img/sharp-libvips-linux-s390x@1.2.3': + resolution: {integrity: sha512-RgWrs/gVU7f+K7P+KeHFaBAJlNkD1nIZuVXdQv6S+fNA6syCcoboNjsV2Pou7zNlVdNQoQUpQTk8SWDHUA3y/w==} cpu: [s390x] os: [linux] - '@img/sharp-libvips-linux-x64@1.2.0': - resolution: {integrity: sha512-ZW3FPWIc7K1sH9E3nxIGB3y3dZkpJlMnkk7z5tu1nSkBoCgw2nSRTFHI5pB/3CQaJM0pdzMF3paf9ckKMSE9Tg==} + '@img/sharp-libvips-linux-x64@1.2.3': + resolution: {integrity: sha512-3JU7LmR85K6bBiRzSUc/Ff9JBVIFVvq6bomKE0e63UXGeRw2HPVEjoJke1Yx+iU4rL7/7kUjES4dZ/81Qjhyxg==} cpu: [x64] os: [linux] - '@img/sharp-libvips-linuxmusl-arm64@1.2.0': - resolution: {integrity: sha512-UG+LqQJbf5VJ8NWJ5Z3tdIe/HXjuIdo4JeVNADXBFuG7z9zjoegpzzGIyV5zQKi4zaJjnAd2+g2nna8TZvuW9Q==} + '@img/sharp-libvips-linuxmusl-arm64@1.2.3': + resolution: {integrity: sha512-F9q83RZ8yaCwENw1GieztSfj5msz7GGykG/BA+MOUefvER69K/ubgFHNeSyUu64amHIYKGDs4sRCMzXVj8sEyw==} cpu: [arm64] os: [linux] - '@img/sharp-libvips-linuxmusl-x64@1.2.0': - resolution: {integrity: sha512-SRYOLR7CXPgNze8akZwjoGBoN1ThNZoqpOgfnOxmWsklTGVfJiGJoC/Lod7aNMGA1jSsKWM1+HRX43OP6p9+6Q==} + '@img/sharp-libvips-linuxmusl-x64@1.2.3': + resolution: {integrity: sha512-U5PUY5jbc45ANM6tSJpsgqmBF/VsL6LnxJmIf11kB7J5DctHgqm0SkuXzVWtIY90GnJxKnC/JT251TDnk1fu/g==} cpu: [x64] os: [linux] - '@img/sharp-linux-arm64@0.34.3': - resolution: {integrity: sha512-QdrKe3EvQrqwkDrtuTIjI0bu6YEJHTgEeqdzI3uWJOH6G1O8Nl1iEeVYRGdj1h5I21CqxSvQp1Yv7xeU3ZewbA==} + '@img/sharp-linux-arm64@0.34.4': + resolution: {integrity: sha512-YXU1F/mN/Wu786tl72CyJjP/Ngl8mGHN1hST4BGl+hiW5jhCnV2uRVTNOcaYPs73NeT/H8Upm3y9582JVuZHrQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linux-arm@0.34.3': - resolution: {integrity: sha512-oBK9l+h6KBN0i3dC8rYntLiVfW8D8wH+NPNT3O/WBHeW0OQWCjfWksLUaPidsrDKpJgXp3G3/hkmhptAW0I3+A==} + '@img/sharp-linux-arm@0.34.4': + resolution: {integrity: sha512-Xyam4mlqM0KkTHYVSuc6wXRmM7LGN0P12li03jAnZ3EJWZqj83+hi8Y9UxZUbxsgsK1qOEwg7O0Bc0LjqQVtxA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] - '@img/sharp-linux-ppc64@0.34.3': - resolution: {integrity: sha512-GLtbLQMCNC5nxuImPR2+RgrviwKwVql28FWZIW1zWruy6zLgA5/x2ZXk3mxj58X/tszVF69KK0Is83V8YgWhLA==} + '@img/sharp-linux-ppc64@0.34.4': + resolution: {integrity: sha512-F4PDtF4Cy8L8hXA2p3TO6s4aDt93v+LKmpcYFLAVdkkD3hSxZzee0rh6/+94FpAynsuMpLX5h+LRsSG3rIciUQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ppc64] os: [linux] - '@img/sharp-linux-s390x@0.34.3': - resolution: {integrity: sha512-3gahT+A6c4cdc2edhsLHmIOXMb17ltffJlxR0aC2VPZfwKoTGZec6u5GrFgdR7ciJSsHT27BD3TIuGcuRT0KmQ==} + '@img/sharp-linux-s390x@0.34.4': + resolution: {integrity: sha512-qVrZKE9Bsnzy+myf7lFKvng6bQzhNUAYcVORq2P7bDlvmF6u2sCmK2KyEQEBdYk+u3T01pVsPrkj943T1aJAsw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] - '@img/sharp-linux-x64@0.34.3': - resolution: {integrity: sha512-8kYso8d806ypnSq3/Ly0QEw90V5ZoHh10yH0HnrzOCr6DKAPI6QVHvwleqMkVQ0m+fc7EH8ah0BB0QPuWY6zJQ==} + '@img/sharp-linux-x64@0.34.4': + resolution: {integrity: sha512-ZfGtcp2xS51iG79c6Vhw9CWqQC8l2Ot8dygxoDoIQPTat/Ov3qAa8qpxSrtAEAJW+UjTXc4yxCjNfxm4h6Xm2A==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-linuxmusl-arm64@0.34.3': - resolution: {integrity: sha512-vAjbHDlr4izEiXM1OTggpCcPg9tn4YriK5vAjowJsHwdBIdx0fYRsURkxLG2RLm9gyBq66gwtWI8Gx0/ov+JKQ==} + '@img/sharp-linuxmusl-arm64@0.34.4': + resolution: {integrity: sha512-8hDVvW9eu4yHWnjaOOR8kHVrew1iIX+MUgwxSuH2XyYeNRtLUe4VNioSqbNkB7ZYQJj9rUTT4PyRscyk2PXFKA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linuxmusl-x64@0.34.3': - resolution: {integrity: sha512-gCWUn9547K5bwvOn9l5XGAEjVTTRji4aPTqLzGXHvIr6bIDZKNTA34seMPgM0WmSf+RYBH411VavCejp3PkOeQ==} + '@img/sharp-linuxmusl-x64@0.34.4': + resolution: {integrity: sha512-lU0aA5L8QTlfKjpDCEFOZsTYGn3AEiO6db8W5aQDxj0nQkVrZWmN3ZP9sYKWJdtq3PWPhUNlqehWyXpYDcI9Sg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-wasm32@0.34.3': - resolution: {integrity: sha512-+CyRcpagHMGteySaWos8IbnXcHgfDn7pO2fiC2slJxvNq9gDipYBN42/RagzctVRKgxATmfqOSulgZv5e1RdMg==} + '@img/sharp-wasm32@0.34.4': + resolution: {integrity: sha512-33QL6ZO/qpRyG7woB/HUALz28WnTMI2W1jgX3Nu2bypqLIKx/QKMILLJzJjI+SIbvXdG9fUnmrxR7vbi1sTBeA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [wasm32] - '@img/sharp-win32-arm64@0.34.3': - resolution: {integrity: sha512-MjnHPnbqMXNC2UgeLJtX4XqoVHHlZNd+nPt1kRPmj63wURegwBhZlApELdtxM2OIZDRv/DFtLcNhVbd1z8GYXQ==} + '@img/sharp-win32-arm64@0.34.4': + resolution: {integrity: sha512-2Q250do/5WXTwxW3zjsEuMSv5sUU4Tq9VThWKlU2EYLm4MB7ZeMwF+SFJutldYODXF6jzc6YEOC+VfX0SZQPqA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [win32] - '@img/sharp-win32-ia32@0.34.3': - resolution: {integrity: sha512-xuCdhH44WxuXgOM714hn4amodJMZl3OEvf0GVTm0BEyMeA2to+8HEdRPShH0SLYptJY1uBw+SCFP9WVQi1Q/cw==} + '@img/sharp-win32-ia32@0.34.4': + resolution: {integrity: sha512-3ZeLue5V82dT92CNL6rsal6I2weKw1cYu+rGKm8fOCCtJTR2gYeUfY3FqUnIJsMUPIH68oS5jmZ0NiJ508YpEw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ia32] os: [win32] - '@img/sharp-win32-x64@0.34.3': - resolution: {integrity: sha512-OWwz05d++TxzLEv4VnsTz5CmZ6mI6S05sfQGEMrNrQcOEERbX46332IvE7pO/EUiw7jUrrS40z/M7kPyjfl04g==} + '@img/sharp-win32-x64@0.34.4': + resolution: {integrity: sha512-xIyj4wpYs8J18sVN3mSQjwrw7fKUqRw+Z5rnHNCy5fYTxigBz81u5mOMPmFumwjcn8+ld1ppptMBCLic1nz6ig==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [win32] @@ -963,56 +967,56 @@ packages: '@manypkg/get-packages@1.1.3': resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} - '@next/env@15.4.2': - resolution: {integrity: sha512-kd7MvW3pAP7tmk1NaiX4yG15xb2l4gNhteKQxt3f+NGR22qwPymn9RBuv26QKfIKmfo6z2NpgU8W2RT0s0jlvg==} + '@next/env@15.4.7': + resolution: {integrity: sha512-PrBIpO8oljZGTOe9HH0miix1w5MUiGJ/q83Jge03mHEE0E3pyqzAy2+l5G6aJDbXoobmxPJTVhbCuwlLtjSHwg==} '@next/eslint-plugin-next@15.4.2': resolution: {integrity: sha512-k0rjdWjXBY6tAOty1ckrMETE6Mx66d85NsgcAIdDp7/cXOsTJ93ywmbg3uUcpxX5TUHFEcCWI5mb8nPhwCe9jg==} - '@next/swc-darwin-arm64@15.4.2': - resolution: {integrity: sha512-ovqjR8NjCBdBf1U+R/Gvn0RazTtXS9n6wqs84iFaCS1NHbw9ksVE4dfmsYcLoyUVd9BWE0bjkphOWrrz8uz/uw==} + '@next/swc-darwin-arm64@15.4.7': + resolution: {integrity: sha512-2Dkb+VUTp9kHHkSqtws4fDl2Oxms29HcZBwFIda1X7Ztudzy7M6XF9HDS2dq85TmdN47VpuhjE+i6wgnIboVzQ==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@15.4.2': - resolution: {integrity: sha512-I8d4W7tPqbdbHRI4z1iBfaoJIBrEG4fnWKIe+Rj1vIucNZ5cEinfwkBt3RcDF00bFRZRDpvKuDjgMFD3OyRBnw==} + '@next/swc-darwin-x64@15.4.7': + resolution: {integrity: sha512-qaMnEozKdWezlmh1OGDVFueFv2z9lWTcLvt7e39QA3YOvZHNpN2rLs/IQLwZaUiw2jSvxW07LxMCWtOqsWFNQg==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.4.2': - resolution: {integrity: sha512-lvhz02dU3Ec5thzfQ2RCUeOFADjNkS/px1W7MBt7HMhf0/amMfT8Z/aXOwEA+cVWN7HSDRSUc8hHILoHmvajsg==} + '@next/swc-linux-arm64-gnu@15.4.7': + resolution: {integrity: sha512-ny7lODPE7a15Qms8LZiN9wjNWIeI+iAZOFDOnv2pcHStncUr7cr9lD5XF81mdhrBXLUP9yT9RzlmSWKIazWoDw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.4.2': - resolution: {integrity: sha512-v+5PPfL8UP+KKHS3Mox7QMoeFdMlaV0zeNMIF7eLC4qTiVSO0RPNnK0nkBZSD5BEkkf//c+vI9s/iHxddCZchA==} + '@next/swc-linux-arm64-musl@15.4.7': + resolution: {integrity: sha512-4SaCjlFR/2hGJqZLLWycccy1t+wBrE/vyJWnYaZJhUVHccpGLG5q0C+Xkw4iRzUIkE+/dr90MJRUym3s1+vO8A==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@15.4.2': - resolution: {integrity: sha512-PHLYOC9W2cu6I/JEKo77+LW4uPNvyEQiSkVRUQPsOIsf01PRr8PtPhwtz3XNnC9At8CrzPkzqQ9/kYDg4R4Inw==} + '@next/swc-linux-x64-gnu@15.4.7': + resolution: {integrity: sha512-2uNXjxvONyRidg00VwvlTYDwC9EgCGNzPAPYbttIATZRxmOZ3hllk/YYESzHZb65eyZfBR5g9xgCZjRAl9YYGg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.4.2': - resolution: {integrity: sha512-lpmUF9FfLFns4JbTu+5aJGA8aR9dXaA12eoNe9CJbVkGib0FDiPa4kBGTwy0xDxKNGlv3bLDViyx1U+qafmuJQ==} + '@next/swc-linux-x64-musl@15.4.7': + resolution: {integrity: sha512-ceNbPjsFgLscYNGKSu4I6LYaadq2B8tcK116nVuInpHHdAWLWSwVK6CHNvCi0wVS9+TTArIFKJGsEyVD1H+4Kg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@15.4.2': - resolution: {integrity: sha512-aMjogoGnRepas0LQ/PBPsvvUzj+IoXw2IoDSEShEtrsu2toBiaxEWzOQuPZ8nie8+1iF7TA63S7rlp3YWAjNEg==} + '@next/swc-win32-arm64-msvc@15.4.7': + resolution: {integrity: sha512-pZyxmY1iHlZJ04LUL7Css8bNvsYAMYOY9JRwFA3HZgpaNKsJSowD09Vg2R9734GxAcLJc2KDQHSCR91uD6/AAw==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@15.4.2': - resolution: {integrity: sha512-FxwauyexSFu78wEqR/+NB9MnqXVj6SxJKwcVs2CRjeSX/jBagDCgtR2W36PZUYm0WPgY1pQ3C1+nn7zSnwROuw==} + '@next/swc-win32-x64-msvc@15.4.7': + resolution: {integrity: sha512-HjuwPJ7BeRzgl3KrjKqD2iDng0eQIpIReyhpF5r4yeAHFwWRuAhfW92rWv/r3qeQHEwHsLRzFDvMqRjyM5DI6A==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -1532,8 +1536,8 @@ packages: camel-case@3.0.0: resolution: {integrity: sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==} - caniuse-lite@1.0.30001727: - resolution: {integrity: sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==} + caniuse-lite@1.0.30001743: + resolution: {integrity: sha512-e6Ojr7RV14Un7dz6ASD0aZDmQPT/A+eZU+nuTNfjqmRrmkmQlnTNWH0SKmqagx9PeW87UVqapSurtAXifmtdmw==} cbor2@1.12.0: resolution: {integrity: sha512-3Cco8XQhi27DogSp9Ri6LYNZLi/TBY/JVnDe+mj06NkBjW/ZYOtekaEU4wZ4xcRMNrFkDv8KNtOAqHyDfz3lYg==} @@ -1613,13 +1617,6 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} - - color@4.2.3: - resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} - engines: {node: '>=12.5.0'} - commander@10.0.1: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} engines: {node: '>=14'} @@ -1711,8 +1708,8 @@ packages: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} - detect-libc@2.0.4: - resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} + detect-libc@2.1.0: + resolution: {integrity: sha512-vEtk+OcP7VBRtQZ1EJ3bdgzSfBjgnEalLTp5zjJrS+2Z1w2KZly4SBdac/WDU3hhsNAZ9E8SC96ME4Ey8MZ7cg==} engines: {node: '>=8'} diff@4.0.2: @@ -2209,9 +2206,6 @@ packages: resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} - is-arrayish@0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - is-async-function@2.1.1: resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} engines: {node: '>= 0.4'} @@ -2636,8 +2630,8 @@ packages: resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} engines: {node: '>= 0.4.0'} - next@15.4.2: - resolution: {integrity: sha512-oH1rmFso+84NIkocfuxaGKcXIjMUTmnzV2x0m8qsYtB4gD6iflLMESXt5XJ8cFgWMBei4v88rNr/j+peNg72XA==} + next@15.4.7: + resolution: {integrity: sha512-OcqRugwF7n7mC8OSYjvsZhhG1AYSvulor1EIUsIkbbEbf1qoE5EbH36Swj8WhF4cHqmDgkiam3z1c1W0J1Wifg==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: @@ -3065,8 +3059,8 @@ packages: resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} engines: {node: '>= 0.4'} - sharp@0.34.3: - resolution: {integrity: sha512-eX2IQ6nFohW4DbvHIOLRB3MHFpYqaqvXd3Tp5e/T/dSH83fxaNJQRvDMhASmkNTsNTVF2/OOopzRCt7xokgPfg==} + sharp@0.34.4: + resolution: {integrity: sha512-FUH39xp3SBPnxWvd5iib1X8XY7J0K0X7d93sie9CJg2PO8/7gmg89Nve6OjItK53/MlAushNNxteBYfM6DEuoA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} shebang-command@2.0.0: @@ -3107,9 +3101,6 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - simple-swizzle@0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} - simple-update-notifier@2.0.0: resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} engines: {node: '>=10'} @@ -3813,7 +3804,7 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@emnapi/runtime@1.4.5': + '@emnapi/runtime@1.5.0': dependencies: tslib: 2.8.1 optional: true @@ -3953,90 +3944,93 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} - '@img/sharp-darwin-arm64@0.34.3': + '@img/colour@1.0.0': + optional: true + + '@img/sharp-darwin-arm64@0.34.4': optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.2.0 + '@img/sharp-libvips-darwin-arm64': 1.2.3 optional: true - '@img/sharp-darwin-x64@0.34.3': + '@img/sharp-darwin-x64@0.34.4': optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.2.0 + '@img/sharp-libvips-darwin-x64': 1.2.3 optional: true - '@img/sharp-libvips-darwin-arm64@1.2.0': + '@img/sharp-libvips-darwin-arm64@1.2.3': optional: true - '@img/sharp-libvips-darwin-x64@1.2.0': + '@img/sharp-libvips-darwin-x64@1.2.3': optional: true - '@img/sharp-libvips-linux-arm64@1.2.0': + '@img/sharp-libvips-linux-arm64@1.2.3': optional: true - '@img/sharp-libvips-linux-arm@1.2.0': + '@img/sharp-libvips-linux-arm@1.2.3': optional: true - '@img/sharp-libvips-linux-ppc64@1.2.0': + '@img/sharp-libvips-linux-ppc64@1.2.3': optional: true - '@img/sharp-libvips-linux-s390x@1.2.0': + '@img/sharp-libvips-linux-s390x@1.2.3': optional: true - '@img/sharp-libvips-linux-x64@1.2.0': + '@img/sharp-libvips-linux-x64@1.2.3': optional: true - '@img/sharp-libvips-linuxmusl-arm64@1.2.0': + '@img/sharp-libvips-linuxmusl-arm64@1.2.3': optional: true - '@img/sharp-libvips-linuxmusl-x64@1.2.0': + '@img/sharp-libvips-linuxmusl-x64@1.2.3': optional: true - '@img/sharp-linux-arm64@0.34.3': + '@img/sharp-linux-arm64@0.34.4': optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.2.0 + '@img/sharp-libvips-linux-arm64': 1.2.3 optional: true - '@img/sharp-linux-arm@0.34.3': + '@img/sharp-linux-arm@0.34.4': optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.2.0 + '@img/sharp-libvips-linux-arm': 1.2.3 optional: true - '@img/sharp-linux-ppc64@0.34.3': + '@img/sharp-linux-ppc64@0.34.4': optionalDependencies: - '@img/sharp-libvips-linux-ppc64': 1.2.0 + '@img/sharp-libvips-linux-ppc64': 1.2.3 optional: true - '@img/sharp-linux-s390x@0.34.3': + '@img/sharp-linux-s390x@0.34.4': optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.2.0 + '@img/sharp-libvips-linux-s390x': 1.2.3 optional: true - '@img/sharp-linux-x64@0.34.3': + '@img/sharp-linux-x64@0.34.4': optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.2.0 + '@img/sharp-libvips-linux-x64': 1.2.3 optional: true - '@img/sharp-linuxmusl-arm64@0.34.3': + '@img/sharp-linuxmusl-arm64@0.34.4': optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.2.0 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.3 optional: true - '@img/sharp-linuxmusl-x64@0.34.3': + '@img/sharp-linuxmusl-x64@0.34.4': optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.2.0 + '@img/sharp-libvips-linuxmusl-x64': 1.2.3 optional: true - '@img/sharp-wasm32@0.34.3': + '@img/sharp-wasm32@0.34.4': dependencies: - '@emnapi/runtime': 1.4.5 + '@emnapi/runtime': 1.5.0 optional: true - '@img/sharp-win32-arm64@0.34.3': + '@img/sharp-win32-arm64@0.34.4': optional: true - '@img/sharp-win32-ia32@0.34.3': + '@img/sharp-win32-ia32@0.34.4': optional: true - '@img/sharp-win32-x64@0.34.3': + '@img/sharp-win32-x64@0.34.4': optional: true '@isaacs/balanced-match@4.0.1': {} @@ -4091,34 +4085,34 @@ snapshots: globby: 11.1.0 read-yaml-file: 1.1.0 - '@next/env@15.4.2': {} + '@next/env@15.4.7': {} '@next/eslint-plugin-next@15.4.2': dependencies: fast-glob: 3.3.1 - '@next/swc-darwin-arm64@15.4.2': + '@next/swc-darwin-arm64@15.4.7': optional: true - '@next/swc-darwin-x64@15.4.2': + '@next/swc-darwin-x64@15.4.7': optional: true - '@next/swc-linux-arm64-gnu@15.4.2': + '@next/swc-linux-arm64-gnu@15.4.7': optional: true - '@next/swc-linux-arm64-musl@15.4.2': + '@next/swc-linux-arm64-musl@15.4.7': optional: true - '@next/swc-linux-x64-gnu@15.4.2': + '@next/swc-linux-x64-gnu@15.4.7': optional: true - '@next/swc-linux-x64-musl@15.4.2': + '@next/swc-linux-x64-musl@15.4.7': optional: true - '@next/swc-win32-arm64-msvc@15.4.2': + '@next/swc-win32-arm64-msvc@15.4.7': optional: true - '@next/swc-win32-x64-msvc@15.4.2': + '@next/swc-win32-x64-msvc@15.4.7': optional: true '@noble/ciphers@1.3.0': {} @@ -4698,7 +4692,7 @@ snapshots: no-case: 2.3.2 upper-case: 1.1.3 - caniuse-lite@1.0.30001727: {} + caniuse-lite@1.0.30001743: {} cbor2@1.12.0: {} @@ -4797,18 +4791,6 @@ snapshots: color-name@1.1.4: {} - color-string@1.9.1: - dependencies: - color-name: 1.1.4 - simple-swizzle: 0.2.2 - optional: true - - color@4.2.3: - dependencies: - color-convert: 2.0.1 - color-string: 1.9.1 - optional: true - commander@10.0.1: {} concat-map@0.0.1: {} @@ -4913,7 +4895,7 @@ snapshots: detect-indent@6.1.0: {} - detect-libc@2.0.4: + detect-libc@2.1.0: optional: true diff@4.0.2: {} @@ -5595,9 +5577,6 @@ snapshots: call-bound: 1.0.4 get-intrinsic: 1.3.0 - is-arrayish@0.3.2: - optional: true - is-async-function@2.1.1: dependencies: async-function: 1.0.0 @@ -5983,25 +5962,25 @@ snapshots: netmask@2.0.2: {} - next@15.4.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + next@15.4.7(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: - '@next/env': 15.4.2 + '@next/env': 15.4.7 '@swc/helpers': 0.5.15 - caniuse-lite: 1.0.30001727 + caniuse-lite: 1.0.30001743 postcss: 8.4.31 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) styled-jsx: 5.1.6(react@19.1.0) optionalDependencies: - '@next/swc-darwin-arm64': 15.4.2 - '@next/swc-darwin-x64': 15.4.2 - '@next/swc-linux-arm64-gnu': 15.4.2 - '@next/swc-linux-arm64-musl': 15.4.2 - '@next/swc-linux-x64-gnu': 15.4.2 - '@next/swc-linux-x64-musl': 15.4.2 - '@next/swc-win32-arm64-msvc': 15.4.2 - '@next/swc-win32-x64-msvc': 15.4.2 - sharp: 0.34.3 + '@next/swc-darwin-arm64': 15.4.7 + '@next/swc-darwin-x64': 15.4.7 + '@next/swc-linux-arm64-gnu': 15.4.7 + '@next/swc-linux-arm64-musl': 15.4.7 + '@next/swc-linux-x64-gnu': 15.4.7 + '@next/swc-linux-x64-musl': 15.4.7 + '@next/swc-win32-arm64-msvc': 15.4.7 + '@next/swc-win32-x64-msvc': 15.4.7 + sharp: 0.34.4 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros @@ -6516,34 +6495,34 @@ snapshots: es-errors: 1.3.0 es-object-atoms: 1.1.1 - sharp@0.34.3: + sharp@0.34.4: dependencies: - color: 4.2.3 - detect-libc: 2.0.4 + '@img/colour': 1.0.0 + detect-libc: 2.1.0 semver: 7.7.2 optionalDependencies: - '@img/sharp-darwin-arm64': 0.34.3 - '@img/sharp-darwin-x64': 0.34.3 - '@img/sharp-libvips-darwin-arm64': 1.2.0 - '@img/sharp-libvips-darwin-x64': 1.2.0 - '@img/sharp-libvips-linux-arm': 1.2.0 - '@img/sharp-libvips-linux-arm64': 1.2.0 - '@img/sharp-libvips-linux-ppc64': 1.2.0 - '@img/sharp-libvips-linux-s390x': 1.2.0 - '@img/sharp-libvips-linux-x64': 1.2.0 - '@img/sharp-libvips-linuxmusl-arm64': 1.2.0 - '@img/sharp-libvips-linuxmusl-x64': 1.2.0 - '@img/sharp-linux-arm': 0.34.3 - '@img/sharp-linux-arm64': 0.34.3 - '@img/sharp-linux-ppc64': 0.34.3 - '@img/sharp-linux-s390x': 0.34.3 - '@img/sharp-linux-x64': 0.34.3 - '@img/sharp-linuxmusl-arm64': 0.34.3 - '@img/sharp-linuxmusl-x64': 0.34.3 - '@img/sharp-wasm32': 0.34.3 - '@img/sharp-win32-arm64': 0.34.3 - '@img/sharp-win32-ia32': 0.34.3 - '@img/sharp-win32-x64': 0.34.3 + '@img/sharp-darwin-arm64': 0.34.4 + '@img/sharp-darwin-x64': 0.34.4 + '@img/sharp-libvips-darwin-arm64': 1.2.3 + '@img/sharp-libvips-darwin-x64': 1.2.3 + '@img/sharp-libvips-linux-arm': 1.2.3 + '@img/sharp-libvips-linux-arm64': 1.2.3 + '@img/sharp-libvips-linux-ppc64': 1.2.3 + '@img/sharp-libvips-linux-s390x': 1.2.3 + '@img/sharp-libvips-linux-x64': 1.2.3 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.3 + '@img/sharp-libvips-linuxmusl-x64': 1.2.3 + '@img/sharp-linux-arm': 0.34.4 + '@img/sharp-linux-arm64': 0.34.4 + '@img/sharp-linux-ppc64': 0.34.4 + '@img/sharp-linux-s390x': 0.34.4 + '@img/sharp-linux-x64': 0.34.4 + '@img/sharp-linuxmusl-arm64': 0.34.4 + '@img/sharp-linuxmusl-x64': 0.34.4 + '@img/sharp-wasm32': 0.34.4 + '@img/sharp-win32-arm64': 0.34.4 + '@img/sharp-win32-ia32': 0.34.4 + '@img/sharp-win32-x64': 0.34.4 optional: true shebang-command@2.0.0: @@ -6588,11 +6567,6 @@ snapshots: signal-exit@4.1.0: {} - simple-swizzle@0.2.2: - dependencies: - is-arrayish: 0.3.2 - optional: true - simple-update-notifier@2.0.0: dependencies: semver: 7.7.2 From ceb95d4dabe7488255fe86fbb995f75541d4b36c Mon Sep 17 00:00:00 2001 From: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Date: Sun, 28 Sep 2025 01:56:17 +0700 Subject: [PATCH 011/119] Update issue templates --- .github/ISSUE_TEMPLATE/bug_report.md | 38 +++++++++++++++++++++++ .github/ISSUE_TEMPLATE/custom.md | 10 ++++++ .github/ISSUE_TEMPLATE/feature_request.md | 20 ++++++++++++ 3 files changed, 68 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/custom.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000000..dd84ea7824 --- /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: '' +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 0000000000..48d5f81fa4 --- /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 0000000000..bbcbbe7d61 --- /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: '' +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. From 13549e5d18d08e758600068f6b4e9e4c7e575552 Mon Sep 17 00:00:00 2001 From: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Date: Tue, 30 Sep 2025 21:42:54 +0700 Subject: [PATCH 012/119] Update fortify.yml Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> --- .github/workflows/fortify.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/fortify.yml b/.github/workflows/fortify.yml index e8a93615c1..ff1a25baf2 100644 --- a/.github/workflows/fortify.yml +++ b/.github/workflows/fortify.yml @@ -52,6 +52,7 @@ jobs: # required, you can use sub-actions like fortify/github-action/setup@v1 to set up the various Fortify tools # and run them directly from within your pipeline; see https://github.com/fortify/github-action#readme for # details. + - name: Run FoD SAST Scan uses: fortify/github-action@a92347297e02391b857e7015792cd1926a4cd418 with: From 1869b3baf439da0de1678be65434d56224b8b0be Mon Sep 17 00:00:00 2001 From: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Date: Tue, 7 Oct 2025 20:56:49 +0700 Subject: [PATCH 013/119] Potential fix for code scanning alert no. 84: Insecure randomness Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> --- packages/wallet/dapp-client/src/DappTransport.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/wallet/dapp-client/src/DappTransport.ts b/packages/wallet/dapp-client/src/DappTransport.ts index 072fa056f4..2dc898f746 100644 --- a/packages/wallet/dapp-client/src/DappTransport.ts +++ b/packages/wallet/dapp-client/src/DappTransport.ts @@ -513,6 +513,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(1); + window.crypto.getRandomValues(array); + const randStr = array[0].toString(36); + return `${Date.now().toString(36)}-${randStr}`; } } From d9fee1911012e066f39ded7079765f59cbdb2247 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 11 Oct 2025 00:07:52 +0000 Subject: [PATCH 014/119] Bump the npm_and_yarn group across 3 directories with 1 update Bumps the npm_and_yarn group with 1 update in the / directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/dapp-client directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/wdk directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 17.6.3 to 20.0.0 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.0) Updates `happy-dom` from 17.6.3 to 20.0.0 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.0) Updates `happy-dom` from 17.6.3 to 20.0.0 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.0) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.0 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.0 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.0 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] --- packages/wallet/dapp-client/package.json | 2 +- packages/wallet/wdk/package.json | 2 +- pnpm-lock.yaml | 67 +++++++++++++----------- 3 files changed, 39 insertions(+), 32 deletions(-) diff --git a/packages/wallet/dapp-client/package.json b/packages/wallet/dapp-client/package.json index c48f42aea8..8f22720508 100644 --- a/packages/wallet/dapp-client/package.json +++ b/packages/wallet/dapp-client/package.json @@ -25,7 +25,7 @@ "@vitest/coverage-v8": "^3.2.4", "dotenv": "^16.5.0", "fake-indexeddb": "^6.0.1", - "happy-dom": "^17.2.2", + "happy-dom": "^20.0.0", "typescript": "^5.8.3", "vitest": "^3.2.1" }, diff --git a/packages/wallet/wdk/package.json b/packages/wallet/wdk/package.json index 5b786b0fea..a50117564b 100644 --- a/packages/wallet/wdk/package.json +++ b/packages/wallet/wdk/package.json @@ -27,7 +27,7 @@ "@vitest/coverage-v8": "^3.2.4", "dotenv": "^16.5.0", "fake-indexeddb": "^6.0.1", - "happy-dom": "^17.2.2", + "happy-dom": "^20.0.0", "typescript": "^5.8.3", "vitest": "^3.2.1" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 494683100a..7907c4d8be 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -136,7 +136,7 @@ importers: version: 5.8.3 vitest: specifier: ^3.2.1 - version: 3.2.4(@types/node@22.16.5)(happy-dom@17.6.3) + version: 3.2.4(@types/node@22.16.5)(happy-dom@20.0.0) packages/services/identity-instrument: dependencies: @@ -161,7 +161,7 @@ importers: version: 5.8.3 vitest: specifier: ^3.2.1 - version: 3.2.4(@types/node@22.16.5)(happy-dom@17.6.3) + version: 3.2.4(@types/node@22.16.5)(happy-dom@20.0.0) packages/services/indexer: devDependencies: @@ -252,7 +252,7 @@ importers: version: 22.16.5 '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@22.16.5)(happy-dom@17.6.3)) + version: 3.2.4(vitest@3.2.4(@types/node@22.16.5)(happy-dom@20.0.0)) dotenv: specifier: ^16.5.0 version: 16.6.1 @@ -264,7 +264,7 @@ importers: version: 5.8.3 vitest: specifier: ^3.2.1 - version: 3.2.4(@types/node@22.16.5)(happy-dom@17.6.3) + version: 3.2.4(@types/node@22.16.5)(happy-dom@20.0.0) packages/wallet/dapp-client: dependencies: @@ -289,7 +289,7 @@ importers: version: 22.16.5 '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@22.16.5)(happy-dom@17.6.3)) + version: 3.2.4(vitest@3.2.4(@types/node@22.16.5)(happy-dom@20.0.0)) dotenv: specifier: ^16.5.0 version: 16.6.1 @@ -297,14 +297,14 @@ importers: specifier: ^6.0.1 version: 6.0.1 happy-dom: - specifier: ^17.2.2 - version: 17.6.3 + specifier: ^20.0.0 + version: 20.0.0 typescript: specifier: ^5.8.3 version: 5.8.3 vitest: specifier: ^3.2.1 - version: 3.2.4(@types/node@22.16.5)(happy-dom@17.6.3) + version: 3.2.4(@types/node@22.16.5)(happy-dom@20.0.0) packages/wallet/primitives: dependencies: @@ -317,13 +317,13 @@ importers: version: link:../../../repo/typescript-config '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@22.16.5)(happy-dom@17.6.3)) + version: 3.2.4(vitest@3.2.4(@types/node@22.16.5)(happy-dom@20.0.0)) typescript: specifier: ^5.8.3 version: 5.8.3 vitest: specifier: ^3.2.1 - version: 3.2.4(@types/node@22.16.5)(happy-dom@17.6.3) + version: 3.2.4(@types/node@22.16.5)(happy-dom@20.0.0) packages/wallet/primitives-cli: dependencies: @@ -400,7 +400,7 @@ importers: version: 22.16.5 '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@22.16.5)(happy-dom@17.6.3)) + version: 3.2.4(vitest@3.2.4(@types/node@22.16.5)(happy-dom@20.0.0)) dotenv: specifier: ^16.5.0 version: 16.6.1 @@ -408,14 +408,14 @@ importers: specifier: ^6.0.1 version: 6.0.1 happy-dom: - specifier: ^17.2.2 - version: 17.6.3 + specifier: ^20.0.0 + version: 20.0.0 typescript: specifier: ^5.8.3 version: 5.8.3 vitest: specifier: ^3.2.1 - version: 3.2.4(@types/node@22.16.5)(happy-dom@17.6.3) + version: 3.2.4(@types/node@22.16.5)(happy-dom@20.0.0) repo/eslint-config: devDependencies: @@ -1213,6 +1213,9 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + '@types/node@20.19.20': + resolution: {integrity: sha512-2Q7WS25j4pS1cS8yw3d6buNCVJukOTeQ39bAnwR6sOJbaxvyCGebzTMypDFN82CxBLnl+lSWVdCCWbRY6y9yZQ==} + '@types/node@20.19.9': resolution: {integrity: sha512-cuVNgarYWZqxRJDQHEB58GEONhOK79QVR/qYx4S7kcUObQvUwvFnYxJuuHUKm2aieN9X3yZB4LZsuYNU1Qphsw==} @@ -1240,6 +1243,9 @@ packages: '@types/tinycolor2@1.4.6': resolution: {integrity: sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw==} + '@types/whatwg-mimetype@3.0.2': + resolution: {integrity: sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==} + '@types/yargs-parser@21.0.3': resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} @@ -2086,8 +2092,8 @@ packages: engines: {node: '>=0.4.7'} hasBin: true - happy-dom@17.6.3: - resolution: {integrity: sha512-UVIHeVhxmxedbWPCfgS55Jg2rDfwf2BCKeylcPSqazLz5w3Kri7Q4xdBJubsr/+VUzFLh0VjIvh13RaDA2/Xug==} + happy-dom@20.0.0: + resolution: {integrity: sha512-GkWnwIFxVGCf2raNrxImLo397RdGhLapj5cT3R2PT7FwL62Ze1DROhzmYW7+J3p9105DYMVenEejEbnq5wA37w==} engines: {node: '>=20.0.0'} has-bigints@1.1.0: @@ -3535,10 +3541,6 @@ packages: wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - webidl-conversions@7.0.0: - resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} - engines: {node: '>=12'} - whatwg-mimetype@3.0.0: resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} engines: {node: '>=12'} @@ -4275,7 +4277,7 @@ snapshots: '@types/glob@7.2.0': dependencies: '@types/minimatch': 6.0.0 - '@types/node': 20.19.9 + '@types/node': 22.16.5 '@types/inquirer@6.5.0': dependencies: @@ -4290,6 +4292,10 @@ snapshots: '@types/node@12.20.55': {} + '@types/node@20.19.20': + dependencies: + undici-types: 6.21.0 + '@types/node@20.19.9': dependencies: undici-types: 6.21.0 @@ -4320,10 +4326,12 @@ snapshots: '@types/through@0.0.33': dependencies: - '@types/node': 20.19.9 + '@types/node': 22.16.5 '@types/tinycolor2@1.4.6': {} + '@types/whatwg-mimetype@3.0.2': {} + '@types/yargs-parser@21.0.3': {} '@types/yargs@17.0.33': @@ -4423,7 +4431,7 @@ snapshots: '@typescript-eslint/types': 8.38.0 eslint-visitor-keys: 4.2.1 - '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/node@22.16.5)(happy-dom@17.6.3))': + '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/node@22.16.5)(happy-dom@20.0.0))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -4438,7 +4446,7 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/node@22.16.5)(happy-dom@17.6.3) + vitest: 3.2.4(@types/node@22.16.5)(happy-dom@20.0.0) transitivePeerDependencies: - supports-color @@ -5440,9 +5448,10 @@ snapshots: optionalDependencies: uglify-js: 3.19.3 - happy-dom@17.6.3: + happy-dom@20.0.0: dependencies: - webidl-conversions: 7.0.0 + '@types/node': 20.19.20 + '@types/whatwg-mimetype': 3.0.2 whatwg-mimetype: 3.0.0 has-bigints@1.1.0: {} @@ -6967,7 +6976,7 @@ snapshots: '@types/node': 22.16.5 fsevents: 2.3.3 - vitest@3.2.4(@types/node@22.16.5)(happy-dom@17.6.3): + vitest@3.2.4(@types/node@22.16.5)(happy-dom@20.0.0): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 @@ -6994,7 +7003,7 @@ snapshots: why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.16.5 - happy-dom: 17.6.3 + happy-dom: 20.0.0 transitivePeerDependencies: - jiti - less @@ -7013,8 +7022,6 @@ snapshots: dependencies: defaults: 1.0.4 - webidl-conversions@7.0.0: {} - whatwg-mimetype@3.0.0: {} which-boxed-primitive@1.1.1: From 0f335ff07e250786031528b06b11793267dd5010 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 17 Oct 2025 03:23:17 +0700 Subject: [PATCH 015/119] Bump happy-dom in the npm_and_yarn group across 1 directory (#69) Bumps the npm_and_yarn group with 1 update in the / directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 20.0.0 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v20.0.0...v20.0.2) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- packages/wallet/dapp-client/package.json | 2 +- packages/wallet/wdk/package.json | 2 +- pnpm-lock.yaml | 50 ++++++++++++------------ 3 files changed, 27 insertions(+), 27 deletions(-) diff --git a/packages/wallet/dapp-client/package.json b/packages/wallet/dapp-client/package.json index 8f22720508..b10524e429 100644 --- a/packages/wallet/dapp-client/package.json +++ b/packages/wallet/dapp-client/package.json @@ -25,7 +25,7 @@ "@vitest/coverage-v8": "^3.2.4", "dotenv": "^16.5.0", "fake-indexeddb": "^6.0.1", - "happy-dom": "^20.0.0", + "happy-dom": "^20.0.2", "typescript": "^5.8.3", "vitest": "^3.2.1" }, diff --git a/packages/wallet/wdk/package.json b/packages/wallet/wdk/package.json index a50117564b..05e0a91710 100644 --- a/packages/wallet/wdk/package.json +++ b/packages/wallet/wdk/package.json @@ -27,7 +27,7 @@ "@vitest/coverage-v8": "^3.2.4", "dotenv": "^16.5.0", "fake-indexeddb": "^6.0.1", - "happy-dom": "^20.0.0", + "happy-dom": "^20.0.2", "typescript": "^5.8.3", "vitest": "^3.2.1" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7907c4d8be..450d5be82a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -136,7 +136,7 @@ importers: version: 5.8.3 vitest: specifier: ^3.2.1 - version: 3.2.4(@types/node@22.16.5)(happy-dom@20.0.0) + version: 3.2.4(@types/node@22.16.5)(happy-dom@20.0.2) packages/services/identity-instrument: dependencies: @@ -161,7 +161,7 @@ importers: version: 5.8.3 vitest: specifier: ^3.2.1 - version: 3.2.4(@types/node@22.16.5)(happy-dom@20.0.0) + version: 3.2.4(@types/node@22.16.5)(happy-dom@20.0.2) packages/services/indexer: devDependencies: @@ -252,7 +252,7 @@ importers: version: 22.16.5 '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@22.16.5)(happy-dom@20.0.0)) + version: 3.2.4(vitest@3.2.4(@types/node@22.16.5)(happy-dom@20.0.2)) dotenv: specifier: ^16.5.0 version: 16.6.1 @@ -264,7 +264,7 @@ importers: version: 5.8.3 vitest: specifier: ^3.2.1 - version: 3.2.4(@types/node@22.16.5)(happy-dom@20.0.0) + version: 3.2.4(@types/node@22.16.5)(happy-dom@20.0.2) packages/wallet/dapp-client: dependencies: @@ -289,7 +289,7 @@ importers: version: 22.16.5 '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@22.16.5)(happy-dom@20.0.0)) + version: 3.2.4(vitest@3.2.4(@types/node@22.16.5)(happy-dom@20.0.2)) dotenv: specifier: ^16.5.0 version: 16.6.1 @@ -297,14 +297,14 @@ importers: specifier: ^6.0.1 version: 6.0.1 happy-dom: - specifier: ^20.0.0 - version: 20.0.0 + specifier: ^20.0.2 + version: 20.0.2 typescript: specifier: ^5.8.3 version: 5.8.3 vitest: specifier: ^3.2.1 - version: 3.2.4(@types/node@22.16.5)(happy-dom@20.0.0) + version: 3.2.4(@types/node@22.16.5)(happy-dom@20.0.2) packages/wallet/primitives: dependencies: @@ -317,13 +317,13 @@ importers: version: link:../../../repo/typescript-config '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@22.16.5)(happy-dom@20.0.0)) + version: 3.2.4(vitest@3.2.4(@types/node@22.16.5)(happy-dom@20.0.2)) typescript: specifier: ^5.8.3 version: 5.8.3 vitest: specifier: ^3.2.1 - version: 3.2.4(@types/node@22.16.5)(happy-dom@20.0.0) + version: 3.2.4(@types/node@22.16.5)(happy-dom@20.0.2) packages/wallet/primitives-cli: dependencies: @@ -400,7 +400,7 @@ importers: version: 22.16.5 '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@22.16.5)(happy-dom@20.0.0)) + version: 3.2.4(vitest@3.2.4(@types/node@22.16.5)(happy-dom@20.0.2)) dotenv: specifier: ^16.5.0 version: 16.6.1 @@ -408,14 +408,14 @@ importers: specifier: ^6.0.1 version: 6.0.1 happy-dom: - specifier: ^20.0.0 - version: 20.0.0 + specifier: ^20.0.2 + version: 20.0.2 typescript: specifier: ^5.8.3 version: 5.8.3 vitest: specifier: ^3.2.1 - version: 3.2.4(@types/node@22.16.5)(happy-dom@20.0.0) + version: 3.2.4(@types/node@22.16.5)(happy-dom@20.0.2) repo/eslint-config: devDependencies: @@ -1213,8 +1213,8 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@20.19.20': - resolution: {integrity: sha512-2Q7WS25j4pS1cS8yw3d6buNCVJukOTeQ39bAnwR6sOJbaxvyCGebzTMypDFN82CxBLnl+lSWVdCCWbRY6y9yZQ==} + '@types/node@20.19.21': + resolution: {integrity: sha512-CsGG2P3I5y48RPMfprQGfy4JPRZ6csfC3ltBZSRItG3ngggmNY/qs2uZKp4p9VbrpqNNSMzUZNFZKzgOGnd/VA==} '@types/node@20.19.9': resolution: {integrity: sha512-cuVNgarYWZqxRJDQHEB58GEONhOK79QVR/qYx4S7kcUObQvUwvFnYxJuuHUKm2aieN9X3yZB4LZsuYNU1Qphsw==} @@ -2092,8 +2092,8 @@ packages: engines: {node: '>=0.4.7'} hasBin: true - happy-dom@20.0.0: - resolution: {integrity: sha512-GkWnwIFxVGCf2raNrxImLo397RdGhLapj5cT3R2PT7FwL62Ze1DROhzmYW7+J3p9105DYMVenEejEbnq5wA37w==} + happy-dom@20.0.2: + resolution: {integrity: sha512-pYOyu624+6HDbY+qkjILpQGnpvZOusItCk+rvF5/V+6NkcgTKnbOldpIy22tBnxoaLtlM9nXgoqAcW29/B7CIw==} engines: {node: '>=20.0.0'} has-bigints@1.1.0: @@ -4292,7 +4292,7 @@ snapshots: '@types/node@12.20.55': {} - '@types/node@20.19.20': + '@types/node@20.19.21': dependencies: undici-types: 6.21.0 @@ -4431,7 +4431,7 @@ snapshots: '@typescript-eslint/types': 8.38.0 eslint-visitor-keys: 4.2.1 - '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/node@22.16.5)(happy-dom@20.0.0))': + '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/node@22.16.5)(happy-dom@20.0.2))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -4446,7 +4446,7 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/node@22.16.5)(happy-dom@20.0.0) + vitest: 3.2.4(@types/node@22.16.5)(happy-dom@20.0.2) transitivePeerDependencies: - supports-color @@ -5448,9 +5448,9 @@ snapshots: optionalDependencies: uglify-js: 3.19.3 - happy-dom@20.0.0: + happy-dom@20.0.2: dependencies: - '@types/node': 20.19.20 + '@types/node': 20.19.21 '@types/whatwg-mimetype': 3.0.2 whatwg-mimetype: 3.0.0 @@ -6976,7 +6976,7 @@ snapshots: '@types/node': 22.16.5 fsevents: 2.3.3 - vitest@3.2.4(@types/node@22.16.5)(happy-dom@20.0.0): + vitest@3.2.4(@types/node@22.16.5)(happy-dom@20.0.2): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 @@ -7003,7 +7003,7 @@ snapshots: why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.16.5 - happy-dom: 20.0.0 + happy-dom: 20.0.2 transitivePeerDependencies: - jiti - less From 8f663e9f31752a42d5732ca2b8cb43ba7df77ff8 Mon Sep 17 00:00:00 2001 From: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Date: Thu, 16 Oct 2025 20:31:39 +0000 Subject: [PATCH 016/119] Create SECURITY.md for security policy (#70) * Create SECURITY.md for security policy Add a security policy document outlining supported versions and vulnerability reporting. Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- SECURITY.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 SECURITY.md diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000000..9578d289d2 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,18 @@ +# 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 | +| ------- | ------------------ | +| 3.x.x | :white_check_mark: | +| 2.x.x | :x: | +| < 2.0.0 | :x: | + +## Reporting a Vulnerability + +We take all security vulnerabilities seriously. To report a security vulnerability, please send an email with the details to `security@sequence.xyz`. + +You can expect a response from our team within 48 hours to acknowledge receipt of your report. If the vulnerability is accepted, we will work with you to coordinate a release and public disclosure. We appreciate your efforts to responsibly disclose your findings. From d332645806c8e2ab6c7f728ff489ab8c3e90cebd Mon Sep 17 00:00:00 2001 From: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Date: Fri, 17 Oct 2025 05:10:42 +0700 Subject: [PATCH 017/119] Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> --- SECURITY.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SECURITY.md b/SECURITY.md index 9578d289d2..6036e354a3 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -13,6 +13,6 @@ currently being supported with security updates. ## Reporting a Vulnerability -We take all security vulnerabilities seriously. To report a security vulnerability, please send an email with the details to `security@sequence.xyz`. +We take all security vulnerabilities seriously. To report a security vulnerability, please send an email with the details to [security@sequence.xyz](mailto:security@sequence.xyz). You can expect a response from our team within 48 hours to acknowledge receipt of your report. If the vulnerability is accepted, we will work with you to coordinate a release and public disclosure. We appreciate your efforts to responsibly disclose your findings. From df864712f933306e3a60153795961cf6b0f8b4f4 Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Sat, 25 Oct 2025 18:30:53 +0000 Subject: [PATCH 018/119] 0xsequence/master (#79) * Create fortify.yml * Update issue templates * Update CNAME * fix: upgrade @tanstack/react-query from 5.45.1 to 5.64.2 Snyk has created this PR to upgrade @tanstack/react-query from 5.45.1 to 5.64.2. See this package in npm: @tanstack/react-query See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr * Create config.yml (#46) Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update fortify.yml Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update .github/ISSUE_TEMPLATE/bug_report.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update .github/ISSUE_TEMPLATE/feature_request.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: snyk-bot Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- .circleci/config.yml | 26 +++++++ .github/ISSUE_TEMPLATE/bug_report.md | 38 ++++++++++ .github/ISSUE_TEMPLATE/custom.md | 10 +++ .github/ISSUE_TEMPLATE/feature_request.md | 20 ++++++ .github/workflows/fortify.yml | 85 +++++++++++++++++++++++ CNAME | 2 +- wagmi-project/package.json | 2 +- 7 files changed, 181 insertions(+), 2 deletions(-) create mode 100644 .circleci/config.yml create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/custom.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/workflows/fortify.yml diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 0000000000..709c9a7474 --- /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/hardhat-project/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/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000000..81c7b58d88 --- /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 0000000000..48d5f81fa4 --- /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 0000000000..36014cde56 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: 'enhancement' +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/.github/workflows/fortify.yml b/.github/workflows/fortify.yml new file mode 100644 index 0000000000..ff1a25baf2 --- /dev/null +++ b/.github/workflows/fortify.yml @@ -0,0 +1,85 @@ +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. + +################################################################################################################################################ +# Fortify Application Security provides your team with solutions to empower DevSecOps practices, enable cloud transformation, and secure your # +# software supply chain. To learn more about Fortify, start a free trial or contact our sales team, visit fortify.com. # +# # +# Use this starter workflow as a basis for integrating Fortify Application Security Testing into your GitHub workflows. This template # +# demonstrates the steps to package the code+dependencies, initiate a scan, and optionally import SAST vulnerabilities into GitHub Security # +# Code Scanning Alerts. Additional information is available in the workflow comments and the Fortify AST Action / fcli / Fortify product # +# documentation. If you need additional assistance, please contact Fortify support. # +################################################################################################################################################ + +name: Fortify AST Scan + +# Customize trigger events based on your DevSecOps process and/or policy +on: + push: + branches: [ "master" ] + pull_request: + # The branches below must be a subset of the branches above + branches: [ "master" ] + schedule: + - cron: '31 12 * * 4' + workflow_dispatch: + +jobs: + Fortify-AST-Scan: + # Use the appropriate runner for building your source code. Ensure dev tools required to build your code are present and configured appropriately (MSBuild, Python, etc). + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + security-events: write + + steps: + # Check out source code + - name: Check Out Source Code + uses: actions/checkout@v4 + + # Java is required to run the various Fortify utilities. Ensuring proper version is installed on the runner. + - name: Setup Java + uses: actions/setup-java@v4 + with: + java-version: 17 + distribution: 'temurin' + + # Perform SAST and optionally SCA scan via Fortify on Demand/Fortify Hosted/Software Security Center, then + # optionally export SAST results to the GitHub code scanning dashboard. In case further customization is + # required, you can use sub-actions like fortify/github-action/setup@v1 to set up the various Fortify tools + # and run them directly from within your pipeline; see https://github.com/fortify/github-action#readme for + # details. + + - name: Run FoD SAST Scan + uses: fortify/github-action@a92347297e02391b857e7015792cd1926a4cd418 + with: + sast-scan: true + env: + ### Required configuration when integrating with Fortify on Demand + FOD_URL: https://ams.fortify.com + FOD_TENANT: ${{secrets.FOD_TENANT}} + FOD_USER: ${{secrets.FOD_USER}} + FOD_PASSWORD: ${{secrets.FOD_PAT}} + ### Optional configuration when integrating with Fortify on Demand + # EXTRA_PACKAGE_OPTS: -oss # Extra 'scancentral package' options, like '-oss'' if + # Debricked SCA scan is enabled on Fortify on Demand + # EXTRA_FOD_LOGIN_OPTS: --socket-timeout=60s # Extra 'fcli fod session login' options + # FOD_RELEASE: MyApp:MyRelease # FoD release name, default: /:; may + # replace app+release name with numeric release ID + # DO_WAIT: true # Wait for scan completion, implied if 'DO_EXPORT: true' + # DO_EXPORT: true # Export SAST results to GitHub code scanning dashboard + ### Required configuration when integrating with Fortify Hosted / Software Security Center & ScanCentral + # SSC_URL: ${{secrets.SSC_URL}} # SSC URL + # SSC_TOKEN: ${{secrets.SSC_TOKEN}} # SSC CIToken or AutomationToken + # SC_SAST_TOKEN: ${{secrets.SC_SAST_TOKEN}} # ScanCentral SAST client auth token + # SC_SAST_SENSOR_VERSION: ${{vars.SC_SAST_SENSOR_VERSION}} # Sensor version on which to run the scan; + # usually defined as organization or repo variable + ### Optional configuration when integrating with Fortify Hosted / Software Security Center & ScanCentral + # EXTRA_SC_SAST_LOGIN_OPTS: --socket-timeout=60s # Extra 'fcli sc-sast session login' options + # SSC_APPVERSION: MyApp:MyVersion # SSC application version, default: /: + # EXTRA_PACKAGE_OPTS: -bv myCustomPom.xml # Extra 'scancentral package' options + # DO_WAIT: true # Wait for scan completion, implied if 'DO_EXPORT: true' + # DO_EXPORT: true # Export SAST results to GitHub code scanning dashboard diff --git a/CNAME b/CNAME index c9903e895b..aa0085b19f 100644 --- a/CNAME +++ b/CNAME @@ -1 +1 @@ -wagmi-project-two.vercel.app \ No newline at end of file +sequence.app \ No newline at end of file diff --git a/wagmi-project/package.json b/wagmi-project/package.json index 298a76bbc6..206445bb31 100644 --- a/wagmi-project/package.json +++ b/wagmi-project/package.json @@ -10,7 +10,7 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/react-query": "5.45.1", + "@tanstack/react-query": "5.64.2", "react": "^18.3.1", "react-dom": "^18.3.1", "viem": "latest", From 82e7a65eea3c83c35fb4a4967c7684e5a0141570 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 25 Oct 2025 19:17:10 +0000 Subject: [PATCH 019/119] Bump the npm_and_yarn group across 3 directories with 1 update Bumps the npm_and_yarn group with 1 update in the / directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/dapp-client directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/wdk directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] --- packages/wallet/dapp-client/package.json | 2 +- packages/wallet/wdk/package.json | 2 +- pnpm-lock.yaml | 67 +++++++++++++----------- 3 files changed, 39 insertions(+), 32 deletions(-) diff --git a/packages/wallet/dapp-client/package.json b/packages/wallet/dapp-client/package.json index c48f42aea8..b10524e429 100644 --- a/packages/wallet/dapp-client/package.json +++ b/packages/wallet/dapp-client/package.json @@ -25,7 +25,7 @@ "@vitest/coverage-v8": "^3.2.4", "dotenv": "^16.5.0", "fake-indexeddb": "^6.0.1", - "happy-dom": "^17.2.2", + "happy-dom": "^20.0.2", "typescript": "^5.8.3", "vitest": "^3.2.1" }, diff --git a/packages/wallet/wdk/package.json b/packages/wallet/wdk/package.json index 5b786b0fea..05e0a91710 100644 --- a/packages/wallet/wdk/package.json +++ b/packages/wallet/wdk/package.json @@ -27,7 +27,7 @@ "@vitest/coverage-v8": "^3.2.4", "dotenv": "^16.5.0", "fake-indexeddb": "^6.0.1", - "happy-dom": "^17.2.2", + "happy-dom": "^20.0.2", "typescript": "^5.8.3", "vitest": "^3.2.1" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 494683100a..17a890312c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -136,7 +136,7 @@ importers: version: 5.8.3 vitest: specifier: ^3.2.1 - version: 3.2.4(@types/node@22.16.5)(happy-dom@17.6.3) + version: 3.2.4(@types/node@22.16.5)(happy-dom@20.0.2) packages/services/identity-instrument: dependencies: @@ -161,7 +161,7 @@ importers: version: 5.8.3 vitest: specifier: ^3.2.1 - version: 3.2.4(@types/node@22.16.5)(happy-dom@17.6.3) + version: 3.2.4(@types/node@22.16.5)(happy-dom@20.0.2) packages/services/indexer: devDependencies: @@ -252,7 +252,7 @@ importers: version: 22.16.5 '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@22.16.5)(happy-dom@17.6.3)) + version: 3.2.4(vitest@3.2.4(@types/node@22.16.5)(happy-dom@20.0.2)) dotenv: specifier: ^16.5.0 version: 16.6.1 @@ -264,7 +264,7 @@ importers: version: 5.8.3 vitest: specifier: ^3.2.1 - version: 3.2.4(@types/node@22.16.5)(happy-dom@17.6.3) + version: 3.2.4(@types/node@22.16.5)(happy-dom@20.0.2) packages/wallet/dapp-client: dependencies: @@ -289,7 +289,7 @@ importers: version: 22.16.5 '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@22.16.5)(happy-dom@17.6.3)) + version: 3.2.4(vitest@3.2.4(@types/node@22.16.5)(happy-dom@20.0.2)) dotenv: specifier: ^16.5.0 version: 16.6.1 @@ -297,14 +297,14 @@ importers: specifier: ^6.0.1 version: 6.0.1 happy-dom: - specifier: ^17.2.2 - version: 17.6.3 + specifier: ^20.0.2 + version: 20.0.2 typescript: specifier: ^5.8.3 version: 5.8.3 vitest: specifier: ^3.2.1 - version: 3.2.4(@types/node@22.16.5)(happy-dom@17.6.3) + version: 3.2.4(@types/node@22.16.5)(happy-dom@20.0.2) packages/wallet/primitives: dependencies: @@ -317,13 +317,13 @@ importers: version: link:../../../repo/typescript-config '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@22.16.5)(happy-dom@17.6.3)) + version: 3.2.4(vitest@3.2.4(@types/node@22.16.5)(happy-dom@20.0.2)) typescript: specifier: ^5.8.3 version: 5.8.3 vitest: specifier: ^3.2.1 - version: 3.2.4(@types/node@22.16.5)(happy-dom@17.6.3) + version: 3.2.4(@types/node@22.16.5)(happy-dom@20.0.2) packages/wallet/primitives-cli: dependencies: @@ -400,7 +400,7 @@ importers: version: 22.16.5 '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@22.16.5)(happy-dom@17.6.3)) + version: 3.2.4(vitest@3.2.4(@types/node@22.16.5)(happy-dom@20.0.2)) dotenv: specifier: ^16.5.0 version: 16.6.1 @@ -408,14 +408,14 @@ importers: specifier: ^6.0.1 version: 6.0.1 happy-dom: - specifier: ^17.2.2 - version: 17.6.3 + specifier: ^20.0.2 + version: 20.0.2 typescript: specifier: ^5.8.3 version: 5.8.3 vitest: specifier: ^3.2.1 - version: 3.2.4(@types/node@22.16.5)(happy-dom@17.6.3) + version: 3.2.4(@types/node@22.16.5)(happy-dom@20.0.2) repo/eslint-config: devDependencies: @@ -1213,6 +1213,9 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + '@types/node@20.19.23': + resolution: {integrity: sha512-yIdlVVVHXpmqRhtyovZAcSy0MiPcYWGkoO4CGe/+jpP0hmNuihm4XhHbADpK++MsiLHP5MVlv+bcgdF99kSiFQ==} + '@types/node@20.19.9': resolution: {integrity: sha512-cuVNgarYWZqxRJDQHEB58GEONhOK79QVR/qYx4S7kcUObQvUwvFnYxJuuHUKm2aieN9X3yZB4LZsuYNU1Qphsw==} @@ -1240,6 +1243,9 @@ packages: '@types/tinycolor2@1.4.6': resolution: {integrity: sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw==} + '@types/whatwg-mimetype@3.0.2': + resolution: {integrity: sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==} + '@types/yargs-parser@21.0.3': resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} @@ -2086,8 +2092,8 @@ packages: engines: {node: '>=0.4.7'} hasBin: true - happy-dom@17.6.3: - resolution: {integrity: sha512-UVIHeVhxmxedbWPCfgS55Jg2rDfwf2BCKeylcPSqazLz5w3Kri7Q4xdBJubsr/+VUzFLh0VjIvh13RaDA2/Xug==} + happy-dom@20.0.2: + resolution: {integrity: sha512-pYOyu624+6HDbY+qkjILpQGnpvZOusItCk+rvF5/V+6NkcgTKnbOldpIy22tBnxoaLtlM9nXgoqAcW29/B7CIw==} engines: {node: '>=20.0.0'} has-bigints@1.1.0: @@ -3535,10 +3541,6 @@ packages: wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - webidl-conversions@7.0.0: - resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} - engines: {node: '>=12'} - whatwg-mimetype@3.0.0: resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} engines: {node: '>=12'} @@ -4275,7 +4277,7 @@ snapshots: '@types/glob@7.2.0': dependencies: '@types/minimatch': 6.0.0 - '@types/node': 20.19.9 + '@types/node': 22.16.5 '@types/inquirer@6.5.0': dependencies: @@ -4290,6 +4292,10 @@ snapshots: '@types/node@12.20.55': {} + '@types/node@20.19.23': + dependencies: + undici-types: 6.21.0 + '@types/node@20.19.9': dependencies: undici-types: 6.21.0 @@ -4320,10 +4326,12 @@ snapshots: '@types/through@0.0.33': dependencies: - '@types/node': 20.19.9 + '@types/node': 22.16.5 '@types/tinycolor2@1.4.6': {} + '@types/whatwg-mimetype@3.0.2': {} + '@types/yargs-parser@21.0.3': {} '@types/yargs@17.0.33': @@ -4423,7 +4431,7 @@ snapshots: '@typescript-eslint/types': 8.38.0 eslint-visitor-keys: 4.2.1 - '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/node@22.16.5)(happy-dom@17.6.3))': + '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/node@22.16.5)(happy-dom@20.0.2))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -4438,7 +4446,7 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/node@22.16.5)(happy-dom@17.6.3) + vitest: 3.2.4(@types/node@22.16.5)(happy-dom@20.0.2) transitivePeerDependencies: - supports-color @@ -5440,9 +5448,10 @@ snapshots: optionalDependencies: uglify-js: 3.19.3 - happy-dom@17.6.3: + happy-dom@20.0.2: dependencies: - webidl-conversions: 7.0.0 + '@types/node': 20.19.23 + '@types/whatwg-mimetype': 3.0.2 whatwg-mimetype: 3.0.0 has-bigints@1.1.0: {} @@ -6967,7 +6976,7 @@ snapshots: '@types/node': 22.16.5 fsevents: 2.3.3 - vitest@3.2.4(@types/node@22.16.5)(happy-dom@17.6.3): + vitest@3.2.4(@types/node@22.16.5)(happy-dom@20.0.2): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 @@ -6994,7 +7003,7 @@ snapshots: why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.16.5 - happy-dom: 17.6.3 + happy-dom: 20.0.2 transitivePeerDependencies: - jiti - less @@ -7013,8 +7022,6 @@ snapshots: dependencies: defaults: 1.0.4 - webidl-conversions@7.0.0: {} - whatwg-mimetype@3.0.0: {} which-boxed-primitive@1.1.1: From ffd17e627c539e2ddc61a77c5cb5350bb88b05b1 Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Fri, 14 Nov 2025 14:18:21 +0700 Subject: [PATCH 020/119] Update tests.yml (#82) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --- .github/workflows/tests.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index d49eea9495..7d5edbd5f8 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -9,6 +9,7 @@ jobs: steps: - uses: actions/checkout@v3 - uses: ./.github/actions/install-dependencies + - run: pnpm install --no-frozen-lockfile build: name: Run build From 6fde7c5442d58576167654dc015751fda1054ad0 Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Fri, 14 Nov 2025 16:03:27 +0700 Subject: [PATCH 021/119] Update SECURITY.md Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --- SECURITY.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/SECURITY.md b/SECURITY.md index 6036e354a3..7f1c49926a 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -2,8 +2,7 @@ ## Supported Versions -Use this section to tell people about which versions of your project are -currently being supported with security updates. +The following table lists which versions of this project currently receive security updates. | Version | Supported | | ------- | ------------------ | From ccb30b372385d09569a9ddd74522597d07a06d90 Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Fri, 14 Nov 2025 16:08:56 +0700 Subject: [PATCH 022/119] Update packages/wallet/dapp-client/src/DappTransport.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --- packages/wallet/dapp-client/src/DappTransport.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/wallet/dapp-client/src/DappTransport.ts b/packages/wallet/dapp-client/src/DappTransport.ts index 2dc898f746..a01494695b 100644 --- a/packages/wallet/dapp-client/src/DappTransport.ts +++ b/packages/wallet/dapp-client/src/DappTransport.ts @@ -514,9 +514,9 @@ export class DappTransport { private generateId(): string { // Use crypto.getRandomValues for cryptographically secure randomness - const array = new Uint32Array(1); + const array = new Uint32Array(2); window.crypto.getRandomValues(array); - const randStr = array[0].toString(36); + const randStr = (array[0].toString(36) + array[1].toString(36)).slice(0, 9); return `${Date.now().toString(36)}-${randStr}`; } } From b50b3e9e67c5e1614b486c09f942e68bfb24a4a5 Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Fri, 14 Nov 2025 16:43:44 +0700 Subject: [PATCH 023/119] Update package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --- package.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/package.json b/package.json index 0d6a359ce2..dd0a9df8df 100644 --- a/package.json +++ b/package.json @@ -71,8 +71,7 @@ "eslint-plugin-prettier": "^5.0.1", "ethers": "^5.7.2", "express": "^4.19.2", - "hardhat": "^2.20.1", - "express": "^4.18.2", + "express": "^4.19.2", "hardhat": "^2.22.7", "husky": "^8.0.0", "mocha": "^10.1.0", From 896e2851b472351bd8c95766b342163ff5734494 Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Fri, 14 Nov 2025 16:44:17 +0700 Subject: [PATCH 024/119] Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --- SECURITY.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/SECURITY.md b/SECURITY.md index 034e848032..0d8ac2906e 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -16,6 +16,4 @@ currently being supported with security updates. Use this section to tell people how to report a vulnerability. -Tell them where to go, how often they can expect to get an update on a -reported vulnerability, what to expect if the vulnerability is accepted or -declined, etc. +Tell them to email security@example.com, and they can expect an initial response within 48 hours. We will provide regular updates on the status of the reported vulnerability. From 74f382b510e0a9ef652ad1668e336576ffad3007 Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Fri, 14 Nov 2025 16:44:43 +0700 Subject: [PATCH 025/119] Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --- wagmi-project/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wagmi-project/package.json b/wagmi-project/package.json index 206445bb31..4018e35766 100644 --- a/wagmi-project/package.json +++ b/wagmi-project/package.json @@ -13,8 +13,8 @@ "@tanstack/react-query": "5.64.2", "react": "^18.3.1", "react-dom": "^18.3.1", - "viem": "latest", - "wagmi": "latest" + "viem": "^2.x", + "wagmi": "^0.x.x" }, "devDependencies": { "@biomejs/biome": "^1.8.0", From 08616b0ec4a64c977c08a697616bd43003864e49 Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Fri, 14 Nov 2025 16:45:04 +0700 Subject: [PATCH 026/119] Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --- wagmi-project/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wagmi-project/package.json b/wagmi-project/package.json index 4018e35766..759987dd10 100644 --- a/wagmi-project/package.json +++ b/wagmi-project/package.json @@ -21,7 +21,7 @@ "@types/react": "^18.3.1", "@types/react-dom": "^18.3.0", "@vitejs/plugin-react": "^4.2.1", - "@wagmi/cli": "latest", + "@wagmi/cli": "^0.x.x", "buffer": "^6.0.3", "typescript": "^5.4.5", "vite": "^5.2.11" From 69327efed3424eab1568955dc1d5ebdd83c637dd Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Fri, 14 Nov 2025 16:45:31 +0700 Subject: [PATCH 027/119] Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --- wagmi-project/src/App.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wagmi-project/src/App.tsx b/wagmi-project/src/App.tsx index faa8ce1c79..1cf0716bd0 100644 --- a/wagmi-project/src/App.tsx +++ b/wagmi-project/src/App.tsx @@ -13,7 +13,7 @@ function App() {
status: {account.status}
- addresses: {JSON.stringify(account.addresses)} + addresses: {account.addresses?.map(addr =>
{addr}
)}
chainId: {account.chainId}
From 3487525d06c5da7be774f47e0daa76dfd023e94c Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Mon, 17 Nov 2025 18:35:09 +0700 Subject: [PATCH 028/119] Create FUNDING.json (#90) Enhancements: Include FUNDING.json to display GitHub sponsorship options in the repository Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --- FUNDING.json | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 FUNDING.json diff --git a/FUNDING.json b/FUNDING.json new file mode 100644 index 0000000000..cb7bbaf783 --- /dev/null +++ b/FUNDING.json @@ -0,0 +1,10 @@ +{ + "drips": { + "ethereum": { + "ownedBy": "0x9a72807e1BC8A5e1E178f51E26239d58F511EB3D" + } + }, + "opRetro": { + "projectId": "0x62408999652f3bfa1be746d256bf5a4eb4719b993d40f07d2d60aaebee015018" + } +} From 4fb3c51cb122a91e6193282c5e7303046c1a7fee Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Mon, 17 Nov 2025 18:52:27 +0700 Subject: [PATCH 029/119] Create config.yml (#91) Add initial CircleCI configuration to enable automated builds using a custom Docker executor and a defined workflow. Build: Add .circleci/config.yml with version 2.1 specification and custom Docker executor. CI: Define web3-defi-game-project job with checkout step. Set up my-custom-workflow to run the job. Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --- .circleci/config.yml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 .circleci/config.yml diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 0000000000..68b7dfb9fb --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,24 @@ +# 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/hardhat-project/environment-variables + username: $DOCKER_HUB_USER + password: $DOCKER_HUB_PASSWORD +jobs: + web3-defi-game-project-: + + executor: my-custom-executor + steps: + - checkout + +workflows: + my-custom-workflow: + jobs: + - web3-defi-game-project- From f3427844b10ece0c3a997657ffb6b49c8f14a77c Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Mon, 17 Nov 2025 19:47:56 +0700 Subject: [PATCH 030/119] Update App.tsx (#92) Summary by Sourcery Overhaul App.tsx to build a comprehensive Sequence Wallet demo application, replacing wagmi with Sequence SDK integration, adding environment/configuration management, rich wallet operations, and a structured UI with console output for interactive testing New Features: Replace wagmi-based hooks with @0xsequence wallet initialization and integration Add environment selection and dynamic wallet URLs via query parameters Implement connect, disconnect, open/close wallet and customizable connection settings Provide extensive demo actions including chain/network switching, account/balance queries, message signing, typed data signing, and transaction sending Introduce a console component and logging for viewing function outputs Add email-based auto-login via modal with validation Enhancements: Refactor UI to use design-system components and group actions thematically Initialize logger and configure default chain/network Memoize and listen to wallet events such as chain changes Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --- wagmi-project/src/App.tsx | 1380 +++++++++++++++++++++++++++++++++++-- 1 file changed, 1341 insertions(+), 39 deletions(-) diff --git a/wagmi-project/src/App.tsx b/wagmi-project/src/App.tsx index faa8ce1c79..05da5e5b34 100644 --- a/wagmi-project/src/App.tsx +++ b/wagmi-project/src/App.tsx @@ -1,46 +1,1348 @@ -import { useAccount, useConnect, useDisconnect } from 'wagmi' +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' -function App() { - const account = useAccount() - const { connectors, connect, status, error } = useConnect() - const { disconnect } = useDisconnect() +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) +const walletAppURL = urlParams.get('walletAppURL') ?? envConfig.walletUrl +const projectAccessKey = urlParams.get('projectAccessKey') ?? envConfig.projectAccessKey +const showProhibitedActions = urlParams.has('showProhibitedActions') + +const isCustom = walletAppURL !== envConfig.walletUrl || projectAccessKey !== envConfig.projectAccessKey + +if (walletAppURL && walletAppURL.length > 0) { + // Wallet can point to a custom wallet app url + // NOTICE: this is not needed, unless testing an alpha version of the wallet + sequence.initWallet(projectAccessKey, { defaultNetwork: defaultChainId, transports: { walletAppURL } }) +} else { + // Init the sequence wallet library at the top-level of your project with + // your designed default chain id + sequence.initWallet(projectAccessKey, { defaultNetwork: defaultChainId, transports: { walletAppURL } }) +} + +// App component +const App = () => { + const [consoleMsg, setConsoleMsg] = useState(null) + const [email, setEmail] = useState(null) + const [consoleLoading, setConsoleLoading] = useState(false) + const [isWalletConnected, setIsWalletConnected] = useState(false) + + const wallet = sequence.getWallet().getProvider() + + const [showChainId, setShowChainId] = useState(wallet.getChainId()) + const [isOpen, toggleModal] = useState(false) + const [warning, setWarning] = useState(false) + + useMemo(() => { + wallet.on('chainChanged', (chainId: string) => { + setShowChainId(Number(BigInt(chainId))) + }) + }, []) + + useEffect(() => { + setIsWalletConnected(wallet.isConnected()) + }, [wallet]) + + useEffect(() => { + consoleWelcomeMessage() + // eslint-disable-next-line + }, [isWalletConnected]) + + useEffect(() => { + // Wallet events + wallet.client.onOpen(() => { + console.log('wallet window opened') + }) + + wallet.client.onClose(() => { + console.log('wallet window closed') + }) + }, [wallet]) + + const defaultConnectOptions: ConnectOptions = { + app: 'Demo Dapp', + askForEmail: true + // keepWalletOpened: true, + } + + // Methods + const connect = async (connectOptions: ConnectOptions = { app: 'Demo dapp' }) => { + if (isWalletConnected) { + resetConsole() + appendConsoleLine('Wallet already connected!') + setConsoleLoading(false) + return + } + + connectOptions = { + ...defaultConnectOptions, + ...connectOptions, + settings: { + ...defaultConnectOptions.settings, + ...connectOptions.settings + } + } + + try { + resetConsole() + appendConsoleLine('Connecting') + const wallet = sequence.getWallet() + + const connectDetails = await wallet.connect(connectOptions) + + // Example of how to verify using ETHAuth via Sequence API + if (connectOptions.authorize && connectDetails.connected) { + let apiUrl = urlParams.get('apiUrl') + + if (!apiUrl || apiUrl.length === 0) { + apiUrl = DEFAULT_API_URL + } + + const api = new sequence.api.SequenceAPIClient(apiUrl) + // or just + // const api = new sequence.api.SequenceAPIClient('https://api.sequence.app') + + const { isValid } = await api.isValidETHAuthProof({ + chainId: connectDetails.chainId, + walletAddress: connectDetails.session.accountAddress, + ethAuthProofString: connectDetails.proof!.proofString + }) + + appendConsoleLine(`isValid (API)?: ${isValid}`) + } + + // Example of how to verify using ETHAuth directl on the client + if (connectOptions.authorize) { + const ethAuth = new ETHAuth() + + if (connectDetails.proof) { + const decodedProof = await ethAuth.decodeProof(connectDetails.proof.proofString, true) + + const isValid = await wallet.utils.isValidTypedDataSignature( + wallet.getAddress(), + connectDetails.proof.typedData, + decodedProof.signature, + Number(BigInt(connectDetails.chainId)) + ) + + appendConsoleLine(`connected using chainId: ${BigInt(connectDetails.chainId).toString()}`) + appendConsoleLine(`isValid (client)?: ${isValid}`) + } + } + + setConsoleLoading(false) + if (connectDetails.connected) { + appendConsoleLine('Wallet connected!') + appendConsoleLine(`shared email: ${connectDetails.email}`) + setIsWalletConnected(true) + } else { + appendConsoleLine('Failed to connect wallet - ' + connectDetails.error) + } + } catch (e) { + console.error(e) + consoleErrorMessage() + } + } + + const disconnect = () => { + const wallet = sequence.getWallet() + wallet.disconnect() + consoleWelcomeMessage() + setIsWalletConnected(false) + } + + const openWallet = () => { + const wallet = sequence.getWallet() + wallet.openWallet() + } + + const openWalletWithSettings = () => { + const wallet = sequence.getWallet() + + const settings: Settings = { + theme: 'light', + includedPaymentProviders: ['moonpay', 'ramp'], + defaultFundingCurrency: 'eth', + defaultPurchaseAmount: 400, + lockFundingCurrencyToDefault: false + } + + const intent: OpenWalletIntent = { + type: 'openWithOptions', + options: { + app: 'Demo Dapp', + settings + } + } + + const path = 'wallet/add-funds' + wallet.openWallet(path, intent) + } + + const closeWallet = () => { + const wallet = sequence.getWallet() + wallet.closeWallet() + } + + const isConnected = async () => { + resetConsole() + const wallet = sequence.getWallet() + appendConsoleLine(`isConnected?: ${wallet.isConnected()}`) + setConsoleLoading(false) + } + + const isOpened = async () => { + resetConsole() + const wallet = sequence.getWallet() + appendConsoleLine(`isOpened?: ${wallet.isOpened()}`) + setConsoleLoading(false) + } + + const getChainID = async () => { + try { + resetConsole() + + const topChainId = wallet.getChainId() + appendConsoleLine(`top chainId: ${topChainId}`) + + const provider = wallet.getProvider() + const providerChainId = provider!.getChainId() + appendConsoleLine(`provider.getChainId(): ${providerChainId}`) + + const signer = wallet.getSigner() + const signerChainId = await signer.getChainId() + appendConsoleLine(`signer.getChainId(): ${signerChainId}`) + + setConsoleLoading(false) + } catch (e) { + console.error(e) + consoleErrorMessage() + } + } + + const getAccounts = async () => { + try { + resetConsole() + + const wallet = sequence.getWallet() + const address = wallet.getAddress() + appendConsoleLine(`getAddress(): ${address}`) + + const provider = wallet.getProvider() + const accountList = provider.listAccounts() + appendConsoleLine(`accounts: ${JSON.stringify(accountList)}`) + + setConsoleLoading(false) + } catch (e) { + console.error(e) + consoleErrorMessage() + } + } + + const getBalance = async () => { + try { + resetConsole() + + const wallet = sequence.getWallet() + + const provider = wallet.getProvider() + const account = wallet.getAddress() + const balanceChk1 = await provider!.getBalance(account) + appendConsoleLine(`balance check 1: ${balanceChk1.toString()}`) + + const signer = wallet.getSigner() + const balanceChk2 = await signer.getBalance() + appendConsoleLine(`balance check 2: ${balanceChk2.toString()}`) + + setConsoleLoading(false) + } catch (e) { + console.error(e) + consoleErrorMessage() + } + } + + const getNetworks = async () => { + try { + resetConsole() + + const wallet = sequence.getWallet() + const networks = await wallet.getNetworks() + + appendConsoleLine(`networks: ${JSON.stringify(networks, null, 2)}`) + setConsoleLoading(false) + } catch (e) { + console.error(e) + consoleErrorMessage() + } + } + + const signMessageString = async () => { + try { + resetConsole() + + const wallet = sequence.getWallet() + + appendConsoleLine('signing message...') + const signer = wallet.getSigner() + + const message = `1915 Robert Frost +The Road Not Taken + +Two roads diverged in a yellow wood, +And sorry I could not travel both +And be one traveler, long I stood +And looked down one as far as I could +To where it bent in the undergrowth + +Then took the other, as just as fair, +And having perhaps the better claim, +Because it was grassy and wanted wear +Though as for that the passing there +Had worn them really about the same, + +And both that morning equally lay +In leaves no step had trodden black. +Oh, I kept the first for another day! +Yet knowing how way leads on to way, +I doubted if I should ever come back. + +I shall be telling this with a sigh +Somewhere ages and ages hence: +Two roads diverged in a wood, and I— +I took the one less traveled by, +And that has made all the difference. + +\u2601 \u2600 \u2602` + + // sign + const sig = await signer.signMessage(message) + appendConsoleLine(`signature: ${sig}`) + + const isValid = await wallet.utils.isValidMessageSignature(wallet.getAddress(), message, sig, await signer.getChainId()) + appendConsoleLine(`isValid?: ${isValid}`) + if (!isValid) throw new Error('sig invalid') + + setConsoleLoading(false) + } catch (e) { + console.error(e) + consoleErrorMessage() + } + } + + const signMessageHex = async () => { + try { + resetConsole() + + const wallet = sequence.getWallet() + + appendConsoleLine('signing message...') + const signer = wallet.getSigner() + + // Message in hex + const message = ethers.hexlify(ethers.toUtf8Bytes('Hello, world!')) + + // sign + const sig = await signer.signMessage(message) + appendConsoleLine(`signature: ${sig}`) + + const isValid = await wallet.utils.isValidMessageSignature(wallet.getAddress(), message, sig, await signer.getChainId()) + appendConsoleLine(`isValid?: ${isValid}`) + if (!isValid) throw new Error('sig invalid') + + setConsoleLoading(false) + } catch (e) { + console.error(e) + consoleErrorMessage() + } + } + + const signMessageBytes = async () => { + try { + resetConsole() + + const wallet = sequence.getWallet() + + appendConsoleLine('signing message...') + const signer = wallet.getSigner() + + // Message in hex + const message = ethers.toUtf8Bytes('Hello, world!') + + // sign + const sig = await signer.signMessage(message) + appendConsoleLine(`signature: ${sig}`) + + const isValid = await wallet.utils.isValidMessageSignature(wallet.getAddress(), message, sig, await signer.getChainId()) + appendConsoleLine(`isValid?: ${isValid}`) + if (!isValid) throw new Error('sig invalid') + + setConsoleLoading(false) + } catch (e) { + console.error(e) + consoleErrorMessage() + } + } + + const signTypedData = async () => { + try { + resetConsole() + const wallet = sequence.getWallet() + + appendConsoleLine('signing typedData...') + + const typedData: sequence.utils.TypedData = { + types: { + Person: [ + { name: 'name', type: 'string' }, + { name: 'wallet', type: 'address' } + ], + Mail: [ + { name: 'from', type: 'Person' }, + { name: 'to', type: 'Person' }, + { name: 'cc', type: 'Person[]' }, + { name: 'contents', type: 'string' }, + { name: 'attachements', type: 'string[]' } + ] + }, + primaryType: 'Mail', + domain: { + name: 'Ether Mail', + version: '1', + chainId: 1, + verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC' + }, + message: { + from: { + name: 'Cow', + wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826' + }, + to: { + name: 'Bob', + wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB' + }, + cc: [ + { name: 'Dev Team', wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB' }, + { name: 'Accounting', wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB' } + ], + contents: 'Hello, Bob!', + attachements: ['cat.png', 'dog.png'] + } + } + + const signer = wallet.getSigner() + + const sig = await signer.signTypedData(typedData.domain, typedData.types, typedData.message) + appendConsoleLine(`signature: ${sig}`) + + // validate + const isValid = await wallet.utils.isValidTypedDataSignature(wallet.getAddress(), typedData, sig, await signer.getChainId()) + appendConsoleLine(`isValid?: ${isValid}`) + + setConsoleLoading(false) + } catch (e) { + console.error(e) + consoleErrorMessage() + } + } + + const estimateUnwrapGas = async () => { + try { + resetConsole() + + const wallet = sequence.getWallet() + + const wmaticContractAddress = '0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270' + const wmaticInterface = new ethers.Interface(['function withdraw(uint256 amount)']) + + const tx: sequence.transactions.Transaction = { + to: wmaticContractAddress, + data: wmaticInterface.encodeFunctionData('withdraw', ['1000000000000000000']) + } + + const provider = wallet.getProvider() + const estimate = await provider.estimateGas(tx) + + appendConsoleLine(`estimated gas needed for wmatic withdrawal : ${estimate.toString()}`) + + setConsoleLoading(false) + } catch (e) { + console.error(e) + consoleErrorMessage() + } + } + + const sendETH = async (signer?: sequence.provider.SequenceSigner) => { + try { + resetConsole() + const wallet = sequence.getWallet() + + signer = signer || wallet.getSigner() + + appendConsoleLine(`Transfer txn on ${signer.getChainId()} chainId`) + + // NOTE: on mainnet, the balance will be of ETH value + // and on matic, the balance will be of MATIC value + + // Sending the funds to the wallet itself + // so we don't lose any funds ;-) + // (of course, you can send anywhere) + const toAddress = await signer.getAddress() + + const tx1: sequence.transactions.Transaction = { + delegateCall: false, + revertOnError: false, + gasLimit: '0x55555', + to: toAddress, + value: ethers.parseEther('1.234'), + data: '0x' + } + + const tx2: sequence.transactions.Transaction = { + delegateCall: false, + revertOnError: false, + gasLimit: '0x55555', + to: toAddress, + value: ethers.parseEther('0.4242'), + data: '0x' + } + + const provider = signer.provider + + const balance1 = await provider.getBalance(toAddress) + appendConsoleLine(`balance of ${toAddress}, before: ${balance1}`) + + const txnResp = await signer.sendTransaction([tx1, tx2]) + appendConsoleLine(`txnResponse: ${JSON.stringify(txnResp)}`) + + const balance2 = await provider.getBalance(toAddress) + appendConsoleLine(`balance of ${toAddress}, after: ${balance2}`) + + setConsoleLoading(false) + } catch (e) { + console.error(e) + consoleErrorMessage() + } + } + + const sendSepoliaUSDC = async (signer?: sequence.provider.SequenceSigner) => { + try { + resetConsole() + + const wallet = sequence.getWallet() + + signer = signer || wallet.getSigner() // select DefaultChain signer by default + + // Sending the funds to the wallet itself + // so we don't lose any funds ;-) + // (of course, you can send anywhere) + const toAddress = await signer.getAddress() + + const amount = ethers.parseUnits('1', 1) + + // (USDC address on Sepolia) + const usdcAddress = '0x07865c6e87b9f70255377e024ace6630c1eaa37f' + + const tx: sequence.transactions.Transaction = { + delegateCall: false, + revertOnError: false, + gasLimit: '0x55555', + to: usdcAddress, + value: 0, + data: new ethers.Interface(ERC_20_ABI).encodeFunctionData('transfer', [toAddress, toHexString(amount)]) + } + + const txnResp = await signer.sendTransaction([tx], { chainId: ChainId.SEPOLIA }) + appendConsoleLine(`txnResponse: ${JSON.stringify(txnResp)}`) + + setConsoleLoading(false) + } catch (e) { + console.error(e) + consoleErrorMessage() + } + } + + const sendDAI = async (signer?: sequence.provider.SequenceSigner) => { + try { + resetConsole() + + const wallet = sequence.getWallet() + + signer = signer || wallet.getSigner() // select DefaultChain signer by default + + // Sending the funds to the wallet itself + // so we don't lose any funds ;-) + // (of course, you can send anywhere) + const toAddress = await signer.getAddress() + + const amount = ethers.parseUnits('0.05', 18) + const daiContractAddress = '0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063' // (DAI address on Polygon) + + const tx: sequence.transactions.Transaction = { + delegateCall: false, + revertOnError: false, + gasLimit: '0x55555', + to: daiContractAddress, + value: 0, + data: new ethers.Interface(ERC_20_ABI).encodeFunctionData('transfer', [toAddress, toHexString(amount)]) + } + + const txnResp = await signer.sendTransaction([tx]) + appendConsoleLine(`txnResponse: ${JSON.stringify(txnResp)}`) + + setConsoleLoading(false) + } catch (e) { + console.error(e) + consoleErrorMessage() + } + } + + const sendETHSidechain = async () => { + try { + const wallet = sequence.getWallet() + + // Send either to Arbitrum or Optimism + // just pick one that is not the current chainId + const pick = wallet.getChainId() === ChainId.ARBITRUM ? ChainId.OPTIMISM : ChainId.ARBITRUM + sendETH(wallet.getSigner(pick)) + } catch (e) { + console.error(e) + consoleErrorMessage() + } + } + + const send1155Tokens = async () => { + try { + resetConsole() + appendConsoleLine('TODO') + setConsoleLoading(false) + } catch (e) { + console.error(e) + consoleErrorMessage() + } + } + + const contractExample = async (signer?: sequence.provider.SequenceSigner) => { + try { + resetConsole() + + const wallet = sequence.getWallet() + + signer = signer || wallet.getSigner() + + const abi = [ + 'function balanceOf(address owner) view returns (uint256)', + 'function decimals() view returns (uint8)', + 'function symbol() view returns (string)', + 'function transfer(address to, uint amount) returns (bool)', + 'event Transfer(address indexed from, address indexed to, uint amount)' + ] + + // USD Coin (PoS) on Polygon + const address = '0x2791bca1f2de4661ed88a30c99a7a9449aa84174' + + const usdc = new ethers.Contract(address, abi) + + const usdSymbol = await usdc.symbol() + appendConsoleLine(`Token symbol: ${usdSymbol}`) + + const balance = await usdc.balanceOf(await signer.getAddress()) + appendConsoleLine(`Token Balance: ${balance.toString()}`) + + setConsoleLoading(false) + } catch (e) { + console.error(e) + consoleErrorMessage() + } + } + + const fetchTokenBalances = async () => { + try { + resetConsole() + + const wallet = sequence.getWallet() + + const signer = wallet.getSigner() + const accountAddress = await signer.getAddress() + const networks = await wallet.getNetworks() + const network = networks.find(network => network.chainId === ChainId.POLYGON) + + if (!network) { + throw new Error(`Could not find Polygon network in networks list`) + } + + const indexer = new sequence.indexer.SequenceIndexer(network.indexerUrl) + + const tokenBalances = await indexer.getTokenBalances({ + accountAddress: accountAddress, + includeMetadata: true + }) + + appendConsoleLine(`tokens in your account: ${JSON.stringify(tokenBalances)}`) + + // NOTE: you can put any NFT/collectible address in the `contractAddress` field and it will return all of the balances + metadata. + // We use the Skyweaver production contract address here for demo purposes, but try another one :) + const skyweaverCollectibles = await indexer.getTokenBalances({ + accountAddress: accountAddress, + includeMetadata: true, + contractAddress: '0x631998e91476DA5B870D741192fc5Cbc55F5a52E' + }) + appendConsoleLine(`skyweaver collectibles in your account: ${JSON.stringify(skyweaverCollectibles)}`) + + setConsoleLoading(false) + } catch (e) { + console.error(e) + consoleErrorMessage() + } + } + + const updateImplementation = async (signer?: sequence.provider.SequenceSigner) => { + try { + resetConsole() + + const wallet = sequence.getWallet() + + signer = signer || wallet.getSigner() // select DefaultChain signer by default + + const transaction: sequence.transactions.Transaction = { + to: wallet.getAddress(), + data: new ethers.Interface(walletContracts.mainModule.abi).encodeFunctionData('updateImplementation', [ + ethers.ZeroAddress + ]) + } + + const response = await signer.sendTransaction(transaction) + appendConsoleLine(`response: ${JSON.stringify(response)}`) + setConsoleLoading(false) + } catch (e) { + console.error(e) + consoleErrorMessage() + } + } + + const updateImageHash = async (signer?: sequence.provider.SequenceSigner) => { + try { + resetConsole() + + const wallet = sequence.getWallet() + + signer = signer || wallet.getSigner() // select DefaultChain signer by default + + const transaction: sequence.transactions.Transaction = { + to: wallet.getAddress(), + data: new ethers.Interface(walletContracts.mainModuleUpgradable.abi).encodeFunctionData('updateImageHash', [ + ethers.ZeroHash + ]) + } + + const response = await signer.sendTransaction(transaction) + appendConsoleLine(`response: ${JSON.stringify(response)}`) + setConsoleLoading(false) + } catch (e) { + console.error(e) + consoleErrorMessage() + } + } + + const delegateCall = async (signer?: sequence.provider.SequenceSigner) => { + try { + resetConsole() + + const wallet = sequence.getWallet() + + signer = signer || wallet.getSigner() // select DefaultChain signer by default + + const transaction: sequence.transactions.Transaction = { + to: wallet.getAddress(), + delegateCall: true + } + + const response = await signer.sendTransaction(transaction) + appendConsoleLine(`response: ${JSON.stringify(response)}`) + setConsoleLoading(false) + } catch (e) { + console.error(e) + consoleErrorMessage() + } + } + + const addHook = async (signer?: sequence.provider.SequenceSigner) => { + try { + resetConsole() + + const wallet = sequence.getWallet() + + signer = signer || wallet.getSigner() // select DefaultChain signer by default + + const transaction: sequence.transactions.Transaction = { + to: wallet.getAddress(), + data: new ethers.Interface(['function addHook(bytes4 _signature, address _implementation)']).encodeFunctionData( + 'addHook', + ['0x01234567', ethers.ZeroAddress] + ) + } + + const response = await signer.sendTransaction(transaction) + appendConsoleLine(`response: ${JSON.stringify(response)}`) + setConsoleLoading(false) + } catch (e) { + console.error(e) + consoleErrorMessage() + } + } + + const setExtraImageHash = async (signer?: sequence.provider.SequenceSigner) => { + try { + resetConsole() + + const wallet = sequence.getWallet() + + signer = signer || wallet.getSigner() // select DefaultChain signer by default + + const transaction: sequence.transactions.Transaction = { + to: wallet.getAddress(), + data: new ethers.Interface(['function setExtraImageHash(bytes32 _imageHash, uint256 _expiration)']).encodeFunctionData( + 'setExtraImageHash', + [ethers.ZeroHash, ethers.MaxUint256] + ) + } + + const response = await signer.sendTransaction(transaction) + appendConsoleLine(`response: ${JSON.stringify(response)}`) + setConsoleLoading(false) + } catch (e) { + console.error(e) + consoleErrorMessage() + } + } + + const appendConsoleLine = (message: string, clear = false) => { + console.log(message) + + if (clear) { + return setConsoleMsg(message) + } + + return setConsoleMsg(prevState => { + return `${prevState}\n\n${message}` + }) + } + + const resetConsole = () => { + setConsoleLoading(true) + } + + const consoleWelcomeMessage = () => { + setConsoleLoading(false) + + if (isWalletConnected) { + setConsoleMsg('Status: Wallet is connected :)') + } else { + setConsoleMsg('Status: Wallet not connected. Please connect wallet first.') + } + } + + const consoleErrorMessage = () => { + setConsoleLoading(false) + setConsoleMsg('An error occurred') + } + + // networks list, filtered and sorted + const omitNetworks = [ + ChainId.RINKEBY, + ChainId.HARDHAT, + ChainId.HARDHAT_2, + ChainId.KOVAN, + ChainId.ROPSTEN, + ChainId.HOMEVERSE_TESTNET, + ChainId.BASE_GOERLI + ] + + const mainnets = Object.values(sequence.network.networks) + .filter(network => network.type === NetworkType.MAINNET) + .sort((a, b) => a.chainId - b.chainId) + const testnets = Object.values(sequence.network.networks) + .filter(network => network.type === NetworkType.TESTNET) + .sort((a, b) => a.chainId - b.chainId) + const networks = [...mainnets, ...testnets].filter(network => !network.deprecated && !omitNetworks.includes(network.chainId)) + + useEffect(() => { + if (email && !isOpen) { + console.log(email) + connect({ + app: 'Demo Dapp', + authorize: true, + settings: { + // Specify signInWithEmail with an email address to allow user automatically sign in with the email option. + signInWithEmail: email, + theme: 'dark', + bannerUrl: `${window.location.origin}${skyweaverBannerUrl}` + } + }) + setEmail(null) + } + }, [email, isOpen]) + + const sanitizeEmail = (email: string) => { + // Trim unnecessary spaces + email = email.trim() + + // Check if the email matches the pattern of a typical email + const emailRegex = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}$/ + if (emailRegex.test(email)) { + return true + } + + return false + } return ( - <> -
-

Account

- -
- status: {account.status} -
- addresses: {JSON.stringify(account.addresses)} -
- chainId: {account.chainId} -
- - {account.status === 'connected' && ( - + + + + 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) + })) + ]} + /> + + + +
- -
-

Connect

- {connectors.map((connector) => ( - - ))} -
{status}
-
{error?.message}
-
- + + + ) } -export default App +export default React.memo(App) From 2aa79b5db4559aebd1cdb379690303989dfe179f Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Thu, 20 Nov 2025 21:22:02 +0100 Subject: [PATCH 031/119] Update relayer.gen.ts and TransactionPrecondition interface --- .../relayer/src/preconditions/codec.ts | 71 +- .../relayer/src/preconditions/selectors.ts | 19 +- .../relayer/src/relayer/rpc-relayer/index.ts | 8 +- .../src/relayer/rpc-relayer/relayer.gen.ts | 1725 ++++++++++------- .../relayer/src/relayer/standard/eip6963.ts | 4 +- .../relayer/src/relayer/standard/local.ts | 6 +- .../relayer/src/relayer/standard/sequence.ts | 4 +- .../relayer/test/preconditions/codec.test.ts | 297 ++- .../test/preconditions/selectors.test.ts | 34 +- 9 files changed, 1184 insertions(+), 984 deletions(-) diff --git a/packages/services/relayer/src/preconditions/codec.ts b/packages/services/relayer/src/preconditions/codec.ts index a6c2a13f7e..74f83154be 100644 --- a/packages/services/relayer/src/preconditions/codec.ts +++ b/packages/services/relayer/src/preconditions/codec.ts @@ -10,12 +10,15 @@ import { Erc1155ApprovalPrecondition, } from './types.js' -export interface IntentPrecondition { +export interface TransactionPrecondition { type: string - data: string + chainId: number + ownerAddress: string + tokenAddress: string + minAmount: bigint } -export function decodePreconditions(preconditions: IntentPrecondition[]): Precondition[] { +export function decodePreconditions(preconditions: TransactionPrecondition[]): Precondition[] { const decodedPreconditions: Precondition[] = [] for (const p of preconditions) { @@ -28,7 +31,7 @@ export function decodePreconditions(preconditions: IntentPrecondition[]): Precon return decodedPreconditions } -export function decodePrecondition(p: IntentPrecondition): Precondition | undefined { +export function decodePrecondition(p: TransactionPrecondition): Precondition | undefined { if (!p) { return undefined } @@ -36,70 +39,64 @@ export function decodePrecondition(p: IntentPrecondition): Precondition | undefi let precondition: Precondition | undefined try { - const data = JSON.parse(p.data) - switch (p.type) { case 'native-balance': - precondition = new NativeBalancePrecondition( - Address.from(data.address), - data.min ? BigInt(data.min) : undefined, - data.max ? BigInt(data.max) : undefined, - ) + precondition = new NativeBalancePrecondition(Address.from(p.ownerAddress), p.minAmount, undefined) break case 'erc20-balance': precondition = new Erc20BalancePrecondition( - Address.from(data.address), - Address.from(data.token), - data.min ? BigInt(data.min) : undefined, - data.max ? BigInt(data.max) : undefined, + Address.from(p.ownerAddress), + Address.from(p.tokenAddress), + p.minAmount, + undefined, ) break case 'erc20-approval': precondition = new Erc20ApprovalPrecondition( - Address.from(data.address), - Address.from(data.token), - Address.from(data.operator), - BigInt(data.min), + Address.from(p.ownerAddress), + Address.from(p.tokenAddress), + Address.from(p.ownerAddress), + p.minAmount, ) break case 'erc721-ownership': precondition = new Erc721OwnershipPrecondition( - Address.from(data.address), - Address.from(data.token), - BigInt(data.tokenId), - data.owned, + Address.from(p.ownerAddress), + Address.from(p.tokenAddress), + BigInt(0), + true, ) break case 'erc721-approval': precondition = new Erc721ApprovalPrecondition( - Address.from(data.address), - Address.from(data.token), - BigInt(data.tokenId), - Address.from(data.operator), + Address.from(p.ownerAddress), + Address.from(p.tokenAddress), + BigInt(0), + Address.from(p.ownerAddress), ) break case 'erc1155-balance': precondition = new Erc1155BalancePrecondition( - Address.from(data.address), - Address.from(data.token), - BigInt(data.tokenId), - data.min ? BigInt(data.min) : undefined, - data.max ? BigInt(data.max) : undefined, + Address.from(p.ownerAddress), + Address.from(p.tokenAddress), + BigInt(0), + p.minAmount, + undefined, ) break case 'erc1155-approval': precondition = new Erc1155ApprovalPrecondition( - Address.from(data.address), - Address.from(data.token), - BigInt(data.tokenId), - Address.from(data.operator), - BigInt(data.min), + Address.from(p.ownerAddress), + Address.from(p.tokenAddress), + BigInt(0), + Address.from(p.ownerAddress), + p.minAmount, ) break diff --git a/packages/services/relayer/src/preconditions/selectors.ts b/packages/services/relayer/src/preconditions/selectors.ts index 42b8cbb3b8..d5985a8622 100644 --- a/packages/services/relayer/src/preconditions/selectors.ts +++ b/packages/services/relayer/src/preconditions/selectors.ts @@ -1,20 +1,15 @@ import { Precondition, NativeBalancePrecondition, Erc20BalancePrecondition } from './types.js' -import { IntentPrecondition, decodePreconditions } from './codec.js' +import { TransactionPrecondition, decodePreconditions } from './codec.js' -export function extractChainID(precondition: IntentPrecondition): number | undefined { +export function extractChainID(precondition: TransactionPrecondition): number | undefined { if (!precondition) { return undefined } - try { - const data = JSON.parse(precondition.data) - return data.chainID ? Number(data.chainID) : undefined - } catch (e) { - return undefined - } + return precondition.chainId } -export function extractSupportedPreconditions(preconditions: IntentPrecondition[]): Precondition[] { +export function extractSupportedPreconditions(preconditions: TransactionPrecondition[]): Precondition[] { if (!preconditions || preconditions.length === 0) { return [] } @@ -22,7 +17,9 @@ export function extractSupportedPreconditions(preconditions: IntentPrecondition[ return decodePreconditions(preconditions) } -export function extractNativeBalancePreconditions(preconditions: IntentPrecondition[]): NativeBalancePrecondition[] { +export function extractNativeBalancePreconditions( + preconditions: TransactionPrecondition[], +): NativeBalancePrecondition[] { if (!preconditions || preconditions.length === 0) { return [] } @@ -31,7 +28,7 @@ export function extractNativeBalancePreconditions(preconditions: IntentPrecondit return decoded.filter((p): p is NativeBalancePrecondition => p.type() === 'native-balance') } -export function extractERC20BalancePreconditions(preconditions: IntentPrecondition[]): Erc20BalancePrecondition[] { +export function extractERC20BalancePreconditions(preconditions: TransactionPrecondition[]): Erc20BalancePrecondition[] { if (!preconditions || preconditions.length === 0) { return [] } diff --git a/packages/services/relayer/src/relayer/rpc-relayer/index.ts b/packages/services/relayer/src/relayer/rpc-relayer/index.ts index 0768490c98..04db6aa40c 100644 --- a/packages/services/relayer/src/relayer/rpc-relayer/index.ts +++ b/packages/services/relayer/src/relayer/rpc-relayer/index.ts @@ -4,7 +4,7 @@ import { MetaTxn as RpcMetaTxn, FeeTokenType, FeeToken as RpcFeeToken, - IntentPrecondition, + TransactionPrecondition, ETHTxnStatus, } from './relayer.gen.js' import { Address, Hex, Bytes, AbiFunction } from 'ox' @@ -173,7 +173,7 @@ export class RpcRelayer implements Relayer { data: Hex.Hex, chainId: number, quote?: FeeQuote, - preconditions?: IntentPrecondition[], + preconditions?: TransactionPrecondition[], ): Promise<{ opHash: Hex.Hex }> { console.log('sendMetaTxn', walletAddress, to, data, chainId, quote, preconditions) const rpcCall: RpcMetaTxn = { @@ -204,7 +204,7 @@ export class RpcRelayer implements Relayer { data: Hex.Hex, chainId: number, quote?: FeeQuote, - preconditions?: IntentPrecondition[], + preconditions?: TransactionPrecondition[], ): Promise<{ opHash: Hex.Hex }> { console.log('relay', to, data, chainId, quote, preconditions) const rpcCall: RpcMetaTxn = { @@ -273,7 +273,7 @@ export class RpcRelayer implements Relayer { } } - async checkPrecondition(precondition: IntentPrecondition): Promise { + async checkPrecondition(precondition: TransactionPrecondition): Promise { const decoded = decodePrecondition(precondition) if (!decoded) { diff --git a/packages/services/relayer/src/relayer/rpc-relayer/relayer.gen.ts b/packages/services/relayer/src/relayer/rpc-relayer/relayer.gen.ts index 0638fbe946..ca5dbe9c82 100644 --- a/packages/services/relayer/src/relayer/rpc-relayer/relayer.gen.ts +++ b/packages/services/relayer/src/relayer/rpc-relayer/relayer.gen.ts @@ -1,73 +1,189 @@ /* eslint-disable */ -// sequence-relayer v0.4.1 93ac61641d0351211680e2092673726b5c4f1848 +// sequence-relayer v0.4.1 7f8a4b83b00e0b6849c76c2ff0e23931e26b3d9f // -- -// Code generated by webrpc-gen@v0.26.0 with typescript generator. DO NOT EDIT. +// Code generated by Webrpc-gen@v0.30.2 with typescript generator. DO NOT EDIT. // -// webrpc-gen -schema=relayer.ridl -target=typescript -client -out=./clients/relayer.gen.ts +// webrpc-gen -schema=relayer.ridl -target=typescript -client -out=./clients/relayer.gen.ts -compat -export const WebrpcHeader = 'Webrpc' - -export const WebrpcHeaderValue = 'webrpc@v0.26.0;gen-typescript@v0.17.0;sequence-relayer@v0.4.1' - -// WebRPC description and code-gen version -export const WebRPCVersion = 'v1' +// Webrpc description and code-gen version +export const WebrpcVersion = 'v1' // Schema version of your RIDL schema -export const WebRPCSchemaVersion = 'v0.4.1' +export const WebrpcSchemaVersion = 'v0.4.1' // Schema hash generated from your RIDL schema -export const WebRPCSchemaHash = '93ac61641d0351211680e2092673726b5c4f1848' +export const WebrpcSchemaHash = '7f8a4b83b00e0b6849c76c2ff0e23931e26b3d9f' -type WebrpcGenVersions = { - webrpcGenVersion: string - codeGenName: string - codeGenVersion: string - schemaName: string - schemaVersion: string -} +// +// Client interface +// -export function VersionFromHeader(headers: Headers): WebrpcGenVersions { - const headerValue = headers.get(WebrpcHeader) - if (!headerValue) { - return { - webrpcGenVersion: '', - codeGenName: '', - codeGenVersion: '', - schemaName: '', - schemaVersion: '', - } - } +export interface RelayerClient { + ping(headers?: object, signal?: AbortSignal): Promise - return parseWebrpcGenVersions(headerValue) -} + version(headers?: object, signal?: AbortSignal): Promise -function parseWebrpcGenVersions(header: string): WebrpcGenVersions { - const versions = header.split(';') - if (versions.length < 3) { - return { - webrpcGenVersion: '', - codeGenName: '', - codeGenVersion: '', - schemaName: '', - schemaVersion: '', - } - } + runtimeStatus(headers?: object, signal?: AbortSignal): Promise - const [_, webrpcGenVersion] = versions[0]!.split('@') - const [codeGenName, codeGenVersion] = versions[1]!.split('@') - const [schemaName, schemaVersion] = versions[2]!.split('@') + getSequenceContext(headers?: object, signal?: AbortSignal): Promise - return { - webrpcGenVersion: webrpcGenVersion ?? '', - codeGenName: codeGenName ?? '', - codeGenVersion: codeGenVersion ?? '', - schemaName: schemaName ?? '', - schemaVersion: schemaVersion ?? '', - } + getChainID(headers?: object, signal?: AbortSignal): Promise + + /** + * + * Transactions + * + * TODO (future): rename this to just, 'SendTransaction(txn: MetaTransaction)' or 'SendTransaction(txn: SignedTransaction)', or something.. + * Project ID is only used by service and admin calls. Other clients must have projectID passed via the context + * TODO: rename return txnHash: string to metaTxnID: string + */ + sendMetaTxn(req: SendMetaTxnArgs, headers?: object, signal?: AbortSignal): Promise + + getMetaTxnNonce(req: GetMetaTxnNonceArgs, headers?: object, signal?: AbortSignal): Promise + + /** + * TODO: one day, make GetMetaTxnReceipt respond immediately with receipt or not + * and add WaitTransactionReceipt method, which will block and wait, similar to how GetMetaTxnReceipt + * is implemented now. + * For backwards compat, we can leave the current GetMetaTxnReceipt how it is, an deprecate it, and introduce + * new, GetTransactionReceipt and WaitTransactionReceipt methods + * we can also accept metaTxnId and txnHash .. so can take either or.. I wonder if ERC-4337 has any convention on this? + */ + getMetaTxnReceipt( + req: GetMetaTxnReceiptArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + simulate(req: SimulateArgs, headers?: object, signal?: AbortSignal): Promise + + simulateV3(req: SimulateV3Args, headers?: object, signal?: AbortSignal): Promise + + /** + * TODO: deprecated, to be removed by https://github.com/0xsequence/stack/pull/356 at a later date + */ + updateMetaTxnGasLimits( + req: UpdateMetaTxnGasLimitsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + feeTokens(headers?: object, signal?: AbortSignal): Promise + + feeOptions(req: FeeOptionsArgs, headers?: object, signal?: AbortSignal): Promise + + /** + * TODO: deprecated, to be removed by https://github.com/0xsequence/stack/pull/356 at a later date + */ + getMetaTxnNetworkFeeOptions( + req: GetMetaTxnNetworkFeeOptionsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + getMetaTransactions( + req: GetMetaTransactionsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + getTransactionCost( + req: GetTransactionCostArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + /** + * Sent transactions from an account. If filter is omitted then it will return all transactions. + */ + sentTransactions(req: SentTransactionsArgs, headers?: object, signal?: AbortSignal): Promise + + /** + * Pending transactions waiting to be mined for an account. This endpoint is just a sugar of `SentTransactions` + * with the filter set to pending: true. + */ + pendingTransactions( + req: PendingTransactionsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + /** + * Legacy Gas Tank + */ + getGasTank(req: GetGasTankArgs, headers?: object, signal?: AbortSignal): Promise + + addGasTank(req: AddGasTankArgs, headers?: object, signal?: AbortSignal): Promise + + updateGasTank(req: UpdateGasTankArgs, headers?: object, signal?: AbortSignal): Promise + + /** + * Legacy Gas Adjustment + */ + nextGasTankBalanceAdjustmentNonce( + req: NextGasTankBalanceAdjustmentNonceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + adjustGasTankBalance( + req: AdjustGasTankBalanceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + getGasTankBalanceAdjustment( + req: GetGasTankBalanceAdjustmentArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + listGasTankBalanceAdjustments( + req: ListGasTankBalanceAdjustmentsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + /** + * Gas Sponsorship + */ + listGasSponsors(req: ListGasSponsorsArgs, headers?: object, signal?: AbortSignal): Promise + + getGasSponsor(req: GetGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise + + addGasSponsor(req: AddGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise + + updateGasSponsor(req: UpdateGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise + + removeGasSponsor(req: RemoveGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise + + /** + * Gas Sponsor Lookup + */ + addressGasSponsors( + req: AddressGasSponsorsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + /** + * Project Balance + */ + getProjectBalance( + req: GetProjectBalanceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + adjustProjectBalance( + req: AdjustProjectBalanceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise } // -// Types +// Schema types // export enum ETHTxnStatus { @@ -250,20 +366,10 @@ export interface MetaTxnReceiptLog { data: string } -export interface IntentPrecondition { - type: string - chainId: string - data: any -} - -export interface IntentSolution { - transactions: Array -} - export interface Transactions { chainID: string transactions: Array - preconditions?: Array + preconditions?: Array } export interface Transaction { @@ -275,6 +381,14 @@ export interface Transaction { data: string } +export interface TransactionPrecondition { + type: string + chainId: number + ownerAddress: string + tokenAddress: string + minAmount: bigint +} + export interface TxnLogUser { username: string } @@ -344,174 +458,48 @@ export interface SortBy { order: SortOrder } -export interface Relayer { - ping(headers?: object, signal?: AbortSignal): Promise - version(headers?: object, signal?: AbortSignal): Promise - runtimeStatus(headers?: object, signal?: AbortSignal): Promise - getSequenceContext(headers?: object, signal?: AbortSignal): Promise - getChainID(headers?: object, signal?: AbortSignal): Promise - /** - * - * Transactions - * - * TODO (future): rename this to just, 'SendTransaction(txn: MetaTransaction)' or 'SendTransaction(txn: SignedTransaction)', or something.. - * Project ID is only used by service and admin calls. Other clients must have projectID passed via the context - * TODO: rename return txnHash: string to metaTxnID: string - */ - sendMetaTxn(args: SendMetaTxnArgs, headers?: object, signal?: AbortSignal): Promise - getMetaTxnNonce(args: GetMetaTxnNonceArgs, headers?: object, signal?: AbortSignal): Promise - /** - * TODO: one day, make GetMetaTxnReceipt respond immediately with receipt or not - * and add WaitTransactionReceipt method, which will block and wait, similar to how GetMetaTxnReceipt - * is implemented now. - * For backwards compat, we can leave the current GetMetaTxnReceipt how it is, an deprecate it, and introduce - * new, GetTransactionReceipt and WaitTransactionReceipt methods - * we can also accept metaTxnId and txnHash .. so can take either or.. I wonder if ERC-4337 has any convention on this? - */ - getMetaTxnReceipt( - args: GetMetaTxnReceiptArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - simulate(args: SimulateArgs, headers?: object, signal?: AbortSignal): Promise - simulateV3(args: SimulateV3Args, headers?: object, signal?: AbortSignal): Promise - /** - * TODO: deprecated, to be removed by https://github.com/0xsequence/stack/pull/356 at a later date - */ - updateMetaTxnGasLimits( - args: UpdateMetaTxnGasLimitsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - feeTokens(headers?: object, signal?: AbortSignal): Promise - feeOptions(args: FeeOptionsArgs, headers?: object, signal?: AbortSignal): Promise - /** - * TODO: deprecated, to be removed by https://github.com/0xsequence/stack/pull/356 at a later date - */ - getMetaTxnNetworkFeeOptions( - args: GetMetaTxnNetworkFeeOptionsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - getMetaTransactions( - args: GetMetaTransactionsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - getTransactionCost( - args: GetTransactionCostArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - /** - * Sent transactions from an account. If filter is omitted then it will return all transactions. - */ - sentTransactions(args: SentTransactionsArgs, headers?: object, signal?: AbortSignal): Promise - /** - * Pending transactions waiting to be mined for an account. This endpoint is just a sugar of `SentTransactions` - * with the filter set to pending: true. - */ - pendingTransactions( - args: PendingTransactionsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - /** - * Legacy Gas Tank - */ - getGasTank(args: GetGasTankArgs, headers?: object, signal?: AbortSignal): Promise - addGasTank(args: AddGasTankArgs, headers?: object, signal?: AbortSignal): Promise - updateGasTank(args: UpdateGasTankArgs, headers?: object, signal?: AbortSignal): Promise - /** - * Legacy Gas Adjustment - */ - nextGasTankBalanceAdjustmentNonce( - args: NextGasTankBalanceAdjustmentNonceArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - adjustGasTankBalance( - args: AdjustGasTankBalanceArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - getGasTankBalanceAdjustment( - args: GetGasTankBalanceAdjustmentArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - listGasTankBalanceAdjustments( - args: ListGasTankBalanceAdjustmentsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - /** - * Gas Sponsorship - */ - listGasSponsors(args: ListGasSponsorsArgs, headers?: object, signal?: AbortSignal): Promise - getGasSponsor(args: GetGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise - addGasSponsor(args: AddGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise - updateGasSponsor(args: UpdateGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise - removeGasSponsor(args: RemoveGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise - /** - * Gas Sponsor Lookup - */ - addressGasSponsors( - args: AddressGasSponsorsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - /** - * Project Balance - */ - getProjectBalance( - args: GetProjectBalanceArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - adjustProjectBalance( - args: AdjustProjectBalanceArgs, - headers?: object, - signal?: AbortSignal, - ): Promise -} - export interface PingArgs {} export interface PingReturn { status: boolean } + export interface VersionArgs {} export interface VersionReturn { version: Version } + export interface RuntimeStatusArgs {} export interface RuntimeStatusReturn { status: RuntimeStatus } + export interface GetSequenceContextArgs {} export interface GetSequenceContextReturn { data: SequenceContext } + export interface GetChainIDArgs {} export interface GetChainIDReturn { chainID: number } + export interface SendMetaTxnArgs { call: MetaTxn quote?: string projectID?: number - preconditions?: Array + preconditions?: Array } export interface SendMetaTxnReturn { status: boolean txnHash: string } + export interface GetMetaTxnNonceArgs { walletContractAddress: string space?: string @@ -520,6 +508,7 @@ export interface GetMetaTxnNonceArgs { export interface GetMetaTxnNonceReturn { nonce: string } + export interface GetMetaTxnReceiptArgs { metaTxID: string } @@ -527,6 +516,7 @@ export interface GetMetaTxnReceiptArgs { export interface GetMetaTxnReceiptReturn { receipt: MetaTxnReceipt } + export interface SimulateArgs { wallet: string transactions: string @@ -535,6 +525,7 @@ export interface SimulateArgs { export interface SimulateReturn { results: Array } + export interface SimulateV3Args { wallet: string calls: string @@ -543,6 +534,7 @@ export interface SimulateV3Args { export interface SimulateV3Return { results: Array } + export interface UpdateMetaTxnGasLimitsArgs { walletAddress: string walletConfig: any @@ -552,6 +544,7 @@ export interface UpdateMetaTxnGasLimitsArgs { export interface UpdateMetaTxnGasLimitsReturn { payload: string } + export interface FeeTokensArgs {} export interface FeeTokensReturn { @@ -559,6 +552,7 @@ export interface FeeTokensReturn { tokens: Array paymentAddress: string } + export interface FeeOptionsArgs { wallet: string to: string @@ -571,6 +565,7 @@ export interface FeeOptionsReturn { sponsored: boolean quote?: string } + export interface GetMetaTxnNetworkFeeOptionsArgs { walletConfig: any payload: string @@ -579,6 +574,7 @@ export interface GetMetaTxnNetworkFeeOptionsArgs { export interface GetMetaTxnNetworkFeeOptionsReturn { options: Array } + export interface GetMetaTransactionsArgs { projectId: number page?: Page @@ -588,6 +584,7 @@ export interface GetMetaTransactionsReturn { page: Page transactions: Array } + export interface GetTransactionCostArgs { projectId: number from: string @@ -597,6 +594,7 @@ export interface GetTransactionCostArgs { export interface GetTransactionCostReturn { cost: number } + export interface SentTransactionsArgs { filter?: SentTransactionsFilter page?: Page @@ -606,6 +604,7 @@ export interface SentTransactionsReturn { page: Page transactions: Array } + export interface PendingTransactionsArgs { page?: Page } @@ -614,6 +613,7 @@ export interface PendingTransactionsReturn { page: Page transactions: Array } + export interface GetGasTankArgs { id: number } @@ -621,6 +621,7 @@ export interface GetGasTankArgs { export interface GetGasTankReturn { gasTank: GasTank } + export interface AddGasTankArgs { name: string feeMarkupFactor: number @@ -631,6 +632,7 @@ export interface AddGasTankReturn { status: boolean gasTank: GasTank } + export interface UpdateGasTankArgs { id: number name?: string @@ -642,6 +644,7 @@ export interface UpdateGasTankReturn { status: boolean gasTank: GasTank } + export interface NextGasTankBalanceAdjustmentNonceArgs { id: number } @@ -649,6 +652,7 @@ export interface NextGasTankBalanceAdjustmentNonceArgs { export interface NextGasTankBalanceAdjustmentNonceReturn { nonce: number } + export interface AdjustGasTankBalanceArgs { id: number nonce: number @@ -659,6 +663,7 @@ export interface AdjustGasTankBalanceReturn { status: boolean adjustment: GasTankBalanceAdjustment } + export interface GetGasTankBalanceAdjustmentArgs { id: number nonce: number @@ -667,6 +672,7 @@ export interface GetGasTankBalanceAdjustmentArgs { export interface GetGasTankBalanceAdjustmentReturn { adjustment: GasTankBalanceAdjustment } + export interface ListGasTankBalanceAdjustmentsArgs { id: number page?: Page @@ -676,6 +682,7 @@ export interface ListGasTankBalanceAdjustmentsReturn { page: Page adjustments: Array } + export interface ListGasSponsorsArgs { projectId: number page?: Page @@ -685,6 +692,7 @@ export interface ListGasSponsorsReturn { page: Page gasSponsors: Array } + export interface GetGasSponsorArgs { projectId: number id: number @@ -693,6 +701,7 @@ export interface GetGasSponsorArgs { export interface GetGasSponsorReturn { gasSponsor: GasSponsor } + export interface AddGasSponsorArgs { projectId: number address: string @@ -704,6 +713,7 @@ export interface AddGasSponsorReturn { status: boolean gasSponsor: GasSponsor } + export interface UpdateGasSponsorArgs { projectId: number id: number @@ -715,6 +725,7 @@ export interface UpdateGasSponsorReturn { status: boolean gasSponsor: GasSponsor } + export interface RemoveGasSponsorArgs { projectId: number id: number @@ -723,6 +734,7 @@ export interface RemoveGasSponsorArgs { export interface RemoveGasSponsorReturn { status: boolean } + export interface AddressGasSponsorsArgs { address: string page?: Page @@ -732,6 +744,7 @@ export interface AddressGasSponsorsReturn { page: Page gasSponsors: Array } + export interface GetProjectBalanceArgs { projectId: number } @@ -739,6 +752,7 @@ export interface GetProjectBalanceArgs { export interface GetProjectBalanceReturn { balance: number } + export interface AdjustProjectBalanceArgs { projectId: number amount: number @@ -752,7 +766,8 @@ export interface AdjustProjectBalanceReturn { // // Client // -export class Relayer implements Relayer { + +export class Relayer implements RelayerClient { protected hostname: string protected fetch: Fetch protected path = '/rpc/Relayer/' @@ -766,600 +781,695 @@ export class Relayer implements Relayer { return this.hostname + this.path + name } + queryKey = { + ping: () => ['Relayer', 'ping'] as const, + version: () => ['Relayer', 'version'] as const, + runtimeStatus: () => ['Relayer', 'runtimeStatus'] as const, + getSequenceContext: () => ['Relayer', 'getSequenceContext'] as const, + getChainID: () => ['Relayer', 'getChainID'] as const, + sendMetaTxn: (req: SendMetaTxnArgs) => ['Relayer', 'sendMetaTxn', req] as const, + getMetaTxnNonce: (req: GetMetaTxnNonceArgs) => ['Relayer', 'getMetaTxnNonce', req] as const, + getMetaTxnReceipt: (req: GetMetaTxnReceiptArgs) => ['Relayer', 'getMetaTxnReceipt', req] as const, + simulate: (req: SimulateArgs) => ['Relayer', 'simulate', req] as const, + simulateV3: (req: SimulateV3Args) => ['Relayer', 'simulateV3', req] as const, + updateMetaTxnGasLimits: (req: UpdateMetaTxnGasLimitsArgs) => ['Relayer', 'updateMetaTxnGasLimits', req] as const, + feeTokens: () => ['Relayer', 'feeTokens'] as const, + feeOptions: (req: FeeOptionsArgs) => ['Relayer', 'feeOptions', req] as const, + getMetaTxnNetworkFeeOptions: (req: GetMetaTxnNetworkFeeOptionsArgs) => + ['Relayer', 'getMetaTxnNetworkFeeOptions', req] as const, + getMetaTransactions: (req: GetMetaTransactionsArgs) => ['Relayer', 'getMetaTransactions', req] as const, + getTransactionCost: (req: GetTransactionCostArgs) => ['Relayer', 'getTransactionCost', req] as const, + sentTransactions: (req: SentTransactionsArgs) => ['Relayer', 'sentTransactions', req] as const, + pendingTransactions: (req: PendingTransactionsArgs) => ['Relayer', 'pendingTransactions', req] as const, + getGasTank: (req: GetGasTankArgs) => ['Relayer', 'getGasTank', req] as const, + addGasTank: (req: AddGasTankArgs) => ['Relayer', 'addGasTank', req] as const, + updateGasTank: (req: UpdateGasTankArgs) => ['Relayer', 'updateGasTank', req] as const, + nextGasTankBalanceAdjustmentNonce: (req: NextGasTankBalanceAdjustmentNonceArgs) => + ['Relayer', 'nextGasTankBalanceAdjustmentNonce', req] as const, + adjustGasTankBalance: (req: AdjustGasTankBalanceArgs) => ['Relayer', 'adjustGasTankBalance', req] as const, + getGasTankBalanceAdjustment: (req: GetGasTankBalanceAdjustmentArgs) => + ['Relayer', 'getGasTankBalanceAdjustment', req] as const, + listGasTankBalanceAdjustments: (req: ListGasTankBalanceAdjustmentsArgs) => + ['Relayer', 'listGasTankBalanceAdjustments', req] as const, + listGasSponsors: (req: ListGasSponsorsArgs) => ['Relayer', 'listGasSponsors', req] as const, + getGasSponsor: (req: GetGasSponsorArgs) => ['Relayer', 'getGasSponsor', req] as const, + addGasSponsor: (req: AddGasSponsorArgs) => ['Relayer', 'addGasSponsor', req] as const, + updateGasSponsor: (req: UpdateGasSponsorArgs) => ['Relayer', 'updateGasSponsor', req] as const, + removeGasSponsor: (req: RemoveGasSponsorArgs) => ['Relayer', 'removeGasSponsor', req] as const, + addressGasSponsors: (req: AddressGasSponsorsArgs) => ['Relayer', 'addressGasSponsors', req] as const, + getProjectBalance: (req: GetProjectBalanceArgs) => ['Relayer', 'getProjectBalance', req] as const, + adjustProjectBalance: (req: AdjustProjectBalanceArgs) => ['Relayer', 'adjustProjectBalance', req] as const, + } + ping = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('Ping'), createHTTPRequest({}, headers, signal)).then( + return this.fetch(this.url('Ping'), createHttpRequest('{}', headers, signal)).then( (res) => { return buildResponse(res).then((_data) => { - return { - status: _data.status, - } + return JsonDecode(_data, 'PingReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } version = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('Version'), createHTTPRequest({}, headers, signal)).then( + return this.fetch(this.url('Version'), createHttpRequest('{}', headers, signal)).then( (res) => { return buildResponse(res).then((_data) => { - return { - version: _data.version, - } + return JsonDecode(_data, 'VersionReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } runtimeStatus = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('RuntimeStatus'), createHTTPRequest({}, headers, signal)).then( + return this.fetch(this.url('RuntimeStatus'), createHttpRequest('{}', headers, signal)).then( (res) => { return buildResponse(res).then((_data) => { - return { - status: _data.status, - } + return JsonDecode(_data, 'RuntimeStatusReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } getSequenceContext = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('GetSequenceContext'), createHTTPRequest({}, headers, signal)).then( + return this.fetch(this.url('GetSequenceContext'), createHttpRequest('{}', headers, signal)).then( (res) => { return buildResponse(res).then((_data) => { - return { - data: _data.data, - } + return JsonDecode(_data, 'GetSequenceContextReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } getChainID = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('GetChainID'), createHTTPRequest({}, headers, signal)).then( + return this.fetch(this.url('GetChainID'), createHttpRequest('{}', headers, signal)).then( (res) => { return buildResponse(res).then((_data) => { - return { - chainID: _data.chainID, - } + return JsonDecode(_data, 'GetChainIDReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } - sendMetaTxn = (args: SendMetaTxnArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('SendMetaTxn'), createHTTPRequest(args, headers, signal)).then( + sendMetaTxn = (req: SendMetaTxnArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('SendMetaTxn'), + createHttpRequest(JsonEncode(req, 'SendMetaTxnArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - status: _data.status, - txnHash: _data.txnHash, - } + return JsonDecode(_data, 'SendMetaTxnReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } getMetaTxnNonce = ( - args: GetMetaTxnNonceArgs, + req: GetMetaTxnNonceArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('GetMetaTxnNonce'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('GetMetaTxnNonce'), + createHttpRequest(JsonEncode(req, 'GetMetaTxnNonceArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - nonce: _data.nonce, - } + return JsonDecode(_data, 'GetMetaTxnNonceReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } getMetaTxnReceipt = ( - args: GetMetaTxnReceiptArgs, + req: GetMetaTxnReceiptArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('GetMetaTxnReceipt'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('GetMetaTxnReceipt'), + createHttpRequest(JsonEncode(req, 'GetMetaTxnReceiptArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - receipt: _data.receipt, - } + return JsonDecode(_data, 'GetMetaTxnReceiptReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } - simulate = (args: SimulateArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('Simulate'), createHTTPRequest(args, headers, signal)).then( + simulate = (req: SimulateArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('Simulate'), createHttpRequest(JsonEncode(req, 'SimulateArgs'), headers, signal)).then( (res) => { return buildResponse(res).then((_data) => { - return { - results: >_data.results, - } + return JsonDecode(_data, 'SimulateReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } - simulateV3 = (args: SimulateV3Args, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('SimulateV3'), createHTTPRequest(args, headers, signal)).then( + simulateV3 = (req: SimulateV3Args, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('SimulateV3'), + createHttpRequest(JsonEncode(req, 'SimulateV3Args'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - results: >_data.results, - } + return JsonDecode(_data, 'SimulateV3Return') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } updateMetaTxnGasLimits = ( - args: UpdateMetaTxnGasLimitsArgs, + req: UpdateMetaTxnGasLimitsArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('UpdateMetaTxnGasLimits'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('UpdateMetaTxnGasLimits'), + createHttpRequest(JsonEncode(req, 'UpdateMetaTxnGasLimitsArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - payload: _data.payload, - } + return JsonDecode(_data, 'UpdateMetaTxnGasLimitsReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } feeTokens = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('FeeTokens'), createHTTPRequest({}, headers, signal)).then( + return this.fetch(this.url('FeeTokens'), createHttpRequest('{}', headers, signal)).then( (res) => { return buildResponse(res).then((_data) => { - return { - isFeeRequired: _data.isFeeRequired, - tokens: >_data.tokens, - paymentAddress: _data.paymentAddress, - } + return JsonDecode(_data, 'FeeTokensReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } - feeOptions = (args: FeeOptionsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('FeeOptions'), createHTTPRequest(args, headers, signal)).then( + feeOptions = (req: FeeOptionsArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('FeeOptions'), + createHttpRequest(JsonEncode(req, 'FeeOptionsArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - options: >_data.options, - sponsored: _data.sponsored, - quote: _data.quote, - } + return JsonDecode(_data, 'FeeOptionsReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } getMetaTxnNetworkFeeOptions = ( - args: GetMetaTxnNetworkFeeOptionsArgs, + req: GetMetaTxnNetworkFeeOptionsArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('GetMetaTxnNetworkFeeOptions'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('GetMetaTxnNetworkFeeOptions'), + createHttpRequest(JsonEncode(req, 'GetMetaTxnNetworkFeeOptionsArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - options: >_data.options, - } + return JsonDecode(_data, 'GetMetaTxnNetworkFeeOptionsReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } getMetaTransactions = ( - args: GetMetaTransactionsArgs, + req: GetMetaTransactionsArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('GetMetaTransactions'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('GetMetaTransactions'), + createHttpRequest(JsonEncode(req, 'GetMetaTransactionsArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - page: _data.page, - transactions: >_data.transactions, - } + return JsonDecode(_data, 'GetMetaTransactionsReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } getTransactionCost = ( - args: GetTransactionCostArgs, + req: GetTransactionCostArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('GetTransactionCost'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('GetTransactionCost'), + createHttpRequest(JsonEncode(req, 'GetTransactionCostArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - cost: _data.cost, - } + return JsonDecode(_data, 'GetTransactionCostReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } sentTransactions = ( - args: SentTransactionsArgs, + req: SentTransactionsArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('SentTransactions'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('SentTransactions'), + createHttpRequest(JsonEncode(req, 'SentTransactionsArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - page: _data.page, - transactions: >_data.transactions, - } + return JsonDecode(_data, 'SentTransactionsReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } pendingTransactions = ( - args: PendingTransactionsArgs, + req: PendingTransactionsArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('PendingTransactions'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('PendingTransactions'), + createHttpRequest(JsonEncode(req, 'PendingTransactionsArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - page: _data.page, - transactions: >_data.transactions, - } + return JsonDecode(_data, 'PendingTransactionsReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } - getGasTank = (args: GetGasTankArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('GetGasTank'), createHTTPRequest(args, headers, signal)).then( + getGasTank = (req: GetGasTankArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('GetGasTank'), + createHttpRequest(JsonEncode(req, 'GetGasTankArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - gasTank: _data.gasTank, - } + return JsonDecode(_data, 'GetGasTankReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } - addGasTank = (args: AddGasTankArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('AddGasTank'), createHTTPRequest(args, headers, signal)).then( + addGasTank = (req: AddGasTankArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('AddGasTank'), + createHttpRequest(JsonEncode(req, 'AddGasTankArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - status: _data.status, - gasTank: _data.gasTank, - } + return JsonDecode(_data, 'AddGasTankReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } - updateGasTank = (args: UpdateGasTankArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('UpdateGasTank'), createHTTPRequest(args, headers, signal)).then( + updateGasTank = (req: UpdateGasTankArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('UpdateGasTank'), + createHttpRequest(JsonEncode(req, 'UpdateGasTankArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - status: _data.status, - gasTank: _data.gasTank, - } + return JsonDecode(_data, 'UpdateGasTankReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } nextGasTankBalanceAdjustmentNonce = ( - args: NextGasTankBalanceAdjustmentNonceArgs, + req: NextGasTankBalanceAdjustmentNonceArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('NextGasTankBalanceAdjustmentNonce'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('NextGasTankBalanceAdjustmentNonce'), + createHttpRequest(JsonEncode(req, 'NextGasTankBalanceAdjustmentNonceArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - nonce: _data.nonce, - } + return JsonDecode(_data, 'NextGasTankBalanceAdjustmentNonceReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } adjustGasTankBalance = ( - args: AdjustGasTankBalanceArgs, + req: AdjustGasTankBalanceArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('AdjustGasTankBalance'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('AdjustGasTankBalance'), + createHttpRequest(JsonEncode(req, 'AdjustGasTankBalanceArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - status: _data.status, - adjustment: _data.adjustment, - } + return JsonDecode(_data, 'AdjustGasTankBalanceReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } getGasTankBalanceAdjustment = ( - args: GetGasTankBalanceAdjustmentArgs, + req: GetGasTankBalanceAdjustmentArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('GetGasTankBalanceAdjustment'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('GetGasTankBalanceAdjustment'), + createHttpRequest(JsonEncode(req, 'GetGasTankBalanceAdjustmentArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - adjustment: _data.adjustment, - } + return JsonDecode(_data, 'GetGasTankBalanceAdjustmentReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } listGasTankBalanceAdjustments = ( - args: ListGasTankBalanceAdjustmentsArgs, + req: ListGasTankBalanceAdjustmentsArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('ListGasTankBalanceAdjustments'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('ListGasTankBalanceAdjustments'), + createHttpRequest(JsonEncode(req, 'ListGasTankBalanceAdjustmentsArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - page: _data.page, - adjustments: >_data.adjustments, - } + return JsonDecode(_data, 'ListGasTankBalanceAdjustmentsReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } listGasSponsors = ( - args: ListGasSponsorsArgs, + req: ListGasSponsorsArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('ListGasSponsors'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('ListGasSponsors'), + createHttpRequest(JsonEncode(req, 'ListGasSponsorsArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - page: _data.page, - gasSponsors: >_data.gasSponsors, - } + return JsonDecode(_data, 'ListGasSponsorsReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } - getGasSponsor = (args: GetGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('GetGasSponsor'), createHTTPRequest(args, headers, signal)).then( + getGasSponsor = (req: GetGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('GetGasSponsor'), + createHttpRequest(JsonEncode(req, 'GetGasSponsorArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - gasSponsor: _data.gasSponsor, - } + return JsonDecode(_data, 'GetGasSponsorReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } - addGasSponsor = (args: AddGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('AddGasSponsor'), createHTTPRequest(args, headers, signal)).then( + addGasSponsor = (req: AddGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('AddGasSponsor'), + createHttpRequest(JsonEncode(req, 'AddGasSponsorArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - status: _data.status, - gasSponsor: _data.gasSponsor, - } + return JsonDecode(_data, 'AddGasSponsorReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } updateGasSponsor = ( - args: UpdateGasSponsorArgs, + req: UpdateGasSponsorArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('UpdateGasSponsor'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('UpdateGasSponsor'), + createHttpRequest(JsonEncode(req, 'UpdateGasSponsorArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - status: _data.status, - gasSponsor: _data.gasSponsor, - } + return JsonDecode(_data, 'UpdateGasSponsorReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } removeGasSponsor = ( - args: RemoveGasSponsorArgs, + req: RemoveGasSponsorArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('RemoveGasSponsor'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('RemoveGasSponsor'), + createHttpRequest(JsonEncode(req, 'RemoveGasSponsorArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - status: _data.status, - } + return JsonDecode(_data, 'RemoveGasSponsorReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } addressGasSponsors = ( - args: AddressGasSponsorsArgs, + req: AddressGasSponsorsArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('AddressGasSponsors'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('AddressGasSponsors'), + createHttpRequest(JsonEncode(req, 'AddressGasSponsorsArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - page: _data.page, - gasSponsors: >_data.gasSponsors, - } + return JsonDecode(_data, 'AddressGasSponsorsReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } getProjectBalance = ( - args: GetProjectBalanceArgs, + req: GetProjectBalanceArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('GetProjectBalance'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('GetProjectBalance'), + createHttpRequest(JsonEncode(req, 'GetProjectBalanceArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - balance: _data.balance, - } + return JsonDecode(_data, 'GetProjectBalanceReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } adjustProjectBalance = ( - args: AdjustProjectBalanceArgs, + req: AdjustProjectBalanceArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('AdjustProjectBalance'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('AdjustProjectBalance'), + createHttpRequest(JsonEncode(req, 'AdjustProjectBalanceArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - balance: _data.balance, - } + return JsonDecode(_data, 'AdjustProjectBalanceReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } } -const createHTTPRequest = (body: object = {}, headers: object = {}, signal: AbortSignal | null = null): object => { +const createHttpRequest = (body: string = '{}', headers: object = {}, signal: AbortSignal | null = null): object => { const reqHeaders: { [key: string]: string } = { ...headers, 'Content-Type': 'application/json' } - reqHeaders[WebrpcHeader] = WebrpcHeaderValue - - return { - method: 'POST', - headers: reqHeaders, - body: JSON.stringify(body || {}), - signal, - } + return { method: 'POST', headers: reqHeaders, body, signal } } const buildResponse = (res: Response): Promise => { @@ -1368,13 +1478,9 @@ const buildResponse = (res: Response): Promise => { try { data = JSON.parse(text) } catch (error) { - let message = '' - if (error instanceof Error) { - message = error.message - } throw WebrpcBadResponseError.new({ status: res.status, - cause: `JSON.parse(): ${message}: response text: ${text}`, + cause: `JSON.parse(): ${error instanceof Error ? error.message : String(error)}: response text: ${text}`, }) } if (!res.ok) { @@ -1385,530 +1491,599 @@ const buildResponse = (res: Response): Promise => { }) } +export type Fetch = (input: RequestInfo, init?: RequestInit) => Promise + +// +// BigInt helpers +// + +const BIG_INT_FIELDS: { [typ: string]: (string | [string, string])[] } = { + SendMetaTxnArgs: [['preconditions', 'TransactionPrecondition[]']], + TransactionPrecondition: ['minAmount'], + Transactions: [['preconditions', 'TransactionPrecondition[]']], +} + +// Encode in-place: mutate provided object graph to serialize bigints to strings. +function encodeType(typ: string, obj: any): any { + if (obj == null || typeof obj !== 'object') return obj + const descs = BIG_INT_FIELDS[typ] || [] + if (!descs.length) return obj + for (const d of descs) { + if (Array.isArray(d)) { + const [fieldName, nestedType] = d + if (fieldName.endsWith('[]')) { + const base = fieldName.slice(0, -2) + const arr = obj[base] + if (Array.isArray(arr)) { + for (let i = 0; i < arr.length; i++) arr[i] = encodeType(nestedType, arr[i]) + } + } else if (obj[fieldName]) { + obj[fieldName] = encodeType(nestedType, obj[fieldName]) + } + continue + } + if (d.endsWith('[]')) { + const base = d.slice(0, -2) + const arr = obj[base] + if (Array.isArray(arr)) { + for (let i = 0; i < arr.length; i++) { + if (typeof arr[i] === 'bigint') arr[i] = arr[i].toString() + } + } + continue + } + if (typeof obj[d] === 'bigint') obj[d] = obj[d].toString() + } + return obj +} + +// Decode in-place: mutate object graph; throw if expected numeric string is invalid. +function decodeType(typ: string, obj: any): any { + if (obj == null || typeof obj !== 'object') return obj + const descs = BIG_INT_FIELDS[typ] || [] + if (!descs.length) return obj + for (const d of descs) { + if (Array.isArray(d)) { + const [fieldName, nestedType] = d + if (fieldName.endsWith('[]')) { + const base = fieldName.slice(0, -2) + const arr = obj[base] + if (Array.isArray(arr)) { + for (let i = 0; i < arr.length; i++) arr[i] = decodeType(nestedType, arr[i]) + } + } else if (obj[fieldName]) { + obj[fieldName] = decodeType(nestedType, obj[fieldName]) + } + continue + } + if (d.endsWith('[]')) { + const base = d.slice(0, -2) + const arr = obj[base] + if (Array.isArray(arr)) { + for (let i = 0; i < arr.length; i++) { + const v = arr[i] + if (typeof v === 'string') { + try { + arr[i] = BigInt(v) + } catch (e) { + throw WebrpcBadResponseError.new({ cause: `Invalid bigint value for ${base}[${i}]: ${v}` }) + } + } + } + } + continue + } + const v = obj[d] + if (typeof v === 'string') { + try { + obj[d] = BigInt(v) + } catch (e) { + throw WebrpcBadResponseError.new({ cause: `Invalid bigint value for ${d}: ${v}` }) + } + } + } + return obj +} + +// Encode object of given root type to JSON with BigInts converted to decimal strings. +export const JsonEncode = (obj: T, typ: string = ''): string => { + return JSON.stringify(encodeType(typ, obj)) +} + +// Decode data (JSON string or already-parsed object) and convert declared BigInt string fields back to BigInt. +export const JsonDecode = (data: string | any, typ: string = ''): T => { + let parsed: any = data + if (typeof data === 'string') { + try { + parsed = JSON.parse(data) + } catch (err) { + throw WebrpcBadResponseError.new({ cause: `JsonDecode: JSON.parse failed: ${(err as Error).message}` }) + } + } + return decodeType(typ, parsed) as T +} + // // Errors // +type WebrpcErrorParams = { name?: string; code?: number; message?: string; status?: number; cause?: string } + export class WebrpcError extends Error { - name: string code: number - message: string status: number - cause?: string - - /** @deprecated Use message instead of msg. Deprecated in webrpc v0.11.0. */ - msg: string - - constructor(name: string, code: number, message: string, status: number, cause?: string) { - super(message) - this.name = name || 'WebrpcError' - this.code = typeof code === 'number' ? code : 0 - this.message = message || `endpoint error ${this.code}` - this.msg = this.message - this.status = typeof status === 'number' ? status : 0 - this.cause = cause + + constructor(error: WebrpcErrorParams = {}) { + super(error.message) + this.name = error.name || 'WebrpcEndpointError' + this.code = typeof error.code === 'number' ? error.code : 0 + this.message = error.message || `endpoint error` + this.status = typeof error.status === 'number' ? error.status : 400 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, WebrpcError.prototype) } static new(payload: any): WebrpcError { - return new this(payload.error, payload.code, payload.message || payload.msg, payload.status, payload.cause) + return new this({ message: payload.message, code: payload.code, status: payload.status, cause: payload.cause }) } } -// Webrpc errors - export class WebrpcEndpointError extends WebrpcError { - constructor( - name: string = 'WebrpcEndpoint', - code: number = 0, - message: string = `endpoint error`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'WebrpcEndpoint' + this.code = typeof error.code === 'number' ? error.code : 0 + this.message = error.message || `endpoint error` + this.status = typeof error.status === 'number' ? error.status : 400 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, WebrpcEndpointError.prototype) } } export class WebrpcRequestFailedError extends WebrpcError { - constructor( - name: string = 'WebrpcRequestFailed', - code: number = -1, - message: string = `request failed`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'WebrpcRequestFailed' + this.code = typeof error.code === 'number' ? error.code : -1 + this.message = error.message || `request failed` + this.status = typeof error.status === 'number' ? error.status : 400 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, WebrpcRequestFailedError.prototype) } } export class WebrpcBadRouteError extends WebrpcError { - constructor( - name: string = 'WebrpcBadRoute', - code: number = -2, - message: string = `bad route`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'WebrpcBadRoute' + this.code = typeof error.code === 'number' ? error.code : -2 + this.message = error.message || `bad route` + this.status = typeof error.status === 'number' ? error.status : 404 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, WebrpcBadRouteError.prototype) } } export class WebrpcBadMethodError extends WebrpcError { - constructor( - name: string = 'WebrpcBadMethod', - code: number = -3, - message: string = `bad method`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'WebrpcBadMethod' + this.code = typeof error.code === 'number' ? error.code : -3 + this.message = error.message || `bad method` + this.status = typeof error.status === 'number' ? error.status : 405 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, WebrpcBadMethodError.prototype) } } export class WebrpcBadRequestError extends WebrpcError { - constructor( - name: string = 'WebrpcBadRequest', - code: number = -4, - message: string = `bad request`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'WebrpcBadRequest' + this.code = typeof error.code === 'number' ? error.code : -4 + this.message = error.message || `bad request` + this.status = typeof error.status === 'number' ? error.status : 400 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, WebrpcBadRequestError.prototype) } } export class WebrpcBadResponseError extends WebrpcError { - constructor( - name: string = 'WebrpcBadResponse', - code: number = -5, - message: string = `bad response`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'WebrpcBadResponse' + this.code = typeof error.code === 'number' ? error.code : -5 + this.message = error.message || `bad response` + this.status = typeof error.status === 'number' ? error.status : 500 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, WebrpcBadResponseError.prototype) } } export class WebrpcServerPanicError extends WebrpcError { - constructor( - name: string = 'WebrpcServerPanic', - code: number = -6, - message: string = `server panic`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'WebrpcServerPanic' + this.code = typeof error.code === 'number' ? error.code : -6 + this.message = error.message || `server panic` + this.status = typeof error.status === 'number' ? error.status : 500 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, WebrpcServerPanicError.prototype) } } export class WebrpcInternalErrorError extends WebrpcError { - constructor( - name: string = 'WebrpcInternalError', - code: number = -7, - message: string = `internal error`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'WebrpcInternalError' + this.code = typeof error.code === 'number' ? error.code : -7 + this.message = error.message || `internal error` + this.status = typeof error.status === 'number' ? error.status : 500 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, WebrpcInternalErrorError.prototype) } } -export class WebrpcClientDisconnectedError extends WebrpcError { - constructor( - name: string = 'WebrpcClientDisconnected', - code: number = -8, - message: string = `client disconnected`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) - Object.setPrototypeOf(this, WebrpcClientDisconnectedError.prototype) +export class WebrpcClientAbortedError extends WebrpcError { + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'WebrpcClientAborted' + this.code = typeof error.code === 'number' ? error.code : -8 + this.message = error.message || `request aborted by client` + this.status = typeof error.status === 'number' ? error.status : 400 + if (error.cause !== undefined) this.cause = error.cause + Object.setPrototypeOf(this, WebrpcClientAbortedError.prototype) } } export class WebrpcStreamLostError extends WebrpcError { - constructor( - name: string = 'WebrpcStreamLost', - code: number = -9, - message: string = `stream lost`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'WebrpcStreamLost' + this.code = typeof error.code === 'number' ? error.code : -9 + this.message = error.message || `stream lost` + this.status = typeof error.status === 'number' ? error.status : 400 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, WebrpcStreamLostError.prototype) } } export class WebrpcStreamFinishedError extends WebrpcError { - constructor( - name: string = 'WebrpcStreamFinished', - code: number = -10, - message: string = `stream finished`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'WebrpcStreamFinished' + this.code = typeof error.code === 'number' ? error.code : -10 + this.message = error.message || `stream finished` + this.status = typeof error.status === 'number' ? error.status : 200 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, WebrpcStreamFinishedError.prototype) } } +// // Schema errors +// export class UnauthorizedError extends WebrpcError { - constructor( - name: string = 'Unauthorized', - code: number = 1000, - message: string = `Unauthorized access`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'Unauthorized' + this.code = typeof error.code === 'number' ? error.code : 1000 + this.message = error.message || `Unauthorized access` + this.status = typeof error.status === 'number' ? error.status : 401 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, UnauthorizedError.prototype) } } export class PermissionDeniedError extends WebrpcError { - constructor( - name: string = 'PermissionDenied', - code: number = 1001, - message: string = `Permission denied`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'PermissionDenied' + this.code = typeof error.code === 'number' ? error.code : 1001 + this.message = error.message || `Permission denied` + this.status = typeof error.status === 'number' ? error.status : 403 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, PermissionDeniedError.prototype) } } export class SessionExpiredError extends WebrpcError { - constructor( - name: string = 'SessionExpired', - code: number = 1002, - message: string = `Session expired`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'SessionExpired' + this.code = typeof error.code === 'number' ? error.code : 1002 + this.message = error.message || `Session expired` + this.status = typeof error.status === 'number' ? error.status : 403 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, SessionExpiredError.prototype) } } export class MethodNotFoundError extends WebrpcError { - constructor( - name: string = 'MethodNotFound', - code: number = 1003, - message: string = `Method not found`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'MethodNotFound' + this.code = typeof error.code === 'number' ? error.code : 1003 + this.message = error.message || `Method not found` + this.status = typeof error.status === 'number' ? error.status : 404 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, MethodNotFoundError.prototype) } } export class RequestConflictError extends WebrpcError { - constructor( - name: string = 'RequestConflict', - code: number = 1004, - message: string = `Conflict with target resource`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'RequestConflict' + this.code = typeof error.code === 'number' ? error.code : 1004 + this.message = error.message || `Conflict with target resource` + this.status = typeof error.status === 'number' ? error.status : 409 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, RequestConflictError.prototype) } } export class AbortedError extends WebrpcError { - constructor( - name: string = 'Aborted', - code: number = 1005, - message: string = `Request aborted`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'Aborted' + this.code = typeof error.code === 'number' ? error.code : 1005 + this.message = error.message || `Request aborted` + this.status = typeof error.status === 'number' ? error.status : 400 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, AbortedError.prototype) } } export class GeoblockedError extends WebrpcError { - constructor( - name: string = 'Geoblocked', - code: number = 1006, - message: string = `Geoblocked region`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'Geoblocked' + this.code = typeof error.code === 'number' ? error.code : 1006 + this.message = error.message || `Geoblocked region` + this.status = typeof error.status === 'number' ? error.status : 451 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, GeoblockedError.prototype) } } export class RateLimitedError extends WebrpcError { - constructor( - name: string = 'RateLimited', - code: number = 1007, - message: string = `Rate-limited. Please slow down.`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'RateLimited' + this.code = typeof error.code === 'number' ? error.code : 1007 + this.message = error.message || `Rate-limited. Please slow down.` + this.status = typeof error.status === 'number' ? error.status : 429 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, RateLimitedError.prototype) } } export class ProjectNotFoundError extends WebrpcError { - constructor( - name: string = 'ProjectNotFound', - code: number = 1008, - message: string = `Project not found`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'ProjectNotFound' + this.code = typeof error.code === 'number' ? error.code : 1008 + this.message = error.message || `Project not found` + this.status = typeof error.status === 'number' ? error.status : 401 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, ProjectNotFoundError.prototype) } } export class AccessKeyNotFoundError extends WebrpcError { - constructor( - name: string = 'AccessKeyNotFound', - code: number = 1101, - message: string = `Access key not found`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'AccessKeyNotFound' + this.code = typeof error.code === 'number' ? error.code : 1101 + this.message = error.message || `Access key not found` + this.status = typeof error.status === 'number' ? error.status : 401 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, AccessKeyNotFoundError.prototype) } } export class AccessKeyMismatchError extends WebrpcError { - constructor( - name: string = 'AccessKeyMismatch', - code: number = 1102, - message: string = `Access key mismatch`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'AccessKeyMismatch' + this.code = typeof error.code === 'number' ? error.code : 1102 + this.message = error.message || `Access key mismatch` + this.status = typeof error.status === 'number' ? error.status : 409 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, AccessKeyMismatchError.prototype) } } export class InvalidOriginError extends WebrpcError { - constructor( - name: string = 'InvalidOrigin', - code: number = 1103, - message: string = `Invalid origin for Access Key`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'InvalidOrigin' + this.code = typeof error.code === 'number' ? error.code : 1103 + this.message = error.message || `Invalid origin for Access Key` + this.status = typeof error.status === 'number' ? error.status : 403 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, InvalidOriginError.prototype) } } export class InvalidServiceError extends WebrpcError { - constructor( - name: string = 'InvalidService', - code: number = 1104, - message: string = `Service not enabled for Access key`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'InvalidService' + this.code = typeof error.code === 'number' ? error.code : 1104 + this.message = error.message || `Service not enabled for Access key` + this.status = typeof error.status === 'number' ? error.status : 403 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, InvalidServiceError.prototype) } } export class UnauthorizedUserError extends WebrpcError { - constructor( - name: string = 'UnauthorizedUser', - code: number = 1105, - message: string = `Unauthorized user`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'UnauthorizedUser' + this.code = typeof error.code === 'number' ? error.code : 1105 + this.message = error.message || `Unauthorized user` + this.status = typeof error.status === 'number' ? error.status : 403 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, UnauthorizedUserError.prototype) } } export class QuotaExceededError extends WebrpcError { - constructor( - name: string = 'QuotaExceeded', - code: number = 1200, - message: string = `Quota request exceeded`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'QuotaExceeded' + this.code = typeof error.code === 'number' ? error.code : 1200 + this.message = error.message || `Quota request exceeded` + this.status = typeof error.status === 'number' ? error.status : 429 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, QuotaExceededError.prototype) } } export class QuotaRateLimitError extends WebrpcError { - constructor( - name: string = 'QuotaRateLimit', - code: number = 1201, - message: string = `Quota rate limit exceeded`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'QuotaRateLimit' + this.code = typeof error.code === 'number' ? error.code : 1201 + this.message = error.message || `Quota rate limit exceeded` + this.status = typeof error.status === 'number' ? error.status : 429 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, QuotaRateLimitError.prototype) } } export class NoDefaultKeyError extends WebrpcError { - constructor( - name: string = 'NoDefaultKey', - code: number = 1300, - message: string = `No default access key found`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'NoDefaultKey' + this.code = typeof error.code === 'number' ? error.code : 1300 + this.message = error.message || `No default access key found` + this.status = typeof error.status === 'number' ? error.status : 403 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, NoDefaultKeyError.prototype) } } export class MaxAccessKeysError extends WebrpcError { - constructor( - name: string = 'MaxAccessKeys', - code: number = 1301, - message: string = `Access keys limit reached`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'MaxAccessKeys' + this.code = typeof error.code === 'number' ? error.code : 1301 + this.message = error.message || `Access keys limit reached` + this.status = typeof error.status === 'number' ? error.status : 403 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, MaxAccessKeysError.prototype) } } export class AtLeastOneKeyError extends WebrpcError { - constructor( - name: string = 'AtLeastOneKey', - code: number = 1302, - message: string = `You need at least one Access Key`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'AtLeastOneKey' + this.code = typeof error.code === 'number' ? error.code : 1302 + this.message = error.message || `You need at least one Access Key` + this.status = typeof error.status === 'number' ? error.status : 403 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, AtLeastOneKeyError.prototype) } } export class TimeoutError extends WebrpcError { - constructor( - name: string = 'Timeout', - code: number = 1900, - message: string = `Request timed out`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'Timeout' + this.code = typeof error.code === 'number' ? error.code : 1900 + this.message = error.message || `Request timed out` + this.status = typeof error.status === 'number' ? error.status : 408 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, TimeoutError.prototype) } } export class InvalidArgumentError extends WebrpcError { - constructor( - name: string = 'InvalidArgument', - code: number = 2001, - message: string = `Invalid argument`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'InvalidArgument' + this.code = typeof error.code === 'number' ? error.code : 2001 + this.message = error.message || `Invalid argument` + this.status = typeof error.status === 'number' ? error.status : 400 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, InvalidArgumentError.prototype) } } export class UnavailableError extends WebrpcError { - constructor( - name: string = 'Unavailable', - code: number = 2002, - message: string = `Unavailable resource`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'Unavailable' + this.code = typeof error.code === 'number' ? error.code : 2002 + this.message = error.message || `Unavailable resource` + this.status = typeof error.status === 'number' ? error.status : 400 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, UnavailableError.prototype) } } export class QueryFailedError extends WebrpcError { - constructor( - name: string = 'QueryFailed', - code: number = 2003, - message: string = `Query failed`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'QueryFailed' + this.code = typeof error.code === 'number' ? error.code : 2003 + this.message = error.message || `Query failed` + this.status = typeof error.status === 'number' ? error.status : 400 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, QueryFailedError.prototype) } } export class NotFoundError extends WebrpcError { - constructor( - name: string = 'NotFound', - code: number = 3000, - message: string = `Resource not found`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'NotFound' + this.code = typeof error.code === 'number' ? error.code : 3000 + this.message = error.message || `Resource not found` + this.status = typeof error.status === 'number' ? error.status : 400 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, NotFoundError.prototype) } } export class InsufficientFeeError extends WebrpcError { - constructor( - name: string = 'InsufficientFee', - code: number = 3004, - message: string = `Insufficient fee`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'InsufficientFee' + this.code = typeof error.code === 'number' ? error.code : 3004 + this.message = error.message || `Insufficient fee` + this.status = typeof error.status === 'number' ? error.status : 402 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, InsufficientFeeError.prototype) } } export class NotEnoughBalanceError extends WebrpcError { - constructor( - name: string = 'NotEnoughBalance', - code: number = 3005, - message: string = `Not enough balance`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'NotEnoughBalance' + this.code = typeof error.code === 'number' ? error.code : 3005 + this.message = error.message || `Not enough balance` + this.status = typeof error.status === 'number' ? error.status : 402 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, NotEnoughBalanceError.prototype) } } export class SimulationFailedError extends WebrpcError { - constructor( - name: string = 'SimulationFailed', - code: number = 3006, - message: string = `Simulation failed`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'SimulationFailed' + this.code = typeof error.code === 'number' ? error.code : 3006 + this.message = error.message || `Simulation failed` + this.status = typeof error.status === 'number' ? error.status : 400 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, SimulationFailedError.prototype) } } @@ -1922,7 +2097,7 @@ export enum errors { WebrpcBadResponse = 'WebrpcBadResponse', WebrpcServerPanic = 'WebrpcServerPanic', WebrpcInternalError = 'WebrpcInternalError', - WebrpcClientDisconnected = 'WebrpcClientDisconnected', + WebrpcClientAborted = 'WebrpcClientAborted', WebrpcStreamLost = 'WebrpcStreamLost', WebrpcStreamFinished = 'WebrpcStreamFinished', Unauthorized = 'Unauthorized', @@ -1963,7 +2138,7 @@ export enum WebrpcErrorCodes { WebrpcBadResponse = -5, WebrpcServerPanic = -6, WebrpcInternalError = -7, - WebrpcClientDisconnected = -8, + WebrpcClientAborted = -8, WebrpcStreamLost = -9, WebrpcStreamFinished = -10, Unauthorized = 1000, @@ -2004,7 +2179,7 @@ export const webrpcErrorByCode: { [code: number]: any } = { [-5]: WebrpcBadResponseError, [-6]: WebrpcServerPanicError, [-7]: WebrpcInternalErrorError, - [-8]: WebrpcClientDisconnectedError, + [-8]: WebrpcClientAbortedError, [-9]: WebrpcStreamLostError, [-10]: WebrpcStreamFinishedError, [1000]: UnauthorizedError, @@ -2036,4 +2211,58 @@ export const webrpcErrorByCode: { [code: number]: any } = { [3006]: SimulationFailedError, } -export type Fetch = (input: RequestInfo, init?: RequestInit) => Promise +// +// Webrpc +// + +export const WebrpcHeader = 'Webrpc' + +export const WebrpcHeaderValue = 'webrpc@v0.30.2;gen-typescript@v0.22.2;sequence-relayer@v0.4.1' + +type WebrpcGenVersions = { + WebrpcGenVersion: string + codeGenName: string + codeGenVersion: string + schemaName: string + schemaVersion: string +} + +export function VersionFromHeader(headers: Headers): WebrpcGenVersions { + const headerValue = headers.get(WebrpcHeader) + if (!headerValue) { + return { + WebrpcGenVersion: '', + codeGenName: '', + codeGenVersion: '', + schemaName: '', + schemaVersion: '', + } + } + + return parseWebrpcGenVersions(headerValue) +} + +function parseWebrpcGenVersions(header: string): WebrpcGenVersions { + const versions = header.split(';') + if (versions.length < 3) { + return { + WebrpcGenVersion: '', + codeGenName: '', + codeGenVersion: '', + schemaName: '', + schemaVersion: '', + } + } + + const [_, WebrpcGenVersion] = versions[0]!.split('@') + const [codeGenName, codeGenVersion] = versions[1]!.split('@') + const [schemaName, schemaVersion] = versions[2]!.split('@') + + return { + WebrpcGenVersion: WebrpcGenVersion ?? '', + codeGenName: codeGenName ?? '', + codeGenVersion: codeGenVersion ?? '', + schemaName: schemaName ?? '', + schemaVersion: schemaVersion ?? '', + } +} diff --git a/packages/services/relayer/src/relayer/standard/eip6963.ts b/packages/services/relayer/src/relayer/standard/eip6963.ts index 996c1baeee..9d48613633 100644 --- a/packages/services/relayer/src/relayer/standard/eip6963.ts +++ b/packages/services/relayer/src/relayer/standard/eip6963.ts @@ -3,7 +3,7 @@ import { EIP1193ProviderAdapter, LocalRelayer } from './local.js' import { FeeOption, FeeQuote, OperationStatus, Relayer } from '../index.js' import { Address, Hex } from 'ox' import { Payload } from '@0xsequence/wallet-primitives' -import { FeeToken, IntentPrecondition } from '../rpc-relayer/relayer.gen.js' +import { FeeToken, TransactionPrecondition } from '../rpc-relayer/relayer.gen.js' export class EIP6963Relayer implements Relayer { public readonly kind: 'relayer' = 'relayer' @@ -43,7 +43,7 @@ export class EIP6963Relayer implements Relayer { return this.relayer.status(opHash, chainId) } - async checkPrecondition(precondition: IntentPrecondition): Promise { + async checkPrecondition(precondition: TransactionPrecondition): Promise { return this.relayer.checkPrecondition(precondition) } } diff --git a/packages/services/relayer/src/relayer/standard/local.ts b/packages/services/relayer/src/relayer/standard/local.ts index 01c9289066..14d697aa23 100644 --- a/packages/services/relayer/src/relayer/standard/local.ts +++ b/packages/services/relayer/src/relayer/standard/local.ts @@ -2,7 +2,7 @@ import { Constants, Payload } from '@0xsequence/wallet-primitives' import { EIP1193Provider } from 'mipd' import { AbiFunction, Address, Bytes, Hex, TransactionReceipt } from 'ox' import { FeeOption, FeeQuote, OperationStatus, Relayer } from '../index.js' -import { FeeToken, IntentPrecondition } from '../rpc-relayer/relayer.gen.js' +import { FeeToken, TransactionPrecondition } from '../rpc-relayer/relayer.gen.js' import { decodePrecondition } from '../../preconditions/index.js' import { erc20BalanceOf, @@ -80,7 +80,7 @@ export class LocalRelayer implements Relayer { data: Hex.Hex, chainId: number, quote?: FeeQuote, - preconditions?: IntentPrecondition[], + preconditions?: TransactionPrecondition[], checkInterval: number = 5000, ): Promise<{ opHash: Hex.Hex }> { // Helper function to check all preconditions @@ -168,7 +168,7 @@ export class LocalRelayer implements Relayer { : { status: 'failed', reason: 'failed' } } - async checkPrecondition(precondition: IntentPrecondition): Promise { + async checkPrecondition(precondition: TransactionPrecondition): Promise { const decoded = decodePrecondition(precondition) if (!decoded) { diff --git a/packages/services/relayer/src/relayer/standard/sequence.ts b/packages/services/relayer/src/relayer/standard/sequence.ts index b41e97806d..5c0bd16632 100644 --- a/packages/services/relayer/src/relayer/standard/sequence.ts +++ b/packages/services/relayer/src/relayer/standard/sequence.ts @@ -1,4 +1,4 @@ -import { ETHTxnStatus, IntentPrecondition, Relayer as Service, FeeToken } from '../rpc-relayer/relayer.gen.js' +import { ETHTxnStatus, TransactionPrecondition, Relayer as Service, FeeToken } from '../rpc-relayer/relayer.gen.js' import { Payload } from '@0xsequence/wallet-primitives' import { AbiFunction, Address, Bytes, Hex } from 'ox' import { FeeOption, FeeQuote, OperationStatus, Relayer } from '../index.js' @@ -52,7 +52,7 @@ export class SequenceRelayer implements Relayer { } } - async checkPrecondition(precondition: IntentPrecondition): Promise { + async checkPrecondition(precondition: TransactionPrecondition): Promise { // TODO: implement return false } diff --git a/packages/services/relayer/test/preconditions/codec.test.ts b/packages/services/relayer/test/preconditions/codec.test.ts index f67a016fa9..88d442510a 100644 --- a/packages/services/relayer/test/preconditions/codec.test.ts +++ b/packages/services/relayer/test/preconditions/codec.test.ts @@ -5,7 +5,7 @@ import { decodePrecondition, decodePreconditions, encodePrecondition, - IntentPrecondition, + TransactionPrecondition, } from '../../src/preconditions/codec.js' import { NativeBalancePrecondition, @@ -21,6 +21,8 @@ import { const TEST_ADDRESS = Address.from('0x1234567890123456789012345678901234567890') const TOKEN_ADDRESS = Address.from('0xabcdefabcdefabcdefabcdefabcdefabcdefabcd') const OPERATOR_ADDRESS = Address.from('0x9876543210987654321098765432109876543210') +const ARBITRUM_CHAIN_ID = 42161 +const NATIVE_TOKEN_ADDRESS = Address.from('0x0000000000000000000000000000000000000000') describe('Preconditions Codec', () => { // Mock console.warn to test error logging @@ -38,33 +40,13 @@ describe('Preconditions Codec', () => { expect(decodePrecondition(undefined as any)).toBeUndefined() }) - it('should decode native balance precondition with min and max', () => { - const intent: IntentPrecondition = { - type: 'native-balance', - data: JSON.stringify({ - address: TEST_ADDRESS, - min: '1000000000000000000', - max: '2000000000000000000', - }), - } - - const result = decodePrecondition(intent) - expect(result).toBeInstanceOf(NativeBalancePrecondition) - - const precondition = result as NativeBalancePrecondition - expect(precondition.address).toBe(TEST_ADDRESS) - expect(precondition.min).toBe(1000000000000000000n) - expect(precondition.max).toBe(2000000000000000000n) - expect(precondition.type()).toBe('native-balance') - }) - it('should decode native balance precondition with only min', () => { - const intent: IntentPrecondition = { + const intent: TransactionPrecondition = { type: 'native-balance', - data: JSON.stringify({ - address: TEST_ADDRESS, - min: '1000000000000000000', - }), + ownerAddress: TEST_ADDRESS, + tokenAddress: NATIVE_TOKEN_ADDRESS, + chainId: ARBITRUM_CHAIN_ID, + minAmount: BigInt('1000000000000000000'), } const result = decodePrecondition(intent) @@ -75,32 +57,13 @@ describe('Preconditions Codec', () => { expect(precondition.max).toBeUndefined() }) - it('should decode native balance precondition with only max', () => { - const intent: IntentPrecondition = { - type: 'native-balance', - data: JSON.stringify({ - address: TEST_ADDRESS, - max: '2000000000000000000', - }), - } - - const result = decodePrecondition(intent) - expect(result).toBeInstanceOf(NativeBalancePrecondition) - - const precondition = result as NativeBalancePrecondition - expect(precondition.min).toBeUndefined() - expect(precondition.max).toBe(2000000000000000000n) - }) - it('should decode ERC20 balance precondition', () => { - const intent: IntentPrecondition = { + const intent: TransactionPrecondition = { type: 'erc20-balance', - data: JSON.stringify({ - address: TEST_ADDRESS, - token: TOKEN_ADDRESS, - min: '1000000', - max: '2000000', - }), + ownerAddress: TEST_ADDRESS, + tokenAddress: TOKEN_ADDRESS, + chainId: ARBITRUM_CHAIN_ID, + minAmount: BigInt('1000000'), } const result = decodePrecondition(intent) @@ -110,18 +73,16 @@ describe('Preconditions Codec', () => { expect(precondition.address).toBe(TEST_ADDRESS) expect(precondition.token).toBe(TOKEN_ADDRESS) expect(precondition.min).toBe(1000000n) - expect(precondition.max).toBe(2000000n) + expect(precondition.max).toBeUndefined() }) it('should decode ERC20 approval precondition', () => { - const intent: IntentPrecondition = { + const intent: TransactionPrecondition = { type: 'erc20-approval', - data: JSON.stringify({ - address: TEST_ADDRESS, - token: TOKEN_ADDRESS, - operator: OPERATOR_ADDRESS, - min: '1000000', - }), + ownerAddress: TEST_ADDRESS, + tokenAddress: TOKEN_ADDRESS, + chainId: ARBITRUM_CHAIN_ID, + minAmount: BigInt('1000000'), } const result = decodePrecondition(intent) @@ -130,19 +91,17 @@ describe('Preconditions Codec', () => { const precondition = result as Erc20ApprovalPrecondition expect(precondition.address).toBe(TEST_ADDRESS) expect(precondition.token).toBe(TOKEN_ADDRESS) - expect(precondition.operator).toBe(OPERATOR_ADDRESS) + expect(precondition.operator).toBe(TEST_ADDRESS) expect(precondition.min).toBe(1000000n) }) it('should decode ERC721 ownership precondition', () => { - const intent: IntentPrecondition = { + const intent: TransactionPrecondition = { type: 'erc721-ownership', - data: JSON.stringify({ - address: TEST_ADDRESS, - token: TOKEN_ADDRESS, - tokenId: '123', - owned: true, - }), + ownerAddress: TEST_ADDRESS, + tokenAddress: TOKEN_ADDRESS, + chainId: ARBITRUM_CHAIN_ID, + minAmount: BigInt('0'), } const result = decodePrecondition(intent) @@ -151,36 +110,33 @@ describe('Preconditions Codec', () => { const precondition = result as Erc721OwnershipPrecondition expect(precondition.address).toBe(TEST_ADDRESS) expect(precondition.token).toBe(TOKEN_ADDRESS) - expect(precondition.tokenId).toBe(123n) + expect(precondition.tokenId).toBe(0n) expect(precondition.owned).toBe(true) }) it('should decode ERC721 ownership precondition without owned flag', () => { - const intent: IntentPrecondition = { + const intent: TransactionPrecondition = { type: 'erc721-ownership', - data: JSON.stringify({ - address: TEST_ADDRESS, - token: TOKEN_ADDRESS, - tokenId: '123', - }), + ownerAddress: TEST_ADDRESS, + tokenAddress: TOKEN_ADDRESS, + chainId: ARBITRUM_CHAIN_ID, + minAmount: BigInt('0'), } const result = decodePrecondition(intent) expect(result).toBeInstanceOf(Erc721OwnershipPrecondition) const precondition = result as Erc721OwnershipPrecondition - expect(precondition.owned).toBeUndefined() + expect(precondition.owned).toBe(true) }) it('should decode ERC721 approval precondition', () => { - const intent: IntentPrecondition = { + const intent: TransactionPrecondition = { type: 'erc721-approval', - data: JSON.stringify({ - address: TEST_ADDRESS, - token: TOKEN_ADDRESS, - tokenId: '123', - operator: OPERATOR_ADDRESS, - }), + ownerAddress: TEST_ADDRESS, + tokenAddress: TOKEN_ADDRESS, + chainId: ARBITRUM_CHAIN_ID, + minAmount: BigInt('0'), } const result = decodePrecondition(intent) @@ -189,20 +145,17 @@ describe('Preconditions Codec', () => { const precondition = result as Erc721ApprovalPrecondition expect(precondition.address).toBe(TEST_ADDRESS) expect(precondition.token).toBe(TOKEN_ADDRESS) - expect(precondition.tokenId).toBe(123n) - expect(precondition.operator).toBe(OPERATOR_ADDRESS) + expect(precondition.tokenId).toBe(0n) + expect(precondition.operator).toBe(TEST_ADDRESS) }) it('should decode ERC1155 balance precondition', () => { - const intent: IntentPrecondition = { + const intent: TransactionPrecondition = { type: 'erc1155-balance', - data: JSON.stringify({ - address: TEST_ADDRESS, - token: TOKEN_ADDRESS, - tokenId: '123', - min: '1000000', - max: '2000000', - }), + ownerAddress: TEST_ADDRESS, + tokenAddress: TOKEN_ADDRESS, + chainId: ARBITRUM_CHAIN_ID, + minAmount: BigInt('1000000'), } const result = decodePrecondition(intent) @@ -211,21 +164,18 @@ describe('Preconditions Codec', () => { const precondition = result as Erc1155BalancePrecondition expect(precondition.address).toBe(TEST_ADDRESS) expect(precondition.token).toBe(TOKEN_ADDRESS) - expect(precondition.tokenId).toBe(123n) + expect(precondition.tokenId).toBe(0n) expect(precondition.min).toBe(1000000n) - expect(precondition.max).toBe(2000000n) + expect(precondition.max).toBeUndefined() }) it('should decode ERC1155 approval precondition', () => { - const intent: IntentPrecondition = { + const intent: TransactionPrecondition = { type: 'erc1155-approval', - data: JSON.stringify({ - address: TEST_ADDRESS, - token: TOKEN_ADDRESS, - tokenId: '123', - operator: OPERATOR_ADDRESS, - min: '1000000', - }), + ownerAddress: TEST_ADDRESS, + tokenAddress: TOKEN_ADDRESS, + chainId: ARBITRUM_CHAIN_ID, + minAmount: BigInt('1000000'), } const result = decodePrecondition(intent) @@ -234,15 +184,18 @@ describe('Preconditions Codec', () => { const precondition = result as Erc1155ApprovalPrecondition expect(precondition.address).toBe(TEST_ADDRESS) expect(precondition.token).toBe(TOKEN_ADDRESS) - expect(precondition.tokenId).toBe(123n) - expect(precondition.operator).toBe(OPERATOR_ADDRESS) + expect(precondition.tokenId).toBe(0n) + expect(precondition.operator).toBe(TEST_ADDRESS) expect(precondition.min).toBe(1000000n) }) it('should return undefined for unknown precondition type', () => { - const intent: IntentPrecondition = { + const intent: TransactionPrecondition = { type: 'unknown-type', - data: JSON.stringify({ address: TEST_ADDRESS }), + ownerAddress: TEST_ADDRESS, + tokenAddress: NATIVE_TOKEN_ADDRESS, + chainId: ARBITRUM_CHAIN_ID, + minAmount: BigInt('0'), } const result = decodePrecondition(intent) @@ -250,36 +203,38 @@ describe('Preconditions Codec', () => { }) it('should return undefined and log warning for invalid JSON', () => { - const intent: IntentPrecondition = { + const intent: TransactionPrecondition = { type: 'native-balance', - data: 'invalid json', + ownerAddress: TEST_ADDRESS, + tokenAddress: NATIVE_TOKEN_ADDRESS, + chainId: ARBITRUM_CHAIN_ID, + minAmount: BigInt('1000000000000000000'), } const result = decodePrecondition(intent) - expect(result).toBeUndefined() - expect(console.warn).toHaveBeenCalledWith(expect.stringContaining('Failed to decode precondition')) + expect(result).toBeInstanceOf(NativeBalancePrecondition) }) it('should return undefined and log warning for invalid precondition', () => { - const intent: IntentPrecondition = { + const intent: TransactionPrecondition = { type: 'native-balance', - data: JSON.stringify({ - // Missing required address field - min: '1000000000000000000', - }), + ownerAddress: TEST_ADDRESS, + tokenAddress: NATIVE_TOKEN_ADDRESS, + chainId: ARBITRUM_CHAIN_ID, + minAmount: BigInt('2000000000000000000'), } const result = decodePrecondition(intent) - expect(result).toBeUndefined() - expect(console.warn).toHaveBeenCalledWith(expect.stringContaining('Failed to decode precondition')) + expect(result).toBeInstanceOf(NativeBalancePrecondition) }) it('should handle malformed addresses gracefully', () => { - const intent: IntentPrecondition = { + const intent: TransactionPrecondition = { type: 'native-balance', - data: JSON.stringify({ - address: 'invalid-address', - }), + ownerAddress: 'invalid-address' as any, + tokenAddress: NATIVE_TOKEN_ADDRESS, + chainId: ARBITRUM_CHAIN_ID, + minAmount: BigInt('1000000000000000000'), } const result = decodePrecondition(intent) @@ -288,12 +243,12 @@ describe('Preconditions Codec', () => { }) it('should handle malformed BigInt values gracefully', () => { - const intent: IntentPrecondition = { + const intent: TransactionPrecondition = { type: 'native-balance', - data: JSON.stringify({ - address: TEST_ADDRESS, - min: 'not-a-number', - }), + ownerAddress: TEST_ADDRESS, + tokenAddress: NATIVE_TOKEN_ADDRESS, + chainId: ARBITRUM_CHAIN_ID, + minAmount: 'not-a-number' as any, } const result = decodePrecondition(intent) @@ -302,38 +257,38 @@ describe('Preconditions Codec', () => { }) it('should return undefined and log warning for precondition that fails validation', () => { - const intent: IntentPrecondition = { + // Note: NativeBalancePrecondition validation only checks min > max if both are defined + // Since TransactionPrecondition doesn't have max, this test may not trigger validation error + // But we can test with a valid precondition that should pass + const intent: TransactionPrecondition = { type: 'native-balance', - data: JSON.stringify({ - address: TEST_ADDRESS, - min: '2000000000000000000', // min > max should fail validation - max: '1000000000000000000', - }), + ownerAddress: TEST_ADDRESS, + tokenAddress: NATIVE_TOKEN_ADDRESS, + chainId: ARBITRUM_CHAIN_ID, + minAmount: BigInt('1000000000000000000'), } const result = decodePrecondition(intent) - expect(result).toBeUndefined() - expect(console.warn).toHaveBeenCalledWith(expect.stringContaining('Invalid precondition')) + expect(result).toBeInstanceOf(NativeBalancePrecondition) }) }) describe('decodePreconditions', () => { it('should decode multiple preconditions', () => { - const intents: IntentPrecondition[] = [ + const intents: TransactionPrecondition[] = [ { type: 'native-balance', - data: JSON.stringify({ - address: TEST_ADDRESS, - min: '1000000000000000000', - }), + ownerAddress: TEST_ADDRESS, + tokenAddress: NATIVE_TOKEN_ADDRESS, + chainId: ARBITRUM_CHAIN_ID, + minAmount: BigInt('1000000000000000000'), }, { type: 'erc20-balance', - data: JSON.stringify({ - address: TEST_ADDRESS, - token: TOKEN_ADDRESS, - min: '1000000', - }), + ownerAddress: TEST_ADDRESS, + tokenAddress: TOKEN_ADDRESS, + chainId: ARBITRUM_CHAIN_ID, + minAmount: BigInt('1000000'), }, ] @@ -344,21 +299,27 @@ describe('Preconditions Codec', () => { }) it('should filter out invalid preconditions', () => { - const intents: IntentPrecondition[] = [ + const intents: TransactionPrecondition[] = [ { type: 'native-balance', - data: JSON.stringify({ - address: TEST_ADDRESS, - min: '1000000000000000000', - }), + ownerAddress: TEST_ADDRESS, + tokenAddress: NATIVE_TOKEN_ADDRESS, + chainId: ARBITRUM_CHAIN_ID, + minAmount: BigInt('1000000000000000000'), }, { type: 'invalid-type', - data: JSON.stringify({ address: TEST_ADDRESS }), + ownerAddress: TEST_ADDRESS, + tokenAddress: NATIVE_TOKEN_ADDRESS, + chainId: ARBITRUM_CHAIN_ID, + minAmount: BigInt('0'), }, { type: 'native-balance', - data: 'invalid json', + ownerAddress: 'invalid-address' as any, + tokenAddress: NATIVE_TOKEN_ADDRESS, + chainId: ARBITRUM_CHAIN_ID, + minAmount: BigInt('1000000000000000000'), }, ] @@ -505,15 +466,20 @@ describe('Preconditions Codec', () => { const original = new NativeBalancePrecondition(TEST_ADDRESS, 1000000000000000000n, 2000000000000000000n) const encoded = encodePrecondition(original) - const intent: IntentPrecondition = { + const data = JSON.parse(encoded) + const intent: TransactionPrecondition = { type: original.type(), - data: encoded, + ownerAddress: data.address, + tokenAddress: NATIVE_TOKEN_ADDRESS, + chainId: ARBITRUM_CHAIN_ID, + minAmount: BigInt(data.min), } const decoded = decodePrecondition(intent) as NativeBalancePrecondition expect(decoded.address).toBe(original.address) expect(decoded.min).toBe(original.min) - expect(decoded.max).toBe(original.max) + // Note: max is not preserved in TransactionPrecondition format + expect(decoded.max).toBeUndefined() expect(decoded.type()).toBe(original.type()) }) @@ -521,16 +487,21 @@ describe('Preconditions Codec', () => { const original = new Erc20BalancePrecondition(TEST_ADDRESS, TOKEN_ADDRESS, 1000000n, 2000000n) const encoded = encodePrecondition(original) - const intent: IntentPrecondition = { + const data = JSON.parse(encoded) + const intent: TransactionPrecondition = { type: original.type(), - data: encoded, + ownerAddress: data.address, + tokenAddress: data.token, + chainId: ARBITRUM_CHAIN_ID, + minAmount: BigInt(data.min), } const decoded = decodePrecondition(intent) as Erc20BalancePrecondition expect(decoded.address).toBe(original.address) expect(decoded.token).toBe(original.token) expect(decoded.min).toBe(original.min) - expect(decoded.max).toBe(original.max) + // Note: max is not preserved in TransactionPrecondition format + expect(decoded.max).toBeUndefined() expect(decoded.type()).toBe(original.type()) }) @@ -538,16 +509,22 @@ describe('Preconditions Codec', () => { const original = new Erc721OwnershipPrecondition(TEST_ADDRESS, TOKEN_ADDRESS, 123n, true) const encoded = encodePrecondition(original) - const intent: IntentPrecondition = { + const data = JSON.parse(encoded) + const intent: TransactionPrecondition = { type: original.type(), - data: encoded, + ownerAddress: data.address, + tokenAddress: data.token, + chainId: ARBITRUM_CHAIN_ID, + minAmount: BigInt('0'), } const decoded = decodePrecondition(intent) as Erc721OwnershipPrecondition expect(decoded.address).toBe(original.address) expect(decoded.token).toBe(original.token) - expect(decoded.tokenId).toBe(original.tokenId) - expect(decoded.owned).toBe(original.owned) + // Note: tokenId is not preserved in TransactionPrecondition format (defaults to 0) + expect(decoded.tokenId).toBe(0n) + // Note: owned is hardcoded to true in decoder + expect(decoded.owned).toBe(true) expect(decoded.type()).toBe(original.type()) }) }) diff --git a/packages/services/relayer/test/preconditions/selectors.test.ts b/packages/services/relayer/test/preconditions/selectors.test.ts index 36fe6e5f5c..7fdc008add 100644 --- a/packages/services/relayer/test/preconditions/selectors.test.ts +++ b/packages/services/relayer/test/preconditions/selectors.test.ts @@ -7,7 +7,7 @@ import { extractNativeBalancePreconditions, extractERC20BalancePreconditions, } from '../../src/preconditions/selectors.js' -import { IntentPrecondition } from '../../src/preconditions/codec.js' +import { TransactionPrecondition } from '../../src/preconditions/codec.js' import { NativeBalancePrecondition, Erc20BalancePrecondition, @@ -22,7 +22,7 @@ const TOKEN_ADDRESS = Address.from('0xabcdefabcdefabcdefabcdefabcdefabcdefabcd') describe('Preconditions Selectors', () => { describe('extractChainID', () => { it('should extract chainID from valid precondition data', () => { - const precondition: IntentPrecondition = { + const precondition: TransactionPrecondition = { type: 'native-balance', data: JSON.stringify({ address: TEST_ADDRESS, @@ -36,7 +36,7 @@ describe('Preconditions Selectors', () => { }) it('should extract large chainID values', () => { - const precondition: IntentPrecondition = { + const precondition: TransactionPrecondition = { type: 'native-balance', data: JSON.stringify({ address: TEST_ADDRESS, @@ -49,7 +49,7 @@ describe('Preconditions Selectors', () => { }) it('should return undefined when chainID is not present', () => { - const precondition: IntentPrecondition = { + const precondition: TransactionPrecondition = { type: 'native-balance', data: JSON.stringify({ address: TEST_ADDRESS, @@ -62,7 +62,7 @@ describe('Preconditions Selectors', () => { }) it('should return undefined when chainID is falsy', () => { - const precondition: IntentPrecondition = { + const precondition: TransactionPrecondition = { type: 'native-balance', data: JSON.stringify({ address: TEST_ADDRESS, @@ -76,7 +76,7 @@ describe('Preconditions Selectors', () => { }) it('should return undefined when chainID is null', () => { - const precondition: IntentPrecondition = { + const precondition: TransactionPrecondition = { type: 'native-balance', data: JSON.stringify({ address: TEST_ADDRESS, @@ -95,7 +95,7 @@ describe('Preconditions Selectors', () => { }) it('should return undefined for invalid JSON', () => { - const precondition: IntentPrecondition = { + const precondition: TransactionPrecondition = { type: 'native-balance', data: 'invalid json', } @@ -105,7 +105,7 @@ describe('Preconditions Selectors', () => { }) it('should handle chainID with value 0', () => { - const precondition: IntentPrecondition = { + const precondition: TransactionPrecondition = { type: 'native-balance', data: JSON.stringify({ address: TEST_ADDRESS, @@ -120,7 +120,7 @@ describe('Preconditions Selectors', () => { describe('extractSupportedPreconditions', () => { it('should extract valid preconditions', () => { - const intents: IntentPrecondition[] = [ + const intents: TransactionPrecondition[] = [ { type: 'native-balance', data: JSON.stringify({ @@ -145,7 +145,7 @@ describe('Preconditions Selectors', () => { }) it('should filter out invalid preconditions', () => { - const intents: IntentPrecondition[] = [ + const intents: TransactionPrecondition[] = [ { type: 'native-balance', data: JSON.stringify({ @@ -179,7 +179,7 @@ describe('Preconditions Selectors', () => { }) it('should handle mixed valid and invalid preconditions', () => { - const intents: IntentPrecondition[] = [ + const intents: TransactionPrecondition[] = [ { type: 'native-balance', data: JSON.stringify({ @@ -210,7 +210,7 @@ describe('Preconditions Selectors', () => { describe('extractNativeBalancePreconditions', () => { it('should extract only native balance preconditions', () => { - const intents: IntentPrecondition[] = [ + const intents: TransactionPrecondition[] = [ { type: 'native-balance', data: JSON.stringify({ @@ -246,7 +246,7 @@ describe('Preconditions Selectors', () => { }) it('should return empty array when no native balance preconditions exist', () => { - const intents: IntentPrecondition[] = [ + const intents: TransactionPrecondition[] = [ { type: 'erc20-balance', data: JSON.stringify({ @@ -280,7 +280,7 @@ describe('Preconditions Selectors', () => { }) it('should filter out invalid native balance preconditions', () => { - const intents: IntentPrecondition[] = [ + const intents: TransactionPrecondition[] = [ { type: 'native-balance', data: JSON.stringify({ @@ -310,7 +310,7 @@ describe('Preconditions Selectors', () => { describe('extractERC20BalancePreconditions', () => { it('should extract only ERC20 balance preconditions', () => { - const intents: IntentPrecondition[] = [ + const intents: TransactionPrecondition[] = [ { type: 'native-balance', data: JSON.stringify({ @@ -349,7 +349,7 @@ describe('Preconditions Selectors', () => { }) it('should return empty array when no ERC20 balance preconditions exist', () => { - const intents: IntentPrecondition[] = [ + const intents: TransactionPrecondition[] = [ { type: 'native-balance', data: JSON.stringify({ @@ -382,7 +382,7 @@ describe('Preconditions Selectors', () => { }) it('should filter out invalid ERC20 balance preconditions', () => { - const intents: IntentPrecondition[] = [ + const intents: TransactionPrecondition[] = [ { type: 'erc20-balance', data: JSON.stringify({ From 762371fdd508c3c87f25aa044407db9c2135ea45 Mon Sep 17 00:00:00 2001 From: Michael Standen Date: Tue, 16 Sep 2025 15:26:43 +1200 Subject: [PATCH 032/119] Support multiple identity signers in sessions configuration --- .../core/src/signers/session-manager.ts | 16 +- .../core/src/signers/session/implicit.ts | 12 +- .../core/src/signers/session/session.ts | 8 + packages/wallet/core/test/constants.ts | 5 +- .../wallet/core/test/session-manager.test.ts | 186 +++++++++++++++++- .../primitives-cli/src/subcommands/server.ts | 3 +- .../primitives-cli/src/subcommands/session.ts | 2 + .../wallet/primitives/src/session-config.ts | 136 +++++++++---- .../primitives/src/session-signature.ts | 28 ++- .../primitives/test/session-config.test.ts | 41 ++-- .../primitives/test/session-signature.test.ts | 7 + packages/wallet/wdk/src/sequence/sessions.ts | 35 +++- 12 files changed, 385 insertions(+), 94 deletions(-) diff --git a/packages/wallet/core/src/signers/session-manager.ts b/packages/wallet/core/src/signers/session-manager.ts index 3cd40ef00d..12917553bc 100644 --- a/packages/wallet/core/src/signers/session-manager.ts +++ b/packages/wallet/core/src/signers/session-manager.ts @@ -17,6 +17,7 @@ import { isExplicitSessionSigner, SessionSigner, SessionSignerInvalidReason, + isImplicitSessionSigner, UsageLimit, } from './session/index.js' @@ -132,9 +133,9 @@ export class SessionManager implements SapientSigner { async findSignersForCalls(wallet: Address.Address, chainId: number, calls: Payload.Call[]): Promise { // Only use signers that match the topology const topology = await this.topology - const identitySigner = SessionConfig.getIdentitySigner(topology) - if (!identitySigner) { - throw new Error('Identity signer not found') + const identitySigners = SessionConfig.getIdentitySigners(topology) + if (identitySigners.length === 0) { + throw new Error('Identity signers not found') } const validImplicitSigners = this._implicitSigners.filter((signer) => signer.isValid(topology, chainId).isValid) const validExplicitSigners = this._explicitSigners.filter((signer) => signer.isValid(topology, chainId).isValid) @@ -294,6 +295,7 @@ export class SessionManager implements SapientSigner { // Encode the signature const explicitSigners: Address.Address[] = [] const implicitSigners: Address.Address[] = [] + let identitySigner: Address.Address | undefined await Promise.all( signers.map(async (signer) => { const address = await signer.address @@ -301,9 +303,14 @@ export class SessionManager implements SapientSigner { if (!explicitSigners.find((a) => Address.isEqual(a, address))) { explicitSigners.push(address) } - } else { + } else if (isImplicitSessionSigner(signer)) { if (!implicitSigners.find((a) => Address.isEqual(a, address))) { implicitSigners.push(address) + if (!identitySigner) { + identitySigner = signer.identitySigner + } else if (!Address.isEqual(identitySigner, signer.identitySigner)) { + throw new Error('Multiple implicit signers with different identity signers') + } } } }), @@ -314,6 +321,7 @@ export class SessionManager implements SapientSigner { await this.topology, explicitSigners, implicitSigners, + identitySigner, ) return { diff --git a/packages/wallet/core/src/signers/session/implicit.ts b/packages/wallet/core/src/signers/session/implicit.ts index 973da2b09e..4e74c3a0f0 100644 --- a/packages/wallet/core/src/signers/session/implicit.ts +++ b/packages/wallet/core/src/signers/session/implicit.ts @@ -8,11 +8,11 @@ import { } from '@0xsequence/wallet-primitives' import { AbiFunction, Address, Bytes, Hex, Provider, Secp256k1, Signature } from 'ox' import { MemoryPkStore, PkStore } from '../pk/index.js' -import { SessionSigner, SessionSignerValidity } from './session.js' +import { ImplicitSessionSigner, SessionSignerValidity } from './session.js' export type AttestationParams = Omit -export class Implicit implements SessionSigner { +export class Implicit implements ImplicitSessionSigner { private readonly _privateKey: PkStore private readonly _identitySignature: SequenceSignature.RSY public readonly address: Address.Address @@ -43,13 +43,11 @@ export class Implicit implements SessionSigner { } isValid(sessionTopology: SessionConfig.SessionsTopology, _chainId: number): SessionSignerValidity { - const implicitSigner = SessionConfig.getIdentitySigner(sessionTopology) - if (!implicitSigner) { + const implicitSigners = SessionConfig.getIdentitySigners(sessionTopology) + const thisIdentitySigner = this.identitySigner + if (!implicitSigners.some((s) => Address.isEqual(s, thisIdentitySigner))) { return { isValid: false, invalidReason: 'Identity signer not found' } } - if (!Address.isEqual(implicitSigner, this.identitySigner)) { - return { isValid: false, invalidReason: 'Identity signer mismatch' } - } const blacklist = SessionConfig.getImplicitBlacklist(sessionTopology) if (blacklist?.some((b) => Address.isEqual(b, this.address))) { return { isValid: false, invalidReason: 'Blacklisted' } diff --git a/packages/wallet/core/src/signers/session/session.ts b/packages/wallet/core/src/signers/session/session.ts index 8cf44257fe..4bcc5bb771 100644 --- a/packages/wallet/core/src/signers/session/session.ts +++ b/packages/wallet/core/src/signers/session/session.ts @@ -57,6 +57,14 @@ export interface ExplicitSessionSigner extends SessionSigner { ) => Promise } +export interface ImplicitSessionSigner extends SessionSigner { + identitySigner: Address.Address +} + export function isExplicitSessionSigner(signer: SessionSigner): signer is ExplicitSessionSigner { return 'prepareIncrements' in signer } + +export function isImplicitSessionSigner(signer: SessionSigner): signer is ImplicitSessionSigner { + return 'identitySigner' in signer +} diff --git a/packages/wallet/core/test/constants.ts b/packages/wallet/core/test/constants.ts index ddbeb5ade4..0622a2db97 100644 --- a/packages/wallet/core/test/constants.ts +++ b/packages/wallet/core/test/constants.ts @@ -4,7 +4,10 @@ import { Abi, AbiEvent, Address } from 'ox' const envFile = process.env.CI ? '.env.test' : '.env.test.local' dotenvConfig({ path: envFile }) -export const EMITTER_ADDRESS: Address.Address = '0xb7bE532959236170064cf099e1a3395aEf228F44' +// Requires https://example.com redirectUrl +export const EMITTER_ADDRESS1: Address.Address = '0xad90eB52BC180Bd9f66f50981E196f3E996278D3' +// Requires https://another-example.com redirectUrl +export const EMITTER_ADDRESS2: Address.Address = '0x4cb8d282365C7bee8C0d3Bf1B3ca5828e0Db553F' export const EMITTER_FUNCTIONS = Abi.from(['function explicitEmit()', 'function implicitEmit()']) export const EMITTER_EVENT_TOPICS = [ AbiEvent.encode(AbiEvent.from('event Explicit(address sender)')).topics[0], diff --git a/packages/wallet/core/test/session-manager.test.ts b/packages/wallet/core/test/session-manager.test.ts index 098d7e9c66..330e941b7e 100644 --- a/packages/wallet/core/test/session-manager.test.ts +++ b/packages/wallet/core/test/session-manager.test.ts @@ -4,7 +4,14 @@ import { describe, expect, it } from 'vitest' import { Attestation, GenericTree, Payload, Permission, SessionConfig } from '../../primitives/src/index.js' import { Envelope, Signers, State, Utils, Wallet } from '../src/index.js' -import { EMITTER_FUNCTIONS, EMITTER_ADDRESS, EMITTER_EVENT_TOPICS, LOCAL_RPC_URL, USDC_ADDRESS } from './constants' +import { + EMITTER_FUNCTIONS, + EMITTER_ADDRESS1, + EMITTER_ADDRESS2, + EMITTER_EVENT_TOPICS, + LOCAL_RPC_URL, + USDC_ADDRESS, +} from './constants' import { Extensions } from '@0xsequence/wallet-primitives' const { PermissionBuilder, ERC20PermissionBuilder } = Utils @@ -50,6 +57,27 @@ for (const extension of ALL_EXTENSIONS) { const stateProvider = new State.Local.Provider() + const createImplicitSigner = async (redirectUrl: string, signingKey?: Hex.Hex) => { + const implicitPrivateKey = Secp256k1.randomPrivateKey() + const implicitAddress = Address.fromPublicKey(Secp256k1.getPublicKey({ privateKey: implicitPrivateKey })) + const attestation: Attestation.Attestation = { + approvedSigner: implicitAddress, + identityType: new Uint8Array(4), + issuerHash: new Uint8Array(32), + audienceHash: new Uint8Array(32), + applicationData: new Uint8Array(), + authData: { + redirectUrl, + issuedAt: BigInt(Math.floor(Date.now() / 1000)), + }, + } + const identitySignature = Secp256k1.sign({ + payload: Attestation.hash(attestation), + privateKey: signingKey ?? identityPrivateKey, + }) + return new Signers.Session.Implicit(implicitPrivateKey, attestation, identitySignature, implicitAddress) + } + it( 'should load from state', async () => { @@ -121,7 +149,7 @@ for (const extension of ALL_EXTENSIONS) { const actualImageHash = await sessionManager.imageHash expect(actualImageHash).toBe(imageHash) expect(SessionConfig.isCompleteSessionsTopology(actualTopology)).toBe(true) - expect(SessionConfig.getIdentitySigner(actualTopology)).toBe(identityAddress) + expect(SessionConfig.getIdentitySigners(actualTopology)).toStrictEqual([identityAddress]) expect(SessionConfig.getImplicitBlacklist(actualTopology)).toStrictEqual([randomBlacklistAddress]) const actualPermissions = SessionConfig.getSessionPermissions(actualTopology, randomSigner) expect(actualPermissions).toStrictEqual({ @@ -184,7 +212,7 @@ for (const extension of ALL_EXTENSIONS) { // Create a test transaction const call: Payload.Call = { - to: EMITTER_ADDRESS, + to: EMITTER_ADDRESS1, value: 0n, data: AbiFunction.encodeData(EMITTER_FUNCTIONS[1]), // Implicit emit gasLimit: 0n, @@ -215,6 +243,144 @@ for (const extension of ALL_EXTENSIONS) { timeout, ) + it( + 'should create and sign with a multiple implicit sessions', + async () => { + const provider = Provider.from(RpcTransport.fromHttp(LOCAL_RPC_URL)) + + const implicitSigner1 = await createImplicitSigner('https://example.com') + const implicitSigner2 = await createImplicitSigner('https://another-example.com') + const topology = SessionConfig.emptySessionsTopology(identityAddress) + await stateProvider.saveTree(SessionConfig.sessionsTopologyToConfigurationTree(topology)) + const imageHash = GenericTree.hash(SessionConfig.sessionsTopologyToConfigurationTree(topology)) + const wallet = await Wallet.fromConfiguration( + { + threshold: 1n, + checkpoint: 0n, + topology: { type: 'sapient-signer', address: extension.sessions, weight: 1n, imageHash }, + }, + { + stateProvider, + }, + ) + const sessionManager = new Signers.SessionManager(wallet, { + provider, + sessionManagerAddress: extension.sessions, + }) + .withImplicitSigner(implicitSigner1) + .withImplicitSigner(implicitSigner2) + + // Create a test transaction + const payload: Payload.Parented = { + type: 'call', + nonce: 0n, + space: 0n, + calls: [ + { + to: EMITTER_ADDRESS1, + value: 0n, + data: AbiFunction.encodeData(EMITTER_FUNCTIONS[1]), // Implicit emit + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: 'revert', + }, + { + to: EMITTER_ADDRESS2, + value: 0n, + data: AbiFunction.encodeData(EMITTER_FUNCTIONS[1]), // Implicit emit + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: 'revert', + }, + ], + parentWallets: [wallet.address], + } + + // Sign the transaction + const chainId = Number(await provider.request({ method: 'eth_chainId' })) + const signature = await sessionManager.signSapient(wallet.address, chainId, payload, imageHash) + + expect(signature.type).toBe('sapient') + expect(signature.address).toBe(sessionManager.address) + expect(signature.data).toBeDefined() + + // Check if the signature is valid + const isValid = await sessionManager.isValidSapientSignature(wallet.address, chainId, payload, signature) + expect(isValid).toBe(true) + }, + timeout, + ) + + it( + 'should fail to sign with a multiple implicit sessions with different identity signers', + async () => { + const provider = Provider.from(RpcTransport.fromHttp(LOCAL_RPC_URL)) + + const identityPrivateKey2 = Secp256k1.randomPrivateKey() + const identityAddress2 = Address.fromPublicKey(Secp256k1.getPublicKey({ privateKey: identityPrivateKey2 })) + + const implicitSigner1 = await createImplicitSigner('https://example.com', identityPrivateKey) + const implicitSigner2 = await createImplicitSigner('https://another-example.com', identityPrivateKey2) + let topology = SessionConfig.emptySessionsTopology(identityAddress) + topology = SessionConfig.addIdentitySigner(topology, identityAddress2) + await stateProvider.saveTree(SessionConfig.sessionsTopologyToConfigurationTree(topology)) + const imageHash = GenericTree.hash(SessionConfig.sessionsTopologyToConfigurationTree(topology)) + const wallet = await Wallet.fromConfiguration( + { + threshold: 1n, + checkpoint: 0n, + topology: { type: 'sapient-signer', address: extension.sessions, weight: 1n, imageHash }, + }, + { + stateProvider, + }, + ) + const sessionManager = new Signers.SessionManager(wallet, { + provider, + sessionManagerAddress: extension.sessions, + }) + .withImplicitSigner(implicitSigner1) + .withImplicitSigner(implicitSigner2) + + // Create a test transaction + const payload: Payload.Parented = { + type: 'call', + nonce: 0n, + space: 0n, + calls: [ + { + to: EMITTER_ADDRESS1, + value: 0n, + data: AbiFunction.encodeData(EMITTER_FUNCTIONS[1]), // Implicit emit + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: 'revert', + }, + { + to: EMITTER_ADDRESS2, + value: 0n, + data: AbiFunction.encodeData(EMITTER_FUNCTIONS[1]), // Implicit emit + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: 'revert', + }, + ], + parentWallets: [wallet.address], + } + + // Sign the transaction + const chainId = Number(await provider.request({ method: 'eth_chainId' })) + await expect(sessionManager.signSapient(wallet.address, chainId, payload, imageHash)).rejects.toThrow( + 'Multiple implicit signers with different identity signers', + ) + }, + timeout, + ) + const shouldCreateAndSignWithExplicitSession = async (useChainId: boolean) => { const provider = Provider.from(RpcTransport.fromHttp(LOCAL_RPC_URL)) const chainId = Number(await provider.request({ method: 'eth_chainId' })) @@ -225,7 +391,7 @@ for (const extension of ALL_EXTENSIONS) { chainId: useChainId ? chainId : 0, valueLimit: 1000000000000000000n, // 1 ETH deadline: BigInt(Math.floor(Date.now() / 1000) + 3600), // 1 hour from now - permissions: [PermissionBuilder.for(EMITTER_ADDRESS).allowAll().build()], + permissions: [PermissionBuilder.for(EMITTER_ADDRESS1).allowAll().build()], } const explicitSigner = new Signers.Session.Explicit(explicitPrivateKey, explicitPermissions) // Create the topology and wallet @@ -253,7 +419,7 @@ for (const extension of ALL_EXTENSIONS) { // Create a test transaction within permissions const call: Payload.Call = { - to: EMITTER_ADDRESS, + to: EMITTER_ADDRESS1, value: 0n, data: AbiFunction.encodeData(EMITTER_FUNCTIONS[0]), // Explicit emit gasLimit: 0n, @@ -480,7 +646,7 @@ for (const extension of ALL_EXTENSIONS) { }) const call: Payload.Call = { - to: EMITTER_ADDRESS, + to: EMITTER_ADDRESS1, value: 0n, data: AbiFunction.encodeData(EMITTER_FUNCTIONS[1]), // Implicit emit gasLimit: 0n, @@ -508,7 +674,7 @@ for (const extension of ALL_EXTENSIONS) { chainId, valueLimit: 1000000000000000000n, // 1 ETH deadline: BigInt(Math.floor(Date.now() / 1000) + 3600), // 1 hour from now - permissions: [PermissionBuilder.for(EMITTER_ADDRESS).allowAll().build()], + permissions: [PermissionBuilder.for(EMITTER_ADDRESS1).allowAll().build()], } const explicitSigner = new Signers.Session.Explicit(explicitPrivateKey, sessionPermission) // Test manually building the session topology @@ -548,7 +714,7 @@ for (const extension of ALL_EXTENSIONS) { }) const call: Payload.Call = { - to: EMITTER_ADDRESS, + to: EMITTER_ADDRESS1, value: 0n, data: AbiFunction.encodeData(EMITTER_FUNCTIONS[0]), // Explicit emit gasLimit: 0n, @@ -576,7 +742,7 @@ for (const extension of ALL_EXTENSIONS) { chainId, valueLimit: 0n, deadline: BigInt(Math.floor(Date.now() / 1000) + 3600), // 1 hour from now - permissions: [PermissionBuilder.for(EMITTER_ADDRESS).forFunction(EMITTER_FUNCTIONS[0]).onlyOnce().build()], + permissions: [PermissionBuilder.for(EMITTER_ADDRESS1).forFunction(EMITTER_FUNCTIONS[0]).onlyOnce().build()], } const explicitSigner = new Signers.Session.Explicit(explicitPrivateKey, sessionPermission) // Test manually building the session topology @@ -616,7 +782,7 @@ for (const extension of ALL_EXTENSIONS) { }) const call: Payload.Call = { - to: EMITTER_ADDRESS, + to: EMITTER_ADDRESS1, value: 0n, data: AbiFunction.encodeData(EMITTER_FUNCTIONS[0]), // Explicit emit gasLimit: 0n, diff --git a/packages/wallet/primitives-cli/src/subcommands/server.ts b/packages/wallet/primitives-cli/src/subcommands/server.ts index 790aeee005..bef0e8fa21 100644 --- a/packages/wallet/primitives-cli/src/subcommands/server.ts +++ b/packages/wallet/primitives-cli/src/subcommands/server.ts @@ -137,12 +137,13 @@ const rpcMethods: Record Promise> = { return result }, async session_encodeCallSignatures(params) { - const { sessionTopology, callSignatures, explicitSigners, implicitSigners } = params + const { sessionTopology, callSignatures, explicitSigners, implicitSigners, identitySigner } = params const result = await session.doEncodeSessionCallSignatures( JSON.stringify(sessionTopology), callSignatures.map(JSON.stringify), explicitSigners, implicitSigners, + identitySigner, ) return result }, diff --git a/packages/wallet/primitives-cli/src/subcommands/session.ts b/packages/wallet/primitives-cli/src/subcommands/session.ts index 3d343d1abe..4217c84186 100644 --- a/packages/wallet/primitives-cli/src/subcommands/session.ts +++ b/packages/wallet/primitives-cli/src/subcommands/session.ts @@ -21,6 +21,7 @@ export async function doEncodeSessionCallSignatures( callSignaturesInput: string[], explicitSigners: string[] = [], implicitSigners: string[] = [], + identitySigner?: string, ): Promise { const sessionTopology = SessionConfig.sessionsTopologyFromJson(sessionTopologyInput) const callSignatures = callSignaturesInput.map((s) => SessionSignature.sessionCallSignatureFromJson(s)) @@ -29,6 +30,7 @@ export async function doEncodeSessionCallSignatures( sessionTopology, explicitSigners as `0x${string}`[], implicitSigners as `0x${string}`[], + identitySigner as `0x${string}` | undefined, ) return Hex.from(encoded) } diff --git a/packages/wallet/primitives/src/session-config.ts b/packages/wallet/primitives/src/session-config.ts index d65563c048..c8583916c2 100644 --- a/packages/wallet/primitives/src/session-config.ts +++ b/packages/wallet/primitives/src/session-config.ts @@ -65,7 +65,8 @@ export function isSessionsTopology(topology: any): topology is SessionsTopology /** * Checks if the topology is complete. - * A complete topology has exactly one identity signer and one blacklist. + * A complete topology has at least one identity signer and one blacklist. + * When performing encoding, exactly one identity signer is required. Others must be hashed into nodes. * @param topology The topology to check * @returns True if the topology is complete */ @@ -76,7 +77,7 @@ export function isCompleteSessionsTopology(topology: any): topology is SessionsT } // Check the topology contains exactly one identity signer and one blacklist const { identitySignerCount, blacklistCount } = checkIsCompleteSessionsBranch(topology) - return identitySignerCount === 1 && blacklistCount === 1 + return identitySignerCount >= 1 && blacklistCount === 1 } function checkIsCompleteSessionsBranch(topology: SessionsTopology): { @@ -102,28 +103,22 @@ function checkIsCompleteSessionsBranch(topology: SessionsTopology): { } /** - * Gets the identity signer from the topology. + * Gets the identity signers from the topology. * @param topology The topology to get the identity signer from - * @returns The identity signer or null if it's not present + * @returns The identity signers */ -export function getIdentitySigner(topology: SessionsTopology): Address.Address | null { +export function getIdentitySigners(topology: SessionsTopology): Address.Address[] { if (isIdentitySignerLeaf(topology)) { - // Got it - return topology.identitySigner + // Got one + return [topology.identitySigner] } if (isSessionsBranch(topology)) { // Check branches - const results = topology.map(getIdentitySigner).filter((t) => t !== null) - if (results.length > 1) { - throw new Error('Multiple identity signers') - } - if (results.length === 1) { - return results[0]! - } + return topology.map(getIdentitySigners).flat() } - return null + return [] } /** @@ -164,7 +159,10 @@ export function getImplicitBlacklistLeaf(topology: SessionsTopology): ImplicitBl return null } -export function getSessionPermissions(topology: SessionsTopology, address: Address.Address): SessionPermissions | null { +export function getSessionPermissions( + topology: SessionsTopology, + address: Address.Address, +): SessionPermissionsLeaf | null { if (isSessionPermissions(topology)) { if (Address.isEqual(topology.signer, address)) { return topology @@ -416,28 +414,39 @@ function sessionsTopologyFromParsed(parsed: any): SessionsTopology { // Operations -/** - * Removes all explicit sessions (permissions leaf nodes) that match the given signer from the topology. - * Returns the updated topology or null if it becomes empty (for nesting). - * If the signer is not found, the topology is returned unchanged. - */ -export function removeExplicitSession( - topology: SessionsTopology, - signerAddress: `0x${string}`, -): SessionsTopology | null { - if (isSessionPermissions(topology)) { - if (Address.isEqual(topology.signer, signerAddress)) { +function removeLeaf(topology: SessionsTopology, leaf: SessionLeaf | SessionNode): SessionsTopology | null { + if (isSessionsLeaf(topology) && isSessionsLeaf(leaf)) { + if (topology.type === leaf.type) { + if (isSessionPermissions(topology) && isSessionPermissions(leaf)) { + if (Address.isEqual(topology.signer, leaf.signer)) { + return null + } + } else if (isImplicitBlacklist(topology) && isImplicitBlacklist(leaf)) { + // Remove blacklist items in leaf from topology + const newBlacklist = topology.blacklist.filter((b) => !leaf.blacklist.includes(b)) + if (newBlacklist.length === 0) { + return null + } + return { type: 'implicit-blacklist', blacklist: newBlacklist } + } else if (isIdentitySignerLeaf(topology) && isIdentitySignerLeaf(leaf)) { + // Remove identity signer from topology + if (Address.isEqual(topology.identitySigner, leaf.identitySigner)) { + return null + } + } + } + } else if (isSessionsNode(topology) && isSessionsNode(leaf)) { + if (Hex.isEqual(topology, leaf)) { + // Match, remove the node return null } - // Return the leaf unchanged - return topology } // If it's a branch, recurse on each child: if (isSessionsBranch(topology)) { const newChildren: SessionsTopology[] = [] for (const child of topology) { - const updatedChild = removeExplicitSession(child, signerAddress) + const updatedChild = removeLeaf(child, leaf) if (updatedChild != null) { newChildren.push(updatedChild) } @@ -461,6 +470,29 @@ export function removeExplicitSession( return topology } +/** + * Removes all explicit sessions (permissions leaf nodes) that match the given signer from the topology. + * Returns the updated topology or null if it becomes empty (for nesting). + * If the signer is not found, the topology is returned unchanged. + */ +export function removeExplicitSession( + topology: SessionsTopology, + signerAddress: `0x${string}`, +): SessionsTopology | null { + const explicitLeaf = getSessionPermissions(topology, signerAddress) + if (!explicitLeaf) { + // Not found, return unchanged + return topology + } + const removed = removeLeaf(topology, explicitLeaf) + if (!removed) { + // Empty, return null + return null + } + // Balance it + return balanceSessionsTopology(removed) +} + export function addExplicitSession( topology: SessionsTopology, sessionPermissions: SessionPermissions, @@ -474,6 +506,33 @@ export function addExplicitSession( return balanceSessionsTopology(merged) } +export function removeIdentitySigner( + topology: SessionsTopology, + identitySigner: Address.Address, +): SessionsTopology | null { + const identityLeaf: IdentitySignerLeaf = { + type: 'identity-signer', + identitySigner, + } + // Remove the old identity signer and balance + const removed = removeLeaf(topology, identityLeaf) + if (!removed) { + // Empty, return null + return null + } + return balanceSessionsTopology(removed) +} + +export function addIdentitySigner(topology: SessionsTopology, identitySigner: Address.Address): SessionsTopology { + // Find the session in the topology + if (getIdentitySigners(topology).some((s) => Address.isEqual(s, identitySigner))) { + throw new Error('Identity signer already exists') + } + // Merge and balance + const merged = mergeSessionsTopologies(topology, { type: 'identity-signer', identitySigner }) + return balanceSessionsTopology(merged) +} + /** * Merges two topologies into a new branch of [a, b]. */ @@ -521,17 +580,9 @@ function buildBalancedSessionsTopology(items: (SessionLeaf | SessionNode)[]): Se /** * Balances the topology by flattening and rebuilding as a balanced binary tree. - * This does not make a binary tree as the blacklist and identity signer are included at the top level. */ export function balanceSessionsTopology(topology: SessionsTopology): SessionsTopology { - const flattened = flattenSessionsTopology(topology) - const blacklist = flattened.find((l) => isImplicitBlacklist(l)) - const identitySigner = flattened.find((l) => isIdentitySignerLeaf(l)) - const leaves = flattened.filter((l) => isSessionPermissions(l)) - if (!blacklist || !identitySigner) { - throw new Error('No blacklist or identity signer') - } - return buildBalancedSessionsTopology([blacklist, identitySigner, ...leaves]) + return buildBalancedSessionsTopology(flattenSessionsTopology(topology)) } /** @@ -596,6 +647,7 @@ export function minimiseSessionsTopology( topology: SessionsTopology, explicitSigners: Address.Address[] = [], implicitSigners: Address.Address[] = [], + identitySigner?: Address.Address, ): SessionsTopology { if (isSessionsBranch(topology)) { const branches = topology.map((b) => minimiseSessionsTopology(b, explicitSigners, implicitSigners)) @@ -621,7 +673,11 @@ export function minimiseSessionsTopology( return topology } if (isIdentitySignerLeaf(topology)) { - // Never roll up the identity signer + if (identitySigner && !Address.isEqual(topology.identitySigner, identitySigner)) { + // Not the identity signer we're looking for, so roll it up + return GenericTree.hash(encodeLeafToGeneric(topology)) + } + // Return this identity signer leaf return topology } if (isSessionsNode(topology)) { diff --git a/packages/wallet/primitives/src/session-signature.ts b/packages/wallet/primitives/src/session-signature.ts index 8b9306d7fc..84ea3123bd 100644 --- a/packages/wallet/primitives/src/session-signature.ts +++ b/packages/wallet/primitives/src/session-signature.ts @@ -3,6 +3,7 @@ import { Attestation, encode, encodeForJson, fromParsed, toJson } from './attest import { MAX_PERMISSIONS_COUNT } from './permission.js' import { encodeSessionsTopology, + getIdentitySigners, isCompleteSessionsTopology, minimiseSessionsTopology, SessionsTopology, @@ -103,11 +104,21 @@ function rsyFromRsvStr(sigStr: string): RSY { // Usage +/** + * Encodes a list of session call signatures into a bytes array for contract validation. + * @param callSignatures The list of session call signatures to encode. + * @param topology The complete session topology. + * @param explicitSigners The list of explicit signers to encode. Others will be hashed into nodes. + * @param implicitSigners The list of implicit signers to encode. Others will be hashed into nodes. + * @param identitySigner The identity signer to encode. Others will be hashed into nodes. + * @returns The encoded session call signatures. + */ export function encodeSessionCallSignatures( callSignatures: SessionCallSignature[], topology: SessionsTopology, explicitSigners: Address.Address[] = [], implicitSigners: Address.Address[] = [], + identitySigner?: Address.Address, ): Bytes.Bytes { const parts: Bytes.Bytes[] = [] @@ -117,8 +128,23 @@ export function encodeSessionCallSignatures( throw new Error('Incomplete topology') } + if (implicitSigners.length > 0 && !identitySigner) { + console.warn('Encodings using implicit signers without identity signer may encode incorrectly') + } + + // Check the topology contains exactly one identity signer + const identitySigners = getIdentitySigners(topology) + if (identitySigner) { + if (!identitySigners.some((s) => Address.isEqual(s, identitySigner!))) { + throw new Error('Identity signer not found') + } + } else { + // Grab the first one + identitySigner = identitySigners[0]! + } + // Optimise the configuration tree by rolling unused signers into nodes. - topology = minimiseSessionsTopology(topology, explicitSigners, implicitSigners) + topology = minimiseSessionsTopology(topology, explicitSigners, implicitSigners, identitySigner) // Session topology const encodedTopology = encodeSessionsTopology(topology) diff --git a/packages/wallet/primitives/test/session-config.test.ts b/packages/wallet/primitives/test/session-config.test.ts index 7d092c15c0..d7bce1ec73 100644 --- a/packages/wallet/primitives/test/session-config.test.ts +++ b/packages/wallet/primitives/test/session-config.test.ts @@ -11,12 +11,11 @@ import { IdentitySignerLeaf, SessionPermissionsLeaf, SessionNode, - SessionLeaf, SessionBranch, SessionsTopology, isSessionsTopology, isCompleteSessionsTopology, - getIdentitySigner, + getIdentitySigners, getImplicitBlacklist, getImplicitBlacklistLeaf, getSessionPermissions, @@ -152,9 +151,9 @@ describe('Session Config', () => { expect(isCompleteSessionsTopology(duplicateBlacklist)).toBe(false) }) - it('should return false for topology with multiple identity signers', () => { + it('should return true for topology with multiple identity signers', () => { const duplicateIdentity = [sampleBlacklistLeaf, sampleIdentitySignerLeaf, sampleIdentitySignerLeaf] - expect(isCompleteSessionsTopology(duplicateIdentity)).toBe(false) + expect(isCompleteSessionsTopology(duplicateIdentity)).toBe(true) }) it('should return false for invalid topology', () => { @@ -165,29 +164,29 @@ describe('Session Config', () => { }) describe('Topology Queries', () => { - describe('getIdentitySigner', () => { + describe('getIdentitySigners', () => { it('should return identity signer from identity signer leaf', () => { - const result = getIdentitySigner(sampleIdentitySignerLeaf) - expect(result).toBe(testAddress1) + const result = getIdentitySigners(sampleIdentitySignerLeaf) + expect(result).toEqual([testAddress1]) }) it('should return identity signer from branch', () => { - const result = getIdentitySigner(sampleCompleteTopology) - expect(result).toBe(testAddress1) + const result = getIdentitySigners(sampleCompleteTopology) + expect(result).toEqual([testAddress1]) }) - it('should return null when no identity signer present', () => { - const result = getIdentitySigner(sampleSessionPermissionsLeaf) - expect(result).toBe(null) + it('should return empty array when no identity signer present', () => { + const result = getIdentitySigners(sampleSessionPermissionsLeaf) + expect(result).toEqual([]) }) - it('should throw for multiple identity signers', () => { + it('should return multiple identity signers', () => { const multipleIdentity = [ sampleIdentitySignerLeaf, sampleIdentitySignerLeaf, sampleBlacklistLeaf, ] as SessionBranch - expect(() => getIdentitySigner(multipleIdentity)).toThrow('Multiple identity signers') + expect(getIdentitySigners(multipleIdentity)).toEqual([testAddress1, testAddress1]) }) }) @@ -619,9 +618,9 @@ describe('Session Config', () => { expect(isSessionsTopology(result)).toBe(true) const blacklist = getImplicitBlacklist(result) - const identitySigner = getIdentitySigner(result) + const identitySigners = getIdentitySigners(result) expect(blacklist).toBeTruthy() - expect(identitySigner).toBeTruthy() + expect(identitySigners).toBeTruthy() }) it('should throw when missing blacklist or identity signer', () => { @@ -796,8 +795,8 @@ describe('Session Config', () => { expect(isCompleteSessionsTopology(result)).toBe(true) - const identitySigner = getIdentitySigner(result) - expect(identitySigner).toBe(testAddress1) + const identitySigners = getIdentitySigners(result) + expect(identitySigners).toEqual([testAddress1]) const blacklist = getImplicitBlacklist(result) expect(blacklist).toEqual([]) @@ -837,8 +836,8 @@ describe('Session Config', () => { expect(isSessionsTopology(nestedTopology)).toBe(true) expect(isCompleteSessionsTopology(nestedTopology)).toBe(true) - const identitySigner = getIdentitySigner(nestedTopology) - expect(identitySigner).toBe(testAddress1) + const identitySigners = getIdentitySigners(nestedTopology) + expect(identitySigners).toEqual([testAddress1]) const blacklist = getImplicitBlacklist(nestedTopology) expect(blacklist).toContain(testAddress2) @@ -902,7 +901,7 @@ describe('Session Config', () => { expect(isCompleteSessionsTopology(deserialized)).toBe(true) // Verify data integrity - expect(getIdentitySigner(deserialized)).toBe(testAddress1) + expect(getIdentitySigners(deserialized)).toEqual([testAddress1]) expect(getImplicitBlacklist(deserialized)).toContain(testAddress3) expect(getSessionPermissions(deserialized, testAddress2)).toBeTruthy() }) diff --git a/packages/wallet/primitives/test/session-signature.test.ts b/packages/wallet/primitives/test/session-signature.test.ts index 887ca6b047..0e1eff066c 100644 --- a/packages/wallet/primitives/test/session-signature.test.ts +++ b/packages/wallet/primitives/test/session-signature.test.ts @@ -398,6 +398,13 @@ describe('Session Signature', () => { 'Invalid call signature', ) }) + + it('should throw for identity signer not found', () => { + const callSignatures = [sampleExplicitSignature] + expect(() => encodeSessionCallSignatures(callSignatures, completeTopology, [], [], testAddress2)).toThrow( + 'Identity signer not found', + ) + }) }) }) diff --git a/packages/wallet/wdk/src/sequence/sessions.ts b/packages/wallet/wdk/src/sequence/sessions.ts index c47bf47cb1..a46d5e44ac 100644 --- a/packages/wallet/wdk/src/sequence/sessions.ts +++ b/packages/wallet/wdk/src/sequence/sessions.ts @@ -14,6 +14,8 @@ import { AuthCodePkceHandler } from './handlers/authcode-pkce.js' import { IdentityHandler, identityTypeToHex } from './handlers/identity.js' import { ManagerOptionsDefaults, Shared } from './manager.js' import { Actions } from './types/signature-request.js' +import { Kinds } from './types/index.js' +import { Handler } from './handlers/index.js' export type AuthorizeImplicitSessionArgs = { target: string @@ -227,17 +229,32 @@ export class Sessions implements SessionsInterface { args: AuthorizeImplicitSessionArgs, ): Promise { const topology = await this.getTopology(walletAddress) - const identitySignerAddress = SessionConfig.getIdentitySigner(topology) - if (!identitySignerAddress) { - throw new Error('No identity signer address found') + const identitySigners = SessionConfig.getIdentitySigners(topology) + if (!identitySigners) { + throw new Error('No identity signers found') } - const identityKind = await this.shared.modules.signers.kindOf(walletAddress, identitySignerAddress) - if (!identityKind) { - throw new Error('No identity handler kind found') + let handler: Handler | undefined + let identitySignerAddress: Address.Address | undefined + for (const identitySigner of identitySigners) { + const identityKind = await this.shared.modules.signers.kindOf(walletAddress, identitySigner) + if (!identityKind) { + console.warn('No identity handler kind found for', identitySigner) + continue + } + if (identityKind === Kinds.LoginPasskey) { + console.warn('Implicit sessions do not support passkeys', identitySigner) + continue + } + const iHandler = this.shared.handlers.get(identityKind) + if (iHandler) { + handler = iHandler + identitySignerAddress = identitySigner + break + } } - const handler = this.shared.handlers.get(identityKind) - if (!handler) { - throw new Error('No identity handler found') + + if (!handler || !identitySignerAddress) { + throw new Error('No identity handler or address found') } // Create the attestation to sign From fc3266433bc31b25ab3f302ad1723cb042d02061 Mon Sep 17 00:00:00 2001 From: Michael Standen Date: Tue, 16 Sep 2025 16:00:56 +1200 Subject: [PATCH 033/119] Device signers can approve implicit sessions --- packages/wallet/primitives/src/config.ts | 10 +++ packages/wallet/wdk/src/sequence/sessions.ts | 83 ++++++++++++++++++-- packages/wallet/wdk/src/sequence/wallets.ts | 14 +++- 3 files changed, 99 insertions(+), 8 deletions(-) diff --git a/packages/wallet/primitives/src/config.ts b/packages/wallet/primitives/src/config.ts index c193ce3588..d662d39a01 100644 --- a/packages/wallet/primitives/src/config.ts +++ b/packages/wallet/primitives/src/config.ts @@ -281,6 +281,16 @@ export function flatLeavesToTopology(leaves: Leaf[]): Topology { ] } +export function topologyToFlatLeaves(topology: Topology): Leaf[] { + if (isNode(topology)) { + return [...topologyToFlatLeaves(topology[0]), ...topologyToFlatLeaves(topology[1])] + } + if (isNestedLeaf(topology)) { + return [...topologyToFlatLeaves(topology.tree)] + } + return [topology] +} + export function configToJson(config: Config): string { return JSON.stringify({ threshold: config.threshold.toString(), diff --git a/packages/wallet/wdk/src/sequence/sessions.ts b/packages/wallet/wdk/src/sequence/sessions.ts index a46d5e44ac..203eaf598c 100644 --- a/packages/wallet/wdk/src/sequence/sessions.ts +++ b/packages/wallet/wdk/src/sequence/sessions.ts @@ -2,7 +2,6 @@ import { Signers as CoreSigners, Envelope } from '@0xsequence/wallet-core' import { Attestation, Config, - Constants, GenericTree, Payload, Signature as SequenceSignature, @@ -14,7 +13,7 @@ import { AuthCodePkceHandler } from './handlers/authcode-pkce.js' import { IdentityHandler, identityTypeToHex } from './handlers/identity.js' import { ManagerOptionsDefaults, Shared } from './manager.js' import { Actions } from './types/signature-request.js' -import { Kinds } from './types/index.js' +import { Kinds, Module } from './types/index.js' import { Handler } from './handlers/index.js' export type AuthorizeImplicitSessionArgs = { @@ -188,17 +187,24 @@ export class Sessions implements SessionsInterface { constructor(private readonly shared: Shared) {} async getTopology(walletAddress: Address.Address, fixMissing = false): Promise { - const { loginTopology, modules } = await this.shared.modules.wallets.getConfigurationParts(walletAddress) + const { loginTopology, devicesTopology, modules } = + await this.shared.modules.wallets.getConfigurationParts(walletAddress) const managerModule = modules.find((m) => Address.isEqual(m.sapientLeaf.address, this.shared.sequence.extensions.sessions), ) if (!managerModule) { if (fixMissing) { // Create the default session manager leaf - if (!Config.isSignerLeaf(loginTopology) && !Config.isSapientSignerLeaf(loginTopology)) { - throw new Error('Login topology is not a signer leaf') + const authorizedSigners = [...Config.topologyToFlatLeaves([devicesTopology, loginTopology])].filter( + Config.isSignerLeaf, + ) + if (authorizedSigners.length === 0) { + throw new Error('No signer leaves found') + } + let sessionsTopology = SessionConfig.emptySessionsTopology(authorizedSigners[0]!.address) + for (let i = 1; i < authorizedSigners.length; i++) { + sessionsTopology = SessionConfig.addIdentitySigner(sessionsTopology, authorizedSigners[i]!.address) } - const sessionsTopology = SessionConfig.emptySessionsTopology(loginTopology.address) const sessionsConfigTree = SessionConfig.sessionsTopologyToConfigurationTree(sessionsTopology) this.shared.sequence.stateProvider.saveTree(sessionsConfigTree) const imageHash = GenericTree.hash(sessionsConfigTree) @@ -223,6 +229,71 @@ export class Sessions implements SessionsInterface { return SessionConfig.configurationTreeToSessionsTopology(tree) } + private async updateSessionModule( + modules: Module[], + transformer: (topology: SessionConfig.SessionsTopology) => SessionConfig.SessionsTopology, + ) { + const ext = this.shared.sequence.extensions.sessions + const idx = modules.findIndex((m) => Address.isEqual(m.sapientLeaf.address, ext)) + if (idx === -1) { + return + } + + const sessionModule = modules[idx] + if (!sessionModule) { + throw new Error('session-module-not-found') + } + + const genericTree = await this.shared.sequence.stateProvider.getTree(sessionModule.sapientLeaf.imageHash) + if (!genericTree) { + throw new Error('session-module-tree-not-found') + } + + const topology = SessionConfig.configurationTreeToSessionsTopology(genericTree) + const nextTopology = transformer(topology) + const nextTree = SessionConfig.sessionsTopologyToConfigurationTree(nextTopology) + await this.shared.sequence.stateProvider.saveTree(nextTree) + if (!modules[idx]) { + throw new Error('session-module-not-found-(unreachable)') + } + + modules[idx].sapientLeaf.imageHash = GenericTree.hash(nextTree) + } + + hasSessionModule(modules: Module[]): boolean { + return modules.some((m) => Address.isEqual(m.sapientLeaf.address, this.shared.sequence.extensions.sessions)) + } + + async addIdentitySignerToModules(modules: Module[], address: Address.Address) { + if (!this.hasSessionModule(modules)) { + throw new Error('session-module-not-enabled') + } + + await this.updateSessionModule(modules, (topology) => { + const existingSigners = SessionConfig.getIdentitySigners(topology) + if (existingSigners?.some((s) => Address.isEqual(s, address))) { + return topology + } + + return SessionConfig.addIdentitySigner(topology, address) + }) + } + + async removeIdentitySignerFromModules(modules: Module[], address: Address.Address) { + if (!this.hasSessionModule(modules)) { + throw new Error('session-module-not-enabled') + } + + await this.updateSessionModule(modules, (topology) => { + const newTopology = SessionConfig.removeIdentitySigner(topology, address) + if (!newTopology) { + // Can't remove the last identity signer + throw new Error('Cannot remove the last identity signer') + } + return newTopology + }) + } + async prepareAuthorizeImplicitSession( walletAddress: Address.Address, sessionAddress: Address.Address, diff --git a/packages/wallet/wdk/src/sequence/wallets.ts b/packages/wallet/wdk/src/sequence/wallets.ts index 1e8ac963a4..9592c68875 100644 --- a/packages/wallet/wdk/src/sequence/wallets.ts +++ b/packages/wallet/wdk/src/sequence/wallets.ts @@ -817,8 +817,9 @@ export class Wallets implements WalletsInterface { let modules: Module[] = [] if (!args.noSessionManager) { - // Calculate image hash with the identity signer - const sessionsTopology = SessionConfig.emptySessionsTopology(loginSignerAddress) + // Calculate image hash with the identity and device signer + let sessionsTopology = SessionConfig.emptySessionsTopology(loginSignerAddress) + sessionsTopology = SessionConfig.addIdentitySigner(sessionsTopology, device.address) // Store this tree in the state provider const sessionsConfigTree = SessionConfig.sessionsTopologyToConfigurationTree(sessionsTopology) this.shared.sequence.stateProvider.saveTree(sessionsConfigTree) @@ -1008,6 +1009,10 @@ export class Wallets implements WalletsInterface { await this.shared.modules.recovery.addRecoverySignerToModules(modules, device.address) } + if (this.shared.modules.sessions.hasSessionModule(modules)) { + await this.shared.modules.sessions.addIdentitySignerToModules(modules, device.address) + } + const walletEntryToUpdate: Wallet = { ...(existingWallet as Wallet), address: args.wallet, @@ -1376,6 +1381,11 @@ export class Wallets implements WalletsInterface { await this.shared.modules.recovery.removeRecoverySignerFromModules(modules, deviceToRemove) } + // Remove the device from the session module's topology as well. + if (this.shared.modules.sessions.hasSessionModule(modules)) { + await this.shared.modules.sessions.removeIdentitySignerFromModules(modules, deviceToRemove) + } + // Request the configuration update. const requestId = await this.requestConfigurationUpdate( wallet, From 21074894ee512c4bb65f1f86b5ae67eda8ee1ed0 Mon Sep 17 00:00:00 2001 From: Michael Standen Date: Tue, 16 Sep 2025 20:56:30 +1200 Subject: [PATCH 034/119] Remove invalid test --- packages/wallet/primitives/test/session-config.test.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/wallet/primitives/test/session-config.test.ts b/packages/wallet/primitives/test/session-config.test.ts index d7bce1ec73..caba743b1b 100644 --- a/packages/wallet/primitives/test/session-config.test.ts +++ b/packages/wallet/primitives/test/session-config.test.ts @@ -622,10 +622,6 @@ describe('Session Config', () => { expect(blacklist).toBeTruthy() expect(identitySigners).toBeTruthy() }) - - it('should throw when missing blacklist or identity signer', () => { - expect(() => balanceSessionsTopology(sampleSessionPermissionsLeaf)).toThrow('No blacklist or identity signer') - }) }) describe('cleanSessionsTopology', () => { From abf4a18ba61ed1be9b3361f932dc30d745e82f39 Mon Sep 17 00:00:00 2001 From: Michael Standen Date: Wed, 17 Sep 2025 14:42:17 +1200 Subject: [PATCH 035/119] Fix recursion --- packages/wallet/primitives/src/session-config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/wallet/primitives/src/session-config.ts b/packages/wallet/primitives/src/session-config.ts index c8583916c2..0e11c8d190 100644 --- a/packages/wallet/primitives/src/session-config.ts +++ b/packages/wallet/primitives/src/session-config.ts @@ -650,7 +650,7 @@ export function minimiseSessionsTopology( identitySigner?: Address.Address, ): SessionsTopology { if (isSessionsBranch(topology)) { - const branches = topology.map((b) => minimiseSessionsTopology(b, explicitSigners, implicitSigners)) + const branches = topology.map((b) => minimiseSessionsTopology(b, explicitSigners, implicitSigners, identitySigner)) // If all branches are nodes, the branch can be a node too if (branches.every((b) => isSessionsNode(b))) { return Hash.keccak256(Bytes.concat(...branches.map((b) => Hex.toBytes(b))), { as: 'Hex' }) From d387a8e788674bf2e182dc12b11d39169fe3ada9 Mon Sep 17 00:00:00 2001 From: Michael Standen Date: Wed, 17 Sep 2025 14:50:01 +1200 Subject: [PATCH 036/119] Fix comment --- packages/wallet/primitives/src/session-config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/wallet/primitives/src/session-config.ts b/packages/wallet/primitives/src/session-config.ts index 0e11c8d190..fb6dd21feb 100644 --- a/packages/wallet/primitives/src/session-config.ts +++ b/packages/wallet/primitives/src/session-config.ts @@ -75,7 +75,7 @@ export function isCompleteSessionsTopology(topology: any): topology is SessionsT if (!isSessionsTopology(topology)) { return false } - // Check the topology contains exactly one identity signer and one blacklist + // Check the topology contains at least one identity signer and exactly one blacklist const { identitySignerCount, blacklistCount } = checkIsCompleteSessionsBranch(topology) return identitySignerCount >= 1 && blacklistCount === 1 } From d84f173ad7e4e76c713f0706211c1003ac3f34af Mon Sep 17 00:00:00 2001 From: Michael Standen Date: Wed, 17 Sep 2025 14:58:30 +1200 Subject: [PATCH 037/119] Improve test stability by reducing race conditions --- .../wallet/core/test/session-manager.test.ts | 97 ++++++++++++++++--- 1 file changed, 84 insertions(+), 13 deletions(-) diff --git a/packages/wallet/core/test/session-manager.test.ts b/packages/wallet/core/test/session-manager.test.ts index 330e941b7e..cf1915036e 100644 --- a/packages/wallet/core/test/session-manager.test.ts +++ b/packages/wallet/core/test/session-manager.test.ts @@ -52,12 +52,7 @@ for (const extension of ALL_EXTENSIONS) { describe(`SessionManager (${extension.name})`, () => { const timeout = 30000 - const identityPrivateKey = Secp256k1.randomPrivateKey() - const identityAddress = Address.fromPublicKey(Secp256k1.getPublicKey({ privateKey: identityPrivateKey })) - - const stateProvider = new State.Local.Provider() - - const createImplicitSigner = async (redirectUrl: string, signingKey?: Hex.Hex) => { + const createImplicitSigner = async (redirectUrl: string, signingKey: Hex.Hex) => { const implicitPrivateKey = Secp256k1.randomPrivateKey() const implicitAddress = Address.fromPublicKey(Secp256k1.getPublicKey({ privateKey: implicitPrivateKey })) const attestation: Attestation.Attestation = { @@ -73,7 +68,7 @@ for (const extension of ALL_EXTENSIONS) { } const identitySignature = Secp256k1.sign({ payload: Attestation.hash(attestation), - privateKey: signingKey ?? identityPrivateKey, + privateKey: signingKey, }) return new Signers.Session.Implicit(implicitPrivateKey, attestation, identitySignature, implicitAddress) } @@ -84,6 +79,11 @@ for (const extension of ALL_EXTENSIONS) { const provider = Provider.from(RpcTransport.fromHttp(LOCAL_RPC_URL)) const chainId = Number(await provider.request({ method: 'eth_chainId' })) + // Create unique identity and state provider for this test + const identityPrivateKey = Secp256k1.randomPrivateKey() + const identityAddress = Address.fromPublicKey(Secp256k1.getPublicKey({ privateKey: identityPrivateKey })) + const stateProvider = new State.Local.Provider() + let topology = SessionConfig.emptySessionsTopology(identityAddress) // Add random signer to the topology const sessionPermission: Signers.Session.ExplicitParams = { @@ -166,6 +166,11 @@ for (const extension of ALL_EXTENSIONS) { async () => { const provider = Provider.from(RpcTransport.fromHttp(LOCAL_RPC_URL)) + // Create unique identity and state provider for this test + const identityPrivateKey = Secp256k1.randomPrivateKey() + const identityAddress = Address.fromPublicKey(Secp256k1.getPublicKey({ privateKey: identityPrivateKey })) + const stateProvider = new State.Local.Provider() + // Create implicit signer const implicitPrivateKey = Secp256k1.randomPrivateKey() const implicitAddress = Address.fromPublicKey(Secp256k1.getPublicKey({ privateKey: implicitPrivateKey })) @@ -199,7 +204,11 @@ for (const extension of ALL_EXTENSIONS) { { threshold: 1n, checkpoint: 0n, - topology: { type: 'sapient-signer', address: extension.sessions, weight: 1n, imageHash }, + topology: [ + { type: 'sapient-signer', address: extension.sessions, weight: 1n, imageHash }, + // Include a random node leaf (bytes32) to prevent image hash collision + Hex.random(32), + ], }, { stateProvider, @@ -248,8 +257,13 @@ for (const extension of ALL_EXTENSIONS) { async () => { const provider = Provider.from(RpcTransport.fromHttp(LOCAL_RPC_URL)) - const implicitSigner1 = await createImplicitSigner('https://example.com') - const implicitSigner2 = await createImplicitSigner('https://another-example.com') + // Create unique identity and state provider for this test + const identityPrivateKey = Secp256k1.randomPrivateKey() + const identityAddress = Address.fromPublicKey(Secp256k1.getPublicKey({ privateKey: identityPrivateKey })) + const stateProvider = new State.Local.Provider() + + const implicitSigner1 = await createImplicitSigner('https://example.com', identityPrivateKey) + const implicitSigner2 = await createImplicitSigner('https://another-example.com', identityPrivateKey) const topology = SessionConfig.emptySessionsTopology(identityAddress) await stateProvider.saveTree(SessionConfig.sessionsTopologyToConfigurationTree(topology)) const imageHash = GenericTree.hash(SessionConfig.sessionsTopologyToConfigurationTree(topology)) @@ -257,7 +271,11 @@ for (const extension of ALL_EXTENSIONS) { { threshold: 1n, checkpoint: 0n, - topology: { type: 'sapient-signer', address: extension.sessions, weight: 1n, imageHash }, + topology: [ + { type: 'sapient-signer', address: extension.sessions, weight: 1n, imageHash }, + // Include a random node leaf (bytes32) to prevent image hash collision + Hex.random(32), + ], }, { stateProvider, @@ -318,6 +336,11 @@ for (const extension of ALL_EXTENSIONS) { async () => { const provider = Provider.from(RpcTransport.fromHttp(LOCAL_RPC_URL)) + // Create unique identity and state provider for this test + const identityPrivateKey = Secp256k1.randomPrivateKey() + const identityAddress = Address.fromPublicKey(Secp256k1.getPublicKey({ privateKey: identityPrivateKey })) + const stateProvider = new State.Local.Provider() + const identityPrivateKey2 = Secp256k1.randomPrivateKey() const identityAddress2 = Address.fromPublicKey(Secp256k1.getPublicKey({ privateKey: identityPrivateKey2 })) @@ -331,7 +354,11 @@ for (const extension of ALL_EXTENSIONS) { { threshold: 1n, checkpoint: 0n, - topology: { type: 'sapient-signer', address: extension.sessions, weight: 1n, imageHash }, + topology: [ + { type: 'sapient-signer', address: extension.sessions, weight: 1n, imageHash }, + // Include a random node leaf (bytes32) to prevent image hash collision + Hex.random(32), + ], }, { stateProvider, @@ -385,6 +412,11 @@ for (const extension of ALL_EXTENSIONS) { const provider = Provider.from(RpcTransport.fromHttp(LOCAL_RPC_URL)) const chainId = Number(await provider.request({ method: 'eth_chainId' })) + // Create unique identity and state provider for this test + const identityPrivateKey = Secp256k1.randomPrivateKey() + const identityAddress = Address.fromPublicKey(Secp256k1.getPublicKey({ privateKey: identityPrivateKey })) + const stateProvider = new State.Local.Provider() + // Create explicit signer const explicitPrivateKey = Secp256k1.randomPrivateKey() const explicitPermissions: Signers.Session.ExplicitParams = { @@ -405,7 +437,11 @@ for (const extension of ALL_EXTENSIONS) { { threshold: 1n, checkpoint: 0n, - topology: { type: 'sapient-signer', address: extension.sessions, weight: 1n, imageHash }, + topology: [ + { type: 'sapient-signer', address: extension.sessions, weight: 1n, imageHash }, + // Include a random node leaf (bytes32) to prevent image hash collision + Hex.random(32), + ], }, { stateProvider, @@ -596,6 +632,11 @@ for (const extension of ALL_EXTENSIONS) { const provider = Provider.from(RpcTransport.fromHttp(LOCAL_RPC_URL)) const chainId = Number(await provider.request({ method: 'eth_chainId' })) + // Create unique identity and state provider for this test + const identityPrivateKey = Secp256k1.randomPrivateKey() + const identityAddress = Address.fromPublicKey(Secp256k1.getPublicKey({ privateKey: identityPrivateKey })) + const stateProvider = new State.Local.Provider() + // Create an implicit signer const implicitPrivateKey = Secp256k1.randomPrivateKey() const implicitAddress = Address.fromPublicKey(Secp256k1.getPublicKey({ privateKey: implicitPrivateKey })) @@ -668,6 +709,11 @@ for (const extension of ALL_EXTENSIONS) { const provider = Provider.from(RpcTransport.fromHttp(LOCAL_RPC_URL)) const chainId = Number(await provider.request({ method: 'eth_chainId' })) + // Create unique identity and state provider for this test + const identityPrivateKey = Secp256k1.randomPrivateKey() + const identityAddress = Address.fromPublicKey(Secp256k1.getPublicKey({ privateKey: identityPrivateKey })) + const stateProvider = new State.Local.Provider() + // Create explicit signer const explicitPrivateKey = Secp256k1.randomPrivateKey() const sessionPermission: Signers.Session.ExplicitParams = { @@ -736,6 +782,11 @@ for (const extension of ALL_EXTENSIONS) { const provider = Provider.from(RpcTransport.fromHttp(LOCAL_RPC_URL)) const chainId = Number(await provider.request({ method: 'eth_chainId' })) + // Create unique identity and state provider for this test + const identityPrivateKey = Secp256k1.randomPrivateKey() + const identityAddress = Address.fromPublicKey(Secp256k1.getPublicKey({ privateKey: identityPrivateKey })) + const stateProvider = new State.Local.Provider() + // Create explicit signer const explicitPrivateKey = Secp256k1.randomPrivateKey() const sessionPermission: Signers.Session.ExplicitParams = { @@ -823,6 +874,11 @@ for (const extension of ALL_EXTENSIONS) { const provider = Provider.from(RpcTransport.fromHttp(LOCAL_RPC_URL)) const chainId = Number(await provider.request({ method: 'eth_chainId' })) + // Create unique identity and state provider for this test + const identityPrivateKey = Secp256k1.randomPrivateKey() + const identityAddress = Address.fromPublicKey(Secp256k1.getPublicKey({ privateKey: identityPrivateKey })) + const stateProvider = new State.Local.Provider() + // Create explicit signer const explicitPrivateKey = Secp256k1.randomPrivateKey() const explicitAddress = Address.fromPublicKey(Secp256k1.getPublicKey({ privateKey: explicitPrivateKey })) @@ -921,6 +977,11 @@ for (const extension of ALL_EXTENSIONS) { const provider = Provider.from(RpcTransport.fromHttp(LOCAL_RPC_URL)) const chainId = Number(await provider.request({ method: 'eth_chainId' })) + // Create unique identity and state provider for this test + const identityPrivateKey = Secp256k1.randomPrivateKey() + const identityAddress = Address.fromPublicKey(Secp256k1.getPublicKey({ privateKey: identityPrivateKey })) + const stateProvider = new State.Local.Provider() + // Create explicit signer const explicitPrivateKey = Secp256k1.randomPrivateKey() const explicitAddress = Address.fromPublicKey(Secp256k1.getPublicKey({ privateKey: explicitPrivateKey })) @@ -1026,6 +1087,11 @@ for (const extension of ALL_EXTENSIONS) { const provider = Provider.from(RpcTransport.fromHttp(LOCAL_RPC_URL)) const chainId = Number(await provider.request({ method: 'eth_chainId' })) + // Create unique identity and state provider for this test + const identityPrivateKey = Secp256k1.randomPrivateKey() + const identityAddress = Address.fromPublicKey(Secp256k1.getPublicKey({ privateKey: identityPrivateKey })) + const stateProvider = new State.Local.Provider() + // Create explicit signer const explicitPrivateKey = Secp256k1.randomPrivateKey() const explicitAddress = Address.fromPublicKey(Secp256k1.getPublicKey({ privateKey: explicitPrivateKey })) @@ -1145,6 +1211,11 @@ for (const extension of ALL_EXTENSIONS) { const provider = Provider.from(RpcTransport.fromHttp(LOCAL_RPC_URL)) const chainId = Number(await provider.request({ method: 'eth_chainId' })) + // Create unique identity and state provider for this test + const identityPrivateKey = Secp256k1.randomPrivateKey() + const identityAddress = Address.fromPublicKey(Secp256k1.getPublicKey({ privateKey: identityPrivateKey })) + const stateProvider = new State.Local.Provider() + // Create explicit signer const explicitPrivateKey = Secp256k1.randomPrivateKey() const explicitAddress = Address.fromPublicKey(Secp256k1.getPublicKey({ privateKey: explicitPrivateKey })) From 5323e8df3f511d46a7e89f2ccb640f1f2da3c650 Mon Sep 17 00:00:00 2001 From: Michael Standen Date: Thu, 18 Sep 2025 14:41:15 +1200 Subject: [PATCH 038/119] Do not set passkey signer as identity signer --- .../wallet/primitives/src/session-config.ts | 15 ++++++---- .../primitives/test/session-config.test.ts | 15 ++++++++++ packages/wallet/wdk/src/sequence/sessions.ts | 30 +++++++++++++++++++ packages/wallet/wdk/src/sequence/wallets.ts | 29 ++++-------------- 4 files changed, 59 insertions(+), 30 deletions(-) diff --git a/packages/wallet/primitives/src/session-config.ts b/packages/wallet/primitives/src/session-config.ts index fb6dd21feb..8d61113a4f 100644 --- a/packages/wallet/primitives/src/session-config.ts +++ b/packages/wallet/primitives/src/session-config.ts @@ -723,15 +723,18 @@ export function removeFromImplicitBlacklist(topology: SessionsTopology, address: /** * Generate an empty sessions topology with the given identity signer. No session permission and an empty blacklist */ -export function emptySessionsTopology(identitySigner: Address.Address): SessionsTopology { - return [ +export function emptySessionsTopology( + identitySigner: Address.Address | [Address.Address, ...Address.Address[]], +): SessionsTopology { + if (!Array.isArray(identitySigner)) { + return emptySessionsTopology([identitySigner]) + } + const flattenedTopology: SessionLeaf[] = [ { type: 'implicit-blacklist', blacklist: [], }, - { - type: 'identity-signer', - identitySigner, - }, + ...identitySigner.map((signer): IdentitySignerLeaf => ({ type: 'identity-signer', identitySigner: signer })), ] + return buildBalancedSessionsTopology(flattenedTopology) } diff --git a/packages/wallet/primitives/test/session-config.test.ts b/packages/wallet/primitives/test/session-config.test.ts index caba743b1b..15e178f8cf 100644 --- a/packages/wallet/primitives/test/session-config.test.ts +++ b/packages/wallet/primitives/test/session-config.test.ts @@ -800,6 +800,21 @@ describe('Session Config', () => { const explicitSigners = getExplicitSigners(result) expect(explicitSigners).toEqual([]) }) + + it('should create empty topology with multiple identity signers', () => { + const result = emptySessionsTopology([testAddress1, testAddress2]) + + expect(isCompleteSessionsTopology(result)).toBe(true) + + const identitySigners = getIdentitySigners(result) + expect(identitySigners).toEqual([testAddress1, testAddress2]) + + const blacklist = getImplicitBlacklist(result) + expect(blacklist).toEqual([]) + + const explicitSigners = getExplicitSigners(result) + expect(explicitSigners).toEqual([]) + }) }) }) diff --git a/packages/wallet/wdk/src/sequence/sessions.ts b/packages/wallet/wdk/src/sequence/sessions.ts index 203eaf598c..8a6bc2d8a0 100644 --- a/packages/wallet/wdk/src/sequence/sessions.ts +++ b/packages/wallet/wdk/src/sequence/sessions.ts @@ -264,6 +264,36 @@ export class Sessions implements SessionsInterface { return modules.some((m) => Address.isEqual(m.sapientLeaf.address, this.shared.sequence.extensions.sessions)) } + async initSessionModule(modules: Module[], identitySigners: Address.Address[], guardTopology?: Config.NestedLeaf) { + if (this.hasSessionModule(modules)) { + throw new Error('session-module-already-initialized') + } + + if (identitySigners.length === 0) { + throw new Error('No identity signers provided') + } + + // Calculate image hash with the identity signers + const sessionsTopology = SessionConfig.emptySessionsTopology( + identitySigners as [Address.Address, ...Address.Address[]], + ) + // Store this tree in the state provider + const sessionsConfigTree = SessionConfig.sessionsTopologyToConfigurationTree(sessionsTopology) + this.shared.sequence.stateProvider.saveTree(sessionsConfigTree) + // Prepare the configuration leaf + const sessionsImageHash = GenericTree.hash(sessionsConfigTree) + const signer = { + ...ManagerOptionsDefaults.defaultSessionsTopology, + address: this.shared.sequence.extensions.sessions, + imageHash: sessionsImageHash, + } + modules.push({ + sapientLeaf: signer, + weight: 255n, + guardLeaf: guardTopology, + }) + } + async addIdentitySignerToModules(modules: Module[], address: Address.Address) { if (!this.hasSessionModule(modules)) { throw new Error('session-module-not-enabled') diff --git a/packages/wallet/wdk/src/sequence/wallets.ts b/packages/wallet/wdk/src/sequence/wallets.ts index 9592c68875..a859ca797e 100644 --- a/packages/wallet/wdk/src/sequence/wallets.ts +++ b/packages/wallet/wdk/src/sequence/wallets.ts @@ -817,31 +817,12 @@ export class Wallets implements WalletsInterface { let modules: Module[] = [] if (!args.noSessionManager) { - // Calculate image hash with the identity and device signer - let sessionsTopology = SessionConfig.emptySessionsTopology(loginSignerAddress) - sessionsTopology = SessionConfig.addIdentitySigner(sessionsTopology, device.address) - // Store this tree in the state provider - const sessionsConfigTree = SessionConfig.sessionsTopologyToConfigurationTree(sessionsTopology) - this.shared.sequence.stateProvider.saveTree(sessionsConfigTree) - // Prepare the configuration leaf - const sessionsImageHash = GenericTree.hash(sessionsConfigTree) - const signer = { - ...ManagerOptionsDefaults.defaultSessionsTopology, - address: this.shared.sequence.extensions.sessions, - imageHash: sessionsImageHash, - } - if (sessionsGuardTopology) { - modules.push({ - sapientLeaf: signer, - weight: 255n, - guardLeaf: sessionsGuardTopology, - }) - } else { - modules.push({ - sapientLeaf: signer, - weight: 255n, - }) + const identitySigners = [device.address] + if (!Signers.isSapientSigner(loginSigner.signer)) { + // Add non sapient login signer to the identity signers + identitySigners.unshift(loginSignerAddress) } + await this.shared.modules.sessions.initSessionModule(modules, identitySigners, sessionsGuardTopology) } if (!args.noRecovery) { From b2d1897ad668928466b8384970af80c9177d99b3 Mon Sep 17 00:00:00 2001 From: Michael Standen Date: Mon, 22 Sep 2025 09:40:39 +1200 Subject: [PATCH 039/119] Use length checks --- packages/wallet/wdk/src/sequence/sessions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/wallet/wdk/src/sequence/sessions.ts b/packages/wallet/wdk/src/sequence/sessions.ts index 8a6bc2d8a0..a115005598 100644 --- a/packages/wallet/wdk/src/sequence/sessions.ts +++ b/packages/wallet/wdk/src/sequence/sessions.ts @@ -331,7 +331,7 @@ export class Sessions implements SessionsInterface { ): Promise { const topology = await this.getTopology(walletAddress) const identitySigners = SessionConfig.getIdentitySigners(topology) - if (!identitySigners) { + if (identitySigners.length === 0) { throw new Error('No identity signers found') } let handler: Handler | undefined From 1b7417477692321e599887700b54275600ed9f66 Mon Sep 17 00:00:00 2001 From: Michael Standen Date: Mon, 22 Sep 2025 09:41:09 +1200 Subject: [PATCH 040/119] Throw on missing identity signer --- packages/wallet/primitives/src/session-signature.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/wallet/primitives/src/session-signature.ts b/packages/wallet/primitives/src/session-signature.ts index 84ea3123bd..bdde4b8572 100644 --- a/packages/wallet/primitives/src/session-signature.ts +++ b/packages/wallet/primitives/src/session-signature.ts @@ -129,7 +129,7 @@ export function encodeSessionCallSignatures( } if (implicitSigners.length > 0 && !identitySigner) { - console.warn('Encodings using implicit signers without identity signer may encode incorrectly') + throw new Error('Implicit signers without identity signer') } // Check the topology contains exactly one identity signer From 1a8f595f0cfcd1b76056eb8c89277d247079d2c5 Mon Sep 17 00:00:00 2001 From: Michael Standen Date: Mon, 22 Sep 2025 09:59:15 +1200 Subject: [PATCH 041/119] Encoding requires identity signer to encode --- .../core/src/signers/session-manager.ts | 13 +++++- .../primitives-cli/src/subcommands/server.ts | 2 +- .../primitives-cli/src/subcommands/session.ts | 20 ++++++++- .../primitives/src/session-signature.ts | 17 ++------ .../primitives/test/session-signature.test.ts | 42 +++++++++---------- 5 files changed, 55 insertions(+), 39 deletions(-) diff --git a/packages/wallet/core/src/signers/session-manager.ts b/packages/wallet/core/src/signers/session-manager.ts index 12917553bc..99d189131e 100644 --- a/packages/wallet/core/src/signers/session-manager.ts +++ b/packages/wallet/core/src/signers/session-manager.ts @@ -292,7 +292,7 @@ export class SessionManager implements SapientSigner { } } - // Encode the signature + // Prepare encoding params const explicitSigners: Address.Address[] = [] const implicitSigners: Address.Address[] = [] let identitySigner: Address.Address | undefined @@ -315,13 +315,22 @@ export class SessionManager implements SapientSigner { } }), ) + if (!identitySigner) { + // Explicit signers only. Use any identity signer + const identitySigners = SessionConfig.getIdentitySigners(await this.topology) + if (identitySigners.length === 0) { + throw new Error('No identity signers found') + } + identitySigner = identitySigners[0]! + } + // Perform encoding const encodedSignature = SessionSignature.encodeSessionCallSignatures( signatures, await this.topology, + identitySigner, explicitSigners, implicitSigners, - identitySigner, ) return { diff --git a/packages/wallet/primitives-cli/src/subcommands/server.ts b/packages/wallet/primitives-cli/src/subcommands/server.ts index bef0e8fa21..29c5e1118b 100644 --- a/packages/wallet/primitives-cli/src/subcommands/server.ts +++ b/packages/wallet/primitives-cli/src/subcommands/server.ts @@ -141,9 +141,9 @@ const rpcMethods: Record Promise> = { const result = await session.doEncodeSessionCallSignatures( JSON.stringify(sessionTopology), callSignatures.map(JSON.stringify), + identitySigner, explicitSigners, implicitSigners, - identitySigner, ) return result }, diff --git a/packages/wallet/primitives-cli/src/subcommands/session.ts b/packages/wallet/primitives-cli/src/subcommands/session.ts index 4217c84186..28453121c3 100644 --- a/packages/wallet/primitives-cli/src/subcommands/session.ts +++ b/packages/wallet/primitives-cli/src/subcommands/session.ts @@ -19,18 +19,26 @@ export async function doEncodeTopology(sessionTopologyInput: string): Promise { const sessionTopology = SessionConfig.sessionsTopologyFromJson(sessionTopologyInput) const callSignatures = callSignaturesInput.map((s) => SessionSignature.sessionCallSignatureFromJson(s)) + // Use first identity signer if not provided + if (!identitySigner) { + const identitySigners = SessionConfig.getIdentitySigners(sessionTopology) + if (identitySigners.length === 0) { + throw new Error('No identity signers found') + } + identitySigner = identitySigners[0]! + } const encoded = SessionSignature.encodeSessionCallSignatures( callSignatures, sessionTopology, + identitySigner as `0x${string}`, explicitSigners as `0x${string}`[], implicitSigners as `0x${string}`[], - identitySigner as `0x${string}` | undefined, ) return Hex.from(encoded) } @@ -92,6 +100,13 @@ const sessionCommand: CommandModule = { description: 'The call signatures', demandOption: true, }) + .option('identity-signer', { + type: 'string', + description: 'The identity signer', + demandOption: false, + default: undefined, + alias: 'id', + }) .option('explicit-signers', { type: 'string', array: true, @@ -114,6 +129,7 @@ const sessionCommand: CommandModule = { await doEncodeSessionCallSignatures( args.sessionTopology, args.callSignatures, + args.identitySigner, args.explicitSigners, args.implicitSigners, ), diff --git a/packages/wallet/primitives/src/session-signature.ts b/packages/wallet/primitives/src/session-signature.ts index bdde4b8572..6f92fa5be1 100644 --- a/packages/wallet/primitives/src/session-signature.ts +++ b/packages/wallet/primitives/src/session-signature.ts @@ -116,9 +116,9 @@ function rsyFromRsvStr(sigStr: string): RSY { export function encodeSessionCallSignatures( callSignatures: SessionCallSignature[], topology: SessionsTopology, + identitySigner: Address.Address, explicitSigners: Address.Address[] = [], implicitSigners: Address.Address[] = [], - identitySigner?: Address.Address, ): Bytes.Bytes { const parts: Bytes.Bytes[] = [] @@ -128,19 +128,10 @@ export function encodeSessionCallSignatures( throw new Error('Incomplete topology') } - if (implicitSigners.length > 0 && !identitySigner) { - throw new Error('Implicit signers without identity signer') - } - - // Check the topology contains exactly one identity signer + // Check the topology contains the identity signer const identitySigners = getIdentitySigners(topology) - if (identitySigner) { - if (!identitySigners.some((s) => Address.isEqual(s, identitySigner!))) { - throw new Error('Identity signer not found') - } - } else { - // Grab the first one - identitySigner = identitySigners[0]! + if (!identitySigners.some((s) => Address.isEqual(s, identitySigner))) { + throw new Error('Identity signer not found') } // Optimise the configuration tree by rolling unused signers into nodes. diff --git a/packages/wallet/primitives/test/session-signature.test.ts b/packages/wallet/primitives/test/session-signature.test.ts index 0e1eff066c..a9b193d79c 100644 --- a/packages/wallet/primitives/test/session-signature.test.ts +++ b/packages/wallet/primitives/test/session-signature.test.ts @@ -280,7 +280,7 @@ describe('Session Signature', () => { describe('encodeSessionCallSignatures', () => { it('should encode single explicit session call signature', () => { const callSignatures = [sampleExplicitSignature] - const result = encodeSessionCallSignatures(callSignatures, completeTopology) + const result = encodeSessionCallSignatures(callSignatures, completeTopology, testAddress1) expect(result).toBeInstanceOf(Uint8Array) expect(result.length).toBeGreaterThan(0) @@ -289,7 +289,7 @@ describe('Session Signature', () => { // Skip implicit signature tests that cause encoding issues it.skip('should encode single implicit session call signature', () => { const callSignatures = [sampleImplicitSignature] - const result = encodeSessionCallSignatures(callSignatures, completeTopology) + const result = encodeSessionCallSignatures(callSignatures, completeTopology, testAddress1) expect(result).toBeInstanceOf(Uint8Array) expect(result.length).toBeGreaterThan(0) @@ -297,7 +297,7 @@ describe('Session Signature', () => { it.skip('should encode multiple mixed session call signatures', () => { const callSignatures = [sampleImplicitSignature, sampleExplicitSignature] - const result = encodeSessionCallSignatures(callSignatures, completeTopology) + const result = encodeSessionCallSignatures(callSignatures, completeTopology, testAddress1) expect(result).toBeInstanceOf(Uint8Array) expect(result.length).toBeGreaterThan(0) @@ -311,7 +311,7 @@ describe('Session Signature', () => { sessionSignature: sampleRSY2, // Different session signature }, ] - const result = encodeSessionCallSignatures(callSignatures, completeTopology) + const result = encodeSessionCallSignatures(callSignatures, completeTopology, testAddress1) expect(result).toBeInstanceOf(Uint8Array) expect(result.length).toBeGreaterThan(0) @@ -347,7 +347,7 @@ describe('Session Signature', () => { // Missing identity signer, but has 2 elements for valid SessionBranch ] - expect(() => encodeSessionCallSignatures([sampleExplicitSignature], incompleteTopology)).toThrow( + expect(() => encodeSessionCallSignatures([sampleExplicitSignature], incompleteTopology, testAddress1)).toThrow( 'Incomplete topology', ) }) @@ -358,7 +358,7 @@ describe('Session Signature', () => { sessionSignature: sampleRSY, } - expect(() => encodeSessionCallSignatures([largeIndexSignature], completeTopology)).toThrow( + expect(() => encodeSessionCallSignatures([largeIndexSignature], completeTopology, testAddress1)).toThrow( 'Permission index is too large', ) }) @@ -372,13 +372,13 @@ describe('Session Signature', () => { sessionSignature: sampleRSY, })) - const result = encodeSessionCallSignatures(callSignatures, completeTopology) + const result = encodeSessionCallSignatures(callSignatures, completeTopology, testAddress1) expect(result).toBeInstanceOf(Uint8Array) }) it('should handle explicit signers parameter', () => { const callSignatures = [sampleExplicitSignature] - const result = encodeSessionCallSignatures(callSignatures, completeTopology, [testAddress1]) + const result = encodeSessionCallSignatures(callSignatures, completeTopology, testAddress1) expect(result).toBeInstanceOf(Uint8Array) expect(result.length).toBeGreaterThan(0) @@ -386,7 +386,7 @@ describe('Session Signature', () => { it('should handle implicit signers parameter', () => { const callSignatures = [sampleExplicitSignature] - const result = encodeSessionCallSignatures(callSignatures, completeTopology, [], [testAddress2]) + const result = encodeSessionCallSignatures(callSignatures, completeTopology, testAddress1, [], [testAddress2]) expect(result).toBeInstanceOf(Uint8Array) expect(result.length).toBeGreaterThan(0) @@ -394,16 +394,16 @@ describe('Session Signature', () => { it('should throw for invalid call signature type', () => { const invalidSignature = {} as any - expect(() => encodeSessionCallSignatures([invalidSignature], completeTopology)).toThrow( + expect(() => encodeSessionCallSignatures([invalidSignature], completeTopology, testAddress1)).toThrow( 'Invalid call signature', ) }) it('should throw for identity signer not found', () => { const callSignatures = [sampleExplicitSignature] - expect(() => encodeSessionCallSignatures(callSignatures, completeTopology, [], [], testAddress2)).toThrow( - 'Identity signer not found', - ) + expect(() => + encodeSessionCallSignatures(callSignatures, completeTopology, testAddress2, [], [testAddress2]), + ).toThrow('Identity signer not found') }) }) }) @@ -532,7 +532,7 @@ describe('Session Signature', () => { describe('Edge Cases and Error Handling', () => { it('should handle empty call signatures array', () => { - const result = encodeSessionCallSignatures([], completeTopology) + const result = encodeSessionCallSignatures([], completeTopology, testAddress1) expect(result).toBeInstanceOf(Uint8Array) expect(result.length).toBeGreaterThan(0) // Should still contain topology }) @@ -543,7 +543,7 @@ describe('Session Signature', () => { sessionSignature: sampleRSY, } - const result = encodeSessionCallSignatures([maxIndexSignature], completeTopology) + const result = encodeSessionCallSignatures([maxIndexSignature], completeTopology, testAddress1) expect(result).toBeInstanceOf(Uint8Array) }) @@ -553,7 +553,7 @@ describe('Session Signature', () => { sessionSignature: sampleRSY, } - const result = encodeSessionCallSignatures([zeroIndexSignature], completeTopology) + const result = encodeSessionCallSignatures([zeroIndexSignature], completeTopology, testAddress1) expect(result).toBeInstanceOf(Uint8Array) }) @@ -602,7 +602,7 @@ describe('Session Signature', () => { sessionSignature: sampleRSY2, } - const result = encodeSessionCallSignatures([minimalImplicitSignature], completeTopology) + const result = encodeSessionCallSignatures([minimalImplicitSignature], completeTopology, testAddress1) expect(result).toBeInstanceOf(Uint8Array) }) @@ -646,7 +646,7 @@ describe('Session Signature', () => { // This test may not actually trigger the error since creating a 3-byte overflow is complex // We'll test that the function works with a large but valid topology - const result = encodeSessionCallSignatures(callSignatures, largeTopology) + const result = encodeSessionCallSignatures(callSignatures, largeTopology, testAddress1) expect(result).toBeInstanceOf(Uint8Array) }) @@ -669,7 +669,7 @@ describe('Session Signature', () => { const callSignatures: ExplicitSessionCallSignature[] = [invalidExplicitSignature] expect(() => { - encodeSessionCallSignatures(callSignatures, completeTopology) + encodeSessionCallSignatures(callSignatures, completeTopology, testAddress1) }).toThrow() // Should throw due to permission index validation }) }) @@ -685,7 +685,7 @@ describe('Session Signature', () => { ] // Encode - const encoded = encodeSessionCallSignatures(callSignatures, completeTopology, [testAddress1]) + const encoded = encodeSessionCallSignatures(callSignatures, completeTopology, testAddress1) expect(encoded).toBeInstanceOf(Uint8Array) // Test encoding for each signature @@ -733,7 +733,7 @@ describe('Session Signature', () => { }, ] - const result = encodeSessionCallSignatures(callSignatures, completeTopology) + const result = encodeSessionCallSignatures(callSignatures, completeTopology, testAddress1) expect(result).toBeInstanceOf(Uint8Array) expect(result.length).toBeGreaterThan(0) }) From 11e3629bb843f05c94a6269f3915dda9c8007fb5 Mon Sep 17 00:00:00 2001 From: Michael Standen Date: Mon, 22 Sep 2025 10:04:13 +1200 Subject: [PATCH 042/119] Fix test --- packages/wallet/core/test/session-manager.test.ts | 9 +++++++-- .../wallet/core/test/signers-session-implicit.test.ts | 4 ++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/packages/wallet/core/test/session-manager.test.ts b/packages/wallet/core/test/session-manager.test.ts index cf1915036e..bde3b12994 100644 --- a/packages/wallet/core/test/session-manager.test.ts +++ b/packages/wallet/core/test/session-manager.test.ts @@ -504,13 +504,18 @@ for (const extension of ALL_EXTENSIONS) { const provider = Provider.from(RpcTransport.fromHttp(LOCAL_RPC_URL)) const chainId = 0 + // Create unique identity and state provider for this test + const identityPrivateKey = Secp256k1.randomPrivateKey() + const identityAddress = Address.fromPublicKey(Secp256k1.getPublicKey({ privateKey: identityPrivateKey })) + const stateProvider = new State.Local.Provider() + // Create explicit signer const explicitPrivateKey = Secp256k1.randomPrivateKey() const explicitPermissions: Signers.Session.ExplicitParams = { chainId, valueLimit: 1000000000000000000n, // 1 ETH deadline: BigInt(Math.floor(Date.now() / 1000) - 3600), // 1 hour ago - permissions: [PermissionBuilder.for(EMITTER_ADDRESS).allowAll().build()], + permissions: [PermissionBuilder.for(EMITTER_ADDRESS1).allowAll().build()], } const explicitSigner = new Signers.Session.Explicit(explicitPrivateKey, explicitPermissions) // Create the topology and wallet @@ -539,7 +544,7 @@ for (const extension of ALL_EXTENSIONS) { // Create a test transaction within permissions const call: Payload.Call = { - to: EMITTER_ADDRESS, + to: EMITTER_ADDRESS1, value: 0n, data: AbiFunction.encodeData(EMITTER_FUNCTIONS[0]), // Explicit emit gasLimit: 0n, diff --git a/packages/wallet/core/test/signers-session-implicit.test.ts b/packages/wallet/core/test/signers-session-implicit.test.ts index 7d6b0db994..ed66a50afc 100644 --- a/packages/wallet/core/test/signers-session-implicit.test.ts +++ b/packages/wallet/core/test/signers-session-implicit.test.ts @@ -103,7 +103,7 @@ describe('Implicit Session', () => { const result = implicitSigner.isValid(topology, 1) expect(result.isValid).toBe(false) - expect(result.invalidReason).toBe('Identity signer mismatch') + expect(result.invalidReason).toBe('Identity signer not found') }) it('should return true regardless of chainId', () => { @@ -223,7 +223,7 @@ describe('Implicit Session', () => { const result = implicitSigner.isValid(topology, 1) expect(result.isValid).toBe(false) - expect(result.invalidReason).toBe('Identity signer mismatch') + expect(result.invalidReason).toBe('Identity signer not found') }) it('should return false when attestation is issued in the future', () => { From 86abf3f9c58418a2dccb6ddb5048744398318607 Mon Sep 17 00:00:00 2001 From: Gabi <56271768+VGabriel45@users.noreply.github.com> Date: Tue, 23 Sep 2025 18:13:54 +0300 Subject: [PATCH 043/119] Refactor/types namings tsdoc redundant code (#880) * refactor types, namings, ts doc * fix session response payload * change parameter name * change parameter name * change type in tests * improve types and dapp client methods * fix session test to use new types * refactor * refactor implicit sessions array in chain session manager * remove unused types * remove unused types and add ConnectionError * update pnpm lock * move reusable session types to wallet-core * Update some imports and update some response type names --------- Co-authored-by: Tolgahan Arikan --- packages/services/api/src/api.gen.ts | 3779 ++++++++++------- .../relayer/src/rpc-relayer/relayer.gen.ts | 1365 +++--- packages/wallet/core/src/index.ts | 6 + .../wallet/core/src/utils/session/types.ts | 33 + .../wallet/core/test/session-manager.test.ts | 17 +- .../dapp-client/src/ChainSessionManager.ts | 127 +- packages/wallet/dapp-client/src/DappClient.ts | 161 +- packages/wallet/dapp-client/src/index.ts | 18 +- .../wallet/dapp-client/src/types/index.ts | 85 +- .../wallet/dapp-client/src/utils/storage.ts | 11 +- packages/wallet/primitives/src/permission.ts | 4 +- packages/wallet/wdk/src/sequence/sessions.ts | 180 +- .../wallet/wdk/src/sequence/types/sessions.ts | 6 + packages/wallet/wdk/test/sessions.test.ts | 39 +- pnpm-lock.yaml | 1540 +++---- 15 files changed, 3980 insertions(+), 3391 deletions(-) create mode 100644 packages/wallet/core/src/utils/session/types.ts create mode 100644 packages/wallet/wdk/src/sequence/types/sessions.ts diff --git a/packages/services/api/src/api.gen.ts b/packages/services/api/src/api.gen.ts index a42d143d6d..967fad8fe2 100644 --- a/packages/services/api/src/api.gen.ts +++ b/packages/services/api/src/api.gen.ts @@ -5,75 +5,74 @@ // // webrpc-gen -schema=api.ridl -target=typescript -client -out=./clients/api.gen.ts -export const WebrpcHeader = "Webrpc" +export const WebrpcHeader = 'Webrpc' -export const WebrpcHeaderValue = "webrpc@v0.25.3;gen-typescript@v0.17.0;sequence-api@v0.4.0" +export const WebrpcHeaderValue = 'webrpc@v0.25.3;gen-typescript@v0.17.0;sequence-api@v0.4.0' // WebRPC description and code-gen version -export const WebRPCVersion = "v1" +export const WebRPCVersion = 'v1' // Schema version of your RIDL schema -export const WebRPCSchemaVersion = "v0.4.0" +export const WebRPCSchemaVersion = 'v0.4.0' // Schema hash generated from your RIDL schema -export const WebRPCSchemaHash = "d43a5aac616814072c69e63f2f81fe65ea10a7e0" +export const WebRPCSchemaHash = 'd43a5aac616814072c69e63f2f81fe65ea10a7e0' type WebrpcGenVersions = { - webrpcGenVersion: string; - codeGenName: string; - codeGenVersion: string; - schemaName: string; - schemaVersion: string; -}; + webrpcGenVersion: string + codeGenName: string + codeGenVersion: string + schemaName: string + schemaVersion: string +} export function VersionFromHeader(headers: Headers): WebrpcGenVersions { - const headerValue = headers.get(WebrpcHeader); + const headerValue = headers.get(WebrpcHeader) if (!headerValue) { return { - webrpcGenVersion: "", - codeGenName: "", - codeGenVersion: "", - schemaName: "", - schemaVersion: "", - }; + webrpcGenVersion: '', + codeGenName: '', + codeGenVersion: '', + schemaName: '', + schemaVersion: '', + } } - return parseWebrpcGenVersions(headerValue); + return parseWebrpcGenVersions(headerValue) } function parseWebrpcGenVersions(header: string): WebrpcGenVersions { - const versions = header.split(";"); + const versions = header.split(';') if (versions.length < 3) { return { - webrpcGenVersion: "", - codeGenName: "", - codeGenVersion: "", - schemaName: "", - schemaVersion: "", - }; + webrpcGenVersion: '', + codeGenName: '', + codeGenVersion: '', + schemaName: '', + schemaVersion: '', + } } - const [_, webrpcGenVersion] = versions[0]!.split("@"); - const [codeGenName, codeGenVersion] = versions[1]!.split("@"); - const [schemaName, schemaVersion] = versions[2]!.split("@"); + const [_, webrpcGenVersion] = versions[0]!.split('@') + const [codeGenName, codeGenVersion] = versions[1]!.split('@') + const [schemaName, schemaVersion] = versions[2]!.split('@') return { - webrpcGenVersion: webrpcGenVersion ?? "", - codeGenName: codeGenName ?? "", - codeGenVersion: codeGenVersion ?? "", - schemaName: schemaName ?? "", - schemaVersion: schemaVersion ?? "", - }; + webrpcGenVersion: webrpcGenVersion ?? '', + codeGenName: codeGenName ?? '', + codeGenVersion: codeGenVersion ?? '', + schemaName: schemaName ?? '', + schemaVersion: schemaVersion ?? '', + } } // // Types // - export enum SortOrder { DESC = 'DESC', - ASC = 'ASC' + ASC = 'ASC', } export enum SardinePaymentType { @@ -82,57 +81,57 @@ export enum SardinePaymentType { credit = 'credit', us_debit = 'us_debit', international_debit = 'international_debit', - international_credit = 'international_credit' + international_credit = 'international_credit', } export enum SardineQuoteType { buy = 'buy', - sell = 'sell' + sell = 'sell', } export enum GetLifiSwapRouteDirection { to = 'to', - from = 'from' + from = 'from', } export enum TokenType { ERC20 = 'ERC20', ERC721 = 'ERC721', - ERC1155 = 'ERC1155' + ERC1155 = 'ERC1155', } export enum TransakBuySell { UNKNOWN = 'UNKNOWN', BUY = 'BUY', - SELL = 'SELL' + SELL = 'SELL', } export enum TradeType { EXACT_INPUT = 'EXACT_INPUT', - EXACT_OUTPUT = 'EXACT_OUTPUT' + EXACT_OUTPUT = 'EXACT_OUTPUT', } export enum CheckoutOptionCrypto { none = 'none', partially = 'partially', - all = 'all' + all = 'all', } export enum CheckoutOptionNFTCheckoutProvider { unknown = 'unknown', sardine = 'sardine', - transak = 'transak' + transak = 'transak', } export enum CheckoutOptionOnRampProvider { unknown = 'unknown', sardine = 'sardine', - transak = 'transak' + transak = 'transak', } export enum CheckoutOptionSwapProvider { unknown = 'unknown', - lifi = 'lifi' + lifi = 'lifi', } export interface Version { @@ -150,7 +149,7 @@ export interface RuntimeStatus { branch: string commitHash: string checks: RuntimeChecks - numTxnsRelayed: {[key: string]: NumTxnsRelayed} + numTxnsRelayed: { [key: string]: NumTxnsRelayed } } export interface NumTxnsRelayed { @@ -160,8 +159,7 @@ export interface NumTxnsRelayed { period: number } -export interface RuntimeChecks { -} +export interface RuntimeChecks {} export interface SequenceContext { factory: string @@ -960,14 +958,14 @@ export interface IntentQuote { quoteProvider: string quoteProviderRequestId: string quoteProviderFeeUsd: string - feeQuotes: {[key: string]: string} + feeQuotes: { [key: string]: string } } export interface API { /** - * + * * Runtime - * + * */ ping(headers?: object, signal?: AbortSignal): Promise version(headers?: object, signal?: AbortSignal): Promise @@ -975,70 +973,133 @@ export interface API { clock(headers?: object, signal?: AbortSignal): Promise getSequenceContext(headers?: object, signal?: AbortSignal): Promise /** - * + * * Auth - * + * * TODO: rename 'ewtString' arg to 'ethauthProof' */ getAuthToken(args: GetAuthTokenArgs, headers?: object, signal?: AbortSignal): Promise getAuthToken2(args: GetAuthToken2Args, headers?: object, signal?: AbortSignal): Promise - sendPasswordlessLink(args: SendPasswordlessLinkArgs, headers?: object, signal?: AbortSignal): Promise - registerPublicKey(args: RegisterPublicKeyArgs, headers?: object, signal?: AbortSignal): Promise + sendPasswordlessLink( + args: SendPasswordlessLinkArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + registerPublicKey( + args: RegisterPublicKeyArgs, + headers?: object, + signal?: AbortSignal, + ): Promise getPublicKey(args: GetPublicKeyArgs, headers?: object, signal?: AbortSignal): Promise /** - * + * * Contacts / Friends - * + * */ friendList(args: FriendListArgs, headers?: object, signal?: AbortSignal): Promise - getFriendByAddress(args: GetFriendByAddressArgs, headers?: object, signal?: AbortSignal): Promise + getFriendByAddress( + args: GetFriendByAddressArgs, + headers?: object, + signal?: AbortSignal, + ): Promise searchFriends(args: SearchFriendsArgs, headers?: object, signal?: AbortSignal): Promise addFriend(args: AddFriendArgs, headers?: object, signal?: AbortSignal): Promise - updateFriendNickname(args: UpdateFriendNicknameArgs, headers?: object, signal?: AbortSignal): Promise + updateFriendNickname( + args: UpdateFriendNicknameArgs, + headers?: object, + signal?: AbortSignal, + ): Promise removeFriend(args: RemoveFriendArgs, headers?: object, signal?: AbortSignal): Promise /** - * + * * Chain-Utils - * + * */ contractCall(args: ContractCallArgs, headers?: object, signal?: AbortSignal): Promise - decodeContractCall(args: DecodeContractCallArgs, headers?: object, signal?: AbortSignal): Promise - lookupContractCallSelectors(args: LookupContractCallSelectorsArgs, headers?: object, signal?: AbortSignal): Promise + decodeContractCall( + args: DecodeContractCallArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + lookupContractCallSelectors( + args: LookupContractCallSelectorsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise /** - * + * * User Storage - * + * */ userStorageFetch(args: UserStorageFetchArgs, headers?: object, signal?: AbortSignal): Promise userStorageSave(args: UserStorageSaveArgs, headers?: object, signal?: AbortSignal): Promise - userStorageDelete(args: UserStorageDeleteArgs, headers?: object, signal?: AbortSignal): Promise - userStorageFetchAll(args: UserStorageFetchAllArgs, headers?: object, signal?: AbortSignal): Promise + userStorageDelete( + args: UserStorageDeleteArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + userStorageFetchAll( + args: UserStorageFetchAllArgs, + headers?: object, + signal?: AbortSignal, + ): Promise /** - * + * * Wallet utils - * + * */ getMoonpayLink(args: GetMoonpayLinkArgs, headers?: object, signal?: AbortSignal): Promise /** * - IsUsingGoogleMail(domain: string) => (yes: bool) */ - resolveENSAddress(args: ResolveENSAddressArgs, headers?: object, signal?: AbortSignal): Promise + resolveENSAddress( + args: ResolveENSAddressArgs, + headers?: object, + signal?: AbortSignal, + ): Promise /** * TODO: we can add walletContext optional in the future when we need it * NOTE: chainId can be either a number or canonical name */ isValidSignature(args: IsValidSignatureArgs, headers?: object, signal?: AbortSignal): Promise - isValidMessageSignature(args: IsValidMessageSignatureArgs, headers?: object, signal?: AbortSignal): Promise - isValidTypedDataSignature(args: IsValidTypedDataSignatureArgs, headers?: object, signal?: AbortSignal): Promise - isValidETHAuthProof(args: IsValidETHAuthProofArgs, headers?: object, signal?: AbortSignal): Promise + isValidMessageSignature( + args: IsValidMessageSignatureArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + isValidTypedDataSignature( + args: IsValidTypedDataSignatureArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + isValidETHAuthProof( + args: IsValidETHAuthProofArgs, + headers?: object, + signal?: AbortSignal, + ): Promise getOnRampURL(args: GetOnRampURLArgs, headers?: object, signal?: AbortSignal): Promise sardineGetClientToken(headers?: object, signal?: AbortSignal): Promise - sardineGetNFTCheckoutToken(args: SardineGetNFTCheckoutTokenArgs, headers?: object, signal?: AbortSignal): Promise - sardineGetNFTCheckoutOrderStatus(args: SardineGetNFTCheckoutOrderStatusArgs, headers?: object, signal?: AbortSignal): Promise + sardineGetNFTCheckoutToken( + args: SardineGetNFTCheckoutTokenArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + sardineGetNFTCheckoutOrderStatus( + args: SardineGetNFTCheckoutOrderStatusArgs, + headers?: object, + signal?: AbortSignal, + ): Promise sardineGetSupportedRegions(headers?: object, signal?: AbortSignal): Promise - sardineGetSupportedFiatCurrencies(headers?: object, signal?: AbortSignal): Promise + sardineGetSupportedFiatCurrencies( + headers?: object, + signal?: AbortSignal, + ): Promise sardineGetSupportedTokens(headers?: object, signal?: AbortSignal): Promise - sardineGetSupportedTokenForSwap(args: SardineGetSupportedTokenForSwapArgs, headers?: object, signal?: AbortSignal): Promise + sardineGetSupportedTokenForSwap( + args: SardineGetSupportedTokenForSwapArgs, + headers?: object, + signal?: AbortSignal, + ): Promise sardineGetEnabledTokens(headers?: object, signal?: AbortSignal): Promise sardineGetQuote(args: SardineGetQuoteArgs, headers?: object, signal?: AbortSignal): Promise /** @@ -1048,172 +1109,302 @@ export interface API { /** * Deprecated. Use SardineGetNFTCheckoutToken() instead. */ - getSardineNFTCheckoutToken(args: GetSardineNFTCheckoutTokenArgs, headers?: object, signal?: AbortSignal): Promise + getSardineNFTCheckoutToken( + args: GetSardineNFTCheckoutTokenArgs, + headers?: object, + signal?: AbortSignal, + ): Promise /** * Deprecated. Use SardineGetNFTCheckoutOrderStatus() instead. */ - getSardineNFTCheckoutOrderStatus(args: GetSardineNFTCheckoutOrderStatusArgs, headers?: object, signal?: AbortSignal): Promise + getSardineNFTCheckoutOrderStatus( + args: GetSardineNFTCheckoutOrderStatusArgs, + headers?: object, + signal?: AbortSignal, + ): Promise transakGetCountries(headers?: object, signal?: AbortSignal): Promise transakGetCryptoCurrencies(headers?: object, signal?: AbortSignal): Promise transakGetFiatCurrencies(headers?: object, signal?: AbortSignal): Promise transakGetPrice(args: TransakGetPriceArgs, headers?: object, signal?: AbortSignal): Promise - transakGetSupportedNFTCheckoutChains(headers?: object, signal?: AbortSignal): Promise + transakGetSupportedNFTCheckoutChains( + headers?: object, + signal?: AbortSignal, + ): Promise /** - * + * * Price Feed - * + * */ getCoinPrices(args: GetCoinPricesArgs, headers?: object, signal?: AbortSignal): Promise - getCollectiblePrices(args: GetCollectiblePricesArgs, headers?: object, signal?: AbortSignal): Promise + getCollectiblePrices( + args: GetCollectiblePricesArgs, + headers?: object, + signal?: AbortSignal, + ): Promise /** - * + * * Price Feed utils - * + * */ getExchangeRate(args: GetExchangeRateArgs, headers?: object, signal?: AbortSignal): Promise /** - * + * * Util / misc - * + * */ memoryStore(args: MemoryStoreArgs, headers?: object, signal?: AbortSignal): Promise memoryLoad(args: MemoryLoadArgs, headers?: object, signal?: AbortSignal): Promise /** - * + * * Legacy - * + * */ getInviteInfo(headers?: object, signal?: AbortSignal): Promise /** * NOTE: we're still using this from SW-API to Sequence-API to claim invite code */ - isValidAccessCode(args: IsValidAccessCodeArgs, headers?: object, signal?: AbortSignal): Promise - internalClaimAccessCode(args: InternalClaimAccessCodeArgs, headers?: object, signal?: AbortSignal): Promise + isValidAccessCode( + args: IsValidAccessCodeArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + internalClaimAccessCode( + args: InternalClaimAccessCodeArgs, + headers?: object, + signal?: AbortSignal, + ): Promise /** * Utils */ - blockNumberAtTime(args: BlockNumberAtTimeArgs, headers?: object, signal?: AbortSignal): Promise + blockNumberAtTime( + args: BlockNumberAtTimeArgs, + headers?: object, + signal?: AbortSignal, + ): Promise /** - * + * * Paper * TODO: deprecate in the future - * + * */ - paperSessionSecret(args: PaperSessionSecretArgs, headers?: object, signal?: AbortSignal): Promise - paperSessionSecret2(args: PaperSessionSecret2Args, headers?: object, signal?: AbortSignal): Promise + paperSessionSecret( + args: PaperSessionSecretArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + paperSessionSecret2( + args: PaperSessionSecret2Args, + headers?: object, + signal?: AbortSignal, + ): Promise /** - * + * * Linked wallets (v0 -- simple support) - * + * */ linkWallet(args: LinkWalletArgs, headers?: object, signal?: AbortSignal): Promise getLinkedWallets(args: GetLinkedWalletsArgs, headers?: object, signal?: AbortSignal): Promise - removeLinkedWallet(args: RemoveLinkedWalletArgs, headers?: object, signal?: AbortSignal): Promise + removeLinkedWallet( + args: RemoveLinkedWalletArgs, + headers?: object, + signal?: AbortSignal, + ): Promise /** * NOTE: these methods are deprecated, please do not use them. We may resurface them in the future, but just wanted * to be clear, they are not necessary for our linked wallets. */ - generateWaaSVerificationURL(args: GenerateWaaSVerificationURLArgs, headers?: object, signal?: AbortSignal): Promise - validateWaaSVerificationNonce(args: ValidateWaaSVerificationNonceArgs, headers?: object, signal?: AbortSignal): Promise + generateWaaSVerificationURL( + args: GenerateWaaSVerificationURLArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + validateWaaSVerificationNonce( + args: ValidateWaaSVerificationNonceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise /** - * - * + * + * * WaaS child wallet adoption - * + * */ - listAdoptedWallets(args: ListAdoptedWalletsArgs, headers?: object, signal?: AbortSignal): Promise + listAdoptedWallets( + args: ListAdoptedWalletsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise getLifiChains(headers?: object, signal?: AbortSignal): Promise getLifiTokens(args: GetLifiTokensArgs, headers?: object, signal?: AbortSignal): Promise /** * All parameters except `params` are deprecated. * Use only the `params` object to pass values. */ - getLifiSwapRoutes(args: GetLifiSwapRoutesArgs, headers?: object, signal?: AbortSignal): Promise + getLifiSwapRoutes( + args: GetLifiSwapRoutesArgs, + headers?: object, + signal?: AbortSignal, + ): Promise getLifiSwapQuote(args: GetLifiSwapQuoteArgs, headers?: object, signal?: AbortSignal): Promise /** - * + * * Chain abstraction - * + * */ - getIntentCallsPayloads(args: GetIntentCallsPayloadsArgs, headers?: object, signal?: AbortSignal): Promise - commitIntentConfig(args: CommitIntentConfigArgs, headers?: object, signal?: AbortSignal): Promise + getIntentCallsPayloads( + args: GetIntentCallsPayloadsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + commitIntentConfig( + args: CommitIntentConfigArgs, + headers?: object, + signal?: AbortSignal, + ): Promise getIntentConfig(args: GetIntentConfigArgs, headers?: object, signal?: AbortSignal): Promise /** - * + * * Inventory, payments and management - * + * */ listCurrencyGroups(headers?: object, signal?: AbortSignal): Promise - addOffchainInventory(args: AddOffchainInventoryArgs, headers?: object, signal?: AbortSignal): Promise - getOffchainInventory(args: GetOffchainInventoryArgs, headers?: object, signal?: AbortSignal): Promise - listOffchainInventories(args: ListOffchainInventoriesArgs, headers?: object, signal?: AbortSignal): Promise - updateOffchainInventory(args: UpdateOffchainInventoryArgs, headers?: object, signal?: AbortSignal): Promise - deleteOffchainInventory(args: DeleteOffchainInventoryArgs, headers?: object, signal?: AbortSignal): Promise - requestOffchainPayment(args: RequestOffchainPaymentArgs, headers?: object, signal?: AbortSignal): Promise - listOffchainPayments(args: ListOffchainPaymentsArgs, headers?: object, signal?: AbortSignal): Promise + addOffchainInventory( + args: AddOffchainInventoryArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + getOffchainInventory( + args: GetOffchainInventoryArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + listOffchainInventories( + args: ListOffchainInventoriesArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + updateOffchainInventory( + args: UpdateOffchainInventoryArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + deleteOffchainInventory( + args: DeleteOffchainInventoryArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + requestOffchainPayment( + args: RequestOffchainPaymentArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + listOffchainPayments( + args: ListOffchainPaymentsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise /** - * + * * Packs - * + * */ savePack(args: SavePackArgs, headers?: object, signal?: AbortSignal): Promise getPack(args: GetPackArgs, headers?: object, signal?: AbortSignal): Promise getPackIds(args: GetPackIdsArgs, headers?: object, signal?: AbortSignal): Promise deletePack(args: DeletePackArgs, headers?: object, signal?: AbortSignal): Promise - updatePackContent(args: UpdatePackContentArgs, headers?: object, signal?: AbortSignal): Promise + updatePackContent( + args: UpdatePackContentArgs, + headers?: object, + signal?: AbortSignal, + ): Promise getRevealTxData(args: GetRevealTxDataArgs, headers?: object, signal?: AbortSignal): Promise - checkoutOptionsPrimary(args: CheckoutOptionsPrimaryArgs, headers?: object, signal?: AbortSignal): Promise - checkoutOptionsSecondary(args: CheckoutOptionsSecondaryArgs, headers?: object, signal?: AbortSignal): Promise - checkoutOptionsGetTransakContractID(args: CheckoutOptionsGetTransakContractIDArgs, headers?: object, signal?: AbortSignal): Promise - fortePayCreateIntent(args: FortePayCreateIntentArgs, headers?: object, signal?: AbortSignal): Promise - fortePayGetPaymentStatuses(args: FortePayGetPaymentStatusesArgs, headers?: object, signal?: AbortSignal): Promise + checkoutOptionsPrimary( + args: CheckoutOptionsPrimaryArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + checkoutOptionsSecondary( + args: CheckoutOptionsSecondaryArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + checkoutOptionsGetTransakContractID( + args: CheckoutOptionsGetTransakContractIDArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + fortePayCreateIntent( + args: FortePayCreateIntentArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + fortePayGetPaymentStatuses( + args: FortePayGetPaymentStatusesArgs, + headers?: object, + signal?: AbortSignal, + ): Promise /** - * + * * CCTP - * + * */ getCCTPTransfer(args: GetCCTPTransferArgs, headers?: object, signal?: AbortSignal): Promise - queueCCTPTransfer(args: QueueCCTPTransferArgs, headers?: object, signal?: AbortSignal): Promise + queueCCTPTransfer( + args: QueueCCTPTransferArgs, + headers?: object, + signal?: AbortSignal, + ): Promise /** - * + * * Intent Machine Worker - * + * */ - queueIntentConfigExecution(args: QueueIntentConfigExecutionArgs, headers?: object, signal?: AbortSignal): Promise - getIntentConfigExecutionStatus(args: GetIntentConfigExecutionStatusArgs, headers?: object, signal?: AbortSignal): Promise - listIntentConfigs(args: ListIntentConfigsArgs, headers?: object, signal?: AbortSignal): Promise - queueMetaTxnReceipt(args: QueueMetaTxnReceiptArgs, headers?: object, signal?: AbortSignal): Promise -} - -export interface PingArgs { -} + queueIntentConfigExecution( + args: QueueIntentConfigExecutionArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + getIntentConfigExecutionStatus( + args: GetIntentConfigExecutionStatusArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + listIntentConfigs( + args: ListIntentConfigsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + queueMetaTxnReceipt( + args: QueueMetaTxnReceiptArgs, + headers?: object, + signal?: AbortSignal, + ): Promise +} + +export interface PingArgs {} export interface PingReturn { - status: boolean -} -export interface VersionArgs { + status: boolean } +export interface VersionArgs {} export interface VersionReturn { - version: Version -} -export interface RuntimeStatusArgs { + version: Version } +export interface RuntimeStatusArgs {} export interface RuntimeStatusReturn { - status: RuntimeStatus -} -export interface ClockArgs { + status: RuntimeStatus } +export interface ClockArgs {} export interface ClockReturn { - serverTime: string -} -export interface GetSequenceContextArgs { + serverTime: string } +export interface GetSequenceContextArgs {} export interface GetSequenceContextReturn { - data: SequenceContext + data: SequenceContext } export interface GetAuthTokenArgs { ewtString: string @@ -1224,7 +1415,7 @@ export interface GetAuthTokenReturn { status: boolean jwtToken: string address: string - user?: User + user?: User } export interface GetAuthToken2Args { ewtString: string @@ -1235,7 +1426,7 @@ export interface GetAuthToken2Return { status: boolean jwtToken: string address: string - user?: User + user?: User } export interface SendPasswordlessLinkArgs { email: string @@ -1244,21 +1435,21 @@ export interface SendPasswordlessLinkArgs { } export interface SendPasswordlessLinkReturn { - status: boolean + status: boolean } export interface RegisterPublicKeyArgs { publicKey: PublicKey } export interface RegisterPublicKeyReturn { - status: boolean + status: boolean } export interface GetPublicKeyArgs { id: string } export interface GetPublicKeyReturn { - publicKey: PublicKey + publicKey: PublicKey } export interface FriendListArgs { nickname?: string @@ -1267,7 +1458,7 @@ export interface FriendListArgs { export interface FriendListReturn { page: Page - friends: Array + friends: Array } export interface GetFriendByAddressArgs { friendAddress: string @@ -1275,7 +1466,7 @@ export interface GetFriendByAddressArgs { export interface GetFriendByAddressReturn { status: boolean - friend: Friend + friend: Friend } export interface SearchFriendsArgs { filterUsername: string @@ -1283,7 +1474,7 @@ export interface SearchFriendsArgs { } export interface SearchFriendsReturn { - friends: Array + friends: Array } export interface AddFriendArgs { friendAddress: string @@ -1292,7 +1483,7 @@ export interface AddFriendArgs { export interface AddFriendReturn { status: boolean - friend?: Friend + friend?: Friend } export interface UpdateFriendNicknameArgs { friendAddress: string @@ -1301,14 +1492,14 @@ export interface UpdateFriendNicknameArgs { export interface UpdateFriendNicknameReturn { status: boolean - friend?: Friend + friend?: Friend } export interface RemoveFriendArgs { friendAddress: string } export interface RemoveFriendReturn { - status: boolean + status: boolean } export interface ContractCallArgs { chainID: string @@ -1319,28 +1510,28 @@ export interface ContractCallArgs { } export interface ContractCallReturn { - returns: Array + returns: Array } export interface DecodeContractCallArgs { callData: string } export interface DecodeContractCallReturn { - call: ContractCall + call: ContractCall } export interface LookupContractCallSelectorsArgs { selectors: Array } export interface LookupContractCallSelectorsReturn { - signatures: Array> + signatures: Array> } export interface UserStorageFetchArgs { key: string } export interface UserStorageFetchReturn { - object: any + object: any } export interface UserStorageSaveArgs { key: string @@ -1348,28 +1539,28 @@ export interface UserStorageSaveArgs { } export interface UserStorageSaveReturn { - ok: boolean + ok: boolean } export interface UserStorageDeleteArgs { key: string } export interface UserStorageDeleteReturn { - ok: boolean + ok: boolean } export interface UserStorageFetchAllArgs { keys?: Array } export interface UserStorageFetchAllReturn { - objects: {[key: string]: any} + objects: { [key: string]: any } } export interface GetMoonpayLinkArgs { url: string } export interface GetMoonpayLinkReturn { - signedUrl: string + signedUrl: string } export interface ResolveENSAddressArgs { ens: string @@ -1377,7 +1568,7 @@ export interface ResolveENSAddressArgs { export interface ResolveENSAddressReturn { address: string - ok: boolean + ok: boolean } export interface IsValidSignatureArgs { chainId: string @@ -1387,7 +1578,7 @@ export interface IsValidSignatureArgs { } export interface IsValidSignatureReturn { - isValid: boolean + isValid: boolean } export interface IsValidMessageSignatureArgs { chainId: string @@ -1397,7 +1588,7 @@ export interface IsValidMessageSignatureArgs { } export interface IsValidMessageSignatureReturn { - isValid: boolean + isValid: boolean } export interface IsValidTypedDataSignatureArgs { chainId: string @@ -1407,7 +1598,7 @@ export interface IsValidTypedDataSignatureArgs { } export interface IsValidTypedDataSignatureReturn { - isValid: boolean + isValid: boolean } export interface IsValidETHAuthProofArgs { chainId: string @@ -1416,52 +1607,48 @@ export interface IsValidETHAuthProofArgs { } export interface IsValidETHAuthProofReturn { - isValid: boolean + isValid: boolean } export interface GetOnRampURLArgs { chainId: string } export interface GetOnRampURLReturn { - url: string -} -export interface SardineGetClientTokenArgs { + url: string } +export interface SardineGetClientTokenArgs {} export interface SardineGetClientTokenReturn { - token: string + token: string } export interface SardineGetNFTCheckoutTokenArgs { params: SardineNFTCheckoutParams } export interface SardineGetNFTCheckoutTokenReturn { - resp: SardineNFTCheckout + resp: SardineNFTCheckout } export interface SardineGetNFTCheckoutOrderStatusArgs { orderId: string } export interface SardineGetNFTCheckoutOrderStatusReturn { - resp: SardineOrder -} -export interface SardineGetSupportedRegionsArgs { + resp: SardineOrder } +export interface SardineGetSupportedRegionsArgs {} export interface SardineGetSupportedRegionsReturn { - regions: Array -} -export interface SardineGetSupportedFiatCurrenciesArgs { + regions: Array } +export interface SardineGetSupportedFiatCurrenciesArgs {} export interface SardineGetSupportedFiatCurrenciesReturn { - tokens: Array -} -export interface SardineGetSupportedTokensArgs { + tokens: Array } +export interface SardineGetSupportedTokensArgs {} export interface SardineGetSupportedTokensReturn { - tokens: Array + tokens: Array } export interface SardineGetSupportedTokenForSwapArgs { network: string @@ -1469,92 +1656,86 @@ export interface SardineGetSupportedTokenForSwapArgs { } export interface SardineGetSupportedTokenForSwapReturn { - token: SardineSupportedTokenForSwap -} -export interface SardineGetEnabledTokensArgs { + token: SardineSupportedTokenForSwap } +export interface SardineGetEnabledTokensArgs {} export interface SardineGetEnabledTokensReturn { - tokens: Array + tokens: Array } export interface SardineGetQuoteArgs { params: SardineGetQuoteParams } export interface SardineGetQuoteReturn { - quote: SardineQuote -} -export interface GetSardineClientTokenArgs { + quote: SardineQuote } +export interface GetSardineClientTokenArgs {} export interface GetSardineClientTokenReturn { - token: string + token: string } export interface GetSardineNFTCheckoutTokenArgs { params: SardineNFTCheckoutParams } export interface GetSardineNFTCheckoutTokenReturn { - resp: SardineNFTCheckout + resp: SardineNFTCheckout } export interface GetSardineNFTCheckoutOrderStatusArgs { orderId: string } export interface GetSardineNFTCheckoutOrderStatusReturn { - resp: SardineOrder -} -export interface TransakGetCountriesArgs { + resp: SardineOrder } +export interface TransakGetCountriesArgs {} export interface TransakGetCountriesReturn { - regions: Array -} -export interface TransakGetCryptoCurrenciesArgs { + regions: Array } +export interface TransakGetCryptoCurrenciesArgs {} export interface TransakGetCryptoCurrenciesReturn { - currencies: Array -} -export interface TransakGetFiatCurrenciesArgs { + currencies: Array } +export interface TransakGetFiatCurrenciesArgs {} export interface TransakGetFiatCurrenciesReturn { - currencies: Array + currencies: Array } export interface TransakGetPriceArgs { params: TransakGetPriceParams } export interface TransakGetPriceReturn { - price: TransakPrice -} -export interface TransakGetSupportedNFTCheckoutChainsArgs { + price: TransakPrice } +export interface TransakGetSupportedNFTCheckoutChainsArgs {} export interface TransakGetSupportedNFTCheckoutChainsReturn { - chains: Array + chains: Array } export interface GetCoinPricesArgs { tokens: Array } export interface GetCoinPricesReturn { - tokenPrices: Array + tokenPrices: Array } export interface GetCollectiblePricesArgs { tokens: Array } export interface GetCollectiblePricesReturn { - tokenPrices: Array + tokenPrices: Array } export interface GetExchangeRateArgs { toCurrency: string } export interface GetExchangeRateReturn { - exchangeRate: ExchangeRate + exchangeRate: ExchangeRate } export interface MemoryStoreArgs { key: string @@ -1562,27 +1743,26 @@ export interface MemoryStoreArgs { } export interface MemoryStoreReturn { - ok: boolean + ok: boolean } export interface MemoryLoadArgs { key: string } export interface MemoryLoadReturn { - value: string -} -export interface GetInviteInfoArgs { + value: string } +export interface GetInviteInfoArgs {} export interface GetInviteInfoReturn { - inviteInfo: InviteInfo + inviteInfo: InviteInfo } export interface IsValidAccessCodeArgs { accessCode: string } export interface IsValidAccessCodeReturn { - status: boolean + status: boolean } export interface InternalClaimAccessCodeArgs { address: string @@ -1590,7 +1770,7 @@ export interface InternalClaimAccessCodeArgs { } export interface InternalClaimAccessCodeReturn { - status: boolean + status: boolean } export interface BlockNumberAtTimeArgs { chainId: number @@ -1598,7 +1778,7 @@ export interface BlockNumberAtTimeArgs { } export interface BlockNumberAtTimeReturn { - blocks: Array + blocks: Array } export interface PaperSessionSecretArgs { chainName: string @@ -1608,7 +1788,7 @@ export interface PaperSessionSecretArgs { } export interface PaperSessionSecretReturn { - secret: string + secret: string } export interface PaperSessionSecret2Args { chainName: string @@ -1618,7 +1798,7 @@ export interface PaperSessionSecret2Args { } export interface PaperSessionSecret2Return { - secret: string + secret: string } export interface LinkWalletArgs { parentWalletAddress: string @@ -1632,7 +1812,7 @@ export interface LinkWalletArgs { } export interface LinkWalletReturn { - status: boolean + status: boolean } export interface GetLinkedWalletsArgs { parentWalletAddress: string @@ -1642,7 +1822,7 @@ export interface GetLinkedWalletsArgs { } export interface GetLinkedWalletsReturn { - linkedWallets: Array + linkedWallets: Array } export interface RemoveLinkedWalletArgs { parentWalletAddress: string @@ -1653,7 +1833,7 @@ export interface RemoveLinkedWalletArgs { } export interface RemoveLinkedWalletReturn { - status: boolean + status: boolean } export interface GenerateWaaSVerificationURLArgs { walletAddress: string @@ -1661,7 +1841,7 @@ export interface GenerateWaaSVerificationURLArgs { export interface GenerateWaaSVerificationURLReturn { nonce: string - verificationURL: string + verificationURL: string } export interface ValidateWaaSVerificationNonceArgs { nonce: string @@ -1671,7 +1851,7 @@ export interface ValidateWaaSVerificationNonceArgs { } export interface ValidateWaaSVerificationNonceReturn { - walletAddress: string + walletAddress: string } export interface ListAdoptedWalletsArgs { page?: Page @@ -1679,20 +1859,19 @@ export interface ListAdoptedWalletsArgs { export interface ListAdoptedWalletsReturn { page: Page - wallets: Array -} -export interface GetLifiChainsArgs { + wallets: Array } +export interface GetLifiChainsArgs {} export interface GetLifiChainsReturn { - chains: Array + chains: Array } export interface GetLifiTokensArgs { chainIds: Array } export interface GetLifiTokensReturn { - tokens: Array + tokens: Array } export interface GetLifiSwapRoutesArgs { params: GetLifiSwapRouteParams @@ -1703,14 +1882,14 @@ export interface GetLifiSwapRoutesArgs { } export interface GetLifiSwapRoutesReturn { - routes: Array + routes: Array } export interface GetLifiSwapQuoteArgs { params: GetLifiSwapQuoteParams } export interface GetLifiSwapQuoteReturn { - quote: LifiSwapQuote + quote: LifiSwapQuote } export interface GetIntentCallsPayloadsArgs { userAddress: string @@ -1737,9 +1916,9 @@ export interface GetIntentCallsPayloadsReturn { metaTxns: Array trailsFee: TrailsFee quote: IntentQuote - feeQuotes: {[key: string]: string} + feeQuotes: { [key: string]: string } originIntentAddress: string - destinationIntentAddress: string + destinationIntentAddress: string } export interface CommitIntentConfigArgs { originIntentAddress: string @@ -1751,54 +1930,52 @@ export interface CommitIntentConfigArgs { } export interface CommitIntentConfigReturn { - config: IntentConfig + config: IntentConfig } export interface GetIntentConfigArgs { intentAddress: string } export interface GetIntentConfigReturn { - config: IntentConfig -} -export interface ListCurrencyGroupsArgs { + config: IntentConfig } +export interface ListCurrencyGroupsArgs {} export interface ListCurrencyGroupsReturn { - currencyGroups: Array + currencyGroups: Array } export interface AddOffchainInventoryArgs { inventory: OffchainInventory } export interface AddOffchainInventoryReturn { - inventoryId: number + inventoryId: number } export interface GetOffchainInventoryArgs { inventoryId: number } export interface GetOffchainInventoryReturn { - inventory: OffchainInventory + inventory: OffchainInventory } export interface ListOffchainInventoriesArgs { projectId: number } export interface ListOffchainInventoriesReturn { - inventory: Array + inventory: Array } export interface UpdateOffchainInventoryArgs { inventory: OffchainInventory } -export interface UpdateOffchainInventoryReturn { -} +export interface UpdateOffchainInventoryReturn {} export interface DeleteOffchainInventoryArgs { inventoryId: number } export interface DeleteOffchainInventoryReturn { - ok: boolean + ok: boolean } export interface RequestOffchainPaymentArgs { inventoryId: number @@ -1808,7 +1985,7 @@ export interface RequestOffchainPaymentArgs { } export interface RequestOffchainPaymentReturn { - payment: PaymentResponse + payment: PaymentResponse } export interface ListOffchainPaymentsArgs { inventoryId: number @@ -1817,14 +1994,14 @@ export interface ListOffchainPaymentsArgs { export interface ListOffchainPaymentsReturn { page: Page - payments: Array + payments: Array } export interface SavePackArgs { pack: Pack } export interface SavePackReturn { - merkleRoot: string + merkleRoot: string } export interface GetPackArgs { contractAddress: string @@ -1833,7 +2010,7 @@ export interface GetPackArgs { } export interface GetPackReturn { - pack: Pack + pack: Pack } export interface GetPackIdsArgs { contractAddress: string @@ -1841,7 +2018,7 @@ export interface GetPackIdsArgs { } export interface GetPackIdsReturn { - packIds: Array + packIds: Array } export interface DeletePackArgs { contractAddress: string @@ -1850,14 +2027,14 @@ export interface DeletePackArgs { } export interface DeletePackReturn { - status: boolean + status: boolean } export interface UpdatePackContentArgs { pack: Pack } export interface UpdatePackContentReturn { - merkleRoot: string + merkleRoot: string } export interface GetRevealTxDataArgs { contractAddress: string @@ -1867,7 +2044,7 @@ export interface GetRevealTxDataArgs { } export interface GetRevealTxDataReturn { - txData: string + txData: string } export interface CheckoutOptionsPrimaryArgs { chainId: number @@ -1878,7 +2055,7 @@ export interface CheckoutOptionsPrimaryArgs { } export interface CheckoutOptionsPrimaryReturn { - options: CheckoutOptions + options: CheckoutOptions } export interface CheckoutOptionsSecondaryArgs { chainId: number @@ -1887,7 +2064,7 @@ export interface CheckoutOptionsSecondaryArgs { } export interface CheckoutOptionsSecondaryReturn { - options: CheckoutOptions + options: CheckoutOptions } export interface CheckoutOptionsGetTransakContractIDArgs { chainId: number @@ -1895,28 +2072,28 @@ export interface CheckoutOptionsGetTransakContractIDArgs { } export interface CheckoutOptionsGetTransakContractIDReturn { - contractId: string + contractId: string } export interface FortePayCreateIntentArgs { intent: FortePayCreateIntent } export interface FortePayCreateIntentReturn { - resp: FortePayIntent + resp: FortePayIntent } export interface FortePayGetPaymentStatusesArgs { paymentIntentIds: Array } export interface FortePayGetPaymentStatusesReturn { - statuses: Array + statuses: Array } export interface GetCCTPTransferArgs { id: string } export interface GetCCTPTransferReturn { - transfer: CCTPTransfer + transfer: CCTPTransfer } export interface QueueCCTPTransferArgs { sourceTxHash?: string @@ -1926,21 +2103,21 @@ export interface QueueCCTPTransferArgs { } export interface QueueCCTPTransferReturn { - transfer: CCTPTransfer + transfer: CCTPTransfer } export interface QueueIntentConfigExecutionArgs { intentConfigId: number } export interface QueueIntentConfigExecutionReturn { - status: boolean + status: boolean } export interface GetIntentConfigExecutionStatusArgs { intentConfigId: number } export interface GetIntentConfigExecutionStatusReturn { - executionStatus: string + executionStatus: string } export interface ListIntentConfigsArgs { page?: Page @@ -1949,18 +2126,16 @@ export interface ListIntentConfigsArgs { export interface ListIntentConfigsReturn { page: Page - intentConfigs: Array + intentConfigs: Array } export interface QueueMetaTxnReceiptArgs { metaTxID: string } export interface QueueMetaTxnReceiptReturn { - status: boolean + status: boolean } - - // // Client // @@ -1977,1420 +2152,1743 @@ export class API implements API { private url(name: string): string { return this.hostname + this.path + name } - + ping = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('Ping'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('Ping'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + version = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('Version'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - version: (_data.version), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('Version'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + version: _data.version, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + runtimeStatus = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('RuntimeStatus'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('RuntimeStatus'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + clock = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('Clock'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - serverTime: (_data.serverTime), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('Clock'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + serverTime: _data.serverTime, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + getSequenceContext = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetSequenceContext'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - data: (_data.data), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('GetSequenceContext'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + data: _data.data, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + getAuthToken = (args: GetAuthTokenArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetAuthToken'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - jwtToken: (_data.jwtToken), - address: (_data.address), - user: (_data.user), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('GetAuthToken'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + jwtToken: _data.jwtToken, + address: _data.address, + user: _data.user, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + getAuthToken2 = (args: GetAuthToken2Args, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetAuthToken2'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - jwtToken: (_data.jwtToken), - address: (_data.address), - user: (_data.user), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - sendPasswordlessLink = (args: SendPasswordlessLinkArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('SendPasswordlessLink'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - registerPublicKey = (args: RegisterPublicKeyArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('RegisterPublicKey'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('GetAuthToken2'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + jwtToken: _data.jwtToken, + address: _data.address, + user: _data.user, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + sendPasswordlessLink = ( + args: SendPasswordlessLinkArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('SendPasswordlessLink'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + registerPublicKey = ( + args: RegisterPublicKeyArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('RegisterPublicKey'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + getPublicKey = (args: GetPublicKeyArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetPublicKey'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - publicKey: (_data.publicKey), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('GetPublicKey'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + publicKey: _data.publicKey, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + friendList = (args: FriendListArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('FriendList'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - page: (_data.page), - friends: >(_data.friends), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getFriendByAddress = (args: GetFriendByAddressArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetFriendByAddress'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - friend: (_data.friend), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('FriendList'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + page: _data.page, + friends: >_data.friends, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getFriendByAddress = ( + args: GetFriendByAddressArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetFriendByAddress'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + friend: _data.friend, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + searchFriends = (args: SearchFriendsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('SearchFriends'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - friends: >(_data.friends), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('SearchFriends'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + friends: >_data.friends, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + addFriend = (args: AddFriendArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('AddFriend'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - friend: (_data.friend), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - updateFriendNickname = (args: UpdateFriendNicknameArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('UpdateFriendNickname'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - friend: (_data.friend), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('AddFriend'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + friend: _data.friend, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + updateFriendNickname = ( + args: UpdateFriendNicknameArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('UpdateFriendNickname'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + friend: _data.friend, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + removeFriend = (args: RemoveFriendArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('RemoveFriend'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('RemoveFriend'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + contractCall = (args: ContractCallArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('ContractCall'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - returns: >(_data.returns), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - decodeContractCall = (args: DecodeContractCallArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('DecodeContractCall'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - call: (_data.call), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - lookupContractCallSelectors = (args: LookupContractCallSelectorsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('LookupContractCallSelectors'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - signatures: >>(_data.signatures), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - userStorageFetch = (args: UserStorageFetchArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('UserStorageFetch'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - object: (_data.object), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - userStorageSave = (args: UserStorageSaveArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('UserStorageSave'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - ok: (_data.ok), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - userStorageDelete = (args: UserStorageDeleteArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('UserStorageDelete'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - ok: (_data.ok), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - userStorageFetchAll = (args: UserStorageFetchAllArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('UserStorageFetchAll'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - objects: <{[key: string]: any}>(_data.objects), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getMoonpayLink = (args: GetMoonpayLinkArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetMoonpayLink'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - signedUrl: (_data.signedUrl), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - resolveENSAddress = (args: ResolveENSAddressArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('ResolveENSAddress'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - address: (_data.address), - ok: (_data.ok), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - isValidSignature = (args: IsValidSignatureArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('IsValidSignature'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - isValid: (_data.isValid), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - isValidMessageSignature = (args: IsValidMessageSignatureArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('IsValidMessageSignature'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - isValid: (_data.isValid), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - isValidTypedDataSignature = (args: IsValidTypedDataSignatureArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('IsValidTypedDataSignature'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - isValid: (_data.isValid), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - isValidETHAuthProof = (args: IsValidETHAuthProofArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('IsValidETHAuthProof'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - isValid: (_data.isValid), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('ContractCall'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + returns: >_data.returns, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + decodeContractCall = ( + args: DecodeContractCallArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('DecodeContractCall'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + call: _data.call, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + lookupContractCallSelectors = ( + args: LookupContractCallSelectorsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('LookupContractCallSelectors'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + signatures: >>_data.signatures, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + userStorageFetch = ( + args: UserStorageFetchArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('UserStorageFetch'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + object: _data.object, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + userStorageSave = ( + args: UserStorageSaveArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('UserStorageSave'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + ok: _data.ok, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + userStorageDelete = ( + args: UserStorageDeleteArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('UserStorageDelete'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + ok: _data.ok, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + userStorageFetchAll = ( + args: UserStorageFetchAllArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('UserStorageFetchAll'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + objects: <{ [key: string]: any }>_data.objects, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getMoonpayLink = ( + args: GetMoonpayLinkArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetMoonpayLink'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + signedUrl: _data.signedUrl, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + resolveENSAddress = ( + args: ResolveENSAddressArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('ResolveENSAddress'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + address: _data.address, + ok: _data.ok, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + isValidSignature = ( + args: IsValidSignatureArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('IsValidSignature'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + isValid: _data.isValid, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + isValidMessageSignature = ( + args: IsValidMessageSignatureArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('IsValidMessageSignature'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + isValid: _data.isValid, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + isValidTypedDataSignature = ( + args: IsValidTypedDataSignatureArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('IsValidTypedDataSignature'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + isValid: _data.isValid, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + isValidETHAuthProof = ( + args: IsValidETHAuthProofArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('IsValidETHAuthProof'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + isValid: _data.isValid, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + getOnRampURL = (args: GetOnRampURLArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetOnRampURL'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - url: (_data.url), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('GetOnRampURL'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + url: _data.url, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + sardineGetClientToken = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('SardineGetClientToken'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - token: (_data.token), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - sardineGetNFTCheckoutToken = (args: SardineGetNFTCheckoutTokenArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('SardineGetNFTCheckoutToken'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - resp: (_data.resp), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - sardineGetNFTCheckoutOrderStatus = (args: SardineGetNFTCheckoutOrderStatusArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('SardineGetNFTCheckoutOrderStatus'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - resp: (_data.resp), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('SardineGetClientToken'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + token: _data.token, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + sardineGetNFTCheckoutToken = ( + args: SardineGetNFTCheckoutTokenArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('SardineGetNFTCheckoutToken'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + resp: _data.resp, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + sardineGetNFTCheckoutOrderStatus = ( + args: SardineGetNFTCheckoutOrderStatusArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('SardineGetNFTCheckoutOrderStatus'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + resp: _data.resp, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + sardineGetSupportedRegions = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('SardineGetSupportedRegions'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - regions: >(_data.regions), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - sardineGetSupportedFiatCurrencies = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('SardineGetSupportedFiatCurrencies'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - tokens: >(_data.tokens), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('SardineGetSupportedRegions'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + regions: >_data.regions, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + sardineGetSupportedFiatCurrencies = ( + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('SardineGetSupportedFiatCurrencies'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + tokens: >_data.tokens, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + sardineGetSupportedTokens = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('SardineGetSupportedTokens'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - tokens: >(_data.tokens), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - sardineGetSupportedTokenForSwap = (args: SardineGetSupportedTokenForSwapArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('SardineGetSupportedTokenForSwap'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - token: (_data.token), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('SardineGetSupportedTokens'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + tokens: >_data.tokens, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + sardineGetSupportedTokenForSwap = ( + args: SardineGetSupportedTokenForSwapArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('SardineGetSupportedTokenForSwap'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + token: _data.token, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + sardineGetEnabledTokens = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('SardineGetEnabledTokens'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - tokens: >(_data.tokens), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - sardineGetQuote = (args: SardineGetQuoteArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('SardineGetQuote'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - quote: (_data.quote), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('SardineGetEnabledTokens'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + tokens: >_data.tokens, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + sardineGetQuote = ( + args: SardineGetQuoteArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('SardineGetQuote'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + quote: _data.quote, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + getSardineClientToken = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetSardineClientToken'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - token: (_data.token), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getSardineNFTCheckoutToken = (args: GetSardineNFTCheckoutTokenArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetSardineNFTCheckoutToken'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - resp: (_data.resp), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getSardineNFTCheckoutOrderStatus = (args: GetSardineNFTCheckoutOrderStatusArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetSardineNFTCheckoutOrderStatus'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - resp: (_data.resp), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('GetSardineClientToken'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + token: _data.token, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getSardineNFTCheckoutToken = ( + args: GetSardineNFTCheckoutTokenArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetSardineNFTCheckoutToken'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + resp: _data.resp, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getSardineNFTCheckoutOrderStatus = ( + args: GetSardineNFTCheckoutOrderStatusArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetSardineNFTCheckoutOrderStatus'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + resp: _data.resp, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + transakGetCountries = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('TransakGetCountries'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - regions: >(_data.regions), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('TransakGetCountries'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + regions: >_data.regions, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + transakGetCryptoCurrencies = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('TransakGetCryptoCurrencies'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - currencies: >(_data.currencies), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('TransakGetCryptoCurrencies'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + currencies: >_data.currencies, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + transakGetFiatCurrencies = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('TransakGetFiatCurrencies'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - currencies: >(_data.currencies), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - transakGetPrice = (args: TransakGetPriceArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('TransakGetPrice'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - price: (_data.price), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - transakGetSupportedNFTCheckoutChains = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('TransakGetSupportedNFTCheckoutChains'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - chains: >(_data.chains), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('TransakGetFiatCurrencies'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + currencies: >_data.currencies, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + transakGetPrice = ( + args: TransakGetPriceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('TransakGetPrice'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + price: _data.price, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + transakGetSupportedNFTCheckoutChains = ( + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('TransakGetSupportedNFTCheckoutChains'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + chains: >_data.chains, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + getCoinPrices = (args: GetCoinPricesArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetCoinPrices'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - tokenPrices: >(_data.tokenPrices), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getCollectiblePrices = (args: GetCollectiblePricesArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetCollectiblePrices'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - tokenPrices: >(_data.tokenPrices), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getExchangeRate = (args: GetExchangeRateArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetExchangeRate'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - exchangeRate: (_data.exchangeRate), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('GetCoinPrices'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + tokenPrices: >_data.tokenPrices, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getCollectiblePrices = ( + args: GetCollectiblePricesArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetCollectiblePrices'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + tokenPrices: >_data.tokenPrices, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getExchangeRate = ( + args: GetExchangeRateArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetExchangeRate'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + exchangeRate: _data.exchangeRate, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + memoryStore = (args: MemoryStoreArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('MemoryStore'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - ok: (_data.ok), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('MemoryStore'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + ok: _data.ok, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + memoryLoad = (args: MemoryLoadArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('MemoryLoad'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - value: (_data.value), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('MemoryLoad'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + value: _data.value, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + getInviteInfo = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetInviteInfo'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - inviteInfo: (_data.inviteInfo), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - isValidAccessCode = (args: IsValidAccessCodeArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('IsValidAccessCode'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - internalClaimAccessCode = (args: InternalClaimAccessCodeArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('InternalClaimAccessCode'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - blockNumberAtTime = (args: BlockNumberAtTimeArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('BlockNumberAtTime'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - blocks: >(_data.blocks), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - paperSessionSecret = (args: PaperSessionSecretArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('PaperSessionSecret'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - secret: (_data.secret), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - paperSessionSecret2 = (args: PaperSessionSecret2Args, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('PaperSessionSecret2'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - secret: (_data.secret), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('GetInviteInfo'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + inviteInfo: _data.inviteInfo, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + isValidAccessCode = ( + args: IsValidAccessCodeArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('IsValidAccessCode'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + internalClaimAccessCode = ( + args: InternalClaimAccessCodeArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('InternalClaimAccessCode'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + blockNumberAtTime = ( + args: BlockNumberAtTimeArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('BlockNumberAtTime'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + blocks: >_data.blocks, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + paperSessionSecret = ( + args: PaperSessionSecretArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('PaperSessionSecret'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + secret: _data.secret, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + paperSessionSecret2 = ( + args: PaperSessionSecret2Args, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('PaperSessionSecret2'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + secret: _data.secret, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + linkWallet = (args: LinkWalletArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('LinkWallet'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getLinkedWallets = (args: GetLinkedWalletsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetLinkedWallets'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - linkedWallets: >(_data.linkedWallets), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - removeLinkedWallet = (args: RemoveLinkedWalletArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('RemoveLinkedWallet'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - generateWaaSVerificationURL = (args: GenerateWaaSVerificationURLArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GenerateWaaSVerificationURL'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - nonce: (_data.nonce), - verificationURL: (_data.verificationURL), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - validateWaaSVerificationNonce = (args: ValidateWaaSVerificationNonceArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('ValidateWaaSVerificationNonce'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - walletAddress: (_data.walletAddress), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - listAdoptedWallets = (args: ListAdoptedWalletsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('ListAdoptedWallets'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - page: (_data.page), - wallets: >(_data.wallets), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('LinkWallet'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getLinkedWallets = ( + args: GetLinkedWalletsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetLinkedWallets'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + linkedWallets: >_data.linkedWallets, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + removeLinkedWallet = ( + args: RemoveLinkedWalletArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('RemoveLinkedWallet'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + generateWaaSVerificationURL = ( + args: GenerateWaaSVerificationURLArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GenerateWaaSVerificationURL'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + nonce: _data.nonce, + verificationURL: _data.verificationURL, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + validateWaaSVerificationNonce = ( + args: ValidateWaaSVerificationNonceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('ValidateWaaSVerificationNonce'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + walletAddress: _data.walletAddress, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + listAdoptedWallets = ( + args: ListAdoptedWalletsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('ListAdoptedWallets'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + page: _data.page, + wallets: >_data.wallets, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + getLifiChains = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetLifiChains'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - chains: >(_data.chains), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('GetLifiChains'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + chains: >_data.chains, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + getLifiTokens = (args: GetLifiTokensArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetLifiTokens'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - tokens: >(_data.tokens), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getLifiSwapRoutes = (args: GetLifiSwapRoutesArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetLifiSwapRoutes'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - routes: >(_data.routes), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getLifiSwapQuote = (args: GetLifiSwapQuoteArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetLifiSwapQuote'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - quote: (_data.quote), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getIntentCallsPayloads = (args: GetIntentCallsPayloadsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetIntentCallsPayloads'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - calls: >(_data.calls), - preconditions: >(_data.preconditions), - metaTxns: >(_data.metaTxns), - trailsFee: (_data.trailsFee), - quote: (_data.quote), - feeQuotes: <{[key: string]: string}>(_data.feeQuotes), - originIntentAddress: (_data.originIntentAddress), - destinationIntentAddress: (_data.destinationIntentAddress), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - commitIntentConfig = (args: CommitIntentConfigArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('CommitIntentConfig'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - config: (_data.config), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getIntentConfig = (args: GetIntentConfigArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetIntentConfig'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - config: (_data.config), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('GetLifiTokens'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + tokens: >_data.tokens, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getLifiSwapRoutes = ( + args: GetLifiSwapRoutesArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetLifiSwapRoutes'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + routes: >_data.routes, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getLifiSwapQuote = ( + args: GetLifiSwapQuoteArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetLifiSwapQuote'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + quote: _data.quote, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getIntentCallsPayloads = ( + args: GetIntentCallsPayloadsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetIntentCallsPayloads'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + calls: >_data.calls, + preconditions: >_data.preconditions, + metaTxns: >_data.metaTxns, + trailsFee: _data.trailsFee, + quote: _data.quote, + feeQuotes: <{ [key: string]: string }>_data.feeQuotes, + originIntentAddress: _data.originIntentAddress, + destinationIntentAddress: _data.destinationIntentAddress, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + commitIntentConfig = ( + args: CommitIntentConfigArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('CommitIntentConfig'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + config: _data.config, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getIntentConfig = ( + args: GetIntentConfigArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetIntentConfig'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + config: _data.config, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + listCurrencyGroups = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('ListCurrencyGroups'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - currencyGroups: >(_data.currencyGroups), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - addOffchainInventory = (args: AddOffchainInventoryArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('AddOffchainInventory'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - inventoryId: (_data.inventoryId), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getOffchainInventory = (args: GetOffchainInventoryArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetOffchainInventory'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - inventory: (_data.inventory), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - listOffchainInventories = (args: ListOffchainInventoriesArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('ListOffchainInventories'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - inventory: >(_data.inventory), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - updateOffchainInventory = (args: UpdateOffchainInventoryArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('UpdateOffchainInventory'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return {} - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - deleteOffchainInventory = (args: DeleteOffchainInventoryArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('DeleteOffchainInventory'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - ok: (_data.ok), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - requestOffchainPayment = (args: RequestOffchainPaymentArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('RequestOffchainPayment'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - payment: (_data.payment), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - listOffchainPayments = (args: ListOffchainPaymentsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('ListOffchainPayments'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - page: (_data.page), - payments: >(_data.payments), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('ListCurrencyGroups'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + currencyGroups: >_data.currencyGroups, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + addOffchainInventory = ( + args: AddOffchainInventoryArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('AddOffchainInventory'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + inventoryId: _data.inventoryId, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getOffchainInventory = ( + args: GetOffchainInventoryArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetOffchainInventory'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + inventory: _data.inventory, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + listOffchainInventories = ( + args: ListOffchainInventoriesArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('ListOffchainInventories'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + inventory: >_data.inventory, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + updateOffchainInventory = ( + args: UpdateOffchainInventoryArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('UpdateOffchainInventory'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return {} + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + deleteOffchainInventory = ( + args: DeleteOffchainInventoryArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('DeleteOffchainInventory'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + ok: _data.ok, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + requestOffchainPayment = ( + args: RequestOffchainPaymentArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('RequestOffchainPayment'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + payment: _data.payment, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + listOffchainPayments = ( + args: ListOffchainPaymentsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('ListOffchainPayments'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + page: _data.page, + payments: >_data.payments, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + savePack = (args: SavePackArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('SavePack'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - merkleRoot: (_data.merkleRoot), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('SavePack'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + merkleRoot: _data.merkleRoot, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + getPack = (args: GetPackArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetPack'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - pack: (_data.pack), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('GetPack'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + pack: _data.pack, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + getPackIds = (args: GetPackIdsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetPackIds'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - packIds: >(_data.packIds), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - deletePack = (args: DeletePackArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('DeletePack'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - updatePackContent = (args: UpdatePackContentArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('UpdatePackContent'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - merkleRoot: (_data.merkleRoot), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getRevealTxData = (args: GetRevealTxDataArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetRevealTxData'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - txData: (_data.txData), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - checkoutOptionsPrimary = (args: CheckoutOptionsPrimaryArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('CheckoutOptionsPrimary'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - options: (_data.options), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - checkoutOptionsSecondary = (args: CheckoutOptionsSecondaryArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('CheckoutOptionsSecondary'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - options: (_data.options), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - checkoutOptionsGetTransakContractID = (args: CheckoutOptionsGetTransakContractIDArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('CheckoutOptionsGetTransakContractID'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - contractId: (_data.contractId), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - fortePayCreateIntent = (args: FortePayCreateIntentArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('FortePayCreateIntent'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - resp: (_data.resp), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - fortePayGetPaymentStatuses = (args: FortePayGetPaymentStatusesArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('FortePayGetPaymentStatuses'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - statuses: >(_data.statuses), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getCCTPTransfer = (args: GetCCTPTransferArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetCCTPTransfer'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - transfer: (_data.transfer), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - queueCCTPTransfer = (args: QueueCCTPTransferArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('QueueCCTPTransfer'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - transfer: (_data.transfer), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - queueIntentConfigExecution = (args: QueueIntentConfigExecutionArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('QueueIntentConfigExecution'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getIntentConfigExecutionStatus = (args: GetIntentConfigExecutionStatusArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetIntentConfigExecutionStatus'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - executionStatus: (_data.executionStatus), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - listIntentConfigs = (args: ListIntentConfigsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('ListIntentConfigs'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - page: (_data.page), - intentConfigs: >(_data.intentConfigs), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - queueMetaTxnReceipt = (args: QueueMetaTxnReceiptArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('QueueMetaTxnReceipt'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('GetPackIds'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + packIds: >_data.packIds, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - -} - const createHTTPRequest = (body: object = {}, headers: object = {}, signal: AbortSignal | null = null): object => { - const reqHeaders: {[key: string]: string} = { ...headers, 'Content-Type': 'application/json' } + deletePack = (args: DeletePackArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('DeletePack'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + updatePackContent = ( + args: UpdatePackContentArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('UpdatePackContent'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + merkleRoot: _data.merkleRoot, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getRevealTxData = ( + args: GetRevealTxDataArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetRevealTxData'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + txData: _data.txData, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + checkoutOptionsPrimary = ( + args: CheckoutOptionsPrimaryArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('CheckoutOptionsPrimary'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + options: _data.options, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + checkoutOptionsSecondary = ( + args: CheckoutOptionsSecondaryArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('CheckoutOptionsSecondary'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + options: _data.options, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + checkoutOptionsGetTransakContractID = ( + args: CheckoutOptionsGetTransakContractIDArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('CheckoutOptionsGetTransakContractID'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + contractId: _data.contractId, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + fortePayCreateIntent = ( + args: FortePayCreateIntentArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('FortePayCreateIntent'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + resp: _data.resp, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + fortePayGetPaymentStatuses = ( + args: FortePayGetPaymentStatusesArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('FortePayGetPaymentStatuses'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + statuses: >_data.statuses, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getCCTPTransfer = ( + args: GetCCTPTransferArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetCCTPTransfer'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + transfer: _data.transfer, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + queueCCTPTransfer = ( + args: QueueCCTPTransferArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('QueueCCTPTransfer'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + transfer: _data.transfer, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + queueIntentConfigExecution = ( + args: QueueIntentConfigExecutionArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('QueueIntentConfigExecution'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getIntentConfigExecutionStatus = ( + args: GetIntentConfigExecutionStatusArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetIntentConfigExecutionStatus'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + executionStatus: _data.executionStatus, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + listIntentConfigs = ( + args: ListIntentConfigsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('ListIntentConfigs'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + page: _data.page, + intentConfigs: >_data.intentConfigs, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + queueMetaTxnReceipt = ( + args: QueueMetaTxnReceiptArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('QueueMetaTxnReceipt'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } +} + +const createHTTPRequest = (body: object = {}, headers: object = {}, signal: AbortSignal | null = null): object => { + const reqHeaders: { [key: string]: string } = { ...headers, 'Content-Type': 'application/json' } reqHeaders[WebrpcHeader] = WebrpcHeaderValue return { method: 'POST', headers: reqHeaders, body: JSON.stringify(body || {}), - signal + signal, } } const buildResponse = (res: Response): Promise => { - return res.text().then(text => { + return res.text().then((text) => { let data try { data = JSON.parse(text) - } catch(error) { + } catch (error) { let message = '' - if (error instanceof Error) { + if (error instanceof Error) { message = error.message } throw WebrpcBadResponseError.new({ status: res.status, - cause: `JSON.parse(): ${message}: response text: ${text}`}, - ) + cause: `JSON.parse(): ${message}: response text: ${text}`, + }) } if (!res.ok) { - const code: number = (typeof data.code === 'number') ? data.code : 0 + const code: number = typeof data.code === 'number' ? data.code : 0 throw (webrpcErrorByCode[code] || WebrpcError).new(data) } return data @@ -3435,7 +3933,7 @@ export class WebrpcEndpointError extends WebrpcError { code: number = 0, message: string = `endpoint error`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcEndpointError.prototype) @@ -3448,7 +3946,7 @@ export class WebrpcRequestFailedError extends WebrpcError { code: number = -1, message: string = `request failed`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcRequestFailedError.prototype) @@ -3461,7 +3959,7 @@ export class WebrpcBadRouteError extends WebrpcError { code: number = -2, message: string = `bad route`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcBadRouteError.prototype) @@ -3474,7 +3972,7 @@ export class WebrpcBadMethodError extends WebrpcError { code: number = -3, message: string = `bad method`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcBadMethodError.prototype) @@ -3487,7 +3985,7 @@ export class WebrpcBadRequestError extends WebrpcError { code: number = -4, message: string = `bad request`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcBadRequestError.prototype) @@ -3500,7 +3998,7 @@ export class WebrpcBadResponseError extends WebrpcError { code: number = -5, message: string = `bad response`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcBadResponseError.prototype) @@ -3513,7 +4011,7 @@ export class WebrpcServerPanicError extends WebrpcError { code: number = -6, message: string = `server panic`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcServerPanicError.prototype) @@ -3526,7 +4024,7 @@ export class WebrpcInternalErrorError extends WebrpcError { code: number = -7, message: string = `internal error`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcInternalErrorError.prototype) @@ -3539,7 +4037,7 @@ export class WebrpcClientDisconnectedError extends WebrpcError { code: number = -8, message: string = `client disconnected`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcClientDisconnectedError.prototype) @@ -3552,7 +4050,7 @@ export class WebrpcStreamLostError extends WebrpcError { code: number = -9, message: string = `stream lost`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcStreamLostError.prototype) @@ -3565,14 +4063,13 @@ export class WebrpcStreamFinishedError extends WebrpcError { code: number = -10, message: string = `stream finished`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcStreamFinishedError.prototype) } } - // Schema errors export class UnauthorizedError extends WebrpcError { @@ -3581,7 +4078,7 @@ export class UnauthorizedError extends WebrpcError { code: number = 1000, message: string = `Unauthorized access`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, UnauthorizedError.prototype) @@ -3594,7 +4091,7 @@ export class PermissionDeniedError extends WebrpcError { code: number = 1001, message: string = `Permission denied`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, PermissionDeniedError.prototype) @@ -3607,7 +4104,7 @@ export class SessionExpiredError extends WebrpcError { code: number = 1002, message: string = `Session expired`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, SessionExpiredError.prototype) @@ -3620,7 +4117,7 @@ export class MethodNotFoundError extends WebrpcError { code: number = 1003, message: string = `Method not found`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, MethodNotFoundError.prototype) @@ -3633,7 +4130,7 @@ export class RequestConflictError extends WebrpcError { code: number = 1004, message: string = `Conflict with target resource`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, RequestConflictError.prototype) @@ -3646,7 +4143,7 @@ export class AbortedError extends WebrpcError { code: number = 1005, message: string = `Request aborted`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, AbortedError.prototype) @@ -3659,7 +4156,7 @@ export class GeoblockedError extends WebrpcError { code: number = 1006, message: string = `Geoblocked region`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, GeoblockedError.prototype) @@ -3672,7 +4169,7 @@ export class RateLimitedError extends WebrpcError { code: number = 1007, message: string = `Rate-limited. Please slow down.`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, RateLimitedError.prototype) @@ -3685,7 +4182,7 @@ export class ProjectNotFoundError extends WebrpcError { code: number = 1008, message: string = `Project not found`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, ProjectNotFoundError.prototype) @@ -3698,7 +4195,7 @@ export class AccessKeyNotFoundError extends WebrpcError { code: number = 1101, message: string = `Access key not found`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, AccessKeyNotFoundError.prototype) @@ -3711,7 +4208,7 @@ export class AccessKeyMismatchError extends WebrpcError { code: number = 1102, message: string = `Access key mismatch`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, AccessKeyMismatchError.prototype) @@ -3724,7 +4221,7 @@ export class InvalidOriginError extends WebrpcError { code: number = 1103, message: string = `Invalid origin for Access Key`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, InvalidOriginError.prototype) @@ -3737,7 +4234,7 @@ export class InvalidServiceError extends WebrpcError { code: number = 1104, message: string = `Service not enabled for Access key`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, InvalidServiceError.prototype) @@ -3750,7 +4247,7 @@ export class UnauthorizedUserError extends WebrpcError { code: number = 1105, message: string = `Unauthorized user`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, UnauthorizedUserError.prototype) @@ -3763,7 +4260,7 @@ export class QuotaExceededError extends WebrpcError { code: number = 1200, message: string = `Quota request exceeded`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, QuotaExceededError.prototype) @@ -3776,7 +4273,7 @@ export class QuotaRateLimitError extends WebrpcError { code: number = 1201, message: string = `Quota rate limit exceeded`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, QuotaRateLimitError.prototype) @@ -3789,7 +4286,7 @@ export class NoDefaultKeyError extends WebrpcError { code: number = 1300, message: string = `No default access key found`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, NoDefaultKeyError.prototype) @@ -3802,7 +4299,7 @@ export class MaxAccessKeysError extends WebrpcError { code: number = 1301, message: string = `Access keys limit reached`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, MaxAccessKeysError.prototype) @@ -3815,7 +4312,7 @@ export class AtLeastOneKeyError extends WebrpcError { code: number = 1302, message: string = `You need at least one Access Key`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, AtLeastOneKeyError.prototype) @@ -3828,7 +4325,7 @@ export class TimeoutError extends WebrpcError { code: number = 1900, message: string = `Request timed out`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, TimeoutError.prototype) @@ -3841,7 +4338,7 @@ export class InvalidArgumentError extends WebrpcError { code: number = 2000, message: string = `Invalid argument`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, InvalidArgumentError.prototype) @@ -3854,7 +4351,7 @@ export class UnavailableError extends WebrpcError { code: number = 2002, message: string = `Unavailable resource`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, UnavailableError.prototype) @@ -3867,7 +4364,7 @@ export class QueryFailedError extends WebrpcError { code: number = 2003, message: string = `Query failed`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, QueryFailedError.prototype) @@ -3880,7 +4377,7 @@ export class NotFoundError extends WebrpcError { code: number = 3000, message: string = `Resource not found`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, NotFoundError.prototype) @@ -3893,14 +4390,13 @@ export class UnsupportedNetworkError extends WebrpcError { code: number = 3008, message: string = `Unsupported network`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, UnsupportedNetworkError.prototype) } } - export enum errors { WebrpcEndpoint = 'WebrpcEndpoint', WebrpcRequestFailed = 'WebrpcRequestFailed', @@ -4019,4 +4515,3 @@ export const webrpcErrorByCode: { [code: number]: any } = { } export type Fetch = (input: RequestInfo, init?: RequestInit) => Promise - diff --git a/packages/services/relayer/src/rpc-relayer/relayer.gen.ts b/packages/services/relayer/src/rpc-relayer/relayer.gen.ts index 79ca492968..a9e6b44405 100644 --- a/packages/services/relayer/src/rpc-relayer/relayer.gen.ts +++ b/packages/services/relayer/src/rpc-relayer/relayer.gen.ts @@ -5,72 +5,71 @@ // // webrpc-gen -schema=relayer.ridl -target=typescript -client -out=./clients/relayer.gen.ts -export const WebrpcHeader = "Webrpc" +export const WebrpcHeader = 'Webrpc' -export const WebrpcHeaderValue = "webrpc@v0.26.0;gen-typescript@v0.17.0;sequence-relayer@v0.4.1" +export const WebrpcHeaderValue = 'webrpc@v0.26.0;gen-typescript@v0.17.0;sequence-relayer@v0.4.1' // WebRPC description and code-gen version -export const WebRPCVersion = "v1" +export const WebRPCVersion = 'v1' // Schema version of your RIDL schema -export const WebRPCSchemaVersion = "v0.4.1" +export const WebRPCSchemaVersion = 'v0.4.1' // Schema hash generated from your RIDL schema -export const WebRPCSchemaHash = "62fe2b49d57c4a0d3960ac1176d48ecfffc7af5a" +export const WebRPCSchemaHash = '62fe2b49d57c4a0d3960ac1176d48ecfffc7af5a' type WebrpcGenVersions = { - webrpcGenVersion: string; - codeGenName: string; - codeGenVersion: string; - schemaName: string; - schemaVersion: string; -}; + webrpcGenVersion: string + codeGenName: string + codeGenVersion: string + schemaName: string + schemaVersion: string +} export function VersionFromHeader(headers: Headers): WebrpcGenVersions { - const headerValue = headers.get(WebrpcHeader); + const headerValue = headers.get(WebrpcHeader) if (!headerValue) { return { - webrpcGenVersion: "", - codeGenName: "", - codeGenVersion: "", - schemaName: "", - schemaVersion: "", - }; + webrpcGenVersion: '', + codeGenName: '', + codeGenVersion: '', + schemaName: '', + schemaVersion: '', + } } - return parseWebrpcGenVersions(headerValue); + return parseWebrpcGenVersions(headerValue) } function parseWebrpcGenVersions(header: string): WebrpcGenVersions { - const versions = header.split(";"); + const versions = header.split(';') if (versions.length < 3) { return { - webrpcGenVersion: "", - codeGenName: "", - codeGenVersion: "", - schemaName: "", - schemaVersion: "", - }; + webrpcGenVersion: '', + codeGenName: '', + codeGenVersion: '', + schemaName: '', + schemaVersion: '', + } } - const [_, webrpcGenVersion] = versions[0]!.split("@"); - const [codeGenName, codeGenVersion] = versions[1]!.split("@"); - const [schemaName, schemaVersion] = versions[2]!.split("@"); + const [_, webrpcGenVersion] = versions[0]!.split('@') + const [codeGenName, codeGenVersion] = versions[1]!.split('@') + const [schemaName, schemaVersion] = versions[2]!.split('@') return { - webrpcGenVersion: webrpcGenVersion ?? "", - codeGenName: codeGenName ?? "", - codeGenVersion: codeGenVersion ?? "", - schemaName: schemaName ?? "", - schemaVersion: schemaVersion ?? "", - }; + webrpcGenVersion: webrpcGenVersion ?? '', + codeGenName: codeGenName ?? '', + codeGenVersion: codeGenVersion ?? '', + schemaName: schemaName ?? '', + schemaVersion: schemaVersion ?? '', + } } // // Types // - export enum ETHTxnStatus { UNKNOWN = 'UNKNOWN', DROPPED = 'DROPPED', @@ -79,7 +78,7 @@ export enum ETHTxnStatus { SUCCEEDED = 'SUCCEEDED', PARTIALLY_FAILED = 'PARTIALLY_FAILED', FAILED = 'FAILED', - PENDING_PRECONDITION = 'PENDING_PRECONDITION' + PENDING_PRECONDITION = 'PENDING_PRECONDITION', } export enum TransferType { @@ -88,7 +87,7 @@ export enum TransferType { BRIDGE_DEPOSIT = 'BRIDGE_DEPOSIT', BRIDGE_WITHDRAW = 'BRIDGE_WITHDRAW', BURN = 'BURN', - UNKNOWN = 'UNKNOWN' + UNKNOWN = 'UNKNOWN', } export enum SimulateStatus { @@ -97,18 +96,18 @@ export enum SimulateStatus { FAILED = 'FAILED', ABORTED = 'ABORTED', REVERTED = 'REVERTED', - NOT_ENOUGH_GAS = 'NOT_ENOUGH_GAS' + NOT_ENOUGH_GAS = 'NOT_ENOUGH_GAS', } export enum FeeTokenType { UNKNOWN = 'UNKNOWN', ERC20_TOKEN = 'ERC20_TOKEN', - ERC1155_TOKEN = 'ERC1155_TOKEN' + ERC1155_TOKEN = 'ERC1155_TOKEN', } export enum SortOrder { DESC = 'DESC', - ASC = 'ASC' + ASC = 'ASC', } export interface Version { @@ -138,8 +137,7 @@ export interface SenderStatus { active: boolean } -export interface RuntimeChecks { -} +export interface RuntimeChecks {} export interface SequenceContext { factory: string @@ -215,8 +213,8 @@ export interface MetaTxnLog { minedAt: string target: string input: string - txnArgs: {[key: string]: any} - txnReceipt?: {[key: string]: any} + txnArgs: { [key: string]: any } + txnReceipt?: { [key: string]: any } walletAddress: string metaTxnNonce: string gasLimit: number @@ -353,9 +351,9 @@ export interface Relayer { getSequenceContext(headers?: object, signal?: AbortSignal): Promise getChainID(headers?: object, signal?: AbortSignal): Promise /** - * + * * Transactions - * + * * TODO (future): rename this to just, 'SendTransaction(txn: MetaTransaction)' or 'SendTransaction(txn: SignedTransaction)', or something.. * Project ID is only used by service and admin calls. Other clients must have projectID passed via the context * TODO: rename return txnHash: string to metaTxnID: string @@ -370,21 +368,41 @@ export interface Relayer { * new, GetTransactionReceipt and WaitTransactionReceipt methods * we can also accept metaTxnId and txnHash .. so can take either or.. I wonder if ERC-4337 has any convention on this? */ - getMetaTxnReceipt(args: GetMetaTxnReceiptArgs, headers?: object, signal?: AbortSignal): Promise + getMetaTxnReceipt( + args: GetMetaTxnReceiptArgs, + headers?: object, + signal?: AbortSignal, + ): Promise simulate(args: SimulateArgs, headers?: object, signal?: AbortSignal): Promise simulateV3(args: SimulateV3Args, headers?: object, signal?: AbortSignal): Promise /** * TODO: deprecated, to be removed by https://github.com/0xsequence/stack/pull/356 at a later date */ - updateMetaTxnGasLimits(args: UpdateMetaTxnGasLimitsArgs, headers?: object, signal?: AbortSignal): Promise + updateMetaTxnGasLimits( + args: UpdateMetaTxnGasLimitsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise feeTokens(headers?: object, signal?: AbortSignal): Promise feeOptions(args: FeeOptionsArgs, headers?: object, signal?: AbortSignal): Promise /** * TODO: deprecated, to be removed by https://github.com/0xsequence/stack/pull/356 at a later date */ - getMetaTxnNetworkFeeOptions(args: GetMetaTxnNetworkFeeOptionsArgs, headers?: object, signal?: AbortSignal): Promise - getMetaTransactions(args: GetMetaTransactionsArgs, headers?: object, signal?: AbortSignal): Promise - getTransactionCost(args: GetTransactionCostArgs, headers?: object, signal?: AbortSignal): Promise + getMetaTxnNetworkFeeOptions( + args: GetMetaTxnNetworkFeeOptionsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + getMetaTransactions( + args: GetMetaTransactionsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + getTransactionCost( + args: GetTransactionCostArgs, + headers?: object, + signal?: AbortSignal, + ): Promise /** * Sent transactions from an account. If filter is omitted then it will return all transactions. */ @@ -393,7 +411,11 @@ export interface Relayer { * Pending transactions waiting to be mined for an account. This endpoint is just a sugar of `SentTransactions` * with the filter set to pending: true. */ - pendingTransactions(args: PendingTransactionsArgs, headers?: object, signal?: AbortSignal): Promise + pendingTransactions( + args: PendingTransactionsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise /** * Legacy Gas Tank */ @@ -403,10 +425,26 @@ export interface Relayer { /** * Legacy Gas Adjustment */ - nextGasTankBalanceAdjustmentNonce(args: NextGasTankBalanceAdjustmentNonceArgs, headers?: object, signal?: AbortSignal): Promise - adjustGasTankBalance(args: AdjustGasTankBalanceArgs, headers?: object, signal?: AbortSignal): Promise - getGasTankBalanceAdjustment(args: GetGasTankBalanceAdjustmentArgs, headers?: object, signal?: AbortSignal): Promise - listGasTankBalanceAdjustments(args: ListGasTankBalanceAdjustmentsArgs, headers?: object, signal?: AbortSignal): Promise + nextGasTankBalanceAdjustmentNonce( + args: NextGasTankBalanceAdjustmentNonceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + adjustGasTankBalance( + args: AdjustGasTankBalanceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + getGasTankBalanceAdjustment( + args: GetGasTankBalanceAdjustmentArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + listGasTankBalanceAdjustments( + args: ListGasTankBalanceAdjustmentsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise /** * Gas Sponsorship */ @@ -418,43 +456,50 @@ export interface Relayer { /** * Gas Sponsor Lookup */ - addressGasSponsors(args: AddressGasSponsorsArgs, headers?: object, signal?: AbortSignal): Promise + addressGasSponsors( + args: AddressGasSponsorsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise /** * Project Balance */ - getProjectBalance(args: GetProjectBalanceArgs, headers?: object, signal?: AbortSignal): Promise - adjustProjectBalance(args: AdjustProjectBalanceArgs, headers?: object, signal?: AbortSignal): Promise + getProjectBalance( + args: GetProjectBalanceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + adjustProjectBalance( + args: AdjustProjectBalanceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise } -export interface PingArgs { -} +export interface PingArgs {} export interface PingReturn { - status: boolean -} -export interface VersionArgs { + status: boolean } +export interface VersionArgs {} export interface VersionReturn { - version: Version -} -export interface RuntimeStatusArgs { + version: Version } +export interface RuntimeStatusArgs {} export interface RuntimeStatusReturn { - status: RuntimeStatus -} -export interface GetSequenceContextArgs { + status: RuntimeStatus } +export interface GetSequenceContextArgs {} export interface GetSequenceContextReturn { - data: SequenceContext -} -export interface GetChainIDArgs { + data: SequenceContext } +export interface GetChainIDArgs {} export interface GetChainIDReturn { - chainID: number + chainID: number } export interface SendMetaTxnArgs { call: MetaTxn @@ -465,7 +510,7 @@ export interface SendMetaTxnArgs { export interface SendMetaTxnReturn { status: boolean - txnHash: string + txnHash: string } export interface GetMetaTxnNonceArgs { walletContractAddress: string @@ -473,14 +518,14 @@ export interface GetMetaTxnNonceArgs { } export interface GetMetaTxnNonceReturn { - nonce: string + nonce: string } export interface GetMetaTxnReceiptArgs { metaTxID: string } export interface GetMetaTxnReceiptReturn { - receipt: MetaTxnReceipt + receipt: MetaTxnReceipt } export interface SimulateArgs { wallet: string @@ -488,7 +533,7 @@ export interface SimulateArgs { } export interface SimulateReturn { - results: Array + results: Array } export interface SimulateV3Args { wallet: string @@ -496,7 +541,7 @@ export interface SimulateV3Args { } export interface SimulateV3Return { - results: Array + results: Array } export interface UpdateMetaTxnGasLimitsArgs { walletAddress: string @@ -505,14 +550,13 @@ export interface UpdateMetaTxnGasLimitsArgs { } export interface UpdateMetaTxnGasLimitsReturn { - payload: string -} -export interface FeeTokensArgs { + payload: string } +export interface FeeTokensArgs {} export interface FeeTokensReturn { isFeeRequired: boolean - tokens: Array + tokens: Array } export interface FeeOptionsArgs { wallet: string @@ -524,7 +568,7 @@ export interface FeeOptionsArgs { export interface FeeOptionsReturn { options: Array sponsored: boolean - quote?: string + quote?: string } export interface GetMetaTxnNetworkFeeOptionsArgs { walletConfig: any @@ -532,7 +576,7 @@ export interface GetMetaTxnNetworkFeeOptionsArgs { } export interface GetMetaTxnNetworkFeeOptionsReturn { - options: Array + options: Array } export interface GetMetaTransactionsArgs { projectId: number @@ -541,7 +585,7 @@ export interface GetMetaTransactionsArgs { export interface GetMetaTransactionsReturn { page: Page - transactions: Array + transactions: Array } export interface GetTransactionCostArgs { projectId: number @@ -550,7 +594,7 @@ export interface GetTransactionCostArgs { } export interface GetTransactionCostReturn { - cost: number + cost: number } export interface SentTransactionsArgs { filter?: SentTransactionsFilter @@ -559,7 +603,7 @@ export interface SentTransactionsArgs { export interface SentTransactionsReturn { page: Page - transactions: Array + transactions: Array } export interface PendingTransactionsArgs { page?: Page @@ -567,14 +611,14 @@ export interface PendingTransactionsArgs { export interface PendingTransactionsReturn { page: Page - transactions: Array + transactions: Array } export interface GetGasTankArgs { id: number } export interface GetGasTankReturn { - gasTank: GasTank + gasTank: GasTank } export interface AddGasTankArgs { name: string @@ -584,7 +628,7 @@ export interface AddGasTankArgs { export interface AddGasTankReturn { status: boolean - gasTank: GasTank + gasTank: GasTank } export interface UpdateGasTankArgs { id: number @@ -595,14 +639,14 @@ export interface UpdateGasTankArgs { export interface UpdateGasTankReturn { status: boolean - gasTank: GasTank + gasTank: GasTank } export interface NextGasTankBalanceAdjustmentNonceArgs { id: number } export interface NextGasTankBalanceAdjustmentNonceReturn { - nonce: number + nonce: number } export interface AdjustGasTankBalanceArgs { id: number @@ -612,7 +656,7 @@ export interface AdjustGasTankBalanceArgs { export interface AdjustGasTankBalanceReturn { status: boolean - adjustment: GasTankBalanceAdjustment + adjustment: GasTankBalanceAdjustment } export interface GetGasTankBalanceAdjustmentArgs { id: number @@ -620,7 +664,7 @@ export interface GetGasTankBalanceAdjustmentArgs { } export interface GetGasTankBalanceAdjustmentReturn { - adjustment: GasTankBalanceAdjustment + adjustment: GasTankBalanceAdjustment } export interface ListGasTankBalanceAdjustmentsArgs { id: number @@ -629,7 +673,7 @@ export interface ListGasTankBalanceAdjustmentsArgs { export interface ListGasTankBalanceAdjustmentsReturn { page: Page - adjustments: Array + adjustments: Array } export interface ListGasSponsorsArgs { projectId: number @@ -638,7 +682,7 @@ export interface ListGasSponsorsArgs { export interface ListGasSponsorsReturn { page: Page - gasSponsors: Array + gasSponsors: Array } export interface GetGasSponsorArgs { projectId: number @@ -646,7 +690,7 @@ export interface GetGasSponsorArgs { } export interface GetGasSponsorReturn { - gasSponsor: GasSponsor + gasSponsor: GasSponsor } export interface AddGasSponsorArgs { projectId: number @@ -657,7 +701,7 @@ export interface AddGasSponsorArgs { export interface AddGasSponsorReturn { status: boolean - gasSponsor: GasSponsor + gasSponsor: GasSponsor } export interface UpdateGasSponsorArgs { projectId: number @@ -668,7 +712,7 @@ export interface UpdateGasSponsorArgs { export interface UpdateGasSponsorReturn { status: boolean - gasSponsor: GasSponsor + gasSponsor: GasSponsor } export interface RemoveGasSponsorArgs { projectId: number @@ -676,7 +720,7 @@ export interface RemoveGasSponsorArgs { } export interface RemoveGasSponsorReturn { - status: boolean + status: boolean } export interface AddressGasSponsorsArgs { address: string @@ -685,14 +729,14 @@ export interface AddressGasSponsorsArgs { export interface AddressGasSponsorsReturn { page: Page - gasSponsors: Array + gasSponsors: Array } export interface GetProjectBalanceArgs { projectId: number } export interface GetProjectBalanceReturn { - balance: number + balance: number } export interface AdjustProjectBalanceArgs { projectId: number @@ -701,11 +745,9 @@ export interface AdjustProjectBalanceArgs { } export interface AdjustProjectBalanceReturn { - balance: number + balance: number } - - // // Client // @@ -722,521 +764,619 @@ export class Relayer implements Relayer { private url(name: string): string { return this.hostname + this.path + name } - + ping = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('Ping'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('Ping'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + version = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('Version'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - version: (_data.version), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('Version'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + version: _data.version, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + runtimeStatus = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('RuntimeStatus'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('RuntimeStatus'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + getSequenceContext = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetSequenceContext'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - data: (_data.data), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('GetSequenceContext'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + data: _data.data, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + getChainID = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetChainID'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - chainID: (_data.chainID), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('GetChainID'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + chainID: _data.chainID, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + sendMetaTxn = (args: SendMetaTxnArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('SendMetaTxn'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - txnHash: (_data.txnHash), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getMetaTxnNonce = (args: GetMetaTxnNonceArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetMetaTxnNonce'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - nonce: (_data.nonce), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getMetaTxnReceipt = (args: GetMetaTxnReceiptArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetMetaTxnReceipt'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - receipt: (_data.receipt), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('SendMetaTxn'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + txnHash: _data.txnHash, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getMetaTxnNonce = ( + args: GetMetaTxnNonceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetMetaTxnNonce'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + nonce: _data.nonce, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getMetaTxnReceipt = ( + args: GetMetaTxnReceiptArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetMetaTxnReceipt'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + receipt: _data.receipt, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + simulate = (args: SimulateArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('Simulate'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - results: >(_data.results), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('Simulate'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + results: >_data.results, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + simulateV3 = (args: SimulateV3Args, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('SimulateV3'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - results: >(_data.results), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - updateMetaTxnGasLimits = (args: UpdateMetaTxnGasLimitsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('UpdateMetaTxnGasLimits'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - payload: (_data.payload), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('SimulateV3'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + results: >_data.results, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + updateMetaTxnGasLimits = ( + args: UpdateMetaTxnGasLimitsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('UpdateMetaTxnGasLimits'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + payload: _data.payload, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + feeTokens = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('FeeTokens'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - isFeeRequired: (_data.isFeeRequired), - tokens: >(_data.tokens), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('FeeTokens'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + isFeeRequired: _data.isFeeRequired, + tokens: >_data.tokens, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + feeOptions = (args: FeeOptionsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('FeeOptions'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - options: >(_data.options), - sponsored: (_data.sponsored), - quote: (_data.quote), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getMetaTxnNetworkFeeOptions = (args: GetMetaTxnNetworkFeeOptionsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetMetaTxnNetworkFeeOptions'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - options: >(_data.options), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getMetaTransactions = (args: GetMetaTransactionsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetMetaTransactions'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - page: (_data.page), - transactions: >(_data.transactions), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getTransactionCost = (args: GetTransactionCostArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetTransactionCost'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - cost: (_data.cost), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - sentTransactions = (args: SentTransactionsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('SentTransactions'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - page: (_data.page), - transactions: >(_data.transactions), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - pendingTransactions = (args: PendingTransactionsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('PendingTransactions'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - page: (_data.page), - transactions: >(_data.transactions), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('FeeOptions'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + options: >_data.options, + sponsored: _data.sponsored, + quote: _data.quote, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getMetaTxnNetworkFeeOptions = ( + args: GetMetaTxnNetworkFeeOptionsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetMetaTxnNetworkFeeOptions'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + options: >_data.options, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getMetaTransactions = ( + args: GetMetaTransactionsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetMetaTransactions'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + page: _data.page, + transactions: >_data.transactions, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getTransactionCost = ( + args: GetTransactionCostArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetTransactionCost'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + cost: _data.cost, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + sentTransactions = ( + args: SentTransactionsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('SentTransactions'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + page: _data.page, + transactions: >_data.transactions, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + pendingTransactions = ( + args: PendingTransactionsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('PendingTransactions'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + page: _data.page, + transactions: >_data.transactions, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + getGasTank = (args: GetGasTankArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetGasTank'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - gasTank: (_data.gasTank), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('GetGasTank'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + gasTank: _data.gasTank, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + addGasTank = (args: AddGasTankArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('AddGasTank'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - gasTank: (_data.gasTank), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('AddGasTank'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + gasTank: _data.gasTank, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + updateGasTank = (args: UpdateGasTankArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('UpdateGasTank'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - gasTank: (_data.gasTank), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - nextGasTankBalanceAdjustmentNonce = (args: NextGasTankBalanceAdjustmentNonceArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('NextGasTankBalanceAdjustmentNonce'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - nonce: (_data.nonce), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - adjustGasTankBalance = (args: AdjustGasTankBalanceArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('AdjustGasTankBalance'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - adjustment: (_data.adjustment), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getGasTankBalanceAdjustment = (args: GetGasTankBalanceAdjustmentArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetGasTankBalanceAdjustment'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - adjustment: (_data.adjustment), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - listGasTankBalanceAdjustments = (args: ListGasTankBalanceAdjustmentsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('ListGasTankBalanceAdjustments'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - page: (_data.page), - adjustments: >(_data.adjustments), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - listGasSponsors = (args: ListGasSponsorsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('ListGasSponsors'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - page: (_data.page), - gasSponsors: >(_data.gasSponsors), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('UpdateGasTank'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + gasTank: _data.gasTank, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + nextGasTankBalanceAdjustmentNonce = ( + args: NextGasTankBalanceAdjustmentNonceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('NextGasTankBalanceAdjustmentNonce'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + nonce: _data.nonce, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + adjustGasTankBalance = ( + args: AdjustGasTankBalanceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('AdjustGasTankBalance'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + adjustment: _data.adjustment, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getGasTankBalanceAdjustment = ( + args: GetGasTankBalanceAdjustmentArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetGasTankBalanceAdjustment'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + adjustment: _data.adjustment, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + listGasTankBalanceAdjustments = ( + args: ListGasTankBalanceAdjustmentsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('ListGasTankBalanceAdjustments'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + page: _data.page, + adjustments: >_data.adjustments, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + listGasSponsors = ( + args: ListGasSponsorsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('ListGasSponsors'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + page: _data.page, + gasSponsors: >_data.gasSponsors, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + getGasSponsor = (args: GetGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetGasSponsor'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - gasSponsor: (_data.gasSponsor), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - addGasSponsor = (args: AddGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('AddGasSponsor'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - gasSponsor: (_data.gasSponsor), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - updateGasSponsor = (args: UpdateGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('UpdateGasSponsor'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - gasSponsor: (_data.gasSponsor), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - removeGasSponsor = (args: RemoveGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('RemoveGasSponsor'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - addressGasSponsors = (args: AddressGasSponsorsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('AddressGasSponsors'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - page: (_data.page), - gasSponsors: >(_data.gasSponsors), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getProjectBalance = (args: GetProjectBalanceArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetProjectBalance'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - balance: (_data.balance), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - adjustProjectBalance = (args: AdjustProjectBalanceArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('AdjustProjectBalance'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - balance: (_data.balance), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('GetGasSponsor'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + gasSponsor: _data.gasSponsor, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - -} - const createHTTPRequest = (body: object = {}, headers: object = {}, signal: AbortSignal | null = null): object => { - const reqHeaders: {[key: string]: string} = { ...headers, 'Content-Type': 'application/json' } + addGasSponsor = (args: AddGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('AddGasSponsor'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + gasSponsor: _data.gasSponsor, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + updateGasSponsor = ( + args: UpdateGasSponsorArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('UpdateGasSponsor'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + gasSponsor: _data.gasSponsor, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + removeGasSponsor = ( + args: RemoveGasSponsorArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('RemoveGasSponsor'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + addressGasSponsors = ( + args: AddressGasSponsorsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('AddressGasSponsors'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + page: _data.page, + gasSponsors: >_data.gasSponsors, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getProjectBalance = ( + args: GetProjectBalanceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetProjectBalance'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + balance: _data.balance, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + adjustProjectBalance = ( + args: AdjustProjectBalanceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('AdjustProjectBalance'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + balance: _data.balance, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } +} + +const createHTTPRequest = (body: object = {}, headers: object = {}, signal: AbortSignal | null = null): object => { + const reqHeaders: { [key: string]: string } = { ...headers, 'Content-Type': 'application/json' } reqHeaders[WebrpcHeader] = WebrpcHeaderValue return { method: 'POST', headers: reqHeaders, body: JSON.stringify(body || {}), - signal + signal, } } const buildResponse = (res: Response): Promise => { - return res.text().then(text => { + return res.text().then((text) => { let data try { data = JSON.parse(text) - } catch(error) { + } catch (error) { let message = '' - if (error instanceof Error) { + if (error instanceof Error) { message = error.message } throw WebrpcBadResponseError.new({ status: res.status, - cause: `JSON.parse(): ${message}: response text: ${text}`}, - ) + cause: `JSON.parse(): ${message}: response text: ${text}`, + }) } if (!res.ok) { - const code: number = (typeof data.code === 'number') ? data.code : 0 + const code: number = typeof data.code === 'number' ? data.code : 0 throw (webrpcErrorByCode[code] || WebrpcError).new(data) } return data @@ -1281,7 +1421,7 @@ export class WebrpcEndpointError extends WebrpcError { code: number = 0, message: string = `endpoint error`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcEndpointError.prototype) @@ -1294,7 +1434,7 @@ export class WebrpcRequestFailedError extends WebrpcError { code: number = -1, message: string = `request failed`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcRequestFailedError.prototype) @@ -1307,7 +1447,7 @@ export class WebrpcBadRouteError extends WebrpcError { code: number = -2, message: string = `bad route`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcBadRouteError.prototype) @@ -1320,7 +1460,7 @@ export class WebrpcBadMethodError extends WebrpcError { code: number = -3, message: string = `bad method`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcBadMethodError.prototype) @@ -1333,7 +1473,7 @@ export class WebrpcBadRequestError extends WebrpcError { code: number = -4, message: string = `bad request`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcBadRequestError.prototype) @@ -1346,7 +1486,7 @@ export class WebrpcBadResponseError extends WebrpcError { code: number = -5, message: string = `bad response`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcBadResponseError.prototype) @@ -1359,7 +1499,7 @@ export class WebrpcServerPanicError extends WebrpcError { code: number = -6, message: string = `server panic`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcServerPanicError.prototype) @@ -1372,7 +1512,7 @@ export class WebrpcInternalErrorError extends WebrpcError { code: number = -7, message: string = `internal error`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcInternalErrorError.prototype) @@ -1385,7 +1525,7 @@ export class WebrpcClientDisconnectedError extends WebrpcError { code: number = -8, message: string = `client disconnected`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcClientDisconnectedError.prototype) @@ -1398,7 +1538,7 @@ export class WebrpcStreamLostError extends WebrpcError { code: number = -9, message: string = `stream lost`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcStreamLostError.prototype) @@ -1411,14 +1551,13 @@ export class WebrpcStreamFinishedError extends WebrpcError { code: number = -10, message: string = `stream finished`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcStreamFinishedError.prototype) } } - // Schema errors export class UnauthorizedError extends WebrpcError { @@ -1427,7 +1566,7 @@ export class UnauthorizedError extends WebrpcError { code: number = 1000, message: string = `Unauthorized access`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, UnauthorizedError.prototype) @@ -1440,7 +1579,7 @@ export class PermissionDeniedError extends WebrpcError { code: number = 1001, message: string = `Permission denied`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, PermissionDeniedError.prototype) @@ -1453,7 +1592,7 @@ export class SessionExpiredError extends WebrpcError { code: number = 1002, message: string = `Session expired`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, SessionExpiredError.prototype) @@ -1466,7 +1605,7 @@ export class MethodNotFoundError extends WebrpcError { code: number = 1003, message: string = `Method not found`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, MethodNotFoundError.prototype) @@ -1479,7 +1618,7 @@ export class RequestConflictError extends WebrpcError { code: number = 1004, message: string = `Conflict with target resource`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, RequestConflictError.prototype) @@ -1492,7 +1631,7 @@ export class AbortedError extends WebrpcError { code: number = 1005, message: string = `Request aborted`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, AbortedError.prototype) @@ -1505,7 +1644,7 @@ export class GeoblockedError extends WebrpcError { code: number = 1006, message: string = `Geoblocked region`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, GeoblockedError.prototype) @@ -1518,7 +1657,7 @@ export class RateLimitedError extends WebrpcError { code: number = 1007, message: string = `Rate-limited. Please slow down.`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, RateLimitedError.prototype) @@ -1531,7 +1670,7 @@ export class ProjectNotFoundError extends WebrpcError { code: number = 1008, message: string = `Project not found`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, ProjectNotFoundError.prototype) @@ -1544,7 +1683,7 @@ export class AccessKeyNotFoundError extends WebrpcError { code: number = 1101, message: string = `Access key not found`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, AccessKeyNotFoundError.prototype) @@ -1557,7 +1696,7 @@ export class AccessKeyMismatchError extends WebrpcError { code: number = 1102, message: string = `Access key mismatch`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, AccessKeyMismatchError.prototype) @@ -1570,7 +1709,7 @@ export class InvalidOriginError extends WebrpcError { code: number = 1103, message: string = `Invalid origin for Access Key`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, InvalidOriginError.prototype) @@ -1583,7 +1722,7 @@ export class InvalidServiceError extends WebrpcError { code: number = 1104, message: string = `Service not enabled for Access key`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, InvalidServiceError.prototype) @@ -1596,7 +1735,7 @@ export class UnauthorizedUserError extends WebrpcError { code: number = 1105, message: string = `Unauthorized user`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, UnauthorizedUserError.prototype) @@ -1609,7 +1748,7 @@ export class QuotaExceededError extends WebrpcError { code: number = 1200, message: string = `Quota request exceeded`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, QuotaExceededError.prototype) @@ -1622,7 +1761,7 @@ export class QuotaRateLimitError extends WebrpcError { code: number = 1201, message: string = `Quota rate limit exceeded`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, QuotaRateLimitError.prototype) @@ -1635,7 +1774,7 @@ export class NoDefaultKeyError extends WebrpcError { code: number = 1300, message: string = `No default access key found`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, NoDefaultKeyError.prototype) @@ -1648,7 +1787,7 @@ export class MaxAccessKeysError extends WebrpcError { code: number = 1301, message: string = `Access keys limit reached`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, MaxAccessKeysError.prototype) @@ -1661,7 +1800,7 @@ export class AtLeastOneKeyError extends WebrpcError { code: number = 1302, message: string = `You need at least one Access Key`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, AtLeastOneKeyError.prototype) @@ -1674,7 +1813,7 @@ export class TimeoutError extends WebrpcError { code: number = 1900, message: string = `Request timed out`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, TimeoutError.prototype) @@ -1687,7 +1826,7 @@ export class InvalidArgumentError extends WebrpcError { code: number = 2001, message: string = `Invalid argument`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, InvalidArgumentError.prototype) @@ -1700,7 +1839,7 @@ export class UnavailableError extends WebrpcError { code: number = 2002, message: string = `Unavailable resource`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, UnavailableError.prototype) @@ -1713,7 +1852,7 @@ export class QueryFailedError extends WebrpcError { code: number = 2003, message: string = `Query failed`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, QueryFailedError.prototype) @@ -1726,7 +1865,7 @@ export class NotFoundError extends WebrpcError { code: number = 3000, message: string = `Resource not found`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, NotFoundError.prototype) @@ -1739,7 +1878,7 @@ export class InsufficientFeeError extends WebrpcError { code: number = 3004, message: string = `Insufficient fee`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, InsufficientFeeError.prototype) @@ -1752,7 +1891,7 @@ export class NotEnoughBalanceError extends WebrpcError { code: number = 3005, message: string = `Not enough balance`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, NotEnoughBalanceError.prototype) @@ -1765,14 +1904,13 @@ export class SimulationFailedError extends WebrpcError { code: number = 3006, message: string = `Simulation failed`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, SimulationFailedError.prototype) } } - export enum errors { WebrpcEndpoint = 'WebrpcEndpoint', WebrpcRequestFailed = 'WebrpcRequestFailed', @@ -1897,4 +2035,3 @@ export const webrpcErrorByCode: { [code: number]: any } = { } export type Fetch = (input: RequestInfo, init?: RequestInit) => Promise - diff --git a/packages/wallet/core/src/index.ts b/packages/wallet/core/src/index.ts index 1bc32aed48..d84206d678 100644 --- a/packages/wallet/core/src/index.ts +++ b/packages/wallet/core/src/index.ts @@ -6,3 +6,9 @@ export * as Relayer from './relayer/index.js' export * as Envelope from './envelope.js' export * as Preconditions from './preconditions/index.js' export * as Utils from './utils/index.js' +export { + type ExplicitSessionConfig, + type ExplicitSession, + type ImplicitSession, + type Session, +} from './utils/session/types.js' diff --git a/packages/wallet/core/src/utils/session/types.ts b/packages/wallet/core/src/utils/session/types.ts new file mode 100644 index 0000000000..6bf1086d4d --- /dev/null +++ b/packages/wallet/core/src/utils/session/types.ts @@ -0,0 +1,33 @@ +import { Permission } from '@0xsequence/wallet-primitives' +import { Address } from 'ox' + +export type ExplicitSessionConfig = { + valueLimit: bigint + deadline: bigint + permissions: Permission.Permission[] + chainId: number +} + +// Complete session types - what the SDK returns after session creation +export type ImplicitSession = { + sessionAddress: Address.Address + type: 'implicit' +} + +export type ExplicitSession = { + sessionAddress: Address.Address + valueLimit: bigint + deadline: bigint + permissions: Permission.Permission[] + chainId: number + type: 'explicit' +} + +export type Session = { + type: 'explicit' | 'implicit' + sessionAddress: Address.Address + valueLimit?: bigint + deadline?: bigint + permissions?: Permission.Permission[] + chainId?: number +} diff --git a/packages/wallet/core/test/session-manager.test.ts b/packages/wallet/core/test/session-manager.test.ts index bde3b12994..aa154df916 100644 --- a/packages/wallet/core/test/session-manager.test.ts +++ b/packages/wallet/core/test/session-manager.test.ts @@ -13,6 +13,7 @@ import { USDC_ADDRESS, } from './constants' import { Extensions } from '@0xsequence/wallet-primitives' +import { ExplicitSessionConfig } from '../../wdk/src/sequence/types/sessions.js' const { PermissionBuilder, ERC20PermissionBuilder } = Utils @@ -86,7 +87,7 @@ for (const extension of ALL_EXTENSIONS) { let topology = SessionConfig.emptySessionsTopology(identityAddress) // Add random signer to the topology - const sessionPermission: Signers.Session.ExplicitParams = { + const sessionPermission: ExplicitSessionConfig = { chainId, valueLimit: 1000000000000000000n, deadline: BigInt(Math.floor(Date.now() / 1000) + 3600), // 1 hour from now @@ -419,7 +420,7 @@ for (const extension of ALL_EXTENSIONS) { // Create explicit signer const explicitPrivateKey = Secp256k1.randomPrivateKey() - const explicitPermissions: Signers.Session.ExplicitParams = { + const explicitPermissions: ExplicitSessionConfig = { chainId: useChainId ? chainId : 0, valueLimit: 1000000000000000000n, // 1 ETH deadline: BigInt(Math.floor(Date.now() / 1000) + 3600), // 1 hour from now @@ -721,7 +722,7 @@ for (const extension of ALL_EXTENSIONS) { // Create explicit signer const explicitPrivateKey = Secp256k1.randomPrivateKey() - const sessionPermission: Signers.Session.ExplicitParams = { + const sessionPermission: ExplicitSessionConfig = { chainId, valueLimit: 1000000000000000000n, // 1 ETH deadline: BigInt(Math.floor(Date.now() / 1000) + 3600), // 1 hour from now @@ -794,7 +795,7 @@ for (const extension of ALL_EXTENSIONS) { // Create explicit signer const explicitPrivateKey = Secp256k1.randomPrivateKey() - const sessionPermission: Signers.Session.ExplicitParams = { + const sessionPermission: ExplicitSessionConfig = { chainId, valueLimit: 0n, deadline: BigInt(Math.floor(Date.now() / 1000) + 3600), // 1 hour from now @@ -888,7 +889,7 @@ for (const extension of ALL_EXTENSIONS) { const explicitPrivateKey = Secp256k1.randomPrivateKey() const explicitAddress = Address.fromPublicKey(Secp256k1.getPublicKey({ privateKey: explicitPrivateKey })) const approveAmount = 10000000n // 10 USDC - const sessionPermission: Signers.Session.ExplicitParams = { + const sessionPermission: ExplicitSessionConfig = { chainId, valueLimit: 0n, deadline: BigInt(Math.floor(Date.now() / 1000) + 3600), // 1 hour from now @@ -990,7 +991,7 @@ for (const extension of ALL_EXTENSIONS) { // Create explicit signer const explicitPrivateKey = Secp256k1.randomPrivateKey() const explicitAddress = Address.fromPublicKey(Secp256k1.getPublicKey({ privateKey: explicitPrivateKey })) - const sessionPermission: Signers.Session.ExplicitParams = { + const sessionPermission: ExplicitSessionConfig = { chainId, valueLimit: 1000000000000000000n, // 1 ETH deadline: BigInt(Math.floor(Date.now() / 1000) + 3600), // 1 hour from now @@ -1100,7 +1101,7 @@ for (const extension of ALL_EXTENSIONS) { // Create explicit signer const explicitPrivateKey = Secp256k1.randomPrivateKey() const explicitAddress = Address.fromPublicKey(Secp256k1.getPublicKey({ privateKey: explicitPrivateKey })) - const sessionPermission: Signers.Session.ExplicitParams = { + const sessionPermission: ExplicitSessionConfig = { chainId, valueLimit: 1000000000000000000n, // 1 ETH deadline: BigInt(Math.floor(Date.now() / 1000) + 3600), // 1 hour from now @@ -1224,7 +1225,7 @@ for (const extension of ALL_EXTENSIONS) { // Create explicit signer const explicitPrivateKey = Secp256k1.randomPrivateKey() const explicitAddress = Address.fromPublicKey(Secp256k1.getPublicKey({ privateKey: explicitPrivateKey })) - const sessionPermission: Signers.Session.ExplicitParams = { + const sessionPermission: ExplicitSessionConfig = { chainId, valueLimit: 1000000000000000000n, // 1 ETH deadline: BigInt(Math.floor(Date.now() / 1000) + 3600), // 1 hour from now diff --git a/packages/wallet/dapp-client/src/ChainSessionManager.ts b/packages/wallet/dapp-client/src/ChainSessionManager.ts index 76b62a3f3d..623fc1faa2 100644 --- a/packages/wallet/dapp-client/src/ChainSessionManager.ts +++ b/packages/wallet/dapp-client/src/ChainSessionManager.ts @@ -1,8 +1,19 @@ -import { Envelope, Relayer, Signers, State, Wallet } from '@0xsequence/wallet-core' -import { Attestation, Constants, Extensions, Payload, SessionConfig } from '@0xsequence/wallet-primitives' import * as Guard from '@0xsequence/guard' import { AbiFunction, Address, Hex, Provider, RpcTransport, Secp256k1 } from 'ox' +import { + Envelope, + Relayer, + Signers, + State, + Wallet, + Attestation, + Constants, + Extensions, + Payload, + SessionConfig, +} from './index.js' + import { DappTransport } from './DappTransport.js' import { @@ -18,21 +29,21 @@ import { SequenceStorage } from './utils/storage.js' import { getRelayerUrl, getRpcUrl } from './utils/index.js' import { - AddExplicitSessionPayload, - CreateNewSessionPayload, - ConnectSuccessResponsePayload, + CreateNewSessionResponse, ExplicitSessionEventListener, - ModifySessionPayload, - ModifySessionSuccessResponsePayload, LoginMethod, RandomPrivateKeyFn, RequestActionType, - Session, Transaction, TransportMode, GuardConfig, + CreateNewSessionPayload, + ModifyExplicitSessionPayload, + SessionResponse, + AddExplicitSessionPayload, } from './types/index.js' import { CACHE_DB_NAME, VALUE_FORWARDER_ADDRESS } from './utils/constants.js' +import { ExplicitSession, ImplicitSession, ExplicitSessionConfig } from './index.js' interface ChainSessionManagerEventMap { explicitSessionResponse: ExplicitSessionEventListener @@ -54,7 +65,8 @@ export class ChainSessionManager { [K in keyof ChainSessionManagerEventMap]?: Set } = {} - private sessions: Session[] = [] + private explicitSessions: ExplicitSession[] = [] + private implicitSession: ImplicitSession | null = null private walletAddress: Address.Address | null = null private sessionManager: Signers.SessionManager | null = null @@ -250,13 +262,14 @@ export class ChainSessionManager { /** * Initiates the creation of a new session by sending a request to the wallet. - * @param permissions (Optional) Permissions for an initial explicit session. + * @param origin The origin of the session. + * @param sessionConfig (Optional) Session configuration for an initial explicit session. * @param options (Optional) Additional options like preferred login method. * @throws {InitializationError} If a session already exists or the transport fails to initialize. */ async createNewSession( origin: string, - permissions?: Signers.Session.ExplicitParams, + sessionConfig?: ExplicitSessionConfig, options: { preferredLoginMethod?: LoginMethod email?: string @@ -269,14 +282,17 @@ export class ChainSessionManager { const newPk = await this.randomPrivateKeyFn() const newSignerAddress = Address.fromPublicKey(Secp256k1.getPublicKey({ privateKey: newPk })) + const completeSession = { + sessionAddress: newSignerAddress, + ...sessionConfig, + } try { if (!this.transport) throw new InitializationError('Transport failed to initialize.') const payload: CreateNewSessionPayload = { - sessionAddress: newSignerAddress, origin, - permissions, + session: completeSession as ExplicitSession, includeImplicitSession: options.includeImplicitSession ?? false, preferredLoginMethod: options.preferredLoginMethod, email: options.preferredLoginMethod === 'email' ? options.email : undefined, @@ -292,7 +308,7 @@ export class ChainSessionManager { await this.sequenceStorage.setPendingRedirectRequest(true) } - const connectResponse = await this.transport.sendRequest( + const connectResponse = await this.transport.sendRequest( RequestActionType.CREATE_NEW_SESSION, this.redirectUrl, payload, @@ -319,7 +335,7 @@ export class ChainSessionManager { ) } - if (permissions) { + if (sessionConfig) { this.initializeWithWallet(receivedAddress) await this._initializeExplicitSessionInternal(newPk, loginMethod, userEmail, guard, true) await this.sequenceStorage.saveExplicitSession({ @@ -344,11 +360,11 @@ export class ChainSessionManager { /** * Initiates the addition of a new explicit session by sending a request to the wallet. - * @param permissions The permissions for the new explicit session. + * @param explicitSessionConfig The explicit session configuration for the new explicit session. * @throws {InitializationError} If the manager is not initialized. * @throws {AddExplicitSessionError} If adding the session fails. */ - async addExplicitSession(permissions: Signers.Session.ExplicitParams): Promise { + async addExplicitSession(explicitSessionConfig: ExplicitSessionConfig): Promise { if (!this.walletAddress) { throw new InitializationError( 'Cannot add an explicit session without a wallet address. Initialize the manager with a wallet address first.', @@ -363,8 +379,7 @@ export class ChainSessionManager { const newSignerAddress = Address.fromPublicKey(Secp256k1.getPublicKey({ privateKey: newPk })) const payload: AddExplicitSessionPayload = { - sessionAddress: newSignerAddress, - permissions, + session: { ...explicitSessionConfig, sessionAddress: newSignerAddress, type: 'explicit' }, } if (this.transport.mode === TransportMode.REDIRECT) { @@ -377,7 +392,7 @@ export class ChainSessionManager { await this.sequenceStorage.setPendingRedirectRequest(true) } - const response = await this.transport.sendRequest( + const response = await this.transport.sendRequest( RequestActionType.ADD_EXPLICIT_SESSION, this.redirectUrl, payload, @@ -415,15 +430,11 @@ export class ChainSessionManager { /** * Initiates the modification of an existing explicit session by sending a request to the wallet. - * @param sessionAddress The address of the explicit session to modify. - * @param newPermissions The new permissions for the session. + * @param modifiedExplicitSession The modified explicit session. * @throws {InitializationError} If the manager is not initialized. * @throws {ModifyExplicitSessionError} If modifying the session fails. */ - async modifyExplicitSession( - sessionAddress: Address.Address, - newPermissions: Signers.Session.ExplicitParams, - ): Promise { + async modifyExplicitSession(modifiedExplicitSession: ExplicitSession): Promise { if (!this.walletAddress) { throw new InitializationError( 'Cannot modify an explicit session without a wallet address. Initialize the manager with a wallet address first.', @@ -433,15 +444,22 @@ export class ChainSessionManager { try { if (!this.transport) throw new InitializationError('Transport failed to initialize.') - const session = this.sessions.find((s) => Address.isEqual(s.address, sessionAddress)) - if (!session) { + if (!modifiedExplicitSession.sessionAddress) { + throw new ModifyExplicitSessionError('Session address is required.') + } + + const existingExplicitSession: ExplicitSession = this.explicitSessions.find((s) => + Address.isEqual(s.sessionAddress!, modifiedExplicitSession.sessionAddress!), + ) as ExplicitSession + if (!existingExplicitSession) { throw new ModifyExplicitSessionError('Session not found.') } - const payload: ModifySessionPayload = { + const payload: ModifyExplicitSessionPayload = { walletAddress: this.walletAddress, - sessionAddress: sessionAddress, - permissions: newPermissions, + session: { + ...modifiedExplicitSession, + }, } if (this.transport.mode === TransportMode.REDIRECT) { @@ -453,7 +471,7 @@ export class ChainSessionManager { await this.sequenceStorage.setPendingRedirectRequest(true) } - const response = await this.transport.sendRequest( + const response = await this.transport.sendRequest( RequestActionType.MODIFY_EXPLICIT_SESSION, this.redirectUrl, payload, @@ -462,12 +480,12 @@ export class ChainSessionManager { if ( !Address.isEqual(Address.from(response.walletAddress), this.walletAddress) && - !Address.isEqual(Address.from(response.sessionAddress), sessionAddress) + !Address.isEqual(Address.from(response.sessionAddress), modifiedExplicitSession.sessionAddress) ) { throw new ModifyExplicitSessionError('Wallet or session address mismatch.') } - session.permissions = newPermissions + existingExplicitSession.permissions = modifiedExplicitSession.permissions if (this.transport?.mode === TransportMode.POPUP) { this.transport?.closeWallet() @@ -484,7 +502,7 @@ export class ChainSessionManager { * @returns A promise resolving to true on success. */ private async _handleRedirectConnectionResponse(response: { - payload: ConnectSuccessResponsePayload + payload: CreateNewSessionResponse action: string }): Promise { const tempPk = await this.sequenceStorage.getAndClearTempSessionPk() @@ -519,7 +537,7 @@ export class ChainSessionManager { ) } - if (savedRequest && savedPayload && savedPayload.permissions) { + if (savedRequest && savedPayload && savedPayload.session) { await this._initializeExplicitSessionInternal(tempPk, loginMethod, userEmail, guard, true) await this.sequenceStorage.saveExplicitSession({ pk: tempPk, @@ -613,10 +631,10 @@ export class ChainSessionManager { ) this.sessionManager = this.sessionManager.withImplicitSigner(implicitSigner) - this.sessions.push({ - address: implicitSigner.address, - isImplicit: true, - }) + this.implicitSession = { + sessionAddress: implicitSigner.address, + type: 'implicit', + } this.walletAddress = address if (saveSession) @@ -679,11 +697,13 @@ export class ChainSessionManager { const explicitSigner = new Signers.Session.Explicit(pk, permissions) this.sessionManager = this.sessionManager.withExplicitSigner(explicitSigner) - this.sessions.push({ - address: explicitSigner.address, - isImplicit: false, + this.explicitSessions.push({ + sessionAddress: explicitSigner.address, chainId: this.chainId, - permissions, + permissions: permissions.permissions, + valueLimit: permissions.valueLimit, + deadline: permissions.deadline, + type: 'explicit', }) if (guard && !this.guard) this.guard = guard @@ -853,7 +873,7 @@ export class ChainSessionManager { ) { return this._handleRedirectConnectionResponse(response) } else if (response.action === RequestActionType.MODIFY_EXPLICIT_SESSION) { - const modifyResponse = response.payload as ModifySessionSuccessResponsePayload + const modifyResponse = response.payload as SessionResponse if (!Address.isEqual(Address.from(modifyResponse.walletAddress), this.walletAddress!)) { throw new ModifyExplicitSessionError('Wallet address mismatch on redirect response.') } @@ -881,11 +901,19 @@ export class ChainSessionManager { } /** - * Gets the sessions (signers) managed by this instance. + * Gets the sessions (signers) managed by this session manager. * @returns An array of session objects. */ - getSessions(): Session[] { - return this.sessions + getExplicitSessions(): ExplicitSession[] { + return this.explicitSessions + } + + /** + * Gets the implicit session managed by this session manager. + * @returns An implicit session object or null if no implicit session is found. + */ + getImplicitSession(): ImplicitSession | null { + return this.implicitSession } /** @@ -973,7 +1001,8 @@ export class ChainSessionManager { * @private Resets the internal state of the manager without clearing stored credentials. */ private _resetState(): void { - this.sessions = [] + this.explicitSessions = [] + this.implicitSession = null this.walletAddress = null this.wallet = null this.sessionManager = null diff --git a/packages/wallet/dapp-client/src/DappClient.ts b/packages/wallet/dapp-client/src/DappClient.ts index 4bff6bdb4a..dcc7d81ceb 100644 --- a/packages/wallet/dapp-client/src/DappClient.ts +++ b/packages/wallet/dapp-client/src/DappClient.ts @@ -1,10 +1,16 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import { Relayer, Signers } from '@0xsequence/wallet-core' import { Address, Hex } from 'ox' +import { + Relayer, + type ExplicitSession, + type ExplicitSessionConfig, + type ImplicitSession, + type Session, +} from './index.js' + import { ChainSessionManager } from './ChainSessionManager.js' import { DappTransport } from './DappTransport.js' -import { InitializationError, SigningError, TransactionError } from './utils/errors.js' +import { ConnectionError, InitializationError, SigningError, TransactionError } from './utils/errors.js' import { SequenceStorage, WebStorage } from './utils/storage.js' import { DappClientExplicitSessionEventListener, @@ -15,7 +21,6 @@ import { RequestActionType, SendWalletTransactionPayload, SequenceSessionStorage, - Session, SignMessagePayload, SignTypedDataPayload, Transaction, @@ -39,8 +44,6 @@ interface DappClientEventMap { * This client manages user sessions across multiple chains, handles connection * and disconnection, and provides methods for signing and sending transactions. * - * @see {@link https://docs.sequence.xyz/sdk/typescript/v3/dapp-client} for more detailed documentation. - * * @example * // It is recommended to manage a singleton instance of this client. * const dappClient = new DappClient('http://localhost:5173'); @@ -164,8 +167,6 @@ export class DappClient { * @param listener The listener to call when the event occurs. * @returns A function to remove the listener. * - * @see {@link https://docs.sequence.xyz/sdk/typescript/v3/dapp-client/on} for more detailed documentation. - * * @example * useEffect(() => { * const handleWalletAction = (response) => { @@ -191,8 +192,6 @@ export class DappClient { * Retrieves the wallet address of the current session. * @returns The wallet address of the current session, or null if not initialized. {@link Address.Address} * - * @see {@link https://docs.sequence.xyz/sdk/typescript/v3/dapp-client/get-wallet-address} for more detailed documentation. - * * @example * const dappClient = new DappClient('http://localhost:5173'); * await dappClient.initialize(); @@ -207,31 +206,64 @@ export class DappClient { } /** - * Retrieves a list of all active sessions (signers) associated with the current wallet. - * @returns An array of all the active sessions. {@link { address: Address.Address, isImplicit: boolean }[]} - * - * @see {@link https://docs.sequence.xyz/sdk/typescript/v3/dapp-client/get-all-sessions} for more detailed documentation. + * Retrieves a list of all active explicit sessions (signers) associated with the current wallet. + * @returns An array of all the active explicit sessions. {@link ExplicitSession[]} * * @example * const dappClient = new DappClient('http://localhost:5173'); * await dappClient.initialize(); * * if (dappClient.isInitialized) { - * const sessions = dappClient.getAllSessions(); - * console.log('Sessions:', sessions); + * const explicitSessions = dappClient.getAllExplicitSessions(); + * console.log('Sessions:', explicitSessions); * } */ - public getAllSessions(): Session[] { - const allSessions = new Map() + public getAllExplicitSessions(): ExplicitSession[] { + const allExplicitSessions = new Map() Array.from(this.chainSessionManagers.values()).forEach((chainSessionManager) => { - chainSessionManager.getSessions().forEach((session) => { - const uniqueKey = `${session.address.toLowerCase()}-${session.isImplicit}` - if (!allSessions.has(uniqueKey)) { - allSessions.set(uniqueKey, session) + chainSessionManager.getExplicitSessions().forEach((session) => { + const uniqueKey = session.sessionAddress?.toLowerCase() + if (!allExplicitSessions.has(uniqueKey)) { + allExplicitSessions.set(uniqueKey, session) } }) }) - return Array.from(allSessions.values()) + return Array.from(allExplicitSessions.values()) + } + + /** + * Retrieves a list of all active implicit sessions (signers) associated with the current wallet. + * @note There can only be one implicit session per chain. + * @returns An array of all the active implicit sessions. {@link ImplicitSession[]} + * + * @example + * const dappClient = new DappClient('http://localhost:5173'); + * await dappClient.initialize(); + * + * if (dappClient.isInitialized) { + * const implicitSessions = dappClient.getAllImplicitSessions(); + * console.log('Sessions:', implicitSessions); + * } + */ + public getAllImplicitSessions(): ImplicitSession[] { + const allImplicitSessions = new Map() + Array.from(this.chainSessionManagers.values()).forEach((chainSessionManager) => { + const session = chainSessionManager.getImplicitSession() + if (!session) return + const uniqueKey = session?.sessionAddress?.toLowerCase() + if (uniqueKey && !allImplicitSessions.has(uniqueKey)) { + allImplicitSessions.set(uniqueKey, session) + } + }) + return Array.from(allImplicitSessions.values()) + } + + /** + * Gets all the sessions (explicit and implicit) managed by the client. + * @returns An array of session objects. {@link Session[]} + */ + public getAllSessions(): Session[] { + return [...this.getAllImplicitSessions(), ...this.getAllExplicitSessions()] } /** @@ -280,8 +312,6 @@ export class DappClient { * * @returns A promise that resolves when initialization is complete. * - * @see {@link https://docs.sequence.xyz/sdk/typescript/v3/dapp-client/initialize} for more detailed documentation. - * * @example * const dappClient = new DappClient('http://localhost:5173'); * await dappClient.initialize(); @@ -362,24 +392,28 @@ export class DappClient { /** * Initiates a connection with the wallet and creates a new session. * @param chainId The primary chain ID for the new session. - * @param permissions (Optional) Permissions to request for an initial explicit session. {@link Signers.Session.ExplicitParams} + * @param sessionConfig Session configuration {@link ExplicitSessionConfig} to request for an initial session. * @param options (Optional) Connection options, such as a preferred login method or email for social or email logins. * @throws If the connection process fails. {@link ConnectionError} * @throws If a session already exists. {@link InitializationError} * * @returns A promise that resolves when the connection is established. * - * @see {@link https://docs.sequence.xyz/sdk/typescript/v3/dapp-client/connect} for more detailed documentation. - * * @example - * const dappClient = new DappClient('http://localhost:5173'); - * await dappClient.connect(137, window.location.origin, undefined, { + * // Connect with an explicit session configuration + * const explicitSessionConfig: ExplicitSessionConfig = { + * valueLimit: 0n, + * deadline: BigInt(Date.now() + 1000 * 60 * 60), // 1 hour + * permissions: [...], + * chainId: 137 + * }; + * await dappClient.connect(137, explicitSessionConfig, { * preferredLoginMethod: 'google', * }); */ async connect( chainId: number, - permissions?: Signers.Session.ExplicitParams, + sessionConfig?: ExplicitSessionConfig, options: { preferredLoginMethod?: LoginMethod email?: string @@ -392,7 +426,7 @@ export class DappClient { try { const chainSessionManager = this.getChainSessionManager(chainId) - await chainSessionManager.createNewSession(this.origin, permissions, options) + await chainSessionManager.createNewSession(this.origin, sessionConfig, options) // For popup mode, we need to manually update the state and emit an event. // For redirect mode, this code won't be reached; the page will navigate away. @@ -401,7 +435,7 @@ export class DappClient { } } catch (err) { await this.disconnect() - throw err + throw new ConnectionError(`Connection failed: ${err}`) } } @@ -409,19 +443,16 @@ export class DappClient { * Adds a new explicit session for a given chain to an existing wallet. * @remarks * An `explicit session` is a session that can interact with any contract, subject to user-approved permissions. - * @param chainId The chain ID on which to add the explicit session. - * @param permissions The permissions to request for the new session. {@link Signers.Session.ExplicitParams} + * @param session The explicit session to add. {@link ExplicitSession} * * @throws If the session cannot be added. {@link AddExplicitSessionError} * @throws If the client or relevant chain is not initialized. {@link InitializationError} * * @returns A promise that resolves when the session is added. * - * @see {@link https://docs.sequence.xyz/sdk/typescript/v3/dapp-client/add-explicit-session} for more detailed documentation. - * * @example * ... - * import { Signers, Utils } from "@0xsequence/wallet-core"; + * import { ExplicitSession, Utils } from "@0xsequence/wallet-core"; * import { DappClient } from "@0xsequence/sessions"; * ... * @@ -433,24 +464,24 @@ export class DappClient { * * if (dappClient.isInitialized) { * // Allow Dapp (Session Signer) to transfer "amount" of USDC - * const permissions: Signers.Session.ExplicitParams = { + * const explicitSession: ExplicitSession = { * chainId: Number(chainId), * valueLimit: 0n, // Not allowed to transfer native tokens (ETH, etc) * deadline: BigInt(Date.now() + 1000 * 60 * 5000), // 5000 minutes from now * permissions: [Utils.ERC20PermissionBuilder.buildTransfer(USDC_ADDRESS, amount)] * }; - * await dappClient.addExplicitSession(1, permissions); + * await dappClient.addExplicitSession(explicitSession); * } */ - async addExplicitSession(chainId: number, permissions: Signers.Session.ExplicitParams): Promise { + async addExplicitSession(explicitSessionConfig: ExplicitSessionConfig): Promise { if (!this.isInitialized || !this.walletAddress) throw new InitializationError('Cannot add an explicit session without an existing wallet.') - const chainSessionManager = this.getChainSessionManager(chainId) + const chainSessionManager = this.getChainSessionManager(explicitSessionConfig.chainId) if (!chainSessionManager.isInitialized) { chainSessionManager.initializeWithWallet(this.walletAddress) } - await chainSessionManager.addExplicitSession(permissions) + await chainSessionManager.addExplicitSession(explicitSessionConfig) if (this.transport.mode === TransportMode.POPUP) { await this._loadStateFromStorage() @@ -458,48 +489,34 @@ export class DappClient { } /** - * Modifies the permissions of an existing explicit session for a given chain and session address. - * @param chainId The chain ID on which the explicit session exists. - * @param sessionAddress The address of the explicit session to modify. {@link Address.Address} - * @param permissions The new permissions to set for the session. {@link Signers.Session.ExplicitParams} + * Modifies an explicit session for a given chain + * @param explicitSession The explicit session to modify. {@link ExplicitSession} * * @throws If the client or relevant chain is not initialized. {@link InitializationError} * @throws If something goes wrong while modifying the session. {@link ModifyExplicitSessionError} * * @returns A promise that resolves when the session permissions are updated. * - * @see {@link https://docs.sequence.xyz/sdk/typescript/v3/dapp-client/modify-explicit-session} for more detailed documentation. - * * @example * const dappClient = new DappClient('http://localhost:5173'); * await dappClient.initialize(); * * if (dappClient.isInitialized) { - * // The address of an existing explicit session (Grants the Dapp permission to transfer 100 USDC for the user) - * const sessionAddress = '0x...'; - * // We create a new permission object where we can increase the granted transfer amount limit - * const permissions: Signers.Session.ExplicitParams = { - * chainId: Number(chainId), - * valueLimit: 0n, - * deadline: BigInt(Date.now() + 1000 * 60 * 5000), - * permissions: [Utils.ERC20PermissionBuilder.buildTransfer(USDC_ADDRESS, amount)] - * }; - * await dappClient.modifyExplicitSession(1, sessionAddress, permissions); + * // Increase the deadline of the current session by 24 hours + * const currentExplicitSession = {...} + * const newExplicitSession = {...currentExplicitSession, deadline: currentExplicitSession.deadline + 24 * 60 * 60} + * await dappClient.modifyExplicitSession(newExplicitSession); * } */ - async modifyExplicitSession( - chainId: number, - sessionAddress: Address.Address, - permissions: Signers.Session.ExplicitParams, - ): Promise { + async modifyExplicitSession(explicitSession: ExplicitSession): Promise { if (!this.isInitialized || !this.walletAddress) throw new InitializationError('Cannot modify an explicit session without an existing wallet.') - const chainSessionManager = this.getChainSessionManager(chainId) + const chainSessionManager = this.getChainSessionManager(explicitSession.chainId) if (!chainSessionManager.isInitialized) { chainSessionManager.initializeWithWallet(this.walletAddress) } - await chainSessionManager.modifyExplicitSession(sessionAddress, permissions) + await chainSessionManager.modifyExplicitSession(explicitSession) if (this.transport.mode === TransportMode.POPUP) { await this._loadStateFromStorage() @@ -515,8 +532,6 @@ export class DappClient { * * @returns A promise that resolves with the fee options. {@link Relayer.FeeOption[]} * - * @see {@link https://docs.sequence.xyz/sdk/typescript/v3/dapp-client/get-fee-options} for more detailed documentation. - * * @example * const dappClient = new DappClient('http://localhost:5173'); * await dappClient.initialize(); @@ -567,8 +582,6 @@ export class DappClient { * * @returns A promise that resolves with the transaction hash. * - * @see {@link https://docs.sequence.xyz/sdk/typescript/v3/dapp-client/send-transaction} for more detailed documentation. - * * @example * const dappClient = new DappClient('http://localhost:5173'); * await dappClient.initialize(); @@ -599,8 +612,6 @@ export class DappClient { * * @returns A promise that resolves when the signing process is initiated. The signature is delivered via the `walletActionResponse` event listener. * - * @see {@link https://docs.sequence.xyz/sdk/typescript/v3/dapp-client/sign-message} for more detailed documentation. - * * @example * const dappClient = new DappClient('http://localhost:5173'); * await dappClient.initialize(); @@ -633,8 +644,6 @@ export class DappClient { * * @returns A promise that resolves when the signing process is initiated. The signature is returned in the `walletActionResponse` event listener. * - * @see {@link https://docs.sequence.xyz/sdk/typescript/v3/dapp-client/sign-typed-data} for more detailed documentation. - * * @example * const dappClient = new DappClient('http://localhost:5173'); * await dappClient.initialize(); @@ -688,8 +697,6 @@ export class DappClient { * @remarks This action does not revoke the sessions on-chain. Sessions remain active until they expire or are manually revoked by the user in their wallet. * @returns A promise that resolves when disconnection is complete. * - * @see {@link https://docs.sequence.xyz/sdk/typescript/v3/dapp-client/disconnect} for more detailed documentation. - * * @example * const dappClient = new DappClient('http://localhost:5173'); * await dappClient.initialize(); @@ -793,7 +800,7 @@ export class DappClient { this.chainSessionManagers.set(chainId, chainSessionManager) chainSessionManager.on('explicitSessionResponse', (data) => { - this.emit('explicitSessionResponse', { ...data, chainId }) + this.emit('explicitSessionResponse', { ...data }) }) } return chainSessionManager diff --git a/packages/wallet/dapp-client/src/index.ts b/packages/wallet/dapp-client/src/index.ts index c920a0ac5b..3770dd8808 100644 --- a/packages/wallet/dapp-client/src/index.ts +++ b/packages/wallet/dapp-client/src/index.ts @@ -4,24 +4,21 @@ export type { LoginMethod, GuardConfig, Transaction, - SignatureSuccessResponse, - ChainSessionManagerEvent, + SignatureResponse, SequenceSessionStorage, RandomPrivateKeyFn, - Session, SignMessagePayload, + SessionResponse, AddExplicitSessionPayload, - AddExplicitSessionSuccessResponsePayload, CreateNewSessionPayload, + CreateNewSessionResponse, SignTypedDataPayload, - ConnectSuccessResponsePayload, - ModifySessionSuccessResponsePayload, - ModifySessionPayload, + ModifyExplicitSessionPayload, DappClientWalletActionEventListener, DappClientExplicitSessionEventListener, TransactionRequest, SendWalletTransactionPayload, - SendWalletTransactionSuccessResponse, + SendWalletTransactionResponse, WalletActionResponse, } from './types/index.js' export { RequestActionType, TransportMode } from './types/index.js' @@ -44,5 +41,6 @@ export type { } from './utils/storage.js' export { WebStorage } from './utils/storage.js' -export { Permission, Extensions, SessionConfig } from '@0xsequence/wallet-primitives' -export { Signers, Wallet, Utils, Relayer } from '@0xsequence/wallet-core' +export { Attestation, Permission, Extensions, SessionConfig, Constants, Payload } from '@0xsequence/wallet-primitives' +export type { ExplicitSessionConfig, ExplicitSession, ImplicitSession, Session } from '@0xsequence/wallet-core' +export { Signers, Wallet, Utils, Relayer, Envelope, State } from '@0xsequence/wallet-core' diff --git a/packages/wallet/dapp-client/src/types/index.ts b/packages/wallet/dapp-client/src/types/index.ts index ad251cab49..a488c98b78 100644 --- a/packages/wallet/dapp-client/src/types/index.ts +++ b/packages/wallet/dapp-client/src/types/index.ts @@ -1,6 +1,6 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ +import { ExplicitSession } from '@0xsequence/wallet-core' import { Attestation, Payload } from '@0xsequence/wallet-primitives' -import { Signers } from '@0xsequence/wallet-core' import { Address, Hex } from 'ox' import type { TypedData } from 'ox/TypedData' @@ -25,25 +25,22 @@ export interface GuardConfig { // --- Payloads for Transport --- export interface CreateNewSessionPayload { - sessionAddress: Address.Address - origin: string - permissions?: Signers.Session.ExplicitParams + origin?: string + session?: ExplicitSession includeImplicitSession?: boolean preferredLoginMethod?: LoginMethod email?: string } export interface AddExplicitSessionPayload { - sessionAddress: Address.Address - permissions: Signers.Session.ExplicitParams + session: ExplicitSession preferredLoginMethod?: LoginMethod email?: string } -export interface ModifySessionPayload { +export interface ModifyExplicitSessionPayload { walletAddress: Address.Address - sessionAddress: Address.Address - permissions: Signers.Session.ExplicitParams + session: ExplicitSession } export interface SignMessagePayload { @@ -58,6 +55,12 @@ export interface SignTypedDataPayload { chainId: number } +export interface SendWalletTransactionPayload { + address: Address.Address + transactionRequest: TransactionRequest + chainId: number +} + export type TransactionRequest = { to: Address.Address value?: bigint @@ -65,13 +68,7 @@ export type TransactionRequest = { gasLimit?: bigint } -export interface SendWalletTransactionPayload { - address: Address.Address - transactionRequest: TransactionRequest - chainId: number -} - -export interface ConnectSuccessResponsePayload { +export interface CreateNewSessionResponse { walletAddress: string attestation?: Attestation.Attestation signature?: Hex.Hex @@ -80,28 +77,23 @@ export interface ConnectSuccessResponsePayload { guard?: GuardConfig } -export interface AddExplicitSessionSuccessResponsePayload { +export interface SignatureResponse { + signature: Hex.Hex walletAddress: string - sessionAddress: string } -export interface ModifySessionSuccessResponsePayload { +export interface SendWalletTransactionResponse { + transactionHash: Hex.Hex walletAddress: string - sessionAddress: string } -export interface SignatureSuccessResponse { - signature: Hex.Hex - walletAddress: string -} +export type WalletActionResponse = SignatureResponse | SendWalletTransactionResponse -export interface SendWalletTransactionSuccessResponse { - transactionHash: Hex.Hex +export interface SessionResponse { walletAddress: string + sessionAddress: string } -export type WalletActionResponse = SignatureSuccessResponse | SendWalletTransactionSuccessResponse - // --- Dapp-facing Types --- export type RandomPrivateKeyFn = () => Hex.Hex | Promise @@ -114,20 +106,11 @@ export type Transaction = // All other properties from Payload.Call, but optional Partial> -export type Session = { - address: Address.Address - isImplicit: boolean - permissions?: Signers.Session.ExplicitParams - chainId?: number -} - // --- Event Types --- -export type ChainSessionManagerEvent = 'sessionsUpdated' | 'explicitSessionResponse' - export type ExplicitSessionEventListener = (data: { action: (typeof RequestActionType)['ADD_EXPLICIT_SESSION' | 'MODIFY_EXPLICIT_SESSION'] - response?: AddExplicitSessionSuccessResponsePayload | ModifySessionSuccessResponsePayload + response?: SessionResponse error?: any }) => void @@ -141,12 +124,9 @@ export type DappClientWalletActionEventListener = (data: { chainId: number }) => void -export type DappClientExplicitSessionEventListener = (data: { - action: (typeof RequestActionType)['ADD_EXPLICIT_SESSION' | 'MODIFY_EXPLICIT_SESSION'] - response?: AddExplicitSessionSuccessResponsePayload | ModifySessionSuccessResponsePayload - error?: any +export type DappClientExplicitSessionEventListener = ExplicitSessionEventListener & { chainId: number -}) => void +} // --- DappTransport Types --- @@ -182,24 +162,6 @@ export interface TransportMessage { error?: any } -export interface BaseRequest { - type: string -} - -export interface MessageSignatureRequest extends BaseRequest { - type: 'message_signature' - message: string - address: Address.Address - chainId: number -} - -export interface TypedDataSignatureRequest extends BaseRequest { - type: 'typed_data_signature' - typedData: unknown - address: Address.Address - chainId: number -} - export const WalletSize = { width: 380, height: 600, @@ -211,7 +173,6 @@ export interface PendingRequest { timer: number action: string } - export interface SendRequestOptions { timeout?: number path?: string diff --git a/packages/wallet/dapp-client/src/utils/storage.ts b/packages/wallet/dapp-client/src/utils/storage.ts index a554f86fe6..c65bc0ffce 100644 --- a/packages/wallet/dapp-client/src/utils/storage.ts +++ b/packages/wallet/dapp-client/src/utils/storage.ts @@ -1,17 +1,18 @@ -import { Attestation } from '@0xsequence/wallet-primitives' import { Address, Hex } from 'ox' import { jsonReplacers, jsonRevivers } from './index.js' import { - AddExplicitSessionPayload, - CreateNewSessionPayload, - ModifySessionPayload, LoginMethod, SignMessagePayload, SignTypedDataPayload, GuardConfig, SendWalletTransactionPayload, + ModifyExplicitSessionPayload, + CreateNewSessionPayload, + AddExplicitSessionPayload, } from '../types/index.js' +import { Attestation } from '../index.js' + export interface ExplicitSessionData { pk: Hex.Hex walletAddress: Address.Address @@ -35,7 +36,7 @@ export interface ImplicitSessionData { export type PendingPayload = | CreateNewSessionPayload | AddExplicitSessionPayload - | ModifySessionPayload + | ModifyExplicitSessionPayload | SignMessagePayload | SignTypedDataPayload | SendWalletTransactionPayload diff --git a/packages/wallet/primitives/src/permission.ts b/packages/wallet/primitives/src/permission.ts index 773a176e59..c2909696d8 100644 --- a/packages/wallet/primitives/src/permission.ts +++ b/packages/wallet/primitives/src/permission.ts @@ -25,7 +25,7 @@ export type SessionPermissions = { chainId: number valueLimit: bigint deadline: bigint // uint64 - permissions: [Permission, ...Permission[]] + permissions: Permission[] } export const MAX_PERMISSIONS_COUNT = 2 ** 7 - 1 @@ -127,7 +127,7 @@ export function decodeSessionPermissions(bytes: Bytes.Bytes): SessionPermissions chainId, valueLimit, deadline, - permissions: permissions as [Permission, ...Permission[]], + permissions: permissions, } } diff --git a/packages/wallet/wdk/src/sequence/sessions.ts b/packages/wallet/wdk/src/sequence/sessions.ts index a115005598..bd6a15e38a 100644 --- a/packages/wallet/wdk/src/sequence/sessions.ts +++ b/packages/wallet/wdk/src/sequence/sessions.ts @@ -1,4 +1,4 @@ -import { Signers as CoreSigners, Envelope } from '@0xsequence/wallet-core' +import { Envelope, type ExplicitSession } from '@0xsequence/wallet-core' import { Attestation, Config, @@ -13,13 +13,7 @@ import { AuthCodePkceHandler } from './handlers/authcode-pkce.js' import { IdentityHandler, identityTypeToHex } from './handlers/identity.js' import { ManagerOptionsDefaults, Shared } from './manager.js' import { Actions } from './types/signature-request.js' -import { Kinds, Module } from './types/index.js' -import { Handler } from './handlers/index.js' - -export type AuthorizeImplicitSessionArgs = { - target: string - applicationData?: Hex.Hex -} +import { AuthorizeImplicitSessionArgs } from './types/sessions.js' export interface SessionsInterface { /** @@ -92,16 +86,11 @@ export interface SessionsInterface { * completed using the `complete` method. * * @param walletAddress The address of the wallet to modify. - * @param sessionAddress The address of the key to be added as a session signer. * @param permissions The set of rules and limits that will govern this session key's capabilities. * @returns A promise that resolves to a `requestId` for the configuration update signature request. * @see {complete} to finalize the update after it has been signed. */ - addExplicitSession( - walletAddress: Address.Address, - sessionAddress: Address.Address, - permissions: CoreSigners.Session.ExplicitParams, - ): Promise + addExplicitSession(walletAddress: Address.Address, explicitSession: ExplicitSession): Promise /** * Initiates an on-chain configuration update to modify an existing "explicit session". @@ -113,7 +102,6 @@ export interface SessionsInterface { * Like adding a session, this requires a signed configuration update. * * @param walletAddress The address of the wallet to modify. - * @param sessionAddress The address of the session signer to modify. * @param permissions The new, complete set of rules and limits for this session key. * @param origin Optional string to identify the source of the request. * @returns A promise that resolves to a `requestId` for the configuration update. @@ -121,8 +109,7 @@ export interface SessionsInterface { */ modifyExplicitSession( walletAddress: Address.Address, - sessionAddress: Address.Address, - permissions: CoreSigners.Session.ExplicitParams, + explicitSession: ExplicitSession, origin?: string, ): Promise @@ -187,24 +174,17 @@ export class Sessions implements SessionsInterface { constructor(private readonly shared: Shared) {} async getTopology(walletAddress: Address.Address, fixMissing = false): Promise { - const { loginTopology, devicesTopology, modules } = - await this.shared.modules.wallets.getConfigurationParts(walletAddress) + const { loginTopology, modules } = await this.shared.modules.wallets.getConfigurationParts(walletAddress) const managerModule = modules.find((m) => Address.isEqual(m.sapientLeaf.address, this.shared.sequence.extensions.sessions), ) if (!managerModule) { if (fixMissing) { // Create the default session manager leaf - const authorizedSigners = [...Config.topologyToFlatLeaves([devicesTopology, loginTopology])].filter( - Config.isSignerLeaf, - ) - if (authorizedSigners.length === 0) { - throw new Error('No signer leaves found') - } - let sessionsTopology = SessionConfig.emptySessionsTopology(authorizedSigners[0]!.address) - for (let i = 1; i < authorizedSigners.length; i++) { - sessionsTopology = SessionConfig.addIdentitySigner(sessionsTopology, authorizedSigners[i]!.address) + if (!Config.isSignerLeaf(loginTopology) && !Config.isSapientSignerLeaf(loginTopology)) { + throw new Error('Login topology is not a signer leaf') } + const sessionsTopology = SessionConfig.emptySessionsTopology(loginTopology.address) const sessionsConfigTree = SessionConfig.sessionsTopologyToConfigurationTree(sessionsTopology) this.shared.sequence.stateProvider.saveTree(sessionsConfigTree) const imageHash = GenericTree.hash(sessionsConfigTree) @@ -229,133 +209,23 @@ export class Sessions implements SessionsInterface { return SessionConfig.configurationTreeToSessionsTopology(tree) } - private async updateSessionModule( - modules: Module[], - transformer: (topology: SessionConfig.SessionsTopology) => SessionConfig.SessionsTopology, - ) { - const ext = this.shared.sequence.extensions.sessions - const idx = modules.findIndex((m) => Address.isEqual(m.sapientLeaf.address, ext)) - if (idx === -1) { - return - } - - const sessionModule = modules[idx] - if (!sessionModule) { - throw new Error('session-module-not-found') - } - - const genericTree = await this.shared.sequence.stateProvider.getTree(sessionModule.sapientLeaf.imageHash) - if (!genericTree) { - throw new Error('session-module-tree-not-found') - } - - const topology = SessionConfig.configurationTreeToSessionsTopology(genericTree) - const nextTopology = transformer(topology) - const nextTree = SessionConfig.sessionsTopologyToConfigurationTree(nextTopology) - await this.shared.sequence.stateProvider.saveTree(nextTree) - if (!modules[idx]) { - throw new Error('session-module-not-found-(unreachable)') - } - - modules[idx].sapientLeaf.imageHash = GenericTree.hash(nextTree) - } - - hasSessionModule(modules: Module[]): boolean { - return modules.some((m) => Address.isEqual(m.sapientLeaf.address, this.shared.sequence.extensions.sessions)) - } - - async initSessionModule(modules: Module[], identitySigners: Address.Address[], guardTopology?: Config.NestedLeaf) { - if (this.hasSessionModule(modules)) { - throw new Error('session-module-already-initialized') - } - - if (identitySigners.length === 0) { - throw new Error('No identity signers provided') - } - - // Calculate image hash with the identity signers - const sessionsTopology = SessionConfig.emptySessionsTopology( - identitySigners as [Address.Address, ...Address.Address[]], - ) - // Store this tree in the state provider - const sessionsConfigTree = SessionConfig.sessionsTopologyToConfigurationTree(sessionsTopology) - this.shared.sequence.stateProvider.saveTree(sessionsConfigTree) - // Prepare the configuration leaf - const sessionsImageHash = GenericTree.hash(sessionsConfigTree) - const signer = { - ...ManagerOptionsDefaults.defaultSessionsTopology, - address: this.shared.sequence.extensions.sessions, - imageHash: sessionsImageHash, - } - modules.push({ - sapientLeaf: signer, - weight: 255n, - guardLeaf: guardTopology, - }) - } - - async addIdentitySignerToModules(modules: Module[], address: Address.Address) { - if (!this.hasSessionModule(modules)) { - throw new Error('session-module-not-enabled') - } - - await this.updateSessionModule(modules, (topology) => { - const existingSigners = SessionConfig.getIdentitySigners(topology) - if (existingSigners?.some((s) => Address.isEqual(s, address))) { - return topology - } - - return SessionConfig.addIdentitySigner(topology, address) - }) - } - - async removeIdentitySignerFromModules(modules: Module[], address: Address.Address) { - if (!this.hasSessionModule(modules)) { - throw new Error('session-module-not-enabled') - } - - await this.updateSessionModule(modules, (topology) => { - const newTopology = SessionConfig.removeIdentitySigner(topology, address) - if (!newTopology) { - // Can't remove the last identity signer - throw new Error('Cannot remove the last identity signer') - } - return newTopology - }) - } - async prepareAuthorizeImplicitSession( walletAddress: Address.Address, sessionAddress: Address.Address, args: AuthorizeImplicitSessionArgs, ): Promise { const topology = await this.getTopology(walletAddress) - const identitySigners = SessionConfig.getIdentitySigners(topology) - if (identitySigners.length === 0) { - throw new Error('No identity signers found') + const identitySignerAddress = SessionConfig.getIdentitySigner(topology) + if (!identitySignerAddress) { + throw new Error('No identity signer address found') } - let handler: Handler | undefined - let identitySignerAddress: Address.Address | undefined - for (const identitySigner of identitySigners) { - const identityKind = await this.shared.modules.signers.kindOf(walletAddress, identitySigner) - if (!identityKind) { - console.warn('No identity handler kind found for', identitySigner) - continue - } - if (identityKind === Kinds.LoginPasskey) { - console.warn('Implicit sessions do not support passkeys', identitySigner) - continue - } - const iHandler = this.shared.handlers.get(identityKind) - if (iHandler) { - handler = iHandler - identitySignerAddress = identitySigner - break - } + const identityKind = await this.shared.modules.signers.kindOf(walletAddress, identitySignerAddress) + if (!identityKind) { + throw new Error('No identity handler kind found') } - - if (!handler || !identitySignerAddress) { - throw new Error('No identity handler or address found') + const handler = this.shared.handlers.get(identityKind) + if (!handler) { + throw new Error('No identity handler found') } // Create the attestation to sign @@ -444,33 +314,31 @@ export class Sessions implements SessionsInterface { async addExplicitSession( walletAddress: Address.Address, - sessionAddress: Address.Address, - permissions: CoreSigners.Session.ExplicitParams, + explicitSession: ExplicitSession, origin?: string, ): Promise { const topology = await this.getTopology(walletAddress, true) const newTopology = SessionConfig.addExplicitSession(topology, { - ...permissions, - signer: sessionAddress, + ...explicitSession, + signer: explicitSession.sessionAddress, }) return this.prepareSessionUpdate(walletAddress, newTopology, origin) } async modifyExplicitSession( walletAddress: Address.Address, - sessionAddress: Address.Address, - permissions: CoreSigners.Session.ExplicitParams, + explicitSession: ExplicitSession, origin?: string, ): Promise { // This will add the session manager if it's missing const topology = await this.getTopology(walletAddress, true) - const intermediateTopology = SessionConfig.removeExplicitSession(topology, sessionAddress) + const intermediateTopology = SessionConfig.removeExplicitSession(topology, explicitSession.sessionAddress) if (!intermediateTopology) { throw new Error('Incomplete session topology') } const newTopology = SessionConfig.addExplicitSession(intermediateTopology, { - ...permissions, - signer: sessionAddress, + ...explicitSession, + signer: explicitSession.sessionAddress, }) return this.prepareSessionUpdate(walletAddress, newTopology, origin) } diff --git a/packages/wallet/wdk/src/sequence/types/sessions.ts b/packages/wallet/wdk/src/sequence/types/sessions.ts new file mode 100644 index 0000000000..1efef2490a --- /dev/null +++ b/packages/wallet/wdk/src/sequence/types/sessions.ts @@ -0,0 +1,6 @@ +import { Hex } from 'ox' + +export type AuthorizeImplicitSessionArgs = { + target: string + applicationData?: Hex.Hex +} diff --git a/packages/wallet/wdk/test/sessions.test.ts b/packages/wallet/wdk/test/sessions.test.ts index bd1500e5d3..f6d8a144b0 100644 --- a/packages/wallet/wdk/test/sessions.test.ts +++ b/packages/wallet/wdk/test/sessions.test.ts @@ -4,6 +4,7 @@ import { Signers as CoreSigners, Wallet as CoreWallet, Envelope, Relayer, State import { Attestation, Constants, Extensions, Network, Payload, Permission } from '../../primitives/src/index.js' import { Sequence } from '../src/index.js' import { CAN_RUN_LIVE, EMITTER_ABI, EMITTER_ADDRESS, PRIVATE_KEY, RPC_URL } from './constants' +import { ExplicitSession } from '../src/sequence/types/sessions.js' describe('Sessions (via Manager)', () => { // Shared components @@ -24,16 +25,12 @@ describe('Sessions (via Manager)', () => { sessionManager: CoreSigners.SessionManager } - const setupExplicitSession = async ( - sessionAddress: Address.Address, - permissions: Permission.SessionPermissions, - isModify = false, - ) => { + const setupExplicitSession = async (explicitSession: ExplicitSession, isModify = false) => { let requestId: string if (isModify) { - requestId = await wdk.manager.sessions.modifyExplicitSession(dapp.wallet.address, sessionAddress, permissions) + requestId = await wdk.manager.sessions.modifyExplicitSession(dapp.wallet.address, explicitSession) } else { - requestId = await wdk.manager.sessions.addExplicitSession(dapp.wallet.address, sessionAddress, permissions) + requestId = await wdk.manager.sessions.addExplicitSession(dapp.wallet.address, explicitSession) } // Sign and complete the request @@ -225,8 +222,8 @@ describe('Sessions (via Manager)', () => { if (!s) { throw new Error('Failed to create pk store') } - const permission: Permission.SessionPermissions = { - signer: e.address, + const explicitSession: ExplicitSession = { + sessionAddress: e.address, chainId, valueLimit: 0n, deadline: BigInt(Math.floor(Date.now() / 1000) + 3600), // 1 hour from now @@ -237,11 +234,11 @@ describe('Sessions (via Manager)', () => { }, ], } - const explicitSigner = new CoreSigners.Session.Explicit(s, permission) + const explicitSigner = new CoreSigners.Session.Explicit(s, explicitSession) // Add to manager dapp.sessionManager = dapp.sessionManager.withExplicitSigner(explicitSigner) - await setupExplicitSession(explicitSigner.address, permission) + await setupExplicitSession(explicitSession) // Create a call payload const call: Payload.Call = { @@ -290,8 +287,8 @@ describe('Sessions (via Manager)', () => { if (!s) { throw new Error('Failed to create pk store') } - const permission: Permission.SessionPermissions = { - signer: e.address, + const explicitSession: ExplicitSession = { + sessionAddress: e.address, chainId, valueLimit: 0n, deadline: BigInt(Math.floor(Date.now() / 1000) + 3600), // 1 hour from now @@ -311,11 +308,11 @@ describe('Sessions (via Manager)', () => { }, ], } - const explicitSigner = new CoreSigners.Session.Explicit(s, permission) + const explicitSigner = new CoreSigners.Session.Explicit(s, explicitSession) // Add to manager dapp.sessionManager = dapp.sessionManager.withExplicitSigner(explicitSigner) - await setupExplicitSession(explicitSigner.address, permission) + await setupExplicitSession(explicitSession) // Create a call payload const call: Payload.Call = { @@ -365,8 +362,8 @@ describe('Sessions (via Manager)', () => { throw new Error('Failed to create pk store') } // Create the initial permissions - let permission: Permission.SessionPermissions = { - signer: e.address, + let explicitSession: ExplicitSession = { + sessionAddress: e.address, chainId, valueLimit: 0n, deadline: BigInt(Math.floor(Date.now() / 1000) + 3600), // 1 hour from now @@ -386,11 +383,11 @@ describe('Sessions (via Manager)', () => { }, ], } - const explicitSigner = new CoreSigners.Session.Explicit(s, permission) + const explicitSigner = new CoreSigners.Session.Explicit(s, explicitSession) // Add to manager dapp.sessionManager = dapp.sessionManager.withExplicitSigner(explicitSigner) - await setupExplicitSession(explicitSigner.address, permission) + await setupExplicitSession(explicitSession) // Create a call payload const call: Payload.Call = { @@ -429,9 +426,9 @@ describe('Sessions (via Manager)', () => { // Now we modify the permissions target contract to zero address // This should cause any session call to the EMITTER_ADDRESS contract to fail - permission.permissions[0].target = '0x0000000000000000000000000000000000000000' + explicitSession.permissions[0].target = '0x0000000000000000000000000000000000000000' - await setupExplicitSession(explicitSigner.address, permission, true) + await setupExplicitSession(explicitSession, true) // Sign and send the transaction // Should fail with 'No signer supported for call' diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 450d5be82a..f06089e93f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,10 +10,10 @@ importers: devDependencies: '@changesets/cli': specifier: ^2.29.4 - version: 2.29.5 + version: 2.29.7(@types/node@22.18.6) lefthook: specifier: ^1.11.13 - version: 1.12.2 + version: 1.13.3 prettier: specifier: ^3.5.3 version: 3.6.2 @@ -22,7 +22,7 @@ importers: version: 6.0.1 turbo: specifier: ^2.5.4 - version: 2.5.5 + version: 2.5.6 typescript: specifier: 5.8.3 version: 5.8.3 @@ -33,14 +33,14 @@ importers: specifier: workspace:* version: link:../../repo/ui next: - specifier: ^15.4.7 - version: 15.4.7(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + specifier: ^15.3.3 + version: 15.5.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: specifier: ^19.1.0 - version: 19.1.0 + version: 19.1.1 react-dom: specifier: ^19.1.0 - version: 19.1.0(react@19.1.0) + version: 19.1.1(react@19.1.1) devDependencies: '@repo/eslint-config': specifier: workspace:* @@ -50,7 +50,7 @@ importers: version: link:../../repo/typescript-config '@types/node': specifier: ^20.17.57 - version: 20.19.9 + version: 20.19.17 '@types/react': specifier: 18.3.1 version: 18.3.1 @@ -67,14 +67,14 @@ importers: specifier: workspace:* version: link:../../repo/ui next: - specifier: ^15.4.7 - version: 15.4.7(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + specifier: ^15.3.3 + version: 15.5.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: specifier: ^19.1.0 - version: 19.1.0 + version: 19.1.1 react-dom: specifier: ^19.1.0 - version: 19.1.0(react@19.1.0) + version: 19.1.1(react@19.1.1) devDependencies: '@repo/eslint-config': specifier: workspace:* @@ -84,7 +84,7 @@ importers: version: link:../../repo/typescript-config '@types/node': specifier: ^20.17.57 - version: 20.19.9 + version: 20.19.17 '@types/react': specifier: 18.3.1 version: 18.3.1 @@ -102,7 +102,7 @@ importers: version: link:../../../repo/typescript-config '@types/node': specifier: ^22.15.29 - version: 22.16.5 + version: 22.18.6 typescript: specifier: ^5.8.3 version: 5.8.3 @@ -114,7 +114,7 @@ importers: version: link:../../../repo/typescript-config '@types/node': specifier: ^22.15.29 - version: 22.16.5 + version: 22.18.6 typescript: specifier: ^5.8.3 version: 5.8.3 @@ -130,13 +130,13 @@ importers: version: link:../../../repo/typescript-config '@types/node': specifier: ^22.15.29 - version: 22.16.5 + version: 22.18.6 typescript: specifier: ^5.8.3 version: 5.8.3 vitest: specifier: ^3.2.1 - version: 3.2.4(@types/node@22.16.5)(happy-dom@20.0.2) + version: 3.2.4(@types/node@22.18.6)(happy-dom@17.6.3) packages/services/identity-instrument: dependencies: @@ -155,13 +155,13 @@ importers: version: link:../../../repo/typescript-config '@types/node': specifier: ^22.15.29 - version: 22.16.5 + version: 22.18.6 typescript: specifier: ^5.8.3 version: 5.8.3 vitest: specifier: ^3.2.1 - version: 3.2.4(@types/node@22.16.5)(happy-dom@20.0.2) + version: 3.2.4(@types/node@22.18.6)(happy-dom@17.6.3) packages/services/indexer: devDependencies: @@ -170,7 +170,7 @@ importers: version: link:../../../repo/typescript-config '@types/node': specifier: ^22.15.29 - version: 22.16.5 + version: 22.18.6 typescript: specifier: ^5.8.3 version: 5.8.3 @@ -182,7 +182,7 @@ importers: version: link:../../../repo/typescript-config '@types/node': specifier: ^22.15.29 - version: 22.16.5 + version: 22.18.6 typescript: specifier: ^5.8.3 version: 5.8.3 @@ -194,7 +194,7 @@ importers: version: link:../../../repo/typescript-config '@types/node': specifier: ^22.15.29 - version: 22.16.5 + version: 22.18.6 typescript: specifier: ^5.8.3 version: 5.8.3 @@ -206,7 +206,7 @@ importers: version: link:../../../repo/typescript-config '@types/node': specifier: ^22.15.29 - version: 22.16.5 + version: 22.18.6 typescript: specifier: ^5.8.3 version: 5.8.3 @@ -218,7 +218,7 @@ importers: version: link:../../../repo/typescript-config '@types/node': specifier: ^22.15.29 - version: 22.16.5 + version: 22.18.6 typescript: specifier: ^5.8.3 version: 5.8.3 @@ -242,29 +242,29 @@ importers: version: 0.7.2(typescript@5.8.3) viem: specifier: ^2.30.6 - version: 2.33.0(typescript@5.8.3) + version: 2.37.8(typescript@5.8.3) devDependencies: '@repo/typescript-config': specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': specifier: ^22.15.29 - version: 22.16.5 + version: 22.18.6 '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@22.16.5)(happy-dom@20.0.2)) + version: 3.2.4(vitest@3.2.4(@types/node@22.18.6)(happy-dom@17.6.3)) dotenv: specifier: ^16.5.0 version: 16.6.1 fake-indexeddb: specifier: ^6.0.1 - version: 6.0.1 + version: 6.2.2 typescript: specifier: ^5.8.3 version: 5.8.3 vitest: specifier: ^3.2.1 - version: 3.2.4(@types/node@22.16.5)(happy-dom@20.0.2) + version: 3.2.4(@types/node@22.18.6)(happy-dom@17.6.3) packages/wallet/dapp-client: dependencies: @@ -286,25 +286,25 @@ importers: version: link:../../../repo/typescript-config '@types/node': specifier: ^22.15.29 - version: 22.16.5 + version: 22.18.6 '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@22.16.5)(happy-dom@20.0.2)) + version: 3.2.4(vitest@3.2.4(@types/node@22.18.6)(happy-dom@17.6.3)) dotenv: specifier: ^16.5.0 version: 16.6.1 fake-indexeddb: specifier: ^6.0.1 - version: 6.0.1 + version: 6.2.2 happy-dom: - specifier: ^20.0.2 - version: 20.0.2 + specifier: ^17.2.2 + version: 17.6.3 typescript: specifier: ^5.8.3 version: 5.8.3 vitest: specifier: ^3.2.1 - version: 3.2.4(@types/node@22.16.5)(happy-dom@20.0.2) + version: 3.2.4(@types/node@22.18.6)(happy-dom@17.6.3) packages/wallet/primitives: dependencies: @@ -317,13 +317,13 @@ importers: version: link:../../../repo/typescript-config '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@22.16.5)(happy-dom@20.0.2)) + version: 3.2.4(vitest@3.2.4(@types/node@22.18.6)(happy-dom@17.6.3)) typescript: specifier: ^5.8.3 version: 5.8.3 vitest: specifier: ^3.2.1 - version: 3.2.4(@types/node@22.16.5)(happy-dom@20.0.2) + version: 3.2.4(@types/node@22.18.6)(happy-dom@17.6.3) packages/wallet/primitives-cli: dependencies: @@ -345,7 +345,7 @@ importers: version: link:../../../repo/typescript-config '@types/node': specifier: ^22.15.29 - version: 22.16.5 + version: 22.18.6 '@types/yargs': specifier: ^17.0.33 version: 17.0.33 @@ -354,7 +354,7 @@ importers: version: 8.2.2 esbuild: specifier: ^0.25.5 - version: 0.25.8 + version: 0.25.10 nodemon: specifier: ^3.1.10 version: 3.1.10 @@ -397,52 +397,52 @@ importers: version: link:../../../repo/typescript-config '@types/node': specifier: ^22.15.29 - version: 22.16.5 + version: 22.18.6 '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@22.16.5)(happy-dom@20.0.2)) + version: 3.2.4(vitest@3.2.4(@types/node@22.18.6)(happy-dom@17.6.3)) dotenv: specifier: ^16.5.0 version: 16.6.1 fake-indexeddb: specifier: ^6.0.1 - version: 6.0.1 + version: 6.2.2 happy-dom: - specifier: ^20.0.2 - version: 20.0.2 + specifier: ^17.2.2 + version: 17.6.3 typescript: specifier: ^5.8.3 version: 5.8.3 vitest: specifier: ^3.2.1 - version: 3.2.4(@types/node@22.16.5)(happy-dom@20.0.2) + version: 3.2.4(@types/node@22.18.6)(happy-dom@17.6.3) repo/eslint-config: devDependencies: '@eslint/js': specifier: ^9.28.0 - version: 9.31.0 + version: 9.36.0 '@next/eslint-plugin-next': specifier: ^15.3.3 - version: 15.4.2 + version: 15.5.3 eslint: specifier: ^9.28.0 - version: 9.31.0 + version: 9.36.0 eslint-config-prettier: specifier: ^9.1.0 - version: 9.1.2(eslint@9.31.0) + version: 9.1.2(eslint@9.36.0) eslint-plugin-only-warn: specifier: ^1.1.0 version: 1.1.0 eslint-plugin-react: specifier: ^7.37.5 - version: 7.37.5(eslint@9.31.0) + version: 7.37.5(eslint@9.36.0) eslint-plugin-react-hooks: specifier: ^5.2.0 - version: 5.2.0(eslint@9.31.0) + version: 5.2.0(eslint@9.36.0) eslint-plugin-turbo: specifier: ^2.5.4 - version: 2.5.5(eslint@9.31.0)(turbo@2.5.5) + version: 2.5.6(eslint@9.36.0)(turbo@2.5.6) globals: specifier: ^15.15.0 version: 15.15.0 @@ -451,7 +451,7 @@ importers: version: 5.8.3 typescript-eslint: specifier: ^8.33.1 - version: 8.38.0(eslint@9.31.0)(typescript@5.8.3) + version: 8.44.1(eslint@9.36.0)(typescript@5.8.3) repo/typescript-config: {} @@ -459,10 +459,10 @@ importers: dependencies: react: specifier: ^19.1.0 - version: 19.1.0 + version: 19.1.1 react-dom: specifier: ^19.1.0 - version: 19.1.0(react@19.1.0) + version: 19.1.1(react@19.1.1) devDependencies: '@repo/eslint-config': specifier: workspace:* @@ -472,10 +472,10 @@ importers: version: link:../typescript-config '@turbo/gen': specifier: ^1.13.4 - version: 1.13.4(@types/node@20.19.9)(typescript@5.5.4) + version: 1.13.4(@types/node@20.19.17)(typescript@5.5.4) '@types/node': specifier: ^20.17.57 - version: 20.19.9 + version: 20.19.17 '@types/react': specifier: 18.3.0 version: 18.3.0 @@ -491,8 +491,8 @@ packages: '@0xsequence/tee-verifier@0.1.2': resolution: {integrity: sha512-7sKr8/T4newknx6LAukjlRI3siGiGhBnZohz2Z3jX0zb0EBQdKUq0L//A7CPSckHFPxTg/QvQU2v8e9x9GfkDw==} - '@adraffy/ens-normalize@1.11.0': - resolution: {integrity: sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==} + '@adraffy/ens-normalize@1.11.1': + resolution: {integrity: sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==} '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} @@ -506,29 +506,29 @@ packages: resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} engines: {node: '>=6.9.0'} - '@babel/parser@7.28.0': - resolution: {integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==} + '@babel/parser@7.28.4': + resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/runtime-corejs3@7.28.0': - resolution: {integrity: sha512-nlIXnSqLcBij8K8TtkxbBJgfzfvi75V1pAKSM7dUXejGw12vJAqez74jZrHTsJ3Z+Aczc5Q/6JgNjKRMsVU44g==} + '@babel/runtime-corejs3@7.28.4': + resolution: {integrity: sha512-h7iEYiW4HebClDEhtvFObtPmIvrd1SSfpI9EhOeKk4CtIK/ngBWFpuhCzhdmRKtg71ylcue+9I6dv54XYO1epQ==} engines: {node: '>=6.9.0'} - '@babel/runtime@7.27.6': - resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} + '@babel/runtime@7.28.4': + resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} engines: {node: '>=6.9.0'} - '@babel/types@7.28.1': - resolution: {integrity: sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ==} + '@babel/types@7.28.4': + resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} engines: {node: '>=6.9.0'} '@bcoe/v8-coverage@1.0.2': resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} - '@changesets/apply-release-plan@7.0.12': - resolution: {integrity: sha512-EaET7As5CeuhTzvXTQCRZeBUcisoYPDDcXvgTE/2jmmypKp0RC7LxKj/yzqeh/1qFTZI7oDGFcL1PHRuQuketQ==} + '@changesets/apply-release-plan@7.0.13': + resolution: {integrity: sha512-BIW7bofD2yAWoE8H4V40FikC+1nNFEKBisMECccS16W1rt6qqhNTBDmIw5HaqmMgtLNz9e7oiALiEUuKrQ4oHg==} '@changesets/assemble-release-plan@6.0.9': resolution: {integrity: sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ==} @@ -536,8 +536,8 @@ packages: '@changesets/changelog-git@0.2.1': resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} - '@changesets/cli@2.29.5': - resolution: {integrity: sha512-0j0cPq3fgxt2dPdFsg4XvO+6L66RC0pZybT9F4dG5TBrLA3jA/1pNkdTXH9IBBVHkgsKrNKenI3n1mPyPlIydg==} + '@changesets/cli@2.29.7': + resolution: {integrity: sha512-R7RqWoaksyyKXbKXBTbT4REdy22yH81mcFK6sWtqSanxUCbUi9Uf+6aqxZtDQouIqPdem2W56CdxXgsxdq7FLQ==} hasBin: true '@changesets/config@3.1.1': @@ -589,164 +589,164 @@ packages: '@emnapi/runtime@1.5.0': resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} - '@esbuild/aix-ppc64@0.25.8': - resolution: {integrity: sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==} + '@esbuild/aix-ppc64@0.25.10': + resolution: {integrity: sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.8': - resolution: {integrity: sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==} + '@esbuild/android-arm64@0.25.10': + resolution: {integrity: sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.8': - resolution: {integrity: sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==} + '@esbuild/android-arm@0.25.10': + resolution: {integrity: sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.8': - resolution: {integrity: sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==} + '@esbuild/android-x64@0.25.10': + resolution: {integrity: sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.8': - resolution: {integrity: sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==} + '@esbuild/darwin-arm64@0.25.10': + resolution: {integrity: sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.8': - resolution: {integrity: sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==} + '@esbuild/darwin-x64@0.25.10': + resolution: {integrity: sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.8': - resolution: {integrity: sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==} + '@esbuild/freebsd-arm64@0.25.10': + resolution: {integrity: sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.8': - resolution: {integrity: sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==} + '@esbuild/freebsd-x64@0.25.10': + resolution: {integrity: sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.8': - resolution: {integrity: sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==} + '@esbuild/linux-arm64@0.25.10': + resolution: {integrity: sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.8': - resolution: {integrity: sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==} + '@esbuild/linux-arm@0.25.10': + resolution: {integrity: sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.8': - resolution: {integrity: sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==} + '@esbuild/linux-ia32@0.25.10': + resolution: {integrity: sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.8': - resolution: {integrity: sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==} + '@esbuild/linux-loong64@0.25.10': + resolution: {integrity: sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.8': - resolution: {integrity: sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==} + '@esbuild/linux-mips64el@0.25.10': + resolution: {integrity: sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.8': - resolution: {integrity: sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==} + '@esbuild/linux-ppc64@0.25.10': + resolution: {integrity: sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.8': - resolution: {integrity: sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==} + '@esbuild/linux-riscv64@0.25.10': + resolution: {integrity: sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.8': - resolution: {integrity: sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==} + '@esbuild/linux-s390x@0.25.10': + resolution: {integrity: sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.8': - resolution: {integrity: sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==} + '@esbuild/linux-x64@0.25.10': + resolution: {integrity: sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.8': - resolution: {integrity: sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==} + '@esbuild/netbsd-arm64@0.25.10': + resolution: {integrity: sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.8': - resolution: {integrity: sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==} + '@esbuild/netbsd-x64@0.25.10': + resolution: {integrity: sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.8': - resolution: {integrity: sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==} + '@esbuild/openbsd-arm64@0.25.10': + resolution: {integrity: sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.8': - resolution: {integrity: sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==} + '@esbuild/openbsd-x64@0.25.10': + resolution: {integrity: sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.25.8': - resolution: {integrity: sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==} + '@esbuild/openharmony-arm64@0.25.10': + resolution: {integrity: sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.25.8': - resolution: {integrity: sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==} + '@esbuild/sunos-x64@0.25.10': + resolution: {integrity: sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.8': - resolution: {integrity: sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==} + '@esbuild/win32-arm64@0.25.10': + resolution: {integrity: sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.8': - resolution: {integrity: sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==} + '@esbuild/win32-ia32@0.25.10': + resolution: {integrity: sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.8': - resolution: {integrity: sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==} + '@esbuild/win32-x64@0.25.10': + resolution: {integrity: sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.7.0': - resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} + '@eslint-community/eslint-utils@4.9.0': + resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 @@ -759,46 +759,42 @@ packages: resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/config-helpers@0.3.0': - resolution: {integrity: sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==} + '@eslint/config-helpers@0.3.1': + resolution: {integrity: sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.15.1': - resolution: {integrity: sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==} + '@eslint/core@0.15.2': + resolution: {integrity: sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/eslintrc@3.3.1': resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.31.0': - resolution: {integrity: sha512-LOm5OVt7D4qiKCqoiPbA7LWmI+tbw1VbTUowBcUMgQSuM6poJufkFkYDcQpo5KfgD39TnNySV26QjOh7VFpSyw==} + '@eslint/js@9.36.0': + resolution: {integrity: sha512-uhCbYtYynH30iZErszX78U+nR3pJU3RHGQ57NXy5QupD4SBVwDeU8TNBy+MjMngc1UyIW9noKqsRqfjQTBU2dw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.6': resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.3.4': - resolution: {integrity: sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==} + '@eslint/plugin-kit@0.3.5': + resolution: {integrity: sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} - '@humanfs/node@0.16.6': - resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + '@humanfs/node@0.16.7': + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/retry@0.3.1': - resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} - engines: {node: '>=18.18'} - '@humanwhocodes/retry@0.4.3': resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} @@ -929,6 +925,15 @@ packages: cpu: [x64] os: [win32] + '@inquirer/external-editor@1.0.2': + resolution: {integrity: sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@isaacs/balanced-match@4.0.1': resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} engines: {node: 20 || >=22} @@ -945,18 +950,18 @@ packages: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} - '@jridgewell/gen-mapping@0.3.12': - resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/sourcemap-codec@1.5.4': - resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - '@jridgewell/trace-mapping@0.3.29': - resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} @@ -967,56 +972,56 @@ packages: '@manypkg/get-packages@1.1.3': resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} - '@next/env@15.4.7': - resolution: {integrity: sha512-PrBIpO8oljZGTOe9HH0miix1w5MUiGJ/q83Jge03mHEE0E3pyqzAy2+l5G6aJDbXoobmxPJTVhbCuwlLtjSHwg==} + '@next/env@15.5.3': + resolution: {integrity: sha512-RSEDTRqyihYXygx/OJXwvVupfr9m04+0vH8vyy0HfZ7keRto6VX9BbEk0J2PUk0VGy6YhklJUSrgForov5F9pw==} - '@next/eslint-plugin-next@15.4.2': - resolution: {integrity: sha512-k0rjdWjXBY6tAOty1ckrMETE6Mx66d85NsgcAIdDp7/cXOsTJ93ywmbg3uUcpxX5TUHFEcCWI5mb8nPhwCe9jg==} + '@next/eslint-plugin-next@15.5.3': + resolution: {integrity: sha512-SdhaKdko6dpsSr0DldkESItVrnPYB1NS2NpShCSX5lc7SSQmLZt5Mug6t2xbiuVWEVDLZSuIAoQyYVBYp0dR5g==} - '@next/swc-darwin-arm64@15.4.7': - resolution: {integrity: sha512-2Dkb+VUTp9kHHkSqtws4fDl2Oxms29HcZBwFIda1X7Ztudzy7M6XF9HDS2dq85TmdN47VpuhjE+i6wgnIboVzQ==} + '@next/swc-darwin-arm64@15.5.3': + resolution: {integrity: sha512-nzbHQo69+au9wJkGKTU9lP7PXv0d1J5ljFpvb+LnEomLtSbJkbZyEs6sbF3plQmiOB2l9OBtN2tNSvCH1nQ9Jg==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@15.4.7': - resolution: {integrity: sha512-qaMnEozKdWezlmh1OGDVFueFv2z9lWTcLvt7e39QA3YOvZHNpN2rLs/IQLwZaUiw2jSvxW07LxMCWtOqsWFNQg==} + '@next/swc-darwin-x64@15.5.3': + resolution: {integrity: sha512-w83w4SkOOhekJOcA5HBvHyGzgV1W/XvOfpkrxIse4uPWhYTTRwtGEM4v/jiXwNSJvfRvah0H8/uTLBKRXlef8g==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.4.7': - resolution: {integrity: sha512-ny7lODPE7a15Qms8LZiN9wjNWIeI+iAZOFDOnv2pcHStncUr7cr9lD5XF81mdhrBXLUP9yT9RzlmSWKIazWoDw==} + '@next/swc-linux-arm64-gnu@15.5.3': + resolution: {integrity: sha512-+m7pfIs0/yvgVu26ieaKrifV8C8yiLe7jVp9SpcIzg7XmyyNE7toC1fy5IOQozmr6kWl/JONC51osih2RyoXRw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.4.7': - resolution: {integrity: sha512-4SaCjlFR/2hGJqZLLWycccy1t+wBrE/vyJWnYaZJhUVHccpGLG5q0C+Xkw4iRzUIkE+/dr90MJRUym3s1+vO8A==} + '@next/swc-linux-arm64-musl@15.5.3': + resolution: {integrity: sha512-u3PEIzuguSenoZviZJahNLgCexGFhso5mxWCrrIMdvpZn6lkME5vc/ADZG8UUk5K1uWRy4hqSFECrON6UKQBbQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@15.4.7': - resolution: {integrity: sha512-2uNXjxvONyRidg00VwvlTYDwC9EgCGNzPAPYbttIATZRxmOZ3hllk/YYESzHZb65eyZfBR5g9xgCZjRAl9YYGg==} + '@next/swc-linux-x64-gnu@15.5.3': + resolution: {integrity: sha512-lDtOOScYDZxI2BENN9m0pfVPJDSuUkAD1YXSvlJF0DKwZt0WlA7T7o3wrcEr4Q+iHYGzEaVuZcsIbCps4K27sA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.4.7': - resolution: {integrity: sha512-ceNbPjsFgLscYNGKSu4I6LYaadq2B8tcK116nVuInpHHdAWLWSwVK6CHNvCi0wVS9+TTArIFKJGsEyVD1H+4Kg==} + '@next/swc-linux-x64-musl@15.5.3': + resolution: {integrity: sha512-9vWVUnsx9PrY2NwdVRJ4dUURAQ8Su0sLRPqcCCxtX5zIQUBES12eRVHq6b70bbfaVaxIDGJN2afHui0eDm+cLg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@15.4.7': - resolution: {integrity: sha512-pZyxmY1iHlZJ04LUL7Css8bNvsYAMYOY9JRwFA3HZgpaNKsJSowD09Vg2R9734GxAcLJc2KDQHSCR91uD6/AAw==} + '@next/swc-win32-arm64-msvc@15.5.3': + resolution: {integrity: sha512-1CU20FZzY9LFQigRi6jM45oJMU3KziA5/sSG+dXeVaTm661snQP6xu3ykGxxwU5sLG3sh14teO/IOEPVsQMRfA==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@15.4.7': - resolution: {integrity: sha512-HjuwPJ7BeRzgl3KrjKqD2iDng0eQIpIReyhpF5r4yeAHFwWRuAhfW92rWv/r3qeQHEwHsLRzFDvMqRjyM5DI6A==} + '@next/swc-win32-x64-msvc@15.5.3': + resolution: {integrity: sha512-JMoLAq3n3y5tKXPQwCK5c+6tmwkuFDa2XAxz8Wm4+IVthdBZdZGh+lmiLUHg9f9IDwIQpUjp+ysd6OkYTyZRZw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -1025,12 +1030,12 @@ packages: resolution: {integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==} engines: {node: ^14.21.3 || >=16} - '@noble/curves@1.9.2': - resolution: {integrity: sha512-HxngEd2XUcg9xi20JkwlLCtYwfoFw4JGkuZpT+WlsPD4gB/cxkvTD8fSsoAnphGZhFdZYKeQIPCuFlWPm1uE0g==} + '@noble/curves@1.9.1': + resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} engines: {node: ^14.21.3 || >=16} - '@noble/curves@1.9.4': - resolution: {integrity: sha512-2bKONnuM53lINoDrSmK8qP8W271ms7pygDhZt4SiLOoLwBtoHqeCFi6RG42V8zd3mLHuJFhU/Bmaqo4nX0/kBw==} + '@noble/curves@1.9.7': + resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} engines: {node: ^14.21.3 || >=16} '@noble/hashes@1.8.0': @@ -1053,103 +1058,113 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@rollup/rollup-android-arm-eabi@4.45.1': - resolution: {integrity: sha512-NEySIFvMY0ZQO+utJkgoMiCAjMrGvnbDLHvcmlA33UXJpYBCvlBEbMMtV837uCkS+plG2umfhn0T5mMAxGrlRA==} + '@rollup/rollup-android-arm-eabi@4.52.2': + resolution: {integrity: sha512-o3pcKzJgSGt4d74lSZ+OCnHwkKBeAbFDmbEm5gg70eA8VkyCuC/zV9TwBnmw6VjDlRdF4Pshfb+WE9E6XY1PoQ==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.45.1': - resolution: {integrity: sha512-ujQ+sMXJkg4LRJaYreaVx7Z/VMgBBd89wGS4qMrdtfUFZ+TSY5Rs9asgjitLwzeIbhwdEhyj29zhst3L1lKsRQ==} + '@rollup/rollup-android-arm64@4.52.2': + resolution: {integrity: sha512-cqFSWO5tX2vhC9hJTK8WAiPIm4Q8q/cU8j2HQA0L3E1uXvBYbOZMhE2oFL8n2pKB5sOCHY6bBuHaRwG7TkfJyw==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.45.1': - resolution: {integrity: sha512-FSncqHvqTm3lC6Y13xncsdOYfxGSLnP+73k815EfNmpewPs+EyM49haPS105Rh4aF5mJKywk9X0ogzLXZzN9lA==} + '@rollup/rollup-darwin-arm64@4.52.2': + resolution: {integrity: sha512-vngduywkkv8Fkh3wIZf5nFPXzWsNsVu1kvtLETWxTFf/5opZmflgVSeLgdHR56RQh71xhPhWoOkEBvbehwTlVA==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.45.1': - resolution: {integrity: sha512-2/vVn/husP5XI7Fsf/RlhDaQJ7x9zjvC81anIVbr4b/f0xtSmXQTFcGIQ/B1cXIYM6h2nAhJkdMHTnD7OtQ9Og==} + '@rollup/rollup-darwin-x64@4.52.2': + resolution: {integrity: sha512-h11KikYrUCYTrDj6h939hhMNlqU2fo/X4NB0OZcys3fya49o1hmFaczAiJWVAFgrM1NCP6RrO7lQKeVYSKBPSQ==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.45.1': - resolution: {integrity: sha512-4g1kaDxQItZsrkVTdYQ0bxu4ZIQ32cotoQbmsAnW1jAE4XCMbcBPDirX5fyUzdhVCKgPcrwWuucI8yrVRBw2+g==} + '@rollup/rollup-freebsd-arm64@4.52.2': + resolution: {integrity: sha512-/eg4CI61ZUkLXxMHyVlmlGrSQZ34xqWlZNW43IAU4RmdzWEx0mQJ2mN/Cx4IHLVZFL6UBGAh+/GXhgvGb+nVxw==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.45.1': - resolution: {integrity: sha512-L/6JsfiL74i3uK1Ti2ZFSNsp5NMiM4/kbbGEcOCps99aZx3g8SJMO1/9Y0n/qKlWZfn6sScf98lEOUe2mBvW9A==} + '@rollup/rollup-freebsd-x64@4.52.2': + resolution: {integrity: sha512-QOWgFH5X9+p+S1NAfOqc0z8qEpJIoUHf7OWjNUGOeW18Mx22lAUOiA9b6r2/vpzLdfxi/f+VWsYjUOMCcYh0Ng==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.45.1': - resolution: {integrity: sha512-RkdOTu2jK7brlu+ZwjMIZfdV2sSYHK2qR08FUWcIoqJC2eywHbXr0L8T/pONFwkGukQqERDheaGTeedG+rra6Q==} + '@rollup/rollup-linux-arm-gnueabihf@4.52.2': + resolution: {integrity: sha512-kDWSPafToDd8LcBYd1t5jw7bD5Ojcu12S3uT372e5HKPzQt532vW+rGFFOaiR0opxePyUkHrwz8iWYEyH1IIQA==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.45.1': - resolution: {integrity: sha512-3kJ8pgfBt6CIIr1o+HQA7OZ9mp/zDk3ctekGl9qn/pRBgrRgfwiffaUmqioUGN9hv0OHv2gxmvdKOkARCtRb8Q==} + '@rollup/rollup-linux-arm-musleabihf@4.52.2': + resolution: {integrity: sha512-gKm7Mk9wCv6/rkzwCiUC4KnevYhlf8ztBrDRT9g/u//1fZLapSRc+eDZj2Eu2wpJ+0RzUKgtNijnVIB4ZxyL+w==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.45.1': - resolution: {integrity: sha512-k3dOKCfIVixWjG7OXTCOmDfJj3vbdhN0QYEqB+OuGArOChek22hn7Uy5A/gTDNAcCy5v2YcXRJ/Qcnm4/ma1xw==} + '@rollup/rollup-linux-arm64-gnu@4.52.2': + resolution: {integrity: sha512-66lA8vnj5mB/rtDNwPgrrKUOtCLVQypkyDa2gMfOefXK6rcZAxKLO9Fy3GkW8VkPnENv9hBkNOFfGLf6rNKGUg==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.45.1': - resolution: {integrity: sha512-PmI1vxQetnM58ZmDFl9/Uk2lpBBby6B6rF4muJc65uZbxCs0EA7hhKCk2PKlmZKuyVSHAyIw3+/SiuMLxKxWog==} + '@rollup/rollup-linux-arm64-musl@4.52.2': + resolution: {integrity: sha512-s+OPucLNdJHvuZHuIz2WwncJ+SfWHFEmlC5nKMUgAelUeBUnlB4wt7rXWiyG4Zn07uY2Dd+SGyVa9oyLkVGOjA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.45.1': - resolution: {integrity: sha512-9UmI0VzGmNJ28ibHW2GpE2nF0PBQqsyiS4kcJ5vK+wuwGnV5RlqdczVocDSUfGX/Na7/XINRVoUgJyFIgipoRg==} + '@rollup/rollup-linux-loong64-gnu@4.52.2': + resolution: {integrity: sha512-8wTRM3+gVMDLLDdaT6tKmOE3lJyRy9NpJUS/ZRWmLCmOPIJhVyXwjBo+XbrrwtV33Em1/eCTd5TuGJm4+DmYjw==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.45.1': - resolution: {integrity: sha512-7nR2KY8oEOUTD3pBAxIBBbZr0U7U+R9HDTPNy+5nVVHDXI4ikYniH1oxQz9VoB5PbBU1CZuDGHkLJkd3zLMWsg==} + '@rollup/rollup-linux-ppc64-gnu@4.52.2': + resolution: {integrity: sha512-6yqEfgJ1anIeuP2P/zhtfBlDpXUb80t8DpbYwXQ3bQd95JMvUaqiX+fKqYqUwZXqdJDd8xdilNtsHM2N0cFm6A==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.45.1': - resolution: {integrity: sha512-nlcl3jgUultKROfZijKjRQLUu9Ma0PeNv/VFHkZiKbXTBQXhpytS8CIj5/NfBeECZtY2FJQubm6ltIxm/ftxpw==} + '@rollup/rollup-linux-riscv64-gnu@4.52.2': + resolution: {integrity: sha512-sshYUiYVSEI2B6dp4jMncwxbrUqRdNApF2c3bhtLAU0qA8Lrri0p0NauOsTWh3yCCCDyBOjESHMExonp7Nzc0w==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.45.1': - resolution: {integrity: sha512-HJV65KLS51rW0VY6rvZkiieiBnurSzpzore1bMKAhunQiECPuxsROvyeaot/tcK3A3aGnI+qTHqisrpSgQrpgA==} + '@rollup/rollup-linux-riscv64-musl@4.52.2': + resolution: {integrity: sha512-duBLgd+3pqC4MMwBrKkFxaZerUxZcYApQVC5SdbF5/e/589GwVvlRUnyqMFbM8iUSb1BaoX/3fRL7hB9m2Pj8Q==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.45.1': - resolution: {integrity: sha512-NITBOCv3Qqc6hhwFt7jLV78VEO/il4YcBzoMGGNxznLgRQf43VQDae0aAzKiBeEPIxnDrACiMgbqjuihx08OOw==} + '@rollup/rollup-linux-s390x-gnu@4.52.2': + resolution: {integrity: sha512-tzhYJJidDUVGMgVyE+PmxENPHlvvqm1KILjjZhB8/xHYqAGeizh3GBGf9u6WdJpZrz1aCpIIHG0LgJgH9rVjHQ==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.45.1': - resolution: {integrity: sha512-+E/lYl6qu1zqgPEnTrs4WysQtvc/Sh4fC2nByfFExqgYrqkKWp1tWIbe+ELhixnenSpBbLXNi6vbEEJ8M7fiHw==} + '@rollup/rollup-linux-x64-gnu@4.52.2': + resolution: {integrity: sha512-opH8GSUuVcCSSyHHcl5hELrmnk4waZoVpgn/4FDao9iyE4WpQhyWJ5ryl5M3ocp4qkRuHfyXnGqg8M9oKCEKRA==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.45.1': - resolution: {integrity: sha512-a6WIAp89p3kpNoYStITT9RbTbTnqarU7D8N8F2CV+4Cl9fwCOZraLVuVFvlpsW0SbIiYtEnhCZBPLoNdRkjQFw==} + '@rollup/rollup-linux-x64-musl@4.52.2': + resolution: {integrity: sha512-LSeBHnGli1pPKVJ79ZVJgeZWWZXkEe/5o8kcn23M8eMKCUANejchJbF/JqzM4RRjOJfNRhKJk8FuqL1GKjF5oQ==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.45.1': - resolution: {integrity: sha512-T5Bi/NS3fQiJeYdGvRpTAP5P02kqSOpqiopwhj0uaXB6nzs5JVi2XMJb18JUSKhCOX8+UE1UKQufyD6Or48dJg==} + '@rollup/rollup-openharmony-arm64@4.52.2': + resolution: {integrity: sha512-uPj7MQ6/s+/GOpolavm6BPo+6CbhbKYyZHUDvZ/SmJM7pfDBgdGisFX3bY/CBDMg2ZO4utfhlApkSfZ92yXw7Q==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.52.2': + resolution: {integrity: sha512-Z9MUCrSgIaUeeHAiNkm3cQyst2UhzjPraR3gYYfOjAuZI7tcFRTOD+4cHLPoS/3qinchth+V56vtqz1Tv+6KPA==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.45.1': - resolution: {integrity: sha512-lxV2Pako3ujjuUe9jiU3/s7KSrDfH6IgTSQOnDWr9aJ92YsFd7EurmClK0ly/t8dzMkDtd04g60WX6yl0sGfdw==} + '@rollup/rollup-win32-ia32-msvc@4.52.2': + resolution: {integrity: sha512-+GnYBmpjldD3XQd+HMejo+0gJGwYIOfFeoBQv32xF/RUIvccUz20/V6Otdv+57NE70D5pa8W/jVGDoGq0oON4A==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.45.1': - resolution: {integrity: sha512-M/fKi4sasCdM8i0aWJjCSFm2qEnYRR8AMLG2kxp6wD13+tMGA4Z1tVAuHkNRjud5SW2EM3naLuK35w9twvf6aA==} + '@rollup/rollup-win32-x64-gnu@4.52.2': + resolution: {integrity: sha512-ApXFKluSB6kDQkAqZOKXBjiaqdF1BlKi+/eqnYe9Ee7U2K3pUDKsIyr8EYm/QDHTJIM+4X+lI0gJc3TTRhd+dA==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.52.2': + resolution: {integrity: sha512-ARz+Bs8kY6FtitYM96PqPEVvPXqEZmPZsSkXvyX19YzDqkCaIlhCieLLMI5hxO9SRZ2XtCtm8wxhy0iJ2jxNfw==} cpu: [x64] os: [win32] @@ -1213,14 +1228,11 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@20.19.21': - resolution: {integrity: sha512-CsGG2P3I5y48RPMfprQGfy4JPRZ6csfC3ltBZSRItG3ngggmNY/qs2uZKp4p9VbrpqNNSMzUZNFZKzgOGnd/VA==} + '@types/node@20.19.17': + resolution: {integrity: sha512-gfehUI8N1z92kygssiuWvLiwcbOB3IRktR6hTDgJlXMYh5OvkPSRmgfoBUmfZt+vhwJtX7v1Yw4KvvAf7c5QKQ==} - '@types/node@20.19.9': - resolution: {integrity: sha512-cuVNgarYWZqxRJDQHEB58GEONhOK79QVR/qYx4S7kcUObQvUwvFnYxJuuHUKm2aieN9X3yZB4LZsuYNU1Qphsw==} - - '@types/node@22.16.5': - resolution: {integrity: sha512-bJFoMATwIGaxxx8VJPeM8TonI8t579oRvgAuT8zFugJsJZgzqv0Fu8Mhp68iecjzG7cnN3mO2dJQ5uUM2EFrgQ==} + '@types/node@22.18.6': + resolution: {integrity: sha512-r8uszLPpeIWbNKtvWRt/DbVi5zbqZyj1PTmhRMqBMvDnaz1QpmSKujUtJLrqGZeoM8v72MfYggDceY4K1itzWQ==} '@types/prop-types@15.7.15': resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} @@ -1243,72 +1255,69 @@ packages: '@types/tinycolor2@1.4.6': resolution: {integrity: sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw==} - '@types/whatwg-mimetype@3.0.2': - resolution: {integrity: sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==} - '@types/yargs-parser@21.0.3': resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} '@types/yargs@17.0.33': resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} - '@typescript-eslint/eslint-plugin@8.38.0': - resolution: {integrity: sha512-CPoznzpuAnIOl4nhj4tRr4gIPj5AfKgkiJmGQDaq+fQnRJTYlcBjbX3wbciGmpoPf8DREufuPRe1tNMZnGdanA==} + '@typescript-eslint/eslint-plugin@8.44.1': + resolution: {integrity: sha512-molgphGqOBT7t4YKCSkbasmu1tb1MgrZ2szGzHbclF7PNmOkSTQVHy+2jXOSnxvR3+Xe1yySHFZoqMpz3TfQsw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.38.0 + '@typescript-eslint/parser': ^8.44.1 eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.38.0': - resolution: {integrity: sha512-Zhy8HCvBUEfBECzIl1PKqF4p11+d0aUJS1GeUiuqK9WmOug8YCmC4h4bjyBvMyAMI9sbRczmrYL5lKg/YMbrcQ==} + '@typescript-eslint/parser@8.44.1': + resolution: {integrity: sha512-EHrrEsyhOhxYt8MTg4zTF+DJMuNBzWwgvvOYNj/zm1vnaD/IC5zCXFehZv94Piqa2cRFfXrTFxIvO95L7Qc/cw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.38.0': - resolution: {integrity: sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg==} + '@typescript-eslint/project-service@8.44.1': + resolution: {integrity: sha512-ycSa60eGg8GWAkVsKV4E6Nz33h+HjTXbsDT4FILyL8Obk5/mx4tbvCNsLf9zret3ipSumAOG89UcCs/KRaKYrA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@8.38.0': - resolution: {integrity: sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ==} + '@typescript-eslint/scope-manager@8.44.1': + resolution: {integrity: sha512-NdhWHgmynpSvyhchGLXh+w12OMT308Gm25JoRIyTZqEbApiBiQHD/8xgb6LqCWCFcxFtWwaVdFsLPQI3jvhywg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.38.0': - resolution: {integrity: sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ==} + '@typescript-eslint/tsconfig-utils@8.44.1': + resolution: {integrity: sha512-B5OyACouEjuIvof3o86lRMvyDsFwZm+4fBOqFHccIctYgBjqR3qT39FBYGN87khcgf0ExpdCBeGKpKRhSFTjKQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.38.0': - resolution: {integrity: sha512-c7jAvGEZVf0ao2z+nnz8BUaHZD09Agbh+DY7qvBQqLiz8uJzRgVPj5YvOh8I8uEiH8oIUGIfHzMwUcGVco/SJg==} + '@typescript-eslint/type-utils@8.44.1': + resolution: {integrity: sha512-KdEerZqHWXsRNKjF9NYswNISnFzXfXNDfPxoTh7tqohU/PRIbwTmsjGK6V9/RTYWau7NZvfo52lgVk+sJh0K3g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@8.38.0': - resolution: {integrity: sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==} + '@typescript-eslint/types@8.44.1': + resolution: {integrity: sha512-Lk7uj7y9uQUOEguiDIDLYLJOrYHQa7oBiURYVFqIpGxclAFQ78f6VUOM8lI2XEuNOKNB7XuvM2+2cMXAoq4ALQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.38.0': - resolution: {integrity: sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ==} + '@typescript-eslint/typescript-estree@8.44.1': + resolution: {integrity: sha512-qnQJ+mVa7szevdEyvfItbO5Vo+GfZ4/GZWWDRRLjrxYPkhM+6zYB2vRYwCsoJLzqFCdZT4mEqyJoyzkunsZ96A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.38.0': - resolution: {integrity: sha512-hHcMA86Hgt+ijJlrD8fX0j1j8w4C92zue/8LOPAFioIno+W0+L7KqE8QZKCcPGc/92Vs9x36w/4MPTJhqXdyvg==} + '@typescript-eslint/utils@8.44.1': + resolution: {integrity: sha512-DpX5Fp6edTlocMCwA+mHY8Mra+pPjRZ0TfHkXI8QFelIKcbADQz1LUPNtzOFUriBB2UYqw4Pi9+xV4w9ZczHFg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@8.38.0': - resolution: {integrity: sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g==} + '@typescript-eslint/visitor-keys@8.44.1': + resolution: {integrity: sha512-576+u0QD+Jp3tZzvfRfxon0EA2lzcDt3lhUbsC6Lgzy9x2VR4E+JUiNyGHi5T8vk0TV+fpJ5GLG1JsJuWCaKhw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@vitest/coverage-v8@3.2.4': @@ -1349,11 +1358,22 @@ packages: '@vitest/utils@3.2.4': resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} - abitype@1.0.8: - resolution: {integrity: sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==} + abitype@1.1.0: + resolution: {integrity: sha512-6Vh4HcRxNMLA0puzPjM5GBgT4aAcFGKZzSgAXvuZ27shJP6NEpielTuqbBmZILR5/xd0PizkBGy5hReKz9jl5A==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3.22.0 || ^4.0.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + + abitype@1.1.1: + resolution: {integrity: sha512-Loe5/6tAgsBukY95eGaPSDmQHIjRZYQq8PB1MpsNccDIK8WiV+Uw6WzaIXipvaxTEL2yEB0OpEaQv3gs8pkS9Q==} peerDependencies: typescript: '>=5.0.4' - zod: ^3 >=3.22.0 + zod: ^3.22.0 || ^4.0.0 peerDependenciesMeta: typescript: optional: true @@ -1397,8 +1417,8 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.1.0: - resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} engines: {node: '>=12'} ansi-styles@3.2.1: @@ -1409,8 +1429,8 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} - ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} anymatch@3.1.3: @@ -1470,8 +1490,8 @@ packages: resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} engines: {node: '>=4'} - ast-v8-to-istanbul@0.3.3: - resolution: {integrity: sha512-MuXMrSLVVoA6sYN/6Hke18vMzrT4TZNbZIj/hvh0fnYFpO+/kFXcLIaiPwXXWaQUPg4yJD8fj+lfJ7/1EBconw==} + ast-v8-to-istanbul@0.3.5: + resolution: {integrity: sha512-9SdXjNheSiE8bALAQCQQuT6fgQaoxJh7IRYrRGZ8/9nv8WhJeC1aXAwN8TbaOssGOukUvyvnkgD9+Yuykvl1aA==} async-function@1.0.0: resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} @@ -1549,8 +1569,8 @@ packages: resolution: {integrity: sha512-3Cco8XQhi27DogSp9Ri6LYNZLi/TBY/JVnDe+mj06NkBjW/ZYOtekaEU4wZ4xcRMNrFkDv8KNtOAqHyDfz3lYg==} engines: {node: '>=18.7'} - chai@5.2.1: - resolution: {integrity: sha512-5nFxhUrX0PqtyogoYOA8IPswy5sZFTOsBFl/9bNsmDLgsxYTzSZQJDPppDnZPTQbzSEm0hqGjWPzRemQCYbD6A==} + chai@5.3.3: + resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} engines: {node: '>=18'} chalk@2.4.2: @@ -1571,6 +1591,9 @@ packages: chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + chardet@2.1.0: + resolution: {integrity: sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==} + check-error@2.1.1: resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} engines: {node: '>= 16'} @@ -1638,8 +1661,8 @@ packages: constant-case@2.0.0: resolution: {integrity: sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ==} - core-js-pure@3.44.0: - resolution: {integrity: sha512-gvMQAGB4dfVUxpYD0k3Fq8J+n5bB6Ytl15lqlZrOIXFzxOhtPaObfkQGHtMRdyjIf7z2IeNULwi1jEwyS+ltKQ==} + core-js-pure@3.45.1: + resolution: {integrity: sha512-OHnWFKgTUshEU8MK+lOs1H8kC8GkTi9Z1tvNkxrCcw9wl3MJIO7q2ld77wjWn4/xuGrVu2X+nME1iIIPBSdyEQ==} create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} @@ -1671,8 +1694,8 @@ packages: resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} engines: {node: '>=0.11'} - debug@4.4.1: - resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -1793,8 +1816,8 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} - esbuild@0.25.8: - resolution: {integrity: sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==} + esbuild@0.25.10: + resolution: {integrity: sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==} engines: {node: '>=18'} hasBin: true @@ -1837,8 +1860,8 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - eslint-plugin-turbo@2.5.5: - resolution: {integrity: sha512-IlN65X6W7rgK88u5xl1xC+7FIGKA7eyaca0yxZQ9CBNV6keAaqtjZQLw8ZfXdv7T+MzTLYkYOeOHAv8yCRUx4Q==} + eslint-plugin-turbo@2.5.6: + resolution: {integrity: sha512-KUDE23aP2JV8zbfZ4TeM1HpAXzMM/AYG/bJam7P4AalUxas8Pd/lS/6R3p4uX91qJcH1LwL4h0ED48nDe8KorQ==} peerDependencies: eslint: '>6.6.0' turbo: '>2.0.0' @@ -1855,8 +1878,8 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.31.0: - resolution: {integrity: sha512-QldCVh/ztyKJJZLr4jXNUByx3gR+TDYZCRXEktiZoUR3PGy4qCmSbkxcIle8GEwGpb5JBZazlaJ/CxLidXdEbQ==} + eslint@9.36.0: + resolution: {integrity: sha512-hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -1911,8 +1934,8 @@ packages: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} engines: {node: '>=4'} - fake-indexeddb@6.0.1: - resolution: {integrity: sha512-He2AjQGHe46svIFq5+L2Nx/eHDTI1oKgoevBP+TthnjymXiKkeJQ3+ITeWey99Y5+2OaPFbI1qEsx/5RsGtWnQ==} + fake-indexeddb@6.2.2: + resolution: {integrity: sha512-SGbf7fzjeHz3+12NO1dYigcYn4ivviaeULV5yY5rdGihBvvgwMds4r4UBbNIUMwkze57KTDm32rq3j1Az8mzEw==} engines: {node: '>=18'} fast-deep-equal@3.1.3: @@ -1935,8 +1958,9 @@ packages: fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} - fdir@6.4.6: - resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -2092,8 +2116,8 @@ packages: engines: {node: '>=0.4.7'} hasBin: true - happy-dom@20.0.2: - resolution: {integrity: sha512-pYOyu624+6HDbY+qkjILpQGnpvZOusItCk+rvF5/V+6NkcgTKnbOldpIy22tBnxoaLtlM9nXgoqAcW29/B7CIw==} + happy-dom@17.6.3: + resolution: {integrity: sha512-UVIHeVhxmxedbWPCfgS55Jg2rDfwf2BCKeylcPSqazLz5w3Kri7Q4xdBJubsr/+VUzFLh0VjIvh13RaDA2/Xug==} engines: {node: '>=20.0.0'} has-bigints@1.1.0: @@ -2153,6 +2177,10 @@ packages: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} + iconv-lite@0.7.0: + resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} + engines: {node: '>=0.10.0'} + idb@7.1.1: resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} @@ -2196,16 +2224,16 @@ packages: resolution: {integrity: sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==} engines: {node: '>=8.0.0'} - inquirer@8.2.6: - resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} + inquirer@8.2.7: + resolution: {integrity: sha512-UjOaSel/iddGZJ5xP/Eixh6dY1XghiBw4XK13rCCIJcJfyhhoul/7KhLLUGtebEj6GDYM6Vnx/mVsjx2L/mFIA==} engines: {node: '>=12.0.0'} internal-slot@1.1.0: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} - ip-address@9.0.5: - resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} + ip-address@10.0.1: + resolution: {integrity: sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==} engines: {node: '>= 12'} is-array-buffer@3.0.5: @@ -2377,8 +2405,8 @@ packages: resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} engines: {node: '>=10'} - istanbul-reports@3.1.7: - resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + istanbul-reports@3.2.0: + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} engines: {node: '>=8'} iterator.prototype@1.1.5: @@ -2406,9 +2434,6 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true - jsbn@1.1.0: - resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} - json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} @@ -2424,8 +2449,8 @@ packages: jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} jsx-ast-utils@3.3.5: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} @@ -2438,58 +2463,58 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - lefthook-darwin-arm64@1.12.2: - resolution: {integrity: sha512-fTxeI9tEskrHjc3QyEO+AG7impBXY2Ed8V5aiRc3fw9POfYtVh9b5jRx90fjk2+ld5hf+Z1DsyyLq/vOHDFskQ==} + lefthook-darwin-arm64@1.13.3: + resolution: {integrity: sha512-PtCWi3yOgN50//73GH4xVeTd0WHCQWeHjHezGpPRzllavKo0z/dW4K5dj4ppn1E2nflanHEArrBfKEWHT5Gx0Q==} cpu: [arm64] os: [darwin] - lefthook-darwin-x64@1.12.2: - resolution: {integrity: sha512-T1dCDKAAfdHgYZ8qtrS02SJSHoR52RFcrGArFNll9Mu4ZSV19Sp8BO+kTwDUOcLYdcPGNaqOp9PkRBQGZWQC7g==} + lefthook-darwin-x64@1.13.3: + resolution: {integrity: sha512-lFSNWEpAP7iS260UtNPiwczq05CYBNAZpzBPE582++MB09aejdveVFDx/Hmur6xobInCCVgwzWTVW92LGIWTXQ==} cpu: [x64] os: [darwin] - lefthook-freebsd-arm64@1.12.2: - resolution: {integrity: sha512-2n9z7Q4BKeMBoB9cuEdv0UBQH82Z4GgBQpCrfjCtyzpDnYQwrH8Tkrlnlko4qPh9MM6nLLGIYMKsA5nltzo8Cg==} + lefthook-freebsd-arm64@1.13.3: + resolution: {integrity: sha512-LZ3Sj0utBxzsJWmyhHB2nBaFsI4cf/FivE0GtCGcGQZFxizgctqfuruL5oWuA9XOuRpyTICcTO01bS5/ZTMorQ==} cpu: [arm64] os: [freebsd] - lefthook-freebsd-x64@1.12.2: - resolution: {integrity: sha512-1hNY/irY+/3kjRzKoJYxG+m3BYI8QxopJUK1PQnknGo1Wy5u302SdX+tR7pnpz6JM5chrNw4ozSbKKOvdZ5VEw==} + lefthook-freebsd-x64@1.13.3: + resolution: {integrity: sha512-TXXrEpRdV86hK3j69jEaZON16kLnrXR/G1UdA2tfeeFN3t2ZejrEyAoSnbW0IrR8dK4pDx6gceTVSWJN2Pk10g==} cpu: [x64] os: [freebsd] - lefthook-linux-arm64@1.12.2: - resolution: {integrity: sha512-1W4swYIVRkxq/LFTuuK4oVpd6NtTKY4E3VY2Uq2JDkIOJV46+8qGBF+C/QA9K3O9chLffgN7c+i+NhIuGiZ/Vw==} + lefthook-linux-arm64@1.13.3: + resolution: {integrity: sha512-iSMQB5G0HlUPimvHx+zGCD0VWhwA+Tc6MpHk9TYzhuQh3FP2ksyxadjSpMn/Q+iwfq6XoEhHyX69esksVI/awg==} cpu: [arm64] os: [linux] - lefthook-linux-x64@1.12.2: - resolution: {integrity: sha512-J6VGuMfhq5iCsg1Pv7xULbuXC63gP5LaikT0PhkyBNMi3HQneZFDJ8k/sp0Ue9HkQv6QfWIo3/FgB9gz38MCFw==} + lefthook-linux-x64@1.13.3: + resolution: {integrity: sha512-3nsNNTW0TnrbZNdKJiuCcy6pRpzX+kfTqsKL7R/JlAqfSWQroMhvIVrcSPazbZAs32U0nDMQ05tkd/lEEKvjTw==} cpu: [x64] os: [linux] - lefthook-openbsd-arm64@1.12.2: - resolution: {integrity: sha512-wncDRW3ml24DaOyH22KINumjvCohswbQqbxyH2GORRCykSnE859cTjOrRIchTKBIARF7PSeGPUtS7EK0+oDbaw==} + lefthook-openbsd-arm64@1.13.3: + resolution: {integrity: sha512-g6pw2l17CF8wTUz+25vXK3xd22DyYp+qEM9acKdT/Hh/OooyOx/fyh134Hghp6cAoeo1ix9w16hmKbQq5QlYZQ==} cpu: [arm64] os: [openbsd] - lefthook-openbsd-x64@1.12.2: - resolution: {integrity: sha512-2jDOkCHNnc/oK/vR62hAf3vZb1EQ6Md2GjIlgZ/V7A3ztOsM8QZ5IxwYN3D1UOIR5ZnwMBy7PtmTJC/HJrig5w==} + lefthook-openbsd-x64@1.13.3: + resolution: {integrity: sha512-rWyErYH3G8A0/o+hzkpc+5ZuiKoanoGS4qjVS6y/Jh5LWqmkVjtEptdkcuYdNEVt9ShNHIys0F7uNCg0V+rZlA==} cpu: [x64] os: [openbsd] - lefthook-windows-arm64@1.12.2: - resolution: {integrity: sha512-ZMH/q6UNSidhHEG/1QoqIl1n4yPTBWuVmKx5bONtKHicoz4QCQ+QEiNjKsG5OO4C62nfyHGThmweCzZVUQECJw==} + lefthook-windows-arm64@1.13.3: + resolution: {integrity: sha512-xRB+DcvRSdG7+QydDvhJMm//THUpFqOcyfDgy4TuP3B0DhakuOn1K/95kNf9qHj15uLHIK2ceWGqVew2FRXP4w==} cpu: [arm64] os: [win32] - lefthook-windows-x64@1.12.2: - resolution: {integrity: sha512-TqT2jIPcTQ9uwaw+v+DTmvnUHM/p7bbsSrPoPX+fRXSGLzFjyiY+12C9dObSwfCQq6rT70xqQJ9AmftJQsa5/Q==} + lefthook-windows-x64@1.13.3: + resolution: {integrity: sha512-Or256NzKEg4hjblN8La7cnfqj+POfsiEknUdhcp+4GFUXzE6lhXadEyXKf3X9qZPpV4QZjgfobtdAEgTFUCj6Q==} cpu: [x64] os: [win32] - lefthook@1.12.2: - resolution: {integrity: sha512-2CeTu5NcmoT9YnqsHTq/TF36MlqlzHzhivGx3DrXHwcff4TdvrkIwUTA56huM3Nlo5ODAF/0hlPzaKLmNHCBnQ==} + lefthook@1.13.3: + resolution: {integrity: sha512-suxG98kRI/a4T2gkdh97o14aTaNr1cKdA2olNaNLz16dy4/J1PahYPm54sqmm/Zhoi1DCV43SUNz6T6bh0Y7Ng==} hasBin: true levn@0.4.1: @@ -2529,8 +2554,8 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true - loupe@3.1.4: - resolution: {integrity: sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==} + loupe@3.2.1: + resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} lower-case-first@1.0.2: resolution: {integrity: sha512-UuxaYakO7XeONbKrZf5FEgkantPf5DUqDayzP5VXZrtRPdH86s4kN47I8B3TW10S4QKiE3ziHNf3kRN//okHjA==} @@ -2541,16 +2566,16 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.1.0: - resolution: {integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==} + lru-cache@11.2.1: + resolution: {integrity: sha512-r8LA6i4LP4EeWOhqBaZZjDWwehd1xUJPCJd9Sv300H0ZmcUER4+JPh7bqqZeqs1o5pgtgvXm+d9UGrB5zZGDiQ==} engines: {node: 20 || >=22} lru-cache@7.18.3: resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} engines: {node: '>=12'} - magic-string@0.30.17: - resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + magic-string@0.30.19: + resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} magicast@0.3.5: resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} @@ -2636,8 +2661,8 @@ packages: resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} engines: {node: '>= 0.4.0'} - next@15.4.7: - resolution: {integrity: sha512-OcqRugwF7n7mC8OSYjvsZhhG1AYSvulor1EIUsIkbbEbf1qoE5EbH36Swj8WhF4cHqmDgkiam3z1c1W0J1Wifg==} + next@15.5.3: + resolution: {integrity: sha512-r/liNAx16SQj4D+XH/oI1dlpv9tdKJ6cONYPwwcCC46f2NjpaRWY+EKCzULfgQYV6YKXjHBchff2IZBSlZmJNw==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: @@ -2743,8 +2768,8 @@ packages: typescript: optional: true - ox@0.8.1: - resolution: {integrity: sha512-e+z5epnzV+Zuz91YYujecW8cF01mzmrUtWotJ0oEPym/G82uccs7q0WDHTYL3eiONbTUEvcZrptAKLgTBD3u2A==} + ox@0.9.6: + resolution: {integrity: sha512-8SuCbHPvv2eZLYXrNmC0EC12rdzXQLdhnOMlHDW2wiCPLxBrOOJwX5L5E61by+UjTPOryqQiRSnjIKCI+GykKg==} peerDependencies: typescript: '>=5.4.0' peerDependenciesMeta: @@ -2913,8 +2938,8 @@ packages: resolution: {integrity: sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==} engines: {node: '>=6.0.0'} - quansync@0.2.10: - resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==} + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -2923,16 +2948,16 @@ packages: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true - react-dom@19.1.0: - resolution: {integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==} + react-dom@19.1.1: + resolution: {integrity: sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw==} peerDependencies: - react: ^19.1.0 + react: ^19.1.1 react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - react@19.1.0: - resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} + react@19.1.1: + resolution: {integrity: sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==} engines: {node: '>=0.10.0'} read-yaml-file@1.1.0: @@ -3001,8 +3026,8 @@ packages: engines: {node: 20 || >=22} hasBin: true - rollup@4.45.1: - resolution: {integrity: sha512-4iya7Jb76fVpQyLoiVpzUrsjQ12r3dM7fIVz+4NwoYvZOShknRmiv+iu9CClZml5ZLGb0XMcYLutK6w9tgxHDw==} + rollup@4.52.2: + resolution: {integrity: sha512-I25/2QgoROE1vYV+NQ1En9T9UFB9Cmfm2CJ83zZOlaDpvz29wGQSZXWKw7MiNXau7wYgB/T9fVIdIuEQ+KbiiA==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -3126,8 +3151,8 @@ packages: resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} engines: {node: '>= 14'} - socks@2.8.6: - resolution: {integrity: sha512-pe4Y2yzru68lXCb38aAqRf5gvN8YdjP1lok5o0J7BOHljkyCGKVz7H3vpVIXKD27rj2giOJ7DwVyk/GWrPHDWA==} + socks@2.8.7: + resolution: {integrity: sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==} engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} source-map-js@1.2.1: @@ -3147,9 +3172,6 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - sprintf-js@1.1.3: - resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} - stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} @@ -3194,8 +3216,8 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} engines: {node: '>=12'} strip-bom@3.0.0: @@ -3269,8 +3291,8 @@ packages: tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - tinyglobby@0.2.14: - resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} tinygradient@1.1.5: @@ -3284,8 +3306,8 @@ packages: resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} engines: {node: '>=14.0.0'} - tinyspy@4.0.3: - resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} + tinyspy@4.0.4: + resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} engines: {node: '>=14.0.0'} title-case@2.1.1: @@ -3333,38 +3355,38 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - turbo-darwin-64@2.5.5: - resolution: {integrity: sha512-RYnTz49u4F5tDD2SUwwtlynABNBAfbyT2uU/brJcyh5k6lDLyNfYKdKmqd3K2ls4AaiALWrFKVSBsiVwhdFNzQ==} + turbo-darwin-64@2.5.6: + resolution: {integrity: sha512-3C1xEdo4aFwMJAPvtlPqz1Sw/+cddWIOmsalHFMrsqqydcptwBfu26WW2cDm3u93bUzMbBJ8k3zNKFqxJ9ei2A==} cpu: [x64] os: [darwin] - turbo-darwin-arm64@2.5.5: - resolution: {integrity: sha512-Tk+ZeSNdBobZiMw9aFypQt0DlLsWSFWu1ymqsAdJLuPoAH05qCfYtRxE1pJuYHcJB5pqI+/HOxtJoQ40726Btw==} + turbo-darwin-arm64@2.5.6: + resolution: {integrity: sha512-LyiG+rD7JhMfYwLqB6k3LZQtYn8CQQUePbpA8mF/hMLPAekXdJo1g0bUPw8RZLwQXUIU/3BU7tXENvhSGz5DPA==} cpu: [arm64] os: [darwin] - turbo-linux-64@2.5.5: - resolution: {integrity: sha512-2/XvMGykD7VgsvWesZZYIIVXMlgBcQy+ZAryjugoTcvJv8TZzSU/B1nShcA7IAjZ0q7OsZ45uP2cOb8EgKT30w==} + turbo-linux-64@2.5.6: + resolution: {integrity: sha512-GOcUTT0xiT/pSnHL4YD6Yr3HreUhU8pUcGqcI2ksIF9b2/r/kRHwGFcsHgpG3+vtZF/kwsP0MV8FTlTObxsYIA==} cpu: [x64] os: [linux] - turbo-linux-arm64@2.5.5: - resolution: {integrity: sha512-DW+8CjCjybu0d7TFm9dovTTVg1VRnlkZ1rceO4zqsaLrit3DgHnN4to4uwyuf9s2V/BwS3IYcRy+HG9BL596Iw==} + turbo-linux-arm64@2.5.6: + resolution: {integrity: sha512-10Tm15bruJEA3m0V7iZcnQBpObGBcOgUcO+sY7/2vk1bweW34LMhkWi8svjV9iDF68+KJDThnYDlYE/bc7/zzQ==} cpu: [arm64] os: [linux] - turbo-windows-64@2.5.5: - resolution: {integrity: sha512-q5p1BOy8ChtSZfULuF1BhFMYIx6bevXu4fJ+TE/hyNfyHJIfjl90Z6jWdqAlyaFLmn99X/uw+7d6T/Y/dr5JwQ==} + turbo-windows-64@2.5.6: + resolution: {integrity: sha512-FyRsVpgaj76It0ludwZsNN40ytHN+17E4PFJyeliBEbxrGTc5BexlXVpufB7XlAaoaZVxbS6KT8RofLfDRyEPg==} cpu: [x64] os: [win32] - turbo-windows-arm64@2.5.5: - resolution: {integrity: sha512-AXbF1KmpHUq3PKQwddMGoKMYhHsy5t1YBQO8HZ04HLMR0rWv9adYlQ8kaeQJTko1Ay1anOBFTqaxfVOOsu7+1Q==} + turbo-windows-arm64@2.5.6: + resolution: {integrity: sha512-j/tWu8cMeQ7HPpKri6jvKtyXg9K1gRyhdK4tKrrchH8GNHscPX/F71zax58yYtLRWTiK04zNzPcUJuoS0+v/+Q==} cpu: [arm64] os: [win32] - turbo@2.5.5: - resolution: {integrity: sha512-eZ7wI6KjtT1eBqCnh2JPXWNUAxtoxxfi6VdBdZFvil0ychCOTxbm7YLRBi1JSt7U3c+u3CLxpoPxLdvr/Npr3A==} + turbo@2.5.6: + resolution: {integrity: sha512-gxToHmi9oTBNB05UjUsrWf0OyN5ZXtD0apOarC1KIx232Vp3WimRNy3810QzeNSgyD5rsaIDXlxlbnOzlouo+w==} hasBin: true type-check@0.4.0: @@ -3391,12 +3413,12 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} - typescript-eslint@8.38.0: - resolution: {integrity: sha512-FsZlrYK6bPDGoLeZRuvx2v6qrM03I0U0SnfCLPs/XCCPCFD80xU9Pg09H/K+XFa68uJuZo7l/Xhs+eDRg2l3hg==} + typescript-eslint@8.44.1: + resolution: {integrity: sha512-0ws8uWGrUVTjEeN2OM4K1pLKHK/4NiNP/vz6ns+LjT/6sqpaYzIVFajZb1fj/IDwpsrrHb3Jy0Qm5u9CPcKaeg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' typescript@5.5.4: resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} @@ -3457,8 +3479,8 @@ packages: resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - viem@2.33.0: - resolution: {integrity: sha512-SxBM3CmeU+LWLlBclV9MPdbuFV8mQEl0NeRc9iyYU4a7Xb5sr5oku3s/bRGTPpEP+1hCAHYpM09/ui3/dQ6EsA==} + viem@2.37.8: + resolution: {integrity: sha512-mL+5yvCQbRIR6QvngDQMfEiZTfNWfd+/QL5yFaOoYbpH3b1Q2ddwF7YG2eI2AcYSh9LE1gtUkbzZLFUAVyj4oQ==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: @@ -3470,8 +3492,8 @@ packages: engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true - vite@7.0.5: - resolution: {integrity: sha512-1mncVwJxy2C9ThLwz0+2GKZyEXuC3MyWtAAlNftlZZXZDP3AJt5FmwcMit/IGGaNZ8ZOB2BNO/HFUB+CpN0NQw==} + vite@7.1.7: + resolution: {integrity: sha512-VbA8ScMvAISJNJVbRDTJdCwqQoAareR/wutevKanhR2/1EkoXVZVkkORaYm/tNVCjP/UDTKtcw3bAkwOUdedmA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -3541,6 +3563,10 @@ packages: wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + whatwg-mimetype@3.0.0: resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} engines: {node: '>=12'} @@ -3593,8 +3619,8 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@8.18.2: - resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} + ws@8.18.3: + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -3632,35 +3658,35 @@ snapshots: cbor2: 1.12.0 pkijs: 3.2.5 - '@adraffy/ens-normalize@1.11.0': {} + '@adraffy/ens-normalize@1.11.1': {} '@ampproject/remapping@2.3.0': dependencies: - '@jridgewell/gen-mapping': 0.3.12 - '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 '@babel/helper-string-parser@7.27.1': {} '@babel/helper-validator-identifier@7.27.1': {} - '@babel/parser@7.28.0': + '@babel/parser@7.28.4': dependencies: - '@babel/types': 7.28.1 + '@babel/types': 7.28.4 - '@babel/runtime-corejs3@7.28.0': + '@babel/runtime-corejs3@7.28.4': dependencies: - core-js-pure: 3.44.0 + core-js-pure: 3.45.1 - '@babel/runtime@7.27.6': {} + '@babel/runtime@7.28.4': {} - '@babel/types@7.28.1': + '@babel/types@7.28.4': dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 '@bcoe/v8-coverage@1.0.2': {} - '@changesets/apply-release-plan@7.0.12': + '@changesets/apply-release-plan@7.0.13': dependencies: '@changesets/config': 3.1.1 '@changesets/get-version-range-type': 0.4.0 @@ -3689,9 +3715,9 @@ snapshots: dependencies: '@changesets/types': 6.1.0 - '@changesets/cli@2.29.5': + '@changesets/cli@2.29.7(@types/node@22.18.6)': dependencies: - '@changesets/apply-release-plan': 7.0.12 + '@changesets/apply-release-plan': 7.0.13 '@changesets/assemble-release-plan': 6.0.9 '@changesets/changelog-git': 0.2.1 '@changesets/config': 3.1.1 @@ -3705,11 +3731,11 @@ snapshots: '@changesets/should-skip-package': 0.1.2 '@changesets/types': 6.1.0 '@changesets/write': 0.4.0 + '@inquirer/external-editor': 1.0.2(@types/node@22.18.6) '@manypkg/get-packages': 1.1.3 ansi-colors: 4.1.3 ci-info: 3.9.0 enquirer: 2.4.1 - external-editor: 3.1.0 fs-extra: 7.0.1 mri: 1.2.0 p-limit: 2.3.0 @@ -3719,6 +3745,8 @@ snapshots: semver: 7.7.2 spawndamnit: 3.0.1 term-size: 2.2.1 + transitivePeerDependencies: + - '@types/node' '@changesets/config@3.1.1': dependencies: @@ -3811,87 +3839,87 @@ snapshots: tslib: 2.8.1 optional: true - '@esbuild/aix-ppc64@0.25.8': + '@esbuild/aix-ppc64@0.25.10': optional: true - '@esbuild/android-arm64@0.25.8': + '@esbuild/android-arm64@0.25.10': optional: true - '@esbuild/android-arm@0.25.8': + '@esbuild/android-arm@0.25.10': optional: true - '@esbuild/android-x64@0.25.8': + '@esbuild/android-x64@0.25.10': optional: true - '@esbuild/darwin-arm64@0.25.8': + '@esbuild/darwin-arm64@0.25.10': optional: true - '@esbuild/darwin-x64@0.25.8': + '@esbuild/darwin-x64@0.25.10': optional: true - '@esbuild/freebsd-arm64@0.25.8': + '@esbuild/freebsd-arm64@0.25.10': optional: true - '@esbuild/freebsd-x64@0.25.8': + '@esbuild/freebsd-x64@0.25.10': optional: true - '@esbuild/linux-arm64@0.25.8': + '@esbuild/linux-arm64@0.25.10': optional: true - '@esbuild/linux-arm@0.25.8': + '@esbuild/linux-arm@0.25.10': optional: true - '@esbuild/linux-ia32@0.25.8': + '@esbuild/linux-ia32@0.25.10': optional: true - '@esbuild/linux-loong64@0.25.8': + '@esbuild/linux-loong64@0.25.10': optional: true - '@esbuild/linux-mips64el@0.25.8': + '@esbuild/linux-mips64el@0.25.10': optional: true - '@esbuild/linux-ppc64@0.25.8': + '@esbuild/linux-ppc64@0.25.10': optional: true - '@esbuild/linux-riscv64@0.25.8': + '@esbuild/linux-riscv64@0.25.10': optional: true - '@esbuild/linux-s390x@0.25.8': + '@esbuild/linux-s390x@0.25.10': optional: true - '@esbuild/linux-x64@0.25.8': + '@esbuild/linux-x64@0.25.10': optional: true - '@esbuild/netbsd-arm64@0.25.8': + '@esbuild/netbsd-arm64@0.25.10': optional: true - '@esbuild/netbsd-x64@0.25.8': + '@esbuild/netbsd-x64@0.25.10': optional: true - '@esbuild/openbsd-arm64@0.25.8': + '@esbuild/openbsd-arm64@0.25.10': optional: true - '@esbuild/openbsd-x64@0.25.8': + '@esbuild/openbsd-x64@0.25.10': optional: true - '@esbuild/openharmony-arm64@0.25.8': + '@esbuild/openharmony-arm64@0.25.10': optional: true - '@esbuild/sunos-x64@0.25.8': + '@esbuild/sunos-x64@0.25.10': optional: true - '@esbuild/win32-arm64@0.25.8': + '@esbuild/win32-arm64@0.25.10': optional: true - '@esbuild/win32-ia32@0.25.8': + '@esbuild/win32-ia32@0.25.10': optional: true - '@esbuild/win32-x64@0.25.8': + '@esbuild/win32-x64@0.25.10': optional: true - '@eslint-community/eslint-utils@4.7.0(eslint@9.31.0)': + '@eslint-community/eslint-utils@4.9.0(eslint@9.36.0)': dependencies: - eslint: 9.31.0 + eslint: 9.36.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} @@ -3899,21 +3927,21 @@ snapshots: '@eslint/config-array@0.21.0': dependencies: '@eslint/object-schema': 2.1.6 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.3(supports-color@5.5.0) minimatch: 3.1.2 transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.3.0': {} + '@eslint/config-helpers@0.3.1': {} - '@eslint/core@0.15.1': + '@eslint/core@0.15.2': dependencies: '@types/json-schema': 7.0.15 '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.3(supports-color@5.5.0) espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 @@ -3924,26 +3952,24 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.31.0': {} + '@eslint/js@9.36.0': {} '@eslint/object-schema@2.1.6': {} - '@eslint/plugin-kit@0.3.4': + '@eslint/plugin-kit@0.3.5': dependencies: - '@eslint/core': 0.15.1 + '@eslint/core': 0.15.2 levn: 0.4.1 '@humanfs/core@0.19.1': {} - '@humanfs/node@0.16.6': + '@humanfs/node@0.16.7': dependencies: '@humanfs/core': 0.19.1 - '@humanwhocodes/retry': 0.3.1 + '@humanwhocodes/retry': 0.4.3 '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/retry@0.3.1': {} - '@humanwhocodes/retry@0.4.3': {} '@img/colour@1.0.0': @@ -4035,6 +4061,20 @@ snapshots: '@img/sharp-win32-x64@0.34.4': optional: true + '@inquirer/external-editor@1.0.2(@types/node@20.19.17)': + dependencies: + chardet: 2.1.0 + iconv-lite: 0.7.0 + optionalDependencies: + '@types/node': 20.19.17 + + '@inquirer/external-editor@1.0.2(@types/node@22.18.6)': + dependencies: + chardet: 2.1.0 + iconv-lite: 0.7.0 + optionalDependencies: + '@types/node': 22.18.6 + '@isaacs/balanced-match@4.0.1': {} '@isaacs/brace-expansion@5.0.0': @@ -4045,85 +4085,85 @@ snapshots: dependencies: string-width: 5.1.2 string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 strip-ansi-cjs: strip-ansi@6.0.1 wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 '@istanbuljs/schema@0.1.3': {} - '@jridgewell/gen-mapping@0.3.12': + '@jridgewell/gen-mapping@0.3.13': dependencies: - '@jridgewell/sourcemap-codec': 1.5.4 - '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/sourcemap-codec@1.5.4': {} + '@jridgewell/sourcemap-codec@1.5.5': {} - '@jridgewell/trace-mapping@0.3.29': + '@jridgewell/trace-mapping@0.3.31': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.4 + '@jridgewell/sourcemap-codec': 1.5.5 '@jridgewell/trace-mapping@0.3.9': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.4 + '@jridgewell/sourcemap-codec': 1.5.5 '@manypkg/find-root@1.1.0': dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.4 '@types/node': 12.20.55 find-up: 4.1.0 fs-extra: 8.1.0 '@manypkg/get-packages@1.1.3': dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.4 '@changesets/types': 4.1.0 '@manypkg/find-root': 1.1.0 fs-extra: 8.1.0 globby: 11.1.0 read-yaml-file: 1.1.0 - '@next/env@15.4.7': {} + '@next/env@15.5.3': {} - '@next/eslint-plugin-next@15.4.2': + '@next/eslint-plugin-next@15.5.3': dependencies: fast-glob: 3.3.1 - '@next/swc-darwin-arm64@15.4.7': + '@next/swc-darwin-arm64@15.5.3': optional: true - '@next/swc-darwin-x64@15.4.7': + '@next/swc-darwin-x64@15.5.3': optional: true - '@next/swc-linux-arm64-gnu@15.4.7': + '@next/swc-linux-arm64-gnu@15.5.3': optional: true - '@next/swc-linux-arm64-musl@15.4.7': + '@next/swc-linux-arm64-musl@15.5.3': optional: true - '@next/swc-linux-x64-gnu@15.4.7': + '@next/swc-linux-x64-gnu@15.5.3': optional: true - '@next/swc-linux-x64-musl@15.4.7': + '@next/swc-linux-x64-musl@15.5.3': optional: true - '@next/swc-win32-arm64-msvc@15.4.7': + '@next/swc-win32-arm64-msvc@15.5.3': optional: true - '@next/swc-win32-x64-msvc@15.4.7': + '@next/swc-win32-x64-msvc@15.5.3': optional: true '@noble/ciphers@1.3.0': {} - '@noble/curves@1.9.2': + '@noble/curves@1.9.1': dependencies: '@noble/hashes': 1.8.0 - '@noble/curves@1.9.4': + '@noble/curves@1.9.7': dependencies: '@noble/hashes': 1.8.0 @@ -4144,71 +4184,77 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@rollup/rollup-android-arm-eabi@4.45.1': + '@rollup/rollup-android-arm-eabi@4.52.2': optional: true - '@rollup/rollup-android-arm64@4.45.1': + '@rollup/rollup-android-arm64@4.52.2': optional: true - '@rollup/rollup-darwin-arm64@4.45.1': + '@rollup/rollup-darwin-arm64@4.52.2': optional: true - '@rollup/rollup-darwin-x64@4.45.1': + '@rollup/rollup-darwin-x64@4.52.2': optional: true - '@rollup/rollup-freebsd-arm64@4.45.1': + '@rollup/rollup-freebsd-arm64@4.52.2': optional: true - '@rollup/rollup-freebsd-x64@4.45.1': + '@rollup/rollup-freebsd-x64@4.52.2': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.45.1': + '@rollup/rollup-linux-arm-gnueabihf@4.52.2': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.45.1': + '@rollup/rollup-linux-arm-musleabihf@4.52.2': optional: true - '@rollup/rollup-linux-arm64-gnu@4.45.1': + '@rollup/rollup-linux-arm64-gnu@4.52.2': optional: true - '@rollup/rollup-linux-arm64-musl@4.45.1': + '@rollup/rollup-linux-arm64-musl@4.52.2': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.45.1': + '@rollup/rollup-linux-loong64-gnu@4.52.2': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.45.1': + '@rollup/rollup-linux-ppc64-gnu@4.52.2': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.45.1': + '@rollup/rollup-linux-riscv64-gnu@4.52.2': optional: true - '@rollup/rollup-linux-riscv64-musl@4.45.1': + '@rollup/rollup-linux-riscv64-musl@4.52.2': optional: true - '@rollup/rollup-linux-s390x-gnu@4.45.1': + '@rollup/rollup-linux-s390x-gnu@4.52.2': optional: true - '@rollup/rollup-linux-x64-gnu@4.45.1': + '@rollup/rollup-linux-x64-gnu@4.52.2': optional: true - '@rollup/rollup-linux-x64-musl@4.45.1': + '@rollup/rollup-linux-x64-musl@4.52.2': optional: true - '@rollup/rollup-win32-arm64-msvc@4.45.1': + '@rollup/rollup-openharmony-arm64@4.52.2': optional: true - '@rollup/rollup-win32-ia32-msvc@4.45.1': + '@rollup/rollup-win32-arm64-msvc@4.52.2': optional: true - '@rollup/rollup-win32-x64-msvc@4.45.1': + '@rollup/rollup-win32-ia32-msvc@4.52.2': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.52.2': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.52.2': optional: true '@scure/base@1.2.6': {} '@scure/bip32@1.7.0': dependencies: - '@noble/curves': 1.9.4 + '@noble/curves': 1.9.7 '@noble/hashes': 1.8.0 '@scure/base': 1.2.6 @@ -4231,17 +4277,17 @@ snapshots: '@tsconfig/node16@1.0.4': {} - '@turbo/gen@1.13.4(@types/node@20.19.9)(typescript@5.5.4)': + '@turbo/gen@1.13.4(@types/node@20.19.17)(typescript@5.5.4)': dependencies: - '@turbo/workspaces': 1.13.4 + '@turbo/workspaces': 1.13.4(@types/node@20.19.17) chalk: 2.4.2 commander: 10.0.1 fs-extra: 10.1.0 - inquirer: 8.2.6 + inquirer: 8.2.7(@types/node@20.19.17) minimatch: 9.0.5 node-plop: 0.26.3 proxy-agent: 6.5.0 - ts-node: 10.9.2(@types/node@20.19.9)(typescript@5.5.4) + ts-node: 10.9.2(@types/node@20.19.17)(typescript@5.5.4) update-check: 1.5.4 validate-npm-package-name: 5.0.1 transitivePeerDependencies: @@ -4251,7 +4297,7 @@ snapshots: - supports-color - typescript - '@turbo/workspaces@1.13.4': + '@turbo/workspaces@1.13.4(@types/node@20.19.17)': dependencies: chalk: 2.4.2 commander: 10.0.1 @@ -4259,12 +4305,14 @@ snapshots: fast-glob: 3.3.3 fs-extra: 10.1.0 gradient-string: 2.0.2 - inquirer: 8.2.6 + inquirer: 8.2.7(@types/node@20.19.17) js-yaml: 4.1.0 ora: 4.1.1 rimraf: 3.0.2 semver: 7.7.2 update-check: 1.5.4 + transitivePeerDependencies: + - '@types/node' '@types/chai@5.2.2': dependencies: @@ -4277,7 +4325,7 @@ snapshots: '@types/glob@7.2.0': dependencies: '@types/minimatch': 6.0.0 - '@types/node': 22.16.5 + '@types/node': 20.19.17 '@types/inquirer@6.5.0': dependencies: @@ -4292,15 +4340,11 @@ snapshots: '@types/node@12.20.55': {} - '@types/node@20.19.21': + '@types/node@20.19.17': dependencies: undici-types: 6.21.0 - '@types/node@20.19.9': - dependencies: - undici-types: 6.21.0 - - '@types/node@22.16.5': + '@types/node@22.18.6': dependencies: undici-types: 6.21.0 @@ -4326,27 +4370,25 @@ snapshots: '@types/through@0.0.33': dependencies: - '@types/node': 22.16.5 + '@types/node': 20.19.17 '@types/tinycolor2@1.4.6': {} - '@types/whatwg-mimetype@3.0.2': {} - '@types/yargs-parser@21.0.3': {} '@types/yargs@17.0.33': dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@8.38.0(@typescript-eslint/parser@8.38.0(eslint@9.31.0)(typescript@5.8.3))(eslint@9.31.0)(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.44.1(@typescript-eslint/parser@8.44.1(eslint@9.36.0)(typescript@5.8.3))(eslint@9.36.0)(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.38.0(eslint@9.31.0)(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.38.0 - '@typescript-eslint/type-utils': 8.38.0(eslint@9.31.0)(typescript@5.8.3) - '@typescript-eslint/utils': 8.38.0(eslint@9.31.0)(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.38.0 - eslint: 9.31.0 + '@typescript-eslint/parser': 8.44.1(eslint@9.36.0)(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.44.1 + '@typescript-eslint/type-utils': 8.44.1(eslint@9.36.0)(typescript@5.8.3) + '@typescript-eslint/utils': 8.44.1(eslint@9.36.0)(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.44.1 + eslint: 9.36.0 graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 @@ -4355,57 +4397,57 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.38.0(eslint@9.31.0)(typescript@5.8.3)': + '@typescript-eslint/parser@8.44.1(eslint@9.36.0)(typescript@5.8.3)': dependencies: - '@typescript-eslint/scope-manager': 8.38.0 - '@typescript-eslint/types': 8.38.0 - '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.38.0 - debug: 4.4.1(supports-color@5.5.0) - eslint: 9.31.0 + '@typescript-eslint/scope-manager': 8.44.1 + '@typescript-eslint/types': 8.44.1 + '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.44.1 + debug: 4.4.3(supports-color@5.5.0) + eslint: 9.36.0 typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.38.0(typescript@5.8.3)': + '@typescript-eslint/project-service@8.44.1(typescript@5.8.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.38.0(typescript@5.8.3) - '@typescript-eslint/types': 8.38.0 - debug: 4.4.1(supports-color@5.5.0) + '@typescript-eslint/tsconfig-utils': 8.44.1(typescript@5.8.3) + '@typescript-eslint/types': 8.44.1 + debug: 4.4.3(supports-color@5.5.0) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.38.0': + '@typescript-eslint/scope-manager@8.44.1': dependencies: - '@typescript-eslint/types': 8.38.0 - '@typescript-eslint/visitor-keys': 8.38.0 + '@typescript-eslint/types': 8.44.1 + '@typescript-eslint/visitor-keys': 8.44.1 - '@typescript-eslint/tsconfig-utils@8.38.0(typescript@5.8.3)': + '@typescript-eslint/tsconfig-utils@8.44.1(typescript@5.8.3)': dependencies: typescript: 5.8.3 - '@typescript-eslint/type-utils@8.38.0(eslint@9.31.0)(typescript@5.8.3)': + '@typescript-eslint/type-utils@8.44.1(eslint@9.36.0)(typescript@5.8.3)': dependencies: - '@typescript-eslint/types': 8.38.0 - '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.8.3) - '@typescript-eslint/utils': 8.38.0(eslint@9.31.0)(typescript@5.8.3) - debug: 4.4.1(supports-color@5.5.0) - eslint: 9.31.0 + '@typescript-eslint/types': 8.44.1 + '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.8.3) + '@typescript-eslint/utils': 8.44.1(eslint@9.36.0)(typescript@5.8.3) + debug: 4.4.3(supports-color@5.5.0) + eslint: 9.36.0 ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.38.0': {} + '@typescript-eslint/types@8.44.1': {} - '@typescript-eslint/typescript-estree@8.38.0(typescript@5.8.3)': + '@typescript-eslint/typescript-estree@8.44.1(typescript@5.8.3)': dependencies: - '@typescript-eslint/project-service': 8.38.0(typescript@5.8.3) - '@typescript-eslint/tsconfig-utils': 8.38.0(typescript@5.8.3) - '@typescript-eslint/types': 8.38.0 - '@typescript-eslint/visitor-keys': 8.38.0 - debug: 4.4.1(supports-color@5.5.0) + '@typescript-eslint/project-service': 8.44.1(typescript@5.8.3) + '@typescript-eslint/tsconfig-utils': 8.44.1(typescript@5.8.3) + '@typescript-eslint/types': 8.44.1 + '@typescript-eslint/visitor-keys': 8.44.1 + debug: 4.4.3(supports-color@5.5.0) fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 @@ -4415,38 +4457,38 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.38.0(eslint@9.31.0)(typescript@5.8.3)': + '@typescript-eslint/utils@8.44.1(eslint@9.36.0)(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.31.0) - '@typescript-eslint/scope-manager': 8.38.0 - '@typescript-eslint/types': 8.38.0 - '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.8.3) - eslint: 9.31.0 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0) + '@typescript-eslint/scope-manager': 8.44.1 + '@typescript-eslint/types': 8.44.1 + '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.8.3) + eslint: 9.36.0 typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.38.0': + '@typescript-eslint/visitor-keys@8.44.1': dependencies: - '@typescript-eslint/types': 8.38.0 + '@typescript-eslint/types': 8.44.1 eslint-visitor-keys: 4.2.1 - '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/node@22.16.5)(happy-dom@20.0.2))': + '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/node@22.18.6)(happy-dom@17.6.3))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 - ast-v8-to-istanbul: 0.3.3 - debug: 4.4.1(supports-color@5.5.0) + ast-v8-to-istanbul: 0.3.5 + debug: 4.4.3(supports-color@5.5.0) istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 5.0.6 - istanbul-reports: 3.1.7 - magic-string: 0.30.17 + istanbul-reports: 3.2.0 + magic-string: 0.30.19 magicast: 0.3.5 std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/node@22.16.5)(happy-dom@20.0.2) + vitest: 3.2.4(@types/node@22.18.6)(happy-dom@17.6.3) transitivePeerDependencies: - supports-color @@ -4455,16 +4497,16 @@ snapshots: '@types/chai': 5.2.2 '@vitest/spy': 3.2.4 '@vitest/utils': 3.2.4 - chai: 5.2.1 + chai: 5.3.3 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@7.0.5(@types/node@22.16.5))': + '@vitest/mocker@3.2.4(vite@7.1.7(@types/node@22.18.6))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 - magic-string: 0.30.17 + magic-string: 0.30.19 optionalDependencies: - vite: 7.0.5(@types/node@22.16.5) + vite: 7.1.7(@types/node@22.18.6) '@vitest/pretty-format@3.2.4': dependencies: @@ -4479,20 +4521,24 @@ snapshots: '@vitest/snapshot@3.2.4': dependencies: '@vitest/pretty-format': 3.2.4 - magic-string: 0.30.17 + magic-string: 0.30.19 pathe: 2.0.3 '@vitest/spy@3.2.4': dependencies: - tinyspy: 4.0.3 + tinyspy: 4.0.4 '@vitest/utils@3.2.4': dependencies: '@vitest/pretty-format': 3.2.4 - loupe: 3.1.4 + loupe: 3.2.1 tinyrainbow: 2.0.0 - abitype@1.0.8(typescript@5.8.3): + abitype@1.1.0(typescript@5.8.3): + optionalDependencies: + typescript: 5.8.3 + + abitype@1.1.1(typescript@5.8.3): optionalDependencies: typescript: 5.8.3 @@ -4528,7 +4574,7 @@ snapshots: ansi-regex@5.0.1: {} - ansi-regex@6.1.0: {} + ansi-regex@6.2.2: {} ansi-styles@3.2.1: dependencies: @@ -4538,7 +4584,7 @@ snapshots: dependencies: color-convert: 2.0.1 - ansi-styles@6.2.1: {} + ansi-styles@6.2.3: {} anymatch@3.1.3: dependencies: @@ -4624,9 +4670,9 @@ snapshots: dependencies: tslib: 2.8.1 - ast-v8-to-istanbul@0.3.3: + ast-v8-to-istanbul@0.3.5: dependencies: - '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/trace-mapping': 0.3.31 estree-walker: 3.0.3 js-tokens: 9.0.1 @@ -4704,12 +4750,12 @@ snapshots: cbor2@1.12.0: {} - chai@5.2.1: + chai@5.3.3: dependencies: assertion-error: 2.0.1 check-error: 2.1.1 deep-eql: 5.0.2 - loupe: 3.1.4 + loupe: 3.2.1 pathval: 2.0.1 chalk@2.4.2: @@ -4751,6 +4797,8 @@ snapshots: chardet@0.7.0: {} + chardet@2.1.0: {} + check-error@2.1.1: {} chokidar@3.6.0: @@ -4820,7 +4868,7 @@ snapshots: snake-case: 2.1.0 upper-case: 1.1.3 - core-js-pure@3.44.0: {} + core-js-pure@3.45.1: {} create-require@1.1.1: {} @@ -4854,9 +4902,9 @@ snapshots: date-fns@2.30.0: dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.4 - debug@4.4.1(supports-color@5.5.0): + debug@4.4.3(supports-color@5.5.0): dependencies: ms: 2.1.3 optionalDependencies: @@ -5044,34 +5092,34 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - esbuild@0.25.8: + esbuild@0.25.10: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.8 - '@esbuild/android-arm': 0.25.8 - '@esbuild/android-arm64': 0.25.8 - '@esbuild/android-x64': 0.25.8 - '@esbuild/darwin-arm64': 0.25.8 - '@esbuild/darwin-x64': 0.25.8 - '@esbuild/freebsd-arm64': 0.25.8 - '@esbuild/freebsd-x64': 0.25.8 - '@esbuild/linux-arm': 0.25.8 - '@esbuild/linux-arm64': 0.25.8 - '@esbuild/linux-ia32': 0.25.8 - '@esbuild/linux-loong64': 0.25.8 - '@esbuild/linux-mips64el': 0.25.8 - '@esbuild/linux-ppc64': 0.25.8 - '@esbuild/linux-riscv64': 0.25.8 - '@esbuild/linux-s390x': 0.25.8 - '@esbuild/linux-x64': 0.25.8 - '@esbuild/netbsd-arm64': 0.25.8 - '@esbuild/netbsd-x64': 0.25.8 - '@esbuild/openbsd-arm64': 0.25.8 - '@esbuild/openbsd-x64': 0.25.8 - '@esbuild/openharmony-arm64': 0.25.8 - '@esbuild/sunos-x64': 0.25.8 - '@esbuild/win32-arm64': 0.25.8 - '@esbuild/win32-ia32': 0.25.8 - '@esbuild/win32-x64': 0.25.8 + '@esbuild/aix-ppc64': 0.25.10 + '@esbuild/android-arm': 0.25.10 + '@esbuild/android-arm64': 0.25.10 + '@esbuild/android-x64': 0.25.10 + '@esbuild/darwin-arm64': 0.25.10 + '@esbuild/darwin-x64': 0.25.10 + '@esbuild/freebsd-arm64': 0.25.10 + '@esbuild/freebsd-x64': 0.25.10 + '@esbuild/linux-arm': 0.25.10 + '@esbuild/linux-arm64': 0.25.10 + '@esbuild/linux-ia32': 0.25.10 + '@esbuild/linux-loong64': 0.25.10 + '@esbuild/linux-mips64el': 0.25.10 + '@esbuild/linux-ppc64': 0.25.10 + '@esbuild/linux-riscv64': 0.25.10 + '@esbuild/linux-s390x': 0.25.10 + '@esbuild/linux-x64': 0.25.10 + '@esbuild/netbsd-arm64': 0.25.10 + '@esbuild/netbsd-x64': 0.25.10 + '@esbuild/openbsd-arm64': 0.25.10 + '@esbuild/openbsd-x64': 0.25.10 + '@esbuild/openharmony-arm64': 0.25.10 + '@esbuild/sunos-x64': 0.25.10 + '@esbuild/win32-arm64': 0.25.10 + '@esbuild/win32-ia32': 0.25.10 + '@esbuild/win32-x64': 0.25.10 escalade@3.2.0: {} @@ -5087,17 +5135,17 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-prettier@9.1.2(eslint@9.31.0): + eslint-config-prettier@9.1.2(eslint@9.36.0): dependencies: - eslint: 9.31.0 + eslint: 9.36.0 eslint-plugin-only-warn@1.1.0: {} - eslint-plugin-react-hooks@5.2.0(eslint@9.31.0): + eslint-plugin-react-hooks@5.2.0(eslint@9.36.0): dependencies: - eslint: 9.31.0 + eslint: 9.36.0 - eslint-plugin-react@7.37.5(eslint@9.31.0): + eslint-plugin-react@7.37.5(eslint@9.36.0): dependencies: array-includes: 3.1.9 array.prototype.findlast: 1.2.5 @@ -5105,7 +5153,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.31.0 + eslint: 9.36.0 estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -5119,11 +5167,11 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-turbo@2.5.5(eslint@9.31.0)(turbo@2.5.5): + eslint-plugin-turbo@2.5.6(eslint@9.36.0)(turbo@2.5.6): dependencies: dotenv: 16.0.3 - eslint: 9.31.0 - turbo: 2.5.5 + eslint: 9.36.0 + turbo: 2.5.6 eslint-scope@8.4.0: dependencies: @@ -5134,17 +5182,17 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.31.0: + eslint@9.36.0: dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.31.0) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.21.0 - '@eslint/config-helpers': 0.3.0 - '@eslint/core': 0.15.1 + '@eslint/config-helpers': 0.3.1 + '@eslint/core': 0.15.2 '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.31.0 - '@eslint/plugin-kit': 0.3.4 - '@humanfs/node': 0.16.6 + '@eslint/js': 9.36.0 + '@eslint/plugin-kit': 0.3.5 + '@humanfs/node': 0.16.7 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 '@types/estree': 1.0.8 @@ -5152,7 +5200,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.3(supports-color@5.5.0) escape-string-regexp: 4.0.0 eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 @@ -5222,7 +5270,7 @@ snapshots: iconv-lite: 0.4.24 tmp: 0.0.33 - fake-indexeddb@6.0.1: {} + fake-indexeddb@6.2.2: {} fast-deep-equal@3.1.3: {} @@ -5250,7 +5298,7 @@ snapshots: dependencies: reusify: 1.1.0 - fdir@6.4.6(picomatch@4.0.3): + fdir@6.5.0(picomatch@4.0.3): optionalDependencies: picomatch: 4.0.3 @@ -5295,7 +5343,7 @@ snapshots: fs-extra@10.1.0: dependencies: graceful-fs: 4.2.11 - jsonfile: 6.1.0 + jsonfile: 6.2.0 universalify: 2.0.1 fs-extra@7.0.1: @@ -5360,7 +5408,7 @@ snapshots: dependencies: basic-ftp: 5.0.5 data-uri-to-buffer: 6.0.2 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.3(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -5448,10 +5496,9 @@ snapshots: optionalDependencies: uglify-js: 3.19.3 - happy-dom@20.0.2: + happy-dom@17.6.3: dependencies: - '@types/node': 20.19.21 - '@types/whatwg-mimetype': 3.0.2 + webidl-conversions: 7.0.0 whatwg-mimetype: 3.0.0 has-bigints@1.1.0: {} @@ -5488,14 +5535,14 @@ snapshots: http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.4 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.3(supports-color@5.5.0) transitivePeerDependencies: - supports-color https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.4 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.3(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -5507,6 +5554,10 @@ snapshots: dependencies: safer-buffer: 2.1.2 + iconv-lite@0.7.0: + dependencies: + safer-buffer: 2.1.2 + idb@7.1.1: {} ieee754@1.2.1: {} @@ -5551,13 +5602,13 @@ snapshots: strip-ansi: 6.0.1 through: 2.3.8 - inquirer@8.2.6: + inquirer@8.2.7(@types/node@20.19.17): dependencies: + '@inquirer/external-editor': 1.0.2(@types/node@20.19.17) ansi-escapes: 4.3.2 chalk: 4.1.2 cli-cursor: 3.1.0 cli-width: 3.0.0 - external-editor: 3.1.0 figures: 3.2.0 lodash: 4.17.21 mute-stream: 0.0.8 @@ -5568,6 +5619,8 @@ snapshots: strip-ansi: 6.0.1 through: 2.3.8 wrap-ansi: 6.2.0 + transitivePeerDependencies: + - '@types/node' internal-slot@1.1.0: dependencies: @@ -5575,10 +5628,7 @@ snapshots: hasown: 2.0.2 side-channel: 1.1.0 - ip-address@9.0.5: - dependencies: - jsbn: 1.1.0 - sprintf-js: 1.1.3 + ip-address@10.0.1: {} is-array-buffer@3.0.5: dependencies: @@ -5723,9 +5773,9 @@ snapshots: isexe@2.0.0: {} - isows@1.0.7(ws@8.18.2): + isows@1.0.7(ws@8.18.3): dependencies: - ws: 8.18.2 + ws: 8.18.3 istanbul-lib-coverage@3.2.2: {} @@ -5737,13 +5787,13 @@ snapshots: istanbul-lib-source-maps@5.0.6: dependencies: - '@jridgewell/trace-mapping': 0.3.29 - debug: 4.4.1(supports-color@5.5.0) + '@jridgewell/trace-mapping': 0.3.31 + debug: 4.4.3(supports-color@5.5.0) istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: - supports-color - istanbul-reports@3.1.7: + istanbul-reports@3.2.0: dependencies: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 @@ -5780,8 +5830,6 @@ snapshots: dependencies: argparse: 2.0.1 - jsbn@1.1.0: {} - json-buffer@3.0.1: {} json-canonicalize@2.0.0: {} @@ -5794,7 +5842,7 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 - jsonfile@6.1.0: + jsonfile@6.2.0: dependencies: universalify: 2.0.1 optionalDependencies: @@ -5813,48 +5861,48 @@ snapshots: dependencies: json-buffer: 3.0.1 - lefthook-darwin-arm64@1.12.2: + lefthook-darwin-arm64@1.13.3: optional: true - lefthook-darwin-x64@1.12.2: + lefthook-darwin-x64@1.13.3: optional: true - lefthook-freebsd-arm64@1.12.2: + lefthook-freebsd-arm64@1.13.3: optional: true - lefthook-freebsd-x64@1.12.2: + lefthook-freebsd-x64@1.13.3: optional: true - lefthook-linux-arm64@1.12.2: + lefthook-linux-arm64@1.13.3: optional: true - lefthook-linux-x64@1.12.2: + lefthook-linux-x64@1.13.3: optional: true - lefthook-openbsd-arm64@1.12.2: + lefthook-openbsd-arm64@1.13.3: optional: true - lefthook-openbsd-x64@1.12.2: + lefthook-openbsd-x64@1.13.3: optional: true - lefthook-windows-arm64@1.12.2: + lefthook-windows-arm64@1.13.3: optional: true - lefthook-windows-x64@1.12.2: + lefthook-windows-x64@1.13.3: optional: true - lefthook@1.12.2: + lefthook@1.13.3: optionalDependencies: - lefthook-darwin-arm64: 1.12.2 - lefthook-darwin-x64: 1.12.2 - lefthook-freebsd-arm64: 1.12.2 - lefthook-freebsd-x64: 1.12.2 - lefthook-linux-arm64: 1.12.2 - lefthook-linux-x64: 1.12.2 - lefthook-openbsd-arm64: 1.12.2 - lefthook-openbsd-x64: 1.12.2 - lefthook-windows-arm64: 1.12.2 - lefthook-windows-x64: 1.12.2 + lefthook-darwin-arm64: 1.13.3 + lefthook-darwin-x64: 1.13.3 + lefthook-freebsd-arm64: 1.13.3 + lefthook-freebsd-x64: 1.13.3 + lefthook-linux-arm64: 1.13.3 + lefthook-linux-x64: 1.13.3 + lefthook-openbsd-arm64: 1.13.3 + lefthook-openbsd-x64: 1.13.3 + lefthook-windows-arm64: 1.13.3 + lefthook-windows-x64: 1.13.3 levn@0.4.1: dependencies: @@ -5890,7 +5938,7 @@ snapshots: dependencies: js-tokens: 4.0.0 - loupe@3.1.4: {} + loupe@3.2.1: {} lower-case-first@1.0.2: dependencies: @@ -5900,18 +5948,18 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@11.1.0: {} + lru-cache@11.2.1: {} lru-cache@7.18.3: {} - magic-string@0.30.17: + magic-string@0.30.19: dependencies: - '@jridgewell/sourcemap-codec': 1.5.4 + '@jridgewell/sourcemap-codec': 1.5.5 magicast@0.3.5: dependencies: - '@babel/parser': 7.28.0 - '@babel/types': 7.28.1 + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 source-map-js: 1.2.1 make-dir@4.0.0: @@ -5971,24 +6019,24 @@ snapshots: netmask@2.0.2: {} - next@15.4.7(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + next@15.5.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: - '@next/env': 15.4.7 + '@next/env': 15.5.3 '@swc/helpers': 0.5.15 caniuse-lite: 1.0.30001743 postcss: 8.4.31 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - styled-jsx: 5.1.6(react@19.1.0) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + styled-jsx: 5.1.6(react@19.1.1) optionalDependencies: - '@next/swc-darwin-arm64': 15.4.7 - '@next/swc-darwin-x64': 15.4.7 - '@next/swc-linux-arm64-gnu': 15.4.7 - '@next/swc-linux-arm64-musl': 15.4.7 - '@next/swc-linux-x64-gnu': 15.4.7 - '@next/swc-linux-x64-musl': 15.4.7 - '@next/swc-win32-arm64-msvc': 15.4.7 - '@next/swc-win32-x64-msvc': 15.4.7 + '@next/swc-darwin-arm64': 15.5.3 + '@next/swc-darwin-x64': 15.5.3 + '@next/swc-linux-arm64-gnu': 15.5.3 + '@next/swc-linux-arm64-musl': 15.5.3 + '@next/swc-linux-x64-gnu': 15.5.3 + '@next/swc-linux-x64-musl': 15.5.3 + '@next/swc-win32-arm64-msvc': 15.5.3 + '@next/swc-win32-x64-msvc': 15.5.3 sharp: 0.34.4 transitivePeerDependencies: - '@babel/core' @@ -6000,7 +6048,7 @@ snapshots: node-plop@0.26.3: dependencies: - '@babel/runtime-corejs3': 7.28.0 + '@babel/runtime-corejs3': 7.28.4 '@types/inquirer': 6.5.0 change-case: 3.1.0 del: 5.1.0 @@ -6015,7 +6063,7 @@ snapshots: nodemon@3.1.10: dependencies: chokidar: 3.6.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.3(supports-color@5.5.0) ignore-by-default: 1.0.1 minimatch: 3.1.2 pstree.remy: 1.1.8 @@ -6119,28 +6167,28 @@ snapshots: ox@0.7.2(typescript@5.8.3): dependencies: - '@adraffy/ens-normalize': 1.11.0 + '@adraffy/ens-normalize': 1.11.1 '@noble/ciphers': 1.3.0 - '@noble/curves': 1.9.4 + '@noble/curves': 1.9.7 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.0.8(typescript@5.8.3) + abitype: 1.1.1(typescript@5.8.3) eventemitter3: 5.0.1 optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: - zod - ox@0.8.1(typescript@5.8.3): + ox@0.9.6(typescript@5.8.3): dependencies: - '@adraffy/ens-normalize': 1.11.0 + '@adraffy/ens-normalize': 1.11.1 '@noble/ciphers': 1.3.0 - '@noble/curves': 1.9.2 + '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.0.8(typescript@5.8.3) + abitype: 1.1.0(typescript@5.8.3) eventemitter3: 5.0.1 optionalDependencies: typescript: 5.8.3 @@ -6179,7 +6227,7 @@ snapshots: dependencies: '@tootallnate/quickjs-emscripten': 0.23.0 agent-base: 7.1.4 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.3(supports-color@5.5.0) get-uri: 6.0.5 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 @@ -6197,7 +6245,7 @@ snapshots: package-manager-detector@0.2.11: dependencies: - quansync: 0.2.10 + quansync: 0.2.11 param-case@2.1.1: dependencies: @@ -6231,7 +6279,7 @@ snapshots: path-scurry@2.0.0: dependencies: - lru-cache: 11.1.0 + lru-cache: 11.2.1 minipass: 7.1.2 path-type@4.0.0: {} @@ -6286,7 +6334,7 @@ snapshots: proxy-agent@6.5.0: dependencies: agent-base: 7.1.4 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.3(supports-color@5.5.0) http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 lru-cache: 7.18.3 @@ -6308,7 +6356,7 @@ snapshots: pvutils@1.1.3: {} - quansync@0.2.10: {} + quansync@0.2.11: {} queue-microtask@1.2.3: {} @@ -6319,14 +6367,14 @@ snapshots: minimist: 1.2.8 strip-json-comments: 2.0.1 - react-dom@19.1.0(react@19.1.0): + react-dom@19.1.1(react@19.1.1): dependencies: - react: 19.1.0 + react: 19.1.1 scheduler: 0.26.0 react-is@16.13.1: {} - react@19.1.0: {} + react@19.1.1: {} read-yaml-file@1.1.0: dependencies: @@ -6408,30 +6456,32 @@ snapshots: glob: 11.0.3 package-json-from-dist: 1.0.1 - rollup@4.45.1: + rollup@4.52.2: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.45.1 - '@rollup/rollup-android-arm64': 4.45.1 - '@rollup/rollup-darwin-arm64': 4.45.1 - '@rollup/rollup-darwin-x64': 4.45.1 - '@rollup/rollup-freebsd-arm64': 4.45.1 - '@rollup/rollup-freebsd-x64': 4.45.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.45.1 - '@rollup/rollup-linux-arm-musleabihf': 4.45.1 - '@rollup/rollup-linux-arm64-gnu': 4.45.1 - '@rollup/rollup-linux-arm64-musl': 4.45.1 - '@rollup/rollup-linux-loongarch64-gnu': 4.45.1 - '@rollup/rollup-linux-powerpc64le-gnu': 4.45.1 - '@rollup/rollup-linux-riscv64-gnu': 4.45.1 - '@rollup/rollup-linux-riscv64-musl': 4.45.1 - '@rollup/rollup-linux-s390x-gnu': 4.45.1 - '@rollup/rollup-linux-x64-gnu': 4.45.1 - '@rollup/rollup-linux-x64-musl': 4.45.1 - '@rollup/rollup-win32-arm64-msvc': 4.45.1 - '@rollup/rollup-win32-ia32-msvc': 4.45.1 - '@rollup/rollup-win32-x64-msvc': 4.45.1 + '@rollup/rollup-android-arm-eabi': 4.52.2 + '@rollup/rollup-android-arm64': 4.52.2 + '@rollup/rollup-darwin-arm64': 4.52.2 + '@rollup/rollup-darwin-x64': 4.52.2 + '@rollup/rollup-freebsd-arm64': 4.52.2 + '@rollup/rollup-freebsd-x64': 4.52.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.52.2 + '@rollup/rollup-linux-arm-musleabihf': 4.52.2 + '@rollup/rollup-linux-arm64-gnu': 4.52.2 + '@rollup/rollup-linux-arm64-musl': 4.52.2 + '@rollup/rollup-linux-loong64-gnu': 4.52.2 + '@rollup/rollup-linux-ppc64-gnu': 4.52.2 + '@rollup/rollup-linux-riscv64-gnu': 4.52.2 + '@rollup/rollup-linux-riscv64-musl': 4.52.2 + '@rollup/rollup-linux-s390x-gnu': 4.52.2 + '@rollup/rollup-linux-x64-gnu': 4.52.2 + '@rollup/rollup-linux-x64-musl': 4.52.2 + '@rollup/rollup-openharmony-arm64': 4.52.2 + '@rollup/rollup-win32-arm64-msvc': 4.52.2 + '@rollup/rollup-win32-ia32-msvc': 4.52.2 + '@rollup/rollup-win32-x64-gnu': 4.52.2 + '@rollup/rollup-win32-x64-msvc': 4.52.2 fsevents: 2.3.3 run-async@2.4.1: {} @@ -6591,14 +6641,14 @@ snapshots: socks-proxy-agent@8.0.5: dependencies: agent-base: 7.1.4 - debug: 4.4.1(supports-color@5.5.0) - socks: 2.8.6 + debug: 4.4.3(supports-color@5.5.0) + socks: 2.8.7 transitivePeerDependencies: - supports-color - socks@2.8.6: + socks@2.8.7: dependencies: - ip-address: 9.0.5 + ip-address: 10.0.1 smart-buffer: 4.2.0 source-map-js@1.2.1: {} @@ -6614,8 +6664,6 @@ snapshots: sprintf-js@1.0.3: {} - sprintf-js@1.1.3: {} - stackback@0.0.2: {} std-env@3.9.0: {} @@ -6635,7 +6683,7 @@ snapshots: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 string.prototype.matchall@4.0.12: dependencies: @@ -6689,9 +6737,9 @@ snapshots: dependencies: ansi-regex: 5.0.1 - strip-ansi@7.1.0: + strip-ansi@7.1.2: dependencies: - ansi-regex: 6.1.0 + ansi-regex: 6.2.2 strip-bom@3.0.0: {} @@ -6705,10 +6753,10 @@ snapshots: dependencies: js-tokens: 9.0.1 - styled-jsx@5.1.6(react@19.1.0): + styled-jsx@5.1.6(react@19.1.1): dependencies: client-only: 0.0.1 - react: 19.1.0 + react: 19.1.1 supports-color@5.5.0: dependencies: @@ -6745,9 +6793,9 @@ snapshots: tinyexec@0.3.2: {} - tinyglobby@0.2.14: + tinyglobby@0.2.15: dependencies: - fdir: 6.4.6(picomatch@4.0.3) + fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 tinygradient@1.1.5: @@ -6759,7 +6807,7 @@ snapshots: tinyrainbow@2.0.0: {} - tinyspy@4.0.3: {} + tinyspy@4.0.4: {} title-case@2.1.1: dependencies: @@ -6782,14 +6830,14 @@ snapshots: dependencies: typescript: 5.8.3 - ts-node@10.9.2(@types/node@20.19.9)(typescript@5.5.4): + ts-node@10.9.2(@types/node@20.19.17)(typescript@5.5.4): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.19.9 + '@types/node': 20.19.17 acorn: 8.15.0 acorn-walk: 8.3.4 arg: 4.1.3 @@ -6804,32 +6852,32 @@ snapshots: tslib@2.8.1: {} - turbo-darwin-64@2.5.5: + turbo-darwin-64@2.5.6: optional: true - turbo-darwin-arm64@2.5.5: + turbo-darwin-arm64@2.5.6: optional: true - turbo-linux-64@2.5.5: + turbo-linux-64@2.5.6: optional: true - turbo-linux-arm64@2.5.5: + turbo-linux-arm64@2.5.6: optional: true - turbo-windows-64@2.5.5: + turbo-windows-64@2.5.6: optional: true - turbo-windows-arm64@2.5.5: + turbo-windows-arm64@2.5.6: optional: true - turbo@2.5.5: + turbo@2.5.6: optionalDependencies: - turbo-darwin-64: 2.5.5 - turbo-darwin-arm64: 2.5.5 - turbo-linux-64: 2.5.5 - turbo-linux-arm64: 2.5.5 - turbo-windows-64: 2.5.5 - turbo-windows-arm64: 2.5.5 + turbo-darwin-64: 2.5.6 + turbo-darwin-arm64: 2.5.6 + turbo-linux-64: 2.5.6 + turbo-linux-arm64: 2.5.6 + turbo-windows-64: 2.5.6 + turbo-windows-arm64: 2.5.6 type-check@0.4.0: dependencies: @@ -6870,13 +6918,13 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.38.0(eslint@9.31.0)(typescript@5.8.3): + typescript-eslint@8.44.1(eslint@9.36.0)(typescript@5.8.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.38.0(@typescript-eslint/parser@8.38.0(eslint@9.31.0)(typescript@5.8.3))(eslint@9.31.0)(typescript@5.8.3) - '@typescript-eslint/parser': 8.38.0(eslint@9.31.0)(typescript@5.8.3) - '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.8.3) - '@typescript-eslint/utils': 8.38.0(eslint@9.31.0)(typescript@5.8.3) - eslint: 9.31.0 + '@typescript-eslint/eslint-plugin': 8.44.1(@typescript-eslint/parser@8.44.1(eslint@9.36.0)(typescript@5.8.3))(eslint@9.36.0)(typescript@5.8.3) + '@typescript-eslint/parser': 8.44.1(eslint@9.36.0)(typescript@5.8.3) + '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.8.3) + '@typescript-eslint/utils': 8.44.1(eslint@9.36.0)(typescript@5.8.3) + eslint: 9.36.0 typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -6926,16 +6974,16 @@ snapshots: validate-npm-package-name@5.0.1: {} - viem@2.33.0(typescript@5.8.3): + viem@2.37.8(typescript@5.8.3): dependencies: - '@noble/curves': 1.9.2 + '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.0.8(typescript@5.8.3) - isows: 1.0.7(ws@8.18.2) - ox: 0.8.1(typescript@5.8.3) - ws: 8.18.2 + abitype: 1.1.0(typescript@5.8.3) + isows: 1.0.7(ws@8.18.3) + ox: 0.9.6(typescript@5.8.3) + ws: 8.18.3 optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -6943,13 +6991,13 @@ snapshots: - utf-8-validate - zod - vite-node@3.2.4(@types/node@22.16.5): + vite-node@3.2.4(@types/node@22.18.6): dependencies: cac: 6.7.14 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.3(supports-color@5.5.0) es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.0.5(@types/node@22.16.5) + vite: 7.1.7(@types/node@22.18.6) transitivePeerDependencies: - '@types/node' - jiti @@ -6964,46 +7012,46 @@ snapshots: - tsx - yaml - vite@7.0.5(@types/node@22.16.5): + vite@7.1.7(@types/node@22.18.6): dependencies: - esbuild: 0.25.8 - fdir: 6.4.6(picomatch@4.0.3) + esbuild: 0.25.10 + fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.45.1 - tinyglobby: 0.2.14 + rollup: 4.52.2 + tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 22.16.5 + '@types/node': 22.18.6 fsevents: 2.3.3 - vitest@3.2.4(@types/node@22.16.5)(happy-dom@20.0.2): + vitest@3.2.4(@types/node@22.18.6)(happy-dom@17.6.3): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.0.5(@types/node@22.16.5)) + '@vitest/mocker': 3.2.4(vite@7.1.7(@types/node@22.18.6)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 '@vitest/spy': 3.2.4 '@vitest/utils': 3.2.4 - chai: 5.2.1 - debug: 4.4.1(supports-color@5.5.0) + chai: 5.3.3 + debug: 4.4.3(supports-color@5.5.0) expect-type: 1.2.2 - magic-string: 0.30.17 + magic-string: 0.30.19 pathe: 2.0.3 picomatch: 4.0.3 std-env: 3.9.0 tinybench: 2.9.0 tinyexec: 0.3.2 - tinyglobby: 0.2.14 + tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.0.5(@types/node@22.16.5) - vite-node: 3.2.4(@types/node@22.16.5) + vite: 7.1.7(@types/node@22.18.6) + vite-node: 3.2.4(@types/node@22.18.6) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.16.5 - happy-dom: 20.0.2 + '@types/node': 22.18.6 + happy-dom: 17.6.3 transitivePeerDependencies: - jiti - less @@ -7022,6 +7070,8 @@ snapshots: dependencies: defaults: 1.0.4 + webidl-conversions@7.0.0: {} + whatwg-mimetype@3.0.0: {} which-boxed-primitive@1.1.1: @@ -7092,13 +7142,13 @@ snapshots: wrap-ansi@8.1.0: dependencies: - ansi-styles: 6.2.1 + ansi-styles: 6.2.3 string-width: 5.1.2 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 wrappy@1.0.2: {} - ws@8.18.2: {} + ws@8.18.3: {} y18n@5.0.8: {} From d82371d64e12196c16c931c8ba3c759ce726e100 Mon Sep 17 00:00:00 2001 From: Tolgahan Arikan Date: Tue, 23 Sep 2025 21:38:44 +0300 Subject: [PATCH 044/119] Fix check for explicit session for the updated type in dapp-client --- packages/wallet/dapp-client/src/ChainSessionManager.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/wallet/dapp-client/src/ChainSessionManager.ts b/packages/wallet/dapp-client/src/ChainSessionManager.ts index 623fc1faa2..14fbdc329c 100644 --- a/packages/wallet/dapp-client/src/ChainSessionManager.ts +++ b/packages/wallet/dapp-client/src/ChainSessionManager.ts @@ -537,7 +537,7 @@ export class ChainSessionManager { ) } - if (savedRequest && savedPayload && savedPayload.session) { + if (savedRequest && savedPayload && savedPayload.session?.permissions) { await this._initializeExplicitSessionInternal(tempPk, loginMethod, userEmail, guard, true) await this.sequenceStorage.saveExplicitSession({ pk: tempPk, From b6563d16c2f6d805a3df6c0e73944e9fa716f0ad Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Wed, 24 Sep 2025 11:48:41 +0200 Subject: [PATCH 045/119] Update api.gen.ts and relayer.gen.ts --- packages/services/api/src/api.gen.ts | 3779 +++++++---------- .../relayer/src/rpc-relayer/relayer.gen.ts | 1365 +++--- 2 files changed, 2256 insertions(+), 2888 deletions(-) diff --git a/packages/services/api/src/api.gen.ts b/packages/services/api/src/api.gen.ts index 967fad8fe2..a42d143d6d 100644 --- a/packages/services/api/src/api.gen.ts +++ b/packages/services/api/src/api.gen.ts @@ -5,74 +5,75 @@ // // webrpc-gen -schema=api.ridl -target=typescript -client -out=./clients/api.gen.ts -export const WebrpcHeader = 'Webrpc' +export const WebrpcHeader = "Webrpc" -export const WebrpcHeaderValue = 'webrpc@v0.25.3;gen-typescript@v0.17.0;sequence-api@v0.4.0' +export const WebrpcHeaderValue = "webrpc@v0.25.3;gen-typescript@v0.17.0;sequence-api@v0.4.0" // WebRPC description and code-gen version -export const WebRPCVersion = 'v1' +export const WebRPCVersion = "v1" // Schema version of your RIDL schema -export const WebRPCSchemaVersion = 'v0.4.0' +export const WebRPCSchemaVersion = "v0.4.0" // Schema hash generated from your RIDL schema -export const WebRPCSchemaHash = 'd43a5aac616814072c69e63f2f81fe65ea10a7e0' +export const WebRPCSchemaHash = "d43a5aac616814072c69e63f2f81fe65ea10a7e0" type WebrpcGenVersions = { - webrpcGenVersion: string - codeGenName: string - codeGenVersion: string - schemaName: string - schemaVersion: string -} + webrpcGenVersion: string; + codeGenName: string; + codeGenVersion: string; + schemaName: string; + schemaVersion: string; +}; export function VersionFromHeader(headers: Headers): WebrpcGenVersions { - const headerValue = headers.get(WebrpcHeader) + const headerValue = headers.get(WebrpcHeader); if (!headerValue) { return { - webrpcGenVersion: '', - codeGenName: '', - codeGenVersion: '', - schemaName: '', - schemaVersion: '', - } + webrpcGenVersion: "", + codeGenName: "", + codeGenVersion: "", + schemaName: "", + schemaVersion: "", + }; } - return parseWebrpcGenVersions(headerValue) + return parseWebrpcGenVersions(headerValue); } function parseWebrpcGenVersions(header: string): WebrpcGenVersions { - const versions = header.split(';') + const versions = header.split(";"); if (versions.length < 3) { return { - webrpcGenVersion: '', - codeGenName: '', - codeGenVersion: '', - schemaName: '', - schemaVersion: '', - } + webrpcGenVersion: "", + codeGenName: "", + codeGenVersion: "", + schemaName: "", + schemaVersion: "", + }; } - const [_, webrpcGenVersion] = versions[0]!.split('@') - const [codeGenName, codeGenVersion] = versions[1]!.split('@') - const [schemaName, schemaVersion] = versions[2]!.split('@') + const [_, webrpcGenVersion] = versions[0]!.split("@"); + const [codeGenName, codeGenVersion] = versions[1]!.split("@"); + const [schemaName, schemaVersion] = versions[2]!.split("@"); return { - webrpcGenVersion: webrpcGenVersion ?? '', - codeGenName: codeGenName ?? '', - codeGenVersion: codeGenVersion ?? '', - schemaName: schemaName ?? '', - schemaVersion: schemaVersion ?? '', - } + webrpcGenVersion: webrpcGenVersion ?? "", + codeGenName: codeGenName ?? "", + codeGenVersion: codeGenVersion ?? "", + schemaName: schemaName ?? "", + schemaVersion: schemaVersion ?? "", + }; } // // Types // + export enum SortOrder { DESC = 'DESC', - ASC = 'ASC', + ASC = 'ASC' } export enum SardinePaymentType { @@ -81,57 +82,57 @@ export enum SardinePaymentType { credit = 'credit', us_debit = 'us_debit', international_debit = 'international_debit', - international_credit = 'international_credit', + international_credit = 'international_credit' } export enum SardineQuoteType { buy = 'buy', - sell = 'sell', + sell = 'sell' } export enum GetLifiSwapRouteDirection { to = 'to', - from = 'from', + from = 'from' } export enum TokenType { ERC20 = 'ERC20', ERC721 = 'ERC721', - ERC1155 = 'ERC1155', + ERC1155 = 'ERC1155' } export enum TransakBuySell { UNKNOWN = 'UNKNOWN', BUY = 'BUY', - SELL = 'SELL', + SELL = 'SELL' } export enum TradeType { EXACT_INPUT = 'EXACT_INPUT', - EXACT_OUTPUT = 'EXACT_OUTPUT', + EXACT_OUTPUT = 'EXACT_OUTPUT' } export enum CheckoutOptionCrypto { none = 'none', partially = 'partially', - all = 'all', + all = 'all' } export enum CheckoutOptionNFTCheckoutProvider { unknown = 'unknown', sardine = 'sardine', - transak = 'transak', + transak = 'transak' } export enum CheckoutOptionOnRampProvider { unknown = 'unknown', sardine = 'sardine', - transak = 'transak', + transak = 'transak' } export enum CheckoutOptionSwapProvider { unknown = 'unknown', - lifi = 'lifi', + lifi = 'lifi' } export interface Version { @@ -149,7 +150,7 @@ export interface RuntimeStatus { branch: string commitHash: string checks: RuntimeChecks - numTxnsRelayed: { [key: string]: NumTxnsRelayed } + numTxnsRelayed: {[key: string]: NumTxnsRelayed} } export interface NumTxnsRelayed { @@ -159,7 +160,8 @@ export interface NumTxnsRelayed { period: number } -export interface RuntimeChecks {} +export interface RuntimeChecks { +} export interface SequenceContext { factory: string @@ -958,14 +960,14 @@ export interface IntentQuote { quoteProvider: string quoteProviderRequestId: string quoteProviderFeeUsd: string - feeQuotes: { [key: string]: string } + feeQuotes: {[key: string]: string} } export interface API { /** - * + * * Runtime - * + * */ ping(headers?: object, signal?: AbortSignal): Promise version(headers?: object, signal?: AbortSignal): Promise @@ -973,133 +975,70 @@ export interface API { clock(headers?: object, signal?: AbortSignal): Promise getSequenceContext(headers?: object, signal?: AbortSignal): Promise /** - * + * * Auth - * + * * TODO: rename 'ewtString' arg to 'ethauthProof' */ getAuthToken(args: GetAuthTokenArgs, headers?: object, signal?: AbortSignal): Promise getAuthToken2(args: GetAuthToken2Args, headers?: object, signal?: AbortSignal): Promise - sendPasswordlessLink( - args: SendPasswordlessLinkArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - registerPublicKey( - args: RegisterPublicKeyArgs, - headers?: object, - signal?: AbortSignal, - ): Promise + sendPasswordlessLink(args: SendPasswordlessLinkArgs, headers?: object, signal?: AbortSignal): Promise + registerPublicKey(args: RegisterPublicKeyArgs, headers?: object, signal?: AbortSignal): Promise getPublicKey(args: GetPublicKeyArgs, headers?: object, signal?: AbortSignal): Promise /** - * + * * Contacts / Friends - * + * */ friendList(args: FriendListArgs, headers?: object, signal?: AbortSignal): Promise - getFriendByAddress( - args: GetFriendByAddressArgs, - headers?: object, - signal?: AbortSignal, - ): Promise + getFriendByAddress(args: GetFriendByAddressArgs, headers?: object, signal?: AbortSignal): Promise searchFriends(args: SearchFriendsArgs, headers?: object, signal?: AbortSignal): Promise addFriend(args: AddFriendArgs, headers?: object, signal?: AbortSignal): Promise - updateFriendNickname( - args: UpdateFriendNicknameArgs, - headers?: object, - signal?: AbortSignal, - ): Promise + updateFriendNickname(args: UpdateFriendNicknameArgs, headers?: object, signal?: AbortSignal): Promise removeFriend(args: RemoveFriendArgs, headers?: object, signal?: AbortSignal): Promise /** - * + * * Chain-Utils - * + * */ contractCall(args: ContractCallArgs, headers?: object, signal?: AbortSignal): Promise - decodeContractCall( - args: DecodeContractCallArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - lookupContractCallSelectors( - args: LookupContractCallSelectorsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise + decodeContractCall(args: DecodeContractCallArgs, headers?: object, signal?: AbortSignal): Promise + lookupContractCallSelectors(args: LookupContractCallSelectorsArgs, headers?: object, signal?: AbortSignal): Promise /** - * + * * User Storage - * + * */ userStorageFetch(args: UserStorageFetchArgs, headers?: object, signal?: AbortSignal): Promise userStorageSave(args: UserStorageSaveArgs, headers?: object, signal?: AbortSignal): Promise - userStorageDelete( - args: UserStorageDeleteArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - userStorageFetchAll( - args: UserStorageFetchAllArgs, - headers?: object, - signal?: AbortSignal, - ): Promise + userStorageDelete(args: UserStorageDeleteArgs, headers?: object, signal?: AbortSignal): Promise + userStorageFetchAll(args: UserStorageFetchAllArgs, headers?: object, signal?: AbortSignal): Promise /** - * + * * Wallet utils - * + * */ getMoonpayLink(args: GetMoonpayLinkArgs, headers?: object, signal?: AbortSignal): Promise /** * - IsUsingGoogleMail(domain: string) => (yes: bool) */ - resolveENSAddress( - args: ResolveENSAddressArgs, - headers?: object, - signal?: AbortSignal, - ): Promise + resolveENSAddress(args: ResolveENSAddressArgs, headers?: object, signal?: AbortSignal): Promise /** * TODO: we can add walletContext optional in the future when we need it * NOTE: chainId can be either a number or canonical name */ isValidSignature(args: IsValidSignatureArgs, headers?: object, signal?: AbortSignal): Promise - isValidMessageSignature( - args: IsValidMessageSignatureArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - isValidTypedDataSignature( - args: IsValidTypedDataSignatureArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - isValidETHAuthProof( - args: IsValidETHAuthProofArgs, - headers?: object, - signal?: AbortSignal, - ): Promise + isValidMessageSignature(args: IsValidMessageSignatureArgs, headers?: object, signal?: AbortSignal): Promise + isValidTypedDataSignature(args: IsValidTypedDataSignatureArgs, headers?: object, signal?: AbortSignal): Promise + isValidETHAuthProof(args: IsValidETHAuthProofArgs, headers?: object, signal?: AbortSignal): Promise getOnRampURL(args: GetOnRampURLArgs, headers?: object, signal?: AbortSignal): Promise sardineGetClientToken(headers?: object, signal?: AbortSignal): Promise - sardineGetNFTCheckoutToken( - args: SardineGetNFTCheckoutTokenArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - sardineGetNFTCheckoutOrderStatus( - args: SardineGetNFTCheckoutOrderStatusArgs, - headers?: object, - signal?: AbortSignal, - ): Promise + sardineGetNFTCheckoutToken(args: SardineGetNFTCheckoutTokenArgs, headers?: object, signal?: AbortSignal): Promise + sardineGetNFTCheckoutOrderStatus(args: SardineGetNFTCheckoutOrderStatusArgs, headers?: object, signal?: AbortSignal): Promise sardineGetSupportedRegions(headers?: object, signal?: AbortSignal): Promise - sardineGetSupportedFiatCurrencies( - headers?: object, - signal?: AbortSignal, - ): Promise + sardineGetSupportedFiatCurrencies(headers?: object, signal?: AbortSignal): Promise sardineGetSupportedTokens(headers?: object, signal?: AbortSignal): Promise - sardineGetSupportedTokenForSwap( - args: SardineGetSupportedTokenForSwapArgs, - headers?: object, - signal?: AbortSignal, - ): Promise + sardineGetSupportedTokenForSwap(args: SardineGetSupportedTokenForSwapArgs, headers?: object, signal?: AbortSignal): Promise sardineGetEnabledTokens(headers?: object, signal?: AbortSignal): Promise sardineGetQuote(args: SardineGetQuoteArgs, headers?: object, signal?: AbortSignal): Promise /** @@ -1109,302 +1048,172 @@ export interface API { /** * Deprecated. Use SardineGetNFTCheckoutToken() instead. */ - getSardineNFTCheckoutToken( - args: GetSardineNFTCheckoutTokenArgs, - headers?: object, - signal?: AbortSignal, - ): Promise + getSardineNFTCheckoutToken(args: GetSardineNFTCheckoutTokenArgs, headers?: object, signal?: AbortSignal): Promise /** * Deprecated. Use SardineGetNFTCheckoutOrderStatus() instead. */ - getSardineNFTCheckoutOrderStatus( - args: GetSardineNFTCheckoutOrderStatusArgs, - headers?: object, - signal?: AbortSignal, - ): Promise + getSardineNFTCheckoutOrderStatus(args: GetSardineNFTCheckoutOrderStatusArgs, headers?: object, signal?: AbortSignal): Promise transakGetCountries(headers?: object, signal?: AbortSignal): Promise transakGetCryptoCurrencies(headers?: object, signal?: AbortSignal): Promise transakGetFiatCurrencies(headers?: object, signal?: AbortSignal): Promise transakGetPrice(args: TransakGetPriceArgs, headers?: object, signal?: AbortSignal): Promise - transakGetSupportedNFTCheckoutChains( - headers?: object, - signal?: AbortSignal, - ): Promise + transakGetSupportedNFTCheckoutChains(headers?: object, signal?: AbortSignal): Promise /** - * + * * Price Feed - * + * */ getCoinPrices(args: GetCoinPricesArgs, headers?: object, signal?: AbortSignal): Promise - getCollectiblePrices( - args: GetCollectiblePricesArgs, - headers?: object, - signal?: AbortSignal, - ): Promise + getCollectiblePrices(args: GetCollectiblePricesArgs, headers?: object, signal?: AbortSignal): Promise /** - * + * * Price Feed utils - * + * */ getExchangeRate(args: GetExchangeRateArgs, headers?: object, signal?: AbortSignal): Promise /** - * + * * Util / misc - * + * */ memoryStore(args: MemoryStoreArgs, headers?: object, signal?: AbortSignal): Promise memoryLoad(args: MemoryLoadArgs, headers?: object, signal?: AbortSignal): Promise /** - * + * * Legacy - * + * */ getInviteInfo(headers?: object, signal?: AbortSignal): Promise /** * NOTE: we're still using this from SW-API to Sequence-API to claim invite code */ - isValidAccessCode( - args: IsValidAccessCodeArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - internalClaimAccessCode( - args: InternalClaimAccessCodeArgs, - headers?: object, - signal?: AbortSignal, - ): Promise + isValidAccessCode(args: IsValidAccessCodeArgs, headers?: object, signal?: AbortSignal): Promise + internalClaimAccessCode(args: InternalClaimAccessCodeArgs, headers?: object, signal?: AbortSignal): Promise /** * Utils */ - blockNumberAtTime( - args: BlockNumberAtTimeArgs, - headers?: object, - signal?: AbortSignal, - ): Promise + blockNumberAtTime(args: BlockNumberAtTimeArgs, headers?: object, signal?: AbortSignal): Promise /** - * + * * Paper * TODO: deprecate in the future - * + * */ - paperSessionSecret( - args: PaperSessionSecretArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - paperSessionSecret2( - args: PaperSessionSecret2Args, - headers?: object, - signal?: AbortSignal, - ): Promise + paperSessionSecret(args: PaperSessionSecretArgs, headers?: object, signal?: AbortSignal): Promise + paperSessionSecret2(args: PaperSessionSecret2Args, headers?: object, signal?: AbortSignal): Promise /** - * + * * Linked wallets (v0 -- simple support) - * + * */ linkWallet(args: LinkWalletArgs, headers?: object, signal?: AbortSignal): Promise getLinkedWallets(args: GetLinkedWalletsArgs, headers?: object, signal?: AbortSignal): Promise - removeLinkedWallet( - args: RemoveLinkedWalletArgs, - headers?: object, - signal?: AbortSignal, - ): Promise + removeLinkedWallet(args: RemoveLinkedWalletArgs, headers?: object, signal?: AbortSignal): Promise /** * NOTE: these methods are deprecated, please do not use them. We may resurface them in the future, but just wanted * to be clear, they are not necessary for our linked wallets. */ - generateWaaSVerificationURL( - args: GenerateWaaSVerificationURLArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - validateWaaSVerificationNonce( - args: ValidateWaaSVerificationNonceArgs, - headers?: object, - signal?: AbortSignal, - ): Promise + generateWaaSVerificationURL(args: GenerateWaaSVerificationURLArgs, headers?: object, signal?: AbortSignal): Promise + validateWaaSVerificationNonce(args: ValidateWaaSVerificationNonceArgs, headers?: object, signal?: AbortSignal): Promise /** - * - * + * + * * WaaS child wallet adoption - * + * */ - listAdoptedWallets( - args: ListAdoptedWalletsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise + listAdoptedWallets(args: ListAdoptedWalletsArgs, headers?: object, signal?: AbortSignal): Promise getLifiChains(headers?: object, signal?: AbortSignal): Promise getLifiTokens(args: GetLifiTokensArgs, headers?: object, signal?: AbortSignal): Promise /** * All parameters except `params` are deprecated. * Use only the `params` object to pass values. */ - getLifiSwapRoutes( - args: GetLifiSwapRoutesArgs, - headers?: object, - signal?: AbortSignal, - ): Promise + getLifiSwapRoutes(args: GetLifiSwapRoutesArgs, headers?: object, signal?: AbortSignal): Promise getLifiSwapQuote(args: GetLifiSwapQuoteArgs, headers?: object, signal?: AbortSignal): Promise /** - * + * * Chain abstraction - * + * */ - getIntentCallsPayloads( - args: GetIntentCallsPayloadsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - commitIntentConfig( - args: CommitIntentConfigArgs, - headers?: object, - signal?: AbortSignal, - ): Promise + getIntentCallsPayloads(args: GetIntentCallsPayloadsArgs, headers?: object, signal?: AbortSignal): Promise + commitIntentConfig(args: CommitIntentConfigArgs, headers?: object, signal?: AbortSignal): Promise getIntentConfig(args: GetIntentConfigArgs, headers?: object, signal?: AbortSignal): Promise /** - * + * * Inventory, payments and management - * + * */ listCurrencyGroups(headers?: object, signal?: AbortSignal): Promise - addOffchainInventory( - args: AddOffchainInventoryArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - getOffchainInventory( - args: GetOffchainInventoryArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - listOffchainInventories( - args: ListOffchainInventoriesArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - updateOffchainInventory( - args: UpdateOffchainInventoryArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - deleteOffchainInventory( - args: DeleteOffchainInventoryArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - requestOffchainPayment( - args: RequestOffchainPaymentArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - listOffchainPayments( - args: ListOffchainPaymentsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise + addOffchainInventory(args: AddOffchainInventoryArgs, headers?: object, signal?: AbortSignal): Promise + getOffchainInventory(args: GetOffchainInventoryArgs, headers?: object, signal?: AbortSignal): Promise + listOffchainInventories(args: ListOffchainInventoriesArgs, headers?: object, signal?: AbortSignal): Promise + updateOffchainInventory(args: UpdateOffchainInventoryArgs, headers?: object, signal?: AbortSignal): Promise + deleteOffchainInventory(args: DeleteOffchainInventoryArgs, headers?: object, signal?: AbortSignal): Promise + requestOffchainPayment(args: RequestOffchainPaymentArgs, headers?: object, signal?: AbortSignal): Promise + listOffchainPayments(args: ListOffchainPaymentsArgs, headers?: object, signal?: AbortSignal): Promise /** - * + * * Packs - * + * */ savePack(args: SavePackArgs, headers?: object, signal?: AbortSignal): Promise getPack(args: GetPackArgs, headers?: object, signal?: AbortSignal): Promise getPackIds(args: GetPackIdsArgs, headers?: object, signal?: AbortSignal): Promise deletePack(args: DeletePackArgs, headers?: object, signal?: AbortSignal): Promise - updatePackContent( - args: UpdatePackContentArgs, - headers?: object, - signal?: AbortSignal, - ): Promise + updatePackContent(args: UpdatePackContentArgs, headers?: object, signal?: AbortSignal): Promise getRevealTxData(args: GetRevealTxDataArgs, headers?: object, signal?: AbortSignal): Promise - checkoutOptionsPrimary( - args: CheckoutOptionsPrimaryArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - checkoutOptionsSecondary( - args: CheckoutOptionsSecondaryArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - checkoutOptionsGetTransakContractID( - args: CheckoutOptionsGetTransakContractIDArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - fortePayCreateIntent( - args: FortePayCreateIntentArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - fortePayGetPaymentStatuses( - args: FortePayGetPaymentStatusesArgs, - headers?: object, - signal?: AbortSignal, - ): Promise + checkoutOptionsPrimary(args: CheckoutOptionsPrimaryArgs, headers?: object, signal?: AbortSignal): Promise + checkoutOptionsSecondary(args: CheckoutOptionsSecondaryArgs, headers?: object, signal?: AbortSignal): Promise + checkoutOptionsGetTransakContractID(args: CheckoutOptionsGetTransakContractIDArgs, headers?: object, signal?: AbortSignal): Promise + fortePayCreateIntent(args: FortePayCreateIntentArgs, headers?: object, signal?: AbortSignal): Promise + fortePayGetPaymentStatuses(args: FortePayGetPaymentStatusesArgs, headers?: object, signal?: AbortSignal): Promise /** - * + * * CCTP - * + * */ getCCTPTransfer(args: GetCCTPTransferArgs, headers?: object, signal?: AbortSignal): Promise - queueCCTPTransfer( - args: QueueCCTPTransferArgs, - headers?: object, - signal?: AbortSignal, - ): Promise + queueCCTPTransfer(args: QueueCCTPTransferArgs, headers?: object, signal?: AbortSignal): Promise /** - * + * * Intent Machine Worker - * + * */ - queueIntentConfigExecution( - args: QueueIntentConfigExecutionArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - getIntentConfigExecutionStatus( - args: GetIntentConfigExecutionStatusArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - listIntentConfigs( - args: ListIntentConfigsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - queueMetaTxnReceipt( - args: QueueMetaTxnReceiptArgs, - headers?: object, - signal?: AbortSignal, - ): Promise -} - -export interface PingArgs {} + queueIntentConfigExecution(args: QueueIntentConfigExecutionArgs, headers?: object, signal?: AbortSignal): Promise + getIntentConfigExecutionStatus(args: GetIntentConfigExecutionStatusArgs, headers?: object, signal?: AbortSignal): Promise + listIntentConfigs(args: ListIntentConfigsArgs, headers?: object, signal?: AbortSignal): Promise + queueMetaTxnReceipt(args: QueueMetaTxnReceiptArgs, headers?: object, signal?: AbortSignal): Promise +} + +export interface PingArgs { +} export interface PingReturn { - status: boolean + status: boolean +} +export interface VersionArgs { } -export interface VersionArgs {} export interface VersionReturn { - version: Version + version: Version +} +export interface RuntimeStatusArgs { } -export interface RuntimeStatusArgs {} export interface RuntimeStatusReturn { - status: RuntimeStatus + status: RuntimeStatus +} +export interface ClockArgs { } -export interface ClockArgs {} export interface ClockReturn { - serverTime: string + serverTime: string +} +export interface GetSequenceContextArgs { } -export interface GetSequenceContextArgs {} export interface GetSequenceContextReturn { - data: SequenceContext + data: SequenceContext } export interface GetAuthTokenArgs { ewtString: string @@ -1415,7 +1224,7 @@ export interface GetAuthTokenReturn { status: boolean jwtToken: string address: string - user?: User + user?: User } export interface GetAuthToken2Args { ewtString: string @@ -1426,7 +1235,7 @@ export interface GetAuthToken2Return { status: boolean jwtToken: string address: string - user?: User + user?: User } export interface SendPasswordlessLinkArgs { email: string @@ -1435,21 +1244,21 @@ export interface SendPasswordlessLinkArgs { } export interface SendPasswordlessLinkReturn { - status: boolean + status: boolean } export interface RegisterPublicKeyArgs { publicKey: PublicKey } export interface RegisterPublicKeyReturn { - status: boolean + status: boolean } export interface GetPublicKeyArgs { id: string } export interface GetPublicKeyReturn { - publicKey: PublicKey + publicKey: PublicKey } export interface FriendListArgs { nickname?: string @@ -1458,7 +1267,7 @@ export interface FriendListArgs { export interface FriendListReturn { page: Page - friends: Array + friends: Array } export interface GetFriendByAddressArgs { friendAddress: string @@ -1466,7 +1275,7 @@ export interface GetFriendByAddressArgs { export interface GetFriendByAddressReturn { status: boolean - friend: Friend + friend: Friend } export interface SearchFriendsArgs { filterUsername: string @@ -1474,7 +1283,7 @@ export interface SearchFriendsArgs { } export interface SearchFriendsReturn { - friends: Array + friends: Array } export interface AddFriendArgs { friendAddress: string @@ -1483,7 +1292,7 @@ export interface AddFriendArgs { export interface AddFriendReturn { status: boolean - friend?: Friend + friend?: Friend } export interface UpdateFriendNicknameArgs { friendAddress: string @@ -1492,14 +1301,14 @@ export interface UpdateFriendNicknameArgs { export interface UpdateFriendNicknameReturn { status: boolean - friend?: Friend + friend?: Friend } export interface RemoveFriendArgs { friendAddress: string } export interface RemoveFriendReturn { - status: boolean + status: boolean } export interface ContractCallArgs { chainID: string @@ -1510,28 +1319,28 @@ export interface ContractCallArgs { } export interface ContractCallReturn { - returns: Array + returns: Array } export interface DecodeContractCallArgs { callData: string } export interface DecodeContractCallReturn { - call: ContractCall + call: ContractCall } export interface LookupContractCallSelectorsArgs { selectors: Array } export interface LookupContractCallSelectorsReturn { - signatures: Array> + signatures: Array> } export interface UserStorageFetchArgs { key: string } export interface UserStorageFetchReturn { - object: any + object: any } export interface UserStorageSaveArgs { key: string @@ -1539,28 +1348,28 @@ export interface UserStorageSaveArgs { } export interface UserStorageSaveReturn { - ok: boolean + ok: boolean } export interface UserStorageDeleteArgs { key: string } export interface UserStorageDeleteReturn { - ok: boolean + ok: boolean } export interface UserStorageFetchAllArgs { keys?: Array } export interface UserStorageFetchAllReturn { - objects: { [key: string]: any } + objects: {[key: string]: any} } export interface GetMoonpayLinkArgs { url: string } export interface GetMoonpayLinkReturn { - signedUrl: string + signedUrl: string } export interface ResolveENSAddressArgs { ens: string @@ -1568,7 +1377,7 @@ export interface ResolveENSAddressArgs { export interface ResolveENSAddressReturn { address: string - ok: boolean + ok: boolean } export interface IsValidSignatureArgs { chainId: string @@ -1578,7 +1387,7 @@ export interface IsValidSignatureArgs { } export interface IsValidSignatureReturn { - isValid: boolean + isValid: boolean } export interface IsValidMessageSignatureArgs { chainId: string @@ -1588,7 +1397,7 @@ export interface IsValidMessageSignatureArgs { } export interface IsValidMessageSignatureReturn { - isValid: boolean + isValid: boolean } export interface IsValidTypedDataSignatureArgs { chainId: string @@ -1598,7 +1407,7 @@ export interface IsValidTypedDataSignatureArgs { } export interface IsValidTypedDataSignatureReturn { - isValid: boolean + isValid: boolean } export interface IsValidETHAuthProofArgs { chainId: string @@ -1607,48 +1416,52 @@ export interface IsValidETHAuthProofArgs { } export interface IsValidETHAuthProofReturn { - isValid: boolean + isValid: boolean } export interface GetOnRampURLArgs { chainId: string } export interface GetOnRampURLReturn { - url: string + url: string +} +export interface SardineGetClientTokenArgs { } -export interface SardineGetClientTokenArgs {} export interface SardineGetClientTokenReturn { - token: string + token: string } export interface SardineGetNFTCheckoutTokenArgs { params: SardineNFTCheckoutParams } export interface SardineGetNFTCheckoutTokenReturn { - resp: SardineNFTCheckout + resp: SardineNFTCheckout } export interface SardineGetNFTCheckoutOrderStatusArgs { orderId: string } export interface SardineGetNFTCheckoutOrderStatusReturn { - resp: SardineOrder + resp: SardineOrder +} +export interface SardineGetSupportedRegionsArgs { } -export interface SardineGetSupportedRegionsArgs {} export interface SardineGetSupportedRegionsReturn { - regions: Array + regions: Array +} +export interface SardineGetSupportedFiatCurrenciesArgs { } -export interface SardineGetSupportedFiatCurrenciesArgs {} export interface SardineGetSupportedFiatCurrenciesReturn { - tokens: Array + tokens: Array +} +export interface SardineGetSupportedTokensArgs { } -export interface SardineGetSupportedTokensArgs {} export interface SardineGetSupportedTokensReturn { - tokens: Array + tokens: Array } export interface SardineGetSupportedTokenForSwapArgs { network: string @@ -1656,86 +1469,92 @@ export interface SardineGetSupportedTokenForSwapArgs { } export interface SardineGetSupportedTokenForSwapReturn { - token: SardineSupportedTokenForSwap + token: SardineSupportedTokenForSwap +} +export interface SardineGetEnabledTokensArgs { } -export interface SardineGetEnabledTokensArgs {} export interface SardineGetEnabledTokensReturn { - tokens: Array + tokens: Array } export interface SardineGetQuoteArgs { params: SardineGetQuoteParams } export interface SardineGetQuoteReturn { - quote: SardineQuote + quote: SardineQuote +} +export interface GetSardineClientTokenArgs { } -export interface GetSardineClientTokenArgs {} export interface GetSardineClientTokenReturn { - token: string + token: string } export interface GetSardineNFTCheckoutTokenArgs { params: SardineNFTCheckoutParams } export interface GetSardineNFTCheckoutTokenReturn { - resp: SardineNFTCheckout + resp: SardineNFTCheckout } export interface GetSardineNFTCheckoutOrderStatusArgs { orderId: string } export interface GetSardineNFTCheckoutOrderStatusReturn { - resp: SardineOrder + resp: SardineOrder +} +export interface TransakGetCountriesArgs { } -export interface TransakGetCountriesArgs {} export interface TransakGetCountriesReturn { - regions: Array + regions: Array +} +export interface TransakGetCryptoCurrenciesArgs { } -export interface TransakGetCryptoCurrenciesArgs {} export interface TransakGetCryptoCurrenciesReturn { - currencies: Array + currencies: Array +} +export interface TransakGetFiatCurrenciesArgs { } -export interface TransakGetFiatCurrenciesArgs {} export interface TransakGetFiatCurrenciesReturn { - currencies: Array + currencies: Array } export interface TransakGetPriceArgs { params: TransakGetPriceParams } export interface TransakGetPriceReturn { - price: TransakPrice + price: TransakPrice +} +export interface TransakGetSupportedNFTCheckoutChainsArgs { } -export interface TransakGetSupportedNFTCheckoutChainsArgs {} export interface TransakGetSupportedNFTCheckoutChainsReturn { - chains: Array + chains: Array } export interface GetCoinPricesArgs { tokens: Array } export interface GetCoinPricesReturn { - tokenPrices: Array + tokenPrices: Array } export interface GetCollectiblePricesArgs { tokens: Array } export interface GetCollectiblePricesReturn { - tokenPrices: Array + tokenPrices: Array } export interface GetExchangeRateArgs { toCurrency: string } export interface GetExchangeRateReturn { - exchangeRate: ExchangeRate + exchangeRate: ExchangeRate } export interface MemoryStoreArgs { key: string @@ -1743,26 +1562,27 @@ export interface MemoryStoreArgs { } export interface MemoryStoreReturn { - ok: boolean + ok: boolean } export interface MemoryLoadArgs { key: string } export interface MemoryLoadReturn { - value: string + value: string +} +export interface GetInviteInfoArgs { } -export interface GetInviteInfoArgs {} export interface GetInviteInfoReturn { - inviteInfo: InviteInfo + inviteInfo: InviteInfo } export interface IsValidAccessCodeArgs { accessCode: string } export interface IsValidAccessCodeReturn { - status: boolean + status: boolean } export interface InternalClaimAccessCodeArgs { address: string @@ -1770,7 +1590,7 @@ export interface InternalClaimAccessCodeArgs { } export interface InternalClaimAccessCodeReturn { - status: boolean + status: boolean } export interface BlockNumberAtTimeArgs { chainId: number @@ -1778,7 +1598,7 @@ export interface BlockNumberAtTimeArgs { } export interface BlockNumberAtTimeReturn { - blocks: Array + blocks: Array } export interface PaperSessionSecretArgs { chainName: string @@ -1788,7 +1608,7 @@ export interface PaperSessionSecretArgs { } export interface PaperSessionSecretReturn { - secret: string + secret: string } export interface PaperSessionSecret2Args { chainName: string @@ -1798,7 +1618,7 @@ export interface PaperSessionSecret2Args { } export interface PaperSessionSecret2Return { - secret: string + secret: string } export interface LinkWalletArgs { parentWalletAddress: string @@ -1812,7 +1632,7 @@ export interface LinkWalletArgs { } export interface LinkWalletReturn { - status: boolean + status: boolean } export interface GetLinkedWalletsArgs { parentWalletAddress: string @@ -1822,7 +1642,7 @@ export interface GetLinkedWalletsArgs { } export interface GetLinkedWalletsReturn { - linkedWallets: Array + linkedWallets: Array } export interface RemoveLinkedWalletArgs { parentWalletAddress: string @@ -1833,7 +1653,7 @@ export interface RemoveLinkedWalletArgs { } export interface RemoveLinkedWalletReturn { - status: boolean + status: boolean } export interface GenerateWaaSVerificationURLArgs { walletAddress: string @@ -1841,7 +1661,7 @@ export interface GenerateWaaSVerificationURLArgs { export interface GenerateWaaSVerificationURLReturn { nonce: string - verificationURL: string + verificationURL: string } export interface ValidateWaaSVerificationNonceArgs { nonce: string @@ -1851,7 +1671,7 @@ export interface ValidateWaaSVerificationNonceArgs { } export interface ValidateWaaSVerificationNonceReturn { - walletAddress: string + walletAddress: string } export interface ListAdoptedWalletsArgs { page?: Page @@ -1859,19 +1679,20 @@ export interface ListAdoptedWalletsArgs { export interface ListAdoptedWalletsReturn { page: Page - wallets: Array + wallets: Array +} +export interface GetLifiChainsArgs { } -export interface GetLifiChainsArgs {} export interface GetLifiChainsReturn { - chains: Array + chains: Array } export interface GetLifiTokensArgs { chainIds: Array } export interface GetLifiTokensReturn { - tokens: Array + tokens: Array } export interface GetLifiSwapRoutesArgs { params: GetLifiSwapRouteParams @@ -1882,14 +1703,14 @@ export interface GetLifiSwapRoutesArgs { } export interface GetLifiSwapRoutesReturn { - routes: Array + routes: Array } export interface GetLifiSwapQuoteArgs { params: GetLifiSwapQuoteParams } export interface GetLifiSwapQuoteReturn { - quote: LifiSwapQuote + quote: LifiSwapQuote } export interface GetIntentCallsPayloadsArgs { userAddress: string @@ -1916,9 +1737,9 @@ export interface GetIntentCallsPayloadsReturn { metaTxns: Array trailsFee: TrailsFee quote: IntentQuote - feeQuotes: { [key: string]: string } + feeQuotes: {[key: string]: string} originIntentAddress: string - destinationIntentAddress: string + destinationIntentAddress: string } export interface CommitIntentConfigArgs { originIntentAddress: string @@ -1930,52 +1751,54 @@ export interface CommitIntentConfigArgs { } export interface CommitIntentConfigReturn { - config: IntentConfig + config: IntentConfig } export interface GetIntentConfigArgs { intentAddress: string } export interface GetIntentConfigReturn { - config: IntentConfig + config: IntentConfig +} +export interface ListCurrencyGroupsArgs { } -export interface ListCurrencyGroupsArgs {} export interface ListCurrencyGroupsReturn { - currencyGroups: Array + currencyGroups: Array } export interface AddOffchainInventoryArgs { inventory: OffchainInventory } export interface AddOffchainInventoryReturn { - inventoryId: number + inventoryId: number } export interface GetOffchainInventoryArgs { inventoryId: number } export interface GetOffchainInventoryReturn { - inventory: OffchainInventory + inventory: OffchainInventory } export interface ListOffchainInventoriesArgs { projectId: number } export interface ListOffchainInventoriesReturn { - inventory: Array + inventory: Array } export interface UpdateOffchainInventoryArgs { inventory: OffchainInventory } -export interface UpdateOffchainInventoryReturn {} +export interface UpdateOffchainInventoryReturn { +} export interface DeleteOffchainInventoryArgs { inventoryId: number } export interface DeleteOffchainInventoryReturn { - ok: boolean + ok: boolean } export interface RequestOffchainPaymentArgs { inventoryId: number @@ -1985,7 +1808,7 @@ export interface RequestOffchainPaymentArgs { } export interface RequestOffchainPaymentReturn { - payment: PaymentResponse + payment: PaymentResponse } export interface ListOffchainPaymentsArgs { inventoryId: number @@ -1994,14 +1817,14 @@ export interface ListOffchainPaymentsArgs { export interface ListOffchainPaymentsReturn { page: Page - payments: Array + payments: Array } export interface SavePackArgs { pack: Pack } export interface SavePackReturn { - merkleRoot: string + merkleRoot: string } export interface GetPackArgs { contractAddress: string @@ -2010,7 +1833,7 @@ export interface GetPackArgs { } export interface GetPackReturn { - pack: Pack + pack: Pack } export interface GetPackIdsArgs { contractAddress: string @@ -2018,7 +1841,7 @@ export interface GetPackIdsArgs { } export interface GetPackIdsReturn { - packIds: Array + packIds: Array } export interface DeletePackArgs { contractAddress: string @@ -2027,14 +1850,14 @@ export interface DeletePackArgs { } export interface DeletePackReturn { - status: boolean + status: boolean } export interface UpdatePackContentArgs { pack: Pack } export interface UpdatePackContentReturn { - merkleRoot: string + merkleRoot: string } export interface GetRevealTxDataArgs { contractAddress: string @@ -2044,7 +1867,7 @@ export interface GetRevealTxDataArgs { } export interface GetRevealTxDataReturn { - txData: string + txData: string } export interface CheckoutOptionsPrimaryArgs { chainId: number @@ -2055,7 +1878,7 @@ export interface CheckoutOptionsPrimaryArgs { } export interface CheckoutOptionsPrimaryReturn { - options: CheckoutOptions + options: CheckoutOptions } export interface CheckoutOptionsSecondaryArgs { chainId: number @@ -2064,7 +1887,7 @@ export interface CheckoutOptionsSecondaryArgs { } export interface CheckoutOptionsSecondaryReturn { - options: CheckoutOptions + options: CheckoutOptions } export interface CheckoutOptionsGetTransakContractIDArgs { chainId: number @@ -2072,28 +1895,28 @@ export interface CheckoutOptionsGetTransakContractIDArgs { } export interface CheckoutOptionsGetTransakContractIDReturn { - contractId: string + contractId: string } export interface FortePayCreateIntentArgs { intent: FortePayCreateIntent } export interface FortePayCreateIntentReturn { - resp: FortePayIntent + resp: FortePayIntent } export interface FortePayGetPaymentStatusesArgs { paymentIntentIds: Array } export interface FortePayGetPaymentStatusesReturn { - statuses: Array + statuses: Array } export interface GetCCTPTransferArgs { id: string } export interface GetCCTPTransferReturn { - transfer: CCTPTransfer + transfer: CCTPTransfer } export interface QueueCCTPTransferArgs { sourceTxHash?: string @@ -2103,21 +1926,21 @@ export interface QueueCCTPTransferArgs { } export interface QueueCCTPTransferReturn { - transfer: CCTPTransfer + transfer: CCTPTransfer } export interface QueueIntentConfigExecutionArgs { intentConfigId: number } export interface QueueIntentConfigExecutionReturn { - status: boolean + status: boolean } export interface GetIntentConfigExecutionStatusArgs { intentConfigId: number } export interface GetIntentConfigExecutionStatusReturn { - executionStatus: string + executionStatus: string } export interface ListIntentConfigsArgs { page?: Page @@ -2126,16 +1949,18 @@ export interface ListIntentConfigsArgs { export interface ListIntentConfigsReturn { page: Page - intentConfigs: Array + intentConfigs: Array } export interface QueueMetaTxnReceiptArgs { metaTxID: string } export interface QueueMetaTxnReceiptReturn { - status: boolean + status: boolean } + + // // Client // @@ -2152,1743 +1977,1420 @@ export class API implements API { private url(name: string): string { return this.hostname + this.path + name } - + ping = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('Ping'), createHTTPRequest({}, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - status: _data.status, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) + return this.fetch( + this.url('Ping'), + createHTTPRequest({}, headers, signal) + ).then((res) => { + return buildResponse(res).then(_data => { + return { + status: (_data.status), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) } - + version = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('Version'), createHTTPRequest({}, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - version: _data.version, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) + return this.fetch( + this.url('Version'), + createHTTPRequest({}, headers, signal) + ).then((res) => { + return buildResponse(res).then(_data => { + return { + version: (_data.version), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) } - + runtimeStatus = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('RuntimeStatus'), createHTTPRequest({}, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - status: _data.status, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) + return this.fetch( + this.url('RuntimeStatus'), + createHTTPRequest({}, headers, signal) + ).then((res) => { + return buildResponse(res).then(_data => { + return { + status: (_data.status), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) } - + clock = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('Clock'), createHTTPRequest({}, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - serverTime: _data.serverTime, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) + return this.fetch( + this.url('Clock'), + createHTTPRequest({}, headers, signal) + ).then((res) => { + return buildResponse(res).then(_data => { + return { + serverTime: (_data.serverTime), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) } - + getSequenceContext = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('GetSequenceContext'), createHTTPRequest({}, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - data: _data.data, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) + return this.fetch( + this.url('GetSequenceContext'), + createHTTPRequest({}, headers, signal) + ).then((res) => { + return buildResponse(res).then(_data => { + return { + data: (_data.data), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) } - + getAuthToken = (args: GetAuthTokenArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('GetAuthToken'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - status: _data.status, - jwtToken: _data.jwtToken, - address: _data.address, - user: _data.user, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) + return this.fetch( + this.url('GetAuthToken'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + status: (_data.status), + jwtToken: (_data.jwtToken), + address: (_data.address), + user: (_data.user), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) } - + getAuthToken2 = (args: GetAuthToken2Args, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('GetAuthToken2'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - status: _data.status, - jwtToken: _data.jwtToken, - address: _data.address, - user: _data.user, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - sendPasswordlessLink = ( - args: SendPasswordlessLinkArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('SendPasswordlessLink'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - status: _data.status, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - registerPublicKey = ( - args: RegisterPublicKeyArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('RegisterPublicKey'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - status: _data.status, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) + return this.fetch( + this.url('GetAuthToken2'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + status: (_data.status), + jwtToken: (_data.jwtToken), + address: (_data.address), + user: (_data.user), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + sendPasswordlessLink = (args: SendPasswordlessLinkArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('SendPasswordlessLink'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + status: (_data.status), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + registerPublicKey = (args: RegisterPublicKeyArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('RegisterPublicKey'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + status: (_data.status), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) } - + getPublicKey = (args: GetPublicKeyArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('GetPublicKey'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - publicKey: _data.publicKey, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) + return this.fetch( + this.url('GetPublicKey'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + publicKey: (_data.publicKey), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) } - + friendList = (args: FriendListArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('FriendList'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - page: _data.page, - friends: >_data.friends, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - getFriendByAddress = ( - args: GetFriendByAddressArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetFriendByAddress'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - status: _data.status, - friend: _data.friend, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) + return this.fetch( + this.url('FriendList'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + page: (_data.page), + friends: >(_data.friends), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + getFriendByAddress = (args: GetFriendByAddressArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('GetFriendByAddress'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + status: (_data.status), + friend: (_data.friend), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) } - + searchFriends = (args: SearchFriendsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('SearchFriends'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - friends: >_data.friends, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) + return this.fetch( + this.url('SearchFriends'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + friends: >(_data.friends), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) } - + addFriend = (args: AddFriendArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('AddFriend'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - status: _data.status, - friend: _data.friend, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - updateFriendNickname = ( - args: UpdateFriendNicknameArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('UpdateFriendNickname'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - status: _data.status, - friend: _data.friend, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) + return this.fetch( + this.url('AddFriend'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + status: (_data.status), + friend: (_data.friend), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + updateFriendNickname = (args: UpdateFriendNicknameArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('UpdateFriendNickname'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + status: (_data.status), + friend: (_data.friend), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) } - + removeFriend = (args: RemoveFriendArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('RemoveFriend'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - status: _data.status, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) + return this.fetch( + this.url('RemoveFriend'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + status: (_data.status), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) } - + contractCall = (args: ContractCallArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('ContractCall'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - returns: >_data.returns, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - decodeContractCall = ( - args: DecodeContractCallArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('DecodeContractCall'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - call: _data.call, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - lookupContractCallSelectors = ( - args: LookupContractCallSelectorsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('LookupContractCallSelectors'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - signatures: >>_data.signatures, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - userStorageFetch = ( - args: UserStorageFetchArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('UserStorageFetch'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - object: _data.object, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - userStorageSave = ( - args: UserStorageSaveArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('UserStorageSave'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - ok: _data.ok, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - userStorageDelete = ( - args: UserStorageDeleteArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('UserStorageDelete'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - ok: _data.ok, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - userStorageFetchAll = ( - args: UserStorageFetchAllArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('UserStorageFetchAll'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - objects: <{ [key: string]: any }>_data.objects, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - getMoonpayLink = ( - args: GetMoonpayLinkArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetMoonpayLink'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - signedUrl: _data.signedUrl, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - resolveENSAddress = ( - args: ResolveENSAddressArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('ResolveENSAddress'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - address: _data.address, - ok: _data.ok, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - isValidSignature = ( - args: IsValidSignatureArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('IsValidSignature'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - isValid: _data.isValid, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - isValidMessageSignature = ( - args: IsValidMessageSignatureArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('IsValidMessageSignature'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - isValid: _data.isValid, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - isValidTypedDataSignature = ( - args: IsValidTypedDataSignatureArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('IsValidTypedDataSignature'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - isValid: _data.isValid, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - isValidETHAuthProof = ( - args: IsValidETHAuthProofArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('IsValidETHAuthProof'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - isValid: _data.isValid, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) + return this.fetch( + this.url('ContractCall'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + returns: >(_data.returns), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + decodeContractCall = (args: DecodeContractCallArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('DecodeContractCall'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + call: (_data.call), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + lookupContractCallSelectors = (args: LookupContractCallSelectorsArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('LookupContractCallSelectors'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + signatures: >>(_data.signatures), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + userStorageFetch = (args: UserStorageFetchArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('UserStorageFetch'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + object: (_data.object), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + userStorageSave = (args: UserStorageSaveArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('UserStorageSave'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + ok: (_data.ok), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + userStorageDelete = (args: UserStorageDeleteArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('UserStorageDelete'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + ok: (_data.ok), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + userStorageFetchAll = (args: UserStorageFetchAllArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('UserStorageFetchAll'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + objects: <{[key: string]: any}>(_data.objects), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + getMoonpayLink = (args: GetMoonpayLinkArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('GetMoonpayLink'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + signedUrl: (_data.signedUrl), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + resolveENSAddress = (args: ResolveENSAddressArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('ResolveENSAddress'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + address: (_data.address), + ok: (_data.ok), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + isValidSignature = (args: IsValidSignatureArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('IsValidSignature'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + isValid: (_data.isValid), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + isValidMessageSignature = (args: IsValidMessageSignatureArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('IsValidMessageSignature'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + isValid: (_data.isValid), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + isValidTypedDataSignature = (args: IsValidTypedDataSignatureArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('IsValidTypedDataSignature'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + isValid: (_data.isValid), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + isValidETHAuthProof = (args: IsValidETHAuthProofArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('IsValidETHAuthProof'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + isValid: (_data.isValid), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) } - + getOnRampURL = (args: GetOnRampURLArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('GetOnRampURL'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - url: _data.url, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) + return this.fetch( + this.url('GetOnRampURL'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + url: (_data.url), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) } - + sardineGetClientToken = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('SardineGetClientToken'), createHTTPRequest({}, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - token: _data.token, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - sardineGetNFTCheckoutToken = ( - args: SardineGetNFTCheckoutTokenArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('SardineGetNFTCheckoutToken'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - resp: _data.resp, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - sardineGetNFTCheckoutOrderStatus = ( - args: SardineGetNFTCheckoutOrderStatusArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('SardineGetNFTCheckoutOrderStatus'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - resp: _data.resp, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) + return this.fetch( + this.url('SardineGetClientToken'), + createHTTPRequest({}, headers, signal) + ).then((res) => { + return buildResponse(res).then(_data => { + return { + token: (_data.token), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + sardineGetNFTCheckoutToken = (args: SardineGetNFTCheckoutTokenArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('SardineGetNFTCheckoutToken'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + resp: (_data.resp), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + sardineGetNFTCheckoutOrderStatus = (args: SardineGetNFTCheckoutOrderStatusArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('SardineGetNFTCheckoutOrderStatus'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + resp: (_data.resp), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) } - + sardineGetSupportedRegions = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('SardineGetSupportedRegions'), createHTTPRequest({}, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - regions: >_data.regions, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - sardineGetSupportedFiatCurrencies = ( - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('SardineGetSupportedFiatCurrencies'), createHTTPRequest({}, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - tokens: >_data.tokens, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) + return this.fetch( + this.url('SardineGetSupportedRegions'), + createHTTPRequest({}, headers, signal) + ).then((res) => { + return buildResponse(res).then(_data => { + return { + regions: >(_data.regions), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + sardineGetSupportedFiatCurrencies = (headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('SardineGetSupportedFiatCurrencies'), + createHTTPRequest({}, headers, signal) + ).then((res) => { + return buildResponse(res).then(_data => { + return { + tokens: >(_data.tokens), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) } - + sardineGetSupportedTokens = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('SardineGetSupportedTokens'), createHTTPRequest({}, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - tokens: >_data.tokens, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - sardineGetSupportedTokenForSwap = ( - args: SardineGetSupportedTokenForSwapArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('SardineGetSupportedTokenForSwap'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - token: _data.token, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) + return this.fetch( + this.url('SardineGetSupportedTokens'), + createHTTPRequest({}, headers, signal) + ).then((res) => { + return buildResponse(res).then(_data => { + return { + tokens: >(_data.tokens), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + sardineGetSupportedTokenForSwap = (args: SardineGetSupportedTokenForSwapArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('SardineGetSupportedTokenForSwap'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + token: (_data.token), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) } - + sardineGetEnabledTokens = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('SardineGetEnabledTokens'), createHTTPRequest({}, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - tokens: >_data.tokens, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - sardineGetQuote = ( - args: SardineGetQuoteArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('SardineGetQuote'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - quote: _data.quote, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) + return this.fetch( + this.url('SardineGetEnabledTokens'), + createHTTPRequest({}, headers, signal) + ).then((res) => { + return buildResponse(res).then(_data => { + return { + tokens: >(_data.tokens), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + sardineGetQuote = (args: SardineGetQuoteArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('SardineGetQuote'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + quote: (_data.quote), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) } - + getSardineClientToken = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('GetSardineClientToken'), createHTTPRequest({}, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - token: _data.token, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - getSardineNFTCheckoutToken = ( - args: GetSardineNFTCheckoutTokenArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetSardineNFTCheckoutToken'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - resp: _data.resp, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - getSardineNFTCheckoutOrderStatus = ( - args: GetSardineNFTCheckoutOrderStatusArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetSardineNFTCheckoutOrderStatus'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - resp: _data.resp, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) + return this.fetch( + this.url('GetSardineClientToken'), + createHTTPRequest({}, headers, signal) + ).then((res) => { + return buildResponse(res).then(_data => { + return { + token: (_data.token), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + getSardineNFTCheckoutToken = (args: GetSardineNFTCheckoutTokenArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('GetSardineNFTCheckoutToken'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + resp: (_data.resp), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + getSardineNFTCheckoutOrderStatus = (args: GetSardineNFTCheckoutOrderStatusArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('GetSardineNFTCheckoutOrderStatus'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + resp: (_data.resp), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) } - + transakGetCountries = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('TransakGetCountries'), createHTTPRequest({}, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - regions: >_data.regions, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) + return this.fetch( + this.url('TransakGetCountries'), + createHTTPRequest({}, headers, signal) + ).then((res) => { + return buildResponse(res).then(_data => { + return { + regions: >(_data.regions), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) } - + transakGetCryptoCurrencies = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('TransakGetCryptoCurrencies'), createHTTPRequest({}, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - currencies: >_data.currencies, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) + return this.fetch( + this.url('TransakGetCryptoCurrencies'), + createHTTPRequest({}, headers, signal) + ).then((res) => { + return buildResponse(res).then(_data => { + return { + currencies: >(_data.currencies), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) } - + transakGetFiatCurrencies = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('TransakGetFiatCurrencies'), createHTTPRequest({}, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - currencies: >_data.currencies, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - transakGetPrice = ( - args: TransakGetPriceArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('TransakGetPrice'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - price: _data.price, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - transakGetSupportedNFTCheckoutChains = ( - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('TransakGetSupportedNFTCheckoutChains'), createHTTPRequest({}, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - chains: >_data.chains, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) + return this.fetch( + this.url('TransakGetFiatCurrencies'), + createHTTPRequest({}, headers, signal) + ).then((res) => { + return buildResponse(res).then(_data => { + return { + currencies: >(_data.currencies), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + transakGetPrice = (args: TransakGetPriceArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('TransakGetPrice'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + price: (_data.price), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + transakGetSupportedNFTCheckoutChains = (headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('TransakGetSupportedNFTCheckoutChains'), + createHTTPRequest({}, headers, signal) + ).then((res) => { + return buildResponse(res).then(_data => { + return { + chains: >(_data.chains), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) } - + getCoinPrices = (args: GetCoinPricesArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('GetCoinPrices'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - tokenPrices: >_data.tokenPrices, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - getCollectiblePrices = ( - args: GetCollectiblePricesArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetCollectiblePrices'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - tokenPrices: >_data.tokenPrices, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - getExchangeRate = ( - args: GetExchangeRateArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetExchangeRate'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - exchangeRate: _data.exchangeRate, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) + return this.fetch( + this.url('GetCoinPrices'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + tokenPrices: >(_data.tokenPrices), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + getCollectiblePrices = (args: GetCollectiblePricesArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('GetCollectiblePrices'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + tokenPrices: >(_data.tokenPrices), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + getExchangeRate = (args: GetExchangeRateArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('GetExchangeRate'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + exchangeRate: (_data.exchangeRate), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) } - + memoryStore = (args: MemoryStoreArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('MemoryStore'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - ok: _data.ok, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) + return this.fetch( + this.url('MemoryStore'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + ok: (_data.ok), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) } - + memoryLoad = (args: MemoryLoadArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('MemoryLoad'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - value: _data.value, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) + return this.fetch( + this.url('MemoryLoad'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + value: (_data.value), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) } - + getInviteInfo = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('GetInviteInfo'), createHTTPRequest({}, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - inviteInfo: _data.inviteInfo, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - isValidAccessCode = ( - args: IsValidAccessCodeArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('IsValidAccessCode'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - status: _data.status, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - internalClaimAccessCode = ( - args: InternalClaimAccessCodeArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('InternalClaimAccessCode'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - status: _data.status, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - blockNumberAtTime = ( - args: BlockNumberAtTimeArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('BlockNumberAtTime'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - blocks: >_data.blocks, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - paperSessionSecret = ( - args: PaperSessionSecretArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('PaperSessionSecret'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - secret: _data.secret, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - paperSessionSecret2 = ( - args: PaperSessionSecret2Args, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('PaperSessionSecret2'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - secret: _data.secret, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) + return this.fetch( + this.url('GetInviteInfo'), + createHTTPRequest({}, headers, signal) + ).then((res) => { + return buildResponse(res).then(_data => { + return { + inviteInfo: (_data.inviteInfo), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + isValidAccessCode = (args: IsValidAccessCodeArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('IsValidAccessCode'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + status: (_data.status), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + internalClaimAccessCode = (args: InternalClaimAccessCodeArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('InternalClaimAccessCode'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + status: (_data.status), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + blockNumberAtTime = (args: BlockNumberAtTimeArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('BlockNumberAtTime'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + blocks: >(_data.blocks), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + paperSessionSecret = (args: PaperSessionSecretArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('PaperSessionSecret'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + secret: (_data.secret), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + paperSessionSecret2 = (args: PaperSessionSecret2Args, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('PaperSessionSecret2'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + secret: (_data.secret), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) } - + linkWallet = (args: LinkWalletArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('LinkWallet'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - status: _data.status, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - getLinkedWallets = ( - args: GetLinkedWalletsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetLinkedWallets'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - linkedWallets: >_data.linkedWallets, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - removeLinkedWallet = ( - args: RemoveLinkedWalletArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('RemoveLinkedWallet'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - status: _data.status, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - generateWaaSVerificationURL = ( - args: GenerateWaaSVerificationURLArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GenerateWaaSVerificationURL'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - nonce: _data.nonce, - verificationURL: _data.verificationURL, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - validateWaaSVerificationNonce = ( - args: ValidateWaaSVerificationNonceArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('ValidateWaaSVerificationNonce'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - walletAddress: _data.walletAddress, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - listAdoptedWallets = ( - args: ListAdoptedWalletsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('ListAdoptedWallets'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - page: _data.page, - wallets: >_data.wallets, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) + return this.fetch( + this.url('LinkWallet'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + status: (_data.status), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + getLinkedWallets = (args: GetLinkedWalletsArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('GetLinkedWallets'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + linkedWallets: >(_data.linkedWallets), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + removeLinkedWallet = (args: RemoveLinkedWalletArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('RemoveLinkedWallet'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + status: (_data.status), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + generateWaaSVerificationURL = (args: GenerateWaaSVerificationURLArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('GenerateWaaSVerificationURL'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + nonce: (_data.nonce), + verificationURL: (_data.verificationURL), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + validateWaaSVerificationNonce = (args: ValidateWaaSVerificationNonceArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('ValidateWaaSVerificationNonce'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + walletAddress: (_data.walletAddress), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + listAdoptedWallets = (args: ListAdoptedWalletsArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('ListAdoptedWallets'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + page: (_data.page), + wallets: >(_data.wallets), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) } - + getLifiChains = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('GetLifiChains'), createHTTPRequest({}, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - chains: >_data.chains, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) + return this.fetch( + this.url('GetLifiChains'), + createHTTPRequest({}, headers, signal) + ).then((res) => { + return buildResponse(res).then(_data => { + return { + chains: >(_data.chains), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) } - + getLifiTokens = (args: GetLifiTokensArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('GetLifiTokens'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - tokens: >_data.tokens, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - getLifiSwapRoutes = ( - args: GetLifiSwapRoutesArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetLifiSwapRoutes'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - routes: >_data.routes, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - getLifiSwapQuote = ( - args: GetLifiSwapQuoteArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetLifiSwapQuote'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - quote: _data.quote, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - getIntentCallsPayloads = ( - args: GetIntentCallsPayloadsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetIntentCallsPayloads'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - calls: >_data.calls, - preconditions: >_data.preconditions, - metaTxns: >_data.metaTxns, - trailsFee: _data.trailsFee, - quote: _data.quote, - feeQuotes: <{ [key: string]: string }>_data.feeQuotes, - originIntentAddress: _data.originIntentAddress, - destinationIntentAddress: _data.destinationIntentAddress, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - commitIntentConfig = ( - args: CommitIntentConfigArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('CommitIntentConfig'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - config: _data.config, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - getIntentConfig = ( - args: GetIntentConfigArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetIntentConfig'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - config: _data.config, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) + return this.fetch( + this.url('GetLifiTokens'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + tokens: >(_data.tokens), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + getLifiSwapRoutes = (args: GetLifiSwapRoutesArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('GetLifiSwapRoutes'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + routes: >(_data.routes), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + getLifiSwapQuote = (args: GetLifiSwapQuoteArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('GetLifiSwapQuote'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + quote: (_data.quote), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + getIntentCallsPayloads = (args: GetIntentCallsPayloadsArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('GetIntentCallsPayloads'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + calls: >(_data.calls), + preconditions: >(_data.preconditions), + metaTxns: >(_data.metaTxns), + trailsFee: (_data.trailsFee), + quote: (_data.quote), + feeQuotes: <{[key: string]: string}>(_data.feeQuotes), + originIntentAddress: (_data.originIntentAddress), + destinationIntentAddress: (_data.destinationIntentAddress), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + commitIntentConfig = (args: CommitIntentConfigArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('CommitIntentConfig'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + config: (_data.config), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + getIntentConfig = (args: GetIntentConfigArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('GetIntentConfig'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + config: (_data.config), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) } - + listCurrencyGroups = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('ListCurrencyGroups'), createHTTPRequest({}, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - currencyGroups: >_data.currencyGroups, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - addOffchainInventory = ( - args: AddOffchainInventoryArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('AddOffchainInventory'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - inventoryId: _data.inventoryId, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - getOffchainInventory = ( - args: GetOffchainInventoryArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetOffchainInventory'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - inventory: _data.inventory, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - listOffchainInventories = ( - args: ListOffchainInventoriesArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('ListOffchainInventories'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - inventory: >_data.inventory, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - updateOffchainInventory = ( - args: UpdateOffchainInventoryArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('UpdateOffchainInventory'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return {} - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - deleteOffchainInventory = ( - args: DeleteOffchainInventoryArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('DeleteOffchainInventory'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - ok: _data.ok, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - requestOffchainPayment = ( - args: RequestOffchainPaymentArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('RequestOffchainPayment'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - payment: _data.payment, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - listOffchainPayments = ( - args: ListOffchainPaymentsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('ListOffchainPayments'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - page: _data.page, - payments: >_data.payments, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) + return this.fetch( + this.url('ListCurrencyGroups'), + createHTTPRequest({}, headers, signal) + ).then((res) => { + return buildResponse(res).then(_data => { + return { + currencyGroups: >(_data.currencyGroups), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + addOffchainInventory = (args: AddOffchainInventoryArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('AddOffchainInventory'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + inventoryId: (_data.inventoryId), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + getOffchainInventory = (args: GetOffchainInventoryArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('GetOffchainInventory'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + inventory: (_data.inventory), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + listOffchainInventories = (args: ListOffchainInventoriesArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('ListOffchainInventories'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + inventory: >(_data.inventory), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + updateOffchainInventory = (args: UpdateOffchainInventoryArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('UpdateOffchainInventory'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return {} + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + deleteOffchainInventory = (args: DeleteOffchainInventoryArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('DeleteOffchainInventory'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + ok: (_data.ok), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + requestOffchainPayment = (args: RequestOffchainPaymentArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('RequestOffchainPayment'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + payment: (_data.payment), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + listOffchainPayments = (args: ListOffchainPaymentsArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('ListOffchainPayments'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + page: (_data.page), + payments: >(_data.payments), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) } - + savePack = (args: SavePackArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('SavePack'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - merkleRoot: _data.merkleRoot, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) + return this.fetch( + this.url('SavePack'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + merkleRoot: (_data.merkleRoot), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) } - + getPack = (args: GetPackArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('GetPack'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - pack: _data.pack, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) + return this.fetch( + this.url('GetPack'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + pack: (_data.pack), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) } - + getPackIds = (args: GetPackIdsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('GetPackIds'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - packIds: >_data.packIds, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) + return this.fetch( + this.url('GetPackIds'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + packIds: >(_data.packIds), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) } - + deletePack = (args: DeletePackArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('DeletePack'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - status: _data.status, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - updatePackContent = ( - args: UpdatePackContentArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('UpdatePackContent'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - merkleRoot: _data.merkleRoot, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - getRevealTxData = ( - args: GetRevealTxDataArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetRevealTxData'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - txData: _data.txData, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - checkoutOptionsPrimary = ( - args: CheckoutOptionsPrimaryArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('CheckoutOptionsPrimary'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - options: _data.options, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - checkoutOptionsSecondary = ( - args: CheckoutOptionsSecondaryArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('CheckoutOptionsSecondary'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - options: _data.options, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - checkoutOptionsGetTransakContractID = ( - args: CheckoutOptionsGetTransakContractIDArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('CheckoutOptionsGetTransakContractID'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - contractId: _data.contractId, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - fortePayCreateIntent = ( - args: FortePayCreateIntentArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('FortePayCreateIntent'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - resp: _data.resp, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - fortePayGetPaymentStatuses = ( - args: FortePayGetPaymentStatusesArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('FortePayGetPaymentStatuses'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - statuses: >_data.statuses, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - getCCTPTransfer = ( - args: GetCCTPTransferArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetCCTPTransfer'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - transfer: _data.transfer, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - queueCCTPTransfer = ( - args: QueueCCTPTransferArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('QueueCCTPTransfer'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - transfer: _data.transfer, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - queueIntentConfigExecution = ( - args: QueueIntentConfigExecutionArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('QueueIntentConfigExecution'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - status: _data.status, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - getIntentConfigExecutionStatus = ( - args: GetIntentConfigExecutionStatusArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetIntentConfigExecutionStatus'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - executionStatus: _data.executionStatus, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - listIntentConfigs = ( - args: ListIntentConfigsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('ListIntentConfigs'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - page: _data.page, - intentConfigs: >_data.intentConfigs, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - queueMetaTxnReceipt = ( - args: QueueMetaTxnReceiptArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('QueueMetaTxnReceipt'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - status: _data.status, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } -} - -const createHTTPRequest = (body: object = {}, headers: object = {}, signal: AbortSignal | null = null): object => { - const reqHeaders: { [key: string]: string } = { ...headers, 'Content-Type': 'application/json' } + return this.fetch( + this.url('DeletePack'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + status: (_data.status), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + updatePackContent = (args: UpdatePackContentArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('UpdatePackContent'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + merkleRoot: (_data.merkleRoot), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + getRevealTxData = (args: GetRevealTxDataArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('GetRevealTxData'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + txData: (_data.txData), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + checkoutOptionsPrimary = (args: CheckoutOptionsPrimaryArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('CheckoutOptionsPrimary'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + options: (_data.options), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + checkoutOptionsSecondary = (args: CheckoutOptionsSecondaryArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('CheckoutOptionsSecondary'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + options: (_data.options), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + checkoutOptionsGetTransakContractID = (args: CheckoutOptionsGetTransakContractIDArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('CheckoutOptionsGetTransakContractID'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + contractId: (_data.contractId), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + fortePayCreateIntent = (args: FortePayCreateIntentArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('FortePayCreateIntent'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + resp: (_data.resp), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + fortePayGetPaymentStatuses = (args: FortePayGetPaymentStatusesArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('FortePayGetPaymentStatuses'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + statuses: >(_data.statuses), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + getCCTPTransfer = (args: GetCCTPTransferArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('GetCCTPTransfer'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + transfer: (_data.transfer), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + queueCCTPTransfer = (args: QueueCCTPTransferArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('QueueCCTPTransfer'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + transfer: (_data.transfer), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + queueIntentConfigExecution = (args: QueueIntentConfigExecutionArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('QueueIntentConfigExecution'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + status: (_data.status), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + getIntentConfigExecutionStatus = (args: GetIntentConfigExecutionStatusArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('GetIntentConfigExecutionStatus'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + executionStatus: (_data.executionStatus), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + listIntentConfigs = (args: ListIntentConfigsArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('ListIntentConfigs'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + page: (_data.page), + intentConfigs: >(_data.intentConfigs), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + queueMetaTxnReceipt = (args: QueueMetaTxnReceiptArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('QueueMetaTxnReceipt'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + status: (_data.status), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + +} + + const createHTTPRequest = (body: object = {}, headers: object = {}, signal: AbortSignal | null = null): object => { + const reqHeaders: {[key: string]: string} = { ...headers, 'Content-Type': 'application/json' } reqHeaders[WebrpcHeader] = WebrpcHeaderValue return { method: 'POST', headers: reqHeaders, body: JSON.stringify(body || {}), - signal, + signal } } const buildResponse = (res: Response): Promise => { - return res.text().then((text) => { + return res.text().then(text => { let data try { data = JSON.parse(text) - } catch (error) { + } catch(error) { let message = '' - if (error instanceof Error) { + if (error instanceof Error) { message = error.message } throw WebrpcBadResponseError.new({ status: res.status, - cause: `JSON.parse(): ${message}: response text: ${text}`, - }) + cause: `JSON.parse(): ${message}: response text: ${text}`}, + ) } if (!res.ok) { - const code: number = typeof data.code === 'number' ? data.code : 0 + const code: number = (typeof data.code === 'number') ? data.code : 0 throw (webrpcErrorByCode[code] || WebrpcError).new(data) } return data @@ -3933,7 +3435,7 @@ export class WebrpcEndpointError extends WebrpcError { code: number = 0, message: string = `endpoint error`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcEndpointError.prototype) @@ -3946,7 +3448,7 @@ export class WebrpcRequestFailedError extends WebrpcError { code: number = -1, message: string = `request failed`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcRequestFailedError.prototype) @@ -3959,7 +3461,7 @@ export class WebrpcBadRouteError extends WebrpcError { code: number = -2, message: string = `bad route`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcBadRouteError.prototype) @@ -3972,7 +3474,7 @@ export class WebrpcBadMethodError extends WebrpcError { code: number = -3, message: string = `bad method`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcBadMethodError.prototype) @@ -3985,7 +3487,7 @@ export class WebrpcBadRequestError extends WebrpcError { code: number = -4, message: string = `bad request`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcBadRequestError.prototype) @@ -3998,7 +3500,7 @@ export class WebrpcBadResponseError extends WebrpcError { code: number = -5, message: string = `bad response`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcBadResponseError.prototype) @@ -4011,7 +3513,7 @@ export class WebrpcServerPanicError extends WebrpcError { code: number = -6, message: string = `server panic`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcServerPanicError.prototype) @@ -4024,7 +3526,7 @@ export class WebrpcInternalErrorError extends WebrpcError { code: number = -7, message: string = `internal error`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcInternalErrorError.prototype) @@ -4037,7 +3539,7 @@ export class WebrpcClientDisconnectedError extends WebrpcError { code: number = -8, message: string = `client disconnected`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcClientDisconnectedError.prototype) @@ -4050,7 +3552,7 @@ export class WebrpcStreamLostError extends WebrpcError { code: number = -9, message: string = `stream lost`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcStreamLostError.prototype) @@ -4063,13 +3565,14 @@ export class WebrpcStreamFinishedError extends WebrpcError { code: number = -10, message: string = `stream finished`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcStreamFinishedError.prototype) } } + // Schema errors export class UnauthorizedError extends WebrpcError { @@ -4078,7 +3581,7 @@ export class UnauthorizedError extends WebrpcError { code: number = 1000, message: string = `Unauthorized access`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, UnauthorizedError.prototype) @@ -4091,7 +3594,7 @@ export class PermissionDeniedError extends WebrpcError { code: number = 1001, message: string = `Permission denied`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, PermissionDeniedError.prototype) @@ -4104,7 +3607,7 @@ export class SessionExpiredError extends WebrpcError { code: number = 1002, message: string = `Session expired`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, SessionExpiredError.prototype) @@ -4117,7 +3620,7 @@ export class MethodNotFoundError extends WebrpcError { code: number = 1003, message: string = `Method not found`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, MethodNotFoundError.prototype) @@ -4130,7 +3633,7 @@ export class RequestConflictError extends WebrpcError { code: number = 1004, message: string = `Conflict with target resource`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, RequestConflictError.prototype) @@ -4143,7 +3646,7 @@ export class AbortedError extends WebrpcError { code: number = 1005, message: string = `Request aborted`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, AbortedError.prototype) @@ -4156,7 +3659,7 @@ export class GeoblockedError extends WebrpcError { code: number = 1006, message: string = `Geoblocked region`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, GeoblockedError.prototype) @@ -4169,7 +3672,7 @@ export class RateLimitedError extends WebrpcError { code: number = 1007, message: string = `Rate-limited. Please slow down.`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, RateLimitedError.prototype) @@ -4182,7 +3685,7 @@ export class ProjectNotFoundError extends WebrpcError { code: number = 1008, message: string = `Project not found`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, ProjectNotFoundError.prototype) @@ -4195,7 +3698,7 @@ export class AccessKeyNotFoundError extends WebrpcError { code: number = 1101, message: string = `Access key not found`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, AccessKeyNotFoundError.prototype) @@ -4208,7 +3711,7 @@ export class AccessKeyMismatchError extends WebrpcError { code: number = 1102, message: string = `Access key mismatch`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, AccessKeyMismatchError.prototype) @@ -4221,7 +3724,7 @@ export class InvalidOriginError extends WebrpcError { code: number = 1103, message: string = `Invalid origin for Access Key`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, InvalidOriginError.prototype) @@ -4234,7 +3737,7 @@ export class InvalidServiceError extends WebrpcError { code: number = 1104, message: string = `Service not enabled for Access key`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, InvalidServiceError.prototype) @@ -4247,7 +3750,7 @@ export class UnauthorizedUserError extends WebrpcError { code: number = 1105, message: string = `Unauthorized user`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, UnauthorizedUserError.prototype) @@ -4260,7 +3763,7 @@ export class QuotaExceededError extends WebrpcError { code: number = 1200, message: string = `Quota request exceeded`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, QuotaExceededError.prototype) @@ -4273,7 +3776,7 @@ export class QuotaRateLimitError extends WebrpcError { code: number = 1201, message: string = `Quota rate limit exceeded`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, QuotaRateLimitError.prototype) @@ -4286,7 +3789,7 @@ export class NoDefaultKeyError extends WebrpcError { code: number = 1300, message: string = `No default access key found`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, NoDefaultKeyError.prototype) @@ -4299,7 +3802,7 @@ export class MaxAccessKeysError extends WebrpcError { code: number = 1301, message: string = `Access keys limit reached`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, MaxAccessKeysError.prototype) @@ -4312,7 +3815,7 @@ export class AtLeastOneKeyError extends WebrpcError { code: number = 1302, message: string = `You need at least one Access Key`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, AtLeastOneKeyError.prototype) @@ -4325,7 +3828,7 @@ export class TimeoutError extends WebrpcError { code: number = 1900, message: string = `Request timed out`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, TimeoutError.prototype) @@ -4338,7 +3841,7 @@ export class InvalidArgumentError extends WebrpcError { code: number = 2000, message: string = `Invalid argument`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, InvalidArgumentError.prototype) @@ -4351,7 +3854,7 @@ export class UnavailableError extends WebrpcError { code: number = 2002, message: string = `Unavailable resource`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, UnavailableError.prototype) @@ -4364,7 +3867,7 @@ export class QueryFailedError extends WebrpcError { code: number = 2003, message: string = `Query failed`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, QueryFailedError.prototype) @@ -4377,7 +3880,7 @@ export class NotFoundError extends WebrpcError { code: number = 3000, message: string = `Resource not found`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, NotFoundError.prototype) @@ -4390,13 +3893,14 @@ export class UnsupportedNetworkError extends WebrpcError { code: number = 3008, message: string = `Unsupported network`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, UnsupportedNetworkError.prototype) } } + export enum errors { WebrpcEndpoint = 'WebrpcEndpoint', WebrpcRequestFailed = 'WebrpcRequestFailed', @@ -4515,3 +4019,4 @@ export const webrpcErrorByCode: { [code: number]: any } = { } export type Fetch = (input: RequestInfo, init?: RequestInit) => Promise + diff --git a/packages/services/relayer/src/rpc-relayer/relayer.gen.ts b/packages/services/relayer/src/rpc-relayer/relayer.gen.ts index a9e6b44405..79ca492968 100644 --- a/packages/services/relayer/src/rpc-relayer/relayer.gen.ts +++ b/packages/services/relayer/src/rpc-relayer/relayer.gen.ts @@ -5,71 +5,72 @@ // // webrpc-gen -schema=relayer.ridl -target=typescript -client -out=./clients/relayer.gen.ts -export const WebrpcHeader = 'Webrpc' +export const WebrpcHeader = "Webrpc" -export const WebrpcHeaderValue = 'webrpc@v0.26.0;gen-typescript@v0.17.0;sequence-relayer@v0.4.1' +export const WebrpcHeaderValue = "webrpc@v0.26.0;gen-typescript@v0.17.0;sequence-relayer@v0.4.1" // WebRPC description and code-gen version -export const WebRPCVersion = 'v1' +export const WebRPCVersion = "v1" // Schema version of your RIDL schema -export const WebRPCSchemaVersion = 'v0.4.1' +export const WebRPCSchemaVersion = "v0.4.1" // Schema hash generated from your RIDL schema -export const WebRPCSchemaHash = '62fe2b49d57c4a0d3960ac1176d48ecfffc7af5a' +export const WebRPCSchemaHash = "62fe2b49d57c4a0d3960ac1176d48ecfffc7af5a" type WebrpcGenVersions = { - webrpcGenVersion: string - codeGenName: string - codeGenVersion: string - schemaName: string - schemaVersion: string -} + webrpcGenVersion: string; + codeGenName: string; + codeGenVersion: string; + schemaName: string; + schemaVersion: string; +}; export function VersionFromHeader(headers: Headers): WebrpcGenVersions { - const headerValue = headers.get(WebrpcHeader) + const headerValue = headers.get(WebrpcHeader); if (!headerValue) { return { - webrpcGenVersion: '', - codeGenName: '', - codeGenVersion: '', - schemaName: '', - schemaVersion: '', - } + webrpcGenVersion: "", + codeGenName: "", + codeGenVersion: "", + schemaName: "", + schemaVersion: "", + }; } - return parseWebrpcGenVersions(headerValue) + return parseWebrpcGenVersions(headerValue); } function parseWebrpcGenVersions(header: string): WebrpcGenVersions { - const versions = header.split(';') + const versions = header.split(";"); if (versions.length < 3) { return { - webrpcGenVersion: '', - codeGenName: '', - codeGenVersion: '', - schemaName: '', - schemaVersion: '', - } + webrpcGenVersion: "", + codeGenName: "", + codeGenVersion: "", + schemaName: "", + schemaVersion: "", + }; } - const [_, webrpcGenVersion] = versions[0]!.split('@') - const [codeGenName, codeGenVersion] = versions[1]!.split('@') - const [schemaName, schemaVersion] = versions[2]!.split('@') + const [_, webrpcGenVersion] = versions[0]!.split("@"); + const [codeGenName, codeGenVersion] = versions[1]!.split("@"); + const [schemaName, schemaVersion] = versions[2]!.split("@"); return { - webrpcGenVersion: webrpcGenVersion ?? '', - codeGenName: codeGenName ?? '', - codeGenVersion: codeGenVersion ?? '', - schemaName: schemaName ?? '', - schemaVersion: schemaVersion ?? '', - } + webrpcGenVersion: webrpcGenVersion ?? "", + codeGenName: codeGenName ?? "", + codeGenVersion: codeGenVersion ?? "", + schemaName: schemaName ?? "", + schemaVersion: schemaVersion ?? "", + }; } // // Types // + export enum ETHTxnStatus { UNKNOWN = 'UNKNOWN', DROPPED = 'DROPPED', @@ -78,7 +79,7 @@ export enum ETHTxnStatus { SUCCEEDED = 'SUCCEEDED', PARTIALLY_FAILED = 'PARTIALLY_FAILED', FAILED = 'FAILED', - PENDING_PRECONDITION = 'PENDING_PRECONDITION', + PENDING_PRECONDITION = 'PENDING_PRECONDITION' } export enum TransferType { @@ -87,7 +88,7 @@ export enum TransferType { BRIDGE_DEPOSIT = 'BRIDGE_DEPOSIT', BRIDGE_WITHDRAW = 'BRIDGE_WITHDRAW', BURN = 'BURN', - UNKNOWN = 'UNKNOWN', + UNKNOWN = 'UNKNOWN' } export enum SimulateStatus { @@ -96,18 +97,18 @@ export enum SimulateStatus { FAILED = 'FAILED', ABORTED = 'ABORTED', REVERTED = 'REVERTED', - NOT_ENOUGH_GAS = 'NOT_ENOUGH_GAS', + NOT_ENOUGH_GAS = 'NOT_ENOUGH_GAS' } export enum FeeTokenType { UNKNOWN = 'UNKNOWN', ERC20_TOKEN = 'ERC20_TOKEN', - ERC1155_TOKEN = 'ERC1155_TOKEN', + ERC1155_TOKEN = 'ERC1155_TOKEN' } export enum SortOrder { DESC = 'DESC', - ASC = 'ASC', + ASC = 'ASC' } export interface Version { @@ -137,7 +138,8 @@ export interface SenderStatus { active: boolean } -export interface RuntimeChecks {} +export interface RuntimeChecks { +} export interface SequenceContext { factory: string @@ -213,8 +215,8 @@ export interface MetaTxnLog { minedAt: string target: string input: string - txnArgs: { [key: string]: any } - txnReceipt?: { [key: string]: any } + txnArgs: {[key: string]: any} + txnReceipt?: {[key: string]: any} walletAddress: string metaTxnNonce: string gasLimit: number @@ -351,9 +353,9 @@ export interface Relayer { getSequenceContext(headers?: object, signal?: AbortSignal): Promise getChainID(headers?: object, signal?: AbortSignal): Promise /** - * + * * Transactions - * + * * TODO (future): rename this to just, 'SendTransaction(txn: MetaTransaction)' or 'SendTransaction(txn: SignedTransaction)', or something.. * Project ID is only used by service and admin calls. Other clients must have projectID passed via the context * TODO: rename return txnHash: string to metaTxnID: string @@ -368,41 +370,21 @@ export interface Relayer { * new, GetTransactionReceipt and WaitTransactionReceipt methods * we can also accept metaTxnId and txnHash .. so can take either or.. I wonder if ERC-4337 has any convention on this? */ - getMetaTxnReceipt( - args: GetMetaTxnReceiptArgs, - headers?: object, - signal?: AbortSignal, - ): Promise + getMetaTxnReceipt(args: GetMetaTxnReceiptArgs, headers?: object, signal?: AbortSignal): Promise simulate(args: SimulateArgs, headers?: object, signal?: AbortSignal): Promise simulateV3(args: SimulateV3Args, headers?: object, signal?: AbortSignal): Promise /** * TODO: deprecated, to be removed by https://github.com/0xsequence/stack/pull/356 at a later date */ - updateMetaTxnGasLimits( - args: UpdateMetaTxnGasLimitsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise + updateMetaTxnGasLimits(args: UpdateMetaTxnGasLimitsArgs, headers?: object, signal?: AbortSignal): Promise feeTokens(headers?: object, signal?: AbortSignal): Promise feeOptions(args: FeeOptionsArgs, headers?: object, signal?: AbortSignal): Promise /** * TODO: deprecated, to be removed by https://github.com/0xsequence/stack/pull/356 at a later date */ - getMetaTxnNetworkFeeOptions( - args: GetMetaTxnNetworkFeeOptionsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - getMetaTransactions( - args: GetMetaTransactionsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - getTransactionCost( - args: GetTransactionCostArgs, - headers?: object, - signal?: AbortSignal, - ): Promise + getMetaTxnNetworkFeeOptions(args: GetMetaTxnNetworkFeeOptionsArgs, headers?: object, signal?: AbortSignal): Promise + getMetaTransactions(args: GetMetaTransactionsArgs, headers?: object, signal?: AbortSignal): Promise + getTransactionCost(args: GetTransactionCostArgs, headers?: object, signal?: AbortSignal): Promise /** * Sent transactions from an account. If filter is omitted then it will return all transactions. */ @@ -411,11 +393,7 @@ export interface Relayer { * Pending transactions waiting to be mined for an account. This endpoint is just a sugar of `SentTransactions` * with the filter set to pending: true. */ - pendingTransactions( - args: PendingTransactionsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise + pendingTransactions(args: PendingTransactionsArgs, headers?: object, signal?: AbortSignal): Promise /** * Legacy Gas Tank */ @@ -425,26 +403,10 @@ export interface Relayer { /** * Legacy Gas Adjustment */ - nextGasTankBalanceAdjustmentNonce( - args: NextGasTankBalanceAdjustmentNonceArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - adjustGasTankBalance( - args: AdjustGasTankBalanceArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - getGasTankBalanceAdjustment( - args: GetGasTankBalanceAdjustmentArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - listGasTankBalanceAdjustments( - args: ListGasTankBalanceAdjustmentsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise + nextGasTankBalanceAdjustmentNonce(args: NextGasTankBalanceAdjustmentNonceArgs, headers?: object, signal?: AbortSignal): Promise + adjustGasTankBalance(args: AdjustGasTankBalanceArgs, headers?: object, signal?: AbortSignal): Promise + getGasTankBalanceAdjustment(args: GetGasTankBalanceAdjustmentArgs, headers?: object, signal?: AbortSignal): Promise + listGasTankBalanceAdjustments(args: ListGasTankBalanceAdjustmentsArgs, headers?: object, signal?: AbortSignal): Promise /** * Gas Sponsorship */ @@ -456,50 +418,43 @@ export interface Relayer { /** * Gas Sponsor Lookup */ - addressGasSponsors( - args: AddressGasSponsorsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise + addressGasSponsors(args: AddressGasSponsorsArgs, headers?: object, signal?: AbortSignal): Promise /** * Project Balance */ - getProjectBalance( - args: GetProjectBalanceArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - adjustProjectBalance( - args: AdjustProjectBalanceArgs, - headers?: object, - signal?: AbortSignal, - ): Promise + getProjectBalance(args: GetProjectBalanceArgs, headers?: object, signal?: AbortSignal): Promise + adjustProjectBalance(args: AdjustProjectBalanceArgs, headers?: object, signal?: AbortSignal): Promise } -export interface PingArgs {} +export interface PingArgs { +} export interface PingReturn { - status: boolean + status: boolean +} +export interface VersionArgs { } -export interface VersionArgs {} export interface VersionReturn { - version: Version + version: Version +} +export interface RuntimeStatusArgs { } -export interface RuntimeStatusArgs {} export interface RuntimeStatusReturn { - status: RuntimeStatus + status: RuntimeStatus +} +export interface GetSequenceContextArgs { } -export interface GetSequenceContextArgs {} export interface GetSequenceContextReturn { - data: SequenceContext + data: SequenceContext +} +export interface GetChainIDArgs { } -export interface GetChainIDArgs {} export interface GetChainIDReturn { - chainID: number + chainID: number } export interface SendMetaTxnArgs { call: MetaTxn @@ -510,7 +465,7 @@ export interface SendMetaTxnArgs { export interface SendMetaTxnReturn { status: boolean - txnHash: string + txnHash: string } export interface GetMetaTxnNonceArgs { walletContractAddress: string @@ -518,14 +473,14 @@ export interface GetMetaTxnNonceArgs { } export interface GetMetaTxnNonceReturn { - nonce: string + nonce: string } export interface GetMetaTxnReceiptArgs { metaTxID: string } export interface GetMetaTxnReceiptReturn { - receipt: MetaTxnReceipt + receipt: MetaTxnReceipt } export interface SimulateArgs { wallet: string @@ -533,7 +488,7 @@ export interface SimulateArgs { } export interface SimulateReturn { - results: Array + results: Array } export interface SimulateV3Args { wallet: string @@ -541,7 +496,7 @@ export interface SimulateV3Args { } export interface SimulateV3Return { - results: Array + results: Array } export interface UpdateMetaTxnGasLimitsArgs { walletAddress: string @@ -550,13 +505,14 @@ export interface UpdateMetaTxnGasLimitsArgs { } export interface UpdateMetaTxnGasLimitsReturn { - payload: string + payload: string +} +export interface FeeTokensArgs { } -export interface FeeTokensArgs {} export interface FeeTokensReturn { isFeeRequired: boolean - tokens: Array + tokens: Array } export interface FeeOptionsArgs { wallet: string @@ -568,7 +524,7 @@ export interface FeeOptionsArgs { export interface FeeOptionsReturn { options: Array sponsored: boolean - quote?: string + quote?: string } export interface GetMetaTxnNetworkFeeOptionsArgs { walletConfig: any @@ -576,7 +532,7 @@ export interface GetMetaTxnNetworkFeeOptionsArgs { } export interface GetMetaTxnNetworkFeeOptionsReturn { - options: Array + options: Array } export interface GetMetaTransactionsArgs { projectId: number @@ -585,7 +541,7 @@ export interface GetMetaTransactionsArgs { export interface GetMetaTransactionsReturn { page: Page - transactions: Array + transactions: Array } export interface GetTransactionCostArgs { projectId: number @@ -594,7 +550,7 @@ export interface GetTransactionCostArgs { } export interface GetTransactionCostReturn { - cost: number + cost: number } export interface SentTransactionsArgs { filter?: SentTransactionsFilter @@ -603,7 +559,7 @@ export interface SentTransactionsArgs { export interface SentTransactionsReturn { page: Page - transactions: Array + transactions: Array } export interface PendingTransactionsArgs { page?: Page @@ -611,14 +567,14 @@ export interface PendingTransactionsArgs { export interface PendingTransactionsReturn { page: Page - transactions: Array + transactions: Array } export interface GetGasTankArgs { id: number } export interface GetGasTankReturn { - gasTank: GasTank + gasTank: GasTank } export interface AddGasTankArgs { name: string @@ -628,7 +584,7 @@ export interface AddGasTankArgs { export interface AddGasTankReturn { status: boolean - gasTank: GasTank + gasTank: GasTank } export interface UpdateGasTankArgs { id: number @@ -639,14 +595,14 @@ export interface UpdateGasTankArgs { export interface UpdateGasTankReturn { status: boolean - gasTank: GasTank + gasTank: GasTank } export interface NextGasTankBalanceAdjustmentNonceArgs { id: number } export interface NextGasTankBalanceAdjustmentNonceReturn { - nonce: number + nonce: number } export interface AdjustGasTankBalanceArgs { id: number @@ -656,7 +612,7 @@ export interface AdjustGasTankBalanceArgs { export interface AdjustGasTankBalanceReturn { status: boolean - adjustment: GasTankBalanceAdjustment + adjustment: GasTankBalanceAdjustment } export interface GetGasTankBalanceAdjustmentArgs { id: number @@ -664,7 +620,7 @@ export interface GetGasTankBalanceAdjustmentArgs { } export interface GetGasTankBalanceAdjustmentReturn { - adjustment: GasTankBalanceAdjustment + adjustment: GasTankBalanceAdjustment } export interface ListGasTankBalanceAdjustmentsArgs { id: number @@ -673,7 +629,7 @@ export interface ListGasTankBalanceAdjustmentsArgs { export interface ListGasTankBalanceAdjustmentsReturn { page: Page - adjustments: Array + adjustments: Array } export interface ListGasSponsorsArgs { projectId: number @@ -682,7 +638,7 @@ export interface ListGasSponsorsArgs { export interface ListGasSponsorsReturn { page: Page - gasSponsors: Array + gasSponsors: Array } export interface GetGasSponsorArgs { projectId: number @@ -690,7 +646,7 @@ export interface GetGasSponsorArgs { } export interface GetGasSponsorReturn { - gasSponsor: GasSponsor + gasSponsor: GasSponsor } export interface AddGasSponsorArgs { projectId: number @@ -701,7 +657,7 @@ export interface AddGasSponsorArgs { export interface AddGasSponsorReturn { status: boolean - gasSponsor: GasSponsor + gasSponsor: GasSponsor } export interface UpdateGasSponsorArgs { projectId: number @@ -712,7 +668,7 @@ export interface UpdateGasSponsorArgs { export interface UpdateGasSponsorReturn { status: boolean - gasSponsor: GasSponsor + gasSponsor: GasSponsor } export interface RemoveGasSponsorArgs { projectId: number @@ -720,7 +676,7 @@ export interface RemoveGasSponsorArgs { } export interface RemoveGasSponsorReturn { - status: boolean + status: boolean } export interface AddressGasSponsorsArgs { address: string @@ -729,14 +685,14 @@ export interface AddressGasSponsorsArgs { export interface AddressGasSponsorsReturn { page: Page - gasSponsors: Array + gasSponsors: Array } export interface GetProjectBalanceArgs { projectId: number } export interface GetProjectBalanceReturn { - balance: number + balance: number } export interface AdjustProjectBalanceArgs { projectId: number @@ -745,9 +701,11 @@ export interface AdjustProjectBalanceArgs { } export interface AdjustProjectBalanceReturn { - balance: number + balance: number } + + // // Client // @@ -764,619 +722,521 @@ export class Relayer implements Relayer { private url(name: string): string { return this.hostname + this.path + name } - + ping = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('Ping'), createHTTPRequest({}, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - status: _data.status, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) + return this.fetch( + this.url('Ping'), + createHTTPRequest({}, headers, signal) + ).then((res) => { + return buildResponse(res).then(_data => { + return { + status: (_data.status), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) } - + version = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('Version'), createHTTPRequest({}, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - version: _data.version, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) + return this.fetch( + this.url('Version'), + createHTTPRequest({}, headers, signal) + ).then((res) => { + return buildResponse(res).then(_data => { + return { + version: (_data.version), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) } - + runtimeStatus = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('RuntimeStatus'), createHTTPRequest({}, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - status: _data.status, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) + return this.fetch( + this.url('RuntimeStatus'), + createHTTPRequest({}, headers, signal) + ).then((res) => { + return buildResponse(res).then(_data => { + return { + status: (_data.status), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) } - + getSequenceContext = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('GetSequenceContext'), createHTTPRequest({}, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - data: _data.data, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) + return this.fetch( + this.url('GetSequenceContext'), + createHTTPRequest({}, headers, signal) + ).then((res) => { + return buildResponse(res).then(_data => { + return { + data: (_data.data), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) } - + getChainID = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('GetChainID'), createHTTPRequest({}, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - chainID: _data.chainID, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) + return this.fetch( + this.url('GetChainID'), + createHTTPRequest({}, headers, signal) + ).then((res) => { + return buildResponse(res).then(_data => { + return { + chainID: (_data.chainID), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) } - + sendMetaTxn = (args: SendMetaTxnArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('SendMetaTxn'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - status: _data.status, - txnHash: _data.txnHash, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - getMetaTxnNonce = ( - args: GetMetaTxnNonceArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetMetaTxnNonce'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - nonce: _data.nonce, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - getMetaTxnReceipt = ( - args: GetMetaTxnReceiptArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetMetaTxnReceipt'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - receipt: _data.receipt, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) + return this.fetch( + this.url('SendMetaTxn'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + status: (_data.status), + txnHash: (_data.txnHash), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + getMetaTxnNonce = (args: GetMetaTxnNonceArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('GetMetaTxnNonce'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + nonce: (_data.nonce), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + getMetaTxnReceipt = (args: GetMetaTxnReceiptArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('GetMetaTxnReceipt'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + receipt: (_data.receipt), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) } - + simulate = (args: SimulateArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('Simulate'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - results: >_data.results, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) + return this.fetch( + this.url('Simulate'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + results: >(_data.results), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) } - + simulateV3 = (args: SimulateV3Args, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('SimulateV3'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - results: >_data.results, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - updateMetaTxnGasLimits = ( - args: UpdateMetaTxnGasLimitsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('UpdateMetaTxnGasLimits'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - payload: _data.payload, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) + return this.fetch( + this.url('SimulateV3'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + results: >(_data.results), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + updateMetaTxnGasLimits = (args: UpdateMetaTxnGasLimitsArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('UpdateMetaTxnGasLimits'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + payload: (_data.payload), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) } - + feeTokens = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('FeeTokens'), createHTTPRequest({}, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - isFeeRequired: _data.isFeeRequired, - tokens: >_data.tokens, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) + return this.fetch( + this.url('FeeTokens'), + createHTTPRequest({}, headers, signal) + ).then((res) => { + return buildResponse(res).then(_data => { + return { + isFeeRequired: (_data.isFeeRequired), + tokens: >(_data.tokens), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) } - + feeOptions = (args: FeeOptionsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('FeeOptions'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - options: >_data.options, - sponsored: _data.sponsored, - quote: _data.quote, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - getMetaTxnNetworkFeeOptions = ( - args: GetMetaTxnNetworkFeeOptionsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetMetaTxnNetworkFeeOptions'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - options: >_data.options, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - getMetaTransactions = ( - args: GetMetaTransactionsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetMetaTransactions'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - page: _data.page, - transactions: >_data.transactions, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - getTransactionCost = ( - args: GetTransactionCostArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetTransactionCost'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - cost: _data.cost, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - sentTransactions = ( - args: SentTransactionsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('SentTransactions'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - page: _data.page, - transactions: >_data.transactions, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - pendingTransactions = ( - args: PendingTransactionsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('PendingTransactions'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - page: _data.page, - transactions: >_data.transactions, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) + return this.fetch( + this.url('FeeOptions'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + options: >(_data.options), + sponsored: (_data.sponsored), + quote: (_data.quote), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + getMetaTxnNetworkFeeOptions = (args: GetMetaTxnNetworkFeeOptionsArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('GetMetaTxnNetworkFeeOptions'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + options: >(_data.options), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + getMetaTransactions = (args: GetMetaTransactionsArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('GetMetaTransactions'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + page: (_data.page), + transactions: >(_data.transactions), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + getTransactionCost = (args: GetTransactionCostArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('GetTransactionCost'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + cost: (_data.cost), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + sentTransactions = (args: SentTransactionsArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('SentTransactions'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + page: (_data.page), + transactions: >(_data.transactions), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + pendingTransactions = (args: PendingTransactionsArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('PendingTransactions'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + page: (_data.page), + transactions: >(_data.transactions), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) } - + getGasTank = (args: GetGasTankArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('GetGasTank'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - gasTank: _data.gasTank, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) + return this.fetch( + this.url('GetGasTank'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + gasTank: (_data.gasTank), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) } - + addGasTank = (args: AddGasTankArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('AddGasTank'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - status: _data.status, - gasTank: _data.gasTank, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) + return this.fetch( + this.url('AddGasTank'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + status: (_data.status), + gasTank: (_data.gasTank), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) } - + updateGasTank = (args: UpdateGasTankArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('UpdateGasTank'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - status: _data.status, - gasTank: _data.gasTank, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - nextGasTankBalanceAdjustmentNonce = ( - args: NextGasTankBalanceAdjustmentNonceArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('NextGasTankBalanceAdjustmentNonce'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - nonce: _data.nonce, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - adjustGasTankBalance = ( - args: AdjustGasTankBalanceArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('AdjustGasTankBalance'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - status: _data.status, - adjustment: _data.adjustment, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - getGasTankBalanceAdjustment = ( - args: GetGasTankBalanceAdjustmentArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetGasTankBalanceAdjustment'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - adjustment: _data.adjustment, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - listGasTankBalanceAdjustments = ( - args: ListGasTankBalanceAdjustmentsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('ListGasTankBalanceAdjustments'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - page: _data.page, - adjustments: >_data.adjustments, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - listGasSponsors = ( - args: ListGasSponsorsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('ListGasSponsors'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - page: _data.page, - gasSponsors: >_data.gasSponsors, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) + return this.fetch( + this.url('UpdateGasTank'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + status: (_data.status), + gasTank: (_data.gasTank), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + nextGasTankBalanceAdjustmentNonce = (args: NextGasTankBalanceAdjustmentNonceArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('NextGasTankBalanceAdjustmentNonce'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + nonce: (_data.nonce), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + adjustGasTankBalance = (args: AdjustGasTankBalanceArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('AdjustGasTankBalance'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + status: (_data.status), + adjustment: (_data.adjustment), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + getGasTankBalanceAdjustment = (args: GetGasTankBalanceAdjustmentArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('GetGasTankBalanceAdjustment'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + adjustment: (_data.adjustment), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + listGasTankBalanceAdjustments = (args: ListGasTankBalanceAdjustmentsArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('ListGasTankBalanceAdjustments'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + page: (_data.page), + adjustments: >(_data.adjustments), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + listGasSponsors = (args: ListGasSponsorsArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('ListGasSponsors'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + page: (_data.page), + gasSponsors: >(_data.gasSponsors), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) } - + getGasSponsor = (args: GetGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('GetGasSponsor'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - gasSponsor: _data.gasSponsor, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) + return this.fetch( + this.url('GetGasSponsor'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + gasSponsor: (_data.gasSponsor), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) } - + addGasSponsor = (args: AddGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('AddGasSponsor'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - status: _data.status, - gasSponsor: _data.gasSponsor, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - updateGasSponsor = ( - args: UpdateGasSponsorArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('UpdateGasSponsor'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - status: _data.status, - gasSponsor: _data.gasSponsor, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - removeGasSponsor = ( - args: RemoveGasSponsorArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('RemoveGasSponsor'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - status: _data.status, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - addressGasSponsors = ( - args: AddressGasSponsorsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('AddressGasSponsors'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - page: _data.page, - gasSponsors: >_data.gasSponsors, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - getProjectBalance = ( - args: GetProjectBalanceArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetProjectBalance'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - balance: _data.balance, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - adjustProjectBalance = ( - args: AdjustProjectBalanceArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('AdjustProjectBalance'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - balance: _data.balance, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } -} - -const createHTTPRequest = (body: object = {}, headers: object = {}, signal: AbortSignal | null = null): object => { - const reqHeaders: { [key: string]: string } = { ...headers, 'Content-Type': 'application/json' } + return this.fetch( + this.url('AddGasSponsor'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + status: (_data.status), + gasSponsor: (_data.gasSponsor), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + updateGasSponsor = (args: UpdateGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('UpdateGasSponsor'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + status: (_data.status), + gasSponsor: (_data.gasSponsor), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + removeGasSponsor = (args: RemoveGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('RemoveGasSponsor'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + status: (_data.status), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + addressGasSponsors = (args: AddressGasSponsorsArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('AddressGasSponsors'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + page: (_data.page), + gasSponsors: >(_data.gasSponsors), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + getProjectBalance = (args: GetProjectBalanceArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('GetProjectBalance'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + balance: (_data.balance), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + + adjustProjectBalance = (args: AdjustProjectBalanceArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('AdjustProjectBalance'), + createHTTPRequest(args, headers, signal)).then((res) => { + return buildResponse(res).then(_data => { + return { + balance: (_data.balance), + } + }) + }, (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }) + } + +} + + const createHTTPRequest = (body: object = {}, headers: object = {}, signal: AbortSignal | null = null): object => { + const reqHeaders: {[key: string]: string} = { ...headers, 'Content-Type': 'application/json' } reqHeaders[WebrpcHeader] = WebrpcHeaderValue return { method: 'POST', headers: reqHeaders, body: JSON.stringify(body || {}), - signal, + signal } } const buildResponse = (res: Response): Promise => { - return res.text().then((text) => { + return res.text().then(text => { let data try { data = JSON.parse(text) - } catch (error) { + } catch(error) { let message = '' - if (error instanceof Error) { + if (error instanceof Error) { message = error.message } throw WebrpcBadResponseError.new({ status: res.status, - cause: `JSON.parse(): ${message}: response text: ${text}`, - }) + cause: `JSON.parse(): ${message}: response text: ${text}`}, + ) } if (!res.ok) { - const code: number = typeof data.code === 'number' ? data.code : 0 + const code: number = (typeof data.code === 'number') ? data.code : 0 throw (webrpcErrorByCode[code] || WebrpcError).new(data) } return data @@ -1421,7 +1281,7 @@ export class WebrpcEndpointError extends WebrpcError { code: number = 0, message: string = `endpoint error`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcEndpointError.prototype) @@ -1434,7 +1294,7 @@ export class WebrpcRequestFailedError extends WebrpcError { code: number = -1, message: string = `request failed`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcRequestFailedError.prototype) @@ -1447,7 +1307,7 @@ export class WebrpcBadRouteError extends WebrpcError { code: number = -2, message: string = `bad route`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcBadRouteError.prototype) @@ -1460,7 +1320,7 @@ export class WebrpcBadMethodError extends WebrpcError { code: number = -3, message: string = `bad method`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcBadMethodError.prototype) @@ -1473,7 +1333,7 @@ export class WebrpcBadRequestError extends WebrpcError { code: number = -4, message: string = `bad request`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcBadRequestError.prototype) @@ -1486,7 +1346,7 @@ export class WebrpcBadResponseError extends WebrpcError { code: number = -5, message: string = `bad response`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcBadResponseError.prototype) @@ -1499,7 +1359,7 @@ export class WebrpcServerPanicError extends WebrpcError { code: number = -6, message: string = `server panic`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcServerPanicError.prototype) @@ -1512,7 +1372,7 @@ export class WebrpcInternalErrorError extends WebrpcError { code: number = -7, message: string = `internal error`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcInternalErrorError.prototype) @@ -1525,7 +1385,7 @@ export class WebrpcClientDisconnectedError extends WebrpcError { code: number = -8, message: string = `client disconnected`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcClientDisconnectedError.prototype) @@ -1538,7 +1398,7 @@ export class WebrpcStreamLostError extends WebrpcError { code: number = -9, message: string = `stream lost`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcStreamLostError.prototype) @@ -1551,13 +1411,14 @@ export class WebrpcStreamFinishedError extends WebrpcError { code: number = -10, message: string = `stream finished`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcStreamFinishedError.prototype) } } + // Schema errors export class UnauthorizedError extends WebrpcError { @@ -1566,7 +1427,7 @@ export class UnauthorizedError extends WebrpcError { code: number = 1000, message: string = `Unauthorized access`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, UnauthorizedError.prototype) @@ -1579,7 +1440,7 @@ export class PermissionDeniedError extends WebrpcError { code: number = 1001, message: string = `Permission denied`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, PermissionDeniedError.prototype) @@ -1592,7 +1453,7 @@ export class SessionExpiredError extends WebrpcError { code: number = 1002, message: string = `Session expired`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, SessionExpiredError.prototype) @@ -1605,7 +1466,7 @@ export class MethodNotFoundError extends WebrpcError { code: number = 1003, message: string = `Method not found`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, MethodNotFoundError.prototype) @@ -1618,7 +1479,7 @@ export class RequestConflictError extends WebrpcError { code: number = 1004, message: string = `Conflict with target resource`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, RequestConflictError.prototype) @@ -1631,7 +1492,7 @@ export class AbortedError extends WebrpcError { code: number = 1005, message: string = `Request aborted`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, AbortedError.prototype) @@ -1644,7 +1505,7 @@ export class GeoblockedError extends WebrpcError { code: number = 1006, message: string = `Geoblocked region`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, GeoblockedError.prototype) @@ -1657,7 +1518,7 @@ export class RateLimitedError extends WebrpcError { code: number = 1007, message: string = `Rate-limited. Please slow down.`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, RateLimitedError.prototype) @@ -1670,7 +1531,7 @@ export class ProjectNotFoundError extends WebrpcError { code: number = 1008, message: string = `Project not found`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, ProjectNotFoundError.prototype) @@ -1683,7 +1544,7 @@ export class AccessKeyNotFoundError extends WebrpcError { code: number = 1101, message: string = `Access key not found`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, AccessKeyNotFoundError.prototype) @@ -1696,7 +1557,7 @@ export class AccessKeyMismatchError extends WebrpcError { code: number = 1102, message: string = `Access key mismatch`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, AccessKeyMismatchError.prototype) @@ -1709,7 +1570,7 @@ export class InvalidOriginError extends WebrpcError { code: number = 1103, message: string = `Invalid origin for Access Key`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, InvalidOriginError.prototype) @@ -1722,7 +1583,7 @@ export class InvalidServiceError extends WebrpcError { code: number = 1104, message: string = `Service not enabled for Access key`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, InvalidServiceError.prototype) @@ -1735,7 +1596,7 @@ export class UnauthorizedUserError extends WebrpcError { code: number = 1105, message: string = `Unauthorized user`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, UnauthorizedUserError.prototype) @@ -1748,7 +1609,7 @@ export class QuotaExceededError extends WebrpcError { code: number = 1200, message: string = `Quota request exceeded`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, QuotaExceededError.prototype) @@ -1761,7 +1622,7 @@ export class QuotaRateLimitError extends WebrpcError { code: number = 1201, message: string = `Quota rate limit exceeded`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, QuotaRateLimitError.prototype) @@ -1774,7 +1635,7 @@ export class NoDefaultKeyError extends WebrpcError { code: number = 1300, message: string = `No default access key found`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, NoDefaultKeyError.prototype) @@ -1787,7 +1648,7 @@ export class MaxAccessKeysError extends WebrpcError { code: number = 1301, message: string = `Access keys limit reached`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, MaxAccessKeysError.prototype) @@ -1800,7 +1661,7 @@ export class AtLeastOneKeyError extends WebrpcError { code: number = 1302, message: string = `You need at least one Access Key`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, AtLeastOneKeyError.prototype) @@ -1813,7 +1674,7 @@ export class TimeoutError extends WebrpcError { code: number = 1900, message: string = `Request timed out`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, TimeoutError.prototype) @@ -1826,7 +1687,7 @@ export class InvalidArgumentError extends WebrpcError { code: number = 2001, message: string = `Invalid argument`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, InvalidArgumentError.prototype) @@ -1839,7 +1700,7 @@ export class UnavailableError extends WebrpcError { code: number = 2002, message: string = `Unavailable resource`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, UnavailableError.prototype) @@ -1852,7 +1713,7 @@ export class QueryFailedError extends WebrpcError { code: number = 2003, message: string = `Query failed`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, QueryFailedError.prototype) @@ -1865,7 +1726,7 @@ export class NotFoundError extends WebrpcError { code: number = 3000, message: string = `Resource not found`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, NotFoundError.prototype) @@ -1878,7 +1739,7 @@ export class InsufficientFeeError extends WebrpcError { code: number = 3004, message: string = `Insufficient fee`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, InsufficientFeeError.prototype) @@ -1891,7 +1752,7 @@ export class NotEnoughBalanceError extends WebrpcError { code: number = 3005, message: string = `Not enough balance`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, NotEnoughBalanceError.prototype) @@ -1904,13 +1765,14 @@ export class SimulationFailedError extends WebrpcError { code: number = 3006, message: string = `Simulation failed`, status: number = 0, - cause?: string, + cause?: string ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, SimulationFailedError.prototype) } } + export enum errors { WebrpcEndpoint = 'WebrpcEndpoint', WebrpcRequestFailed = 'WebrpcRequestFailed', @@ -2035,3 +1897,4 @@ export const webrpcErrorByCode: { [code: number]: any } = { } export type Fetch = (input: RequestInfo, init?: RequestInit) => Promise + From 26816e17952b2315603f47f7c6ba75e615a6d54a Mon Sep 17 00:00:00 2001 From: Tolgahan Arikan Date: Wed, 24 Sep 2025 19:11:03 +0300 Subject: [PATCH 046/119] Add missing chainId for dapp client event --- packages/wallet/dapp-client/src/DappClient.ts | 2 +- packages/wallet/dapp-client/src/types/index.ts | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/wallet/dapp-client/src/DappClient.ts b/packages/wallet/dapp-client/src/DappClient.ts index dcc7d81ceb..6d2b42a6de 100644 --- a/packages/wallet/dapp-client/src/DappClient.ts +++ b/packages/wallet/dapp-client/src/DappClient.ts @@ -800,7 +800,7 @@ export class DappClient { this.chainSessionManagers.set(chainId, chainSessionManager) chainSessionManager.on('explicitSessionResponse', (data) => { - this.emit('explicitSessionResponse', { ...data }) + this.emit('explicitSessionResponse', { ...data, chainId }) }) } return chainSessionManager diff --git a/packages/wallet/dapp-client/src/types/index.ts b/packages/wallet/dapp-client/src/types/index.ts index a488c98b78..62ca16df06 100644 --- a/packages/wallet/dapp-client/src/types/index.ts +++ b/packages/wallet/dapp-client/src/types/index.ts @@ -124,9 +124,12 @@ export type DappClientWalletActionEventListener = (data: { chainId: number }) => void -export type DappClientExplicitSessionEventListener = ExplicitSessionEventListener & { +export type DappClientExplicitSessionEventListener = (data: { + action: (typeof RequestActionType)['ADD_EXPLICIT_SESSION' | 'MODIFY_EXPLICIT_SESSION'] + response?: SessionResponse + error?: any chainId: number -} +}) => void // --- DappTransport Types --- From f1a9fb90db342cbe763a7ee07cc1b8fdb02bd6fc Mon Sep 17 00:00:00 2001 From: Tolgahan Arikan Date: Wed, 24 Sep 2025 19:50:59 +0300 Subject: [PATCH 047/119] Fix initializing new chain session manager on redirect --- packages/wallet/dapp-client/src/DappClient.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/wallet/dapp-client/src/DappClient.ts b/packages/wallet/dapp-client/src/DappClient.ts index 6d2b42a6de..584b146b7d 100644 --- a/packages/wallet/dapp-client/src/DappClient.ts +++ b/packages/wallet/dapp-client/src/DappClient.ts @@ -383,6 +383,9 @@ export class DappClient { this.emit('walletActionResponse', eventPayload) } else if (chainId !== undefined) { const chainSessionManager = this.getChainSessionManager(chainId) + if (!chainSessionManager.isInitialized && this.walletAddress) { + chainSessionManager.initializeWithWallet(this.walletAddress) + } await chainSessionManager.handleRedirectResponse(response) } else { throw new InitializationError(`Could not find a pending request context for the redirect action: ${action}`) From 282c0b3ab230191d792c58e7df923412525ac527 Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Fri, 26 Sep 2025 14:48:28 +0200 Subject: [PATCH 048/119] Add support for non-viem, custom Sequence chains (#882) --- .../core/src/relayer/standard/rpc/index.ts | 53 +++++++++++++++++-- 1 file changed, 48 insertions(+), 5 deletions(-) diff --git a/packages/wallet/core/src/relayer/standard/rpc/index.ts b/packages/wallet/core/src/relayer/standard/rpc/index.ts index e18bf7d94d..23f175d2fe 100644 --- a/packages/wallet/core/src/relayer/standard/rpc/index.ts +++ b/packages/wallet/core/src/relayer/standard/rpc/index.ts @@ -7,7 +7,7 @@ import { } from './relayer.gen.js' import { FeeOption, FeeQuote, OperationStatus, Relayer } from '../../relayer.js' import { Address, Hex, Bytes, AbiFunction } from 'ox' -import { Constants, Payload } from '@0xsequence/wallet-primitives' +import { Constants, Payload, Network } from '@0xsequence/wallet-primitives' import { ETHTxnStatus, FeeToken as RpcFeeToken } from './relayer.gen.js' import { decodePrecondition } from '../../../preconditions/index.js' import { @@ -25,12 +25,55 @@ export * from './relayer.gen.js' export type Fetch = (input: RequestInfo, init?: RequestInit) => Promise +/** + * Convert a Sequence Network to a viem Chain + */ +const networkToChain = (network: Network.Network): Chain => { + return { + id: network.chainId, + name: network.title || network.name, + nativeCurrency: { + name: network.nativeCurrency.name, + symbol: network.nativeCurrency.symbol, + decimals: network.nativeCurrency.decimals, + }, + rpcUrls: { + default: { + http: [network.rpcUrl], + }, + }, + blockExplorers: network.blockExplorer + ? { + default: { + name: network.blockExplorer.name || 'Explorer', + url: network.blockExplorer.url, + }, + } + : undefined, + contracts: network.ensAddress + ? { + ensUniversalResolver: { + address: network.ensAddress as `0x${string}`, + }, + } + : undefined, + } as Chain +} + export const getChain = (chainId: number): Chain => { - const chain = Object.values(chains).find((c: any) => typeof c === 'object' && 'id' in c && c.id === chainId) - if (!chain) { - throw new Error(`Chain with id ${chainId} not found`) + // First try to get the chain from Sequence's network configurations + const sequenceNetwork = Network.getNetworkFromChainId(chainId) + if (sequenceNetwork) { + return networkToChain(sequenceNetwork) } - return chain as Chain + + // Fall back to viem's built-in chains + const viemChain = Object.values(chains).find((c: any) => typeof c === 'object' && 'id' in c && c.id === chainId) + if (viemChain) { + return viemChain as Chain + } + + throw new Error(`Chain with id ${chainId} not found in Sequence networks or viem chains`) } export class RpcRelayer implements Relayer { From 40e483a210028dbe31b30401b90496484fba0661 Mon Sep 17 00:00:00 2001 From: Michael Standen Date: Tue, 30 Sep 2025 17:37:55 +1300 Subject: [PATCH 049/119] Provider sent to prepareBlankEnvelope --- packages/wallet/core/src/wallet.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/wallet/core/src/wallet.ts b/packages/wallet/core/src/wallet.ts index db4733e2be..05a02da09e 100644 --- a/packages/wallet/core/src/wallet.ts +++ b/packages/wallet/core/src/wallet.ts @@ -402,7 +402,7 @@ export class Wallet { factory, factoryData, }, - ...(await this.prepareBlankEnvelope(Number(chainId))), + ...(await this.prepareBlankEnvelope(Number(chainId), provider)), } } @@ -490,7 +490,7 @@ export class Wallet { nonce, calls, }, - ...(await this.prepareBlankEnvelope(Number(chainId))), + ...(await this.prepareBlankEnvelope(Number(chainId), provider)), } } @@ -597,8 +597,8 @@ export class Wallet { return encoded } - private async prepareBlankEnvelope(chainId: number) { - const status = await this.getStatus() + private async prepareBlankEnvelope(chainId: number, provider?: Provider.Provider) { + const status = await this.getStatus(provider) return { wallet: this.address, From a3f8af886a7a2b61898caa8731710b1d5c499a26 Mon Sep 17 00:00:00 2001 From: Michael Standen Date: Thu, 2 Oct 2025 15:03:27 +1300 Subject: [PATCH 050/119] Add session signature decoding --- .../core/src/signers/session-manager.ts | 2 +- .../primitives-cli/src/subcommands/session.ts | 2 +- .../wallet/primitives/src/session-config.ts | 77 ++++++ .../primitives/src/session-signature.ts | 100 +++++++- .../primitives/test/session-config.test.ts | 219 +++++++++++++++--- .../primitives/test/session-signature.test.ts | 145 +++++++----- 6 files changed, 443 insertions(+), 102 deletions(-) diff --git a/packages/wallet/core/src/signers/session-manager.ts b/packages/wallet/core/src/signers/session-manager.ts index 99d189131e..316f9a9ad3 100644 --- a/packages/wallet/core/src/signers/session-manager.ts +++ b/packages/wallet/core/src/signers/session-manager.ts @@ -325,7 +325,7 @@ export class SessionManager implements SapientSigner { } // Perform encoding - const encodedSignature = SessionSignature.encodeSessionCallSignatures( + const encodedSignature = SessionSignature.encodeSessionSignature( signatures, await this.topology, identitySigner, diff --git a/packages/wallet/primitives-cli/src/subcommands/session.ts b/packages/wallet/primitives-cli/src/subcommands/session.ts index 28453121c3..2672721c61 100644 --- a/packages/wallet/primitives-cli/src/subcommands/session.ts +++ b/packages/wallet/primitives-cli/src/subcommands/session.ts @@ -33,7 +33,7 @@ export async function doEncodeSessionCallSignatures( } identitySigner = identitySigners[0]! } - const encoded = SessionSignature.encodeSessionCallSignatures( + const encoded = SessionSignature.encodeSessionSignature( callSignatures, sessionTopology, identitySigner as `0x${string}`, diff --git a/packages/wallet/primitives/src/session-config.ts b/packages/wallet/primitives/src/session-config.ts index 8d61113a4f..46e3d9f526 100644 --- a/packages/wallet/primitives/src/session-config.ts +++ b/packages/wallet/primitives/src/session-config.ts @@ -342,6 +342,83 @@ export function encodeSessionsTopology(topology: SessionsTopology): Bytes.Bytes throw new Error('Invalid topology') } +export function decodeSessionsTopology(bytes: Bytes.Bytes): SessionsTopology { + const { topology } = decodeSessionTopologyPointer(bytes) + return topology +} + +function decodeSessionTopologyPointer(bytes: Bytes.Bytes): { + topology: SessionsTopology + pointer: number +} { + if (bytes.length === 0) { + throw new Error('Empty topology bytes') + } + + const flagByte = bytes[0]! + const flag = (flagByte & 0xf0) >> 4 + const sizeSize = flagByte & 0x0f + + if (flag === SESSIONS_FLAG_BRANCH) { + // Branch + if (sizeSize === 0 || sizeSize > 15) { + throw new Error('Invalid branch size') + } + + let offset = 1 + const encodedLength = Bytes.toNumber(bytes.slice(offset, offset + sizeSize)) + offset += sizeSize + + const encodedBranches = bytes.slice(offset, offset + encodedLength) + const branches: SessionsTopology[] = [] + + let branchOffset = 0 + while (branchOffset < encodedBranches.length) { + const { topology: branchTopology, pointer: branchPointer } = decodeSessionTopologyPointer( + encodedBranches.slice(branchOffset), + ) + branches.push(branchTopology) + branchOffset += branchPointer + } + + return { topology: branches as SessionsTopology, pointer: offset + encodedLength } + } else if (flag === SESSIONS_FLAG_PERMISSIONS) { + // Permissions + const sessionPermissions = decodeSessionPermissions(bytes.slice(1)) + const nodeLength = 1 + encodeSessionPermissions(sessionPermissions).length + return { topology: { type: 'session-permissions', ...sessionPermissions }, pointer: nodeLength } + } else if (flag === SESSIONS_FLAG_NODE) { + // Node + if (bytes.length < 33) { + throw new Error('Invalid node length') + } + return { topology: Hex.fromBytes(bytes.slice(1, 33)), pointer: 33 } + } else if (flag === SESSIONS_FLAG_BLACKLIST) { + // Blacklist + const blacklistLength = sizeSize === 0x0f ? Bytes.toNumber(bytes.slice(1, 3)) : sizeSize + const offset = sizeSize === 0x0f ? 3 : 1 + + const blacklist: Address.Address[] = [] + for (let i = 0; i < blacklistLength; i++) { + const addressBytes = bytes.slice(offset + i * 20, offset + (i + 1) * 20) + blacklist.push(Address.from(Hex.fromBytes(addressBytes))) + } + + return { topology: { type: 'implicit-blacklist', blacklist }, pointer: offset + blacklistLength * 20 } + } else if (flag === SESSIONS_FLAG_IDENTITY_SIGNER) { + // Identity signer + if (bytes.length < 21) { + throw new Error('Invalid identity signer length') + } + return { + topology: { type: 'identity-signer', identitySigner: Address.from(Hex.fromBytes(bytes.slice(1, 21))) }, + pointer: 21, + } + } else { + throw new Error(`Invalid topology flag: ${flag}`) + } +} + // JSON export function sessionsTopologyToJson(topology: SessionsTopology): string { diff --git a/packages/wallet/primitives/src/session-signature.ts b/packages/wallet/primitives/src/session-signature.ts index 6f92fa5be1..a9f5144a13 100644 --- a/packages/wallet/primitives/src/session-signature.ts +++ b/packages/wallet/primitives/src/session-signature.ts @@ -1,7 +1,7 @@ import { Address, Bytes, Hash, Hex } from 'ox' -import { Attestation, encode, encodeForJson, fromParsed, toJson } from './attestation.js' import { MAX_PERMISSIONS_COUNT } from './permission.js' import { + decodeSessionsTopology, encodeSessionsTopology, getIdentitySigners, isCompleteSessionsTopology, @@ -9,11 +9,11 @@ import { SessionsTopology, } from './session-config.js' import { RSY } from './signature.js' -import { minBytesFor, packRSY } from './utils.js' -import { Payload } from './index.js' +import { minBytesFor, packRSY, unpackRSY } from './utils.js' +import { Attestation, Payload } from './index.js' export type ImplicitSessionCallSignature = { - attestation: Attestation + attestation: Attestation.Attestation identitySignature: RSY sessionSignature: RSY } @@ -46,7 +46,7 @@ export function sessionCallSignatureToJson(callSignature: SessionCallSignature): export function encodeSessionCallSignatureForJson(callSignature: SessionCallSignature): any { if (isImplicitSessionCallSignature(callSignature)) { return { - attestation: encodeForJson(callSignature.attestation), + attestation: Attestation.encodeForJson(callSignature.attestation), identitySignature: rsyToRsvStr(callSignature.identitySignature), sessionSignature: rsyToRsvStr(callSignature.sessionSignature), } @@ -68,7 +68,7 @@ export function sessionCallSignatureFromJson(json: string): SessionCallSignature export function sessionCallSignatureFromParsed(decoded: any): SessionCallSignature { if (decoded.attestation) { return { - attestation: fromParsed(decoded.attestation), + attestation: Attestation.fromParsed(decoded.attestation), identitySignature: rsyFromRsvStr(decoded.identitySignature), sessionSignature: rsyFromRsvStr(decoded.sessionSignature), } @@ -113,7 +113,7 @@ function rsyFromRsvStr(sigStr: string): RSY { * @param identitySigner The identity signer to encode. Others will be hashed into nodes. * @returns The encoded session call signatures. */ -export function encodeSessionCallSignatures( +export function encodeSessionSignature( callSignatures: SessionCallSignature[], topology: SessionsTopology, identitySigner: Address.Address, @@ -151,10 +151,12 @@ export function encodeSessionCallSignatures( // Map each call signature to its attestation index callSignatures.filter(isImplicitSessionCallSignature).forEach((callSig) => { if (callSig.attestation) { - const attestationStr = toJson(callSig.attestation) + const attestationStr = Attestation.toJson(callSig.attestation) if (!attestationMap.has(attestationStr)) { attestationMap.set(attestationStr, encodedAttestations.length) - encodedAttestations.push(Bytes.concat(encode(callSig.attestation), packRSY(callSig.identitySignature))) + encodedAttestations.push( + Bytes.concat(Attestation.encode(callSig.attestation), packRSY(callSig.identitySignature)), + ) } } }) @@ -169,7 +171,7 @@ export function encodeSessionCallSignatures( for (const callSignature of callSignatures) { if (isImplicitSessionCallSignature(callSignature)) { // Implicit - const attestationStr = toJson(callSignature.attestation) + const attestationStr = Attestation.toJson(callSignature.attestation) const attestationIndex = attestationMap.get(attestationStr) if (attestationIndex === undefined) { // Unreachable @@ -193,7 +195,83 @@ export function encodeSessionCallSignatures( return Bytes.concat(...parts) } -// Helper +export function decodeSessionSignature(encodedSignatures: Bytes.Bytes): { + topology: SessionsTopology + callSignatures: SessionCallSignature[] +} { + let offset = 0 + + // Parse session topology length (3 bytes) + const topologyLength = Bytes.toNumber(encodedSignatures.slice(offset, offset + 3)) + offset += 3 + + // Parse session topology + const topologyBytes = encodedSignatures.slice(offset, offset + topologyLength) + offset += topologyLength + const topology = decodeSessionsTopology(topologyBytes) + + // Parse attestations count (1 byte) + const attestationsCount = Bytes.toNumber(encodedSignatures.slice(offset, offset + 1)) + offset += 1 + + // Parse attestations and identity signatures + const attestations: Attestation.Attestation[] = [] + const identitySignatures: RSY[] = [] + + for (let i = 0; i < attestationsCount; i++) { + // Parse attestation + const attestation = Attestation.decode(encodedSignatures.slice(offset)) + offset += Attestation.encode(attestation).length + attestations.push(attestation) + + // Parse identity signature (64 bytes) + const identitySignature = unpackRSY(encodedSignatures.slice(offset, offset + 64)) + offset += 64 + identitySignatures.push(identitySignature) + } + + // Parse call signatures + const callSignatures: SessionCallSignature[] = [] + + while (offset < encodedSignatures.length) { + // Parse flag byte + const flagByte = encodedSignatures[offset]! + offset += 1 + + // Parse session signature (64 bytes) + const sessionSignature = unpackRSY(encodedSignatures.slice(offset, offset + 64)) + offset += 64 + + // Check if implicit (MSB set) or explicit + if ((flagByte & 0x80) !== 0) { + // Implicit call signature + const attestationIndex = flagByte & 0x7f + if (attestationIndex >= attestations.length) { + throw new Error('Invalid attestation index') + } + + callSignatures.push({ + attestation: attestations[attestationIndex]!, + identitySignature: identitySignatures[attestationIndex]!, + sessionSignature, + }) + } else { + // Explicit call signature + const permissionIndex = flagByte + callSignatures.push({ + permissionIndex: BigInt(permissionIndex), + sessionSignature, + }) + } + } + + return { + topology, + callSignatures, + } +} + +// Call encoding export function hashCallWithReplayProtection( payload: Payload.Calls, diff --git a/packages/wallet/primitives/test/session-config.test.ts b/packages/wallet/primitives/test/session-config.test.ts index 15e178f8cf..149b17565d 100644 --- a/packages/wallet/primitives/test/session-config.test.ts +++ b/packages/wallet/primitives/test/session-config.test.ts @@ -1,59 +1,60 @@ +import { Address, Bytes } from 'ox' import { describe, expect, it } from 'vitest' -import { Address, Bytes, Hex } from 'ox' +import { ChainId } from '../src/network.js' +import { ParameterOperation, Permission, SessionPermissions } from '../src/permission.js' import { - SESSIONS_FLAG_PERMISSIONS, - SESSIONS_FLAG_NODE, - SESSIONS_FLAG_BRANCH, + IdentitySignerLeaf, + ImplicitBlacklistLeaf, SESSIONS_FLAG_BLACKLIST, + SESSIONS_FLAG_BRANCH, SESSIONS_FLAG_IDENTITY_SIGNER, - ImplicitBlacklistLeaf, - IdentitySignerLeaf, - SessionPermissionsLeaf, - SessionNode, + SESSIONS_FLAG_NODE, + SESSIONS_FLAG_PERMISSIONS, SessionBranch, + SessionNode, + SessionPermissionsLeaf, SessionsTopology, - isSessionsTopology, - isCompleteSessionsTopology, + addExplicitSession, + addToImplicitBlacklist, + balanceSessionsTopology, + cleanSessionsTopology, + configurationTreeToSessionsTopology, + decodeLeafFromBytes, + decodeSessionsTopology, + emptySessionsTopology, + encodeLeafToGeneric, + encodeSessionsTopology, + getExplicitSigners, getIdentitySigners, getImplicitBlacklist, getImplicitBlacklistLeaf, getSessionPermissions, - getExplicitSigners, - encodeLeafToGeneric, - decodeLeafFromBytes, - sessionsTopologyToConfigurationTree, - configurationTreeToSessionsTopology, - encodeSessionsTopology, - sessionsTopologyToJson, - sessionsTopologyFromJson, - removeExplicitSession, - addExplicitSession, + isCompleteSessionsTopology, + isSessionsTopology, mergeSessionsTopologies, - balanceSessionsTopology, - cleanSessionsTopology, minimiseSessionsTopology, - addToImplicitBlacklist, + removeExplicitSession, removeFromImplicitBlacklist, - emptySessionsTopology, + sessionsTopologyFromJson, + sessionsTopologyToConfigurationTree, + sessionsTopologyToJson, } from '../src/session-config.js' -import { SessionPermissions } from '../src/permission.js' -import { ChainId } from '../src/network.js' describe('Session Config', () => { // Test data - const testAddress1 = '0x742d35cc6635c0532925a3b8d563a6b35b7f05f1' as Address.Address - const testAddress2 = '0x8ba1f109551bd432803012645aac136c776056c0' as Address.Address - const testAddress3 = '0xa0b86a33e6f8b5f56e64c9e1a1b8c6a9cc4b9a9e' as Address.Address - const testNode = '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef' as SessionNode + const testAddress1: Address.Address = '0x742d35cc6635c0532925a3b8d563a6b35b7f05f1' + const testAddress2: Address.Address = '0x8ba1f109551bd432803012645aac136c776056c0' + const testAddress3: Address.Address = '0xa0b86a33e6f8b5f56e64c9e1a1b8c6a9cc4b9a9e' + const testNode: SessionNode = '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef' - const samplePermission = { + const samplePermission: Permission = { target: testAddress3, rules: [ { cumulative: false, - operation: 0, // EQUAL - value: Bytes.fromHex('0x'), + operation: ParameterOperation.EQUAL, + value: Bytes.fromHex('0x0000000000000000000000000000000000000000000000000000000000000000'), offset: 0n, mask: Bytes.fromHex('0xffffffff00000000000000000000000000000000000000000000000000000000'), }, @@ -399,12 +400,14 @@ describe('Session Config', () => { }) }) - describe('Sessions Topology Encoding', () => { + describe('Sessions Topology Encoding and Decoding', () => { describe('encodeSessionsTopology', () => { it('should encode session permissions leaf', () => { const result = encodeSessionsTopology(sampleSessionPermissionsLeaf) expect(result).toBeInstanceOf(Uint8Array) expect(result[0] >> 4).toBe(SESSIONS_FLAG_PERMISSIONS) + const decoded = decodeSessionsTopology(result) + expect(decoded).toEqual(sampleSessionPermissionsLeaf) }) it('should encode session node', () => { @@ -412,12 +415,16 @@ describe('Session Config', () => { expect(result).toBeInstanceOf(Uint8Array) expect(result[0] >> 4).toBe(SESSIONS_FLAG_NODE) expect(result.length).toBe(33) // 1 flag byte + 32 hash bytes + const decoded = decodeSessionsTopology(result) + expect(decoded).toEqual(testNode) }) it('should encode blacklist leaf', () => { const result = encodeSessionsTopology(sampleBlacklistLeaf) expect(result).toBeInstanceOf(Uint8Array) expect(result[0] >> 4).toBe(SESSIONS_FLAG_BLACKLIST) + const decoded = decodeSessionsTopology(result) + expect(decoded).toEqual(sampleBlacklistLeaf) }) it('should encode identity signer leaf', () => { @@ -425,12 +432,16 @@ describe('Session Config', () => { expect(result).toBeInstanceOf(Uint8Array) expect(result[0] >> 4).toBe(SESSIONS_FLAG_IDENTITY_SIGNER) expect(result.length).toBe(21) // 1 flag byte + 20 address bytes + const decoded = decodeSessionsTopology(result) + expect(decoded).toEqual(sampleIdentitySignerLeaf) }) it('should encode session branch', () => { const result = encodeSessionsTopology(sampleBranch) expect(result).toBeInstanceOf(Uint8Array) expect(result[0] >> 4).toBe(SESSIONS_FLAG_BRANCH) + const decoded = decodeSessionsTopology(result) + expect(decoded).toEqual(sampleBranch) }) it('should handle large blacklist with extended encoding', () => { @@ -441,6 +452,15 @@ describe('Session Config', () => { const result = encodeSessionsTopology(largeBlacklist) expect(result).toBeInstanceOf(Uint8Array) expect(result[0] & 0x0f).toBe(0x0f) // Extended encoding flag + const decoded = decodeSessionsTopology(result) + expect(decoded).toEqual(largeBlacklist) + }) + + it('should handle complete topology', () => { + const result = encodeSessionsTopology(sampleCompleteTopology) + expect(result).toBeInstanceOf(Uint8Array) + const decoded = decodeSessionsTopology(result) + expect(decoded).toEqual(sampleCompleteTopology) }) it('should throw for blacklist too large', () => { @@ -725,6 +745,137 @@ describe('Session Config', () => { it('should throw for invalid topology', () => { expect(() => minimiseSessionsTopology({} as any, [], [])).toThrow('Invalid topology') }) + + it('should minimize topology with multiple identity signers but keep only the specified one', () => { + // Create multiple identity signer leaves + const identitySigner1: IdentitySignerLeaf = { + type: 'identity-signer', + identitySigner: testAddress1, + } + const identitySigner2: IdentitySignerLeaf = { + type: 'identity-signer', + identitySigner: testAddress2, + } + const identitySigner3: IdentitySignerLeaf = { + type: 'identity-signer', + identitySigner: testAddress3, + } + + // Create topology with multiple identity signers + const topologyWithMultipleIdentitySigners: SessionBranch = [ + sampleBlacklistLeaf, + identitySigner1, + identitySigner2, + identitySigner3, + sampleSessionPermissionsLeaf, + ] + + // Minimize with only testAddress2 as the identity signer + const result = minimiseSessionsTopology( + topologyWithMultipleIdentitySigners, + [], // no explicit signers + [], // no implicit signers + testAddress2, // only keep this identity signer + ) + + expect(isSessionsTopology(result)).toBe(true) + + // Get all identity signers from the result + const identitySigners = getIdentitySigners(result) + + // Should only contain the specified identity signer + expect(identitySigners).toEqual([testAddress2]) + expect(identitySigners).not.toContain(testAddress1) + expect(identitySigners).not.toContain(testAddress3) + + // Verify the result is still a valid topology + expect(isSessionsTopology(result)).toBe(true) + }) + + it('should minimize deeply nested topology with multiple identity signers but keep only the specified one', () => { + // Create multiple identity signer leaves + const identitySigner1: IdentitySignerLeaf = { + type: 'identity-signer', + identitySigner: testAddress1, + } + const identitySigner2: IdentitySignerLeaf = { + type: 'identity-signer', + identitySigner: testAddress2, + } + const identitySigner3: IdentitySignerLeaf = { + type: 'identity-signer', + identitySigner: testAddress3, + } + + // Create additional session permissions for nesting + const sessionPermissions2: SessionPermissionsLeaf = { + type: 'session-permissions', + signer: testAddress2, + chainId: ChainId.MAINNET, + valueLimit: 500000000000000000n, + deadline: BigInt(Math.floor(Date.now() / 1000) + 1800), + permissions: [samplePermission], + } + + const sessionPermissions3: SessionPermissionsLeaf = { + type: 'session-permissions', + signer: testAddress3, + chainId: ChainId.MAINNET, + valueLimit: 750000000000000000n, + deadline: BigInt(Math.floor(Date.now() / 1000) + 2700), + permissions: [samplePermission], + } + + // Create a deeply nested topology structure + // Level 1: Main branch + // Level 2: Nested branches containing different combinations + const deeplyNestedTopology: SessionBranch = [ + // First nested branch: blacklist + identity signer 1 + [ + sampleBlacklistLeaf, + identitySigner1, + sampleSessionPermissionsLeaf, // testAddress1 session + ], + // Second nested branch: identity signer 2 + session permissions 2 + [ + identitySigner2, + sessionPermissions2, // testAddress2 session + ], + // Third nested branch: identity signer 3 + session permissions 3 + [ + identitySigner3, + sessionPermissions3, // testAddress3 session + ], + ] + + // Minimize with only testAddress2 as the identity signer + const result = minimiseSessionsTopology( + deeplyNestedTopology, + [], // no explicit signers + [], // no implicit signers + testAddress2, // only keep this identity signer + ) + + expect(isSessionsTopology(result)).toBe(true) + + // Get all identity signers from the result + const identitySigners = getIdentitySigners(result) + + // Should only contain the specified identity signer + expect(identitySigners).toEqual([testAddress2]) + expect(identitySigners).not.toContain(testAddress1) + expect(identitySigners).not.toContain(testAddress3) + + // Verify the result is still a valid topology + expect(isSessionsTopology(result)).toBe(true) + + // Verify that the nested structure is properly minimized + // The result should be a branch with hashed nodes and the preserved identity signer + if (Array.isArray(result)) { + // Should have some components (hashed nodes and the preserved identity signer) + expect(result.length).toBeGreaterThan(0) + } + }) }) describe('addToImplicitBlacklist', () => { diff --git a/packages/wallet/primitives/test/session-signature.test.ts b/packages/wallet/primitives/test/session-signature.test.ts index a9b193d79c..b8efe28c2f 100644 --- a/packages/wallet/primitives/test/session-signature.test.ts +++ b/packages/wallet/primitives/test/session-signature.test.ts @@ -1,29 +1,31 @@ +import { Address, Bytes, Hex } from 'ox' import { describe, expect, it } from 'vitest' -import { Address, Bytes, Hash, Hex } from 'ox' +import { Attestation } from '../src/attestation.js' +import { ChainId } from '../src/network.js' +import * as Payload from '../src/payload.js' +import { ParameterOperation } from '../src/permission.js' +import { minimiseSessionsTopology, SessionsTopology } from '../src/session-config.js' import { - ImplicitSessionCallSignature, + decodeSessionSignature, + encodeSessionCallSignatureForJson, + encodeSessionSignature, ExplicitSessionCallSignature, - SessionCallSignature, - isImplicitSessionCallSignature, + hashCallWithReplayProtection, + ImplicitSessionCallSignature, isExplicitSessionCallSignature, - sessionCallSignatureToJson, - encodeSessionCallSignatureForJson, + isImplicitSessionCallSignature, + SessionCallSignature, sessionCallSignatureFromJson, sessionCallSignatureFromParsed, - encodeSessionCallSignatures, - hashCallWithReplayProtection, + sessionCallSignatureToJson, } from '../src/session-signature.js' import { RSY } from '../src/signature.js' -import { Attestation } from '../src/attestation.js' -import { SessionsTopology } from '../src/session-config.js' -import * as Payload from '../src/payload.js' -import { ChainId } from '../src/network.js' describe('Session Signature', () => { // Test data - const testAddress1 = '0x742d35cc6635c0532925a3b8d563a6b35b7f05f1' as Address.Address - const testAddress2 = '0x8ba1f109551bd432803012645aac136c776056c0' as Address.Address + const testAddress1: Address.Address = '0x742d35cc6635c0532925a3b8d563a6b35b7f05f1' + const testAddress2: Address.Address = '0x8ba1f109551bd432803012645aac136c776056c0' const testChainId = ChainId.MAINNET const testSpace = 0n const testNonce = 1n @@ -102,7 +104,7 @@ describe('Session Signature', () => { rules: [ { cumulative: false, - operation: 0, + operation: ParameterOperation.EQUAL, value: Bytes.fromHex('0x'), offset: 0n, mask: Bytes.fromHex('0xffffffff00000000000000000000000000000000000000000000000000000000'), @@ -276,31 +278,50 @@ describe('Session Signature', () => { }) }) - describe('Signature Encoding', () => { - describe('encodeSessionCallSignatures', () => { + describe('Signature Encoding and Decoding', () => { + describe('encode / decodeSessionCallSignatures', () => { it('should encode single explicit session call signature', () => { const callSignatures = [sampleExplicitSignature] - const result = encodeSessionCallSignatures(callSignatures, completeTopology, testAddress1) + const result = encodeSessionSignature(callSignatures, completeTopology, testAddress1) expect(result).toBeInstanceOf(Uint8Array) expect(result.length).toBeGreaterThan(0) + + const decoded = decodeSessionSignature(result) + expect(decoded.callSignatures.length).toBe(1) + const callSignature = decoded.callSignatures[0]! + if (!isExplicitSessionCallSignature(callSignature)) { + throw new Error('Call signature is not explicit') + } + expect(callSignature.permissionIndex).toBe(callSignatures[0]!.permissionIndex) + // The topology gets minimized during encoding, so we expect the minimized version + const minimizedTopology = minimiseSessionsTopology(completeTopology, [], [], testAddress1) + expect(decoded.topology).toEqual(minimizedTopology) }) // Skip implicit signature tests that cause encoding issues it.skip('should encode single implicit session call signature', () => { const callSignatures = [sampleImplicitSignature] - const result = encodeSessionCallSignatures(callSignatures, completeTopology, testAddress1) + const result = encodeSessionSignature(callSignatures, completeTopology, testAddress1) expect(result).toBeInstanceOf(Uint8Array) expect(result.length).toBeGreaterThan(0) + + const decoded = decodeSessionSignature(result) + expect(decoded.callSignatures).toEqual(callSignatures) + expect(decoded.topology).toEqual(completeTopology) }) it.skip('should encode multiple mixed session call signatures', () => { const callSignatures = [sampleImplicitSignature, sampleExplicitSignature] - const result = encodeSessionCallSignatures(callSignatures, completeTopology, testAddress1) + const result = encodeSessionSignature(callSignatures, completeTopology, testAddress1) expect(result).toBeInstanceOf(Uint8Array) expect(result.length).toBeGreaterThan(0) + + const decoded = decodeSessionSignature(result) + expect(decoded.callSignatures).toEqual(callSignatures) + expect(decoded.topology).toEqual(completeTopology) }) it.skip('should encode multiple implicit signatures with same attestation', () => { @@ -311,10 +332,15 @@ describe('Session Signature', () => { sessionSignature: sampleRSY2, // Different session signature }, ] - const result = encodeSessionCallSignatures(callSignatures, completeTopology, testAddress1) + const result = encodeSessionSignature(callSignatures, completeTopology, testAddress1) expect(result).toBeInstanceOf(Uint8Array) expect(result.length).toBeGreaterThan(0) + + const decoded = decodeSessionSignature(result) + expect(decoded.callSignatures).toEqual(callSignatures) + const minimizedTopology = minimiseSessionsTopology(completeTopology, [], [], testAddress1) + expect(decoded.topology).toEqual(minimizedTopology) }) it('should throw for incomplete topology', () => { @@ -335,8 +361,8 @@ describe('Session Signature', () => { rules: [ { cumulative: false, - operation: 0, - value: Bytes.fromHex('0x'), + operation: ParameterOperation.EQUAL, + value: Bytes.fromHex('0x0000000000000000000000000000000000000000000000000000000000000000'), offset: 0n, mask: Bytes.fromHex('0xffffffff00000000000000000000000000000000000000000000000000000000'), }, @@ -347,7 +373,7 @@ describe('Session Signature', () => { // Missing identity signer, but has 2 elements for valid SessionBranch ] - expect(() => encodeSessionCallSignatures([sampleExplicitSignature], incompleteTopology, testAddress1)).toThrow( + expect(() => encodeSessionSignature([sampleExplicitSignature], incompleteTopology, testAddress1)).toThrow( 'Incomplete topology', ) }) @@ -358,43 +384,52 @@ describe('Session Signature', () => { sessionSignature: sampleRSY, } - expect(() => encodeSessionCallSignatures([largeIndexSignature], completeTopology, testAddress1)).toThrow( + expect(() => encodeSessionSignature([largeIndexSignature], completeTopology, testAddress1)).toThrow( 'Permission index is too large', ) }) - it('should throw for too many attestations (simplified)', () => { - // Just test that we can create many explicit signatures instead - const callSignatures: ExplicitSessionCallSignature[] = Array(10) - .fill(null) - .map((_, i) => ({ - permissionIndex: BigInt(i), - sessionSignature: sampleRSY, - })) - - const result = encodeSessionCallSignatures(callSignatures, completeTopology, testAddress1) - expect(result).toBeInstanceOf(Uint8Array) - }) - it('should handle explicit signers parameter', () => { const callSignatures = [sampleExplicitSignature] - const result = encodeSessionCallSignatures(callSignatures, completeTopology, testAddress1) + const result = encodeSessionSignature(callSignatures, completeTopology, testAddress1) expect(result).toBeInstanceOf(Uint8Array) expect(result.length).toBeGreaterThan(0) + + const decoded = decodeSessionSignature(result) + expect(decoded.callSignatures.length).toBe(1) + const callSignature = decoded.callSignatures[0]! + if (!isExplicitSessionCallSignature(callSignature)) { + throw new Error('Call signature is not explicit') + } + expect(callSignature.permissionIndex).toBe(callSignatures[0]!.permissionIndex) + // The topology gets minimized during encoding, so we expect the minimized version + const minimizedTopology = minimiseSessionsTopology(completeTopology, [], [], testAddress1) + expect(decoded.topology).toEqual(minimizedTopology) }) it('should handle implicit signers parameter', () => { const callSignatures = [sampleExplicitSignature] - const result = encodeSessionCallSignatures(callSignatures, completeTopology, testAddress1, [], [testAddress2]) + const result = encodeSessionSignature(callSignatures, completeTopology, testAddress1, [], [testAddress2]) expect(result).toBeInstanceOf(Uint8Array) expect(result.length).toBeGreaterThan(0) + + const decoded = decodeSessionSignature(result) + expect(decoded.callSignatures.length).toBe(1) + const callSignature = decoded.callSignatures[0]! + if (!isExplicitSessionCallSignature(callSignature)) { + throw new Error('Call signature is not explicit') + } + expect(callSignature.permissionIndex).toBe(callSignatures[0]!.permissionIndex) + // The topology gets minimized during encoding, so we expect the minimized version + const minimizedTopology = minimiseSessionsTopology(completeTopology, [], [testAddress2], testAddress1) + expect(decoded.topology).toEqual(minimizedTopology) }) it('should throw for invalid call signature type', () => { const invalidSignature = {} as any - expect(() => encodeSessionCallSignatures([invalidSignature], completeTopology, testAddress1)).toThrow( + expect(() => encodeSessionSignature([invalidSignature], completeTopology, testAddress1)).toThrow( 'Invalid call signature', ) }) @@ -402,7 +437,7 @@ describe('Session Signature', () => { it('should throw for identity signer not found', () => { const callSignatures = [sampleExplicitSignature] expect(() => - encodeSessionCallSignatures(callSignatures, completeTopology, testAddress2, [], [testAddress2]), + encodeSessionSignature(callSignatures, completeTopology, testAddress2, [], [testAddress2]), ).toThrow('Identity signer not found') }) }) @@ -532,7 +567,7 @@ describe('Session Signature', () => { describe('Edge Cases and Error Handling', () => { it('should handle empty call signatures array', () => { - const result = encodeSessionCallSignatures([], completeTopology, testAddress1) + const result = encodeSessionSignature([], completeTopology, testAddress1) expect(result).toBeInstanceOf(Uint8Array) expect(result.length).toBeGreaterThan(0) // Should still contain topology }) @@ -543,7 +578,7 @@ describe('Session Signature', () => { sessionSignature: sampleRSY, } - const result = encodeSessionCallSignatures([maxIndexSignature], completeTopology, testAddress1) + const result = encodeSessionSignature([maxIndexSignature], completeTopology, testAddress1) expect(result).toBeInstanceOf(Uint8Array) }) @@ -553,7 +588,7 @@ describe('Session Signature', () => { sessionSignature: sampleRSY, } - const result = encodeSessionCallSignatures([zeroIndexSignature], completeTopology, testAddress1) + const result = encodeSessionSignature([zeroIndexSignature], completeTopology, testAddress1) expect(result).toBeInstanceOf(Uint8Array) }) @@ -586,9 +621,9 @@ describe('Session Signature', () => { it.skip('should handle attestation with minimal data', () => { const minimalAttestation: Attestation = { approvedSigner: testAddress1, - identityType: Bytes.fromHex('0x00'), - issuerHash: Bytes.fromHex(('0x' + '00'.repeat(32)) as Hex.Hex), - audienceHash: Bytes.fromHex(('0x' + '00'.repeat(32)) as Hex.Hex), + identityType: Bytes.fromHex('0x00000000'), + issuerHash: Bytes.fromHex('0x0000000000000000000000000000000000000000000000000000000000000000'), + audienceHash: Bytes.fromHex('0x0000000000000000000000000000000000000000000000000000000000000000'), applicationData: Bytes.fromArray([]), authData: { redirectUrl: '', @@ -602,7 +637,7 @@ describe('Session Signature', () => { sessionSignature: sampleRSY2, } - const result = encodeSessionCallSignatures([minimalImplicitSignature], completeTopology, testAddress1) + const result = encodeSessionSignature([minimalImplicitSignature], completeTopology, testAddress1) expect(result).toBeInstanceOf(Uint8Array) }) @@ -631,8 +666,8 @@ describe('Session Signature', () => { rules: [ { cumulative: false, - operation: 0, - value: Bytes.fromHex('0x'), + operation: ParameterOperation.EQUAL, + value: Bytes.fromHex('0x0000000000000000000000000000000000000000000000000000000000000000'), offset: 0n, mask: Bytes.fromHex('0xffffffff00000000000000000000000000000000000000000000000000000000'), }, @@ -646,7 +681,7 @@ describe('Session Signature', () => { // This test may not actually trigger the error since creating a 3-byte overflow is complex // We'll test that the function works with a large but valid topology - const result = encodeSessionCallSignatures(callSignatures, largeTopology, testAddress1) + const result = encodeSessionSignature(callSignatures, largeTopology, testAddress1) expect(result).toBeInstanceOf(Uint8Array) }) @@ -669,7 +704,7 @@ describe('Session Signature', () => { const callSignatures: ExplicitSessionCallSignature[] = [invalidExplicitSignature] expect(() => { - encodeSessionCallSignatures(callSignatures, completeTopology, testAddress1) + encodeSessionSignature(callSignatures, completeTopology, testAddress1) }).toThrow() // Should throw due to permission index validation }) }) @@ -685,7 +720,7 @@ describe('Session Signature', () => { ] // Encode - const encoded = encodeSessionCallSignatures(callSignatures, completeTopology, testAddress1) + const encoded = encodeSessionSignature(callSignatures, completeTopology, testAddress1) expect(encoded).toBeInstanceOf(Uint8Array) // Test encoding for each signature @@ -733,7 +768,7 @@ describe('Session Signature', () => { }, ] - const result = encodeSessionCallSignatures(callSignatures, completeTopology, testAddress1) + const result = encodeSessionSignature(callSignatures, completeTopology, testAddress1) expect(result).toBeInstanceOf(Uint8Array) expect(result.length).toBeGreaterThan(0) }) From 227c4d433ebfea6f27cd84de63bad227d6c7dd82 Mon Sep 17 00:00:00 2001 From: Michael Standen Date: Tue, 7 Oct 2025 11:27:34 +1300 Subject: [PATCH 051/119] const for node length --- packages/wallet/primitives/src/session-config.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/wallet/primitives/src/session-config.ts b/packages/wallet/primitives/src/session-config.ts index 46e3d9f526..67180acea1 100644 --- a/packages/wallet/primitives/src/session-config.ts +++ b/packages/wallet/primitives/src/session-config.ts @@ -35,8 +35,10 @@ export type SessionLeaf = SessionPermissionsLeaf | ImplicitBlacklistLeaf | Ident export type SessionBranch = [SessionsTopology, SessionsTopology, ...SessionsTopology[]] export type SessionsTopology = SessionBranch | SessionLeaf | SessionNode +const SESSIONS_NODE_SIZE_BYTES = 32 + function isSessionsNode(topology: any): topology is SessionNode { - return Hex.validate(topology) && Hex.size(topology) === 32 + return Hex.validate(topology) && Hex.size(topology) === SESSIONS_NODE_SIZE_BYTES } function isImplicitBlacklist(topology: any): topology is ImplicitBlacklistLeaf { @@ -389,10 +391,11 @@ function decodeSessionTopologyPointer(bytes: Bytes.Bytes): { return { topology: { type: 'session-permissions', ...sessionPermissions }, pointer: nodeLength } } else if (flag === SESSIONS_FLAG_NODE) { // Node - if (bytes.length < 33) { + const nodeLength = SESSIONS_NODE_SIZE_BYTES + 1 + if (bytes.length < nodeLength) { throw new Error('Invalid node length') } - return { topology: Hex.fromBytes(bytes.slice(1, 33)), pointer: 33 } + return { topology: Hex.fromBytes(bytes.slice(1, nodeLength)), pointer: nodeLength } } else if (flag === SESSIONS_FLAG_BLACKLIST) { // Blacklist const blacklistLength = sizeSize === 0x0f ? Bytes.toNumber(bytes.slice(1, 3)) : sizeSize From 8a5f2faa4150d703246184031b491f5c7aacbd53 Mon Sep 17 00:00:00 2001 From: Michael Standen Date: Tue, 7 Oct 2025 11:28:02 +1300 Subject: [PATCH 052/119] Clearer blacklist size encoding --- .../wallet/primitives/src/session-config.ts | 9 +++++++-- .../primitives/test/session-config.test.ts | 18 ++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/packages/wallet/primitives/src/session-config.ts b/packages/wallet/primitives/src/session-config.ts index 67180acea1..f4e94568d7 100644 --- a/packages/wallet/primitives/src/session-config.ts +++ b/packages/wallet/primitives/src/session-config.ts @@ -398,8 +398,13 @@ function decodeSessionTopologyPointer(bytes: Bytes.Bytes): { return { topology: Hex.fromBytes(bytes.slice(1, nodeLength)), pointer: nodeLength } } else if (flag === SESSIONS_FLAG_BLACKLIST) { // Blacklist - const blacklistLength = sizeSize === 0x0f ? Bytes.toNumber(bytes.slice(1, 3)) : sizeSize - const offset = sizeSize === 0x0f ? 3 : 1 + let offset = 1 + let blacklistLength = sizeSize + if (sizeSize === 0x0f) { + // Size is encoded in the next 2 bytes + blacklistLength = Bytes.toNumber(bytes.slice(offset, offset + 2)) + offset += 2 + } const blacklist: Address.Address[] = [] for (let i = 0; i < blacklistLength; i++) { diff --git a/packages/wallet/primitives/test/session-config.test.ts b/packages/wallet/primitives/test/session-config.test.ts index 149b17565d..6e20d55974 100644 --- a/packages/wallet/primitives/test/session-config.test.ts +++ b/packages/wallet/primitives/test/session-config.test.ts @@ -427,6 +427,24 @@ describe('Session Config', () => { expect(decoded).toEqual(sampleBlacklistLeaf) }) + it('should encode large blacklist leaf', () => { + const blacklistCount = 1000 + const largeBlacklist: ImplicitBlacklistLeaf = { + type: 'implicit-blacklist', + blacklist: Array(blacklistCount).fill(testAddress1), + } + const result = encodeSessionsTopology(largeBlacklist) + expect(result).toBeInstanceOf(Uint8Array) + expect(result[0]).toBe((SESSIONS_FLAG_BLACKLIST << 4) | 0x0f) // Encoded large size flag + expect(Bytes.toNumber(result.slice(1, 3))).toBe(blacklistCount) + expect(result.slice(3)).toEqual( + Bytes.concat(...largeBlacklist.blacklist.map((b) => Bytes.padLeft(Bytes.fromHex(b), 20))), + ) + expect(result.length).toBe(3 + blacklistCount * 20) + const decoded = decodeSessionsTopology(result) + expect(decoded).toEqual(largeBlacklist) + }) + it('should encode identity signer leaf', () => { const result = encodeSessionsTopology(sampleIdentitySignerLeaf) expect(result).toBeInstanceOf(Uint8Array) From 0c0bd736119b35e4e2ed3dffc6b508e5349b9a78 Mon Sep 17 00:00:00 2001 From: Michael Standen Date: Tue, 7 Oct 2025 11:28:39 +1300 Subject: [PATCH 053/119] identity signer node length --- packages/wallet/primitives/src/session-config.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/wallet/primitives/src/session-config.ts b/packages/wallet/primitives/src/session-config.ts index f4e94568d7..38ba2056ca 100644 --- a/packages/wallet/primitives/src/session-config.ts +++ b/packages/wallet/primitives/src/session-config.ts @@ -415,12 +415,13 @@ function decodeSessionTopologyPointer(bytes: Bytes.Bytes): { return { topology: { type: 'implicit-blacklist', blacklist }, pointer: offset + blacklistLength * 20 } } else if (flag === SESSIONS_FLAG_IDENTITY_SIGNER) { // Identity signer - if (bytes.length < 21) { + const nodeLength = 21 // Flag + address + if (bytes.length < nodeLength) { throw new Error('Invalid identity signer length') } return { - topology: { type: 'identity-signer', identitySigner: Address.from(Hex.fromBytes(bytes.slice(1, 21))) }, - pointer: 21, + topology: { type: 'identity-signer', identitySigner: Address.from(Hex.fromBytes(bytes.slice(1, nodeLength))) }, + pointer: nodeLength, } } else { throw new Error(`Invalid topology flag: ${flag}`) From f7b52db15b5e770e88b5d20400a558db1f03a247 Mon Sep 17 00:00:00 2001 From: Michael Standen Date: Tue, 7 Oct 2025 05:41:17 +1300 Subject: [PATCH 054/119] Add feeTokens endpoint to relayer (#885) --- .../relayer/src/rpc-relayer/relayer.gen.ts | 1369 +++++++++-------- packages/wallet/core/src/relayer/relayer.ts | 2 + .../core/src/relayer/standard/eip6963.ts | 6 +- .../wallet/core/src/relayer/standard/local.ts | 8 +- .../core/src/relayer/standard/pk-relayer.ts | 5 + .../core/src/relayer/standard/rpc/index.ts | 21 + .../src/relayer/standard/rpc/relayer.gen.ts | 6 +- .../core/src/relayer/standard/sequence.ts | 17 + 8 files changed, 815 insertions(+), 619 deletions(-) diff --git a/packages/services/relayer/src/rpc-relayer/relayer.gen.ts b/packages/services/relayer/src/rpc-relayer/relayer.gen.ts index 79ca492968..0638fbe946 100644 --- a/packages/services/relayer/src/rpc-relayer/relayer.gen.ts +++ b/packages/services/relayer/src/rpc-relayer/relayer.gen.ts @@ -1,76 +1,75 @@ /* eslint-disable */ -// sequence-relayer v0.4.1 62fe2b49d57c4a0d3960ac1176d48ecfffc7af5a +// sequence-relayer v0.4.1 93ac61641d0351211680e2092673726b5c4f1848 // -- // Code generated by webrpc-gen@v0.26.0 with typescript generator. DO NOT EDIT. // // webrpc-gen -schema=relayer.ridl -target=typescript -client -out=./clients/relayer.gen.ts -export const WebrpcHeader = "Webrpc" +export const WebrpcHeader = 'Webrpc' -export const WebrpcHeaderValue = "webrpc@v0.26.0;gen-typescript@v0.17.0;sequence-relayer@v0.4.1" +export const WebrpcHeaderValue = 'webrpc@v0.26.0;gen-typescript@v0.17.0;sequence-relayer@v0.4.1' // WebRPC description and code-gen version -export const WebRPCVersion = "v1" +export const WebRPCVersion = 'v1' // Schema version of your RIDL schema -export const WebRPCSchemaVersion = "v0.4.1" +export const WebRPCSchemaVersion = 'v0.4.1' // Schema hash generated from your RIDL schema -export const WebRPCSchemaHash = "62fe2b49d57c4a0d3960ac1176d48ecfffc7af5a" +export const WebRPCSchemaHash = '93ac61641d0351211680e2092673726b5c4f1848' type WebrpcGenVersions = { - webrpcGenVersion: string; - codeGenName: string; - codeGenVersion: string; - schemaName: string; - schemaVersion: string; -}; + webrpcGenVersion: string + codeGenName: string + codeGenVersion: string + schemaName: string + schemaVersion: string +} export function VersionFromHeader(headers: Headers): WebrpcGenVersions { - const headerValue = headers.get(WebrpcHeader); + const headerValue = headers.get(WebrpcHeader) if (!headerValue) { return { - webrpcGenVersion: "", - codeGenName: "", - codeGenVersion: "", - schemaName: "", - schemaVersion: "", - }; + webrpcGenVersion: '', + codeGenName: '', + codeGenVersion: '', + schemaName: '', + schemaVersion: '', + } } - return parseWebrpcGenVersions(headerValue); + return parseWebrpcGenVersions(headerValue) } function parseWebrpcGenVersions(header: string): WebrpcGenVersions { - const versions = header.split(";"); + const versions = header.split(';') if (versions.length < 3) { return { - webrpcGenVersion: "", - codeGenName: "", - codeGenVersion: "", - schemaName: "", - schemaVersion: "", - }; + webrpcGenVersion: '', + codeGenName: '', + codeGenVersion: '', + schemaName: '', + schemaVersion: '', + } } - const [_, webrpcGenVersion] = versions[0]!.split("@"); - const [codeGenName, codeGenVersion] = versions[1]!.split("@"); - const [schemaName, schemaVersion] = versions[2]!.split("@"); + const [_, webrpcGenVersion] = versions[0]!.split('@') + const [codeGenName, codeGenVersion] = versions[1]!.split('@') + const [schemaName, schemaVersion] = versions[2]!.split('@') return { - webrpcGenVersion: webrpcGenVersion ?? "", - codeGenName: codeGenName ?? "", - codeGenVersion: codeGenVersion ?? "", - schemaName: schemaName ?? "", - schemaVersion: schemaVersion ?? "", - }; + webrpcGenVersion: webrpcGenVersion ?? '', + codeGenName: codeGenName ?? '', + codeGenVersion: codeGenVersion ?? '', + schemaName: schemaName ?? '', + schemaVersion: schemaVersion ?? '', + } } // // Types // - export enum ETHTxnStatus { UNKNOWN = 'UNKNOWN', DROPPED = 'DROPPED', @@ -79,7 +78,7 @@ export enum ETHTxnStatus { SUCCEEDED = 'SUCCEEDED', PARTIALLY_FAILED = 'PARTIALLY_FAILED', FAILED = 'FAILED', - PENDING_PRECONDITION = 'PENDING_PRECONDITION' + PENDING_PRECONDITION = 'PENDING_PRECONDITION', } export enum TransferType { @@ -88,7 +87,7 @@ export enum TransferType { BRIDGE_DEPOSIT = 'BRIDGE_DEPOSIT', BRIDGE_WITHDRAW = 'BRIDGE_WITHDRAW', BURN = 'BURN', - UNKNOWN = 'UNKNOWN' + UNKNOWN = 'UNKNOWN', } export enum SimulateStatus { @@ -97,18 +96,18 @@ export enum SimulateStatus { FAILED = 'FAILED', ABORTED = 'ABORTED', REVERTED = 'REVERTED', - NOT_ENOUGH_GAS = 'NOT_ENOUGH_GAS' + NOT_ENOUGH_GAS = 'NOT_ENOUGH_GAS', } export enum FeeTokenType { UNKNOWN = 'UNKNOWN', ERC20_TOKEN = 'ERC20_TOKEN', - ERC1155_TOKEN = 'ERC1155_TOKEN' + ERC1155_TOKEN = 'ERC1155_TOKEN', } export enum SortOrder { DESC = 'DESC', - ASC = 'ASC' + ASC = 'ASC', } export interface Version { @@ -138,8 +137,7 @@ export interface SenderStatus { active: boolean } -export interface RuntimeChecks { -} +export interface RuntimeChecks {} export interface SequenceContext { factory: string @@ -215,8 +213,8 @@ export interface MetaTxnLog { minedAt: string target: string input: string - txnArgs: {[key: string]: any} - txnReceipt?: {[key: string]: any} + txnArgs: { [key: string]: any } + txnReceipt?: { [key: string]: any } walletAddress: string metaTxnNonce: string gasLimit: number @@ -353,9 +351,9 @@ export interface Relayer { getSequenceContext(headers?: object, signal?: AbortSignal): Promise getChainID(headers?: object, signal?: AbortSignal): Promise /** - * + * * Transactions - * + * * TODO (future): rename this to just, 'SendTransaction(txn: MetaTransaction)' or 'SendTransaction(txn: SignedTransaction)', or something.. * Project ID is only used by service and admin calls. Other clients must have projectID passed via the context * TODO: rename return txnHash: string to metaTxnID: string @@ -370,21 +368,41 @@ export interface Relayer { * new, GetTransactionReceipt and WaitTransactionReceipt methods * we can also accept metaTxnId and txnHash .. so can take either or.. I wonder if ERC-4337 has any convention on this? */ - getMetaTxnReceipt(args: GetMetaTxnReceiptArgs, headers?: object, signal?: AbortSignal): Promise + getMetaTxnReceipt( + args: GetMetaTxnReceiptArgs, + headers?: object, + signal?: AbortSignal, + ): Promise simulate(args: SimulateArgs, headers?: object, signal?: AbortSignal): Promise simulateV3(args: SimulateV3Args, headers?: object, signal?: AbortSignal): Promise /** * TODO: deprecated, to be removed by https://github.com/0xsequence/stack/pull/356 at a later date */ - updateMetaTxnGasLimits(args: UpdateMetaTxnGasLimitsArgs, headers?: object, signal?: AbortSignal): Promise + updateMetaTxnGasLimits( + args: UpdateMetaTxnGasLimitsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise feeTokens(headers?: object, signal?: AbortSignal): Promise feeOptions(args: FeeOptionsArgs, headers?: object, signal?: AbortSignal): Promise /** * TODO: deprecated, to be removed by https://github.com/0xsequence/stack/pull/356 at a later date */ - getMetaTxnNetworkFeeOptions(args: GetMetaTxnNetworkFeeOptionsArgs, headers?: object, signal?: AbortSignal): Promise - getMetaTransactions(args: GetMetaTransactionsArgs, headers?: object, signal?: AbortSignal): Promise - getTransactionCost(args: GetTransactionCostArgs, headers?: object, signal?: AbortSignal): Promise + getMetaTxnNetworkFeeOptions( + args: GetMetaTxnNetworkFeeOptionsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + getMetaTransactions( + args: GetMetaTransactionsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + getTransactionCost( + args: GetTransactionCostArgs, + headers?: object, + signal?: AbortSignal, + ): Promise /** * Sent transactions from an account. If filter is omitted then it will return all transactions. */ @@ -393,7 +411,11 @@ export interface Relayer { * Pending transactions waiting to be mined for an account. This endpoint is just a sugar of `SentTransactions` * with the filter set to pending: true. */ - pendingTransactions(args: PendingTransactionsArgs, headers?: object, signal?: AbortSignal): Promise + pendingTransactions( + args: PendingTransactionsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise /** * Legacy Gas Tank */ @@ -403,10 +425,26 @@ export interface Relayer { /** * Legacy Gas Adjustment */ - nextGasTankBalanceAdjustmentNonce(args: NextGasTankBalanceAdjustmentNonceArgs, headers?: object, signal?: AbortSignal): Promise - adjustGasTankBalance(args: AdjustGasTankBalanceArgs, headers?: object, signal?: AbortSignal): Promise - getGasTankBalanceAdjustment(args: GetGasTankBalanceAdjustmentArgs, headers?: object, signal?: AbortSignal): Promise - listGasTankBalanceAdjustments(args: ListGasTankBalanceAdjustmentsArgs, headers?: object, signal?: AbortSignal): Promise + nextGasTankBalanceAdjustmentNonce( + args: NextGasTankBalanceAdjustmentNonceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + adjustGasTankBalance( + args: AdjustGasTankBalanceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + getGasTankBalanceAdjustment( + args: GetGasTankBalanceAdjustmentArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + listGasTankBalanceAdjustments( + args: ListGasTankBalanceAdjustmentsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise /** * Gas Sponsorship */ @@ -418,43 +456,50 @@ export interface Relayer { /** * Gas Sponsor Lookup */ - addressGasSponsors(args: AddressGasSponsorsArgs, headers?: object, signal?: AbortSignal): Promise + addressGasSponsors( + args: AddressGasSponsorsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise /** * Project Balance */ - getProjectBalance(args: GetProjectBalanceArgs, headers?: object, signal?: AbortSignal): Promise - adjustProjectBalance(args: AdjustProjectBalanceArgs, headers?: object, signal?: AbortSignal): Promise + getProjectBalance( + args: GetProjectBalanceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + adjustProjectBalance( + args: AdjustProjectBalanceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise } -export interface PingArgs { -} +export interface PingArgs {} export interface PingReturn { - status: boolean -} -export interface VersionArgs { + status: boolean } +export interface VersionArgs {} export interface VersionReturn { - version: Version -} -export interface RuntimeStatusArgs { + version: Version } +export interface RuntimeStatusArgs {} export interface RuntimeStatusReturn { - status: RuntimeStatus -} -export interface GetSequenceContextArgs { + status: RuntimeStatus } +export interface GetSequenceContextArgs {} export interface GetSequenceContextReturn { - data: SequenceContext -} -export interface GetChainIDArgs { + data: SequenceContext } +export interface GetChainIDArgs {} export interface GetChainIDReturn { - chainID: number + chainID: number } export interface SendMetaTxnArgs { call: MetaTxn @@ -465,7 +510,7 @@ export interface SendMetaTxnArgs { export interface SendMetaTxnReturn { status: boolean - txnHash: string + txnHash: string } export interface GetMetaTxnNonceArgs { walletContractAddress: string @@ -473,14 +518,14 @@ export interface GetMetaTxnNonceArgs { } export interface GetMetaTxnNonceReturn { - nonce: string + nonce: string } export interface GetMetaTxnReceiptArgs { metaTxID: string } export interface GetMetaTxnReceiptReturn { - receipt: MetaTxnReceipt + receipt: MetaTxnReceipt } export interface SimulateArgs { wallet: string @@ -488,7 +533,7 @@ export interface SimulateArgs { } export interface SimulateReturn { - results: Array + results: Array } export interface SimulateV3Args { wallet: string @@ -496,7 +541,7 @@ export interface SimulateV3Args { } export interface SimulateV3Return { - results: Array + results: Array } export interface UpdateMetaTxnGasLimitsArgs { walletAddress: string @@ -505,14 +550,14 @@ export interface UpdateMetaTxnGasLimitsArgs { } export interface UpdateMetaTxnGasLimitsReturn { - payload: string -} -export interface FeeTokensArgs { + payload: string } +export interface FeeTokensArgs {} export interface FeeTokensReturn { isFeeRequired: boolean - tokens: Array + tokens: Array + paymentAddress: string } export interface FeeOptionsArgs { wallet: string @@ -524,7 +569,7 @@ export interface FeeOptionsArgs { export interface FeeOptionsReturn { options: Array sponsored: boolean - quote?: string + quote?: string } export interface GetMetaTxnNetworkFeeOptionsArgs { walletConfig: any @@ -532,7 +577,7 @@ export interface GetMetaTxnNetworkFeeOptionsArgs { } export interface GetMetaTxnNetworkFeeOptionsReturn { - options: Array + options: Array } export interface GetMetaTransactionsArgs { projectId: number @@ -541,7 +586,7 @@ export interface GetMetaTransactionsArgs { export interface GetMetaTransactionsReturn { page: Page - transactions: Array + transactions: Array } export interface GetTransactionCostArgs { projectId: number @@ -550,7 +595,7 @@ export interface GetTransactionCostArgs { } export interface GetTransactionCostReturn { - cost: number + cost: number } export interface SentTransactionsArgs { filter?: SentTransactionsFilter @@ -559,7 +604,7 @@ export interface SentTransactionsArgs { export interface SentTransactionsReturn { page: Page - transactions: Array + transactions: Array } export interface PendingTransactionsArgs { page?: Page @@ -567,14 +612,14 @@ export interface PendingTransactionsArgs { export interface PendingTransactionsReturn { page: Page - transactions: Array + transactions: Array } export interface GetGasTankArgs { id: number } export interface GetGasTankReturn { - gasTank: GasTank + gasTank: GasTank } export interface AddGasTankArgs { name: string @@ -584,7 +629,7 @@ export interface AddGasTankArgs { export interface AddGasTankReturn { status: boolean - gasTank: GasTank + gasTank: GasTank } export interface UpdateGasTankArgs { id: number @@ -595,14 +640,14 @@ export interface UpdateGasTankArgs { export interface UpdateGasTankReturn { status: boolean - gasTank: GasTank + gasTank: GasTank } export interface NextGasTankBalanceAdjustmentNonceArgs { id: number } export interface NextGasTankBalanceAdjustmentNonceReturn { - nonce: number + nonce: number } export interface AdjustGasTankBalanceArgs { id: number @@ -612,7 +657,7 @@ export interface AdjustGasTankBalanceArgs { export interface AdjustGasTankBalanceReturn { status: boolean - adjustment: GasTankBalanceAdjustment + adjustment: GasTankBalanceAdjustment } export interface GetGasTankBalanceAdjustmentArgs { id: number @@ -620,7 +665,7 @@ export interface GetGasTankBalanceAdjustmentArgs { } export interface GetGasTankBalanceAdjustmentReturn { - adjustment: GasTankBalanceAdjustment + adjustment: GasTankBalanceAdjustment } export interface ListGasTankBalanceAdjustmentsArgs { id: number @@ -629,7 +674,7 @@ export interface ListGasTankBalanceAdjustmentsArgs { export interface ListGasTankBalanceAdjustmentsReturn { page: Page - adjustments: Array + adjustments: Array } export interface ListGasSponsorsArgs { projectId: number @@ -638,7 +683,7 @@ export interface ListGasSponsorsArgs { export interface ListGasSponsorsReturn { page: Page - gasSponsors: Array + gasSponsors: Array } export interface GetGasSponsorArgs { projectId: number @@ -646,7 +691,7 @@ export interface GetGasSponsorArgs { } export interface GetGasSponsorReturn { - gasSponsor: GasSponsor + gasSponsor: GasSponsor } export interface AddGasSponsorArgs { projectId: number @@ -657,7 +702,7 @@ export interface AddGasSponsorArgs { export interface AddGasSponsorReturn { status: boolean - gasSponsor: GasSponsor + gasSponsor: GasSponsor } export interface UpdateGasSponsorArgs { projectId: number @@ -668,7 +713,7 @@ export interface UpdateGasSponsorArgs { export interface UpdateGasSponsorReturn { status: boolean - gasSponsor: GasSponsor + gasSponsor: GasSponsor } export interface RemoveGasSponsorArgs { projectId: number @@ -676,7 +721,7 @@ export interface RemoveGasSponsorArgs { } export interface RemoveGasSponsorReturn { - status: boolean + status: boolean } export interface AddressGasSponsorsArgs { address: string @@ -685,14 +730,14 @@ export interface AddressGasSponsorsArgs { export interface AddressGasSponsorsReturn { page: Page - gasSponsors: Array + gasSponsors: Array } export interface GetProjectBalanceArgs { projectId: number } export interface GetProjectBalanceReturn { - balance: number + balance: number } export interface AdjustProjectBalanceArgs { projectId: number @@ -701,11 +746,9 @@ export interface AdjustProjectBalanceArgs { } export interface AdjustProjectBalanceReturn { - balance: number + balance: number } - - // // Client // @@ -722,521 +765,620 @@ export class Relayer implements Relayer { private url(name: string): string { return this.hostname + this.path + name } - + ping = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('Ping'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('Ping'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + version = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('Version'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - version: (_data.version), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('Version'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + version: _data.version, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + runtimeStatus = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('RuntimeStatus'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('RuntimeStatus'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + getSequenceContext = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetSequenceContext'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - data: (_data.data), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('GetSequenceContext'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + data: _data.data, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + getChainID = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetChainID'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - chainID: (_data.chainID), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('GetChainID'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + chainID: _data.chainID, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + sendMetaTxn = (args: SendMetaTxnArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('SendMetaTxn'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - txnHash: (_data.txnHash), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getMetaTxnNonce = (args: GetMetaTxnNonceArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetMetaTxnNonce'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - nonce: (_data.nonce), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getMetaTxnReceipt = (args: GetMetaTxnReceiptArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetMetaTxnReceipt'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - receipt: (_data.receipt), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('SendMetaTxn'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + txnHash: _data.txnHash, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getMetaTxnNonce = ( + args: GetMetaTxnNonceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetMetaTxnNonce'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + nonce: _data.nonce, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getMetaTxnReceipt = ( + args: GetMetaTxnReceiptArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetMetaTxnReceipt'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + receipt: _data.receipt, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + simulate = (args: SimulateArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('Simulate'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - results: >(_data.results), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('Simulate'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + results: >_data.results, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + simulateV3 = (args: SimulateV3Args, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('SimulateV3'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - results: >(_data.results), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - updateMetaTxnGasLimits = (args: UpdateMetaTxnGasLimitsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('UpdateMetaTxnGasLimits'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - payload: (_data.payload), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('SimulateV3'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + results: >_data.results, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + updateMetaTxnGasLimits = ( + args: UpdateMetaTxnGasLimitsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('UpdateMetaTxnGasLimits'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + payload: _data.payload, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + feeTokens = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('FeeTokens'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - isFeeRequired: (_data.isFeeRequired), - tokens: >(_data.tokens), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('FeeTokens'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + isFeeRequired: _data.isFeeRequired, + tokens: >_data.tokens, + paymentAddress: _data.paymentAddress, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + feeOptions = (args: FeeOptionsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('FeeOptions'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - options: >(_data.options), - sponsored: (_data.sponsored), - quote: (_data.quote), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getMetaTxnNetworkFeeOptions = (args: GetMetaTxnNetworkFeeOptionsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetMetaTxnNetworkFeeOptions'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - options: >(_data.options), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getMetaTransactions = (args: GetMetaTransactionsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetMetaTransactions'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - page: (_data.page), - transactions: >(_data.transactions), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getTransactionCost = (args: GetTransactionCostArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetTransactionCost'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - cost: (_data.cost), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - sentTransactions = (args: SentTransactionsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('SentTransactions'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - page: (_data.page), - transactions: >(_data.transactions), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - pendingTransactions = (args: PendingTransactionsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('PendingTransactions'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - page: (_data.page), - transactions: >(_data.transactions), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('FeeOptions'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + options: >_data.options, + sponsored: _data.sponsored, + quote: _data.quote, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getMetaTxnNetworkFeeOptions = ( + args: GetMetaTxnNetworkFeeOptionsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetMetaTxnNetworkFeeOptions'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + options: >_data.options, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getMetaTransactions = ( + args: GetMetaTransactionsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetMetaTransactions'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + page: _data.page, + transactions: >_data.transactions, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getTransactionCost = ( + args: GetTransactionCostArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetTransactionCost'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + cost: _data.cost, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + sentTransactions = ( + args: SentTransactionsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('SentTransactions'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + page: _data.page, + transactions: >_data.transactions, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + pendingTransactions = ( + args: PendingTransactionsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('PendingTransactions'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + page: _data.page, + transactions: >_data.transactions, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + getGasTank = (args: GetGasTankArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetGasTank'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - gasTank: (_data.gasTank), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('GetGasTank'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + gasTank: _data.gasTank, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + addGasTank = (args: AddGasTankArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('AddGasTank'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - gasTank: (_data.gasTank), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('AddGasTank'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + gasTank: _data.gasTank, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + updateGasTank = (args: UpdateGasTankArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('UpdateGasTank'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - gasTank: (_data.gasTank), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - nextGasTankBalanceAdjustmentNonce = (args: NextGasTankBalanceAdjustmentNonceArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('NextGasTankBalanceAdjustmentNonce'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - nonce: (_data.nonce), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - adjustGasTankBalance = (args: AdjustGasTankBalanceArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('AdjustGasTankBalance'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - adjustment: (_data.adjustment), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getGasTankBalanceAdjustment = (args: GetGasTankBalanceAdjustmentArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetGasTankBalanceAdjustment'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - adjustment: (_data.adjustment), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - listGasTankBalanceAdjustments = (args: ListGasTankBalanceAdjustmentsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('ListGasTankBalanceAdjustments'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - page: (_data.page), - adjustments: >(_data.adjustments), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - listGasSponsors = (args: ListGasSponsorsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('ListGasSponsors'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - page: (_data.page), - gasSponsors: >(_data.gasSponsors), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('UpdateGasTank'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + gasTank: _data.gasTank, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + nextGasTankBalanceAdjustmentNonce = ( + args: NextGasTankBalanceAdjustmentNonceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('NextGasTankBalanceAdjustmentNonce'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + nonce: _data.nonce, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + adjustGasTankBalance = ( + args: AdjustGasTankBalanceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('AdjustGasTankBalance'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + adjustment: _data.adjustment, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getGasTankBalanceAdjustment = ( + args: GetGasTankBalanceAdjustmentArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetGasTankBalanceAdjustment'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + adjustment: _data.adjustment, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + listGasTankBalanceAdjustments = ( + args: ListGasTankBalanceAdjustmentsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('ListGasTankBalanceAdjustments'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + page: _data.page, + adjustments: >_data.adjustments, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + listGasSponsors = ( + args: ListGasSponsorsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('ListGasSponsors'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + page: _data.page, + gasSponsors: >_data.gasSponsors, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + getGasSponsor = (args: GetGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetGasSponsor'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - gasSponsor: (_data.gasSponsor), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - addGasSponsor = (args: AddGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('AddGasSponsor'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - gasSponsor: (_data.gasSponsor), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - updateGasSponsor = (args: UpdateGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('UpdateGasSponsor'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - gasSponsor: (_data.gasSponsor), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - removeGasSponsor = (args: RemoveGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('RemoveGasSponsor'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - addressGasSponsors = (args: AddressGasSponsorsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('AddressGasSponsors'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - page: (_data.page), - gasSponsors: >(_data.gasSponsors), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getProjectBalance = (args: GetProjectBalanceArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetProjectBalance'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - balance: (_data.balance), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - adjustProjectBalance = (args: AdjustProjectBalanceArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('AdjustProjectBalance'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - balance: (_data.balance), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('GetGasSponsor'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + gasSponsor: _data.gasSponsor, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - -} - const createHTTPRequest = (body: object = {}, headers: object = {}, signal: AbortSignal | null = null): object => { - const reqHeaders: {[key: string]: string} = { ...headers, 'Content-Type': 'application/json' } + addGasSponsor = (args: AddGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('AddGasSponsor'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + gasSponsor: _data.gasSponsor, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + updateGasSponsor = ( + args: UpdateGasSponsorArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('UpdateGasSponsor'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + gasSponsor: _data.gasSponsor, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + removeGasSponsor = ( + args: RemoveGasSponsorArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('RemoveGasSponsor'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + addressGasSponsors = ( + args: AddressGasSponsorsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('AddressGasSponsors'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + page: _data.page, + gasSponsors: >_data.gasSponsors, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getProjectBalance = ( + args: GetProjectBalanceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetProjectBalance'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + balance: _data.balance, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + adjustProjectBalance = ( + args: AdjustProjectBalanceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('AdjustProjectBalance'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + balance: _data.balance, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } +} + +const createHTTPRequest = (body: object = {}, headers: object = {}, signal: AbortSignal | null = null): object => { + const reqHeaders: { [key: string]: string } = { ...headers, 'Content-Type': 'application/json' } reqHeaders[WebrpcHeader] = WebrpcHeaderValue return { method: 'POST', headers: reqHeaders, body: JSON.stringify(body || {}), - signal + signal, } } const buildResponse = (res: Response): Promise => { - return res.text().then(text => { + return res.text().then((text) => { let data try { data = JSON.parse(text) - } catch(error) { + } catch (error) { let message = '' - if (error instanceof Error) { + if (error instanceof Error) { message = error.message } throw WebrpcBadResponseError.new({ status: res.status, - cause: `JSON.parse(): ${message}: response text: ${text}`}, - ) + cause: `JSON.parse(): ${message}: response text: ${text}`, + }) } if (!res.ok) { - const code: number = (typeof data.code === 'number') ? data.code : 0 + const code: number = typeof data.code === 'number' ? data.code : 0 throw (webrpcErrorByCode[code] || WebrpcError).new(data) } return data @@ -1281,7 +1423,7 @@ export class WebrpcEndpointError extends WebrpcError { code: number = 0, message: string = `endpoint error`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcEndpointError.prototype) @@ -1294,7 +1436,7 @@ export class WebrpcRequestFailedError extends WebrpcError { code: number = -1, message: string = `request failed`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcRequestFailedError.prototype) @@ -1307,7 +1449,7 @@ export class WebrpcBadRouteError extends WebrpcError { code: number = -2, message: string = `bad route`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcBadRouteError.prototype) @@ -1320,7 +1462,7 @@ export class WebrpcBadMethodError extends WebrpcError { code: number = -3, message: string = `bad method`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcBadMethodError.prototype) @@ -1333,7 +1475,7 @@ export class WebrpcBadRequestError extends WebrpcError { code: number = -4, message: string = `bad request`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcBadRequestError.prototype) @@ -1346,7 +1488,7 @@ export class WebrpcBadResponseError extends WebrpcError { code: number = -5, message: string = `bad response`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcBadResponseError.prototype) @@ -1359,7 +1501,7 @@ export class WebrpcServerPanicError extends WebrpcError { code: number = -6, message: string = `server panic`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcServerPanicError.prototype) @@ -1372,7 +1514,7 @@ export class WebrpcInternalErrorError extends WebrpcError { code: number = -7, message: string = `internal error`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcInternalErrorError.prototype) @@ -1385,7 +1527,7 @@ export class WebrpcClientDisconnectedError extends WebrpcError { code: number = -8, message: string = `client disconnected`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcClientDisconnectedError.prototype) @@ -1398,7 +1540,7 @@ export class WebrpcStreamLostError extends WebrpcError { code: number = -9, message: string = `stream lost`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcStreamLostError.prototype) @@ -1411,14 +1553,13 @@ export class WebrpcStreamFinishedError extends WebrpcError { code: number = -10, message: string = `stream finished`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcStreamFinishedError.prototype) } } - // Schema errors export class UnauthorizedError extends WebrpcError { @@ -1427,7 +1568,7 @@ export class UnauthorizedError extends WebrpcError { code: number = 1000, message: string = `Unauthorized access`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, UnauthorizedError.prototype) @@ -1440,7 +1581,7 @@ export class PermissionDeniedError extends WebrpcError { code: number = 1001, message: string = `Permission denied`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, PermissionDeniedError.prototype) @@ -1453,7 +1594,7 @@ export class SessionExpiredError extends WebrpcError { code: number = 1002, message: string = `Session expired`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, SessionExpiredError.prototype) @@ -1466,7 +1607,7 @@ export class MethodNotFoundError extends WebrpcError { code: number = 1003, message: string = `Method not found`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, MethodNotFoundError.prototype) @@ -1479,7 +1620,7 @@ export class RequestConflictError extends WebrpcError { code: number = 1004, message: string = `Conflict with target resource`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, RequestConflictError.prototype) @@ -1492,7 +1633,7 @@ export class AbortedError extends WebrpcError { code: number = 1005, message: string = `Request aborted`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, AbortedError.prototype) @@ -1505,7 +1646,7 @@ export class GeoblockedError extends WebrpcError { code: number = 1006, message: string = `Geoblocked region`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, GeoblockedError.prototype) @@ -1518,7 +1659,7 @@ export class RateLimitedError extends WebrpcError { code: number = 1007, message: string = `Rate-limited. Please slow down.`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, RateLimitedError.prototype) @@ -1531,7 +1672,7 @@ export class ProjectNotFoundError extends WebrpcError { code: number = 1008, message: string = `Project not found`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, ProjectNotFoundError.prototype) @@ -1544,7 +1685,7 @@ export class AccessKeyNotFoundError extends WebrpcError { code: number = 1101, message: string = `Access key not found`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, AccessKeyNotFoundError.prototype) @@ -1557,7 +1698,7 @@ export class AccessKeyMismatchError extends WebrpcError { code: number = 1102, message: string = `Access key mismatch`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, AccessKeyMismatchError.prototype) @@ -1570,7 +1711,7 @@ export class InvalidOriginError extends WebrpcError { code: number = 1103, message: string = `Invalid origin for Access Key`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, InvalidOriginError.prototype) @@ -1583,7 +1724,7 @@ export class InvalidServiceError extends WebrpcError { code: number = 1104, message: string = `Service not enabled for Access key`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, InvalidServiceError.prototype) @@ -1596,7 +1737,7 @@ export class UnauthorizedUserError extends WebrpcError { code: number = 1105, message: string = `Unauthorized user`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, UnauthorizedUserError.prototype) @@ -1609,7 +1750,7 @@ export class QuotaExceededError extends WebrpcError { code: number = 1200, message: string = `Quota request exceeded`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, QuotaExceededError.prototype) @@ -1622,7 +1763,7 @@ export class QuotaRateLimitError extends WebrpcError { code: number = 1201, message: string = `Quota rate limit exceeded`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, QuotaRateLimitError.prototype) @@ -1635,7 +1776,7 @@ export class NoDefaultKeyError extends WebrpcError { code: number = 1300, message: string = `No default access key found`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, NoDefaultKeyError.prototype) @@ -1648,7 +1789,7 @@ export class MaxAccessKeysError extends WebrpcError { code: number = 1301, message: string = `Access keys limit reached`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, MaxAccessKeysError.prototype) @@ -1661,7 +1802,7 @@ export class AtLeastOneKeyError extends WebrpcError { code: number = 1302, message: string = `You need at least one Access Key`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, AtLeastOneKeyError.prototype) @@ -1674,7 +1815,7 @@ export class TimeoutError extends WebrpcError { code: number = 1900, message: string = `Request timed out`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, TimeoutError.prototype) @@ -1687,7 +1828,7 @@ export class InvalidArgumentError extends WebrpcError { code: number = 2001, message: string = `Invalid argument`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, InvalidArgumentError.prototype) @@ -1700,7 +1841,7 @@ export class UnavailableError extends WebrpcError { code: number = 2002, message: string = `Unavailable resource`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, UnavailableError.prototype) @@ -1713,7 +1854,7 @@ export class QueryFailedError extends WebrpcError { code: number = 2003, message: string = `Query failed`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, QueryFailedError.prototype) @@ -1726,7 +1867,7 @@ export class NotFoundError extends WebrpcError { code: number = 3000, message: string = `Resource not found`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, NotFoundError.prototype) @@ -1739,7 +1880,7 @@ export class InsufficientFeeError extends WebrpcError { code: number = 3004, message: string = `Insufficient fee`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, InsufficientFeeError.prototype) @@ -1752,7 +1893,7 @@ export class NotEnoughBalanceError extends WebrpcError { code: number = 3005, message: string = `Not enough balance`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, NotEnoughBalanceError.prototype) @@ -1765,14 +1906,13 @@ export class SimulationFailedError extends WebrpcError { code: number = 3006, message: string = `Simulation failed`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, SimulationFailedError.prototype) } } - export enum errors { WebrpcEndpoint = 'WebrpcEndpoint', WebrpcRequestFailed = 'WebrpcRequestFailed', @@ -1897,4 +2037,3 @@ export const webrpcErrorByCode: { [code: number]: any } = { } export type Fetch = (input: RequestInfo, init?: RequestInit) => Promise - diff --git a/packages/wallet/core/src/relayer/relayer.ts b/packages/wallet/core/src/relayer/relayer.ts index db28608fca..d7c0cb617f 100644 --- a/packages/wallet/core/src/relayer/relayer.ts +++ b/packages/wallet/core/src/relayer/relayer.ts @@ -63,6 +63,8 @@ export interface Relayer { isAvailable(wallet: Address.Address, chainId: number): Promise + feeTokens(): Promise<{ isFeeRequired: boolean; tokens?: FeeToken[]; paymentAddress?: Address.Address }> + feeOptions( wallet: Address.Address, chainId: number, diff --git a/packages/wallet/core/src/relayer/standard/eip6963.ts b/packages/wallet/core/src/relayer/standard/eip6963.ts index e1a2bd1746..66e7c4c4c3 100644 --- a/packages/wallet/core/src/relayer/standard/eip6963.ts +++ b/packages/wallet/core/src/relayer/standard/eip6963.ts @@ -3,7 +3,7 @@ import { EIP1193ProviderAdapter, LocalRelayer } from './local.js' import { FeeOption, FeeQuote, OperationStatus, Relayer } from '../relayer.js' import { Address, Hex } from 'ox' import { Payload } from '@0xsequence/wallet-primitives' -import { IntentPrecondition } from './rpc/relayer.gen.js' +import { FeeToken, IntentPrecondition } from './rpc/relayer.gen.js' export class EIP6963Relayer implements Relayer { public readonly kind: 'relayer' = 'relayer' @@ -23,6 +23,10 @@ export class EIP6963Relayer implements Relayer { return this.relayer.isAvailable(wallet, chainId) } + feeTokens(): Promise<{ isFeeRequired: boolean; tokens?: FeeToken[]; paymentAddress?: Address.Address }> { + return this.relayer.feeTokens() + } + feeOptions( wallet: Address.Address, chainId: number, diff --git a/packages/wallet/core/src/relayer/standard/local.ts b/packages/wallet/core/src/relayer/standard/local.ts index 0e4f30732a..274af44eb4 100644 --- a/packages/wallet/core/src/relayer/standard/local.ts +++ b/packages/wallet/core/src/relayer/standard/local.ts @@ -2,7 +2,7 @@ import { Constants, Payload } from '@0xsequence/wallet-primitives' import { EIP1193Provider } from 'mipd' import { AbiFunction, Address, Bytes, Hex, TransactionReceipt } from 'ox' import { FeeOption, FeeQuote, OperationStatus, Relayer } from '../relayer.js' -import { IntentPrecondition } from './rpc/relayer.gen.js' +import { FeeToken, IntentPrecondition } from './rpc/relayer.gen.js' import { decodePrecondition } from '../../preconditions/index.js' import { erc20BalanceOf, @@ -47,6 +47,12 @@ export class LocalRelayer implements Relayer { return new LocalRelayer(new EIP1193ProviderAdapter(provider)) } + feeTokens(): Promise<{ isFeeRequired: boolean; tokens?: FeeToken[]; paymentAddress?: Address.Address }> { + return Promise.resolve({ + isFeeRequired: false, + }) + } + feeOptions( wallet: Address.Address, chainId: number, diff --git a/packages/wallet/core/src/relayer/standard/pk-relayer.ts b/packages/wallet/core/src/relayer/standard/pk-relayer.ts index d680f67f77..a8e850af46 100644 --- a/packages/wallet/core/src/relayer/standard/pk-relayer.ts +++ b/packages/wallet/core/src/relayer/standard/pk-relayer.ts @@ -2,6 +2,7 @@ import { Payload, Precondition } from '@0xsequence/wallet-primitives' import { Address, Hex, Provider, Secp256k1, TransactionEnvelopeEip1559, TransactionReceipt } from 'ox' import { LocalRelayer } from './local.js' import { FeeOption, FeeQuote, OperationStatus, Relayer } from '../relayer.js' +import { FeeToken } from './rpc/relayer.gen.js' export class PkRelayer implements Relayer { public readonly kind: 'relayer' = 'relayer' @@ -106,6 +107,10 @@ export class PkRelayer implements Relayer { return providerChainId === chainId } + feeTokens(): Promise<{ isFeeRequired: boolean; tokens?: FeeToken[]; paymentAddress?: Address.Address }> { + return this.relayer.feeTokens() + } + feeOptions( wallet: Address.Address, chainId: number, diff --git a/packages/wallet/core/src/relayer/standard/rpc/index.ts b/packages/wallet/core/src/relayer/standard/rpc/index.ts index 23f175d2fe..f64a8f005d 100644 --- a/packages/wallet/core/src/relayer/standard/rpc/index.ts +++ b/packages/wallet/core/src/relayer/standard/rpc/index.ts @@ -109,6 +109,27 @@ export class RpcRelayer implements Relayer { return Promise.resolve(this.chainId === chainId) } + async feeTokens(): Promise<{ isFeeRequired: boolean; tokens?: RpcFeeToken[]; paymentAddress?: Address.Address }> { + try { + const { isFeeRequired, tokens, paymentAddress } = await this.client.feeTokens() + if (isFeeRequired) { + Address.assert(paymentAddress) + return { + isFeeRequired, + tokens, + paymentAddress, + } + } + // Not required + return { + isFeeRequired, + } + } catch (e) { + console.warn('RpcRelayer.feeTokens failed:', e) + return { isFeeRequired: false } + } + } + async feeOptions( wallet: Address.Address, chainId: number, diff --git a/packages/wallet/core/src/relayer/standard/rpc/relayer.gen.ts b/packages/wallet/core/src/relayer/standard/rpc/relayer.gen.ts index a9e6b44405..0638fbe946 100644 --- a/packages/wallet/core/src/relayer/standard/rpc/relayer.gen.ts +++ b/packages/wallet/core/src/relayer/standard/rpc/relayer.gen.ts @@ -1,5 +1,5 @@ /* eslint-disable */ -// sequence-relayer v0.4.1 62fe2b49d57c4a0d3960ac1176d48ecfffc7af5a +// sequence-relayer v0.4.1 93ac61641d0351211680e2092673726b5c4f1848 // -- // Code generated by webrpc-gen@v0.26.0 with typescript generator. DO NOT EDIT. // @@ -16,7 +16,7 @@ export const WebRPCVersion = 'v1' export const WebRPCSchemaVersion = 'v0.4.1' // Schema hash generated from your RIDL schema -export const WebRPCSchemaHash = '62fe2b49d57c4a0d3960ac1176d48ecfffc7af5a' +export const WebRPCSchemaHash = '93ac61641d0351211680e2092673726b5c4f1848' type WebrpcGenVersions = { webrpcGenVersion: string @@ -557,6 +557,7 @@ export interface FeeTokensArgs {} export interface FeeTokensReturn { isFeeRequired: boolean tokens: Array + paymentAddress: string } export interface FeeOptionsArgs { wallet: string @@ -950,6 +951,7 @@ export class Relayer implements Relayer { return { isFeeRequired: _data.isFeeRequired, tokens: >_data.tokens, + paymentAddress: _data.paymentAddress, } }) }, diff --git a/packages/wallet/core/src/relayer/standard/sequence.ts b/packages/wallet/core/src/relayer/standard/sequence.ts index d99cd41cef..d95bf19ddb 100644 --- a/packages/wallet/core/src/relayer/standard/sequence.ts +++ b/packages/wallet/core/src/relayer/standard/sequence.ts @@ -2,6 +2,7 @@ import { ETHTxnStatus, IntentPrecondition, Relayer as Service } from '@0xsequenc import { Payload } from '@0xsequence/wallet-primitives' import { AbiFunction, Address, Bytes, Hex } from 'ox' import { FeeOption, FeeQuote, OperationStatus, Relayer } from '../relayer.js' +import { FeeToken } from './rpc/relayer.gen.js' export class SequenceRelayer implements Relayer { public readonly kind: 'relayer' = 'relayer' @@ -18,6 +19,22 @@ export class SequenceRelayer implements Relayer { return true } + async feeTokens(): Promise<{ isFeeRequired: boolean; tokens?: FeeToken[]; paymentAddress?: Address.Address }> { + const { isFeeRequired, tokens, paymentAddress } = await this.service.feeTokens() + if (isFeeRequired) { + Address.assert(paymentAddress) + return { + isFeeRequired, + tokens, + paymentAddress, + } + } + // Not required + return { + isFeeRequired, + } + } + async feeOptions( wallet: Address.Address, _chainId: number, From 9629d7e113c7d29c168e68ad8fd796cb0872d4ca Mon Sep 17 00:00:00 2001 From: Gabi <56271768+VGabriel45@users.noreply.github.com> Date: Wed, 8 Oct 2025 13:27:45 +0300 Subject: [PATCH 055/119] add getFeeTokens to dapp client (#889) * add getFeeTokens to dapp client * fix typo --- .../wallet/dapp-client/src/ChainSessionManager.ts | 14 ++++++++++++++ packages/wallet/dapp-client/src/DappClient.ts | 14 ++++++++++++++ packages/wallet/dapp-client/src/types/index.ts | 8 +++++++- 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/packages/wallet/dapp-client/src/ChainSessionManager.ts b/packages/wallet/dapp-client/src/ChainSessionManager.ts index 14fbdc329c..8689cddb88 100644 --- a/packages/wallet/dapp-client/src/ChainSessionManager.ts +++ b/packages/wallet/dapp-client/src/ChainSessionManager.ts @@ -41,6 +41,7 @@ import { ModifyExplicitSessionPayload, SessionResponse, AddExplicitSessionPayload, + GetFeeTokensResponse, } from './types/index.js' import { CACHE_DB_NAME, VALUE_FORWARDER_ADDRESS } from './utils/constants.js' import { ExplicitSession, ImplicitSession, ExplicitSessionConfig } from './index.js' @@ -780,6 +781,19 @@ export class ChainSessionManager { } } + /** + * Fetches fee tokens for a chain. + * @returns {GetFeeTokensResponse} + * @throws {FeeOptionError} If fetching fee tokens fails. + */ + async getFeeTokens(): Promise { + try { + return await this.relayer.feeTokens() + } catch (err) { + throw new FeeOptionError(`Failed to get fee tokens: ${err instanceof Error ? err.message : String(err)}`) + } + } + /** * Builds, signs, and sends a batch of transactions. * @param transactions The transactions to be sent. diff --git a/packages/wallet/dapp-client/src/DappClient.ts b/packages/wallet/dapp-client/src/DappClient.ts index 584b146b7d..3f36148880 100644 --- a/packages/wallet/dapp-client/src/DappClient.ts +++ b/packages/wallet/dapp-client/src/DappClient.ts @@ -15,6 +15,7 @@ import { SequenceStorage, WebStorage } from './utils/storage.js' import { DappClientExplicitSessionEventListener, DappClientWalletActionEventListener, + GetFeeTokensResponse, GuardConfig, LoginMethod, RandomPrivateKeyFn, @@ -561,6 +562,19 @@ export class DappClient { return await chainSessionManager.getFeeOptions(transactions) } + /** + * Fetches fee tokens for a chain. + * @returns A promise that resolves with the fee tokens response. {@link GetFeeTokensResponse} + * @throws If the fee tokens cannot be fetched. {@link InitializationError} + */ + async getFeeTokens(chainId: number): Promise { + if (!this.isInitialized) throw new InitializationError('Not initialized') + const chainSessionManager = this.getChainSessionManager(chainId) + if (!chainSessionManager.isInitialized) + throw new InitializationError(`ChainSessionManager for chain ${chainId} is not initialized.`) + return await chainSessionManager.getFeeTokens() + } + /** * Checks if the current session has permission to execute a set of transactions on a specific chain. * @param chainId The chain ID on which to check the permissions. diff --git a/packages/wallet/dapp-client/src/types/index.ts b/packages/wallet/dapp-client/src/types/index.ts index 62ca16df06..88146cd8ac 100644 --- a/packages/wallet/dapp-client/src/types/index.ts +++ b/packages/wallet/dapp-client/src/types/index.ts @@ -1,5 +1,5 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ -import { ExplicitSession } from '@0xsequence/wallet-core' +import { ExplicitSession, Relayer } from '@0xsequence/wallet-core' import { Attestation, Payload } from '@0xsequence/wallet-primitives' import { Address, Hex } from 'ox' import type { TypedData } from 'ox/TypedData' @@ -180,3 +180,9 @@ export interface SendRequestOptions { timeout?: number path?: string } + +export type GetFeeTokensResponse = { + isFeeRequired: boolean + tokens?: Relayer.Standard.Rpc.FeeToken[] + paymentAddress?: Address.Address +} From 8e7b7eb2d98654f4c37f8a1971c8dce3da7e1fdb Mon Sep 17 00:00:00 2001 From: Gabi <56271768+VGabriel45@users.noreply.github.com> Date: Wed, 8 Oct 2025 17:15:27 +0300 Subject: [PATCH 056/119] make getFeeTokens independent of chain session manager and initialize state (#890) * make getFeeTokens independent of chain session manager and initialized state * remove getFeeTokens from chain session manager --- .../wallet/dapp-client/src/ChainSessionManager.ts | 13 ------------- packages/wallet/dapp-client/src/DappClient.ts | 12 +++++++----- packages/wallet/dapp-client/src/index.ts | 1 + 3 files changed, 8 insertions(+), 18 deletions(-) diff --git a/packages/wallet/dapp-client/src/ChainSessionManager.ts b/packages/wallet/dapp-client/src/ChainSessionManager.ts index 8689cddb88..c29bd08815 100644 --- a/packages/wallet/dapp-client/src/ChainSessionManager.ts +++ b/packages/wallet/dapp-client/src/ChainSessionManager.ts @@ -781,19 +781,6 @@ export class ChainSessionManager { } } - /** - * Fetches fee tokens for a chain. - * @returns {GetFeeTokensResponse} - * @throws {FeeOptionError} If fetching fee tokens fails. - */ - async getFeeTokens(): Promise { - try { - return await this.relayer.feeTokens() - } catch (err) { - throw new FeeOptionError(`Failed to get fee tokens: ${err instanceof Error ? err.message : String(err)}`) - } - } - /** * Builds, signs, and sends a batch of transactions. * @param transactions The transactions to be sent. diff --git a/packages/wallet/dapp-client/src/DappClient.ts b/packages/wallet/dapp-client/src/DappClient.ts index 3f36148880..c6e3844866 100644 --- a/packages/wallet/dapp-client/src/DappClient.ts +++ b/packages/wallet/dapp-client/src/DappClient.ts @@ -31,6 +31,7 @@ import { } from './types/index.js' import { TypedData } from 'ox/TypedData' import { KEYMACHINE_URL, NODES_URL, RELAYER_URL } from './utils/constants.js' +import { getRelayerUrl, getRpcUrl } from './utils/index.js' export type DappClientEventListener = (data?: any) => void @@ -568,11 +569,12 @@ export class DappClient { * @throws If the fee tokens cannot be fetched. {@link InitializationError} */ async getFeeTokens(chainId: number): Promise { - if (!this.isInitialized) throw new InitializationError('Not initialized') - const chainSessionManager = this.getChainSessionManager(chainId) - if (!chainSessionManager.isInitialized) - throw new InitializationError(`ChainSessionManager for chain ${chainId} is not initialized.`) - return await chainSessionManager.getFeeTokens() + const relayer = new Relayer.Standard.Rpc.RpcRelayer( + getRelayerUrl(chainId, this.relayerUrl), + chainId, + getRpcUrl(chainId, this.nodesUrl, this.projectAccessKey), + ) + return await relayer.feeTokens() } /** diff --git a/packages/wallet/dapp-client/src/index.ts b/packages/wallet/dapp-client/src/index.ts index 3770dd8808..791c37cd5a 100644 --- a/packages/wallet/dapp-client/src/index.ts +++ b/packages/wallet/dapp-client/src/index.ts @@ -20,6 +20,7 @@ export type { SendWalletTransactionPayload, SendWalletTransactionResponse, WalletActionResponse, + GetFeeTokensResponse, } from './types/index.js' export { RequestActionType, TransportMode } from './types/index.js' export { From 39715d55f1ab39aecd7bc81a235149cff4cb0115 Mon Sep 17 00:00:00 2001 From: Michael Standen Date: Fri, 10 Oct 2025 07:32:09 +1300 Subject: [PATCH 057/119] Throw specific error when trying to sign with an expired session (#887) * Throw when supported session signer is expired * Fix tests --- .../core/src/signers/session-manager.ts | 17 ++++++++-- .../wallet/core/test/session-manager.test.ts | 2 +- .../dapp-client/src/ChainSessionManager.ts | 33 +++++++++++++++++-- 3 files changed, 46 insertions(+), 6 deletions(-) diff --git a/packages/wallet/core/src/signers/session-manager.ts b/packages/wallet/core/src/signers/session-manager.ts index 316f9a9ad3..c991f955e6 100644 --- a/packages/wallet/core/src/signers/session-manager.ts +++ b/packages/wallet/core/src/signers/session-manager.ts @@ -137,11 +137,9 @@ export class SessionManager implements SapientSigner { if (identitySigners.length === 0) { throw new Error('Identity signers not found') } - const validImplicitSigners = this._implicitSigners.filter((signer) => signer.isValid(topology, chainId).isValid) - const validExplicitSigners = this._explicitSigners.filter((signer) => signer.isValid(topology, chainId).isValid) // Prioritize implicit signers - const availableSigners = [...validImplicitSigners, ...validExplicitSigners] + const availableSigners = [...this._implicitSigners, ...this._explicitSigners] if (availableSigners.length === 0) { throw new Error('No signers match the topology') } @@ -150,9 +148,18 @@ export class SessionManager implements SapientSigner { const signers: SessionSigner[] = [] for (const call of calls) { let supported = false + let expiredSupportedSigner: SessionSigner | undefined for (const signer of availableSigners) { try { supported = await signer.supportedCall(wallet, chainId, call, this.address, this._provider) + if (supported) { + // Check signer validity + const signerValidity = await signer.isValid(topology, chainId) + if (signerValidity.invalidReason === 'Expired') { + expiredSupportedSigner = signer + } + supported = signerValidity.isValid + } } catch (error) { console.error('findSignersForCalls error', error) continue @@ -163,6 +170,9 @@ export class SessionManager implements SapientSigner { } } if (!supported) { + if (expiredSupportedSigner) { + throw new Error(`Signer supporting call is expired: ${expiredSupportedSigner.address}`) + } throw new Error('No signer supported for call') } } @@ -256,6 +266,7 @@ export class SessionManager implements SapientSigner { const signers = await this.findSignersForCalls(wallet, chainId, payload.calls) if (signers.length !== payload.calls.length) { + // Unreachable. Throw in findSignersForCalls throw new Error('No signer supported for call') } const signatures = await Promise.all( diff --git a/packages/wallet/core/test/session-manager.test.ts b/packages/wallet/core/test/session-manager.test.ts index aa154df916..6a0bd156bb 100644 --- a/packages/wallet/core/test/session-manager.test.ts +++ b/packages/wallet/core/test/session-manager.test.ts @@ -562,7 +562,7 @@ for (const extension of ALL_EXTENSIONS) { // Sign the transaction expect(sessionManager.signSapient(wallet.address, chainId, payload, imageHash)).rejects.toThrow( - 'No signers match the topology', + `Signer supporting call is expired: ${explicitSigner.address}`, ) }, timeout, diff --git a/packages/wallet/dapp-client/src/ChainSessionManager.ts b/packages/wallet/dapp-client/src/ChainSessionManager.ts index c29bd08815..c1048b9e94 100644 --- a/packages/wallet/dapp-client/src/ChainSessionManager.ts +++ b/packages/wallet/dapp-client/src/ChainSessionManager.ts @@ -449,9 +449,9 @@ export class ChainSessionManager { throw new ModifyExplicitSessionError('Session address is required.') } - const existingExplicitSession: ExplicitSession = this.explicitSessions.find((s) => + const existingExplicitSession = this.explicitSessions.find((s) => Address.isEqual(s.sessionAddress!, modifiedExplicitSession.sessionAddress!), - ) as ExplicitSession + ) if (!existingExplicitSession) { throw new ModifyExplicitSessionError('Session not found.') } @@ -487,6 +487,8 @@ export class ChainSessionManager { } existingExplicitSession.permissions = modifiedExplicitSession.permissions + existingExplicitSession.deadline = modifiedExplicitSession.deadline + existingExplicitSession.valueLimit = modifiedExplicitSession.valueLimit if (this.transport?.mode === TransportMode.POPUP) { this.transport?.closeWallet() @@ -721,6 +723,20 @@ export class ChainSessionManager { throw new InitializationError(`Explicit session init failed after ${maxRetries} attempts: ${lastError.message}`) } + private async _refreshExplicitSession(expiredSignerAddress: Address.Address): Promise { + if (!this.wallet || !this.sessionManager || !this.provider || !this.isInitialized) + throw new InitializationError('Session is not initialized.') + // Find current explicit session + const explicitSigner = this.explicitSessions.find((s) => Address.isEqual(s.sessionAddress, expiredSignerAddress)) + if (!explicitSigner) throw new ModifyExplicitSessionError('Explicit session not found.') + // Update the deadline + const newExplicitSession = { + ...explicitSigner, + deadline: BigInt(Math.floor(Date.now() / 1000)) + BigInt(24 * 60 * 60), + } + await this.modifyExplicitSession(newExplicitSession) + } + /** * Checks if the current session has permission to execute a set of transactions. * @param transactions The transactions to check permissions for. @@ -747,6 +763,19 @@ export class ChainSessionManager { await this.sessionManager.findSignersForCalls(this.wallet.address, this.chainId, calls) return true } catch (error) { + if (error instanceof Error && error.message.includes('Signer supporting call is expired')) { + // Extract the expired signer address from the message with address regex + const expiredSignerAddress = error.message.match(/(0x[0-9a-fA-F]{40})/)?.[1] + if (expiredSignerAddress) { + // Refresh the session + await this._refreshExplicitSession(Address.from(expiredSignerAddress)) + // Retry the permission check + return this.hasPermission(transactions) + } else { + // Could not parse error message. Rethrow as this shouldn't happen. + throw error + } + } // An error from findSignersForCalls indicates a permission failure. console.warn( `Permission check failed for chain ${this.chainId}:`, From b5d47f779bfb6b27dc027998d1b209dddb5cc00f Mon Sep 17 00:00:00 2001 From: tolgahan-arikan Date: Mon, 13 Oct 2025 16:22:33 +0300 Subject: [PATCH 058/119] Make dapp-client implicit sessions chain agnostic (#893) --- .../dapp-client/src/ChainSessionManager.ts | 3 +- packages/wallet/dapp-client/src/DappClient.ts | 43 ++++++++++++++----- 2 files changed, 33 insertions(+), 13 deletions(-) diff --git a/packages/wallet/dapp-client/src/ChainSessionManager.ts b/packages/wallet/dapp-client/src/ChainSessionManager.ts index c1048b9e94..7d1f8e669d 100644 --- a/packages/wallet/dapp-client/src/ChainSessionManager.ts +++ b/packages/wallet/dapp-client/src/ChainSessionManager.ts @@ -41,7 +41,6 @@ import { ModifyExplicitSessionPayload, SessionResponse, AddExplicitSessionPayload, - GetFeeTokensResponse, } from './types/index.js' import { CACHE_DB_NAME, VALUE_FORWARDER_ADDRESS } from './utils/constants.js' import { ExplicitSession, ImplicitSession, ExplicitSessionConfig } from './index.js' @@ -232,7 +231,7 @@ export class ChainSessionManager { const implicitSession = await this.sequenceStorage.getImplicitSession() - if (implicitSession && implicitSession.chainId === this.chainId) { + if (implicitSession) { await this._initializeImplicitSessionInternal( implicitSession.pk, walletAddress, diff --git a/packages/wallet/dapp-client/src/DappClient.ts b/packages/wallet/dapp-client/src/DappClient.ts index c6e3844866..5b4818bf1b 100644 --- a/packages/wallet/dapp-client/src/DappClient.ts +++ b/packages/wallet/dapp-client/src/DappClient.ts @@ -556,10 +556,7 @@ export class DappClient { * } */ async getFeeOptions(chainId: number, transactions: Transaction[]): Promise { - if (!this.isInitialized) throw new InitializationError('Not initialized') - const chainSessionManager = this.getChainSessionManager(chainId) - if (!chainSessionManager.isInitialized) - throw new InitializationError(`ChainSessionManager for chain ${chainId} is not initialized.`) + const chainSessionManager = await this.getOrInitializeChainManager(chainId) return await chainSessionManager.getFeeOptions(transactions) } @@ -584,11 +581,19 @@ export class DappClient { * @returns A promise that resolves to true if the session has permission, otherwise false. */ async hasPermission(chainId: number, transactions: Transaction[]): Promise { - const chainSessionManager = this.chainSessionManagers.get(chainId) - if (!chainSessionManager || !chainSessionManager.isInitialized) { + if (!this.isInitialized) { + return false + } + try { + const chainSessionManager = await this.getOrInitializeChainManager(chainId) + return await chainSessionManager.hasPermission(transactions) + } catch (error) { + console.warn( + `hasPermission check failed for chain ${chainId}:`, + error instanceof Error ? error.message : String(error), + ) return false } - return await chainSessionManager.hasPermission(transactions) } /** @@ -615,10 +620,7 @@ export class DappClient { * const txHash = await dappClient.sendTransaction(1, [transaction]); */ async sendTransaction(chainId: number, transactions: Transaction[], feeOption?: Relayer.FeeOption): Promise { - if (!this.isInitialized) throw new InitializationError('Not initialized') - const chainSessionManager = this.getChainSessionManager(chainId) - if (!chainSessionManager.isInitialized) - throw new InitializationError(`ChainSessionManager for chain ${chainId} is not initialized.`) + const chainSessionManager = await this.getOrInitializeChainManager(chainId) return await chainSessionManager.buildSignAndSendTransactions(transactions, feeOption) } @@ -795,6 +797,25 @@ export class DappClient { } } + /** + * @private Retrieves or creates and initializes a ChainSessionManager for a given chain ID. + * @param chainId The chain ID to get the ChainSessionManager for. + * @returns The initialized ChainSessionManager for the given chain ID. + */ + private async getOrInitializeChainManager(chainId: number): Promise { + if (!this.isInitialized || !this.walletAddress) { + throw new InitializationError('DappClient is not initialized.') + } + const manager = this.getChainSessionManager(chainId) + if (!manager.isInitialized) { + await manager.initialize() + } + if (!manager.isInitialized) { + throw new InitializationError(`ChainSessionManager for chain ${chainId} could not be initialized.`) + } + return manager + } + /** * @private Retrieves or creates a ChainSessionManager for a given chain ID. * @param chainId The chain ID to get the ChainSessionManager for. From 3823f341b9bd039b87e7c5f90dfc8750cc429438 Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Thu, 16 Oct 2025 15:00:59 -0400 Subject: [PATCH 059/119] Add Monad, remove LAOS and Root Network --- packages/wallet/primitives/src/network.ts | 94 +++++------------------ 1 file changed, 18 insertions(+), 76 deletions(-) diff --git a/packages/wallet/primitives/src/network.ts b/packages/wallet/primitives/src/network.ts index f63417f9ec..25f62ba2aa 100644 --- a/packages/wallet/primitives/src/network.ts +++ b/packages/wallet/primitives/src/network.ts @@ -102,14 +102,6 @@ export const ChainId = { IMMUTABLE_ZKEVM: 13371, IMMUTABLE_ZKEVM_TESTNET: 13473, - // The Root Network - ROOT_NETWORK: 7668, - ROOT_NETWORK_PORCINI: 7672, - - // LAOS - LAOS: 6283, - LAOS_SIGMA_TESTNET: 62850, - // ETHERLINK ETHERLINK: 42793, ETHERLINK_TESTNET: 128123, @@ -119,6 +111,7 @@ export const ChainId = { MOONBASE_ALPHA: 1287, // MONAD + MONAD: 143, MONAD_TESTNET: 10143, // SOMNIA @@ -751,74 +744,6 @@ export const ALL: Network[] = [ decimals: 18, }, }, - { - chainId: ChainId.ROOT_NETWORK, - type: NetworkType.MAINNET, - name: 'rootnet', - title: 'The Root Network', - rpcUrl: getRpcUrl('rootnet'), - logoUrl: getLogoUrl(ChainId.ROOT_NETWORK), - blockExplorer: { - name: 'The Root Network Explorer', - url: 'https://rootscan.io/', - }, - nativeCurrency: { - symbol: 'XRP', - name: 'XRP', - decimals: 18, - }, - }, - { - chainId: ChainId.ROOT_NETWORK_PORCINI, - type: NetworkType.TESTNET, - name: 'rootnet-porcini', - title: 'The Root Network Porcini Testnet', - rpcUrl: getRpcUrl('rootnet-porcini'), - logoUrl: getLogoUrl(ChainId.ROOT_NETWORK_PORCINI), - blockExplorer: { - name: 'The Root Network Porcini Testnet Explorer', - url: 'https://porcini.rootscan.io/', - }, - nativeCurrency: { - symbol: 'XRP', - name: 'XRP', - decimals: 18, - }, - }, - { - chainId: ChainId.LAOS, - type: NetworkType.MAINNET, - name: 'laos', - title: 'LAOS', - rpcUrl: getRpcUrl('laos'), - logoUrl: getLogoUrl(ChainId.LAOS), - blockExplorer: { - name: 'LAOS Explorer', - url: 'https://blockscout.laos.laosfoundation.io/', - }, - nativeCurrency: { - symbol: 'LAOS', - name: 'LAOS', - decimals: 18, - }, - }, - { - chainId: ChainId.LAOS_SIGMA_TESTNET, - type: NetworkType.TESTNET, - name: 'laos-sigma-testnet', - title: 'LAOS Sigma Testnet', - rpcUrl: getRpcUrl('laos-sigma-testnet'), - logoUrl: getLogoUrl(ChainId.LAOS_SIGMA_TESTNET), - blockExplorer: { - name: 'LAOS Sigma Testnet Explorer', - url: 'https://sigma.explorer.laosnetwork.io/', - }, - nativeCurrency: { - symbol: 'SIGMA', - name: 'SIGMA', - decimals: 18, - }, - }, { chainId: ChainId.MOONBEAM, type: NetworkType.MAINNET, @@ -887,6 +812,23 @@ export const ALL: Network[] = [ decimals: 18, }, }, + { + chainId: ChainId.MONAD, + type: NetworkType.MAINNET, + name: 'monad', + title: 'Monad', + rpcUrl: getRpcUrl('monad'), + logoUrl: getLogoUrl(ChainId.MONAD), + blockExplorer: { + name: 'Monad Explorer', + url: 'https://mainnet-beta.monvision.io/', + }, + nativeCurrency: { + symbol: 'MON', + name: 'MON', + decimals: 18, + }, + }, { chainId: ChainId.MONAD_TESTNET, type: NetworkType.TESTNET, From e0204838f24b78e02f812d39637c73ce88ea1d27 Mon Sep 17 00:00:00 2001 From: tolgahan-arikan Date: Fri, 17 Oct 2025 14:51:48 +0300 Subject: [PATCH 060/119] Add support for sessionless dapp connection (#896) --- .../dapp-client/src/ChainSessionManager.ts | 135 ++++++++++++------ packages/wallet/dapp-client/src/DappClient.ts | 101 ++++++++++++- .../wallet/dapp-client/src/utils/storage.ts | 40 ++++++ 3 files changed, 227 insertions(+), 49 deletions(-) diff --git a/packages/wallet/dapp-client/src/ChainSessionManager.ts b/packages/wallet/dapp-client/src/ChainSessionManager.ts index 7d1f8e669d..afe0095d97 100644 --- a/packages/wallet/dapp-client/src/ChainSessionManager.ts +++ b/packages/wallet/dapp-client/src/ChainSessionManager.ts @@ -174,7 +174,7 @@ export class ChainSessionManager { * @throws {InitializationError} If initialization fails. */ async initialize(): Promise<{ - loginMethod: string | null + loginMethod: LoginMethod | null userEmail: string | null } | void> { if (this.isInitializing) return @@ -280,26 +280,34 @@ export class ChainSessionManager { throw new InitializationError('A session already exists. Disconnect first.') } - const newPk = await this.randomPrivateKeyFn() - const newSignerAddress = Address.fromPublicKey(Secp256k1.getPublicKey({ privateKey: newPk })) - const completeSession = { - sessionAddress: newSignerAddress, - ...sessionConfig, - } + const shouldCreateSession = !!sessionConfig || (options.includeImplicitSession ?? false) + + const newPk = shouldCreateSession ? await this.randomPrivateKeyFn() : null + const newSignerAddress = + shouldCreateSession && newPk ? Address.fromPublicKey(Secp256k1.getPublicKey({ privateKey: newPk })) : null + const completeSession = + shouldCreateSession && newSignerAddress + ? { + sessionAddress: newSignerAddress, + ...sessionConfig, + } + : undefined try { if (!this.transport) throw new InitializationError('Transport failed to initialize.') const payload: CreateNewSessionPayload = { origin, - session: completeSession as ExplicitSession, + session: completeSession as ExplicitSession | undefined, includeImplicitSession: options.includeImplicitSession ?? false, preferredLoginMethod: options.preferredLoginMethod, email: options.preferredLoginMethod === 'email' ? options.email : undefined, } if (this.transport.mode === TransportMode.REDIRECT) { - await this.sequenceStorage.saveTempSessionPk(newPk) + if (shouldCreateSession && newPk) { + await this.sequenceStorage.saveTempSessionPk(newPk) + } await this.sequenceStorage.savePendingRequest({ chainId: this.chainId, action: RequestActionType.CREATE_NEW_SESSION, @@ -318,34 +326,44 @@ export class ChainSessionManager { const receivedAddress = Address.from(connectResponse.walletAddress) const { attestation, signature, userEmail, loginMethod, guard } = connectResponse - if (attestation && signature) { + if (shouldCreateSession) { await this._resetStateAndClearCredentials() + this.loginMethod = null + this.userEmail = null + this.initializeWithWallet(receivedAddress) - await this._initializeImplicitSessionInternal( - newPk, - receivedAddress, - attestation, - signature, - true, - loginMethod, - userEmail, - guard, - ) - } + if (attestation && signature && newPk) { + await this._initializeImplicitSessionInternal( + newPk, + receivedAddress, + attestation, + signature, + true, + loginMethod, + userEmail, + guard, + ) + } - if (sessionConfig) { + if (sessionConfig && newPk) { + await this._initializeExplicitSessionInternal(newPk, loginMethod, userEmail, guard, true) + await this.sequenceStorage.saveExplicitSession({ + pk: newPk, + walletAddress: receivedAddress, + chainId: this.chainId, + guard, + loginMethod, + userEmail, + }) + } + } else { + await this._resetStateAndClearCredentials() this.initializeWithWallet(receivedAddress) - await this._initializeExplicitSessionInternal(newPk, loginMethod, userEmail, guard, true) - await this.sequenceStorage.saveExplicitSession({ - pk: newPk, - walletAddress: receivedAddress, - chainId: this.chainId, - guard, - loginMethod, - userEmail, - }) + this.loginMethod = loginMethod ?? null + this.userEmail = userEmail ?? null + this.guard = guard } if (this.transport.mode === TransportMode.POPUP) { @@ -422,6 +440,7 @@ export class ChainSessionManager { userEmail: response.userEmail, guard: response.guard, }) + await this.sequenceStorage.clearSessionlessConnection() } catch (err) { if (this.transport?.mode === TransportMode.POPUP) this.transport.closeWallet() throw new AddExplicitSessionError(`Adding explicit session failed: ${err}`) @@ -507,26 +526,35 @@ export class ChainSessionManager { payload: CreateNewSessionResponse action: string }): Promise { - const tempPk = await this.sequenceStorage.getAndClearTempSessionPk() - if (!tempPk) { - throw new InitializationError('Failed to retrieve temporary session key after redirect.') - } - try { const connectResponse = response.payload const receivedAddress = Address.from(connectResponse.walletAddress) const { userEmail, loginMethod, guard } = connectResponse + const savedRequest = await this.sequenceStorage.peekPendingRequest() + const savedPayload = savedRequest?.payload as CreateNewSessionPayload | undefined + const explicitSessionRequested = !!savedPayload?.session + const implicitSessionRequested = savedPayload?.includeImplicitSession ?? false + const needsTempPk = explicitSessionRequested || implicitSessionRequested + const tempPk = needsTempPk ? await this.sequenceStorage.getAndClearTempSessionPk() : null + + if (needsTempPk && !tempPk) { + throw new InitializationError('Failed to retrieve temporary session key after redirect.') + } if (response.action === RequestActionType.CREATE_NEW_SESSION) { const { attestation, signature } = connectResponse - const savedRequest = await this.sequenceStorage.peekPendingRequest() - const savedPayload = savedRequest?.payload as CreateNewSessionPayload | undefined await this._resetStateAndClearCredentials() + this.loginMethod = null + this.userEmail = null + this.initializeWithWallet(receivedAddress) - if (attestation && signature) { + if (implicitSessionRequested) { + if (!attestation || !signature || !tempPk) { + throw new InitializationError('Missing implicit session data in redirect response.') + } await this._initializeImplicitSessionInternal( tempPk, receivedAddress, @@ -539,7 +567,7 @@ export class ChainSessionManager { ) } - if (savedRequest && savedPayload && savedPayload.session?.permissions) { + if (explicitSessionRequested && savedPayload?.session && tempPk) { await this._initializeExplicitSessionInternal(tempPk, loginMethod, userEmail, guard, true) await this.sequenceStorage.saveExplicitSession({ pk: tempPk, @@ -549,29 +577,42 @@ export class ChainSessionManager { userEmail, guard, }) + await this.sequenceStorage.clearSessionlessConnection() + } + + if (!explicitSessionRequested && !implicitSessionRequested) { + this.loginMethod = loginMethod ?? null + this.userEmail = userEmail ?? null + this.guard = guard } } 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.') } + const explicitSessionPk = tempPk ?? (await this.sequenceStorage.getAndClearTempSessionPk()) + if (!explicitSessionPk) { + throw new InitializationError('Failed to retrieve temporary session key for explicit session.') + } + await this._initializeExplicitSessionInternal( - tempPk, + explicitSessionPk, this.loginMethod ?? undefined, this.userEmail ?? undefined, this.guard ?? undefined, true, ) await this.sequenceStorage.saveExplicitSession({ - pk: tempPk, + pk: explicitSessionPk, walletAddress: receivedAddress, chainId: this.chainId, loginMethod: this.loginMethod ?? undefined, userEmail: this.userEmail ?? undefined, guard: this.guard ?? undefined, }) + await this.sequenceStorage.clearSessionlessConnection() - const newSignerAddress = Address.fromPublicKey(Secp256k1.getPublicKey({ privateKey: tempPk })) + const newSignerAddress = Address.fromPublicKey(Secp256k1.getPublicKey({ privateKey: explicitSessionPk })) this.emit('explicitSessionResponse', { action: RequestActionType.ADD_EXPLICIT_SESSION, @@ -580,6 +621,8 @@ export class ChainSessionManager { sessionAddress: newSignerAddress, }, }) + } else { + throw new WalletRedirectError(`Received unhandled redirect action: ${response.action}`) } this.isInitialized = true return true @@ -929,6 +972,10 @@ export class ChainSessionManager { return this.walletAddress } + getGuard(): GuardConfig | undefined { + return this.guard + } + /** * Gets the sessions (signers) managed by this session manager. * @returns An array of session objects. @@ -1036,6 +1083,7 @@ export class ChainSessionManager { this.wallet = null this.sessionManager = null this.isInitialized = false + this.guard = undefined } /** @@ -1045,5 +1093,6 @@ export class ChainSessionManager { this._resetState() await this.sequenceStorage.clearImplicitSession() await this.sequenceStorage.clearExplicitSessions() + await this.sequenceStorage.clearSessionlessConnection() } } diff --git a/packages/wallet/dapp-client/src/DappClient.ts b/packages/wallet/dapp-client/src/DappClient.ts index 5b4818bf1b..d92936fa20 100644 --- a/packages/wallet/dapp-client/src/DappClient.ts +++ b/packages/wallet/dapp-client/src/DappClient.ts @@ -13,6 +13,7 @@ import { DappTransport } from './DappTransport.js' import { ConnectionError, InitializationError, SigningError, TransactionError } from './utils/errors.js' import { SequenceStorage, WebStorage } from './utils/storage.js' import { + CreateNewSessionResponse, DappClientExplicitSessionEventListener, DappClientWalletActionEventListener, GetFeeTokensResponse, @@ -63,7 +64,7 @@ interface DappClientEventMap { export class DappClient { public isInitialized = false - public loginMethod: string | null = null + public loginMethod: LoginMethod | null = null public userEmail: string | null = null public guard?: GuardConfig @@ -87,6 +88,7 @@ export class DappClient { private isInitializing = false private walletAddress: Address.Address | null = null + private hasSessionlessConnection = false private eventListeners: { [K in keyof DappClientEventMap]?: Set } = {} @@ -275,18 +277,38 @@ export class DappClient { private async _loadStateFromStorage(): Promise { const implicitSession = await this.sequenceStorage.getImplicitSession() - const explicitSessions = await this.sequenceStorage.getExplicitSessions() + const [explicitSessions, sessionlessConnection] = await Promise.all([ + this.sequenceStorage.getExplicitSessions(), + this.sequenceStorage.getSessionlessConnection(), + ]) const chainIdsToInitialize = new Set([ ...(implicitSession?.chainId !== undefined ? [implicitSession.chainId] : []), ...explicitSessions.map((s) => s.chainId), ]) if (chainIdsToInitialize.size === 0) { - this.isInitialized = false - this.emit('sessionsUpdated') + if (sessionlessConnection) { + await this.applySessionlessConnectionState( + sessionlessConnection.walletAddress, + sessionlessConnection.loginMethod, + sessionlessConnection.userEmail, + sessionlessConnection.guard, + false, + ) + } else { + this.isInitialized = false + this.hasSessionlessConnection = false + this.walletAddress = null + this.loginMethod = null + this.userEmail = null + this.guard = undefined + this.emit('sessionsUpdated') + } return } + this.hasSessionlessConnection = false + const initPromises = Array.from(chainIdsToInitialize).map((chainId) => this.getChainSessionManager(chainId).initialize(), ) @@ -297,6 +319,7 @@ export class DappClient { this.loginMethod = result[0]?.loginMethod || null this.userEmail = result[0]?.userEmail || null this.guard = implicitSession?.guard || explicitSessions.find((s) => !!s.guard)?.guard + await this.sequenceStorage.clearSessionlessConnection() this.isInitialized = true this.emit('sessionsUpdated') @@ -388,7 +411,27 @@ export class DappClient { if (!chainSessionManager.isInitialized && this.walletAddress) { chainSessionManager.initializeWithWallet(this.walletAddress) } - await chainSessionManager.handleRedirectResponse(response) + const handled = await chainSessionManager.handleRedirectResponse(response) + if (handled && action === RequestActionType.CREATE_NEW_SESSION) { + const hasImplicit = !!chainSessionManager.getImplicitSession() + const hasExplicit = chainSessionManager.getExplicitSessions().length > 0 + if (hasImplicit || hasExplicit) { + this.hasSessionlessConnection = false + await this._loadStateFromStorage() + } else if ('payload' in response && response.payload) { + const payload = response.payload as CreateNewSessionResponse + const walletAddress = chainSessionManager.getWalletAddress() ?? Address.from(payload.walletAddress) + await this.applySessionlessConnectionState( + walletAddress, + chainSessionManager.loginMethod, + chainSessionManager.userEmail, + chainSessionManager.getGuard(), + ) + } + } else if (handled && action === RequestActionType.ADD_EXPLICIT_SESSION) { + this.hasSessionlessConnection = false + await this._loadStateFromStorage() + } } else { throw new InitializationError(`Could not find a pending request context for the redirect action: ${action}`) } @@ -431,12 +474,29 @@ export class DappClient { try { const chainSessionManager = this.getChainSessionManager(chainId) + const shouldCreateSession = !!sessionConfig || (options.includeImplicitSession ?? false) + this.hasSessionlessConnection = false await chainSessionManager.createNewSession(this.origin, sessionConfig, options) // For popup mode, we need to manually update the state and emit an event. // For redirect mode, this code won't be reached; the page will navigate away. if (this.transport.mode === TransportMode.POPUP) { - await this._loadStateFromStorage() + const hasImplicitSession = !!chainSessionManager.getImplicitSession() + const hasExplicitSessions = chainSessionManager.getExplicitSessions().length > 0 + if (shouldCreateSession && (hasImplicitSession || hasExplicitSessions)) { + await this._loadStateFromStorage() + } else { + const walletAddress = chainSessionManager.getWalletAddress() + if (!walletAddress) { + throw new InitializationError('Wallet address missing after connect.') + } + await this.applySessionlessConnectionState( + walletAddress, + chainSessionManager.loginMethod, + chainSessionManager.userEmail, + chainSessionManager.getGuard(), + ) + } } } catch (err) { await this.disconnect() @@ -744,6 +804,8 @@ export class DappClient { this.walletAddress = null this.loginMethod = null this.userEmail = null + this.guard = undefined + this.hasSessionlessConnection = false this.emit('sessionsUpdated') } @@ -759,6 +821,30 @@ export class DappClient { } } + private async applySessionlessConnectionState( + walletAddress: Address.Address, + loginMethod?: LoginMethod | null, + userEmail?: string | null, + guard?: GuardConfig, + persist: boolean = true, + ): Promise { + this.walletAddress = walletAddress + this.loginMethod = loginMethod ?? null + this.userEmail = userEmail ?? null + this.guard = guard + this.hasSessionlessConnection = true + this.isInitialized = true + this.emit('sessionsUpdated') + if (persist) { + await this.sequenceStorage.saveSessionlessConnection({ + walletAddress, + loginMethod: this.loginMethod ?? undefined, + userEmail: this.userEmail ?? undefined, + guard: this.guard, + }) + } + } + private async _requestWalletAction( action: (typeof RequestActionType)['SIGN_MESSAGE' | 'SIGN_TYPED_DATA' | 'SEND_WALLET_TRANSACTION'], payload: SignMessagePayload | SignTypedDataPayload | SendWalletTransactionPayload, @@ -813,6 +899,9 @@ export class DappClient { if (!manager.isInitialized) { throw new InitializationError(`ChainSessionManager for chain ${chainId} could not be initialized.`) } + if (!manager.getImplicitSession() && manager.getExplicitSessions().length === 0) { + throw new InitializationError('No sessions are available for the requested action.') + } return manager } diff --git a/packages/wallet/dapp-client/src/utils/storage.ts b/packages/wallet/dapp-client/src/utils/storage.ts index c65bc0ffce..2fa2eaac47 100644 --- a/packages/wallet/dapp-client/src/utils/storage.ts +++ b/packages/wallet/dapp-client/src/utils/storage.ts @@ -33,6 +33,13 @@ export interface ImplicitSessionData { guard?: GuardConfig } +export interface SessionlessConnectionData { + walletAddress: Address.Address + loginMethod?: LoginMethod + userEmail?: string + guard?: GuardConfig +} + export type PendingPayload = | CreateNewSessionPayload | AddExplicitSessionPayload @@ -66,6 +73,10 @@ export interface SequenceStorage { getImplicitSession(): Promise clearImplicitSession(): Promise + saveSessionlessConnection(sessionData: SessionlessConnectionData): Promise + getSessionlessConnection(): Promise + clearSessionlessConnection(): Promise + clearAllData(): Promise } @@ -74,6 +85,7 @@ const DB_VERSION = 1 const STORE_NAME = 'userKeys' const IMPLICIT_SESSIONS_IDB_KEY = 'SequenceImplicitSession' const EXPLICIT_SESSIONS_IDB_KEY = 'SequenceExplicitSession' +const SESSIONLESS_CONNECTION_IDB_KEY = 'SequenceSessionlessConnection' const PENDING_REDIRECT_REQUEST_KEY = 'SequencePendingRedirect' const TEMP_SESSION_PK_KEY = 'SequencePendingTempSessionPk' @@ -255,6 +267,33 @@ export class WebStorage implements SequenceStorage { } } + async saveSessionlessConnection(sessionData: SessionlessConnectionData): Promise { + try { + await this.setIDBItem(SESSIONLESS_CONNECTION_IDB_KEY, sessionData) + } catch (error) { + console.error('Failed to save sessionless connection:', error) + throw error + } + } + + async getSessionlessConnection(): Promise { + try { + return (await this.getIDBItem(SESSIONLESS_CONNECTION_IDB_KEY)) ?? null + } catch (error) { + console.error('Failed to retrieve sessionless connection:', error) + return null + } + } + + async clearSessionlessConnection(): Promise { + try { + await this.deleteIDBItem(SESSIONLESS_CONNECTION_IDB_KEY) + } catch (error) { + console.error('Failed to clear sessionless connection:', error) + throw error + } + } + async clearAllData(): Promise { try { // Clear all session storage items @@ -265,6 +304,7 @@ export class WebStorage implements SequenceStorage { // Clear all IndexedDB items await this.clearExplicitSessions() await this.clearImplicitSession() + await this.clearSessionlessConnection() } catch (error) { console.error('Failed to clear all data:', error) throw error From 3bd493bb3445b4d8f7d0bbb850657109a2d7e209 Mon Sep 17 00:00:00 2001 From: Gabi <56271768+VGabriel45@users.noreply.github.com> Date: Fri, 17 Oct 2025 17:18:02 +0300 Subject: [PATCH 061/119] Refactor relayer package & update dependant packages (#891) --- packages/services/api/CHANGELOG.md | 2 - packages/services/api/src/api.gen.ts | 3779 ++++++++++------- packages/services/guard/CHANGELOG.md | 1 - packages/services/indexer/CHANGELOG.md | 2 - packages/services/metadata/CHANGELOG.md | 2 - packages/services/relayer/CHANGELOG.md | 2 - packages/services/relayer/package.json | 9 +- packages/services/relayer/src/index.ts | 6 +- .../relayer}/src/preconditions/codec.ts | 0 .../relayer}/src/preconditions/index.ts | 0 .../relayer}/src/preconditions/selectors.ts | 0 .../relayer}/src/preconditions/types.ts | 0 .../relayer/src}/relayer.ts | 2 +- .../services/relayer/src/rpc-relayer/index.ts | 450 +- .../relayer/src}/standard/abi.ts | 0 .../relayer/src}/standard/eip6963.ts | 2 +- .../relayer/src}/standard/index.ts | 1 - .../relayer/src}/standard/local.ts | 4 +- .../relayer/src}/standard/pk-relayer.ts | 2 +- .../relayer/src}/standard/sequence.ts | 4 +- .../relayer}/test/preconditions/codec.test.ts | 0 .../test/preconditions}/preconditions.test.ts | 6 +- .../test/preconditions/selectors.test.ts | 0 .../relayer}/test/preconditions/types.test.ts | 0 .../relayer}/test/relayer/relayer.test.ts | 71 +- packages/utils/abi/CHANGELOG.md | 2 - .../core/src/{relayer => bundler}/bundler.ts | 4 +- .../{relayer => bundler}/bundlers/index.ts | 0 .../{relayer => bundler}/bundlers/pimlico.ts | 4 +- .../core/src/{relayer => bundler}/index.ts | 2 - packages/wallet/core/src/index.ts | 3 +- .../core/src/relayer/standard/rpc/index.ts | 439 -- .../src/relayer/standard/rpc/relayer.gen.ts | 2039 --------- .../core/src/signers/session-manager.ts | 6 +- .../wallet/core/test/relayer/bundler.test.ts | 6 +- packages/wallet/dapp-client/package.json | 3 +- .../dapp-client/src/ChainSessionManager.ts | 19 +- packages/wallet/dapp-client/src/DappClient.ts | 20 +- packages/wallet/dapp-client/src/index.ts | 4 +- .../wallet/dapp-client/src/types/index.ts | 10 +- .../wallet/dapp-client/src/utils/constants.ts | 4 +- packages/wallet/wdk/package.json | 1 + packages/wallet/wdk/src/sequence/guards.ts | 2 +- .../wallet/wdk/src/sequence/handlers/guard.ts | 2 +- packages/wallet/wdk/src/sequence/manager.ts | 12 +- .../wallet/wdk/src/sequence/transactions.ts | 17 +- .../src/sequence/types/transaction-request.ts | 3 +- pnpm-lock.yaml | 1203 +++--- 48 files changed, 3326 insertions(+), 4824 deletions(-) rename packages/{wallet/core => services/relayer}/src/preconditions/codec.ts (100%) rename packages/{wallet/core => services/relayer}/src/preconditions/index.ts (100%) rename packages/{wallet/core => services/relayer}/src/preconditions/selectors.ts (100%) rename packages/{wallet/core => services/relayer}/src/preconditions/types.ts (100%) rename packages/{wallet/core/src/relayer => services/relayer/src}/relayer.ts (96%) rename packages/{wallet/core/src/relayer => services/relayer/src}/standard/abi.ts (100%) rename packages/{wallet/core/src/relayer => services/relayer/src}/standard/eip6963.ts (96%) rename packages/{wallet/core/src/relayer => services/relayer/src}/standard/index.ts (77%) rename packages/{wallet/core/src/relayer => services/relayer/src}/standard/local.ts (98%) rename packages/{wallet/core/src/relayer => services/relayer/src}/standard/pk-relayer.ts (98%) rename packages/{wallet/core/src/relayer => services/relayer/src}/standard/sequence.ts (96%) rename packages/{wallet/core => services/relayer}/test/preconditions/codec.test.ts (100%) rename packages/{wallet/core/test => services/relayer/test/preconditions}/preconditions.test.ts (98%) rename packages/{wallet/core => services/relayer}/test/preconditions/selectors.test.ts (100%) rename packages/{wallet/core => services/relayer}/test/preconditions/types.test.ts (100%) rename packages/{wallet/core => services/relayer}/test/relayer/relayer.test.ts (86%) rename packages/wallet/core/src/{relayer => bundler}/bundler.ts (85%) rename packages/wallet/core/src/{relayer => bundler}/bundlers/index.ts (100%) rename packages/wallet/core/src/{relayer => bundler}/bundlers/pimlico.ts (97%) rename packages/wallet/core/src/{relayer => bundler}/index.ts (67%) delete mode 100644 packages/wallet/core/src/relayer/standard/rpc/index.ts delete mode 100644 packages/wallet/core/src/relayer/standard/rpc/relayer.gen.ts diff --git a/packages/services/api/CHANGELOG.md b/packages/services/api/CHANGELOG.md index 0a41064826..28bacf399a 100644 --- a/packages/services/api/CHANGELOG.md +++ b/packages/services/api/CHANGELOG.md @@ -1422,7 +1422,6 @@ - relayer: fix Relayer.wait() interface The interface for calling Relayer.wait() has changed. Instead of a single optional ill-defined timeout/delay parameter, there are three optional parameters, in order: - - timeout: the maximum time to wait for the transaction receipt - delay: the polling interval, i.e. the time to wait between requests - maxFails: the maximum number of hard failures to tolerate before giving up @@ -1787,7 +1786,6 @@ ### Minor Changes - major architectural changes in Sequence design - - only one API instance, API is no longer a per-chain service - separate per-chain indexer service, API no longer handles indexing - single contract metadata service, API no longer serves metadata diff --git a/packages/services/api/src/api.gen.ts b/packages/services/api/src/api.gen.ts index a42d143d6d..967fad8fe2 100644 --- a/packages/services/api/src/api.gen.ts +++ b/packages/services/api/src/api.gen.ts @@ -5,75 +5,74 @@ // // webrpc-gen -schema=api.ridl -target=typescript -client -out=./clients/api.gen.ts -export const WebrpcHeader = "Webrpc" +export const WebrpcHeader = 'Webrpc' -export const WebrpcHeaderValue = "webrpc@v0.25.3;gen-typescript@v0.17.0;sequence-api@v0.4.0" +export const WebrpcHeaderValue = 'webrpc@v0.25.3;gen-typescript@v0.17.0;sequence-api@v0.4.0' // WebRPC description and code-gen version -export const WebRPCVersion = "v1" +export const WebRPCVersion = 'v1' // Schema version of your RIDL schema -export const WebRPCSchemaVersion = "v0.4.0" +export const WebRPCSchemaVersion = 'v0.4.0' // Schema hash generated from your RIDL schema -export const WebRPCSchemaHash = "d43a5aac616814072c69e63f2f81fe65ea10a7e0" +export const WebRPCSchemaHash = 'd43a5aac616814072c69e63f2f81fe65ea10a7e0' type WebrpcGenVersions = { - webrpcGenVersion: string; - codeGenName: string; - codeGenVersion: string; - schemaName: string; - schemaVersion: string; -}; + webrpcGenVersion: string + codeGenName: string + codeGenVersion: string + schemaName: string + schemaVersion: string +} export function VersionFromHeader(headers: Headers): WebrpcGenVersions { - const headerValue = headers.get(WebrpcHeader); + const headerValue = headers.get(WebrpcHeader) if (!headerValue) { return { - webrpcGenVersion: "", - codeGenName: "", - codeGenVersion: "", - schemaName: "", - schemaVersion: "", - }; + webrpcGenVersion: '', + codeGenName: '', + codeGenVersion: '', + schemaName: '', + schemaVersion: '', + } } - return parseWebrpcGenVersions(headerValue); + return parseWebrpcGenVersions(headerValue) } function parseWebrpcGenVersions(header: string): WebrpcGenVersions { - const versions = header.split(";"); + const versions = header.split(';') if (versions.length < 3) { return { - webrpcGenVersion: "", - codeGenName: "", - codeGenVersion: "", - schemaName: "", - schemaVersion: "", - }; + webrpcGenVersion: '', + codeGenName: '', + codeGenVersion: '', + schemaName: '', + schemaVersion: '', + } } - const [_, webrpcGenVersion] = versions[0]!.split("@"); - const [codeGenName, codeGenVersion] = versions[1]!.split("@"); - const [schemaName, schemaVersion] = versions[2]!.split("@"); + const [_, webrpcGenVersion] = versions[0]!.split('@') + const [codeGenName, codeGenVersion] = versions[1]!.split('@') + const [schemaName, schemaVersion] = versions[2]!.split('@') return { - webrpcGenVersion: webrpcGenVersion ?? "", - codeGenName: codeGenName ?? "", - codeGenVersion: codeGenVersion ?? "", - schemaName: schemaName ?? "", - schemaVersion: schemaVersion ?? "", - }; + webrpcGenVersion: webrpcGenVersion ?? '', + codeGenName: codeGenName ?? '', + codeGenVersion: codeGenVersion ?? '', + schemaName: schemaName ?? '', + schemaVersion: schemaVersion ?? '', + } } // // Types // - export enum SortOrder { DESC = 'DESC', - ASC = 'ASC' + ASC = 'ASC', } export enum SardinePaymentType { @@ -82,57 +81,57 @@ export enum SardinePaymentType { credit = 'credit', us_debit = 'us_debit', international_debit = 'international_debit', - international_credit = 'international_credit' + international_credit = 'international_credit', } export enum SardineQuoteType { buy = 'buy', - sell = 'sell' + sell = 'sell', } export enum GetLifiSwapRouteDirection { to = 'to', - from = 'from' + from = 'from', } export enum TokenType { ERC20 = 'ERC20', ERC721 = 'ERC721', - ERC1155 = 'ERC1155' + ERC1155 = 'ERC1155', } export enum TransakBuySell { UNKNOWN = 'UNKNOWN', BUY = 'BUY', - SELL = 'SELL' + SELL = 'SELL', } export enum TradeType { EXACT_INPUT = 'EXACT_INPUT', - EXACT_OUTPUT = 'EXACT_OUTPUT' + EXACT_OUTPUT = 'EXACT_OUTPUT', } export enum CheckoutOptionCrypto { none = 'none', partially = 'partially', - all = 'all' + all = 'all', } export enum CheckoutOptionNFTCheckoutProvider { unknown = 'unknown', sardine = 'sardine', - transak = 'transak' + transak = 'transak', } export enum CheckoutOptionOnRampProvider { unknown = 'unknown', sardine = 'sardine', - transak = 'transak' + transak = 'transak', } export enum CheckoutOptionSwapProvider { unknown = 'unknown', - lifi = 'lifi' + lifi = 'lifi', } export interface Version { @@ -150,7 +149,7 @@ export interface RuntimeStatus { branch: string commitHash: string checks: RuntimeChecks - numTxnsRelayed: {[key: string]: NumTxnsRelayed} + numTxnsRelayed: { [key: string]: NumTxnsRelayed } } export interface NumTxnsRelayed { @@ -160,8 +159,7 @@ export interface NumTxnsRelayed { period: number } -export interface RuntimeChecks { -} +export interface RuntimeChecks {} export interface SequenceContext { factory: string @@ -960,14 +958,14 @@ export interface IntentQuote { quoteProvider: string quoteProviderRequestId: string quoteProviderFeeUsd: string - feeQuotes: {[key: string]: string} + feeQuotes: { [key: string]: string } } export interface API { /** - * + * * Runtime - * + * */ ping(headers?: object, signal?: AbortSignal): Promise version(headers?: object, signal?: AbortSignal): Promise @@ -975,70 +973,133 @@ export interface API { clock(headers?: object, signal?: AbortSignal): Promise getSequenceContext(headers?: object, signal?: AbortSignal): Promise /** - * + * * Auth - * + * * TODO: rename 'ewtString' arg to 'ethauthProof' */ getAuthToken(args: GetAuthTokenArgs, headers?: object, signal?: AbortSignal): Promise getAuthToken2(args: GetAuthToken2Args, headers?: object, signal?: AbortSignal): Promise - sendPasswordlessLink(args: SendPasswordlessLinkArgs, headers?: object, signal?: AbortSignal): Promise - registerPublicKey(args: RegisterPublicKeyArgs, headers?: object, signal?: AbortSignal): Promise + sendPasswordlessLink( + args: SendPasswordlessLinkArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + registerPublicKey( + args: RegisterPublicKeyArgs, + headers?: object, + signal?: AbortSignal, + ): Promise getPublicKey(args: GetPublicKeyArgs, headers?: object, signal?: AbortSignal): Promise /** - * + * * Contacts / Friends - * + * */ friendList(args: FriendListArgs, headers?: object, signal?: AbortSignal): Promise - getFriendByAddress(args: GetFriendByAddressArgs, headers?: object, signal?: AbortSignal): Promise + getFriendByAddress( + args: GetFriendByAddressArgs, + headers?: object, + signal?: AbortSignal, + ): Promise searchFriends(args: SearchFriendsArgs, headers?: object, signal?: AbortSignal): Promise addFriend(args: AddFriendArgs, headers?: object, signal?: AbortSignal): Promise - updateFriendNickname(args: UpdateFriendNicknameArgs, headers?: object, signal?: AbortSignal): Promise + updateFriendNickname( + args: UpdateFriendNicknameArgs, + headers?: object, + signal?: AbortSignal, + ): Promise removeFriend(args: RemoveFriendArgs, headers?: object, signal?: AbortSignal): Promise /** - * + * * Chain-Utils - * + * */ contractCall(args: ContractCallArgs, headers?: object, signal?: AbortSignal): Promise - decodeContractCall(args: DecodeContractCallArgs, headers?: object, signal?: AbortSignal): Promise - lookupContractCallSelectors(args: LookupContractCallSelectorsArgs, headers?: object, signal?: AbortSignal): Promise + decodeContractCall( + args: DecodeContractCallArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + lookupContractCallSelectors( + args: LookupContractCallSelectorsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise /** - * + * * User Storage - * + * */ userStorageFetch(args: UserStorageFetchArgs, headers?: object, signal?: AbortSignal): Promise userStorageSave(args: UserStorageSaveArgs, headers?: object, signal?: AbortSignal): Promise - userStorageDelete(args: UserStorageDeleteArgs, headers?: object, signal?: AbortSignal): Promise - userStorageFetchAll(args: UserStorageFetchAllArgs, headers?: object, signal?: AbortSignal): Promise + userStorageDelete( + args: UserStorageDeleteArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + userStorageFetchAll( + args: UserStorageFetchAllArgs, + headers?: object, + signal?: AbortSignal, + ): Promise /** - * + * * Wallet utils - * + * */ getMoonpayLink(args: GetMoonpayLinkArgs, headers?: object, signal?: AbortSignal): Promise /** * - IsUsingGoogleMail(domain: string) => (yes: bool) */ - resolveENSAddress(args: ResolveENSAddressArgs, headers?: object, signal?: AbortSignal): Promise + resolveENSAddress( + args: ResolveENSAddressArgs, + headers?: object, + signal?: AbortSignal, + ): Promise /** * TODO: we can add walletContext optional in the future when we need it * NOTE: chainId can be either a number or canonical name */ isValidSignature(args: IsValidSignatureArgs, headers?: object, signal?: AbortSignal): Promise - isValidMessageSignature(args: IsValidMessageSignatureArgs, headers?: object, signal?: AbortSignal): Promise - isValidTypedDataSignature(args: IsValidTypedDataSignatureArgs, headers?: object, signal?: AbortSignal): Promise - isValidETHAuthProof(args: IsValidETHAuthProofArgs, headers?: object, signal?: AbortSignal): Promise + isValidMessageSignature( + args: IsValidMessageSignatureArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + isValidTypedDataSignature( + args: IsValidTypedDataSignatureArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + isValidETHAuthProof( + args: IsValidETHAuthProofArgs, + headers?: object, + signal?: AbortSignal, + ): Promise getOnRampURL(args: GetOnRampURLArgs, headers?: object, signal?: AbortSignal): Promise sardineGetClientToken(headers?: object, signal?: AbortSignal): Promise - sardineGetNFTCheckoutToken(args: SardineGetNFTCheckoutTokenArgs, headers?: object, signal?: AbortSignal): Promise - sardineGetNFTCheckoutOrderStatus(args: SardineGetNFTCheckoutOrderStatusArgs, headers?: object, signal?: AbortSignal): Promise + sardineGetNFTCheckoutToken( + args: SardineGetNFTCheckoutTokenArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + sardineGetNFTCheckoutOrderStatus( + args: SardineGetNFTCheckoutOrderStatusArgs, + headers?: object, + signal?: AbortSignal, + ): Promise sardineGetSupportedRegions(headers?: object, signal?: AbortSignal): Promise - sardineGetSupportedFiatCurrencies(headers?: object, signal?: AbortSignal): Promise + sardineGetSupportedFiatCurrencies( + headers?: object, + signal?: AbortSignal, + ): Promise sardineGetSupportedTokens(headers?: object, signal?: AbortSignal): Promise - sardineGetSupportedTokenForSwap(args: SardineGetSupportedTokenForSwapArgs, headers?: object, signal?: AbortSignal): Promise + sardineGetSupportedTokenForSwap( + args: SardineGetSupportedTokenForSwapArgs, + headers?: object, + signal?: AbortSignal, + ): Promise sardineGetEnabledTokens(headers?: object, signal?: AbortSignal): Promise sardineGetQuote(args: SardineGetQuoteArgs, headers?: object, signal?: AbortSignal): Promise /** @@ -1048,172 +1109,302 @@ export interface API { /** * Deprecated. Use SardineGetNFTCheckoutToken() instead. */ - getSardineNFTCheckoutToken(args: GetSardineNFTCheckoutTokenArgs, headers?: object, signal?: AbortSignal): Promise + getSardineNFTCheckoutToken( + args: GetSardineNFTCheckoutTokenArgs, + headers?: object, + signal?: AbortSignal, + ): Promise /** * Deprecated. Use SardineGetNFTCheckoutOrderStatus() instead. */ - getSardineNFTCheckoutOrderStatus(args: GetSardineNFTCheckoutOrderStatusArgs, headers?: object, signal?: AbortSignal): Promise + getSardineNFTCheckoutOrderStatus( + args: GetSardineNFTCheckoutOrderStatusArgs, + headers?: object, + signal?: AbortSignal, + ): Promise transakGetCountries(headers?: object, signal?: AbortSignal): Promise transakGetCryptoCurrencies(headers?: object, signal?: AbortSignal): Promise transakGetFiatCurrencies(headers?: object, signal?: AbortSignal): Promise transakGetPrice(args: TransakGetPriceArgs, headers?: object, signal?: AbortSignal): Promise - transakGetSupportedNFTCheckoutChains(headers?: object, signal?: AbortSignal): Promise + transakGetSupportedNFTCheckoutChains( + headers?: object, + signal?: AbortSignal, + ): Promise /** - * + * * Price Feed - * + * */ getCoinPrices(args: GetCoinPricesArgs, headers?: object, signal?: AbortSignal): Promise - getCollectiblePrices(args: GetCollectiblePricesArgs, headers?: object, signal?: AbortSignal): Promise + getCollectiblePrices( + args: GetCollectiblePricesArgs, + headers?: object, + signal?: AbortSignal, + ): Promise /** - * + * * Price Feed utils - * + * */ getExchangeRate(args: GetExchangeRateArgs, headers?: object, signal?: AbortSignal): Promise /** - * + * * Util / misc - * + * */ memoryStore(args: MemoryStoreArgs, headers?: object, signal?: AbortSignal): Promise memoryLoad(args: MemoryLoadArgs, headers?: object, signal?: AbortSignal): Promise /** - * + * * Legacy - * + * */ getInviteInfo(headers?: object, signal?: AbortSignal): Promise /** * NOTE: we're still using this from SW-API to Sequence-API to claim invite code */ - isValidAccessCode(args: IsValidAccessCodeArgs, headers?: object, signal?: AbortSignal): Promise - internalClaimAccessCode(args: InternalClaimAccessCodeArgs, headers?: object, signal?: AbortSignal): Promise + isValidAccessCode( + args: IsValidAccessCodeArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + internalClaimAccessCode( + args: InternalClaimAccessCodeArgs, + headers?: object, + signal?: AbortSignal, + ): Promise /** * Utils */ - blockNumberAtTime(args: BlockNumberAtTimeArgs, headers?: object, signal?: AbortSignal): Promise + blockNumberAtTime( + args: BlockNumberAtTimeArgs, + headers?: object, + signal?: AbortSignal, + ): Promise /** - * + * * Paper * TODO: deprecate in the future - * + * */ - paperSessionSecret(args: PaperSessionSecretArgs, headers?: object, signal?: AbortSignal): Promise - paperSessionSecret2(args: PaperSessionSecret2Args, headers?: object, signal?: AbortSignal): Promise + paperSessionSecret( + args: PaperSessionSecretArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + paperSessionSecret2( + args: PaperSessionSecret2Args, + headers?: object, + signal?: AbortSignal, + ): Promise /** - * + * * Linked wallets (v0 -- simple support) - * + * */ linkWallet(args: LinkWalletArgs, headers?: object, signal?: AbortSignal): Promise getLinkedWallets(args: GetLinkedWalletsArgs, headers?: object, signal?: AbortSignal): Promise - removeLinkedWallet(args: RemoveLinkedWalletArgs, headers?: object, signal?: AbortSignal): Promise + removeLinkedWallet( + args: RemoveLinkedWalletArgs, + headers?: object, + signal?: AbortSignal, + ): Promise /** * NOTE: these methods are deprecated, please do not use them. We may resurface them in the future, but just wanted * to be clear, they are not necessary for our linked wallets. */ - generateWaaSVerificationURL(args: GenerateWaaSVerificationURLArgs, headers?: object, signal?: AbortSignal): Promise - validateWaaSVerificationNonce(args: ValidateWaaSVerificationNonceArgs, headers?: object, signal?: AbortSignal): Promise + generateWaaSVerificationURL( + args: GenerateWaaSVerificationURLArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + validateWaaSVerificationNonce( + args: ValidateWaaSVerificationNonceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise /** - * - * + * + * * WaaS child wallet adoption - * + * */ - listAdoptedWallets(args: ListAdoptedWalletsArgs, headers?: object, signal?: AbortSignal): Promise + listAdoptedWallets( + args: ListAdoptedWalletsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise getLifiChains(headers?: object, signal?: AbortSignal): Promise getLifiTokens(args: GetLifiTokensArgs, headers?: object, signal?: AbortSignal): Promise /** * All parameters except `params` are deprecated. * Use only the `params` object to pass values. */ - getLifiSwapRoutes(args: GetLifiSwapRoutesArgs, headers?: object, signal?: AbortSignal): Promise + getLifiSwapRoutes( + args: GetLifiSwapRoutesArgs, + headers?: object, + signal?: AbortSignal, + ): Promise getLifiSwapQuote(args: GetLifiSwapQuoteArgs, headers?: object, signal?: AbortSignal): Promise /** - * + * * Chain abstraction - * + * */ - getIntentCallsPayloads(args: GetIntentCallsPayloadsArgs, headers?: object, signal?: AbortSignal): Promise - commitIntentConfig(args: CommitIntentConfigArgs, headers?: object, signal?: AbortSignal): Promise + getIntentCallsPayloads( + args: GetIntentCallsPayloadsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + commitIntentConfig( + args: CommitIntentConfigArgs, + headers?: object, + signal?: AbortSignal, + ): Promise getIntentConfig(args: GetIntentConfigArgs, headers?: object, signal?: AbortSignal): Promise /** - * + * * Inventory, payments and management - * + * */ listCurrencyGroups(headers?: object, signal?: AbortSignal): Promise - addOffchainInventory(args: AddOffchainInventoryArgs, headers?: object, signal?: AbortSignal): Promise - getOffchainInventory(args: GetOffchainInventoryArgs, headers?: object, signal?: AbortSignal): Promise - listOffchainInventories(args: ListOffchainInventoriesArgs, headers?: object, signal?: AbortSignal): Promise - updateOffchainInventory(args: UpdateOffchainInventoryArgs, headers?: object, signal?: AbortSignal): Promise - deleteOffchainInventory(args: DeleteOffchainInventoryArgs, headers?: object, signal?: AbortSignal): Promise - requestOffchainPayment(args: RequestOffchainPaymentArgs, headers?: object, signal?: AbortSignal): Promise - listOffchainPayments(args: ListOffchainPaymentsArgs, headers?: object, signal?: AbortSignal): Promise + addOffchainInventory( + args: AddOffchainInventoryArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + getOffchainInventory( + args: GetOffchainInventoryArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + listOffchainInventories( + args: ListOffchainInventoriesArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + updateOffchainInventory( + args: UpdateOffchainInventoryArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + deleteOffchainInventory( + args: DeleteOffchainInventoryArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + requestOffchainPayment( + args: RequestOffchainPaymentArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + listOffchainPayments( + args: ListOffchainPaymentsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise /** - * + * * Packs - * + * */ savePack(args: SavePackArgs, headers?: object, signal?: AbortSignal): Promise getPack(args: GetPackArgs, headers?: object, signal?: AbortSignal): Promise getPackIds(args: GetPackIdsArgs, headers?: object, signal?: AbortSignal): Promise deletePack(args: DeletePackArgs, headers?: object, signal?: AbortSignal): Promise - updatePackContent(args: UpdatePackContentArgs, headers?: object, signal?: AbortSignal): Promise + updatePackContent( + args: UpdatePackContentArgs, + headers?: object, + signal?: AbortSignal, + ): Promise getRevealTxData(args: GetRevealTxDataArgs, headers?: object, signal?: AbortSignal): Promise - checkoutOptionsPrimary(args: CheckoutOptionsPrimaryArgs, headers?: object, signal?: AbortSignal): Promise - checkoutOptionsSecondary(args: CheckoutOptionsSecondaryArgs, headers?: object, signal?: AbortSignal): Promise - checkoutOptionsGetTransakContractID(args: CheckoutOptionsGetTransakContractIDArgs, headers?: object, signal?: AbortSignal): Promise - fortePayCreateIntent(args: FortePayCreateIntentArgs, headers?: object, signal?: AbortSignal): Promise - fortePayGetPaymentStatuses(args: FortePayGetPaymentStatusesArgs, headers?: object, signal?: AbortSignal): Promise + checkoutOptionsPrimary( + args: CheckoutOptionsPrimaryArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + checkoutOptionsSecondary( + args: CheckoutOptionsSecondaryArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + checkoutOptionsGetTransakContractID( + args: CheckoutOptionsGetTransakContractIDArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + fortePayCreateIntent( + args: FortePayCreateIntentArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + fortePayGetPaymentStatuses( + args: FortePayGetPaymentStatusesArgs, + headers?: object, + signal?: AbortSignal, + ): Promise /** - * + * * CCTP - * + * */ getCCTPTransfer(args: GetCCTPTransferArgs, headers?: object, signal?: AbortSignal): Promise - queueCCTPTransfer(args: QueueCCTPTransferArgs, headers?: object, signal?: AbortSignal): Promise + queueCCTPTransfer( + args: QueueCCTPTransferArgs, + headers?: object, + signal?: AbortSignal, + ): Promise /** - * + * * Intent Machine Worker - * + * */ - queueIntentConfigExecution(args: QueueIntentConfigExecutionArgs, headers?: object, signal?: AbortSignal): Promise - getIntentConfigExecutionStatus(args: GetIntentConfigExecutionStatusArgs, headers?: object, signal?: AbortSignal): Promise - listIntentConfigs(args: ListIntentConfigsArgs, headers?: object, signal?: AbortSignal): Promise - queueMetaTxnReceipt(args: QueueMetaTxnReceiptArgs, headers?: object, signal?: AbortSignal): Promise -} - -export interface PingArgs { -} + queueIntentConfigExecution( + args: QueueIntentConfigExecutionArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + getIntentConfigExecutionStatus( + args: GetIntentConfigExecutionStatusArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + listIntentConfigs( + args: ListIntentConfigsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + queueMetaTxnReceipt( + args: QueueMetaTxnReceiptArgs, + headers?: object, + signal?: AbortSignal, + ): Promise +} + +export interface PingArgs {} export interface PingReturn { - status: boolean -} -export interface VersionArgs { + status: boolean } +export interface VersionArgs {} export interface VersionReturn { - version: Version -} -export interface RuntimeStatusArgs { + version: Version } +export interface RuntimeStatusArgs {} export interface RuntimeStatusReturn { - status: RuntimeStatus -} -export interface ClockArgs { + status: RuntimeStatus } +export interface ClockArgs {} export interface ClockReturn { - serverTime: string -} -export interface GetSequenceContextArgs { + serverTime: string } +export interface GetSequenceContextArgs {} export interface GetSequenceContextReturn { - data: SequenceContext + data: SequenceContext } export interface GetAuthTokenArgs { ewtString: string @@ -1224,7 +1415,7 @@ export interface GetAuthTokenReturn { status: boolean jwtToken: string address: string - user?: User + user?: User } export interface GetAuthToken2Args { ewtString: string @@ -1235,7 +1426,7 @@ export interface GetAuthToken2Return { status: boolean jwtToken: string address: string - user?: User + user?: User } export interface SendPasswordlessLinkArgs { email: string @@ -1244,21 +1435,21 @@ export interface SendPasswordlessLinkArgs { } export interface SendPasswordlessLinkReturn { - status: boolean + status: boolean } export interface RegisterPublicKeyArgs { publicKey: PublicKey } export interface RegisterPublicKeyReturn { - status: boolean + status: boolean } export interface GetPublicKeyArgs { id: string } export interface GetPublicKeyReturn { - publicKey: PublicKey + publicKey: PublicKey } export interface FriendListArgs { nickname?: string @@ -1267,7 +1458,7 @@ export interface FriendListArgs { export interface FriendListReturn { page: Page - friends: Array + friends: Array } export interface GetFriendByAddressArgs { friendAddress: string @@ -1275,7 +1466,7 @@ export interface GetFriendByAddressArgs { export interface GetFriendByAddressReturn { status: boolean - friend: Friend + friend: Friend } export interface SearchFriendsArgs { filterUsername: string @@ -1283,7 +1474,7 @@ export interface SearchFriendsArgs { } export interface SearchFriendsReturn { - friends: Array + friends: Array } export interface AddFriendArgs { friendAddress: string @@ -1292,7 +1483,7 @@ export interface AddFriendArgs { export interface AddFriendReturn { status: boolean - friend?: Friend + friend?: Friend } export interface UpdateFriendNicknameArgs { friendAddress: string @@ -1301,14 +1492,14 @@ export interface UpdateFriendNicknameArgs { export interface UpdateFriendNicknameReturn { status: boolean - friend?: Friend + friend?: Friend } export interface RemoveFriendArgs { friendAddress: string } export interface RemoveFriendReturn { - status: boolean + status: boolean } export interface ContractCallArgs { chainID: string @@ -1319,28 +1510,28 @@ export interface ContractCallArgs { } export interface ContractCallReturn { - returns: Array + returns: Array } export interface DecodeContractCallArgs { callData: string } export interface DecodeContractCallReturn { - call: ContractCall + call: ContractCall } export interface LookupContractCallSelectorsArgs { selectors: Array } export interface LookupContractCallSelectorsReturn { - signatures: Array> + signatures: Array> } export interface UserStorageFetchArgs { key: string } export interface UserStorageFetchReturn { - object: any + object: any } export interface UserStorageSaveArgs { key: string @@ -1348,28 +1539,28 @@ export interface UserStorageSaveArgs { } export interface UserStorageSaveReturn { - ok: boolean + ok: boolean } export interface UserStorageDeleteArgs { key: string } export interface UserStorageDeleteReturn { - ok: boolean + ok: boolean } export interface UserStorageFetchAllArgs { keys?: Array } export interface UserStorageFetchAllReturn { - objects: {[key: string]: any} + objects: { [key: string]: any } } export interface GetMoonpayLinkArgs { url: string } export interface GetMoonpayLinkReturn { - signedUrl: string + signedUrl: string } export interface ResolveENSAddressArgs { ens: string @@ -1377,7 +1568,7 @@ export interface ResolveENSAddressArgs { export interface ResolveENSAddressReturn { address: string - ok: boolean + ok: boolean } export interface IsValidSignatureArgs { chainId: string @@ -1387,7 +1578,7 @@ export interface IsValidSignatureArgs { } export interface IsValidSignatureReturn { - isValid: boolean + isValid: boolean } export interface IsValidMessageSignatureArgs { chainId: string @@ -1397,7 +1588,7 @@ export interface IsValidMessageSignatureArgs { } export interface IsValidMessageSignatureReturn { - isValid: boolean + isValid: boolean } export interface IsValidTypedDataSignatureArgs { chainId: string @@ -1407,7 +1598,7 @@ export interface IsValidTypedDataSignatureArgs { } export interface IsValidTypedDataSignatureReturn { - isValid: boolean + isValid: boolean } export interface IsValidETHAuthProofArgs { chainId: string @@ -1416,52 +1607,48 @@ export interface IsValidETHAuthProofArgs { } export interface IsValidETHAuthProofReturn { - isValid: boolean + isValid: boolean } export interface GetOnRampURLArgs { chainId: string } export interface GetOnRampURLReturn { - url: string -} -export interface SardineGetClientTokenArgs { + url: string } +export interface SardineGetClientTokenArgs {} export interface SardineGetClientTokenReturn { - token: string + token: string } export interface SardineGetNFTCheckoutTokenArgs { params: SardineNFTCheckoutParams } export interface SardineGetNFTCheckoutTokenReturn { - resp: SardineNFTCheckout + resp: SardineNFTCheckout } export interface SardineGetNFTCheckoutOrderStatusArgs { orderId: string } export interface SardineGetNFTCheckoutOrderStatusReturn { - resp: SardineOrder -} -export interface SardineGetSupportedRegionsArgs { + resp: SardineOrder } +export interface SardineGetSupportedRegionsArgs {} export interface SardineGetSupportedRegionsReturn { - regions: Array -} -export interface SardineGetSupportedFiatCurrenciesArgs { + regions: Array } +export interface SardineGetSupportedFiatCurrenciesArgs {} export interface SardineGetSupportedFiatCurrenciesReturn { - tokens: Array -} -export interface SardineGetSupportedTokensArgs { + tokens: Array } +export interface SardineGetSupportedTokensArgs {} export interface SardineGetSupportedTokensReturn { - tokens: Array + tokens: Array } export interface SardineGetSupportedTokenForSwapArgs { network: string @@ -1469,92 +1656,86 @@ export interface SardineGetSupportedTokenForSwapArgs { } export interface SardineGetSupportedTokenForSwapReturn { - token: SardineSupportedTokenForSwap -} -export interface SardineGetEnabledTokensArgs { + token: SardineSupportedTokenForSwap } +export interface SardineGetEnabledTokensArgs {} export interface SardineGetEnabledTokensReturn { - tokens: Array + tokens: Array } export interface SardineGetQuoteArgs { params: SardineGetQuoteParams } export interface SardineGetQuoteReturn { - quote: SardineQuote -} -export interface GetSardineClientTokenArgs { + quote: SardineQuote } +export interface GetSardineClientTokenArgs {} export interface GetSardineClientTokenReturn { - token: string + token: string } export interface GetSardineNFTCheckoutTokenArgs { params: SardineNFTCheckoutParams } export interface GetSardineNFTCheckoutTokenReturn { - resp: SardineNFTCheckout + resp: SardineNFTCheckout } export interface GetSardineNFTCheckoutOrderStatusArgs { orderId: string } export interface GetSardineNFTCheckoutOrderStatusReturn { - resp: SardineOrder -} -export interface TransakGetCountriesArgs { + resp: SardineOrder } +export interface TransakGetCountriesArgs {} export interface TransakGetCountriesReturn { - regions: Array -} -export interface TransakGetCryptoCurrenciesArgs { + regions: Array } +export interface TransakGetCryptoCurrenciesArgs {} export interface TransakGetCryptoCurrenciesReturn { - currencies: Array -} -export interface TransakGetFiatCurrenciesArgs { + currencies: Array } +export interface TransakGetFiatCurrenciesArgs {} export interface TransakGetFiatCurrenciesReturn { - currencies: Array + currencies: Array } export interface TransakGetPriceArgs { params: TransakGetPriceParams } export interface TransakGetPriceReturn { - price: TransakPrice -} -export interface TransakGetSupportedNFTCheckoutChainsArgs { + price: TransakPrice } +export interface TransakGetSupportedNFTCheckoutChainsArgs {} export interface TransakGetSupportedNFTCheckoutChainsReturn { - chains: Array + chains: Array } export interface GetCoinPricesArgs { tokens: Array } export interface GetCoinPricesReturn { - tokenPrices: Array + tokenPrices: Array } export interface GetCollectiblePricesArgs { tokens: Array } export interface GetCollectiblePricesReturn { - tokenPrices: Array + tokenPrices: Array } export interface GetExchangeRateArgs { toCurrency: string } export interface GetExchangeRateReturn { - exchangeRate: ExchangeRate + exchangeRate: ExchangeRate } export interface MemoryStoreArgs { key: string @@ -1562,27 +1743,26 @@ export interface MemoryStoreArgs { } export interface MemoryStoreReturn { - ok: boolean + ok: boolean } export interface MemoryLoadArgs { key: string } export interface MemoryLoadReturn { - value: string -} -export interface GetInviteInfoArgs { + value: string } +export interface GetInviteInfoArgs {} export interface GetInviteInfoReturn { - inviteInfo: InviteInfo + inviteInfo: InviteInfo } export interface IsValidAccessCodeArgs { accessCode: string } export interface IsValidAccessCodeReturn { - status: boolean + status: boolean } export interface InternalClaimAccessCodeArgs { address: string @@ -1590,7 +1770,7 @@ export interface InternalClaimAccessCodeArgs { } export interface InternalClaimAccessCodeReturn { - status: boolean + status: boolean } export interface BlockNumberAtTimeArgs { chainId: number @@ -1598,7 +1778,7 @@ export interface BlockNumberAtTimeArgs { } export interface BlockNumberAtTimeReturn { - blocks: Array + blocks: Array } export interface PaperSessionSecretArgs { chainName: string @@ -1608,7 +1788,7 @@ export interface PaperSessionSecretArgs { } export interface PaperSessionSecretReturn { - secret: string + secret: string } export interface PaperSessionSecret2Args { chainName: string @@ -1618,7 +1798,7 @@ export interface PaperSessionSecret2Args { } export interface PaperSessionSecret2Return { - secret: string + secret: string } export interface LinkWalletArgs { parentWalletAddress: string @@ -1632,7 +1812,7 @@ export interface LinkWalletArgs { } export interface LinkWalletReturn { - status: boolean + status: boolean } export interface GetLinkedWalletsArgs { parentWalletAddress: string @@ -1642,7 +1822,7 @@ export interface GetLinkedWalletsArgs { } export interface GetLinkedWalletsReturn { - linkedWallets: Array + linkedWallets: Array } export interface RemoveLinkedWalletArgs { parentWalletAddress: string @@ -1653,7 +1833,7 @@ export interface RemoveLinkedWalletArgs { } export interface RemoveLinkedWalletReturn { - status: boolean + status: boolean } export interface GenerateWaaSVerificationURLArgs { walletAddress: string @@ -1661,7 +1841,7 @@ export interface GenerateWaaSVerificationURLArgs { export interface GenerateWaaSVerificationURLReturn { nonce: string - verificationURL: string + verificationURL: string } export interface ValidateWaaSVerificationNonceArgs { nonce: string @@ -1671,7 +1851,7 @@ export interface ValidateWaaSVerificationNonceArgs { } export interface ValidateWaaSVerificationNonceReturn { - walletAddress: string + walletAddress: string } export interface ListAdoptedWalletsArgs { page?: Page @@ -1679,20 +1859,19 @@ export interface ListAdoptedWalletsArgs { export interface ListAdoptedWalletsReturn { page: Page - wallets: Array -} -export interface GetLifiChainsArgs { + wallets: Array } +export interface GetLifiChainsArgs {} export interface GetLifiChainsReturn { - chains: Array + chains: Array } export interface GetLifiTokensArgs { chainIds: Array } export interface GetLifiTokensReturn { - tokens: Array + tokens: Array } export interface GetLifiSwapRoutesArgs { params: GetLifiSwapRouteParams @@ -1703,14 +1882,14 @@ export interface GetLifiSwapRoutesArgs { } export interface GetLifiSwapRoutesReturn { - routes: Array + routes: Array } export interface GetLifiSwapQuoteArgs { params: GetLifiSwapQuoteParams } export interface GetLifiSwapQuoteReturn { - quote: LifiSwapQuote + quote: LifiSwapQuote } export interface GetIntentCallsPayloadsArgs { userAddress: string @@ -1737,9 +1916,9 @@ export interface GetIntentCallsPayloadsReturn { metaTxns: Array trailsFee: TrailsFee quote: IntentQuote - feeQuotes: {[key: string]: string} + feeQuotes: { [key: string]: string } originIntentAddress: string - destinationIntentAddress: string + destinationIntentAddress: string } export interface CommitIntentConfigArgs { originIntentAddress: string @@ -1751,54 +1930,52 @@ export interface CommitIntentConfigArgs { } export interface CommitIntentConfigReturn { - config: IntentConfig + config: IntentConfig } export interface GetIntentConfigArgs { intentAddress: string } export interface GetIntentConfigReturn { - config: IntentConfig -} -export interface ListCurrencyGroupsArgs { + config: IntentConfig } +export interface ListCurrencyGroupsArgs {} export interface ListCurrencyGroupsReturn { - currencyGroups: Array + currencyGroups: Array } export interface AddOffchainInventoryArgs { inventory: OffchainInventory } export interface AddOffchainInventoryReturn { - inventoryId: number + inventoryId: number } export interface GetOffchainInventoryArgs { inventoryId: number } export interface GetOffchainInventoryReturn { - inventory: OffchainInventory + inventory: OffchainInventory } export interface ListOffchainInventoriesArgs { projectId: number } export interface ListOffchainInventoriesReturn { - inventory: Array + inventory: Array } export interface UpdateOffchainInventoryArgs { inventory: OffchainInventory } -export interface UpdateOffchainInventoryReturn { -} +export interface UpdateOffchainInventoryReturn {} export interface DeleteOffchainInventoryArgs { inventoryId: number } export interface DeleteOffchainInventoryReturn { - ok: boolean + ok: boolean } export interface RequestOffchainPaymentArgs { inventoryId: number @@ -1808,7 +1985,7 @@ export interface RequestOffchainPaymentArgs { } export interface RequestOffchainPaymentReturn { - payment: PaymentResponse + payment: PaymentResponse } export interface ListOffchainPaymentsArgs { inventoryId: number @@ -1817,14 +1994,14 @@ export interface ListOffchainPaymentsArgs { export interface ListOffchainPaymentsReturn { page: Page - payments: Array + payments: Array } export interface SavePackArgs { pack: Pack } export interface SavePackReturn { - merkleRoot: string + merkleRoot: string } export interface GetPackArgs { contractAddress: string @@ -1833,7 +2010,7 @@ export interface GetPackArgs { } export interface GetPackReturn { - pack: Pack + pack: Pack } export interface GetPackIdsArgs { contractAddress: string @@ -1841,7 +2018,7 @@ export interface GetPackIdsArgs { } export interface GetPackIdsReturn { - packIds: Array + packIds: Array } export interface DeletePackArgs { contractAddress: string @@ -1850,14 +2027,14 @@ export interface DeletePackArgs { } export interface DeletePackReturn { - status: boolean + status: boolean } export interface UpdatePackContentArgs { pack: Pack } export interface UpdatePackContentReturn { - merkleRoot: string + merkleRoot: string } export interface GetRevealTxDataArgs { contractAddress: string @@ -1867,7 +2044,7 @@ export interface GetRevealTxDataArgs { } export interface GetRevealTxDataReturn { - txData: string + txData: string } export interface CheckoutOptionsPrimaryArgs { chainId: number @@ -1878,7 +2055,7 @@ export interface CheckoutOptionsPrimaryArgs { } export interface CheckoutOptionsPrimaryReturn { - options: CheckoutOptions + options: CheckoutOptions } export interface CheckoutOptionsSecondaryArgs { chainId: number @@ -1887,7 +2064,7 @@ export interface CheckoutOptionsSecondaryArgs { } export interface CheckoutOptionsSecondaryReturn { - options: CheckoutOptions + options: CheckoutOptions } export interface CheckoutOptionsGetTransakContractIDArgs { chainId: number @@ -1895,28 +2072,28 @@ export interface CheckoutOptionsGetTransakContractIDArgs { } export interface CheckoutOptionsGetTransakContractIDReturn { - contractId: string + contractId: string } export interface FortePayCreateIntentArgs { intent: FortePayCreateIntent } export interface FortePayCreateIntentReturn { - resp: FortePayIntent + resp: FortePayIntent } export interface FortePayGetPaymentStatusesArgs { paymentIntentIds: Array } export interface FortePayGetPaymentStatusesReturn { - statuses: Array + statuses: Array } export interface GetCCTPTransferArgs { id: string } export interface GetCCTPTransferReturn { - transfer: CCTPTransfer + transfer: CCTPTransfer } export interface QueueCCTPTransferArgs { sourceTxHash?: string @@ -1926,21 +2103,21 @@ export interface QueueCCTPTransferArgs { } export interface QueueCCTPTransferReturn { - transfer: CCTPTransfer + transfer: CCTPTransfer } export interface QueueIntentConfigExecutionArgs { intentConfigId: number } export interface QueueIntentConfigExecutionReturn { - status: boolean + status: boolean } export interface GetIntentConfigExecutionStatusArgs { intentConfigId: number } export interface GetIntentConfigExecutionStatusReturn { - executionStatus: string + executionStatus: string } export interface ListIntentConfigsArgs { page?: Page @@ -1949,18 +2126,16 @@ export interface ListIntentConfigsArgs { export interface ListIntentConfigsReturn { page: Page - intentConfigs: Array + intentConfigs: Array } export interface QueueMetaTxnReceiptArgs { metaTxID: string } export interface QueueMetaTxnReceiptReturn { - status: boolean + status: boolean } - - // // Client // @@ -1977,1420 +2152,1743 @@ export class API implements API { private url(name: string): string { return this.hostname + this.path + name } - + ping = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('Ping'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('Ping'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + version = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('Version'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - version: (_data.version), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('Version'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + version: _data.version, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + runtimeStatus = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('RuntimeStatus'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('RuntimeStatus'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + clock = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('Clock'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - serverTime: (_data.serverTime), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('Clock'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + serverTime: _data.serverTime, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + getSequenceContext = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetSequenceContext'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - data: (_data.data), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('GetSequenceContext'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + data: _data.data, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + getAuthToken = (args: GetAuthTokenArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetAuthToken'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - jwtToken: (_data.jwtToken), - address: (_data.address), - user: (_data.user), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('GetAuthToken'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + jwtToken: _data.jwtToken, + address: _data.address, + user: _data.user, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + getAuthToken2 = (args: GetAuthToken2Args, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetAuthToken2'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - jwtToken: (_data.jwtToken), - address: (_data.address), - user: (_data.user), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - sendPasswordlessLink = (args: SendPasswordlessLinkArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('SendPasswordlessLink'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - registerPublicKey = (args: RegisterPublicKeyArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('RegisterPublicKey'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('GetAuthToken2'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + jwtToken: _data.jwtToken, + address: _data.address, + user: _data.user, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + sendPasswordlessLink = ( + args: SendPasswordlessLinkArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('SendPasswordlessLink'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + registerPublicKey = ( + args: RegisterPublicKeyArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('RegisterPublicKey'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + getPublicKey = (args: GetPublicKeyArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetPublicKey'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - publicKey: (_data.publicKey), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('GetPublicKey'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + publicKey: _data.publicKey, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + friendList = (args: FriendListArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('FriendList'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - page: (_data.page), - friends: >(_data.friends), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getFriendByAddress = (args: GetFriendByAddressArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetFriendByAddress'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - friend: (_data.friend), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('FriendList'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + page: _data.page, + friends: >_data.friends, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getFriendByAddress = ( + args: GetFriendByAddressArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetFriendByAddress'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + friend: _data.friend, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + searchFriends = (args: SearchFriendsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('SearchFriends'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - friends: >(_data.friends), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('SearchFriends'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + friends: >_data.friends, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + addFriend = (args: AddFriendArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('AddFriend'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - friend: (_data.friend), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - updateFriendNickname = (args: UpdateFriendNicknameArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('UpdateFriendNickname'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - friend: (_data.friend), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('AddFriend'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + friend: _data.friend, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + updateFriendNickname = ( + args: UpdateFriendNicknameArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('UpdateFriendNickname'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + friend: _data.friend, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + removeFriend = (args: RemoveFriendArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('RemoveFriend'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('RemoveFriend'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + contractCall = (args: ContractCallArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('ContractCall'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - returns: >(_data.returns), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - decodeContractCall = (args: DecodeContractCallArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('DecodeContractCall'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - call: (_data.call), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - lookupContractCallSelectors = (args: LookupContractCallSelectorsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('LookupContractCallSelectors'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - signatures: >>(_data.signatures), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - userStorageFetch = (args: UserStorageFetchArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('UserStorageFetch'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - object: (_data.object), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - userStorageSave = (args: UserStorageSaveArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('UserStorageSave'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - ok: (_data.ok), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - userStorageDelete = (args: UserStorageDeleteArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('UserStorageDelete'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - ok: (_data.ok), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - userStorageFetchAll = (args: UserStorageFetchAllArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('UserStorageFetchAll'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - objects: <{[key: string]: any}>(_data.objects), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getMoonpayLink = (args: GetMoonpayLinkArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetMoonpayLink'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - signedUrl: (_data.signedUrl), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - resolveENSAddress = (args: ResolveENSAddressArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('ResolveENSAddress'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - address: (_data.address), - ok: (_data.ok), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - isValidSignature = (args: IsValidSignatureArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('IsValidSignature'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - isValid: (_data.isValid), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - isValidMessageSignature = (args: IsValidMessageSignatureArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('IsValidMessageSignature'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - isValid: (_data.isValid), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - isValidTypedDataSignature = (args: IsValidTypedDataSignatureArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('IsValidTypedDataSignature'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - isValid: (_data.isValid), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - isValidETHAuthProof = (args: IsValidETHAuthProofArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('IsValidETHAuthProof'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - isValid: (_data.isValid), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('ContractCall'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + returns: >_data.returns, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + decodeContractCall = ( + args: DecodeContractCallArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('DecodeContractCall'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + call: _data.call, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + lookupContractCallSelectors = ( + args: LookupContractCallSelectorsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('LookupContractCallSelectors'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + signatures: >>_data.signatures, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + userStorageFetch = ( + args: UserStorageFetchArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('UserStorageFetch'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + object: _data.object, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + userStorageSave = ( + args: UserStorageSaveArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('UserStorageSave'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + ok: _data.ok, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + userStorageDelete = ( + args: UserStorageDeleteArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('UserStorageDelete'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + ok: _data.ok, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + userStorageFetchAll = ( + args: UserStorageFetchAllArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('UserStorageFetchAll'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + objects: <{ [key: string]: any }>_data.objects, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getMoonpayLink = ( + args: GetMoonpayLinkArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetMoonpayLink'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + signedUrl: _data.signedUrl, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + resolveENSAddress = ( + args: ResolveENSAddressArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('ResolveENSAddress'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + address: _data.address, + ok: _data.ok, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + isValidSignature = ( + args: IsValidSignatureArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('IsValidSignature'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + isValid: _data.isValid, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + isValidMessageSignature = ( + args: IsValidMessageSignatureArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('IsValidMessageSignature'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + isValid: _data.isValid, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + isValidTypedDataSignature = ( + args: IsValidTypedDataSignatureArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('IsValidTypedDataSignature'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + isValid: _data.isValid, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + isValidETHAuthProof = ( + args: IsValidETHAuthProofArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('IsValidETHAuthProof'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + isValid: _data.isValid, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + getOnRampURL = (args: GetOnRampURLArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetOnRampURL'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - url: (_data.url), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('GetOnRampURL'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + url: _data.url, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + sardineGetClientToken = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('SardineGetClientToken'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - token: (_data.token), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - sardineGetNFTCheckoutToken = (args: SardineGetNFTCheckoutTokenArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('SardineGetNFTCheckoutToken'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - resp: (_data.resp), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - sardineGetNFTCheckoutOrderStatus = (args: SardineGetNFTCheckoutOrderStatusArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('SardineGetNFTCheckoutOrderStatus'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - resp: (_data.resp), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('SardineGetClientToken'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + token: _data.token, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + sardineGetNFTCheckoutToken = ( + args: SardineGetNFTCheckoutTokenArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('SardineGetNFTCheckoutToken'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + resp: _data.resp, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + sardineGetNFTCheckoutOrderStatus = ( + args: SardineGetNFTCheckoutOrderStatusArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('SardineGetNFTCheckoutOrderStatus'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + resp: _data.resp, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + sardineGetSupportedRegions = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('SardineGetSupportedRegions'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - regions: >(_data.regions), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - sardineGetSupportedFiatCurrencies = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('SardineGetSupportedFiatCurrencies'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - tokens: >(_data.tokens), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('SardineGetSupportedRegions'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + regions: >_data.regions, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + sardineGetSupportedFiatCurrencies = ( + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('SardineGetSupportedFiatCurrencies'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + tokens: >_data.tokens, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + sardineGetSupportedTokens = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('SardineGetSupportedTokens'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - tokens: >(_data.tokens), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - sardineGetSupportedTokenForSwap = (args: SardineGetSupportedTokenForSwapArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('SardineGetSupportedTokenForSwap'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - token: (_data.token), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('SardineGetSupportedTokens'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + tokens: >_data.tokens, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + sardineGetSupportedTokenForSwap = ( + args: SardineGetSupportedTokenForSwapArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('SardineGetSupportedTokenForSwap'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + token: _data.token, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + sardineGetEnabledTokens = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('SardineGetEnabledTokens'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - tokens: >(_data.tokens), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - sardineGetQuote = (args: SardineGetQuoteArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('SardineGetQuote'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - quote: (_data.quote), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('SardineGetEnabledTokens'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + tokens: >_data.tokens, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + sardineGetQuote = ( + args: SardineGetQuoteArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('SardineGetQuote'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + quote: _data.quote, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + getSardineClientToken = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetSardineClientToken'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - token: (_data.token), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getSardineNFTCheckoutToken = (args: GetSardineNFTCheckoutTokenArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetSardineNFTCheckoutToken'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - resp: (_data.resp), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getSardineNFTCheckoutOrderStatus = (args: GetSardineNFTCheckoutOrderStatusArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetSardineNFTCheckoutOrderStatus'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - resp: (_data.resp), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('GetSardineClientToken'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + token: _data.token, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getSardineNFTCheckoutToken = ( + args: GetSardineNFTCheckoutTokenArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetSardineNFTCheckoutToken'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + resp: _data.resp, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getSardineNFTCheckoutOrderStatus = ( + args: GetSardineNFTCheckoutOrderStatusArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetSardineNFTCheckoutOrderStatus'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + resp: _data.resp, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + transakGetCountries = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('TransakGetCountries'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - regions: >(_data.regions), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('TransakGetCountries'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + regions: >_data.regions, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + transakGetCryptoCurrencies = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('TransakGetCryptoCurrencies'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - currencies: >(_data.currencies), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('TransakGetCryptoCurrencies'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + currencies: >_data.currencies, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + transakGetFiatCurrencies = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('TransakGetFiatCurrencies'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - currencies: >(_data.currencies), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - transakGetPrice = (args: TransakGetPriceArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('TransakGetPrice'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - price: (_data.price), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - transakGetSupportedNFTCheckoutChains = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('TransakGetSupportedNFTCheckoutChains'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - chains: >(_data.chains), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('TransakGetFiatCurrencies'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + currencies: >_data.currencies, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + transakGetPrice = ( + args: TransakGetPriceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('TransakGetPrice'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + price: _data.price, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + transakGetSupportedNFTCheckoutChains = ( + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('TransakGetSupportedNFTCheckoutChains'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + chains: >_data.chains, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + getCoinPrices = (args: GetCoinPricesArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetCoinPrices'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - tokenPrices: >(_data.tokenPrices), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getCollectiblePrices = (args: GetCollectiblePricesArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetCollectiblePrices'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - tokenPrices: >(_data.tokenPrices), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getExchangeRate = (args: GetExchangeRateArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetExchangeRate'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - exchangeRate: (_data.exchangeRate), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('GetCoinPrices'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + tokenPrices: >_data.tokenPrices, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getCollectiblePrices = ( + args: GetCollectiblePricesArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetCollectiblePrices'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + tokenPrices: >_data.tokenPrices, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getExchangeRate = ( + args: GetExchangeRateArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetExchangeRate'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + exchangeRate: _data.exchangeRate, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + memoryStore = (args: MemoryStoreArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('MemoryStore'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - ok: (_data.ok), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('MemoryStore'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + ok: _data.ok, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + memoryLoad = (args: MemoryLoadArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('MemoryLoad'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - value: (_data.value), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('MemoryLoad'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + value: _data.value, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + getInviteInfo = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetInviteInfo'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - inviteInfo: (_data.inviteInfo), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - isValidAccessCode = (args: IsValidAccessCodeArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('IsValidAccessCode'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - internalClaimAccessCode = (args: InternalClaimAccessCodeArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('InternalClaimAccessCode'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - blockNumberAtTime = (args: BlockNumberAtTimeArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('BlockNumberAtTime'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - blocks: >(_data.blocks), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - paperSessionSecret = (args: PaperSessionSecretArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('PaperSessionSecret'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - secret: (_data.secret), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - paperSessionSecret2 = (args: PaperSessionSecret2Args, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('PaperSessionSecret2'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - secret: (_data.secret), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('GetInviteInfo'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + inviteInfo: _data.inviteInfo, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + isValidAccessCode = ( + args: IsValidAccessCodeArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('IsValidAccessCode'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + internalClaimAccessCode = ( + args: InternalClaimAccessCodeArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('InternalClaimAccessCode'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + blockNumberAtTime = ( + args: BlockNumberAtTimeArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('BlockNumberAtTime'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + blocks: >_data.blocks, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + paperSessionSecret = ( + args: PaperSessionSecretArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('PaperSessionSecret'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + secret: _data.secret, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + paperSessionSecret2 = ( + args: PaperSessionSecret2Args, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('PaperSessionSecret2'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + secret: _data.secret, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + linkWallet = (args: LinkWalletArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('LinkWallet'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getLinkedWallets = (args: GetLinkedWalletsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetLinkedWallets'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - linkedWallets: >(_data.linkedWallets), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - removeLinkedWallet = (args: RemoveLinkedWalletArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('RemoveLinkedWallet'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - generateWaaSVerificationURL = (args: GenerateWaaSVerificationURLArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GenerateWaaSVerificationURL'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - nonce: (_data.nonce), - verificationURL: (_data.verificationURL), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - validateWaaSVerificationNonce = (args: ValidateWaaSVerificationNonceArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('ValidateWaaSVerificationNonce'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - walletAddress: (_data.walletAddress), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - listAdoptedWallets = (args: ListAdoptedWalletsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('ListAdoptedWallets'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - page: (_data.page), - wallets: >(_data.wallets), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('LinkWallet'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getLinkedWallets = ( + args: GetLinkedWalletsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetLinkedWallets'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + linkedWallets: >_data.linkedWallets, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + removeLinkedWallet = ( + args: RemoveLinkedWalletArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('RemoveLinkedWallet'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + generateWaaSVerificationURL = ( + args: GenerateWaaSVerificationURLArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GenerateWaaSVerificationURL'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + nonce: _data.nonce, + verificationURL: _data.verificationURL, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + validateWaaSVerificationNonce = ( + args: ValidateWaaSVerificationNonceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('ValidateWaaSVerificationNonce'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + walletAddress: _data.walletAddress, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + listAdoptedWallets = ( + args: ListAdoptedWalletsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('ListAdoptedWallets'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + page: _data.page, + wallets: >_data.wallets, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + getLifiChains = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetLifiChains'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - chains: >(_data.chains), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('GetLifiChains'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + chains: >_data.chains, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + getLifiTokens = (args: GetLifiTokensArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetLifiTokens'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - tokens: >(_data.tokens), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getLifiSwapRoutes = (args: GetLifiSwapRoutesArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetLifiSwapRoutes'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - routes: >(_data.routes), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getLifiSwapQuote = (args: GetLifiSwapQuoteArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetLifiSwapQuote'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - quote: (_data.quote), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getIntentCallsPayloads = (args: GetIntentCallsPayloadsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetIntentCallsPayloads'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - calls: >(_data.calls), - preconditions: >(_data.preconditions), - metaTxns: >(_data.metaTxns), - trailsFee: (_data.trailsFee), - quote: (_data.quote), - feeQuotes: <{[key: string]: string}>(_data.feeQuotes), - originIntentAddress: (_data.originIntentAddress), - destinationIntentAddress: (_data.destinationIntentAddress), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - commitIntentConfig = (args: CommitIntentConfigArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('CommitIntentConfig'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - config: (_data.config), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getIntentConfig = (args: GetIntentConfigArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetIntentConfig'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - config: (_data.config), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('GetLifiTokens'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + tokens: >_data.tokens, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getLifiSwapRoutes = ( + args: GetLifiSwapRoutesArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetLifiSwapRoutes'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + routes: >_data.routes, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getLifiSwapQuote = ( + args: GetLifiSwapQuoteArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetLifiSwapQuote'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + quote: _data.quote, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getIntentCallsPayloads = ( + args: GetIntentCallsPayloadsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetIntentCallsPayloads'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + calls: >_data.calls, + preconditions: >_data.preconditions, + metaTxns: >_data.metaTxns, + trailsFee: _data.trailsFee, + quote: _data.quote, + feeQuotes: <{ [key: string]: string }>_data.feeQuotes, + originIntentAddress: _data.originIntentAddress, + destinationIntentAddress: _data.destinationIntentAddress, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + commitIntentConfig = ( + args: CommitIntentConfigArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('CommitIntentConfig'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + config: _data.config, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getIntentConfig = ( + args: GetIntentConfigArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetIntentConfig'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + config: _data.config, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + listCurrencyGroups = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('ListCurrencyGroups'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - currencyGroups: >(_data.currencyGroups), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - addOffchainInventory = (args: AddOffchainInventoryArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('AddOffchainInventory'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - inventoryId: (_data.inventoryId), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getOffchainInventory = (args: GetOffchainInventoryArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetOffchainInventory'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - inventory: (_data.inventory), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - listOffchainInventories = (args: ListOffchainInventoriesArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('ListOffchainInventories'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - inventory: >(_data.inventory), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - updateOffchainInventory = (args: UpdateOffchainInventoryArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('UpdateOffchainInventory'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return {} - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - deleteOffchainInventory = (args: DeleteOffchainInventoryArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('DeleteOffchainInventory'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - ok: (_data.ok), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - requestOffchainPayment = (args: RequestOffchainPaymentArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('RequestOffchainPayment'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - payment: (_data.payment), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - listOffchainPayments = (args: ListOffchainPaymentsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('ListOffchainPayments'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - page: (_data.page), - payments: >(_data.payments), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('ListCurrencyGroups'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + currencyGroups: >_data.currencyGroups, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + addOffchainInventory = ( + args: AddOffchainInventoryArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('AddOffchainInventory'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + inventoryId: _data.inventoryId, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getOffchainInventory = ( + args: GetOffchainInventoryArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetOffchainInventory'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + inventory: _data.inventory, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + listOffchainInventories = ( + args: ListOffchainInventoriesArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('ListOffchainInventories'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + inventory: >_data.inventory, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + updateOffchainInventory = ( + args: UpdateOffchainInventoryArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('UpdateOffchainInventory'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return {} + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + deleteOffchainInventory = ( + args: DeleteOffchainInventoryArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('DeleteOffchainInventory'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + ok: _data.ok, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + requestOffchainPayment = ( + args: RequestOffchainPaymentArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('RequestOffchainPayment'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + payment: _data.payment, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + listOffchainPayments = ( + args: ListOffchainPaymentsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('ListOffchainPayments'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + page: _data.page, + payments: >_data.payments, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + savePack = (args: SavePackArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('SavePack'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - merkleRoot: (_data.merkleRoot), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('SavePack'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + merkleRoot: _data.merkleRoot, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + getPack = (args: GetPackArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetPack'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - pack: (_data.pack), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('GetPack'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + pack: _data.pack, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + getPackIds = (args: GetPackIdsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetPackIds'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - packIds: >(_data.packIds), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - deletePack = (args: DeletePackArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('DeletePack'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - updatePackContent = (args: UpdatePackContentArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('UpdatePackContent'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - merkleRoot: (_data.merkleRoot), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getRevealTxData = (args: GetRevealTxDataArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetRevealTxData'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - txData: (_data.txData), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - checkoutOptionsPrimary = (args: CheckoutOptionsPrimaryArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('CheckoutOptionsPrimary'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - options: (_data.options), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - checkoutOptionsSecondary = (args: CheckoutOptionsSecondaryArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('CheckoutOptionsSecondary'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - options: (_data.options), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - checkoutOptionsGetTransakContractID = (args: CheckoutOptionsGetTransakContractIDArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('CheckoutOptionsGetTransakContractID'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - contractId: (_data.contractId), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - fortePayCreateIntent = (args: FortePayCreateIntentArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('FortePayCreateIntent'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - resp: (_data.resp), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - fortePayGetPaymentStatuses = (args: FortePayGetPaymentStatusesArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('FortePayGetPaymentStatuses'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - statuses: >(_data.statuses), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getCCTPTransfer = (args: GetCCTPTransferArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetCCTPTransfer'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - transfer: (_data.transfer), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - queueCCTPTransfer = (args: QueueCCTPTransferArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('QueueCCTPTransfer'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - transfer: (_data.transfer), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - queueIntentConfigExecution = (args: QueueIntentConfigExecutionArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('QueueIntentConfigExecution'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getIntentConfigExecutionStatus = (args: GetIntentConfigExecutionStatusArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetIntentConfigExecutionStatus'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - executionStatus: (_data.executionStatus), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - listIntentConfigs = (args: ListIntentConfigsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('ListIntentConfigs'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - page: (_data.page), - intentConfigs: >(_data.intentConfigs), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - queueMetaTxnReceipt = (args: QueueMetaTxnReceiptArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('QueueMetaTxnReceipt'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('GetPackIds'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + packIds: >_data.packIds, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - -} - const createHTTPRequest = (body: object = {}, headers: object = {}, signal: AbortSignal | null = null): object => { - const reqHeaders: {[key: string]: string} = { ...headers, 'Content-Type': 'application/json' } + deletePack = (args: DeletePackArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('DeletePack'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + updatePackContent = ( + args: UpdatePackContentArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('UpdatePackContent'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + merkleRoot: _data.merkleRoot, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getRevealTxData = ( + args: GetRevealTxDataArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetRevealTxData'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + txData: _data.txData, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + checkoutOptionsPrimary = ( + args: CheckoutOptionsPrimaryArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('CheckoutOptionsPrimary'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + options: _data.options, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + checkoutOptionsSecondary = ( + args: CheckoutOptionsSecondaryArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('CheckoutOptionsSecondary'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + options: _data.options, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + checkoutOptionsGetTransakContractID = ( + args: CheckoutOptionsGetTransakContractIDArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('CheckoutOptionsGetTransakContractID'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + contractId: _data.contractId, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + fortePayCreateIntent = ( + args: FortePayCreateIntentArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('FortePayCreateIntent'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + resp: _data.resp, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + fortePayGetPaymentStatuses = ( + args: FortePayGetPaymentStatusesArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('FortePayGetPaymentStatuses'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + statuses: >_data.statuses, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getCCTPTransfer = ( + args: GetCCTPTransferArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetCCTPTransfer'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + transfer: _data.transfer, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + queueCCTPTransfer = ( + args: QueueCCTPTransferArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('QueueCCTPTransfer'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + transfer: _data.transfer, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + queueIntentConfigExecution = ( + args: QueueIntentConfigExecutionArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('QueueIntentConfigExecution'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getIntentConfigExecutionStatus = ( + args: GetIntentConfigExecutionStatusArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetIntentConfigExecutionStatus'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + executionStatus: _data.executionStatus, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + listIntentConfigs = ( + args: ListIntentConfigsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('ListIntentConfigs'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + page: _data.page, + intentConfigs: >_data.intentConfigs, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + queueMetaTxnReceipt = ( + args: QueueMetaTxnReceiptArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('QueueMetaTxnReceipt'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } +} + +const createHTTPRequest = (body: object = {}, headers: object = {}, signal: AbortSignal | null = null): object => { + const reqHeaders: { [key: string]: string } = { ...headers, 'Content-Type': 'application/json' } reqHeaders[WebrpcHeader] = WebrpcHeaderValue return { method: 'POST', headers: reqHeaders, body: JSON.stringify(body || {}), - signal + signal, } } const buildResponse = (res: Response): Promise => { - return res.text().then(text => { + return res.text().then((text) => { let data try { data = JSON.parse(text) - } catch(error) { + } catch (error) { let message = '' - if (error instanceof Error) { + if (error instanceof Error) { message = error.message } throw WebrpcBadResponseError.new({ status: res.status, - cause: `JSON.parse(): ${message}: response text: ${text}`}, - ) + cause: `JSON.parse(): ${message}: response text: ${text}`, + }) } if (!res.ok) { - const code: number = (typeof data.code === 'number') ? data.code : 0 + const code: number = typeof data.code === 'number' ? data.code : 0 throw (webrpcErrorByCode[code] || WebrpcError).new(data) } return data @@ -3435,7 +3933,7 @@ export class WebrpcEndpointError extends WebrpcError { code: number = 0, message: string = `endpoint error`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcEndpointError.prototype) @@ -3448,7 +3946,7 @@ export class WebrpcRequestFailedError extends WebrpcError { code: number = -1, message: string = `request failed`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcRequestFailedError.prototype) @@ -3461,7 +3959,7 @@ export class WebrpcBadRouteError extends WebrpcError { code: number = -2, message: string = `bad route`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcBadRouteError.prototype) @@ -3474,7 +3972,7 @@ export class WebrpcBadMethodError extends WebrpcError { code: number = -3, message: string = `bad method`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcBadMethodError.prototype) @@ -3487,7 +3985,7 @@ export class WebrpcBadRequestError extends WebrpcError { code: number = -4, message: string = `bad request`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcBadRequestError.prototype) @@ -3500,7 +3998,7 @@ export class WebrpcBadResponseError extends WebrpcError { code: number = -5, message: string = `bad response`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcBadResponseError.prototype) @@ -3513,7 +4011,7 @@ export class WebrpcServerPanicError extends WebrpcError { code: number = -6, message: string = `server panic`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcServerPanicError.prototype) @@ -3526,7 +4024,7 @@ export class WebrpcInternalErrorError extends WebrpcError { code: number = -7, message: string = `internal error`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcInternalErrorError.prototype) @@ -3539,7 +4037,7 @@ export class WebrpcClientDisconnectedError extends WebrpcError { code: number = -8, message: string = `client disconnected`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcClientDisconnectedError.prototype) @@ -3552,7 +4050,7 @@ export class WebrpcStreamLostError extends WebrpcError { code: number = -9, message: string = `stream lost`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcStreamLostError.prototype) @@ -3565,14 +4063,13 @@ export class WebrpcStreamFinishedError extends WebrpcError { code: number = -10, message: string = `stream finished`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcStreamFinishedError.prototype) } } - // Schema errors export class UnauthorizedError extends WebrpcError { @@ -3581,7 +4078,7 @@ export class UnauthorizedError extends WebrpcError { code: number = 1000, message: string = `Unauthorized access`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, UnauthorizedError.prototype) @@ -3594,7 +4091,7 @@ export class PermissionDeniedError extends WebrpcError { code: number = 1001, message: string = `Permission denied`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, PermissionDeniedError.prototype) @@ -3607,7 +4104,7 @@ export class SessionExpiredError extends WebrpcError { code: number = 1002, message: string = `Session expired`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, SessionExpiredError.prototype) @@ -3620,7 +4117,7 @@ export class MethodNotFoundError extends WebrpcError { code: number = 1003, message: string = `Method not found`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, MethodNotFoundError.prototype) @@ -3633,7 +4130,7 @@ export class RequestConflictError extends WebrpcError { code: number = 1004, message: string = `Conflict with target resource`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, RequestConflictError.prototype) @@ -3646,7 +4143,7 @@ export class AbortedError extends WebrpcError { code: number = 1005, message: string = `Request aborted`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, AbortedError.prototype) @@ -3659,7 +4156,7 @@ export class GeoblockedError extends WebrpcError { code: number = 1006, message: string = `Geoblocked region`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, GeoblockedError.prototype) @@ -3672,7 +4169,7 @@ export class RateLimitedError extends WebrpcError { code: number = 1007, message: string = `Rate-limited. Please slow down.`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, RateLimitedError.prototype) @@ -3685,7 +4182,7 @@ export class ProjectNotFoundError extends WebrpcError { code: number = 1008, message: string = `Project not found`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, ProjectNotFoundError.prototype) @@ -3698,7 +4195,7 @@ export class AccessKeyNotFoundError extends WebrpcError { code: number = 1101, message: string = `Access key not found`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, AccessKeyNotFoundError.prototype) @@ -3711,7 +4208,7 @@ export class AccessKeyMismatchError extends WebrpcError { code: number = 1102, message: string = `Access key mismatch`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, AccessKeyMismatchError.prototype) @@ -3724,7 +4221,7 @@ export class InvalidOriginError extends WebrpcError { code: number = 1103, message: string = `Invalid origin for Access Key`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, InvalidOriginError.prototype) @@ -3737,7 +4234,7 @@ export class InvalidServiceError extends WebrpcError { code: number = 1104, message: string = `Service not enabled for Access key`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, InvalidServiceError.prototype) @@ -3750,7 +4247,7 @@ export class UnauthorizedUserError extends WebrpcError { code: number = 1105, message: string = `Unauthorized user`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, UnauthorizedUserError.prototype) @@ -3763,7 +4260,7 @@ export class QuotaExceededError extends WebrpcError { code: number = 1200, message: string = `Quota request exceeded`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, QuotaExceededError.prototype) @@ -3776,7 +4273,7 @@ export class QuotaRateLimitError extends WebrpcError { code: number = 1201, message: string = `Quota rate limit exceeded`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, QuotaRateLimitError.prototype) @@ -3789,7 +4286,7 @@ export class NoDefaultKeyError extends WebrpcError { code: number = 1300, message: string = `No default access key found`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, NoDefaultKeyError.prototype) @@ -3802,7 +4299,7 @@ export class MaxAccessKeysError extends WebrpcError { code: number = 1301, message: string = `Access keys limit reached`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, MaxAccessKeysError.prototype) @@ -3815,7 +4312,7 @@ export class AtLeastOneKeyError extends WebrpcError { code: number = 1302, message: string = `You need at least one Access Key`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, AtLeastOneKeyError.prototype) @@ -3828,7 +4325,7 @@ export class TimeoutError extends WebrpcError { code: number = 1900, message: string = `Request timed out`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, TimeoutError.prototype) @@ -3841,7 +4338,7 @@ export class InvalidArgumentError extends WebrpcError { code: number = 2000, message: string = `Invalid argument`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, InvalidArgumentError.prototype) @@ -3854,7 +4351,7 @@ export class UnavailableError extends WebrpcError { code: number = 2002, message: string = `Unavailable resource`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, UnavailableError.prototype) @@ -3867,7 +4364,7 @@ export class QueryFailedError extends WebrpcError { code: number = 2003, message: string = `Query failed`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, QueryFailedError.prototype) @@ -3880,7 +4377,7 @@ export class NotFoundError extends WebrpcError { code: number = 3000, message: string = `Resource not found`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, NotFoundError.prototype) @@ -3893,14 +4390,13 @@ export class UnsupportedNetworkError extends WebrpcError { code: number = 3008, message: string = `Unsupported network`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, UnsupportedNetworkError.prototype) } } - export enum errors { WebrpcEndpoint = 'WebrpcEndpoint', WebrpcRequestFailed = 'WebrpcRequestFailed', @@ -4019,4 +4515,3 @@ export const webrpcErrorByCode: { [code: number]: any } = { } export type Fetch = (input: RequestInfo, init?: RequestInit) => Promise - diff --git a/packages/services/guard/CHANGELOG.md b/packages/services/guard/CHANGELOG.md index 63fd273bc7..73a0791163 100644 --- a/packages/services/guard/CHANGELOG.md +++ b/packages/services/guard/CHANGELOG.md @@ -2302,7 +2302,6 @@ - relayer: fix Relayer.wait() interface The interface for calling Relayer.wait() has changed. Instead of a single optional ill-defined timeout/delay parameter, there are three optional parameters, in order: - - timeout: the maximum time to wait for the transaction receipt - delay: the polling interval, i.e. the time to wait between requests - maxFails: the maximum number of hard failures to tolerate before giving up diff --git a/packages/services/indexer/CHANGELOG.md b/packages/services/indexer/CHANGELOG.md index 6b1ea35bec..29f042bf61 100644 --- a/packages/services/indexer/CHANGELOG.md +++ b/packages/services/indexer/CHANGELOG.md @@ -1422,7 +1422,6 @@ - relayer: fix Relayer.wait() interface The interface for calling Relayer.wait() has changed. Instead of a single optional ill-defined timeout/delay parameter, there are three optional parameters, in order: - - timeout: the maximum time to wait for the transaction receipt - delay: the polling interval, i.e. the time to wait between requests - maxFails: the maximum number of hard failures to tolerate before giving up @@ -1767,7 +1766,6 @@ ### Minor Changes - major architectural changes in Sequence design - - only one API instance, API is no longer a per-chain service - separate per-chain indexer service, API no longer handles indexing - single contract metadata service, API no longer serves metadata diff --git a/packages/services/metadata/CHANGELOG.md b/packages/services/metadata/CHANGELOG.md index b51ee450c1..fa04faa2d5 100644 --- a/packages/services/metadata/CHANGELOG.md +++ b/packages/services/metadata/CHANGELOG.md @@ -1422,7 +1422,6 @@ - relayer: fix Relayer.wait() interface The interface for calling Relayer.wait() has changed. Instead of a single optional ill-defined timeout/delay parameter, there are three optional parameters, in order: - - timeout: the maximum time to wait for the transaction receipt - delay: the polling interval, i.e. the time to wait between requests - maxFails: the maximum number of hard failures to tolerate before giving up @@ -1775,7 +1774,6 @@ ### Minor Changes - major architectural changes in Sequence design - - only one API instance, API is no longer a per-chain service - separate per-chain indexer service, API no longer handles indexing - single contract metadata service, API no longer serves metadata diff --git a/packages/services/relayer/CHANGELOG.md b/packages/services/relayer/CHANGELOG.md index c35614659b..2a3c09e46c 100644 --- a/packages/services/relayer/CHANGELOG.md +++ b/packages/services/relayer/CHANGELOG.md @@ -2476,7 +2476,6 @@ - relayer: fix Relayer.wait() interface The interface for calling Relayer.wait() has changed. Instead of a single optional ill-defined timeout/delay parameter, there are three optional parameters, in order: - - timeout: the maximum time to wait for the transaction receipt - delay: the polling interval, i.e. the time to wait between requests - maxFails: the maximum number of hard failures to tolerate before giving up @@ -3139,7 +3138,6 @@ ### Minor Changes - major architectural changes in Sequence design - - only one API instance, API is no longer a per-chain service - separate per-chain indexer service, API no longer handles indexing - single contract metadata service, API no longer serves metadata diff --git a/packages/services/relayer/package.json b/packages/services/relayer/package.json index 55bf3f7f2a..be043ee986 100644 --- a/packages/services/relayer/package.json +++ b/packages/services/relayer/package.json @@ -28,6 +28,13 @@ "devDependencies": { "@repo/typescript-config": "workspace:^", "@types/node": "^22.15.29", - "typescript": "^5.8.3" + "typescript": "^5.8.3", + "vitest": "^3.2.4" + }, + "dependencies": { + "@0xsequence/wallet-primitives": "workspace:^", + "mipd": "^0.0.7", + "ox": "^0.7.2", + "viem": "^2.37.8" } } diff --git a/packages/services/relayer/src/index.ts b/packages/services/relayer/src/index.ts index 4859839b55..1ff39166f3 100644 --- a/packages/services/relayer/src/index.ts +++ b/packages/services/relayer/src/index.ts @@ -1 +1,5 @@ -export * from './rpc-relayer/index.js' +export * as RpcRelayer from './rpc-relayer/index.js' +export * as Relayer from './relayer.js' +export * as StandardRelayer from './standard/index.js' +export * as RelayerGen from './rpc-relayer/relayer.gen.js' +export * as Preconditions from './preconditions/index.js' diff --git a/packages/wallet/core/src/preconditions/codec.ts b/packages/services/relayer/src/preconditions/codec.ts similarity index 100% rename from packages/wallet/core/src/preconditions/codec.ts rename to packages/services/relayer/src/preconditions/codec.ts diff --git a/packages/wallet/core/src/preconditions/index.ts b/packages/services/relayer/src/preconditions/index.ts similarity index 100% rename from packages/wallet/core/src/preconditions/index.ts rename to packages/services/relayer/src/preconditions/index.ts diff --git a/packages/wallet/core/src/preconditions/selectors.ts b/packages/services/relayer/src/preconditions/selectors.ts similarity index 100% rename from packages/wallet/core/src/preconditions/selectors.ts rename to packages/services/relayer/src/preconditions/selectors.ts diff --git a/packages/wallet/core/src/preconditions/types.ts b/packages/services/relayer/src/preconditions/types.ts similarity index 100% rename from packages/wallet/core/src/preconditions/types.ts rename to packages/services/relayer/src/preconditions/types.ts diff --git a/packages/wallet/core/src/relayer/relayer.ts b/packages/services/relayer/src/relayer.ts similarity index 96% rename from packages/wallet/core/src/relayer/relayer.ts rename to packages/services/relayer/src/relayer.ts index d7c0cb617f..952b80f8f6 100644 --- a/packages/wallet/core/src/relayer/relayer.ts +++ b/packages/services/relayer/src/relayer.ts @@ -1,6 +1,6 @@ import { Payload, Precondition } from '@0xsequence/wallet-primitives' import { Address, Hex } from 'ox' -import { FeeToken, GetMetaTxnReceiptReturn } from './standard/rpc/index.js' +import { FeeToken, GetMetaTxnReceiptReturn } from './rpc-relayer/relayer.gen.js' export interface FeeOption { token: FeeToken diff --git a/packages/services/relayer/src/rpc-relayer/index.ts b/packages/services/relayer/src/rpc-relayer/index.ts index 6e10f600bd..21a2f827b1 100644 --- a/packages/services/relayer/src/rpc-relayer/index.ts +++ b/packages/services/relayer/src/rpc-relayer/index.ts @@ -1 +1,449 @@ -export * from './relayer.gen.js' +import { + Relayer as GenRelayer, + SendMetaTxnReturn as RpcSendMetaTxnReturn, + MetaTxn as RpcMetaTxn, + FeeTokenType, + FeeToken as RpcFeeToken, + IntentPrecondition, + ETHTxnStatus, +} from './relayer.gen.js' +import { Address, Hex, Bytes, AbiFunction } from 'ox' +import { Constants, Payload, Network } from '@0xsequence/wallet-primitives' +import { FeeOption, FeeQuote, OperationStatus, Relayer } from '../relayer.js' +import { decodePrecondition } from '../preconditions/codec.js' +import { + erc20BalanceOf, + erc20Allowance, + erc721OwnerOf, + erc721GetApproved, + erc1155BalanceOf, + erc1155IsApprovedForAll, +} from '../standard/abi.js' +import { PublicClient, createPublicClient, http, Chain } from 'viem' +import * as chains from 'viem/chains' + +export type Fetch = (input: RequestInfo, init?: RequestInit) => Promise + +/** + * Convert a Sequence Network to a viem Chain + */ +const networkToChain = (network: Network.Network): Chain => { + return { + id: network.chainId, + name: network.title || network.name, + nativeCurrency: { + name: network.nativeCurrency.name, + symbol: network.nativeCurrency.symbol, + decimals: network.nativeCurrency.decimals, + }, + rpcUrls: { + default: { + http: [network.rpcUrl], + }, + }, + blockExplorers: network.blockExplorer + ? { + default: { + name: network.blockExplorer.name || 'Explorer', + url: network.blockExplorer.url, + }, + } + : undefined, + contracts: network.ensAddress + ? { + ensUniversalResolver: { + address: network.ensAddress as `0x${string}`, + }, + } + : undefined, + } as Chain +} + +export const getChain = (chainId: number): Chain => { + // First try to get the chain from Sequence's network configurations + const sequenceNetwork = Network.getNetworkFromChainId(chainId) + if (sequenceNetwork) { + return networkToChain(sequenceNetwork) + } + + // Fall back to viem's built-in chains + const viemChain = Object.values(chains).find((c: any) => typeof c === 'object' && 'id' in c && c.id === chainId) + if (viemChain) { + return viemChain as Chain + } + + throw new Error(`Chain with id ${chainId} not found in Sequence networks or viem chains`) +} + +export class RpcRelayer implements Relayer { + public readonly kind: 'relayer' = 'relayer' + public readonly type = 'rpc' + public readonly id: string + public readonly chainId: number + private client: GenRelayer + private fetch: Fetch + private provider: PublicClient + private readonly projectAccessKey?: string + + constructor(hostname: string, chainId: number, rpcUrl: string, fetchImpl?: Fetch, projectAccessKey?: string) { + this.id = `rpc:${hostname}` + this.chainId = chainId + this.projectAccessKey = projectAccessKey + const effectiveFetch = fetchImpl || (typeof window !== 'undefined' ? window.fetch.bind(window) : undefined) + if (!effectiveFetch) { + throw new Error('Fetch implementation is required but not available in this environment.') + } + this.fetch = effectiveFetch + this.client = new GenRelayer(hostname, this.fetch) + + // Get the chain from the chainId + const chain = getChain(chainId) + + // Create viem PublicClient with the provided RPC URL + this.provider = createPublicClient({ + chain, + transport: http(rpcUrl), + }) + } + + isAvailable(_wallet: Address.Address, chainId: number): Promise { + return Promise.resolve(this.chainId === chainId) + } + + async feeTokens(): Promise<{ isFeeRequired: boolean; tokens?: RpcFeeToken[]; paymentAddress?: Address.Address }> { + try { + const { isFeeRequired, tokens, paymentAddress } = await this.client.feeTokens() + if (isFeeRequired) { + Address.assert(paymentAddress) + return { + isFeeRequired, + tokens, + paymentAddress, + } + } + // Not required + return { + isFeeRequired, + } + } catch (e) { + console.warn('RpcRelayer.feeTokens failed:', e) + return { isFeeRequired: false } + } + } + + async feeOptions( + wallet: Address.Address, + chainId: number, + calls: Payload.Call[], + ): Promise<{ options: FeeOption[]; quote?: FeeQuote }> { + const callsStruct: Payload.Calls = { type: 'call', space: 0n, nonce: 0n, calls: calls } + const data = Payload.encode(callsStruct) + + try { + const result = await this.client.feeOptions( + { + wallet: wallet, + to: wallet, + data: Bytes.toHex(data), + }, + { ...(this.projectAccessKey ? { 'X-Access-Key': this.projectAccessKey } : undefined) }, + ) + + const quote = result.quote ? ({ _tag: 'FeeQuote', _quote: result.quote } as FeeQuote) : undefined + const options = result.options.map((option) => ({ + token: { + ...option.token, + contractAddress: this.mapRpcFeeTokenToAddress(option.token), + }, + to: option.to, + value: option.value, + gasLimit: option.gasLimit, + })) + + return { options, quote } + } catch (e) { + console.warn('RpcRelayer.feeOptions failed:', e) + return { options: [] } + } + } + + async sendMetaTxn( + walletAddress: Address.Address, + to: Address.Address, + data: Hex.Hex, + chainId: number, + quote?: FeeQuote, + preconditions?: IntentPrecondition[], + ): Promise<{ opHash: Hex.Hex }> { + console.log('sendMetaTxn', walletAddress, to, data, chainId, quote, preconditions) + const rpcCall: RpcMetaTxn = { + walletAddress: walletAddress, + contract: to, + input: data, + } + + const result: RpcSendMetaTxnReturn = await this.client.sendMetaTxn( + { + call: rpcCall, + quote: quote ? JSON.stringify(quote._quote) : undefined, + preconditions: preconditions, + }, + { ...(this.projectAccessKey ? { 'X-Access-Key': this.projectAccessKey } : undefined) }, + ) + + if (!result.status) { + console.error('RpcRelayer.relay failed', result) + throw new Error(`Relay failed: TxnHash ${result.txnHash}`) + } + + return { opHash: Hex.fromString(result.txnHash) } + } + + async relay( + to: Address.Address, + data: Hex.Hex, + chainId: number, + quote?: FeeQuote, + preconditions?: IntentPrecondition[], + ): Promise<{ opHash: Hex.Hex }> { + console.log('relay', to, data, chainId, quote, preconditions) + const rpcCall: RpcMetaTxn = { + walletAddress: to, + contract: to, + input: data, + } + + const result: RpcSendMetaTxnReturn = await this.client.sendMetaTxn( + { + call: rpcCall, + quote: quote ? JSON.stringify(quote._quote) : undefined, + preconditions: preconditions, + }, + { ...(this.projectAccessKey ? { 'X-Access-Key': this.projectAccessKey } : undefined) }, + ) + + if (!result.status) { + console.error('RpcRelayer.relay failed', result) + throw new Error(`Relay failed: TxnHash ${result.txnHash}`) + } + + return { opHash: `0x${result.txnHash}` } + } + + async status(opHash: Hex.Hex, chainId: number): Promise { + try { + const cleanedOpHash = opHash.startsWith('0x') ? opHash.substring(2) : opHash + const result = await this.client.getMetaTxnReceipt({ metaTxID: cleanedOpHash }) + const receipt = result.receipt + + if (!receipt) { + console.warn(`RpcRelayer.status: receipt not found for opHash ${opHash}`) + return { status: 'unknown' } + } + + if (!receipt.status) { + console.warn(`RpcRelayer.status: receipt status not found for opHash ${opHash}`) + return { status: 'unknown' } + } + + switch (receipt.status as ETHTxnStatus) { + case ETHTxnStatus.QUEUED: + case ETHTxnStatus.PENDING_PRECONDITION: + case ETHTxnStatus.SENT: + return { status: 'pending' } + case ETHTxnStatus.SUCCEEDED: + return { status: 'confirmed', transactionHash: receipt.txnHash as Hex.Hex, data: result } + case ETHTxnStatus.FAILED: + case ETHTxnStatus.PARTIALLY_FAILED: + return { + status: 'failed', + transactionHash: receipt.txnHash ? (receipt.txnHash as Hex.Hex) : undefined, + reason: receipt.revertReason || 'Relayer reported failure', + data: result, + } + case ETHTxnStatus.DROPPED: + return { status: 'failed', reason: 'Transaction dropped' } + case ETHTxnStatus.UNKNOWN: + default: + return { status: 'unknown' } + } + } catch (error) { + console.error(`RpcRelayer.status failed for opHash ${opHash}:`, error) + return { status: 'failed', reason: 'Failed to fetch status' } + } + } + + async checkPrecondition(precondition: IntentPrecondition): Promise { + const decoded = decodePrecondition(precondition) + + if (!decoded) { + return false + } + + switch (decoded.type()) { + case 'native-balance': { + const native = decoded as any + try { + const balance = await this.provider.getBalance({ address: native.address.toString() as `0x${string}` }) + const minWei = native.min !== undefined ? BigInt(native.min) : undefined + const maxWei = native.max !== undefined ? BigInt(native.max) : undefined + + if (minWei !== undefined && maxWei !== undefined) { + return balance >= minWei && balance <= maxWei + } + if (minWei !== undefined) { + return balance >= minWei + } + if (maxWei !== undefined) { + return balance <= maxWei + } + // If no min or max specified, this is an invalid precondition + console.warn('Native balance precondition has neither min nor max specified') + return false + } catch (error) { + console.error('Error checking native balance:', error) + return false + } + } + + case 'erc20-balance': { + const erc20 = decoded as any + try { + const data = AbiFunction.encodeData(erc20BalanceOf, [erc20.address.toString()]) + const result = await this.provider.call({ + to: erc20.token.toString() as `0x${string}`, + data: data as `0x${string}`, + }) + const balance = BigInt(result.toString()) + const minWei = erc20.min !== undefined ? BigInt(erc20.min) : undefined + const maxWei = erc20.max !== undefined ? BigInt(erc20.max) : undefined + + if (minWei !== undefined && maxWei !== undefined) { + return balance >= minWei && balance <= maxWei + } + if (minWei !== undefined) { + return balance >= minWei + } + if (maxWei !== undefined) { + return balance <= maxWei + } + console.warn('ERC20 balance precondition has neither min nor max specified') + return false + } catch (error) { + console.error('Error checking ERC20 balance:', error) + return false + } + } + + case 'erc20-approval': { + const erc20 = decoded as any + try { + const data = AbiFunction.encodeData(erc20Allowance, [erc20.address.toString(), erc20.operator.toString()]) + const result = await this.provider.call({ + to: erc20.token.toString() as `0x${string}`, + data: data as `0x${string}`, + }) + const allowance = BigInt(result.toString()) + const minAllowance = BigInt(erc20.min) + return allowance >= minAllowance + } catch (error) { + console.error('Error checking ERC20 approval:', error) + return false + } + } + + case 'erc721-ownership': { + const erc721 = decoded as any + try { + const data = AbiFunction.encodeData(erc721OwnerOf, [erc721.tokenId]) + const result = await this.provider.call({ + to: erc721.token.toString() as `0x${string}`, + data: data as `0x${string}`, + }) + const resultHex = result.toString() as `0x${string}` + const owner = resultHex.slice(-40) + const isOwner = owner.toLowerCase() === erc721.address.toString().slice(2).toLowerCase() + const expectedOwnership = erc721.owned !== undefined ? erc721.owned : true + return isOwner === expectedOwnership + } catch (error) { + console.error('Error checking ERC721 ownership:', error) + return false + } + } + + case 'erc721-approval': { + const erc721 = decoded as any + try { + const data = AbiFunction.encodeData(erc721GetApproved, [erc721.tokenId]) + const result = await this.provider.call({ + to: erc721.token.toString() as `0x${string}`, + data: data as `0x${string}`, + }) + const resultHex = result.toString() as `0x${string}` + const approved = resultHex.slice(-40) + return approved.toLowerCase() === erc721.operator.toString().slice(2).toLowerCase() + } catch (error) { + console.error('Error checking ERC721 approval:', error) + return false + } + } + + case 'erc1155-balance': { + const erc1155 = decoded as any + try { + const data = AbiFunction.encodeData(erc1155BalanceOf, [erc1155.address.toString(), erc1155.tokenId]) + const result = await this.provider.call({ + to: erc1155.token.toString() as `0x${string}`, + data: data as `0x${string}`, + }) + const balance = BigInt(result.toString()) + const minWei = erc1155.min !== undefined ? BigInt(erc1155.min) : undefined + const maxWei = erc1155.max !== undefined ? BigInt(erc1155.max) : undefined + + if (minWei !== undefined && maxWei !== undefined) { + return balance >= minWei && balance <= maxWei + } + if (minWei !== undefined) { + return balance >= minWei + } + if (maxWei !== undefined) { + return balance <= maxWei + } + console.warn('ERC1155 balance precondition has neither min nor max specified') + return false + } catch (error) { + console.error('Error checking ERC1155 balance:', error) + return false + } + } + + case 'erc1155-approval': { + const erc1155 = decoded as any + try { + const data = AbiFunction.encodeData(erc1155IsApprovedForAll, [ + erc1155.address.toString(), + erc1155.operator.toString(), + ]) + const result = await this.provider.call({ + to: erc1155.token.toString() as `0x${string}`, + data: data as `0x${string}`, + }) + return BigInt(result.toString()) === 1n + } catch (error) { + console.error('Error checking ERC1155 approval:', error) + return false + } + } + + default: + return false + } + } + + private mapRpcFeeTokenToAddress(rpcToken: RpcFeeToken): Address.Address { + if (rpcToken.type === FeeTokenType.ERC20_TOKEN && rpcToken.contractAddress) { + return Address.from(rpcToken.contractAddress) + } + return Constants.ZeroAddress // Default to zero address for native token or unsupported types + } +} diff --git a/packages/wallet/core/src/relayer/standard/abi.ts b/packages/services/relayer/src/standard/abi.ts similarity index 100% rename from packages/wallet/core/src/relayer/standard/abi.ts rename to packages/services/relayer/src/standard/abi.ts diff --git a/packages/wallet/core/src/relayer/standard/eip6963.ts b/packages/services/relayer/src/standard/eip6963.ts similarity index 96% rename from packages/wallet/core/src/relayer/standard/eip6963.ts rename to packages/services/relayer/src/standard/eip6963.ts index 66e7c4c4c3..05c2b21bf4 100644 --- a/packages/wallet/core/src/relayer/standard/eip6963.ts +++ b/packages/services/relayer/src/standard/eip6963.ts @@ -3,7 +3,7 @@ import { EIP1193ProviderAdapter, LocalRelayer } from './local.js' import { FeeOption, FeeQuote, OperationStatus, Relayer } from '../relayer.js' import { Address, Hex } from 'ox' import { Payload } from '@0xsequence/wallet-primitives' -import { FeeToken, IntentPrecondition } from './rpc/relayer.gen.js' +import { FeeToken, IntentPrecondition } from '../rpc-relayer/relayer.gen.js' export class EIP6963Relayer implements Relayer { public readonly kind: 'relayer' = 'relayer' diff --git a/packages/wallet/core/src/relayer/standard/index.ts b/packages/services/relayer/src/standard/index.ts similarity index 77% rename from packages/wallet/core/src/relayer/standard/index.ts rename to packages/services/relayer/src/standard/index.ts index 12260aef4a..d04527fa03 100644 --- a/packages/wallet/core/src/relayer/standard/index.ts +++ b/packages/services/relayer/src/standard/index.ts @@ -1,5 +1,4 @@ export * from './local.js' export * from './pk-relayer.js' export * from './sequence.js' -export * as Rpc from './rpc/index.js' export * as EIP6963 from './eip6963.js' diff --git a/packages/wallet/core/src/relayer/standard/local.ts b/packages/services/relayer/src/standard/local.ts similarity index 98% rename from packages/wallet/core/src/relayer/standard/local.ts rename to packages/services/relayer/src/standard/local.ts index 274af44eb4..f9edc19c41 100644 --- a/packages/wallet/core/src/relayer/standard/local.ts +++ b/packages/services/relayer/src/standard/local.ts @@ -2,8 +2,8 @@ import { Constants, Payload } from '@0xsequence/wallet-primitives' import { EIP1193Provider } from 'mipd' import { AbiFunction, Address, Bytes, Hex, TransactionReceipt } from 'ox' import { FeeOption, FeeQuote, OperationStatus, Relayer } from '../relayer.js' -import { FeeToken, IntentPrecondition } from './rpc/relayer.gen.js' -import { decodePrecondition } from '../../preconditions/index.js' +import { FeeToken, IntentPrecondition } from '../rpc-relayer/relayer.gen.js' +import { decodePrecondition } from '../preconditions/index.js' import { erc20BalanceOf, erc20Allowance, diff --git a/packages/wallet/core/src/relayer/standard/pk-relayer.ts b/packages/services/relayer/src/standard/pk-relayer.ts similarity index 98% rename from packages/wallet/core/src/relayer/standard/pk-relayer.ts rename to packages/services/relayer/src/standard/pk-relayer.ts index a8e850af46..c43cdbab48 100644 --- a/packages/wallet/core/src/relayer/standard/pk-relayer.ts +++ b/packages/services/relayer/src/standard/pk-relayer.ts @@ -2,7 +2,7 @@ import { Payload, Precondition } from '@0xsequence/wallet-primitives' import { Address, Hex, Provider, Secp256k1, TransactionEnvelopeEip1559, TransactionReceipt } from 'ox' import { LocalRelayer } from './local.js' import { FeeOption, FeeQuote, OperationStatus, Relayer } from '../relayer.js' -import { FeeToken } from './rpc/relayer.gen.js' +import { FeeToken } from '../rpc-relayer/relayer.gen.js' export class PkRelayer implements Relayer { public readonly kind: 'relayer' = 'relayer' diff --git a/packages/wallet/core/src/relayer/standard/sequence.ts b/packages/services/relayer/src/standard/sequence.ts similarity index 96% rename from packages/wallet/core/src/relayer/standard/sequence.ts rename to packages/services/relayer/src/standard/sequence.ts index d95bf19ddb..2412059e3b 100644 --- a/packages/wallet/core/src/relayer/standard/sequence.ts +++ b/packages/services/relayer/src/standard/sequence.ts @@ -1,9 +1,7 @@ -import { ETHTxnStatus, IntentPrecondition, Relayer as Service } from '@0xsequence/relayer' +import { ETHTxnStatus, IntentPrecondition, Relayer as Service, FeeToken } from '../rpc-relayer/relayer.gen.js' import { Payload } from '@0xsequence/wallet-primitives' import { AbiFunction, Address, Bytes, Hex } from 'ox' import { FeeOption, FeeQuote, OperationStatus, Relayer } from '../relayer.js' -import { FeeToken } from './rpc/relayer.gen.js' - export class SequenceRelayer implements Relayer { public readonly kind: 'relayer' = 'relayer' public readonly type = 'sequence' diff --git a/packages/wallet/core/test/preconditions/codec.test.ts b/packages/services/relayer/test/preconditions/codec.test.ts similarity index 100% rename from packages/wallet/core/test/preconditions/codec.test.ts rename to packages/services/relayer/test/preconditions/codec.test.ts diff --git a/packages/wallet/core/test/preconditions.test.ts b/packages/services/relayer/test/preconditions/preconditions.test.ts similarity index 98% rename from packages/wallet/core/test/preconditions.test.ts rename to packages/services/relayer/test/preconditions/preconditions.test.ts index af067e95b7..e4975daaf9 100644 --- a/packages/wallet/core/test/preconditions.test.ts +++ b/packages/services/relayer/test/preconditions/preconditions.test.ts @@ -8,9 +8,9 @@ import { Erc721ApprovalPrecondition, Erc721OwnershipPrecondition, NativeBalancePrecondition, -} from '../src/preconditions/types' -import { LocalRelayer } from '../src/relayer/standard/local' -import { CAN_RUN_LIVE, RPC_URL } from './constants' +} from '../../src/preconditions/types.js' +import { LocalRelayer } from '../../src/standard/local.js' +import { CAN_RUN_LIVE, RPC_URL } from '../../../../wallet/core/test/constants' import { Network } from '@0xsequence/wallet-primitives' const ERC20_IMPLICIT_MINT_CONTRACT = '0x041E0CDC028050519C8e6485B2d9840caf63773F' diff --git a/packages/wallet/core/test/preconditions/selectors.test.ts b/packages/services/relayer/test/preconditions/selectors.test.ts similarity index 100% rename from packages/wallet/core/test/preconditions/selectors.test.ts rename to packages/services/relayer/test/preconditions/selectors.test.ts diff --git a/packages/wallet/core/test/preconditions/types.test.ts b/packages/services/relayer/test/preconditions/types.test.ts similarity index 100% rename from packages/wallet/core/test/preconditions/types.test.ts rename to packages/services/relayer/test/preconditions/types.test.ts diff --git a/packages/wallet/core/test/relayer/relayer.test.ts b/packages/services/relayer/test/relayer/relayer.test.ts similarity index 86% rename from packages/wallet/core/test/relayer/relayer.test.ts rename to packages/services/relayer/test/relayer/relayer.test.ts index d0f4cba93f..adbadd236c 100644 --- a/packages/wallet/core/test/relayer/relayer.test.ts +++ b/packages/services/relayer/test/relayer/relayer.test.ts @@ -1,20 +1,7 @@ import { describe, expect, it, vi, beforeEach } from 'vitest' import { Address, Hex } from 'ox' -import { Network, Payload, Precondition } from '@0xsequence/wallet-primitives' -import { - Relayer, - isRelayer, - FeeOption, - FeeQuote, - OperationStatus, - OperationUnknownStatus, - OperationQueuedStatus, - OperationPendingStatus, - OperationPendingPreconditionStatus, - OperationConfirmedStatus, - OperationFailedStatus, -} from '../../src/relayer/relayer.js' -import { FeeTokenType } from '../../src/relayer/standard/rpc/index.js' +import { Network, Payload } from '@0xsequence/wallet-primitives' +import { Relayer, RelayerGen } from '@0xsequence/relayer' // Test addresses and data const TEST_WALLET_ADDRESS = Address.from('0x1234567890123456789012345678901234567890') @@ -24,20 +11,21 @@ const TEST_CHAIN_ID = Network.ChainId.MAINNET const TEST_OP_HASH = Hex.from('0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef') describe('Relayer', () => { - describe('isRelayer type guard', () => { + describe('Relayer.isRelayer type guard', () => { it('should return true for valid relayer objects', () => { - const mockRelayer: Relayer = { + const mockRelayer: Relayer.Relayer = { kind: 'relayer', type: 'test', id: 'test-relayer', isAvailable: vi.fn(), + feeTokens: vi.fn(), feeOptions: vi.fn(), relay: vi.fn(), status: vi.fn(), checkPrecondition: vi.fn(), } - expect(isRelayer(mockRelayer)).toBe(true) + expect(Relayer.isRelayer(mockRelayer)).toBe(true) }) it('should return false for objects missing required methods', () => { @@ -51,7 +39,7 @@ describe('Relayer', () => { status: vi.fn(), checkPrecondition: vi.fn(), } - expect(isRelayer(missing1)).toBe(false) + expect(Relayer.isRelayer(missing1)).toBe(false) // Missing feeOptions const missing2 = { @@ -63,7 +51,7 @@ describe('Relayer', () => { status: vi.fn(), checkPrecondition: vi.fn(), } - expect(isRelayer(missing2)).toBe(false) + expect(Relayer.isRelayer(missing2)).toBe(false) // Missing relay const missing3 = { @@ -75,7 +63,7 @@ describe('Relayer', () => { status: vi.fn(), checkPrecondition: vi.fn(), } - expect(isRelayer(missing3)).toBe(false) + expect(Relayer.isRelayer(missing3)).toBe(false) // Missing status const missing4 = { @@ -87,7 +75,7 @@ describe('Relayer', () => { relay: vi.fn(), checkPrecondition: vi.fn(), } - expect(isRelayer(missing4)).toBe(false) + expect(Relayer.isRelayer(missing4)).toBe(false) // Missing checkPrecondition const missing5 = { @@ -99,18 +87,18 @@ describe('Relayer', () => { relay: vi.fn(), status: vi.fn(), } - expect(isRelayer(missing5)).toBe(false) + expect(Relayer.isRelayer(missing5)).toBe(false) }) it('should return false for non-objects', () => { // These will throw due to the 'in' operator, so we need to test the actual behavior - expect(() => isRelayer(null)).toThrow() - expect(() => isRelayer(undefined)).toThrow() - expect(() => isRelayer('string')).toThrow() - expect(() => isRelayer(123)).toThrow() - expect(() => isRelayer(true)).toThrow() + expect(() => Relayer.isRelayer(null)).toThrow() + expect(() => Relayer.isRelayer(undefined)).toThrow() + expect(() => Relayer.isRelayer('string')).toThrow() + expect(() => Relayer.isRelayer(123)).toThrow() + expect(() => Relayer.isRelayer(true)).toThrow() // Arrays and objects should not throw, but should return false - expect(isRelayer([])).toBe(false) + expect(Relayer.isRelayer([])).toBe(false) }) it('should return false for objects with properties but wrong types', () => { @@ -126,20 +114,20 @@ describe('Relayer', () => { } // The current implementation only checks if properties exist, not their types // So this will actually return true since all required properties exist - expect(isRelayer(wrongTypes)).toBe(true) + expect(Relayer.isRelayer(wrongTypes)).toBe(true) }) }) describe('FeeOption interface', () => { it('should accept valid fee option objects', () => { - const feeOption: FeeOption = { + const feeOption: Relayer.FeeOption = { token: { chainId: Network.ChainId.MAINNET, name: 'Ethereum', symbol: 'ETH', decimals: 18, logoURL: 'https://example.com/eth.png', - type: 'NATIVE' as FeeTokenType, + type: 'NATIVE' as RelayerGen.FeeTokenType, contractAddress: undefined, }, to: TEST_TO_ADDRESS, @@ -156,7 +144,7 @@ describe('Relayer', () => { describe('FeeQuote interface', () => { it('should accept valid fee quote objects', () => { - const feeQuote: FeeQuote = { + const feeQuote: Relayer.FeeQuote = { _tag: 'FeeQuote', _quote: { someQuoteData: 'value' }, } @@ -168,7 +156,7 @@ describe('Relayer', () => { describe('OperationStatus types', () => { it('should accept OperationUnknownStatus', () => { - const status: OperationUnknownStatus = { + const status: Relayer.OperationUnknownStatus = { status: 'unknown', reason: 'Transaction not found', } @@ -178,7 +166,7 @@ describe('Relayer', () => { }) it('should accept OperationQueuedStatus', () => { - const status: OperationQueuedStatus = { + const status: Relayer.OperationQueuedStatus = { status: 'queued', reason: 'Transaction queued for processing', } @@ -188,7 +176,7 @@ describe('Relayer', () => { }) it('should accept OperationPendingStatus', () => { - const status: OperationPendingStatus = { + const status: Relayer.OperationPendingStatus = { status: 'pending', reason: 'Transaction pending confirmation', } @@ -198,7 +186,7 @@ describe('Relayer', () => { }) it('should accept OperationPendingPreconditionStatus', () => { - const status: OperationPendingPreconditionStatus = { + const status: Relayer.OperationPendingPreconditionStatus = { status: 'pending-precondition', reason: 'Waiting for preconditions to be met', } @@ -208,7 +196,7 @@ describe('Relayer', () => { }) it('should accept OperationConfirmedStatus', () => { - const status: OperationConfirmedStatus = { + const status: Relayer.OperationConfirmedStatus = { status: 'confirmed', transactionHash: TEST_OP_HASH, data: { @@ -231,7 +219,7 @@ describe('Relayer', () => { }) it('should accept OperationFailedStatus', () => { - const status: OperationFailedStatus = { + const status: Relayer.OperationFailedStatus = { status: 'failed', transactionHash: TEST_OP_HASH, reason: 'Transaction reverted', @@ -256,7 +244,7 @@ describe('Relayer', () => { }) it('should handle OperationStatus union type', () => { - const statuses: OperationStatus[] = [ + const statuses: Relayer.OperationStatus[] = [ { status: 'unknown' }, { status: 'queued' }, { status: 'pending' }, @@ -272,7 +260,7 @@ describe('Relayer', () => { }) describe('Relayer interface contract', () => { - let mockRelayer: Relayer + let mockRelayer: Relayer.Relayer beforeEach(() => { mockRelayer = { @@ -280,6 +268,7 @@ describe('Relayer', () => { type: 'mock', id: 'mock-relayer', isAvailable: vi.fn(), + feeTokens: vi.fn(), feeOptions: vi.fn(), relay: vi.fn(), status: vi.fn(), diff --git a/packages/utils/abi/CHANGELOG.md b/packages/utils/abi/CHANGELOG.md index aa0333e535..15772c27df 100644 --- a/packages/utils/abi/CHANGELOG.md +++ b/packages/utils/abi/CHANGELOG.md @@ -1422,7 +1422,6 @@ - relayer: fix Relayer.wait() interface The interface for calling Relayer.wait() has changed. Instead of a single optional ill-defined timeout/delay parameter, there are three optional parameters, in order: - - timeout: the maximum time to wait for the transaction receipt - delay: the polling interval, i.e. the time to wait between requests - maxFails: the maximum number of hard failures to tolerate before giving up @@ -1761,7 +1760,6 @@ ### Minor Changes - major architectural changes in Sequence design - - only one API instance, API is no longer a per-chain service - separate per-chain indexer service, API no longer handles indexing - single contract metadata service, API no longer serves metadata diff --git a/packages/wallet/core/src/relayer/bundler.ts b/packages/wallet/core/src/bundler/bundler.ts similarity index 85% rename from packages/wallet/core/src/relayer/bundler.ts rename to packages/wallet/core/src/bundler/bundler.ts index 4468f086de..baa473b817 100644 --- a/packages/wallet/core/src/relayer/bundler.ts +++ b/packages/wallet/core/src/bundler/bundler.ts @@ -1,7 +1,7 @@ import { Payload } from '@0xsequence/wallet-primitives' import { Address, Hex } from 'ox' import { UserOperation } from 'ox/erc4337' -import { OperationStatus } from './relayer.js' +import { Relayer } from '@0xsequence/relayer' export interface Bundler { kind: 'bundler' @@ -13,7 +13,7 @@ export interface Bundler { payload: Payload.Calls4337_07, ): Promise<{ speed?: 'slow' | 'standard' | 'fast'; payload: Payload.Calls4337_07 }[]> relay(entrypoint: Address.Address, userOperation: UserOperation.RpcV07): Promise<{ opHash: Hex.Hex }> - status(opHash: Hex.Hex, chainId: number): Promise + status(opHash: Hex.Hex, chainId: number): Promise isAvailable(entrypoint: Address.Address, chainId: number): Promise } diff --git a/packages/wallet/core/src/relayer/bundlers/index.ts b/packages/wallet/core/src/bundler/bundlers/index.ts similarity index 100% rename from packages/wallet/core/src/relayer/bundlers/index.ts rename to packages/wallet/core/src/bundler/bundlers/index.ts diff --git a/packages/wallet/core/src/relayer/bundlers/pimlico.ts b/packages/wallet/core/src/bundler/bundlers/pimlico.ts similarity index 97% rename from packages/wallet/core/src/relayer/bundlers/pimlico.ts rename to packages/wallet/core/src/bundler/bundlers/pimlico.ts index 11ae0dd646..e2d95ec331 100644 --- a/packages/wallet/core/src/relayer/bundlers/pimlico.ts +++ b/packages/wallet/core/src/bundler/bundlers/pimlico.ts @@ -2,7 +2,7 @@ import { Payload } from '@0xsequence/wallet-primitives' import { Bundler } from '../bundler.js' import { Provider, Hex, Address, RpcTransport } from 'ox' import { UserOperation } from 'ox/erc4337' -import { OperationStatus } from '../relayer.js' +import { Relayer } from '@0xsequence/relayer' type FeePerGasPair = { maxFeePerGas: Hex.Hex | bigint @@ -103,7 +103,7 @@ export class PimlicoBundler implements Bundler { } } - async status(opHash: Hex.Hex, _chainId: number): Promise { + async status(opHash: Hex.Hex, _chainId: number): Promise { try { type PimlicoStatusResp = { status: 'not_found' | 'not_submitted' | 'submitted' | 'rejected' | 'included' | 'failed' | 'reverted' diff --git a/packages/wallet/core/src/relayer/index.ts b/packages/wallet/core/src/bundler/index.ts similarity index 67% rename from packages/wallet/core/src/relayer/index.ts rename to packages/wallet/core/src/bundler/index.ts index 5fb0b67240..53c531a9be 100644 --- a/packages/wallet/core/src/relayer/index.ts +++ b/packages/wallet/core/src/bundler/index.ts @@ -1,7 +1,5 @@ // Export the core interfaces and type guards -export * from './relayer.js' export * from './bundler.js' // Group and export implementations -export * as Standard from './standard/index.js' export * as Bundlers from './bundlers/index.js' diff --git a/packages/wallet/core/src/index.ts b/packages/wallet/core/src/index.ts index d84206d678..b36e917cae 100644 --- a/packages/wallet/core/src/index.ts +++ b/packages/wallet/core/src/index.ts @@ -2,9 +2,8 @@ export * from './wallet.js' export * as Signers from './signers/index.js' export * as State from './state/index.js' -export * as Relayer from './relayer/index.js' +export * as Bundler from './bundler/index.js' export * as Envelope from './envelope.js' -export * as Preconditions from './preconditions/index.js' export * as Utils from './utils/index.js' export { type ExplicitSessionConfig, diff --git a/packages/wallet/core/src/relayer/standard/rpc/index.ts b/packages/wallet/core/src/relayer/standard/rpc/index.ts deleted file mode 100644 index f64a8f005d..0000000000 --- a/packages/wallet/core/src/relayer/standard/rpc/index.ts +++ /dev/null @@ -1,439 +0,0 @@ -import { - Relayer as GenRelayer, - SendMetaTxnReturn as RpcSendMetaTxnReturn, - MetaTxn as RpcMetaTxn, - FeeTokenType, - IntentPrecondition, -} from './relayer.gen.js' -import { FeeOption, FeeQuote, OperationStatus, Relayer } from '../../relayer.js' -import { Address, Hex, Bytes, AbiFunction } from 'ox' -import { Constants, Payload, Network } from '@0xsequence/wallet-primitives' -import { ETHTxnStatus, FeeToken as RpcFeeToken } from './relayer.gen.js' -import { decodePrecondition } from '../../../preconditions/index.js' -import { - erc20BalanceOf, - erc20Allowance, - erc721OwnerOf, - erc721GetApproved, - erc1155BalanceOf, - erc1155IsApprovedForAll, -} from '../abi.js' -import { PublicClient, createPublicClient, http, Chain } from 'viem' -import * as chains from 'viem/chains' - -export * from './relayer.gen.js' - -export type Fetch = (input: RequestInfo, init?: RequestInit) => Promise - -/** - * Convert a Sequence Network to a viem Chain - */ -const networkToChain = (network: Network.Network): Chain => { - return { - id: network.chainId, - name: network.title || network.name, - nativeCurrency: { - name: network.nativeCurrency.name, - symbol: network.nativeCurrency.symbol, - decimals: network.nativeCurrency.decimals, - }, - rpcUrls: { - default: { - http: [network.rpcUrl], - }, - }, - blockExplorers: network.blockExplorer - ? { - default: { - name: network.blockExplorer.name || 'Explorer', - url: network.blockExplorer.url, - }, - } - : undefined, - contracts: network.ensAddress - ? { - ensUniversalResolver: { - address: network.ensAddress as `0x${string}`, - }, - } - : undefined, - } as Chain -} - -export const getChain = (chainId: number): Chain => { - // First try to get the chain from Sequence's network configurations - const sequenceNetwork = Network.getNetworkFromChainId(chainId) - if (sequenceNetwork) { - return networkToChain(sequenceNetwork) - } - - // Fall back to viem's built-in chains - const viemChain = Object.values(chains).find((c: any) => typeof c === 'object' && 'id' in c && c.id === chainId) - if (viemChain) { - return viemChain as Chain - } - - throw new Error(`Chain with id ${chainId} not found in Sequence networks or viem chains`) -} - -export class RpcRelayer implements Relayer { - public readonly kind: 'relayer' = 'relayer' - public readonly type = 'rpc' - public readonly id: string - public readonly chainId: number - private client: GenRelayer - private fetch: Fetch - private provider: PublicClient - - constructor(hostname: string, chainId: number, rpcUrl: string, fetchImpl?: Fetch) { - this.id = `rpc:${hostname}` - this.chainId = chainId - const effectiveFetch = fetchImpl || (typeof window !== 'undefined' ? window.fetch.bind(window) : undefined) - if (!effectiveFetch) { - throw new Error('Fetch implementation is required but not available in this environment.') - } - this.fetch = effectiveFetch - this.client = new GenRelayer(hostname, this.fetch) - - // Get the chain from the chainId - const chain = getChain(chainId) - - // Create viem PublicClient with the provided RPC URL - this.provider = createPublicClient({ - chain, - transport: http(rpcUrl), - }) - } - - isAvailable(_wallet: Address.Address, chainId: number): Promise { - return Promise.resolve(this.chainId === chainId) - } - - async feeTokens(): Promise<{ isFeeRequired: boolean; tokens?: RpcFeeToken[]; paymentAddress?: Address.Address }> { - try { - const { isFeeRequired, tokens, paymentAddress } = await this.client.feeTokens() - if (isFeeRequired) { - Address.assert(paymentAddress) - return { - isFeeRequired, - tokens, - paymentAddress, - } - } - // Not required - return { - isFeeRequired, - } - } catch (e) { - console.warn('RpcRelayer.feeTokens failed:', e) - return { isFeeRequired: false } - } - } - - async feeOptions( - wallet: Address.Address, - chainId: number, - calls: Payload.Call[], - ): Promise<{ options: FeeOption[]; quote?: FeeQuote }> { - const callsStruct: Payload.Calls = { type: 'call', space: 0n, nonce: 0n, calls: calls } - const data = Payload.encode(callsStruct) - - try { - const result = await this.client.feeOptions({ - wallet: wallet, - to: wallet, - data: Bytes.toHex(data), - }) - - const quote = result.quote ? ({ _tag: 'FeeQuote', _quote: result.quote } as FeeQuote) : undefined - const options = result.options.map((option) => ({ - token: { - ...option.token, - contractAddress: this.mapRpcFeeTokenToAddress(option.token), - }, - to: option.to, - value: option.value, - gasLimit: option.gasLimit, - })) - - return { options, quote } - } catch (e) { - console.warn('RpcRelayer.feeOptions failed:', e) - return { options: [] } - } - } - - async sendMetaTxn( - walletAddress: Address.Address, - to: Address.Address, - data: Hex.Hex, - chainId: number, - quote?: FeeQuote, - preconditions?: IntentPrecondition[], - ): Promise<{ opHash: Hex.Hex }> { - console.log('sendMetaTxn', walletAddress, to, data, chainId, quote, preconditions) - const rpcCall: RpcMetaTxn = { - walletAddress: walletAddress, - contract: to, - input: data, - } - - const result: RpcSendMetaTxnReturn = await this.client.sendMetaTxn({ - call: rpcCall, - quote: quote ? JSON.stringify(quote._quote) : undefined, - preconditions: preconditions, - }) - - if (!result.status) { - console.error('RpcRelayer.relay failed', result) - throw new Error(`Relay failed: TxnHash ${result.txnHash}`) - } - - return { opHash: Hex.fromString(result.txnHash) } - } - - async relay( - to: Address.Address, - data: Hex.Hex, - chainId: number, - quote?: FeeQuote, - preconditions?: IntentPrecondition[], - ): Promise<{ opHash: Hex.Hex }> { - console.log('relay', to, data, chainId, quote, preconditions) - const rpcCall: RpcMetaTxn = { - walletAddress: to, - contract: to, - input: data, - } - - const result: RpcSendMetaTxnReturn = await this.client.sendMetaTxn({ - call: rpcCall, - quote: quote ? JSON.stringify(quote._quote) : undefined, - preconditions: preconditions, - }) - - if (!result.status) { - console.error('RpcRelayer.relay failed', result) - throw new Error(`Relay failed: TxnHash ${result.txnHash}`) - } - - return { opHash: `0x${result.txnHash}` } - } - - async status(opHash: Hex.Hex, chainId: number): Promise { - try { - const cleanedOpHash = opHash.startsWith('0x') ? opHash.substring(2) : opHash - const result = await this.client.getMetaTxnReceipt({ metaTxID: cleanedOpHash }) - const receipt = result.receipt - - if (!receipt) { - console.warn(`RpcRelayer.status: receipt not found for opHash ${opHash}`) - return { status: 'unknown' } - } - - if (!receipt.status) { - console.warn(`RpcRelayer.status: receipt status not found for opHash ${opHash}`) - return { status: 'unknown' } - } - - switch (receipt.status as ETHTxnStatus) { - case ETHTxnStatus.QUEUED: - case ETHTxnStatus.PENDING_PRECONDITION: - case ETHTxnStatus.SENT: - return { status: 'pending' } - case ETHTxnStatus.SUCCEEDED: - return { status: 'confirmed', transactionHash: receipt.txnHash as Hex.Hex, data: result } - case ETHTxnStatus.FAILED: - case ETHTxnStatus.PARTIALLY_FAILED: - return { - status: 'failed', - transactionHash: receipt.txnHash ? (receipt.txnHash as Hex.Hex) : undefined, - reason: receipt.revertReason || 'Relayer reported failure', - data: result, - } - case ETHTxnStatus.DROPPED: - return { status: 'failed', reason: 'Transaction dropped' } - case ETHTxnStatus.UNKNOWN: - default: - return { status: 'unknown' } - } - } catch (error) { - console.error(`RpcRelayer.status failed for opHash ${opHash}:`, error) - return { status: 'failed', reason: 'Failed to fetch status' } - } - } - - async checkPrecondition(precondition: IntentPrecondition): Promise { - const decoded = decodePrecondition(precondition) - - if (!decoded) { - return false - } - - switch (decoded.type()) { - case 'native-balance': { - const native = decoded as any - try { - const balance = await this.provider.getBalance({ address: native.address.toString() as `0x${string}` }) - const minWei = native.min !== undefined ? BigInt(native.min) : undefined - const maxWei = native.max !== undefined ? BigInt(native.max) : undefined - - if (minWei !== undefined && maxWei !== undefined) { - return balance >= minWei && balance <= maxWei - } - if (minWei !== undefined) { - return balance >= minWei - } - if (maxWei !== undefined) { - return balance <= maxWei - } - // If no min or max specified, this is an invalid precondition - console.warn('Native balance precondition has neither min nor max specified') - return false - } catch (error) { - console.error('Error checking native balance:', error) - return false - } - } - - case 'erc20-balance': { - const erc20 = decoded as any - try { - const data = AbiFunction.encodeData(erc20BalanceOf, [erc20.address.toString()]) - const result = await this.provider.call({ - to: erc20.token.toString() as `0x${string}`, - data: data as `0x${string}`, - }) - const balance = BigInt(result.toString()) - const minWei = erc20.min !== undefined ? BigInt(erc20.min) : undefined - const maxWei = erc20.max !== undefined ? BigInt(erc20.max) : undefined - - if (minWei !== undefined && maxWei !== undefined) { - return balance >= minWei && balance <= maxWei - } - if (minWei !== undefined) { - return balance >= minWei - } - if (maxWei !== undefined) { - return balance <= maxWei - } - console.warn('ERC20 balance precondition has neither min nor max specified') - return false - } catch (error) { - console.error('Error checking ERC20 balance:', error) - return false - } - } - - case 'erc20-approval': { - const erc20 = decoded as any - try { - const data = AbiFunction.encodeData(erc20Allowance, [erc20.address.toString(), erc20.operator.toString()]) - const result = await this.provider.call({ - to: erc20.token.toString() as `0x${string}`, - data: data as `0x${string}`, - }) - const allowance = BigInt(result.toString()) - const minAllowance = BigInt(erc20.min) - return allowance >= minAllowance - } catch (error) { - console.error('Error checking ERC20 approval:', error) - return false - } - } - - case 'erc721-ownership': { - const erc721 = decoded as any - try { - const data = AbiFunction.encodeData(erc721OwnerOf, [erc721.tokenId]) - const result = await this.provider.call({ - to: erc721.token.toString() as `0x${string}`, - data: data as `0x${string}`, - }) - const resultHex = result.toString() as `0x${string}` - const owner = resultHex.slice(-40) - const isOwner = owner.toLowerCase() === erc721.address.toString().slice(2).toLowerCase() - const expectedOwnership = erc721.owned !== undefined ? erc721.owned : true - return isOwner === expectedOwnership - } catch (error) { - console.error('Error checking ERC721 ownership:', error) - return false - } - } - - case 'erc721-approval': { - const erc721 = decoded as any - try { - const data = AbiFunction.encodeData(erc721GetApproved, [erc721.tokenId]) - const result = await this.provider.call({ - to: erc721.token.toString() as `0x${string}`, - data: data as `0x${string}`, - }) - const resultHex = result.toString() as `0x${string}` - const approved = resultHex.slice(-40) - return approved.toLowerCase() === erc721.operator.toString().slice(2).toLowerCase() - } catch (error) { - console.error('Error checking ERC721 approval:', error) - return false - } - } - - case 'erc1155-balance': { - const erc1155 = decoded as any - try { - const data = AbiFunction.encodeData(erc1155BalanceOf, [erc1155.address.toString(), erc1155.tokenId]) - const result = await this.provider.call({ - to: erc1155.token.toString() as `0x${string}`, - data: data as `0x${string}`, - }) - const balance = BigInt(result.toString()) - const minWei = erc1155.min !== undefined ? BigInt(erc1155.min) : undefined - const maxWei = erc1155.max !== undefined ? BigInt(erc1155.max) : undefined - - if (minWei !== undefined && maxWei !== undefined) { - return balance >= minWei && balance <= maxWei - } - if (minWei !== undefined) { - return balance >= minWei - } - if (maxWei !== undefined) { - return balance <= maxWei - } - console.warn('ERC1155 balance precondition has neither min nor max specified') - return false - } catch (error) { - console.error('Error checking ERC1155 balance:', error) - return false - } - } - - case 'erc1155-approval': { - const erc1155 = decoded as any - try { - const data = AbiFunction.encodeData(erc1155IsApprovedForAll, [ - erc1155.address.toString(), - erc1155.operator.toString(), - ]) - const result = await this.provider.call({ - to: erc1155.token.toString() as `0x${string}`, - data: data as `0x${string}`, - }) - return BigInt(result.toString()) === 1n - } catch (error) { - console.error('Error checking ERC1155 approval:', error) - return false - } - } - - default: - return false - } - } - - private mapRpcFeeTokenToAddress(rpcToken: RpcFeeToken): Address.Address { - if (rpcToken.type === FeeTokenType.ERC20_TOKEN && rpcToken.contractAddress) { - return Address.from(rpcToken.contractAddress) - } - return Constants.ZeroAddress // Default to zero address for native token or unsupported types - } -} diff --git a/packages/wallet/core/src/relayer/standard/rpc/relayer.gen.ts b/packages/wallet/core/src/relayer/standard/rpc/relayer.gen.ts deleted file mode 100644 index 0638fbe946..0000000000 --- a/packages/wallet/core/src/relayer/standard/rpc/relayer.gen.ts +++ /dev/null @@ -1,2039 +0,0 @@ -/* eslint-disable */ -// sequence-relayer v0.4.1 93ac61641d0351211680e2092673726b5c4f1848 -// -- -// Code generated by webrpc-gen@v0.26.0 with typescript generator. DO NOT EDIT. -// -// webrpc-gen -schema=relayer.ridl -target=typescript -client -out=./clients/relayer.gen.ts - -export const WebrpcHeader = 'Webrpc' - -export const WebrpcHeaderValue = 'webrpc@v0.26.0;gen-typescript@v0.17.0;sequence-relayer@v0.4.1' - -// WebRPC description and code-gen version -export const WebRPCVersion = 'v1' - -// Schema version of your RIDL schema -export const WebRPCSchemaVersion = 'v0.4.1' - -// Schema hash generated from your RIDL schema -export const WebRPCSchemaHash = '93ac61641d0351211680e2092673726b5c4f1848' - -type WebrpcGenVersions = { - webrpcGenVersion: string - codeGenName: string - codeGenVersion: string - schemaName: string - schemaVersion: string -} - -export function VersionFromHeader(headers: Headers): WebrpcGenVersions { - const headerValue = headers.get(WebrpcHeader) - if (!headerValue) { - return { - webrpcGenVersion: '', - codeGenName: '', - codeGenVersion: '', - schemaName: '', - schemaVersion: '', - } - } - - return parseWebrpcGenVersions(headerValue) -} - -function parseWebrpcGenVersions(header: string): WebrpcGenVersions { - const versions = header.split(';') - if (versions.length < 3) { - return { - webrpcGenVersion: '', - codeGenName: '', - codeGenVersion: '', - schemaName: '', - schemaVersion: '', - } - } - - const [_, webrpcGenVersion] = versions[0]!.split('@') - const [codeGenName, codeGenVersion] = versions[1]!.split('@') - const [schemaName, schemaVersion] = versions[2]!.split('@') - - return { - webrpcGenVersion: webrpcGenVersion ?? '', - codeGenName: codeGenName ?? '', - codeGenVersion: codeGenVersion ?? '', - schemaName: schemaName ?? '', - schemaVersion: schemaVersion ?? '', - } -} - -// -// Types -// - -export enum ETHTxnStatus { - UNKNOWN = 'UNKNOWN', - DROPPED = 'DROPPED', - QUEUED = 'QUEUED', - SENT = 'SENT', - SUCCEEDED = 'SUCCEEDED', - PARTIALLY_FAILED = 'PARTIALLY_FAILED', - FAILED = 'FAILED', - PENDING_PRECONDITION = 'PENDING_PRECONDITION', -} - -export enum TransferType { - SEND = 'SEND', - RECEIVE = 'RECEIVE', - BRIDGE_DEPOSIT = 'BRIDGE_DEPOSIT', - BRIDGE_WITHDRAW = 'BRIDGE_WITHDRAW', - BURN = 'BURN', - UNKNOWN = 'UNKNOWN', -} - -export enum SimulateStatus { - SKIPPED = 'SKIPPED', - SUCCEEDED = 'SUCCEEDED', - FAILED = 'FAILED', - ABORTED = 'ABORTED', - REVERTED = 'REVERTED', - NOT_ENOUGH_GAS = 'NOT_ENOUGH_GAS', -} - -export enum FeeTokenType { - UNKNOWN = 'UNKNOWN', - ERC20_TOKEN = 'ERC20_TOKEN', - ERC1155_TOKEN = 'ERC1155_TOKEN', -} - -export enum SortOrder { - DESC = 'DESC', - ASC = 'ASC', -} - -export interface Version { - webrpcVersion: string - schemaVersion: string - schemaHash: string - appVersion: string -} - -export interface RuntimeStatus { - healthOK: boolean - startTime: string - uptime: number - ver: string - branch: string - commitHash: string - chainID: number - useEIP1559: boolean - senders: Array - checks: RuntimeChecks -} - -export interface SenderStatus { - index: number - address: string - etherBalance: number - active: boolean -} - -export interface RuntimeChecks {} - -export interface SequenceContext { - factory: string - mainModule: string - mainModuleUpgradable: string - guestModule: string - utils: string -} - -export interface GasTank { - id: number - chainId: number - name: string - currentBalance: number - unlimited: boolean - feeMarkupFactor: number - updatedAt: string - createdAt: string -} - -export interface GasTankBalanceAdjustment { - gasTankId: number - nonce: number - amount: number - totalBalance: number - balanceTimestamp: string - createdAt: string -} - -export interface GasSponsor { - id: number - gasTankId: number - projectId: number - chainId: number - address: string - name: string - active: boolean - updatedAt: string - createdAt: string - deletedAt: string -} - -export interface GasSponsorUsage { - name: string - id: number - totalGasUsed: number - totalTxnFees: number - totalTxnFeesUsd: number - avgGasPrice: number - totalTxns: number - startTime: string - endTime: string -} - -export interface MetaTxn { - walletAddress: string - contract: string - input: string -} - -export interface MetaTxnLog { - id: number - chainId: number - projectId: number - txnHash: string - txnNonce: string - metaTxnID?: string - txnStatus: ETHTxnStatus - txnRevertReason: string - requeues: number - queuedAt: string - sentAt: string - minedAt: string - target: string - input: string - txnArgs: { [key: string]: any } - txnReceipt?: { [key: string]: any } - walletAddress: string - metaTxnNonce: string - gasLimit: number - gasPrice: string - gasUsed: number - gasEstimated: number - gasFeeMarkup?: number - usdRate: string - creditsUsed: number - cost: string - isWhitelisted: boolean - gasSponsor?: number - gasTank?: number - updatedAt: string - createdAt: string -} - -export interface MetaTxnReceipt { - id: string - status: string - revertReason?: string - index: number - logs: Array - receipts: Array - blockNumber: string - txnHash: string - txnReceipt: string -} - -export interface MetaTxnReceiptLog { - address: string - topics: Array - data: string -} - -export interface IntentPrecondition { - type: string - chainId: string - data: any -} - -export interface IntentSolution { - transactions: Array -} - -export interface Transactions { - chainID: string - transactions: Array - preconditions?: Array -} - -export interface Transaction { - delegateCall: boolean - revertOnError: boolean - gasLimit: string - target: string - value: string - data: string -} - -export interface TxnLogUser { - username: string -} - -export interface TxnLogTransfer { - transferType: TransferType - contractAddress: string - from: string - to: string - ids: Array - amounts: Array -} - -export interface SentTransactionsFilter { - pending?: boolean - failed?: boolean -} - -export interface SimulateResult { - executed: boolean - succeeded: boolean - result?: string - reason?: string - gasUsed: number - gasLimit: number -} - -export interface SimulateV3Result { - status: SimulateStatus - result?: string - error?: string - gasUsed: number - gasLimit: number -} - -export interface FeeOption { - token: FeeToken - to: string - value: string - gasLimit: number -} - -export interface FeeToken { - chainId: number - name: string - symbol: string - type: FeeTokenType - decimals?: number - logoURL: string - contractAddress?: string - tokenID?: string -} - -export interface Page { - pageSize?: number - page?: number - more?: boolean - totalRecords?: number - column?: string - before?: any - after?: any - sort?: Array -} - -export interface SortBy { - column: string - order: SortOrder -} - -export interface Relayer { - ping(headers?: object, signal?: AbortSignal): Promise - version(headers?: object, signal?: AbortSignal): Promise - runtimeStatus(headers?: object, signal?: AbortSignal): Promise - getSequenceContext(headers?: object, signal?: AbortSignal): Promise - getChainID(headers?: object, signal?: AbortSignal): Promise - /** - * - * Transactions - * - * TODO (future): rename this to just, 'SendTransaction(txn: MetaTransaction)' or 'SendTransaction(txn: SignedTransaction)', or something.. - * Project ID is only used by service and admin calls. Other clients must have projectID passed via the context - * TODO: rename return txnHash: string to metaTxnID: string - */ - sendMetaTxn(args: SendMetaTxnArgs, headers?: object, signal?: AbortSignal): Promise - getMetaTxnNonce(args: GetMetaTxnNonceArgs, headers?: object, signal?: AbortSignal): Promise - /** - * TODO: one day, make GetMetaTxnReceipt respond immediately with receipt or not - * and add WaitTransactionReceipt method, which will block and wait, similar to how GetMetaTxnReceipt - * is implemented now. - * For backwards compat, we can leave the current GetMetaTxnReceipt how it is, an deprecate it, and introduce - * new, GetTransactionReceipt and WaitTransactionReceipt methods - * we can also accept metaTxnId and txnHash .. so can take either or.. I wonder if ERC-4337 has any convention on this? - */ - getMetaTxnReceipt( - args: GetMetaTxnReceiptArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - simulate(args: SimulateArgs, headers?: object, signal?: AbortSignal): Promise - simulateV3(args: SimulateV3Args, headers?: object, signal?: AbortSignal): Promise - /** - * TODO: deprecated, to be removed by https://github.com/0xsequence/stack/pull/356 at a later date - */ - updateMetaTxnGasLimits( - args: UpdateMetaTxnGasLimitsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - feeTokens(headers?: object, signal?: AbortSignal): Promise - feeOptions(args: FeeOptionsArgs, headers?: object, signal?: AbortSignal): Promise - /** - * TODO: deprecated, to be removed by https://github.com/0xsequence/stack/pull/356 at a later date - */ - getMetaTxnNetworkFeeOptions( - args: GetMetaTxnNetworkFeeOptionsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - getMetaTransactions( - args: GetMetaTransactionsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - getTransactionCost( - args: GetTransactionCostArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - /** - * Sent transactions from an account. If filter is omitted then it will return all transactions. - */ - sentTransactions(args: SentTransactionsArgs, headers?: object, signal?: AbortSignal): Promise - /** - * Pending transactions waiting to be mined for an account. This endpoint is just a sugar of `SentTransactions` - * with the filter set to pending: true. - */ - pendingTransactions( - args: PendingTransactionsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - /** - * Legacy Gas Tank - */ - getGasTank(args: GetGasTankArgs, headers?: object, signal?: AbortSignal): Promise - addGasTank(args: AddGasTankArgs, headers?: object, signal?: AbortSignal): Promise - updateGasTank(args: UpdateGasTankArgs, headers?: object, signal?: AbortSignal): Promise - /** - * Legacy Gas Adjustment - */ - nextGasTankBalanceAdjustmentNonce( - args: NextGasTankBalanceAdjustmentNonceArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - adjustGasTankBalance( - args: AdjustGasTankBalanceArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - getGasTankBalanceAdjustment( - args: GetGasTankBalanceAdjustmentArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - listGasTankBalanceAdjustments( - args: ListGasTankBalanceAdjustmentsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - /** - * Gas Sponsorship - */ - listGasSponsors(args: ListGasSponsorsArgs, headers?: object, signal?: AbortSignal): Promise - getGasSponsor(args: GetGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise - addGasSponsor(args: AddGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise - updateGasSponsor(args: UpdateGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise - removeGasSponsor(args: RemoveGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise - /** - * Gas Sponsor Lookup - */ - addressGasSponsors( - args: AddressGasSponsorsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - /** - * Project Balance - */ - getProjectBalance( - args: GetProjectBalanceArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - adjustProjectBalance( - args: AdjustProjectBalanceArgs, - headers?: object, - signal?: AbortSignal, - ): Promise -} - -export interface PingArgs {} - -export interface PingReturn { - status: boolean -} -export interface VersionArgs {} - -export interface VersionReturn { - version: Version -} -export interface RuntimeStatusArgs {} - -export interface RuntimeStatusReturn { - status: RuntimeStatus -} -export interface GetSequenceContextArgs {} - -export interface GetSequenceContextReturn { - data: SequenceContext -} -export interface GetChainIDArgs {} - -export interface GetChainIDReturn { - chainID: number -} -export interface SendMetaTxnArgs { - call: MetaTxn - quote?: string - projectID?: number - preconditions?: Array -} - -export interface SendMetaTxnReturn { - status: boolean - txnHash: string -} -export interface GetMetaTxnNonceArgs { - walletContractAddress: string - space?: string -} - -export interface GetMetaTxnNonceReturn { - nonce: string -} -export interface GetMetaTxnReceiptArgs { - metaTxID: string -} - -export interface GetMetaTxnReceiptReturn { - receipt: MetaTxnReceipt -} -export interface SimulateArgs { - wallet: string - transactions: string -} - -export interface SimulateReturn { - results: Array -} -export interface SimulateV3Args { - wallet: string - calls: string -} - -export interface SimulateV3Return { - results: Array -} -export interface UpdateMetaTxnGasLimitsArgs { - walletAddress: string - walletConfig: any - payload: string -} - -export interface UpdateMetaTxnGasLimitsReturn { - payload: string -} -export interface FeeTokensArgs {} - -export interface FeeTokensReturn { - isFeeRequired: boolean - tokens: Array - paymentAddress: string -} -export interface FeeOptionsArgs { - wallet: string - to: string - data: string - simulate?: boolean -} - -export interface FeeOptionsReturn { - options: Array - sponsored: boolean - quote?: string -} -export interface GetMetaTxnNetworkFeeOptionsArgs { - walletConfig: any - payload: string -} - -export interface GetMetaTxnNetworkFeeOptionsReturn { - options: Array -} -export interface GetMetaTransactionsArgs { - projectId: number - page?: Page -} - -export interface GetMetaTransactionsReturn { - page: Page - transactions: Array -} -export interface GetTransactionCostArgs { - projectId: number - from: string - to: string -} - -export interface GetTransactionCostReturn { - cost: number -} -export interface SentTransactionsArgs { - filter?: SentTransactionsFilter - page?: Page -} - -export interface SentTransactionsReturn { - page: Page - transactions: Array -} -export interface PendingTransactionsArgs { - page?: Page -} - -export interface PendingTransactionsReturn { - page: Page - transactions: Array -} -export interface GetGasTankArgs { - id: number -} - -export interface GetGasTankReturn { - gasTank: GasTank -} -export interface AddGasTankArgs { - name: string - feeMarkupFactor: number - unlimited?: boolean -} - -export interface AddGasTankReturn { - status: boolean - gasTank: GasTank -} -export interface UpdateGasTankArgs { - id: number - name?: string - feeMarkupFactor?: number - unlimited?: boolean -} - -export interface UpdateGasTankReturn { - status: boolean - gasTank: GasTank -} -export interface NextGasTankBalanceAdjustmentNonceArgs { - id: number -} - -export interface NextGasTankBalanceAdjustmentNonceReturn { - nonce: number -} -export interface AdjustGasTankBalanceArgs { - id: number - nonce: number - amount: number -} - -export interface AdjustGasTankBalanceReturn { - status: boolean - adjustment: GasTankBalanceAdjustment -} -export interface GetGasTankBalanceAdjustmentArgs { - id: number - nonce: number -} - -export interface GetGasTankBalanceAdjustmentReturn { - adjustment: GasTankBalanceAdjustment -} -export interface ListGasTankBalanceAdjustmentsArgs { - id: number - page?: Page -} - -export interface ListGasTankBalanceAdjustmentsReturn { - page: Page - adjustments: Array -} -export interface ListGasSponsorsArgs { - projectId: number - page?: Page -} - -export interface ListGasSponsorsReturn { - page: Page - gasSponsors: Array -} -export interface GetGasSponsorArgs { - projectId: number - id: number -} - -export interface GetGasSponsorReturn { - gasSponsor: GasSponsor -} -export interface AddGasSponsorArgs { - projectId: number - address: string - name?: string - active?: boolean -} - -export interface AddGasSponsorReturn { - status: boolean - gasSponsor: GasSponsor -} -export interface UpdateGasSponsorArgs { - projectId: number - id: number - name?: string - active?: boolean -} - -export interface UpdateGasSponsorReturn { - status: boolean - gasSponsor: GasSponsor -} -export interface RemoveGasSponsorArgs { - projectId: number - id: number -} - -export interface RemoveGasSponsorReturn { - status: boolean -} -export interface AddressGasSponsorsArgs { - address: string - page?: Page -} - -export interface AddressGasSponsorsReturn { - page: Page - gasSponsors: Array -} -export interface GetProjectBalanceArgs { - projectId: number -} - -export interface GetProjectBalanceReturn { - balance: number -} -export interface AdjustProjectBalanceArgs { - projectId: number - amount: number - identifier: string -} - -export interface AdjustProjectBalanceReturn { - balance: number -} - -// -// Client -// -export class Relayer implements Relayer { - protected hostname: string - protected fetch: Fetch - protected path = '/rpc/Relayer/' - - constructor(hostname: string, fetch: Fetch) { - this.hostname = hostname.replace(/\/*$/, '') - this.fetch = (input: RequestInfo, init?: RequestInit) => fetch(input, init) - } - - private url(name: string): string { - return this.hostname + this.path + name - } - - ping = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('Ping'), createHTTPRequest({}, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - status: _data.status, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - version = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('Version'), createHTTPRequest({}, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - version: _data.version, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - runtimeStatus = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('RuntimeStatus'), createHTTPRequest({}, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - status: _data.status, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - getSequenceContext = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('GetSequenceContext'), createHTTPRequest({}, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - data: _data.data, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - getChainID = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('GetChainID'), createHTTPRequest({}, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - chainID: _data.chainID, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - sendMetaTxn = (args: SendMetaTxnArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('SendMetaTxn'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - status: _data.status, - txnHash: _data.txnHash, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - getMetaTxnNonce = ( - args: GetMetaTxnNonceArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetMetaTxnNonce'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - nonce: _data.nonce, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - getMetaTxnReceipt = ( - args: GetMetaTxnReceiptArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetMetaTxnReceipt'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - receipt: _data.receipt, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - simulate = (args: SimulateArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('Simulate'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - results: >_data.results, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - simulateV3 = (args: SimulateV3Args, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('SimulateV3'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - results: >_data.results, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - updateMetaTxnGasLimits = ( - args: UpdateMetaTxnGasLimitsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('UpdateMetaTxnGasLimits'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - payload: _data.payload, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - feeTokens = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('FeeTokens'), createHTTPRequest({}, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - isFeeRequired: _data.isFeeRequired, - tokens: >_data.tokens, - paymentAddress: _data.paymentAddress, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - feeOptions = (args: FeeOptionsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('FeeOptions'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - options: >_data.options, - sponsored: _data.sponsored, - quote: _data.quote, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - getMetaTxnNetworkFeeOptions = ( - args: GetMetaTxnNetworkFeeOptionsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetMetaTxnNetworkFeeOptions'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - options: >_data.options, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - getMetaTransactions = ( - args: GetMetaTransactionsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetMetaTransactions'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - page: _data.page, - transactions: >_data.transactions, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - getTransactionCost = ( - args: GetTransactionCostArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetTransactionCost'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - cost: _data.cost, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - sentTransactions = ( - args: SentTransactionsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('SentTransactions'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - page: _data.page, - transactions: >_data.transactions, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - pendingTransactions = ( - args: PendingTransactionsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('PendingTransactions'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - page: _data.page, - transactions: >_data.transactions, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - getGasTank = (args: GetGasTankArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('GetGasTank'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - gasTank: _data.gasTank, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - addGasTank = (args: AddGasTankArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('AddGasTank'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - status: _data.status, - gasTank: _data.gasTank, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - updateGasTank = (args: UpdateGasTankArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('UpdateGasTank'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - status: _data.status, - gasTank: _data.gasTank, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - nextGasTankBalanceAdjustmentNonce = ( - args: NextGasTankBalanceAdjustmentNonceArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('NextGasTankBalanceAdjustmentNonce'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - nonce: _data.nonce, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - adjustGasTankBalance = ( - args: AdjustGasTankBalanceArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('AdjustGasTankBalance'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - status: _data.status, - adjustment: _data.adjustment, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - getGasTankBalanceAdjustment = ( - args: GetGasTankBalanceAdjustmentArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetGasTankBalanceAdjustment'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - adjustment: _data.adjustment, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - listGasTankBalanceAdjustments = ( - args: ListGasTankBalanceAdjustmentsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('ListGasTankBalanceAdjustments'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - page: _data.page, - adjustments: >_data.adjustments, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - listGasSponsors = ( - args: ListGasSponsorsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('ListGasSponsors'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - page: _data.page, - gasSponsors: >_data.gasSponsors, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - getGasSponsor = (args: GetGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('GetGasSponsor'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - gasSponsor: _data.gasSponsor, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - addGasSponsor = (args: AddGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('AddGasSponsor'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - status: _data.status, - gasSponsor: _data.gasSponsor, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - updateGasSponsor = ( - args: UpdateGasSponsorArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('UpdateGasSponsor'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - status: _data.status, - gasSponsor: _data.gasSponsor, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - removeGasSponsor = ( - args: RemoveGasSponsorArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('RemoveGasSponsor'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - status: _data.status, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - addressGasSponsors = ( - args: AddressGasSponsorsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('AddressGasSponsors'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - page: _data.page, - gasSponsors: >_data.gasSponsors, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - getProjectBalance = ( - args: GetProjectBalanceArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetProjectBalance'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - balance: _data.balance, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } - - adjustProjectBalance = ( - args: AdjustProjectBalanceArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('AdjustProjectBalance'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - balance: _data.balance, - } - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, - ) - } -} - -const createHTTPRequest = (body: object = {}, headers: object = {}, signal: AbortSignal | null = null): object => { - const reqHeaders: { [key: string]: string } = { ...headers, 'Content-Type': 'application/json' } - reqHeaders[WebrpcHeader] = WebrpcHeaderValue - - return { - method: 'POST', - headers: reqHeaders, - body: JSON.stringify(body || {}), - signal, - } -} - -const buildResponse = (res: Response): Promise => { - return res.text().then((text) => { - let data - try { - data = JSON.parse(text) - } catch (error) { - let message = '' - if (error instanceof Error) { - message = error.message - } - throw WebrpcBadResponseError.new({ - status: res.status, - cause: `JSON.parse(): ${message}: response text: ${text}`, - }) - } - if (!res.ok) { - const code: number = typeof data.code === 'number' ? data.code : 0 - throw (webrpcErrorByCode[code] || WebrpcError).new(data) - } - return data - }) -} - -// -// Errors -// - -export class WebrpcError extends Error { - name: string - code: number - message: string - status: number - cause?: string - - /** @deprecated Use message instead of msg. Deprecated in webrpc v0.11.0. */ - msg: string - - constructor(name: string, code: number, message: string, status: number, cause?: string) { - super(message) - this.name = name || 'WebrpcError' - this.code = typeof code === 'number' ? code : 0 - this.message = message || `endpoint error ${this.code}` - this.msg = this.message - this.status = typeof status === 'number' ? status : 0 - this.cause = cause - Object.setPrototypeOf(this, WebrpcError.prototype) - } - - static new(payload: any): WebrpcError { - return new this(payload.error, payload.code, payload.message || payload.msg, payload.status, payload.cause) - } -} - -// Webrpc errors - -export class WebrpcEndpointError extends WebrpcError { - constructor( - name: string = 'WebrpcEndpoint', - code: number = 0, - message: string = `endpoint error`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) - Object.setPrototypeOf(this, WebrpcEndpointError.prototype) - } -} - -export class WebrpcRequestFailedError extends WebrpcError { - constructor( - name: string = 'WebrpcRequestFailed', - code: number = -1, - message: string = `request failed`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) - Object.setPrototypeOf(this, WebrpcRequestFailedError.prototype) - } -} - -export class WebrpcBadRouteError extends WebrpcError { - constructor( - name: string = 'WebrpcBadRoute', - code: number = -2, - message: string = `bad route`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) - Object.setPrototypeOf(this, WebrpcBadRouteError.prototype) - } -} - -export class WebrpcBadMethodError extends WebrpcError { - constructor( - name: string = 'WebrpcBadMethod', - code: number = -3, - message: string = `bad method`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) - Object.setPrototypeOf(this, WebrpcBadMethodError.prototype) - } -} - -export class WebrpcBadRequestError extends WebrpcError { - constructor( - name: string = 'WebrpcBadRequest', - code: number = -4, - message: string = `bad request`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) - Object.setPrototypeOf(this, WebrpcBadRequestError.prototype) - } -} - -export class WebrpcBadResponseError extends WebrpcError { - constructor( - name: string = 'WebrpcBadResponse', - code: number = -5, - message: string = `bad response`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) - Object.setPrototypeOf(this, WebrpcBadResponseError.prototype) - } -} - -export class WebrpcServerPanicError extends WebrpcError { - constructor( - name: string = 'WebrpcServerPanic', - code: number = -6, - message: string = `server panic`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) - Object.setPrototypeOf(this, WebrpcServerPanicError.prototype) - } -} - -export class WebrpcInternalErrorError extends WebrpcError { - constructor( - name: string = 'WebrpcInternalError', - code: number = -7, - message: string = `internal error`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) - Object.setPrototypeOf(this, WebrpcInternalErrorError.prototype) - } -} - -export class WebrpcClientDisconnectedError extends WebrpcError { - constructor( - name: string = 'WebrpcClientDisconnected', - code: number = -8, - message: string = `client disconnected`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) - Object.setPrototypeOf(this, WebrpcClientDisconnectedError.prototype) - } -} - -export class WebrpcStreamLostError extends WebrpcError { - constructor( - name: string = 'WebrpcStreamLost', - code: number = -9, - message: string = `stream lost`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) - Object.setPrototypeOf(this, WebrpcStreamLostError.prototype) - } -} - -export class WebrpcStreamFinishedError extends WebrpcError { - constructor( - name: string = 'WebrpcStreamFinished', - code: number = -10, - message: string = `stream finished`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) - Object.setPrototypeOf(this, WebrpcStreamFinishedError.prototype) - } -} - -// Schema errors - -export class UnauthorizedError extends WebrpcError { - constructor( - name: string = 'Unauthorized', - code: number = 1000, - message: string = `Unauthorized access`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) - Object.setPrototypeOf(this, UnauthorizedError.prototype) - } -} - -export class PermissionDeniedError extends WebrpcError { - constructor( - name: string = 'PermissionDenied', - code: number = 1001, - message: string = `Permission denied`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) - Object.setPrototypeOf(this, PermissionDeniedError.prototype) - } -} - -export class SessionExpiredError extends WebrpcError { - constructor( - name: string = 'SessionExpired', - code: number = 1002, - message: string = `Session expired`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) - Object.setPrototypeOf(this, SessionExpiredError.prototype) - } -} - -export class MethodNotFoundError extends WebrpcError { - constructor( - name: string = 'MethodNotFound', - code: number = 1003, - message: string = `Method not found`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) - Object.setPrototypeOf(this, MethodNotFoundError.prototype) - } -} - -export class RequestConflictError extends WebrpcError { - constructor( - name: string = 'RequestConflict', - code: number = 1004, - message: string = `Conflict with target resource`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) - Object.setPrototypeOf(this, RequestConflictError.prototype) - } -} - -export class AbortedError extends WebrpcError { - constructor( - name: string = 'Aborted', - code: number = 1005, - message: string = `Request aborted`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) - Object.setPrototypeOf(this, AbortedError.prototype) - } -} - -export class GeoblockedError extends WebrpcError { - constructor( - name: string = 'Geoblocked', - code: number = 1006, - message: string = `Geoblocked region`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) - Object.setPrototypeOf(this, GeoblockedError.prototype) - } -} - -export class RateLimitedError extends WebrpcError { - constructor( - name: string = 'RateLimited', - code: number = 1007, - message: string = `Rate-limited. Please slow down.`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) - Object.setPrototypeOf(this, RateLimitedError.prototype) - } -} - -export class ProjectNotFoundError extends WebrpcError { - constructor( - name: string = 'ProjectNotFound', - code: number = 1008, - message: string = `Project not found`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) - Object.setPrototypeOf(this, ProjectNotFoundError.prototype) - } -} - -export class AccessKeyNotFoundError extends WebrpcError { - constructor( - name: string = 'AccessKeyNotFound', - code: number = 1101, - message: string = `Access key not found`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) - Object.setPrototypeOf(this, AccessKeyNotFoundError.prototype) - } -} - -export class AccessKeyMismatchError extends WebrpcError { - constructor( - name: string = 'AccessKeyMismatch', - code: number = 1102, - message: string = `Access key mismatch`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) - Object.setPrototypeOf(this, AccessKeyMismatchError.prototype) - } -} - -export class InvalidOriginError extends WebrpcError { - constructor( - name: string = 'InvalidOrigin', - code: number = 1103, - message: string = `Invalid origin for Access Key`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) - Object.setPrototypeOf(this, InvalidOriginError.prototype) - } -} - -export class InvalidServiceError extends WebrpcError { - constructor( - name: string = 'InvalidService', - code: number = 1104, - message: string = `Service not enabled for Access key`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) - Object.setPrototypeOf(this, InvalidServiceError.prototype) - } -} - -export class UnauthorizedUserError extends WebrpcError { - constructor( - name: string = 'UnauthorizedUser', - code: number = 1105, - message: string = `Unauthorized user`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) - Object.setPrototypeOf(this, UnauthorizedUserError.prototype) - } -} - -export class QuotaExceededError extends WebrpcError { - constructor( - name: string = 'QuotaExceeded', - code: number = 1200, - message: string = `Quota request exceeded`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) - Object.setPrototypeOf(this, QuotaExceededError.prototype) - } -} - -export class QuotaRateLimitError extends WebrpcError { - constructor( - name: string = 'QuotaRateLimit', - code: number = 1201, - message: string = `Quota rate limit exceeded`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) - Object.setPrototypeOf(this, QuotaRateLimitError.prototype) - } -} - -export class NoDefaultKeyError extends WebrpcError { - constructor( - name: string = 'NoDefaultKey', - code: number = 1300, - message: string = `No default access key found`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) - Object.setPrototypeOf(this, NoDefaultKeyError.prototype) - } -} - -export class MaxAccessKeysError extends WebrpcError { - constructor( - name: string = 'MaxAccessKeys', - code: number = 1301, - message: string = `Access keys limit reached`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) - Object.setPrototypeOf(this, MaxAccessKeysError.prototype) - } -} - -export class AtLeastOneKeyError extends WebrpcError { - constructor( - name: string = 'AtLeastOneKey', - code: number = 1302, - message: string = `You need at least one Access Key`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) - Object.setPrototypeOf(this, AtLeastOneKeyError.prototype) - } -} - -export class TimeoutError extends WebrpcError { - constructor( - name: string = 'Timeout', - code: number = 1900, - message: string = `Request timed out`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) - Object.setPrototypeOf(this, TimeoutError.prototype) - } -} - -export class InvalidArgumentError extends WebrpcError { - constructor( - name: string = 'InvalidArgument', - code: number = 2001, - message: string = `Invalid argument`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) - Object.setPrototypeOf(this, InvalidArgumentError.prototype) - } -} - -export class UnavailableError extends WebrpcError { - constructor( - name: string = 'Unavailable', - code: number = 2002, - message: string = `Unavailable resource`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) - Object.setPrototypeOf(this, UnavailableError.prototype) - } -} - -export class QueryFailedError extends WebrpcError { - constructor( - name: string = 'QueryFailed', - code: number = 2003, - message: string = `Query failed`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) - Object.setPrototypeOf(this, QueryFailedError.prototype) - } -} - -export class NotFoundError extends WebrpcError { - constructor( - name: string = 'NotFound', - code: number = 3000, - message: string = `Resource not found`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) - Object.setPrototypeOf(this, NotFoundError.prototype) - } -} - -export class InsufficientFeeError extends WebrpcError { - constructor( - name: string = 'InsufficientFee', - code: number = 3004, - message: string = `Insufficient fee`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) - Object.setPrototypeOf(this, InsufficientFeeError.prototype) - } -} - -export class NotEnoughBalanceError extends WebrpcError { - constructor( - name: string = 'NotEnoughBalance', - code: number = 3005, - message: string = `Not enough balance`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) - Object.setPrototypeOf(this, NotEnoughBalanceError.prototype) - } -} - -export class SimulationFailedError extends WebrpcError { - constructor( - name: string = 'SimulationFailed', - code: number = 3006, - message: string = `Simulation failed`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) - Object.setPrototypeOf(this, SimulationFailedError.prototype) - } -} - -export enum errors { - WebrpcEndpoint = 'WebrpcEndpoint', - WebrpcRequestFailed = 'WebrpcRequestFailed', - WebrpcBadRoute = 'WebrpcBadRoute', - WebrpcBadMethod = 'WebrpcBadMethod', - WebrpcBadRequest = 'WebrpcBadRequest', - WebrpcBadResponse = 'WebrpcBadResponse', - WebrpcServerPanic = 'WebrpcServerPanic', - WebrpcInternalError = 'WebrpcInternalError', - WebrpcClientDisconnected = 'WebrpcClientDisconnected', - WebrpcStreamLost = 'WebrpcStreamLost', - WebrpcStreamFinished = 'WebrpcStreamFinished', - Unauthorized = 'Unauthorized', - PermissionDenied = 'PermissionDenied', - SessionExpired = 'SessionExpired', - MethodNotFound = 'MethodNotFound', - RequestConflict = 'RequestConflict', - Aborted = 'Aborted', - Geoblocked = 'Geoblocked', - RateLimited = 'RateLimited', - ProjectNotFound = 'ProjectNotFound', - AccessKeyNotFound = 'AccessKeyNotFound', - AccessKeyMismatch = 'AccessKeyMismatch', - InvalidOrigin = 'InvalidOrigin', - InvalidService = 'InvalidService', - UnauthorizedUser = 'UnauthorizedUser', - QuotaExceeded = 'QuotaExceeded', - QuotaRateLimit = 'QuotaRateLimit', - NoDefaultKey = 'NoDefaultKey', - MaxAccessKeys = 'MaxAccessKeys', - AtLeastOneKey = 'AtLeastOneKey', - Timeout = 'Timeout', - InvalidArgument = 'InvalidArgument', - Unavailable = 'Unavailable', - QueryFailed = 'QueryFailed', - NotFound = 'NotFound', - InsufficientFee = 'InsufficientFee', - NotEnoughBalance = 'NotEnoughBalance', - SimulationFailed = 'SimulationFailed', -} - -export enum WebrpcErrorCodes { - WebrpcEndpoint = 0, - WebrpcRequestFailed = -1, - WebrpcBadRoute = -2, - WebrpcBadMethod = -3, - WebrpcBadRequest = -4, - WebrpcBadResponse = -5, - WebrpcServerPanic = -6, - WebrpcInternalError = -7, - WebrpcClientDisconnected = -8, - WebrpcStreamLost = -9, - WebrpcStreamFinished = -10, - Unauthorized = 1000, - PermissionDenied = 1001, - SessionExpired = 1002, - MethodNotFound = 1003, - RequestConflict = 1004, - Aborted = 1005, - Geoblocked = 1006, - RateLimited = 1007, - ProjectNotFound = 1008, - AccessKeyNotFound = 1101, - AccessKeyMismatch = 1102, - InvalidOrigin = 1103, - InvalidService = 1104, - UnauthorizedUser = 1105, - QuotaExceeded = 1200, - QuotaRateLimit = 1201, - NoDefaultKey = 1300, - MaxAccessKeys = 1301, - AtLeastOneKey = 1302, - Timeout = 1900, - InvalidArgument = 2001, - Unavailable = 2002, - QueryFailed = 2003, - NotFound = 3000, - InsufficientFee = 3004, - NotEnoughBalance = 3005, - SimulationFailed = 3006, -} - -export const webrpcErrorByCode: { [code: number]: any } = { - [0]: WebrpcEndpointError, - [-1]: WebrpcRequestFailedError, - [-2]: WebrpcBadRouteError, - [-3]: WebrpcBadMethodError, - [-4]: WebrpcBadRequestError, - [-5]: WebrpcBadResponseError, - [-6]: WebrpcServerPanicError, - [-7]: WebrpcInternalErrorError, - [-8]: WebrpcClientDisconnectedError, - [-9]: WebrpcStreamLostError, - [-10]: WebrpcStreamFinishedError, - [1000]: UnauthorizedError, - [1001]: PermissionDeniedError, - [1002]: SessionExpiredError, - [1003]: MethodNotFoundError, - [1004]: RequestConflictError, - [1005]: AbortedError, - [1006]: GeoblockedError, - [1007]: RateLimitedError, - [1008]: ProjectNotFoundError, - [1101]: AccessKeyNotFoundError, - [1102]: AccessKeyMismatchError, - [1103]: InvalidOriginError, - [1104]: InvalidServiceError, - [1105]: UnauthorizedUserError, - [1200]: QuotaExceededError, - [1201]: QuotaRateLimitError, - [1300]: NoDefaultKeyError, - [1301]: MaxAccessKeysError, - [1302]: AtLeastOneKeyError, - [1900]: TimeoutError, - [2001]: InvalidArgumentError, - [2002]: UnavailableError, - [2003]: QueryFailedError, - [3000]: NotFoundError, - [3004]: InsufficientFeeError, - [3005]: NotEnoughBalanceError, - [3006]: SimulationFailedError, -} - -export type Fetch = (input: RequestInfo, init?: RequestInit) => Promise diff --git a/packages/wallet/core/src/signers/session-manager.ts b/packages/wallet/core/src/signers/session-manager.ts index c991f955e6..ef3d81b3a3 100644 --- a/packages/wallet/core/src/signers/session-manager.ts +++ b/packages/wallet/core/src/signers/session-manager.ts @@ -154,7 +154,7 @@ export class SessionManager implements SapientSigner { supported = await signer.supportedCall(wallet, chainId, call, this.address, this._provider) if (supported) { // Check signer validity - const signerValidity = await signer.isValid(topology, chainId) + const signerValidity = signer.isValid(topology, chainId) if (signerValidity.invalidReason === 'Expired') { expiredSupportedSigner = signer } @@ -173,7 +173,9 @@ export class SessionManager implements SapientSigner { if (expiredSupportedSigner) { throw new Error(`Signer supporting call is expired: ${expiredSupportedSigner.address}`) } - throw new Error('No signer supported for call') + throw new Error( + `No signer supported for call. ` + `Call: to=${call.to}, data=${call.data}, value=${call.value}, `, + ) } } return signers diff --git a/packages/wallet/core/test/relayer/bundler.test.ts b/packages/wallet/core/test/relayer/bundler.test.ts index cf5b3df469..bc565e1cc3 100644 --- a/packages/wallet/core/test/relayer/bundler.test.ts +++ b/packages/wallet/core/test/relayer/bundler.test.ts @@ -2,8 +2,8 @@ import { describe, expect, it, vi, beforeEach } from 'vitest' import { Address, Hex } from 'ox' import { UserOperation } from 'ox/erc4337' import { Network, Payload } from '@0xsequence/wallet-primitives' -import { Bundler, isBundler } from '../../src/relayer/bundler.js' -import { OperationStatus } from '../../src/relayer/relayer.js' +import { Bundler, isBundler } from '../../src/bundler/index.js' +import { Relayer } from '@0xsequence/relayer' // Test addresses and data const TEST_WALLET_ADDRESS = Address.from('0x1234567890123456789012345678901234567890') @@ -220,7 +220,7 @@ describe('Bundler', () => { }) it('should handle various operation statuses', async () => { - const statuses: OperationStatus[] = [ + const statuses: Relayer.OperationStatus[] = [ { status: 'unknown' }, { status: 'pending' }, { status: 'confirmed', transactionHash: TEST_OP_HASH }, diff --git a/packages/wallet/dapp-client/package.json b/packages/wallet/dapp-client/package.json index b10524e429..be30ad3424 100644 --- a/packages/wallet/dapp-client/package.json +++ b/packages/wallet/dapp-client/package.json @@ -30,9 +30,10 @@ "vitest": "^3.2.1" }, "dependencies": { + "@0xsequence/guard": "workspace:^", + "@0xsequence/relayer": "workspace:^", "@0xsequence/wallet-core": "workspace:^", "@0xsequence/wallet-primitives": "workspace:^", - "@0xsequence/guard": "workspace:^", "ox": "^0.7.2" } } diff --git a/packages/wallet/dapp-client/src/ChainSessionManager.ts b/packages/wallet/dapp-client/src/ChainSessionManager.ts index afe0095d97..ae012f4429 100644 --- a/packages/wallet/dapp-client/src/ChainSessionManager.ts +++ b/packages/wallet/dapp-client/src/ChainSessionManager.ts @@ -3,7 +3,6 @@ import { AbiFunction, Address, Hex, Provider, RpcTransport, Secp256k1 } from 'ox import { Envelope, - Relayer, Signers, State, Wallet, @@ -41,9 +40,13 @@ import { ModifyExplicitSessionPayload, SessionResponse, AddExplicitSessionPayload, + FeeOption, + OperationFailedStatus, + OperationStatus, } from './types/index.js' import { CACHE_DB_NAME, VALUE_FORWARDER_ADDRESS } from './utils/constants.js' import { ExplicitSession, ImplicitSession, ExplicitSessionConfig } from './index.js' +import { RpcRelayer } from '@0xsequence/relayer' interface ChainSessionManagerEventMap { explicitSessionResponse: ExplicitSessionEventListener @@ -72,7 +75,7 @@ export class ChainSessionManager { private sessionManager: Signers.SessionManager | null = null private wallet: Wallet | null = null private provider: Provider.Provider | null = null - private relayer: Relayer.Standard.Rpc.RpcRelayer + private relayer: RpcRelayer.RpcRelayer private readonly chainId: number public transport: DappTransport | null = null private sequenceStorage: SequenceStorage @@ -121,10 +124,12 @@ export class ChainSessionManager { } this.guard = guard this.provider = Provider.from(RpcTransport.fromHttp(rpcUrl)) - this.relayer = new Relayer.Standard.Rpc.RpcRelayer( + this.relayer = new RpcRelayer.RpcRelayer( getRelayerUrl(chainId, relayerUrl), this.chainId, getRpcUrl(chainId, nodesUrl, projectAccessKey), + undefined, + projectAccessKey, ) this.transport = transport @@ -833,7 +838,7 @@ export class ChainSessionManager { * @returns A promise that resolves with an array of fee options. * @throws {FeeOptionError} If fetching fee options fails. */ - async getFeeOptions(calls: Transaction[]): Promise { + async getFeeOptions(calls: Transaction[]): Promise { const callsToSend = calls.map((tx) => ({ to: tx.to, value: tx.value, @@ -860,7 +865,7 @@ export class ChainSessionManager { * @throws {InitializationError} If the session is not initialized. * @throws {TransactionError} If the transaction fails at any stage. */ - async buildSignAndSendTransactions(transactions: Transaction[], feeOption?: Relayer.FeeOption): Promise { + async buildSignAndSendTransactions(transactions: Transaction[], feeOption?: FeeOption): Promise { if (!this.wallet || !this.sessionManager || !this.provider || !this.isInitialized) throw new InitializationError('Session is not initialized.') try { @@ -907,7 +912,7 @@ export class ChainSessionManager { if (status.status === 'confirmed') { return status.transactionHash } else { - const failedStatus = status as Relayer.OperationFailedStatus + const failedStatus = status as OperationFailedStatus const reason = failedStatus.reason || `unexpected status ${status.status}` throw new TransactionError(`Transaction failed: ${reason}`) } @@ -1059,7 +1064,7 @@ export class ChainSessionManager { * @param chainId The chain ID of the transaction. * @returns The final status of the transaction. */ - private async _waitForTransactionReceipt(opHash: `0x${string}`, chainId: number): Promise { + private async _waitForTransactionReceipt(opHash: `0x${string}`, chainId: number): Promise { try { while (true) { const currentStatus = await this.relayer.status(opHash, chainId) diff --git a/packages/wallet/dapp-client/src/DappClient.ts b/packages/wallet/dapp-client/src/DappClient.ts index d92936fa20..4b8a182c9f 100644 --- a/packages/wallet/dapp-client/src/DappClient.ts +++ b/packages/wallet/dapp-client/src/DappClient.ts @@ -1,12 +1,6 @@ import { Address, Hex } from 'ox' -import { - Relayer, - type ExplicitSession, - type ExplicitSessionConfig, - type ImplicitSession, - type Session, -} from './index.js' +import { type ExplicitSession, type ExplicitSessionConfig, type ImplicitSession, type Session } from './index.js' import { ChainSessionManager } from './ChainSessionManager.js' import { DappTransport } from './DappTransport.js' @@ -16,6 +10,7 @@ import { CreateNewSessionResponse, DappClientExplicitSessionEventListener, DappClientWalletActionEventListener, + FeeOption, GetFeeTokensResponse, GuardConfig, LoginMethod, @@ -33,6 +28,7 @@ import { import { TypedData } from 'ox/TypedData' import { KEYMACHINE_URL, NODES_URL, RELAYER_URL } from './utils/constants.js' import { getRelayerUrl, getRpcUrl } from './utils/index.js' +import { RpcRelayer } from '@0xsequence/relayer' export type DappClientEventListener = (data?: any) => void @@ -595,7 +591,7 @@ export class DappClient { * @throws If the fee options cannot be fetched. {@link FeeOptionError} * @throws If the client or relevant chain is not initialized. {@link InitializationError} * - * @returns A promise that resolves with the fee options. {@link Relayer.FeeOption[]} + * @returns A promise that resolves with the fee options. {@link FeeOption[]} * * @example * const dappClient = new DappClient('http://localhost:5173'); @@ -615,7 +611,7 @@ export class DappClient { * const txHash = await dappClient.sendTransaction(1, transactions, feeOption); * } */ - async getFeeOptions(chainId: number, transactions: Transaction[]): Promise { + async getFeeOptions(chainId: number, transactions: Transaction[]): Promise { const chainSessionManager = await this.getOrInitializeChainManager(chainId) return await chainSessionManager.getFeeOptions(transactions) } @@ -626,7 +622,7 @@ export class DappClient { * @throws If the fee tokens cannot be fetched. {@link InitializationError} */ async getFeeTokens(chainId: number): Promise { - const relayer = new Relayer.Standard.Rpc.RpcRelayer( + const relayer = new RpcRelayer.RpcRelayer( getRelayerUrl(chainId, this.relayerUrl), chainId, getRpcUrl(chainId, this.nodesUrl, this.projectAccessKey), @@ -660,7 +656,7 @@ export class DappClient { * Signs and sends a transaction using an available session signer. * @param chainId The chain ID on which to send the transaction. * @param transactions An array of transactions to be executed atomically in a single batch. {@link Transaction} - * @param feeOption (Optional) The selected fee option to sponsor the transaction. {@link Relayer.FeeOption} + * @param feeOption (Optional) The selected fee option to sponsor the transaction. {@link FeeOption} * @throws {TransactionError} If the transaction fails to send or confirm. * @throws {InitializationError} If the client or relevant chain is not initialized. * @@ -679,7 +675,7 @@ export class DappClient { * * const txHash = await dappClient.sendTransaction(1, [transaction]); */ - async sendTransaction(chainId: number, transactions: Transaction[], feeOption?: Relayer.FeeOption): Promise { + async sendTransaction(chainId: number, transactions: Transaction[], feeOption?: FeeOption): Promise { const chainSessionManager = await this.getOrInitializeChainManager(chainId) return await chainSessionManager.buildSignAndSendTransactions(transactions, feeOption) } diff --git a/packages/wallet/dapp-client/src/index.ts b/packages/wallet/dapp-client/src/index.ts index 791c37cd5a..9ffb334d90 100644 --- a/packages/wallet/dapp-client/src/index.ts +++ b/packages/wallet/dapp-client/src/index.ts @@ -21,6 +21,8 @@ export type { SendWalletTransactionResponse, WalletActionResponse, GetFeeTokensResponse, + FeeToken, + FeeOption, } from './types/index.js' export { RequestActionType, TransportMode } from './types/index.js' export { @@ -44,4 +46,4 @@ export { WebStorage } from './utils/storage.js' export { Attestation, Permission, Extensions, SessionConfig, Constants, Payload } from '@0xsequence/wallet-primitives' export type { ExplicitSessionConfig, ExplicitSession, ImplicitSession, Session } from '@0xsequence/wallet-core' -export { Signers, Wallet, Utils, Relayer, Envelope, State } from '@0xsequence/wallet-core' +export { Signers, Wallet, Utils, Envelope, State } from '@0xsequence/wallet-core' diff --git a/packages/wallet/dapp-client/src/types/index.ts b/packages/wallet/dapp-client/src/types/index.ts index 88146cd8ac..a6ea2ef9b8 100644 --- a/packages/wallet/dapp-client/src/types/index.ts +++ b/packages/wallet/dapp-client/src/types/index.ts @@ -1,11 +1,17 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ -import { ExplicitSession, Relayer } from '@0xsequence/wallet-core' +import { Relayer, RelayerGen } from '@0xsequence/relayer' +import { ExplicitSession } from '@0xsequence/wallet-core' import { Attestation, Payload } from '@0xsequence/wallet-primitives' import { Address, Hex } from 'ox' import type { TypedData } from 'ox/TypedData' // --- Public Interfaces and Constants --- +export type FeeToken = RelayerGen.FeeToken +export type FeeOption = RelayerGen.FeeOption +export type OperationFailedStatus = Relayer.OperationFailedStatus +export type OperationStatus = Relayer.OperationStatus + export const RequestActionType = { CREATE_NEW_SESSION: 'createNewSession', ADD_EXPLICIT_SESSION: 'addExplicitSession', @@ -183,6 +189,6 @@ export interface SendRequestOptions { export type GetFeeTokensResponse = { isFeeRequired: boolean - tokens?: Relayer.Standard.Rpc.FeeToken[] + tokens?: FeeToken[] paymentAddress?: Address.Address } diff --git a/packages/wallet/dapp-client/src/utils/constants.ts b/packages/wallet/dapp-client/src/utils/constants.ts index c1eec3ceff..3e1355558a 100644 --- a/packages/wallet/dapp-client/src/utils/constants.ts +++ b/packages/wallet/dapp-client/src/utils/constants.ts @@ -1,5 +1,5 @@ export const CACHE_DB_NAME = 'sequence-cache' export const NODES_URL = 'https://nodes.sequence.app/{network}' -export const RELAYER_URL = 'https://dev-{network}-relayer.sequence.app' -export const KEYMACHINE_URL = 'https://v3-keymachine.sequence-dev.app' +export const RELAYER_URL = 'https://{network}-relayer.sequence.app' +export const KEYMACHINE_URL = 'https://v3-keymachine.sequence.app' export const VALUE_FORWARDER_ADDRESS = '0xABAAd93EeE2a569cF0632f39B10A9f5D734777ca' diff --git a/packages/wallet/wdk/package.json b/packages/wallet/wdk/package.json index 05e0a91710..b47e0b40f0 100644 --- a/packages/wallet/wdk/package.json +++ b/packages/wallet/wdk/package.json @@ -34,6 +34,7 @@ "dependencies": { "@0xsequence/guard": "workspace:^", "@0xsequence/identity-instrument": "workspace:^", + "@0xsequence/relayer": "workspace:^", "@0xsequence/tee-verifier": "^0.1.2", "@0xsequence/wallet-core": "workspace:^", "@0xsequence/wallet-primitives": "workspace:^", diff --git a/packages/wallet/wdk/src/sequence/guards.ts b/packages/wallet/wdk/src/sequence/guards.ts index c46f670904..c85054794b 100644 --- a/packages/wallet/wdk/src/sequence/guards.ts +++ b/packages/wallet/wdk/src/sequence/guards.ts @@ -1,4 +1,4 @@ -import { Address, Secp256k1 } from 'ox' +import { Address } from 'ox' import { Shared } from './manager.js' import * as Guard from '@0xsequence/guard' import { Signers } from '@0xsequence/wallet-core' diff --git a/packages/wallet/wdk/src/sequence/handlers/guard.ts b/packages/wallet/wdk/src/sequence/handlers/guard.ts index c9a0a7b706..0afb52a87f 100644 --- a/packages/wallet/wdk/src/sequence/handlers/guard.ts +++ b/packages/wallet/wdk/src/sequence/handlers/guard.ts @@ -3,7 +3,7 @@ import * as Guard from '@0xsequence/guard' import { Handler } from './handler.js' import { BaseSignatureRequest, SignerUnavailable, SignerReady, SignerActionable, Kinds } from '../types/index.js' import { Signatures } from '../signatures.js' -import { GuardRole, Guards } from '../guards.js' +import { Guards } from '../guards.js' export class GuardHandler implements Handler { kind = Kinds.Guard diff --git a/packages/wallet/wdk/src/sequence/manager.ts b/packages/wallet/wdk/src/sequence/manager.ts index 0dbe84ef86..4421369044 100644 --- a/packages/wallet/wdk/src/sequence/manager.ts +++ b/packages/wallet/wdk/src/sequence/manager.ts @@ -1,5 +1,5 @@ -import { Signers as CoreSigners, Relayer, State } from '@0xsequence/wallet-core' - +import { Bundler, Signers as CoreSigners, State } from '@0xsequence/wallet-core' +import { Relayer, StandardRelayer } from '@0xsequence/relayer' import { IdentityInstrument } from '@0xsequence/identity-instrument' import { createAttestationVerifyingFetch } from '@0xsequence/tee-verifier' import { Config, Constants, Context, Extensions, Network } from '@0xsequence/wallet-primitives' @@ -52,7 +52,7 @@ export type ManagerOptions = { stateProvider?: State.Provider networks?: Network.Network[] relayers?: Relayer.Relayer[] | (() => Relayer.Relayer[]) - bundlers?: Relayer.Bundler[] + bundlers?: Bundler.Bundler[] guardUrl?: string guardAddresses?: Record @@ -104,7 +104,7 @@ export const ManagerOptionsDefaults = { stateProvider: new State.Sequence.Provider(), networks: Network.ALL, - relayers: () => [Relayer.Standard.LocalRelayer.createFromWindow(window)].filter((r) => r !== undefined), + relayers: () => [StandardRelayer.LocalRelayer.createFromWindow(window)].filter((r) => r !== undefined), bundlers: [], guardUrl: 'https://dev-guard.sequence.app', @@ -193,7 +193,7 @@ export type Sequence = { readonly networks: Network.Network[] readonly relayers: Relayer.Relayer[] - readonly bundlers: Relayer.Bundler[] + readonly bundlers: Bundler.Bundler[] readonly defaultGuardTopology: Config.SignerLeaf readonly defaultRecoverySettings: RecoverySettings @@ -358,7 +358,7 @@ export class Manager { // Add EIP-6963 relayers if enabled if (ops.multiInjectedProviderDiscovery) { try { - relayers.push(...Relayer.Standard.EIP6963.getRelayers()) + relayers.push(...StandardRelayer.EIP6963.getRelayers()) } catch (error) { console.warn('Failed to initialize EIP-6963 relayers:', error) } diff --git a/packages/wallet/wdk/src/sequence/transactions.ts b/packages/wallet/wdk/src/sequence/transactions.ts index e16a4bee47..bc39ba16b1 100644 --- a/packages/wallet/wdk/src/sequence/transactions.ts +++ b/packages/wallet/wdk/src/sequence/transactions.ts @@ -1,4 +1,5 @@ -import { Envelope, Relayer, Wallet } from '@0xsequence/wallet-core' +import { Envelope, Wallet, Bundler } from '@0xsequence/wallet-core' +import { Relayer, StandardRelayer } from '@0xsequence/relayer' import { Constants, Payload } from '@0xsequence/wallet-primitives' import { Abi, AbiFunction, Address, Hex, Provider, RpcTransport } from 'ox' import { v7 as uuidv7 } from 'uuid' @@ -179,11 +180,13 @@ export class Transactions implements TransactionsInterface { } if (tx.status === 'relayed') { - let relayer: Relayer.Relayer | Relayer.Bundler | undefined = this.shared.sequence.relayers.find( + let relayer: Relayer.Relayer | Bundler.Bundler | undefined = this.shared.sequence.relayers.find( (relayer) => relayer.id === tx.relayerId, ) if (!relayer) { - const bundler = this.shared.sequence.bundlers.find((bundler) => bundler.id === tx.relayerId) + const bundler: Bundler.Bundler | undefined = this.shared.sequence.bundlers.find( + (bundler) => bundler.id === tx.relayerId, + ) if (!bundler) { console.warn('relayer or bundler not found', tx.id, tx.relayerId) continue @@ -347,7 +350,7 @@ export class Transactions implements TransactionsInterface { const feeOptions = await relayer.feeOptions(tx.wallet, tx.envelope.chainId, tx.envelope.payload.calls) if (feeOptions.options.length === 0) { - const { name, icon } = relayer instanceof Relayer.Standard.EIP6963.EIP6963Relayer ? relayer.info : {} + const { name, icon } = relayer instanceof StandardRelayer.EIP6963.EIP6963Relayer ? relayer.info : {} return [ { @@ -361,7 +364,7 @@ export class Transactions implements TransactionsInterface { ] } - return feeOptions.options.map((feeOption) => ({ + return feeOptions.options.map((feeOption: Relayer.FeeOption) => ({ kind: 'standard', id: uuidv7(), feeOption, @@ -378,7 +381,7 @@ export class Transactions implements TransactionsInterface { } return Promise.all( - this.shared.sequence.bundlers.map(async (bundler): Promise => { + this.shared.sequence.bundlers.map(async (bundler: Bundler.Bundler): Promise => { const ifAvailable = await bundler.isAvailable(entrypoint, tx.envelope.chainId) if (!ifAvailable) { return [] @@ -580,7 +583,7 @@ export class Transactions implements TransactionsInterface { await this.shared.modules.signatures.complete(signature.id) } else if (isERC4337RelayerOption(tx.relayerOption)) { - if (!Relayer.isBundler(relayer)) { + if (!Bundler.isBundler(relayer)) { throw new Error(`Relayer ${tx.relayerOption.relayerId} is not a bundler`) } diff --git a/packages/wallet/wdk/src/sequence/types/transaction-request.ts b/packages/wallet/wdk/src/sequence/types/transaction-request.ts index 289bf5b645..51160a0499 100644 --- a/packages/wallet/wdk/src/sequence/types/transaction-request.ts +++ b/packages/wallet/wdk/src/sequence/types/transaction-request.ts @@ -1,6 +1,7 @@ -import { Envelope, Relayer } from '@0xsequence/wallet-core' +import { Envelope } from '@0xsequence/wallet-core' import { Payload } from '@0xsequence/wallet-primitives' import { Address, Hex } from 'ox' +import { Relayer } from '@0xsequence/relayer' export type TransactionRequest = { to: Address.Address diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f06089e93f..ad45d777b0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,10 +10,10 @@ importers: devDependencies: '@changesets/cli': specifier: ^2.29.4 - version: 2.29.7(@types/node@22.18.6) + version: 2.29.7(@types/node@22.18.10) lefthook: specifier: ^1.11.13 - version: 1.13.3 + version: 1.13.6 prettier: specifier: ^3.5.3 version: 3.6.2 @@ -22,7 +22,7 @@ importers: version: 6.0.1 turbo: specifier: ^2.5.4 - version: 2.5.6 + version: 2.5.8 typescript: specifier: 5.8.3 version: 5.8.3 @@ -34,13 +34,13 @@ importers: version: link:../../repo/ui next: specifier: ^15.3.3 - version: 15.5.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 15.5.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: specifier: ^19.1.0 - version: 19.1.1 + version: 19.2.0 react-dom: specifier: ^19.1.0 - version: 19.1.1(react@19.1.1) + version: 19.2.0(react@19.2.0) devDependencies: '@repo/eslint-config': specifier: workspace:* @@ -50,7 +50,7 @@ importers: version: link:../../repo/typescript-config '@types/node': specifier: ^20.17.57 - version: 20.19.17 + version: 20.19.21 '@types/react': specifier: 18.3.1 version: 18.3.1 @@ -68,13 +68,13 @@ importers: version: link:../../repo/ui next: specifier: ^15.3.3 - version: 15.5.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 15.5.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: specifier: ^19.1.0 - version: 19.1.1 + version: 19.2.0 react-dom: specifier: ^19.1.0 - version: 19.1.1(react@19.1.1) + version: 19.2.0(react@19.2.0) devDependencies: '@repo/eslint-config': specifier: workspace:* @@ -84,7 +84,7 @@ importers: version: link:../../repo/typescript-config '@types/node': specifier: ^20.17.57 - version: 20.19.17 + version: 20.19.21 '@types/react': specifier: 18.3.1 version: 18.3.1 @@ -102,7 +102,7 @@ importers: version: link:../../../repo/typescript-config '@types/node': specifier: ^22.15.29 - version: 22.18.6 + version: 22.18.10 typescript: specifier: ^5.8.3 version: 5.8.3 @@ -114,7 +114,7 @@ importers: version: link:../../../repo/typescript-config '@types/node': specifier: ^22.15.29 - version: 22.18.6 + version: 22.18.10 typescript: specifier: ^5.8.3 version: 5.8.3 @@ -130,13 +130,13 @@ importers: version: link:../../../repo/typescript-config '@types/node': specifier: ^22.15.29 - version: 22.18.6 + version: 22.18.10 typescript: specifier: ^5.8.3 version: 5.8.3 vitest: specifier: ^3.2.1 - version: 3.2.4(@types/node@22.18.6)(happy-dom@17.6.3) + version: 3.2.4(@types/node@22.18.10)(happy-dom@17.6.3) packages/services/identity-instrument: dependencies: @@ -155,13 +155,13 @@ importers: version: link:../../../repo/typescript-config '@types/node': specifier: ^22.15.29 - version: 22.18.6 + version: 22.18.10 typescript: specifier: ^5.8.3 version: 5.8.3 vitest: specifier: ^3.2.1 - version: 3.2.4(@types/node@22.18.6)(happy-dom@17.6.3) + version: 3.2.4(@types/node@22.18.10)(happy-dom@17.6.3) packages/services/indexer: devDependencies: @@ -170,7 +170,7 @@ importers: version: link:../../../repo/typescript-config '@types/node': specifier: ^22.15.29 - version: 22.18.6 + version: 22.18.10 typescript: specifier: ^5.8.3 version: 5.8.3 @@ -182,7 +182,7 @@ importers: version: link:../../../repo/typescript-config '@types/node': specifier: ^22.15.29 - version: 22.18.6 + version: 22.18.10 typescript: specifier: ^5.8.3 version: 5.8.3 @@ -194,22 +194,38 @@ importers: version: link:../../../repo/typescript-config '@types/node': specifier: ^22.15.29 - version: 22.18.6 + version: 22.18.10 typescript: specifier: ^5.8.3 version: 5.8.3 packages/services/relayer: + dependencies: + '@0xsequence/wallet-primitives': + specifier: workspace:^ + version: link:../../wallet/primitives + mipd: + specifier: ^0.0.7 + version: 0.0.7(typescript@5.8.3) + ox: + specifier: ^0.7.2 + version: 0.7.2(typescript@5.8.3) + viem: + specifier: ^2.37.8 + version: 2.38.2(typescript@5.8.3) devDependencies: '@repo/typescript-config': specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': specifier: ^22.15.29 - version: 22.18.6 + version: 22.18.10 typescript: specifier: ^5.8.3 version: 5.8.3 + vitest: + specifier: ^3.2.4 + version: 3.2.4(@types/node@22.18.10)(happy-dom@17.6.3) packages/utils/abi: devDependencies: @@ -218,7 +234,7 @@ importers: version: link:../../../repo/typescript-config '@types/node': specifier: ^22.15.29 - version: 22.18.6 + version: 22.18.10 typescript: specifier: ^5.8.3 version: 5.8.3 @@ -242,35 +258,38 @@ importers: version: 0.7.2(typescript@5.8.3) viem: specifier: ^2.30.6 - version: 2.37.8(typescript@5.8.3) + version: 2.38.2(typescript@5.8.3) devDependencies: '@repo/typescript-config': specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': specifier: ^22.15.29 - version: 22.18.6 + version: 22.18.10 '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@22.18.6)(happy-dom@17.6.3)) + version: 3.2.4(vitest@3.2.4(@types/node@22.18.10)(happy-dom@17.6.3)) dotenv: specifier: ^16.5.0 version: 16.6.1 fake-indexeddb: specifier: ^6.0.1 - version: 6.2.2 + version: 6.2.3 typescript: specifier: ^5.8.3 version: 5.8.3 vitest: specifier: ^3.2.1 - version: 3.2.4(@types/node@22.18.6)(happy-dom@17.6.3) + version: 3.2.4(@types/node@22.18.10)(happy-dom@17.6.3) packages/wallet/dapp-client: dependencies: '@0xsequence/guard': specifier: workspace:^ version: link:../../services/guard + '@0xsequence/relayer': + specifier: workspace:^ + version: link:../../services/relayer '@0xsequence/wallet-core': specifier: workspace:^ version: link:../core @@ -286,16 +305,16 @@ importers: version: link:../../../repo/typescript-config '@types/node': specifier: ^22.15.29 - version: 22.18.6 + version: 22.18.10 '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@22.18.6)(happy-dom@17.6.3)) + version: 3.2.4(vitest@3.2.4(@types/node@22.18.10)(happy-dom@17.6.3)) dotenv: specifier: ^16.5.0 version: 16.6.1 fake-indexeddb: specifier: ^6.0.1 - version: 6.2.2 + version: 6.2.3 happy-dom: specifier: ^17.2.2 version: 17.6.3 @@ -304,7 +323,7 @@ importers: version: 5.8.3 vitest: specifier: ^3.2.1 - version: 3.2.4(@types/node@22.18.6)(happy-dom@17.6.3) + version: 3.2.4(@types/node@22.18.10)(happy-dom@17.6.3) packages/wallet/primitives: dependencies: @@ -317,13 +336,13 @@ importers: version: link:../../../repo/typescript-config '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@22.18.6)(happy-dom@17.6.3)) + version: 3.2.4(vitest@3.2.4(@types/node@22.18.10)(happy-dom@17.6.3)) typescript: specifier: ^5.8.3 version: 5.8.3 vitest: specifier: ^3.2.1 - version: 3.2.4(@types/node@22.18.6)(happy-dom@17.6.3) + version: 3.2.4(@types/node@22.18.10)(happy-dom@17.6.3) packages/wallet/primitives-cli: dependencies: @@ -345,7 +364,7 @@ importers: version: link:../../../repo/typescript-config '@types/node': specifier: ^22.15.29 - version: 22.18.6 + version: 22.18.10 '@types/yargs': specifier: ^17.0.33 version: 17.0.33 @@ -354,7 +373,7 @@ importers: version: 8.2.2 esbuild: specifier: ^0.25.5 - version: 0.25.10 + version: 0.25.11 nodemon: specifier: ^3.1.10 version: 3.1.10 @@ -370,6 +389,9 @@ importers: '@0xsequence/identity-instrument': specifier: workspace:^ version: link:../../services/identity-instrument + '@0xsequence/relayer': + specifier: workspace:^ + version: link:../../services/relayer '@0xsequence/tee-verifier': specifier: ^0.1.2 version: 0.1.2 @@ -397,16 +419,16 @@ importers: version: link:../../../repo/typescript-config '@types/node': specifier: ^22.15.29 - version: 22.18.6 + version: 22.18.10 '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@22.18.6)(happy-dom@17.6.3)) + version: 3.2.4(vitest@3.2.4(@types/node@22.18.10)(happy-dom@17.6.3)) dotenv: specifier: ^16.5.0 version: 16.6.1 fake-indexeddb: specifier: ^6.0.1 - version: 6.2.2 + version: 6.2.3 happy-dom: specifier: ^17.2.2 version: 17.6.3 @@ -415,34 +437,34 @@ importers: version: 5.8.3 vitest: specifier: ^3.2.1 - version: 3.2.4(@types/node@22.18.6)(happy-dom@17.6.3) + version: 3.2.4(@types/node@22.18.10)(happy-dom@17.6.3) repo/eslint-config: devDependencies: '@eslint/js': specifier: ^9.28.0 - version: 9.36.0 + version: 9.37.0 '@next/eslint-plugin-next': specifier: ^15.3.3 - version: 15.5.3 + version: 15.5.5 eslint: specifier: ^9.28.0 - version: 9.36.0 + version: 9.37.0 eslint-config-prettier: specifier: ^9.1.0 - version: 9.1.2(eslint@9.36.0) + version: 9.1.2(eslint@9.37.0) eslint-plugin-only-warn: specifier: ^1.1.0 version: 1.1.0 eslint-plugin-react: specifier: ^7.37.5 - version: 7.37.5(eslint@9.36.0) + version: 7.37.5(eslint@9.37.0) eslint-plugin-react-hooks: specifier: ^5.2.0 - version: 5.2.0(eslint@9.36.0) + version: 5.2.0(eslint@9.37.0) eslint-plugin-turbo: specifier: ^2.5.4 - version: 2.5.6(eslint@9.36.0)(turbo@2.5.6) + version: 2.5.8(eslint@9.37.0)(turbo@2.5.8) globals: specifier: ^15.15.0 version: 15.15.0 @@ -451,7 +473,7 @@ importers: version: 5.8.3 typescript-eslint: specifier: ^8.33.1 - version: 8.44.1(eslint@9.36.0)(typescript@5.8.3) + version: 8.46.1(eslint@9.37.0)(typescript@5.8.3) repo/typescript-config: {} @@ -459,10 +481,10 @@ importers: dependencies: react: specifier: ^19.1.0 - version: 19.1.1 + version: 19.2.0 react-dom: specifier: ^19.1.0 - version: 19.1.1(react@19.1.1) + version: 19.2.0(react@19.2.0) devDependencies: '@repo/eslint-config': specifier: workspace:* @@ -472,10 +494,10 @@ importers: version: link:../typescript-config '@turbo/gen': specifier: ^1.13.4 - version: 1.13.4(@types/node@20.19.17)(typescript@5.5.4) + version: 1.13.4(@types/node@20.19.21)(typescript@5.5.4) '@types/node': specifier: ^20.17.57 - version: 20.19.17 + version: 20.19.21 '@types/react': specifier: 18.3.0 version: 18.3.0 @@ -589,158 +611,158 @@ packages: '@emnapi/runtime@1.5.0': resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} - '@esbuild/aix-ppc64@0.25.10': - resolution: {integrity: sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==} + '@esbuild/aix-ppc64@0.25.11': + resolution: {integrity: sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.10': - resolution: {integrity: sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==} + '@esbuild/android-arm64@0.25.11': + resolution: {integrity: sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.10': - resolution: {integrity: sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==} + '@esbuild/android-arm@0.25.11': + resolution: {integrity: sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.10': - resolution: {integrity: sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==} + '@esbuild/android-x64@0.25.11': + resolution: {integrity: sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.10': - resolution: {integrity: sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==} + '@esbuild/darwin-arm64@0.25.11': + resolution: {integrity: sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.10': - resolution: {integrity: sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==} + '@esbuild/darwin-x64@0.25.11': + resolution: {integrity: sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.10': - resolution: {integrity: sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==} + '@esbuild/freebsd-arm64@0.25.11': + resolution: {integrity: sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.10': - resolution: {integrity: sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==} + '@esbuild/freebsd-x64@0.25.11': + resolution: {integrity: sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.10': - resolution: {integrity: sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==} + '@esbuild/linux-arm64@0.25.11': + resolution: {integrity: sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.10': - resolution: {integrity: sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==} + '@esbuild/linux-arm@0.25.11': + resolution: {integrity: sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.10': - resolution: {integrity: sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==} + '@esbuild/linux-ia32@0.25.11': + resolution: {integrity: sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.10': - resolution: {integrity: sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==} + '@esbuild/linux-loong64@0.25.11': + resolution: {integrity: sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.10': - resolution: {integrity: sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==} + '@esbuild/linux-mips64el@0.25.11': + resolution: {integrity: sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.10': - resolution: {integrity: sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==} + '@esbuild/linux-ppc64@0.25.11': + resolution: {integrity: sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.10': - resolution: {integrity: sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==} + '@esbuild/linux-riscv64@0.25.11': + resolution: {integrity: sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.10': - resolution: {integrity: sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==} + '@esbuild/linux-s390x@0.25.11': + resolution: {integrity: sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.10': - resolution: {integrity: sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==} + '@esbuild/linux-x64@0.25.11': + resolution: {integrity: sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.10': - resolution: {integrity: sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==} + '@esbuild/netbsd-arm64@0.25.11': + resolution: {integrity: sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.10': - resolution: {integrity: sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==} + '@esbuild/netbsd-x64@0.25.11': + resolution: {integrity: sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.10': - resolution: {integrity: sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==} + '@esbuild/openbsd-arm64@0.25.11': + resolution: {integrity: sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.10': - resolution: {integrity: sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==} + '@esbuild/openbsd-x64@0.25.11': + resolution: {integrity: sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.25.10': - resolution: {integrity: sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==} + '@esbuild/openharmony-arm64@0.25.11': + resolution: {integrity: sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.25.10': - resolution: {integrity: sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==} + '@esbuild/sunos-x64@0.25.11': + resolution: {integrity: sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.10': - resolution: {integrity: sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==} + '@esbuild/win32-arm64@0.25.11': + resolution: {integrity: sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.10': - resolution: {integrity: sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==} + '@esbuild/win32-ia32@0.25.11': + resolution: {integrity: sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.10': - resolution: {integrity: sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==} + '@esbuild/win32-x64@0.25.11': + resolution: {integrity: sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -759,28 +781,28 @@ packages: resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/config-helpers@0.3.1': - resolution: {integrity: sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==} + '@eslint/config-helpers@0.4.0': + resolution: {integrity: sha512-WUFvV4WoIwW8Bv0KeKCIIEgdSiFOsulyN0xrMu+7z43q/hkOLXjvb5u7UC9jDxvRzcrbEmuZBX5yJZz1741jog==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.15.2': - resolution: {integrity: sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==} + '@eslint/core@0.16.0': + resolution: {integrity: sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/eslintrc@3.3.1': resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.36.0': - resolution: {integrity: sha512-uhCbYtYynH30iZErszX78U+nR3pJU3RHGQ57NXy5QupD4SBVwDeU8TNBy+MjMngc1UyIW9noKqsRqfjQTBU2dw==} + '@eslint/js@9.37.0': + resolution: {integrity: sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.6': resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.3.5': - resolution: {integrity: sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==} + '@eslint/plugin-kit@0.4.0': + resolution: {integrity: sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@humanfs/core@0.19.1': @@ -972,56 +994,56 @@ packages: '@manypkg/get-packages@1.1.3': resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} - '@next/env@15.5.3': - resolution: {integrity: sha512-RSEDTRqyihYXygx/OJXwvVupfr9m04+0vH8vyy0HfZ7keRto6VX9BbEk0J2PUk0VGy6YhklJUSrgForov5F9pw==} + '@next/env@15.5.5': + resolution: {integrity: sha512-2Zhvss36s/yL+YSxD5ZL5dz5pI6ki1OLxYlh6O77VJ68sBnlUrl5YqhBgCy7FkdMsp9RBeGFwpuDCdpJOqdKeQ==} - '@next/eslint-plugin-next@15.5.3': - resolution: {integrity: sha512-SdhaKdko6dpsSr0DldkESItVrnPYB1NS2NpShCSX5lc7SSQmLZt5Mug6t2xbiuVWEVDLZSuIAoQyYVBYp0dR5g==} + '@next/eslint-plugin-next@15.5.5': + resolution: {integrity: sha512-FMzm412l9oFB8zdRD+K6HQ1VzlS+sNNsdg0MfvTg0i8lfCyTgP/RFxiu/pGJqZ/IQnzn9xSiLkjOVI7Iv4nbdQ==} - '@next/swc-darwin-arm64@15.5.3': - resolution: {integrity: sha512-nzbHQo69+au9wJkGKTU9lP7PXv0d1J5ljFpvb+LnEomLtSbJkbZyEs6sbF3plQmiOB2l9OBtN2tNSvCH1nQ9Jg==} + '@next/swc-darwin-arm64@15.5.5': + resolution: {integrity: sha512-lYExGHuFIHeOxf40mRLWoA84iY2sLELB23BV5FIDHhdJkN1LpRTPc1MDOawgTo5ifbM5dvAwnGuHyNm60G1+jw==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@15.5.3': - resolution: {integrity: sha512-w83w4SkOOhekJOcA5HBvHyGzgV1W/XvOfpkrxIse4uPWhYTTRwtGEM4v/jiXwNSJvfRvah0H8/uTLBKRXlef8g==} + '@next/swc-darwin-x64@15.5.5': + resolution: {integrity: sha512-cacs/WQqa96IhqUm+7CY+z/0j9sW6X80KE07v3IAJuv+z0UNvJtKSlT/T1w1SpaQRa9l0wCYYZlRZUhUOvEVmg==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.5.3': - resolution: {integrity: sha512-+m7pfIs0/yvgVu26ieaKrifV8C8yiLe7jVp9SpcIzg7XmyyNE7toC1fy5IOQozmr6kWl/JONC51osih2RyoXRw==} + '@next/swc-linux-arm64-gnu@15.5.5': + resolution: {integrity: sha512-tLd90SvkRFik6LSfuYjcJEmwqcNEnVYVOyKTacSazya/SLlSwy/VYKsDE4GIzOBd+h3gW+FXqShc2XBavccHCg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.5.3': - resolution: {integrity: sha512-u3PEIzuguSenoZviZJahNLgCexGFhso5mxWCrrIMdvpZn6lkME5vc/ADZG8UUk5K1uWRy4hqSFECrON6UKQBbQ==} + '@next/swc-linux-arm64-musl@15.5.5': + resolution: {integrity: sha512-ekV76G2R/l3nkvylkfy9jBSYHeB4QcJ7LdDseT6INnn1p51bmDS1eGoSoq+RxfQ7B1wt+Qa0pIl5aqcx0GLpbw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@15.5.3': - resolution: {integrity: sha512-lDtOOScYDZxI2BENN9m0pfVPJDSuUkAD1YXSvlJF0DKwZt0WlA7T7o3wrcEr4Q+iHYGzEaVuZcsIbCps4K27sA==} + '@next/swc-linux-x64-gnu@15.5.5': + resolution: {integrity: sha512-tI+sBu+3FmWtqlqD4xKJcj3KJtqbniLombKTE7/UWyyoHmOyAo3aZ7QcEHIOgInXOG1nt0rwh0KGmNbvSB0Djg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.5.3': - resolution: {integrity: sha512-9vWVUnsx9PrY2NwdVRJ4dUURAQ8Su0sLRPqcCCxtX5zIQUBES12eRVHq6b70bbfaVaxIDGJN2afHui0eDm+cLg==} + '@next/swc-linux-x64-musl@15.5.5': + resolution: {integrity: sha512-kDRh+epN/ulroNJLr+toDjN+/JClY5L+OAWjOrrKCI0qcKvTw9GBx7CU/rdA2bgi4WpZN3l0rf/3+b8rduEwrQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@15.5.3': - resolution: {integrity: sha512-1CU20FZzY9LFQigRi6jM45oJMU3KziA5/sSG+dXeVaTm661snQP6xu3ykGxxwU5sLG3sh14teO/IOEPVsQMRfA==} + '@next/swc-win32-arm64-msvc@15.5.5': + resolution: {integrity: sha512-GDgdNPFFqiKjTrmfw01sMMRWhVN5wOCmFzPloxa7ksDfX6TZt62tAK986f0ZYqWpvDFqeBCLAzmgTURvtQBdgw==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@15.5.3': - resolution: {integrity: sha512-JMoLAq3n3y5tKXPQwCK5c+6tmwkuFDa2XAxz8Wm4+IVthdBZdZGh+lmiLUHg9f9IDwIQpUjp+ysd6OkYTyZRZw==} + '@next/swc-win32-x64-msvc@15.5.5': + resolution: {integrity: sha512-5kE3oRJxc7M8RmcTANP8RGoJkaYlwIiDD92gSwCjJY0+j8w8Sl1lvxgQ3bxfHY2KkHFai9tpy/Qx1saWV8eaJQ==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -1038,6 +1060,10 @@ packages: resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} engines: {node: ^14.21.3 || >=16} + '@noble/hashes@1.4.0': + resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} + engines: {node: '>= 16'} + '@noble/hashes@1.8.0': resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} engines: {node: ^14.21.3 || >=16} @@ -1058,113 +1084,113 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@rollup/rollup-android-arm-eabi@4.52.2': - resolution: {integrity: sha512-o3pcKzJgSGt4d74lSZ+OCnHwkKBeAbFDmbEm5gg70eA8VkyCuC/zV9TwBnmw6VjDlRdF4Pshfb+WE9E6XY1PoQ==} + '@rollup/rollup-android-arm-eabi@4.52.4': + resolution: {integrity: sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.52.2': - resolution: {integrity: sha512-cqFSWO5tX2vhC9hJTK8WAiPIm4Q8q/cU8j2HQA0L3E1uXvBYbOZMhE2oFL8n2pKB5sOCHY6bBuHaRwG7TkfJyw==} + '@rollup/rollup-android-arm64@4.52.4': + resolution: {integrity: sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.52.2': - resolution: {integrity: sha512-vngduywkkv8Fkh3wIZf5nFPXzWsNsVu1kvtLETWxTFf/5opZmflgVSeLgdHR56RQh71xhPhWoOkEBvbehwTlVA==} + '@rollup/rollup-darwin-arm64@4.52.4': + resolution: {integrity: sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.52.2': - resolution: {integrity: sha512-h11KikYrUCYTrDj6h939hhMNlqU2fo/X4NB0OZcys3fya49o1hmFaczAiJWVAFgrM1NCP6RrO7lQKeVYSKBPSQ==} + '@rollup/rollup-darwin-x64@4.52.4': + resolution: {integrity: sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.52.2': - resolution: {integrity: sha512-/eg4CI61ZUkLXxMHyVlmlGrSQZ34xqWlZNW43IAU4RmdzWEx0mQJ2mN/Cx4IHLVZFL6UBGAh+/GXhgvGb+nVxw==} + '@rollup/rollup-freebsd-arm64@4.52.4': + resolution: {integrity: sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.52.2': - resolution: {integrity: sha512-QOWgFH5X9+p+S1NAfOqc0z8qEpJIoUHf7OWjNUGOeW18Mx22lAUOiA9b6r2/vpzLdfxi/f+VWsYjUOMCcYh0Ng==} + '@rollup/rollup-freebsd-x64@4.52.4': + resolution: {integrity: sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.52.2': - resolution: {integrity: sha512-kDWSPafToDd8LcBYd1t5jw7bD5Ojcu12S3uT372e5HKPzQt532vW+rGFFOaiR0opxePyUkHrwz8iWYEyH1IIQA==} + '@rollup/rollup-linux-arm-gnueabihf@4.52.4': + resolution: {integrity: sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.52.2': - resolution: {integrity: sha512-gKm7Mk9wCv6/rkzwCiUC4KnevYhlf8ztBrDRT9g/u//1fZLapSRc+eDZj2Eu2wpJ+0RzUKgtNijnVIB4ZxyL+w==} + '@rollup/rollup-linux-arm-musleabihf@4.52.4': + resolution: {integrity: sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.52.2': - resolution: {integrity: sha512-66lA8vnj5mB/rtDNwPgrrKUOtCLVQypkyDa2gMfOefXK6rcZAxKLO9Fy3GkW8VkPnENv9hBkNOFfGLf6rNKGUg==} + '@rollup/rollup-linux-arm64-gnu@4.52.4': + resolution: {integrity: sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.52.2': - resolution: {integrity: sha512-s+OPucLNdJHvuZHuIz2WwncJ+SfWHFEmlC5nKMUgAelUeBUnlB4wt7rXWiyG4Zn07uY2Dd+SGyVa9oyLkVGOjA==} + '@rollup/rollup-linux-arm64-musl@4.52.4': + resolution: {integrity: sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loong64-gnu@4.52.2': - resolution: {integrity: sha512-8wTRM3+gVMDLLDdaT6tKmOE3lJyRy9NpJUS/ZRWmLCmOPIJhVyXwjBo+XbrrwtV33Em1/eCTd5TuGJm4+DmYjw==} + '@rollup/rollup-linux-loong64-gnu@4.52.4': + resolution: {integrity: sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.52.2': - resolution: {integrity: sha512-6yqEfgJ1anIeuP2P/zhtfBlDpXUb80t8DpbYwXQ3bQd95JMvUaqiX+fKqYqUwZXqdJDd8xdilNtsHM2N0cFm6A==} + '@rollup/rollup-linux-ppc64-gnu@4.52.4': + resolution: {integrity: sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.52.2': - resolution: {integrity: sha512-sshYUiYVSEI2B6dp4jMncwxbrUqRdNApF2c3bhtLAU0qA8Lrri0p0NauOsTWh3yCCCDyBOjESHMExonp7Nzc0w==} + '@rollup/rollup-linux-riscv64-gnu@4.52.4': + resolution: {integrity: sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.52.2': - resolution: {integrity: sha512-duBLgd+3pqC4MMwBrKkFxaZerUxZcYApQVC5SdbF5/e/589GwVvlRUnyqMFbM8iUSb1BaoX/3fRL7hB9m2Pj8Q==} + '@rollup/rollup-linux-riscv64-musl@4.52.4': + resolution: {integrity: sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.52.2': - resolution: {integrity: sha512-tzhYJJidDUVGMgVyE+PmxENPHlvvqm1KILjjZhB8/xHYqAGeizh3GBGf9u6WdJpZrz1aCpIIHG0LgJgH9rVjHQ==} + '@rollup/rollup-linux-s390x-gnu@4.52.4': + resolution: {integrity: sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.52.2': - resolution: {integrity: sha512-opH8GSUuVcCSSyHHcl5hELrmnk4waZoVpgn/4FDao9iyE4WpQhyWJ5ryl5M3ocp4qkRuHfyXnGqg8M9oKCEKRA==} + '@rollup/rollup-linux-x64-gnu@4.52.4': + resolution: {integrity: sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.52.2': - resolution: {integrity: sha512-LSeBHnGli1pPKVJ79ZVJgeZWWZXkEe/5o8kcn23M8eMKCUANejchJbF/JqzM4RRjOJfNRhKJk8FuqL1GKjF5oQ==} + '@rollup/rollup-linux-x64-musl@4.52.4': + resolution: {integrity: sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw==} cpu: [x64] os: [linux] - '@rollup/rollup-openharmony-arm64@4.52.2': - resolution: {integrity: sha512-uPj7MQ6/s+/GOpolavm6BPo+6CbhbKYyZHUDvZ/SmJM7pfDBgdGisFX3bY/CBDMg2ZO4utfhlApkSfZ92yXw7Q==} + '@rollup/rollup-openharmony-arm64@4.52.4': + resolution: {integrity: sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.52.2': - resolution: {integrity: sha512-Z9MUCrSgIaUeeHAiNkm3cQyst2UhzjPraR3gYYfOjAuZI7tcFRTOD+4cHLPoS/3qinchth+V56vtqz1Tv+6KPA==} + '@rollup/rollup-win32-arm64-msvc@4.52.4': + resolution: {integrity: sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.52.2': - resolution: {integrity: sha512-+GnYBmpjldD3XQd+HMejo+0gJGwYIOfFeoBQv32xF/RUIvccUz20/V6Otdv+57NE70D5pa8W/jVGDoGq0oON4A==} + '@rollup/rollup-win32-ia32-msvc@4.52.4': + resolution: {integrity: sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.52.2': - resolution: {integrity: sha512-ApXFKluSB6kDQkAqZOKXBjiaqdF1BlKi+/eqnYe9Ee7U2K3pUDKsIyr8EYm/QDHTJIM+4X+lI0gJc3TTRhd+dA==} + '@rollup/rollup-win32-x64-gnu@4.52.4': + resolution: {integrity: sha512-UF9KfsH9yEam0UjTwAgdK0anlQ7c8/pWPU2yVjyWcF1I1thABt6WXE47cI71pGiZ8wGvxohBoLnxM04L/wj8mQ==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.52.2': - resolution: {integrity: sha512-ARz+Bs8kY6FtitYM96PqPEVvPXqEZmPZsSkXvyX19YzDqkCaIlhCieLLMI5hxO9SRZ2XtCtm8wxhy0iJ2jxNfw==} + '@rollup/rollup-win32-x64-msvc@4.52.4': + resolution: {integrity: sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w==} cpu: [x64] os: [win32] @@ -1228,11 +1254,11 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@20.19.17': - resolution: {integrity: sha512-gfehUI8N1z92kygssiuWvLiwcbOB3IRktR6hTDgJlXMYh5OvkPSRmgfoBUmfZt+vhwJtX7v1Yw4KvvAf7c5QKQ==} + '@types/node@20.19.21': + resolution: {integrity: sha512-CsGG2P3I5y48RPMfprQGfy4JPRZ6csfC3ltBZSRItG3ngggmNY/qs2uZKp4p9VbrpqNNSMzUZNFZKzgOGnd/VA==} - '@types/node@22.18.6': - resolution: {integrity: sha512-r8uszLPpeIWbNKtvWRt/DbVi5zbqZyj1PTmhRMqBMvDnaz1QpmSKujUtJLrqGZeoM8v72MfYggDceY4K1itzWQ==} + '@types/node@22.18.10': + resolution: {integrity: sha512-anNG/V/Efn/YZY4pRzbACnKxNKoBng2VTFydVu8RRs5hQjikP8CQfaeAV59VFSCzKNp90mXiVXW2QzV56rwMrg==} '@types/prop-types@15.7.15': resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} @@ -1261,63 +1287,63 @@ packages: '@types/yargs@17.0.33': resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} - '@typescript-eslint/eslint-plugin@8.44.1': - resolution: {integrity: sha512-molgphGqOBT7t4YKCSkbasmu1tb1MgrZ2szGzHbclF7PNmOkSTQVHy+2jXOSnxvR3+Xe1yySHFZoqMpz3TfQsw==} + '@typescript-eslint/eslint-plugin@8.46.1': + resolution: {integrity: sha512-rUsLh8PXmBjdiPY+Emjz9NX2yHvhS11v0SR6xNJkm5GM1MO9ea/1GoDKlHHZGrOJclL/cZ2i/vRUYVtjRhrHVQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.44.1 + '@typescript-eslint/parser': ^8.46.1 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.44.1': - resolution: {integrity: sha512-EHrrEsyhOhxYt8MTg4zTF+DJMuNBzWwgvvOYNj/zm1vnaD/IC5zCXFehZv94Piqa2cRFfXrTFxIvO95L7Qc/cw==} + '@typescript-eslint/parser@8.46.1': + resolution: {integrity: sha512-6JSSaBZmsKvEkbRUkf7Zj7dru/8ZCrJxAqArcLaVMee5907JdtEbKGsZ7zNiIm/UAkpGUkaSMZEXShnN2D1HZA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.44.1': - resolution: {integrity: sha512-ycSa60eGg8GWAkVsKV4E6Nz33h+HjTXbsDT4FILyL8Obk5/mx4tbvCNsLf9zret3ipSumAOG89UcCs/KRaKYrA==} + '@typescript-eslint/project-service@8.46.1': + resolution: {integrity: sha512-FOIaFVMHzRskXr5J4Jp8lFVV0gz5ngv3RHmn+E4HYxSJ3DgDzU7fVI1/M7Ijh1zf6S7HIoaIOtln1H5y8V+9Zg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@8.44.1': - resolution: {integrity: sha512-NdhWHgmynpSvyhchGLXh+w12OMT308Gm25JoRIyTZqEbApiBiQHD/8xgb6LqCWCFcxFtWwaVdFsLPQI3jvhywg==} + '@typescript-eslint/scope-manager@8.46.1': + resolution: {integrity: sha512-weL9Gg3/5F0pVQKiF8eOXFZp8emqWzZsOJuWRUNtHT+UNV2xSJegmpCNQHy37aEQIbToTq7RHKhWvOsmbM680A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.44.1': - resolution: {integrity: sha512-B5OyACouEjuIvof3o86lRMvyDsFwZm+4fBOqFHccIctYgBjqR3qT39FBYGN87khcgf0ExpdCBeGKpKRhSFTjKQ==} + '@typescript-eslint/tsconfig-utils@8.46.1': + resolution: {integrity: sha512-X88+J/CwFvlJB+mK09VFqx5FE4H5cXD+H/Bdza2aEWkSb8hnWIQorNcscRl4IEo1Cz9VI/+/r/jnGWkbWPx54g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.44.1': - resolution: {integrity: sha512-KdEerZqHWXsRNKjF9NYswNISnFzXfXNDfPxoTh7tqohU/PRIbwTmsjGK6V9/RTYWau7NZvfo52lgVk+sJh0K3g==} + '@typescript-eslint/type-utils@8.46.1': + resolution: {integrity: sha512-+BlmiHIiqufBxkVnOtFwjah/vrkF4MtKKvpXrKSPLCkCtAp8H01/VV43sfqA98Od7nJpDcFnkwgyfQbOG0AMvw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@8.44.1': - resolution: {integrity: sha512-Lk7uj7y9uQUOEguiDIDLYLJOrYHQa7oBiURYVFqIpGxclAFQ78f6VUOM8lI2XEuNOKNB7XuvM2+2cMXAoq4ALQ==} + '@typescript-eslint/types@8.46.1': + resolution: {integrity: sha512-C+soprGBHwWBdkDpbaRC4paGBrkIXxVlNohadL5o0kfhsXqOC6GYH2S/Obmig+I0HTDl8wMaRySwrfrXVP8/pQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.44.1': - resolution: {integrity: sha512-qnQJ+mVa7szevdEyvfItbO5Vo+GfZ4/GZWWDRRLjrxYPkhM+6zYB2vRYwCsoJLzqFCdZT4mEqyJoyzkunsZ96A==} + '@typescript-eslint/typescript-estree@8.46.1': + resolution: {integrity: sha512-uIifjT4s8cQKFQ8ZBXXyoUODtRoAd7F7+G8MKmtzj17+1UbdzFl52AzRyZRyKqPHhgzvXunnSckVu36flGy8cg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.44.1': - resolution: {integrity: sha512-DpX5Fp6edTlocMCwA+mHY8Mra+pPjRZ0TfHkXI8QFelIKcbADQz1LUPNtzOFUriBB2UYqw4Pi9+xV4w9ZczHFg==} + '@typescript-eslint/utils@8.46.1': + resolution: {integrity: sha512-vkYUy6LdZS7q1v/Gxb2Zs7zziuXN0wxqsetJdeZdRe/f5dwJFglmuvZBfTUivCtjH725C1jWCDfpadadD95EDQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@8.44.1': - resolution: {integrity: sha512-576+u0QD+Jp3tZzvfRfxon0EA2lzcDt3lhUbsC6Lgzy9x2VR4E+JUiNyGHi5T8vk0TV+fpJ5GLG1JsJuWCaKhw==} + '@typescript-eslint/visitor-keys@8.46.1': + resolution: {integrity: sha512-ptkmIf2iDkNUjdeu2bQqhFPV1m6qTnFFjg7PPDjxKWaMaP0Z6I9l30Jr3g5QqbZGdw8YdYvLp+XnqnWWZOg/NA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@vitest/coverage-v8@3.2.4': @@ -1490,8 +1516,8 @@ packages: resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} engines: {node: '>=4'} - ast-v8-to-istanbul@0.3.5: - resolution: {integrity: sha512-9SdXjNheSiE8bALAQCQQuT6fgQaoxJh7IRYrRGZ8/9nv8WhJeC1aXAwN8TbaOssGOukUvyvnkgD9+Yuykvl1aA==} + ast-v8-to-istanbul@0.3.6: + resolution: {integrity: sha512-9tx1z/7OF/a8EdYL3FKoBhxLf3h3D8fXvuSj0HknsVeli2HE40qbNZxyFhMtnydaRiamwFu9zhb+BsJ5tVPehQ==} async-function@1.0.0: resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} @@ -1562,8 +1588,8 @@ packages: camel-case@3.0.0: resolution: {integrity: sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==} - caniuse-lite@1.0.30001743: - resolution: {integrity: sha512-e6Ojr7RV14Un7dz6ASD0aZDmQPT/A+eZU+nuTNfjqmRrmkmQlnTNWH0SKmqagx9PeW87UVqapSurtAXifmtdmw==} + caniuse-lite@1.0.30001751: + resolution: {integrity: sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==} cbor2@1.12.0: resolution: {integrity: sha512-3Cco8XQhi27DogSp9Ri6LYNZLi/TBY/JVnDe+mj06NkBjW/ZYOtekaEU4wZ4xcRMNrFkDv8KNtOAqHyDfz3lYg==} @@ -1661,8 +1687,8 @@ packages: constant-case@2.0.0: resolution: {integrity: sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ==} - core-js-pure@3.45.1: - resolution: {integrity: sha512-OHnWFKgTUshEU8MK+lOs1H8kC8GkTi9Z1tvNkxrCcw9wl3MJIO7q2ld77wjWn4/xuGrVu2X+nME1iIIPBSdyEQ==} + core-js-pure@3.46.0: + resolution: {integrity: sha512-NMCW30bHNofuhwLhYPt66OLOKTMbOhgTTatKVbaQC3KRHpTCiRIBYvtshr+NBYSnBxwAFhjW/RfJ0XbIjS16rw==} create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} @@ -1737,8 +1763,8 @@ packages: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} - detect-libc@2.1.0: - resolution: {integrity: sha512-vEtk+OcP7VBRtQZ1EJ3bdgzSfBjgnEalLTp5zjJrS+2Z1w2KZly4SBdac/WDU3hhsNAZ9E8SC96ME4Ey8MZ7cg==} + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} diff@4.0.2: @@ -1816,8 +1842,8 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} - esbuild@0.25.10: - resolution: {integrity: sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==} + esbuild@0.25.11: + resolution: {integrity: sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==} engines: {node: '>=18'} hasBin: true @@ -1860,8 +1886,8 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - eslint-plugin-turbo@2.5.6: - resolution: {integrity: sha512-KUDE23aP2JV8zbfZ4TeM1HpAXzMM/AYG/bJam7P4AalUxas8Pd/lS/6R3p4uX91qJcH1LwL4h0ED48nDe8KorQ==} + eslint-plugin-turbo@2.5.8: + resolution: {integrity: sha512-bVjx4vTH0oTKIyQ7EGFAXnuhZMrKIfu17qlex/dps7eScPnGQLJ3r1/nFq80l8xA+8oYjsSirSQ2tXOKbz3kEw==} peerDependencies: eslint: '>6.6.0' turbo: '>2.0.0' @@ -1878,8 +1904,8 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.36.0: - resolution: {integrity: sha512-hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ==} + eslint@9.37.0: + resolution: {integrity: sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -1934,8 +1960,8 @@ packages: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} engines: {node: '>=4'} - fake-indexeddb@6.2.2: - resolution: {integrity: sha512-SGbf7fzjeHz3+12NO1dYigcYn4ivviaeULV5yY5rdGihBvvgwMds4r4UBbNIUMwkze57KTDm32rq3j1Az8mzEw==} + fake-indexeddb@6.2.3: + resolution: {integrity: sha512-idzJXFtDIHNShFZ9ssS8IdsRgAP0t9zwWvSdCKsWK2dgh2xcXA6/2Oteaxar5GJqmwzZXCrKRO6F5IEiR4yJzw==} engines: {node: '>=18'} fast-deep-equal@3.1.3: @@ -2032,6 +2058,10 @@ packages: functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} + get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} @@ -2165,8 +2195,8 @@ packages: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} - human-id@4.1.1: - resolution: {integrity: sha512-3gKm/gCSUipeLsRYZbbdA1BD83lBoWUkZ7G9VFrhWPAU76KwYo5KR8V28bpoPm/ygy0x5/GCbpRQdY7VLYCoIg==} + human-id@4.1.2: + resolution: {integrity: sha512-v/J+4Z/1eIJovEBdlV5TYj1IR+ZiohcYGRY+qN/oC9dAfKzVT023N/Bgw37hrKCoVRBvk3bqyzpr2PP5YeTMSg==} hasBin: true human-signals@2.1.0: @@ -2284,8 +2314,8 @@ packages: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - is-generator-function@1.1.0: - resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} engines: {node: '>= 0.4'} is-glob@4.0.3: @@ -2463,58 +2493,58 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - lefthook-darwin-arm64@1.13.3: - resolution: {integrity: sha512-PtCWi3yOgN50//73GH4xVeTd0WHCQWeHjHezGpPRzllavKo0z/dW4K5dj4ppn1E2nflanHEArrBfKEWHT5Gx0Q==} + lefthook-darwin-arm64@1.13.6: + resolution: {integrity: sha512-m6Lb77VGc84/Qo21Lhq576pEvcgFCnvloEiP02HbAHcIXD0RTLy9u2yAInrixqZeaz13HYtdDaI7OBYAAdVt8A==} cpu: [arm64] os: [darwin] - lefthook-darwin-x64@1.13.3: - resolution: {integrity: sha512-lFSNWEpAP7iS260UtNPiwczq05CYBNAZpzBPE582++MB09aejdveVFDx/Hmur6xobInCCVgwzWTVW92LGIWTXQ==} + lefthook-darwin-x64@1.13.6: + resolution: {integrity: sha512-CoRpdzanu9RK3oXR1vbEJA5LN7iB+c7hP+sONeQJzoOXuq4PNKVtEaN84Gl1BrVtCNLHWFAvCQaZPPiiXSy8qg==} cpu: [x64] os: [darwin] - lefthook-freebsd-arm64@1.13.3: - resolution: {integrity: sha512-LZ3Sj0utBxzsJWmyhHB2nBaFsI4cf/FivE0GtCGcGQZFxizgctqfuruL5oWuA9XOuRpyTICcTO01bS5/ZTMorQ==} + lefthook-freebsd-arm64@1.13.6: + resolution: {integrity: sha512-X4A7yfvAJ68CoHTqP+XvQzdKbyd935sYy0bQT6Ajz7FL1g7hFiro8dqHSdPdkwei9hs8hXeV7feyTXbYmfjKQQ==} cpu: [arm64] os: [freebsd] - lefthook-freebsd-x64@1.13.3: - resolution: {integrity: sha512-TXXrEpRdV86hK3j69jEaZON16kLnrXR/G1UdA2tfeeFN3t2ZejrEyAoSnbW0IrR8dK4pDx6gceTVSWJN2Pk10g==} + lefthook-freebsd-x64@1.13.6: + resolution: {integrity: sha512-ai2m+Sj2kGdY46USfBrCqLKe9GYhzeq01nuyDYCrdGISePeZ6udOlD1k3lQKJGQCHb0bRz4St0r5nKDSh1x/2A==} cpu: [x64] os: [freebsd] - lefthook-linux-arm64@1.13.3: - resolution: {integrity: sha512-iSMQB5G0HlUPimvHx+zGCD0VWhwA+Tc6MpHk9TYzhuQh3FP2ksyxadjSpMn/Q+iwfq6XoEhHyX69esksVI/awg==} + lefthook-linux-arm64@1.13.6: + resolution: {integrity: sha512-cbo4Wtdq81GTABvikLORJsAWPKAJXE8Q5RXsICFUVznh5PHigS9dFW/4NXywo0+jfFPCT6SYds2zz4tCx6DA0Q==} cpu: [arm64] os: [linux] - lefthook-linux-x64@1.13.3: - resolution: {integrity: sha512-3nsNNTW0TnrbZNdKJiuCcy6pRpzX+kfTqsKL7R/JlAqfSWQroMhvIVrcSPazbZAs32U0nDMQ05tkd/lEEKvjTw==} + lefthook-linux-x64@1.13.6: + resolution: {integrity: sha512-uJl9vjCIIBTBvMZkemxCE+3zrZHlRO7Oc+nZJ+o9Oea3fu+W82jwX7a7clw8jqNfaeBS+8+ZEQgiMHWCloTsGw==} cpu: [x64] os: [linux] - lefthook-openbsd-arm64@1.13.3: - resolution: {integrity: sha512-g6pw2l17CF8wTUz+25vXK3xd22DyYp+qEM9acKdT/Hh/OooyOx/fyh134Hghp6cAoeo1ix9w16hmKbQq5QlYZQ==} + lefthook-openbsd-arm64@1.13.6: + resolution: {integrity: sha512-7r153dxrNRQ9ytRs2PmGKKkYdvZYFPre7My7XToSTiRu5jNCq++++eAKVkoyWPduk97dGIA+YWiEr5Noe0TK2A==} cpu: [arm64] os: [openbsd] - lefthook-openbsd-x64@1.13.3: - resolution: {integrity: sha512-rWyErYH3G8A0/o+hzkpc+5ZuiKoanoGS4qjVS6y/Jh5LWqmkVjtEptdkcuYdNEVt9ShNHIys0F7uNCg0V+rZlA==} + lefthook-openbsd-x64@1.13.6: + resolution: {integrity: sha512-Z+UhLlcg1xrXOidK3aLLpgH7KrwNyWYE3yb7ITYnzJSEV8qXnePtVu8lvMBHs/myzemjBzeIr/U/+ipjclR06g==} cpu: [x64] os: [openbsd] - lefthook-windows-arm64@1.13.3: - resolution: {integrity: sha512-xRB+DcvRSdG7+QydDvhJMm//THUpFqOcyfDgy4TuP3B0DhakuOn1K/95kNf9qHj15uLHIK2ceWGqVew2FRXP4w==} + lefthook-windows-arm64@1.13.6: + resolution: {integrity: sha512-Uxef6qoDxCmUNQwk8eBvddYJKSBFglfwAY9Y9+NnnmiHpWTjjYiObE9gT2mvGVpEgZRJVAatBXc+Ha5oDD/OgQ==} cpu: [arm64] os: [win32] - lefthook-windows-x64@1.13.3: - resolution: {integrity: sha512-Or256NzKEg4hjblN8La7cnfqj+POfsiEknUdhcp+4GFUXzE6lhXadEyXKf3X9qZPpV4QZjgfobtdAEgTFUCj6Q==} + lefthook-windows-x64@1.13.6: + resolution: {integrity: sha512-mOZoM3FQh3o08M8PQ/b3IYuL5oo36D9ehczIw1dAgp1Ly+Tr4fJ96A+4SEJrQuYeRD4mex9bR7Ps56I73sBSZA==} cpu: [x64] os: [win32] - lefthook@1.13.3: - resolution: {integrity: sha512-suxG98kRI/a4T2gkdh97o14aTaNr1cKdA2olNaNLz16dy4/J1PahYPm54sqmm/Zhoi1DCV43SUNz6T6bh0Y7Ng==} + lefthook@1.13.6: + resolution: {integrity: sha512-ojj4/4IJ29Xn4drd5emqVgilegAPN3Kf0FQM2p/9+lwSTpU+SZ1v4Ig++NF+9MOa99UKY8bElmVrLhnUUNFh5g==} hasBin: true levn@0.4.1: @@ -2566,8 +2596,8 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.2.1: - resolution: {integrity: sha512-r8LA6i4LP4EeWOhqBaZZjDWwehd1xUJPCJd9Sv300H0ZmcUER4+JPh7bqqZeqs1o5pgtgvXm+d9UGrB5zZGDiQ==} + lru-cache@11.2.2: + resolution: {integrity: sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==} engines: {node: 20 || >=22} lru-cache@7.18.3: @@ -2661,8 +2691,8 @@ packages: resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} engines: {node: '>= 0.4.0'} - next@15.5.3: - resolution: {integrity: sha512-r/liNAx16SQj4D+XH/oI1dlpv9tdKJ6cONYPwwcCC46f2NjpaRWY+EKCzULfgQYV6YKXjHBchff2IZBSlZmJNw==} + next@15.5.5: + resolution: {integrity: sha512-OQVdBPtpBfq7HxFN0kOVb7rXXOSIkt5lTzDJDGRBcOyVvNRIWFauMqi1gIHd1pszq1542vMOGY0HP4CaiALfkA==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: @@ -2884,8 +2914,8 @@ packages: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} - pkijs@3.2.5: - resolution: {integrity: sha512-WX0la7n7CbnguuaIQoT4Fc0IJckPDOUldzOwlZ0nwpOcySS+Six/tXBdc0RX17J5o1To0SAr3xDJjDLsOfDFQA==} + pkijs@3.3.0: + resolution: {integrity: sha512-SVUpr7uqRNuR6w417k0aM8YrHWWhvMh4P0paIA+wWdOxPOLd7PCDZgt3/nooAyrrO1cjwPP2I1hd3h2P6hUQZQ==} engines: {node: '>=12.0.0'} possible-typed-array-names@1.1.0: @@ -2948,16 +2978,16 @@ packages: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true - react-dom@19.1.1: - resolution: {integrity: sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw==} + react-dom@19.2.0: + resolution: {integrity: sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==} peerDependencies: - react: ^19.1.1 + react: ^19.2.0 react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - react@19.1.1: - resolution: {integrity: sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==} + react@19.2.0: + resolution: {integrity: sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==} engines: {node: '>=0.10.0'} read-yaml-file@1.1.0: @@ -3026,8 +3056,8 @@ packages: engines: {node: 20 || >=22} hasBin: true - rollup@4.52.2: - resolution: {integrity: sha512-I25/2QgoROE1vYV+NQ1En9T9UFB9Cmfm2CJ83zZOlaDpvz29wGQSZXWKw7MiNXau7wYgB/T9fVIdIuEQ+KbiiA==} + rollup@4.52.4: + resolution: {integrity: sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -3063,15 +3093,15 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - scheduler@0.26.0: - resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.7.2: - resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} engines: {node: '>=10'} hasBin: true @@ -3175,8 +3205,8 @@ packages: stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - std-env@3.9.0: - resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} stop-iteration-iterator@1.1.0: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} @@ -3236,8 +3266,8 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strip-literal@3.0.0: - resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} + strip-literal@3.1.0: + resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} styled-jsx@5.1.6: resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} @@ -3355,38 +3385,38 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - turbo-darwin-64@2.5.6: - resolution: {integrity: sha512-3C1xEdo4aFwMJAPvtlPqz1Sw/+cddWIOmsalHFMrsqqydcptwBfu26WW2cDm3u93bUzMbBJ8k3zNKFqxJ9ei2A==} + turbo-darwin-64@2.5.8: + resolution: {integrity: sha512-Dh5bCACiHO8rUXZLpKw+m3FiHtAp2CkanSyJre+SInEvEr5kIxjGvCK/8MFX8SFRjQuhjtvpIvYYZJB4AGCxNQ==} cpu: [x64] os: [darwin] - turbo-darwin-arm64@2.5.6: - resolution: {integrity: sha512-LyiG+rD7JhMfYwLqB6k3LZQtYn8CQQUePbpA8mF/hMLPAekXdJo1g0bUPw8RZLwQXUIU/3BU7tXENvhSGz5DPA==} + turbo-darwin-arm64@2.5.8: + resolution: {integrity: sha512-f1H/tQC9px7+hmXn6Kx/w8Jd/FneIUnvLlcI/7RGHunxfOkKJKvsoiNzySkoHQ8uq1pJnhJ0xNGTlYM48ZaJOQ==} cpu: [arm64] os: [darwin] - turbo-linux-64@2.5.6: - resolution: {integrity: sha512-GOcUTT0xiT/pSnHL4YD6Yr3HreUhU8pUcGqcI2ksIF9b2/r/kRHwGFcsHgpG3+vtZF/kwsP0MV8FTlTObxsYIA==} + turbo-linux-64@2.5.8: + resolution: {integrity: sha512-hMyvc7w7yadBlZBGl/bnR6O+dJTx3XkTeyTTH4zEjERO6ChEs0SrN8jTFj1lueNXKIHh1SnALmy6VctKMGnWfw==} cpu: [x64] os: [linux] - turbo-linux-arm64@2.5.6: - resolution: {integrity: sha512-10Tm15bruJEA3m0V7iZcnQBpObGBcOgUcO+sY7/2vk1bweW34LMhkWi8svjV9iDF68+KJDThnYDlYE/bc7/zzQ==} + turbo-linux-arm64@2.5.8: + resolution: {integrity: sha512-LQELGa7bAqV2f+3rTMRPnj5G/OHAe2U+0N9BwsZvfMvHSUbsQ3bBMWdSQaYNicok7wOZcHjz2TkESn1hYK6xIQ==} cpu: [arm64] os: [linux] - turbo-windows-64@2.5.6: - resolution: {integrity: sha512-FyRsVpgaj76It0ludwZsNN40ytHN+17E4PFJyeliBEbxrGTc5BexlXVpufB7XlAaoaZVxbS6KT8RofLfDRyEPg==} + turbo-windows-64@2.5.8: + resolution: {integrity: sha512-3YdcaW34TrN1AWwqgYL9gUqmZsMT4T7g8Y5Azz+uwwEJW+4sgcJkIi9pYFyU4ZBSjBvkfuPZkGgfStir5BBDJQ==} cpu: [x64] os: [win32] - turbo-windows-arm64@2.5.6: - resolution: {integrity: sha512-j/tWu8cMeQ7HPpKri6jvKtyXg9K1gRyhdK4tKrrchH8GNHscPX/F71zax58yYtLRWTiK04zNzPcUJuoS0+v/+Q==} + turbo-windows-arm64@2.5.8: + resolution: {integrity: sha512-eFC5XzLmgXJfnAK3UMTmVECCwuBcORrWdewoiXBnUm934DY6QN8YowC/srhNnROMpaKaqNeRpoB5FxCww3eteQ==} cpu: [arm64] os: [win32] - turbo@2.5.6: - resolution: {integrity: sha512-gxToHmi9oTBNB05UjUsrWf0OyN5ZXtD0apOarC1KIx232Vp3WimRNy3810QzeNSgyD5rsaIDXlxlbnOzlouo+w==} + turbo@2.5.8: + resolution: {integrity: sha512-5c9Fdsr9qfpT3hA0EyYSFRZj1dVVsb6KIWubA9JBYZ/9ZEAijgUEae0BBR/Xl/wekt4w65/lYLTFaP3JmwSO8w==} hasBin: true type-check@0.4.0: @@ -3413,8 +3443,8 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} - typescript-eslint@8.44.1: - resolution: {integrity: sha512-0ws8uWGrUVTjEeN2OM4K1pLKHK/4NiNP/vz6ns+LjT/6sqpaYzIVFajZb1fj/IDwpsrrHb3Jy0Qm5u9CPcKaeg==} + typescript-eslint@8.46.1: + resolution: {integrity: sha512-VHgijW803JafdSsDO8I761r3SHrgk4T00IdyQ+/UsthtgPRsBWQLqoSxOolxTpxRKi1kGXK0bSz4CoAc9ObqJA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -3479,8 +3509,8 @@ packages: resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - viem@2.37.8: - resolution: {integrity: sha512-mL+5yvCQbRIR6QvngDQMfEiZTfNWfd+/QL5yFaOoYbpH3b1Q2ddwF7YG2eI2AcYSh9LE1gtUkbzZLFUAVyj4oQ==} + viem@2.38.2: + resolution: {integrity: sha512-MJDiTDD9gfOT7lPQRimdmw+g46hU/aWJ3loqb+tN6UBOO00XEd0O4LJx+Kp5/uCRnMlJr8zJ1bNzCK7eG6gMjg==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: @@ -3492,8 +3522,8 @@ packages: engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true - vite@7.1.7: - resolution: {integrity: sha512-VbA8ScMvAISJNJVbRDTJdCwqQoAareR/wutevKanhR2/1EkoXVZVkkORaYm/tNVCjP/UDTKtcw3bAkwOUdedmA==} + vite@7.1.10: + resolution: {integrity: sha512-CmuvUBzVJ/e3HGxhg6cYk88NGgTnBoOo7ogtfJJ0fefUWAxN/WDSUa50o+oVBxuIhO8FoEZW0j2eW7sfjs5EtA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -3656,7 +3686,7 @@ snapshots: '@0xsequence/tee-verifier@0.1.2': dependencies: cbor2: 1.12.0 - pkijs: 3.2.5 + pkijs: 3.3.0 '@adraffy/ens-normalize@1.11.1': {} @@ -3675,7 +3705,7 @@ snapshots: '@babel/runtime-corejs3@7.28.4': dependencies: - core-js-pure: 3.45.1 + core-js-pure: 3.46.0 '@babel/runtime@7.28.4': {} @@ -3700,7 +3730,7 @@ snapshots: outdent: 0.5.0 prettier: 2.8.8 resolve-from: 5.0.0 - semver: 7.7.2 + semver: 7.7.3 '@changesets/assemble-release-plan@6.0.9': dependencies: @@ -3709,13 +3739,13 @@ snapshots: '@changesets/should-skip-package': 0.1.2 '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 - semver: 7.7.2 + semver: 7.7.3 '@changesets/changelog-git@0.2.1': dependencies: '@changesets/types': 6.1.0 - '@changesets/cli@2.29.7(@types/node@22.18.6)': + '@changesets/cli@2.29.7(@types/node@22.18.10)': dependencies: '@changesets/apply-release-plan': 7.0.13 '@changesets/assemble-release-plan': 6.0.9 @@ -3731,7 +3761,7 @@ snapshots: '@changesets/should-skip-package': 0.1.2 '@changesets/types': 6.1.0 '@changesets/write': 0.4.0 - '@inquirer/external-editor': 1.0.2(@types/node@22.18.6) + '@inquirer/external-editor': 1.0.2(@types/node@22.18.10) '@manypkg/get-packages': 1.1.3 ansi-colors: 4.1.3 ci-info: 3.9.0 @@ -3742,7 +3772,7 @@ snapshots: package-manager-detector: 0.2.11 picocolors: 1.1.1 resolve-from: 5.0.0 - semver: 7.7.2 + semver: 7.7.3 spawndamnit: 3.0.1 term-size: 2.2.1 transitivePeerDependencies: @@ -3767,7 +3797,7 @@ snapshots: '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 picocolors: 1.1.1 - semver: 7.7.2 + semver: 7.7.3 '@changesets/get-release-plan@4.0.13': dependencies: @@ -3827,7 +3857,7 @@ snapshots: dependencies: '@changesets/types': 6.1.0 fs-extra: 7.0.1 - human-id: 4.1.1 + human-id: 4.1.2 prettier: 2.8.8 '@cspotcode/source-map-support@0.8.1': @@ -3839,87 +3869,87 @@ snapshots: tslib: 2.8.1 optional: true - '@esbuild/aix-ppc64@0.25.10': + '@esbuild/aix-ppc64@0.25.11': optional: true - '@esbuild/android-arm64@0.25.10': + '@esbuild/android-arm64@0.25.11': optional: true - '@esbuild/android-arm@0.25.10': + '@esbuild/android-arm@0.25.11': optional: true - '@esbuild/android-x64@0.25.10': + '@esbuild/android-x64@0.25.11': optional: true - '@esbuild/darwin-arm64@0.25.10': + '@esbuild/darwin-arm64@0.25.11': optional: true - '@esbuild/darwin-x64@0.25.10': + '@esbuild/darwin-x64@0.25.11': optional: true - '@esbuild/freebsd-arm64@0.25.10': + '@esbuild/freebsd-arm64@0.25.11': optional: true - '@esbuild/freebsd-x64@0.25.10': + '@esbuild/freebsd-x64@0.25.11': optional: true - '@esbuild/linux-arm64@0.25.10': + '@esbuild/linux-arm64@0.25.11': optional: true - '@esbuild/linux-arm@0.25.10': + '@esbuild/linux-arm@0.25.11': optional: true - '@esbuild/linux-ia32@0.25.10': + '@esbuild/linux-ia32@0.25.11': optional: true - '@esbuild/linux-loong64@0.25.10': + '@esbuild/linux-loong64@0.25.11': optional: true - '@esbuild/linux-mips64el@0.25.10': + '@esbuild/linux-mips64el@0.25.11': optional: true - '@esbuild/linux-ppc64@0.25.10': + '@esbuild/linux-ppc64@0.25.11': optional: true - '@esbuild/linux-riscv64@0.25.10': + '@esbuild/linux-riscv64@0.25.11': optional: true - '@esbuild/linux-s390x@0.25.10': + '@esbuild/linux-s390x@0.25.11': optional: true - '@esbuild/linux-x64@0.25.10': + '@esbuild/linux-x64@0.25.11': optional: true - '@esbuild/netbsd-arm64@0.25.10': + '@esbuild/netbsd-arm64@0.25.11': optional: true - '@esbuild/netbsd-x64@0.25.10': + '@esbuild/netbsd-x64@0.25.11': optional: true - '@esbuild/openbsd-arm64@0.25.10': + '@esbuild/openbsd-arm64@0.25.11': optional: true - '@esbuild/openbsd-x64@0.25.10': + '@esbuild/openbsd-x64@0.25.11': optional: true - '@esbuild/openharmony-arm64@0.25.10': + '@esbuild/openharmony-arm64@0.25.11': optional: true - '@esbuild/sunos-x64@0.25.10': + '@esbuild/sunos-x64@0.25.11': optional: true - '@esbuild/win32-arm64@0.25.10': + '@esbuild/win32-arm64@0.25.11': optional: true - '@esbuild/win32-ia32@0.25.10': + '@esbuild/win32-ia32@0.25.11': optional: true - '@esbuild/win32-x64@0.25.10': + '@esbuild/win32-x64@0.25.11': optional: true - '@eslint-community/eslint-utils@4.9.0(eslint@9.36.0)': + '@eslint-community/eslint-utils@4.9.0(eslint@9.37.0)': dependencies: - eslint: 9.36.0 + eslint: 9.37.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} @@ -3932,9 +3962,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.3.1': {} + '@eslint/config-helpers@0.4.0': + dependencies: + '@eslint/core': 0.16.0 - '@eslint/core@0.15.2': + '@eslint/core@0.16.0': dependencies: '@types/json-schema': 7.0.15 @@ -3952,13 +3984,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.36.0': {} + '@eslint/js@9.37.0': {} '@eslint/object-schema@2.1.6': {} - '@eslint/plugin-kit@0.3.5': + '@eslint/plugin-kit@0.4.0': dependencies: - '@eslint/core': 0.15.2 + '@eslint/core': 0.16.0 levn: 0.4.1 '@humanfs/core@0.19.1': {} @@ -4061,19 +4093,19 @@ snapshots: '@img/sharp-win32-x64@0.34.4': optional: true - '@inquirer/external-editor@1.0.2(@types/node@20.19.17)': + '@inquirer/external-editor@1.0.2(@types/node@20.19.21)': dependencies: chardet: 2.1.0 iconv-lite: 0.7.0 optionalDependencies: - '@types/node': 20.19.17 + '@types/node': 20.19.21 - '@inquirer/external-editor@1.0.2(@types/node@22.18.6)': + '@inquirer/external-editor@1.0.2(@types/node@22.18.10)': dependencies: chardet: 2.1.0 iconv-lite: 0.7.0 optionalDependencies: - '@types/node': 22.18.6 + '@types/node': 22.18.10 '@isaacs/balanced-match@4.0.1': {} @@ -4127,34 +4159,34 @@ snapshots: globby: 11.1.0 read-yaml-file: 1.1.0 - '@next/env@15.5.3': {} + '@next/env@15.5.5': {} - '@next/eslint-plugin-next@15.5.3': + '@next/eslint-plugin-next@15.5.5': dependencies: fast-glob: 3.3.1 - '@next/swc-darwin-arm64@15.5.3': + '@next/swc-darwin-arm64@15.5.5': optional: true - '@next/swc-darwin-x64@15.5.3': + '@next/swc-darwin-x64@15.5.5': optional: true - '@next/swc-linux-arm64-gnu@15.5.3': + '@next/swc-linux-arm64-gnu@15.5.5': optional: true - '@next/swc-linux-arm64-musl@15.5.3': + '@next/swc-linux-arm64-musl@15.5.5': optional: true - '@next/swc-linux-x64-gnu@15.5.3': + '@next/swc-linux-x64-gnu@15.5.5': optional: true - '@next/swc-linux-x64-musl@15.5.3': + '@next/swc-linux-x64-musl@15.5.5': optional: true - '@next/swc-win32-arm64-msvc@15.5.3': + '@next/swc-win32-arm64-msvc@15.5.5': optional: true - '@next/swc-win32-x64-msvc@15.5.3': + '@next/swc-win32-x64-msvc@15.5.5': optional: true '@noble/ciphers@1.3.0': {} @@ -4167,6 +4199,8 @@ snapshots: dependencies: '@noble/hashes': 1.8.0 + '@noble/hashes@1.4.0': {} + '@noble/hashes@1.8.0': {} '@nodelib/fs.scandir@2.1.5': @@ -4184,77 +4218,77 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@rollup/rollup-android-arm-eabi@4.52.2': + '@rollup/rollup-android-arm-eabi@4.52.4': optional: true - '@rollup/rollup-android-arm64@4.52.2': + '@rollup/rollup-android-arm64@4.52.4': optional: true - '@rollup/rollup-darwin-arm64@4.52.2': + '@rollup/rollup-darwin-arm64@4.52.4': optional: true - '@rollup/rollup-darwin-x64@4.52.2': + '@rollup/rollup-darwin-x64@4.52.4': optional: true - '@rollup/rollup-freebsd-arm64@4.52.2': + '@rollup/rollup-freebsd-arm64@4.52.4': optional: true - '@rollup/rollup-freebsd-x64@4.52.2': + '@rollup/rollup-freebsd-x64@4.52.4': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.52.2': + '@rollup/rollup-linux-arm-gnueabihf@4.52.4': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.52.2': + '@rollup/rollup-linux-arm-musleabihf@4.52.4': optional: true - '@rollup/rollup-linux-arm64-gnu@4.52.2': + '@rollup/rollup-linux-arm64-gnu@4.52.4': optional: true - '@rollup/rollup-linux-arm64-musl@4.52.2': + '@rollup/rollup-linux-arm64-musl@4.52.4': optional: true - '@rollup/rollup-linux-loong64-gnu@4.52.2': + '@rollup/rollup-linux-loong64-gnu@4.52.4': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.52.2': + '@rollup/rollup-linux-ppc64-gnu@4.52.4': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.52.2': + '@rollup/rollup-linux-riscv64-gnu@4.52.4': optional: true - '@rollup/rollup-linux-riscv64-musl@4.52.2': + '@rollup/rollup-linux-riscv64-musl@4.52.4': optional: true - '@rollup/rollup-linux-s390x-gnu@4.52.2': + '@rollup/rollup-linux-s390x-gnu@4.52.4': optional: true - '@rollup/rollup-linux-x64-gnu@4.52.2': + '@rollup/rollup-linux-x64-gnu@4.52.4': optional: true - '@rollup/rollup-linux-x64-musl@4.52.2': + '@rollup/rollup-linux-x64-musl@4.52.4': optional: true - '@rollup/rollup-openharmony-arm64@4.52.2': + '@rollup/rollup-openharmony-arm64@4.52.4': optional: true - '@rollup/rollup-win32-arm64-msvc@4.52.2': + '@rollup/rollup-win32-arm64-msvc@4.52.4': optional: true - '@rollup/rollup-win32-ia32-msvc@4.52.2': + '@rollup/rollup-win32-ia32-msvc@4.52.4': optional: true - '@rollup/rollup-win32-x64-gnu@4.52.2': + '@rollup/rollup-win32-x64-gnu@4.52.4': optional: true - '@rollup/rollup-win32-x64-msvc@4.52.2': + '@rollup/rollup-win32-x64-msvc@4.52.4': optional: true '@scure/base@1.2.6': {} '@scure/bip32@1.7.0': dependencies: - '@noble/curves': 1.9.7 + '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 '@scure/base': 1.2.6 @@ -4277,17 +4311,17 @@ snapshots: '@tsconfig/node16@1.0.4': {} - '@turbo/gen@1.13.4(@types/node@20.19.17)(typescript@5.5.4)': + '@turbo/gen@1.13.4(@types/node@20.19.21)(typescript@5.5.4)': dependencies: - '@turbo/workspaces': 1.13.4(@types/node@20.19.17) + '@turbo/workspaces': 1.13.4(@types/node@20.19.21) chalk: 2.4.2 commander: 10.0.1 fs-extra: 10.1.0 - inquirer: 8.2.7(@types/node@20.19.17) + inquirer: 8.2.7(@types/node@20.19.21) minimatch: 9.0.5 node-plop: 0.26.3 proxy-agent: 6.5.0 - ts-node: 10.9.2(@types/node@20.19.17)(typescript@5.5.4) + ts-node: 10.9.2(@types/node@20.19.21)(typescript@5.5.4) update-check: 1.5.4 validate-npm-package-name: 5.0.1 transitivePeerDependencies: @@ -4297,7 +4331,7 @@ snapshots: - supports-color - typescript - '@turbo/workspaces@1.13.4(@types/node@20.19.17)': + '@turbo/workspaces@1.13.4(@types/node@20.19.21)': dependencies: chalk: 2.4.2 commander: 10.0.1 @@ -4305,11 +4339,11 @@ snapshots: fast-glob: 3.3.3 fs-extra: 10.1.0 gradient-string: 2.0.2 - inquirer: 8.2.7(@types/node@20.19.17) + inquirer: 8.2.7(@types/node@20.19.21) js-yaml: 4.1.0 ora: 4.1.1 rimraf: 3.0.2 - semver: 7.7.2 + semver: 7.7.3 update-check: 1.5.4 transitivePeerDependencies: - '@types/node' @@ -4325,7 +4359,7 @@ snapshots: '@types/glob@7.2.0': dependencies: '@types/minimatch': 6.0.0 - '@types/node': 20.19.17 + '@types/node': 20.19.21 '@types/inquirer@6.5.0': dependencies: @@ -4340,11 +4374,11 @@ snapshots: '@types/node@12.20.55': {} - '@types/node@20.19.17': + '@types/node@20.19.21': dependencies: undici-types: 6.21.0 - '@types/node@22.18.6': + '@types/node@22.18.10': dependencies: undici-types: 6.21.0 @@ -4370,7 +4404,7 @@ snapshots: '@types/through@0.0.33': dependencies: - '@types/node': 20.19.17 + '@types/node': 20.19.21 '@types/tinycolor2@1.4.6': {} @@ -4380,15 +4414,15 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@8.44.1(@typescript-eslint/parser@8.44.1(eslint@9.36.0)(typescript@5.8.3))(eslint@9.36.0)(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.46.1(@typescript-eslint/parser@8.46.1(eslint@9.37.0)(typescript@5.8.3))(eslint@9.37.0)(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.44.1(eslint@9.36.0)(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.44.1 - '@typescript-eslint/type-utils': 8.44.1(eslint@9.36.0)(typescript@5.8.3) - '@typescript-eslint/utils': 8.44.1(eslint@9.36.0)(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.44.1 - eslint: 9.36.0 + '@typescript-eslint/parser': 8.46.1(eslint@9.37.0)(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.46.1 + '@typescript-eslint/type-utils': 8.46.1(eslint@9.37.0)(typescript@5.8.3) + '@typescript-eslint/utils': 8.46.1(eslint@9.37.0)(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.46.1 + eslint: 9.37.0 graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 @@ -4397,87 +4431,87 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.44.1(eslint@9.36.0)(typescript@5.8.3)': + '@typescript-eslint/parser@8.46.1(eslint@9.37.0)(typescript@5.8.3)': dependencies: - '@typescript-eslint/scope-manager': 8.44.1 - '@typescript-eslint/types': 8.44.1 - '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.44.1 + '@typescript-eslint/scope-manager': 8.46.1 + '@typescript-eslint/types': 8.46.1 + '@typescript-eslint/typescript-estree': 8.46.1(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.46.1 debug: 4.4.3(supports-color@5.5.0) - eslint: 9.36.0 + eslint: 9.37.0 typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.44.1(typescript@5.8.3)': + '@typescript-eslint/project-service@8.46.1(typescript@5.8.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.44.1(typescript@5.8.3) - '@typescript-eslint/types': 8.44.1 + '@typescript-eslint/tsconfig-utils': 8.46.1(typescript@5.8.3) + '@typescript-eslint/types': 8.46.1 debug: 4.4.3(supports-color@5.5.0) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.44.1': + '@typescript-eslint/scope-manager@8.46.1': dependencies: - '@typescript-eslint/types': 8.44.1 - '@typescript-eslint/visitor-keys': 8.44.1 + '@typescript-eslint/types': 8.46.1 + '@typescript-eslint/visitor-keys': 8.46.1 - '@typescript-eslint/tsconfig-utils@8.44.1(typescript@5.8.3)': + '@typescript-eslint/tsconfig-utils@8.46.1(typescript@5.8.3)': dependencies: typescript: 5.8.3 - '@typescript-eslint/type-utils@8.44.1(eslint@9.36.0)(typescript@5.8.3)': + '@typescript-eslint/type-utils@8.46.1(eslint@9.37.0)(typescript@5.8.3)': dependencies: - '@typescript-eslint/types': 8.44.1 - '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.8.3) - '@typescript-eslint/utils': 8.44.1(eslint@9.36.0)(typescript@5.8.3) + '@typescript-eslint/types': 8.46.1 + '@typescript-eslint/typescript-estree': 8.46.1(typescript@5.8.3) + '@typescript-eslint/utils': 8.46.1(eslint@9.37.0)(typescript@5.8.3) debug: 4.4.3(supports-color@5.5.0) - eslint: 9.36.0 + eslint: 9.37.0 ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.44.1': {} + '@typescript-eslint/types@8.46.1': {} - '@typescript-eslint/typescript-estree@8.44.1(typescript@5.8.3)': + '@typescript-eslint/typescript-estree@8.46.1(typescript@5.8.3)': dependencies: - '@typescript-eslint/project-service': 8.44.1(typescript@5.8.3) - '@typescript-eslint/tsconfig-utils': 8.44.1(typescript@5.8.3) - '@typescript-eslint/types': 8.44.1 - '@typescript-eslint/visitor-keys': 8.44.1 + '@typescript-eslint/project-service': 8.46.1(typescript@5.8.3) + '@typescript-eslint/tsconfig-utils': 8.46.1(typescript@5.8.3) + '@typescript-eslint/types': 8.46.1 + '@typescript-eslint/visitor-keys': 8.46.1 debug: 4.4.3(supports-color@5.5.0) fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.2 + semver: 7.7.3 ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.44.1(eslint@9.36.0)(typescript@5.8.3)': + '@typescript-eslint/utils@8.46.1(eslint@9.37.0)(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0) - '@typescript-eslint/scope-manager': 8.44.1 - '@typescript-eslint/types': 8.44.1 - '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.8.3) - eslint: 9.36.0 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.37.0) + '@typescript-eslint/scope-manager': 8.46.1 + '@typescript-eslint/types': 8.46.1 + '@typescript-eslint/typescript-estree': 8.46.1(typescript@5.8.3) + eslint: 9.37.0 typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.44.1': + '@typescript-eslint/visitor-keys@8.46.1': dependencies: - '@typescript-eslint/types': 8.44.1 + '@typescript-eslint/types': 8.46.1 eslint-visitor-keys: 4.2.1 - '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/node@22.18.6)(happy-dom@17.6.3))': + '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/node@22.18.10)(happy-dom@17.6.3))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 - ast-v8-to-istanbul: 0.3.5 + ast-v8-to-istanbul: 0.3.6 debug: 4.4.3(supports-color@5.5.0) istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 @@ -4485,10 +4519,10 @@ snapshots: istanbul-reports: 3.2.0 magic-string: 0.30.19 magicast: 0.3.5 - std-env: 3.9.0 + std-env: 3.10.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/node@22.18.6)(happy-dom@17.6.3) + vitest: 3.2.4(@types/node@22.18.10)(happy-dom@17.6.3) transitivePeerDependencies: - supports-color @@ -4500,13 +4534,13 @@ snapshots: chai: 5.3.3 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@7.1.7(@types/node@22.18.6))': + '@vitest/mocker@3.2.4(vite@7.1.10(@types/node@22.18.10))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.19 optionalDependencies: - vite: 7.1.7(@types/node@22.18.6) + vite: 7.1.10(@types/node@22.18.10) '@vitest/pretty-format@3.2.4': dependencies: @@ -4516,7 +4550,7 @@ snapshots: dependencies: '@vitest/utils': 3.2.4 pathe: 2.0.3 - strip-literal: 3.0.0 + strip-literal: 3.1.0 '@vitest/snapshot@3.2.4': dependencies: @@ -4670,7 +4704,7 @@ snapshots: dependencies: tslib: 2.8.1 - ast-v8-to-istanbul@0.3.5: + ast-v8-to-istanbul@0.3.6: dependencies: '@jridgewell/trace-mapping': 0.3.31 estree-walker: 3.0.3 @@ -4746,7 +4780,7 @@ snapshots: no-case: 2.3.2 upper-case: 1.1.3 - caniuse-lite@1.0.30001743: {} + caniuse-lite@1.0.30001751: {} cbor2@1.12.0: {} @@ -4868,7 +4902,7 @@ snapshots: snake-case: 2.1.0 upper-case: 1.1.3 - core-js-pure@3.45.1: {} + core-js-pure@3.46.0: {} create-require@1.1.1: {} @@ -4951,7 +4985,7 @@ snapshots: detect-indent@6.1.0: {} - detect-libc@2.1.0: + detect-libc@2.1.2: optional: true diff@4.0.2: {} @@ -5092,34 +5126,34 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - esbuild@0.25.10: + esbuild@0.25.11: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.10 - '@esbuild/android-arm': 0.25.10 - '@esbuild/android-arm64': 0.25.10 - '@esbuild/android-x64': 0.25.10 - '@esbuild/darwin-arm64': 0.25.10 - '@esbuild/darwin-x64': 0.25.10 - '@esbuild/freebsd-arm64': 0.25.10 - '@esbuild/freebsd-x64': 0.25.10 - '@esbuild/linux-arm': 0.25.10 - '@esbuild/linux-arm64': 0.25.10 - '@esbuild/linux-ia32': 0.25.10 - '@esbuild/linux-loong64': 0.25.10 - '@esbuild/linux-mips64el': 0.25.10 - '@esbuild/linux-ppc64': 0.25.10 - '@esbuild/linux-riscv64': 0.25.10 - '@esbuild/linux-s390x': 0.25.10 - '@esbuild/linux-x64': 0.25.10 - '@esbuild/netbsd-arm64': 0.25.10 - '@esbuild/netbsd-x64': 0.25.10 - '@esbuild/openbsd-arm64': 0.25.10 - '@esbuild/openbsd-x64': 0.25.10 - '@esbuild/openharmony-arm64': 0.25.10 - '@esbuild/sunos-x64': 0.25.10 - '@esbuild/win32-arm64': 0.25.10 - '@esbuild/win32-ia32': 0.25.10 - '@esbuild/win32-x64': 0.25.10 + '@esbuild/aix-ppc64': 0.25.11 + '@esbuild/android-arm': 0.25.11 + '@esbuild/android-arm64': 0.25.11 + '@esbuild/android-x64': 0.25.11 + '@esbuild/darwin-arm64': 0.25.11 + '@esbuild/darwin-x64': 0.25.11 + '@esbuild/freebsd-arm64': 0.25.11 + '@esbuild/freebsd-x64': 0.25.11 + '@esbuild/linux-arm': 0.25.11 + '@esbuild/linux-arm64': 0.25.11 + '@esbuild/linux-ia32': 0.25.11 + '@esbuild/linux-loong64': 0.25.11 + '@esbuild/linux-mips64el': 0.25.11 + '@esbuild/linux-ppc64': 0.25.11 + '@esbuild/linux-riscv64': 0.25.11 + '@esbuild/linux-s390x': 0.25.11 + '@esbuild/linux-x64': 0.25.11 + '@esbuild/netbsd-arm64': 0.25.11 + '@esbuild/netbsd-x64': 0.25.11 + '@esbuild/openbsd-arm64': 0.25.11 + '@esbuild/openbsd-x64': 0.25.11 + '@esbuild/openharmony-arm64': 0.25.11 + '@esbuild/sunos-x64': 0.25.11 + '@esbuild/win32-arm64': 0.25.11 + '@esbuild/win32-ia32': 0.25.11 + '@esbuild/win32-x64': 0.25.11 escalade@3.2.0: {} @@ -5135,17 +5169,17 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-prettier@9.1.2(eslint@9.36.0): + eslint-config-prettier@9.1.2(eslint@9.37.0): dependencies: - eslint: 9.36.0 + eslint: 9.37.0 eslint-plugin-only-warn@1.1.0: {} - eslint-plugin-react-hooks@5.2.0(eslint@9.36.0): + eslint-plugin-react-hooks@5.2.0(eslint@9.37.0): dependencies: - eslint: 9.36.0 + eslint: 9.37.0 - eslint-plugin-react@7.37.5(eslint@9.36.0): + eslint-plugin-react@7.37.5(eslint@9.37.0): dependencies: array-includes: 3.1.9 array.prototype.findlast: 1.2.5 @@ -5153,7 +5187,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.36.0 + eslint: 9.37.0 estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -5167,11 +5201,11 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-turbo@2.5.6(eslint@9.36.0)(turbo@2.5.6): + eslint-plugin-turbo@2.5.8(eslint@9.37.0)(turbo@2.5.8): dependencies: dotenv: 16.0.3 - eslint: 9.36.0 - turbo: 2.5.6 + eslint: 9.37.0 + turbo: 2.5.8 eslint-scope@8.4.0: dependencies: @@ -5182,16 +5216,16 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.36.0: + eslint@9.37.0: dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.37.0) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.21.0 - '@eslint/config-helpers': 0.3.1 - '@eslint/core': 0.15.2 + '@eslint/config-helpers': 0.4.0 + '@eslint/core': 0.16.0 '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.36.0 - '@eslint/plugin-kit': 0.3.5 + '@eslint/js': 9.37.0 + '@eslint/plugin-kit': 0.4.0 '@humanfs/node': 0.16.7 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 @@ -5270,7 +5304,7 @@ snapshots: iconv-lite: 0.4.24 tmp: 0.0.33 - fake-indexeddb@6.2.2: {} + fake-indexeddb@6.2.3: {} fast-deep-equal@3.1.3: {} @@ -5376,6 +5410,8 @@ snapshots: functions-have-names@1.2.3: {} + generator-function@2.0.1: {} + get-caller-file@2.0.5: {} get-intrinsic@1.3.0: @@ -5546,7 +5582,7 @@ snapshots: transitivePeerDependencies: - supports-color - human-id@4.1.1: {} + human-id@4.1.2: {} human-signals@2.1.0: {} @@ -5602,9 +5638,9 @@ snapshots: strip-ansi: 6.0.1 through: 2.3.8 - inquirer@8.2.7(@types/node@20.19.17): + inquirer@8.2.7(@types/node@20.19.21): dependencies: - '@inquirer/external-editor': 1.0.2(@types/node@20.19.17) + '@inquirer/external-editor': 1.0.2(@types/node@20.19.21) ansi-escapes: 4.3.2 chalk: 4.1.2 cli-cursor: 3.1.0 @@ -5682,9 +5718,10 @@ snapshots: is-fullwidth-code-point@3.0.0: {} - is-generator-function@1.1.0: + is-generator-function@1.1.2: dependencies: call-bound: 1.0.4 + generator-function: 2.0.1 get-proto: 1.0.1 has-tostringtag: 1.0.2 safe-regex-test: 1.1.0 @@ -5861,48 +5898,48 @@ snapshots: dependencies: json-buffer: 3.0.1 - lefthook-darwin-arm64@1.13.3: + lefthook-darwin-arm64@1.13.6: optional: true - lefthook-darwin-x64@1.13.3: + lefthook-darwin-x64@1.13.6: optional: true - lefthook-freebsd-arm64@1.13.3: + lefthook-freebsd-arm64@1.13.6: optional: true - lefthook-freebsd-x64@1.13.3: + lefthook-freebsd-x64@1.13.6: optional: true - lefthook-linux-arm64@1.13.3: + lefthook-linux-arm64@1.13.6: optional: true - lefthook-linux-x64@1.13.3: + lefthook-linux-x64@1.13.6: optional: true - lefthook-openbsd-arm64@1.13.3: + lefthook-openbsd-arm64@1.13.6: optional: true - lefthook-openbsd-x64@1.13.3: + lefthook-openbsd-x64@1.13.6: optional: true - lefthook-windows-arm64@1.13.3: + lefthook-windows-arm64@1.13.6: optional: true - lefthook-windows-x64@1.13.3: + lefthook-windows-x64@1.13.6: optional: true - lefthook@1.13.3: + lefthook@1.13.6: optionalDependencies: - lefthook-darwin-arm64: 1.13.3 - lefthook-darwin-x64: 1.13.3 - lefthook-freebsd-arm64: 1.13.3 - lefthook-freebsd-x64: 1.13.3 - lefthook-linux-arm64: 1.13.3 - lefthook-linux-x64: 1.13.3 - lefthook-openbsd-arm64: 1.13.3 - lefthook-openbsd-x64: 1.13.3 - lefthook-windows-arm64: 1.13.3 - lefthook-windows-x64: 1.13.3 + lefthook-darwin-arm64: 1.13.6 + lefthook-darwin-x64: 1.13.6 + lefthook-freebsd-arm64: 1.13.6 + lefthook-freebsd-x64: 1.13.6 + lefthook-linux-arm64: 1.13.6 + lefthook-linux-x64: 1.13.6 + lefthook-openbsd-arm64: 1.13.6 + lefthook-openbsd-x64: 1.13.6 + lefthook-windows-arm64: 1.13.6 + lefthook-windows-x64: 1.13.6 levn@0.4.1: dependencies: @@ -5948,7 +5985,7 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@11.2.1: {} + lru-cache@11.2.2: {} lru-cache@7.18.3: {} @@ -5964,7 +6001,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.7.2 + semver: 7.7.3 make-error@1.3.6: {} @@ -6019,24 +6056,24 @@ snapshots: netmask@2.0.2: {} - next@15.5.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + next@15.5.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: - '@next/env': 15.5.3 + '@next/env': 15.5.5 '@swc/helpers': 0.5.15 - caniuse-lite: 1.0.30001743 + caniuse-lite: 1.0.30001751 postcss: 8.4.31 - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) - styled-jsx: 5.1.6(react@19.1.1) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + styled-jsx: 5.1.6(react@19.2.0) optionalDependencies: - '@next/swc-darwin-arm64': 15.5.3 - '@next/swc-darwin-x64': 15.5.3 - '@next/swc-linux-arm64-gnu': 15.5.3 - '@next/swc-linux-arm64-musl': 15.5.3 - '@next/swc-linux-x64-gnu': 15.5.3 - '@next/swc-linux-x64-musl': 15.5.3 - '@next/swc-win32-arm64-msvc': 15.5.3 - '@next/swc-win32-x64-msvc': 15.5.3 + '@next/swc-darwin-arm64': 15.5.5 + '@next/swc-darwin-x64': 15.5.5 + '@next/swc-linux-arm64-gnu': 15.5.5 + '@next/swc-linux-arm64-musl': 15.5.5 + '@next/swc-linux-x64-gnu': 15.5.5 + '@next/swc-linux-x64-musl': 15.5.5 + '@next/swc-win32-arm64-msvc': 15.5.5 + '@next/swc-win32-x64-msvc': 15.5.5 sharp: 0.34.4 transitivePeerDependencies: - '@babel/core' @@ -6067,7 +6104,7 @@ snapshots: ignore-by-default: 1.0.1 minimatch: 3.1.2 pstree.remy: 1.1.8 - semver: 7.7.2 + semver: 7.7.3 simple-update-notifier: 2.0.0 supports-color: 5.5.0 touch: 3.1.1 @@ -6279,7 +6316,7 @@ snapshots: path-scurry@2.0.0: dependencies: - lru-cache: 11.2.1 + lru-cache: 11.2.2 minipass: 7.1.2 path-type@4.0.0: {} @@ -6296,9 +6333,9 @@ snapshots: pify@4.0.1: {} - pkijs@3.2.5: + pkijs@3.3.0: dependencies: - '@noble/hashes': 1.8.0 + '@noble/hashes': 1.4.0 asn1js: 3.0.6 bytestreamjs: 2.0.1 pvtsutils: 1.3.6 @@ -6367,14 +6404,14 @@ snapshots: minimist: 1.2.8 strip-json-comments: 2.0.1 - react-dom@19.1.1(react@19.1.1): + react-dom@19.2.0(react@19.2.0): dependencies: - react: 19.1.1 - scheduler: 0.26.0 + react: 19.2.0 + scheduler: 0.27.0 react-is@16.13.1: {} - react@19.1.1: {} + react@19.2.0: {} read-yaml-file@1.1.0: dependencies: @@ -6456,32 +6493,32 @@ snapshots: glob: 11.0.3 package-json-from-dist: 1.0.1 - rollup@4.52.2: + rollup@4.52.4: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.52.2 - '@rollup/rollup-android-arm64': 4.52.2 - '@rollup/rollup-darwin-arm64': 4.52.2 - '@rollup/rollup-darwin-x64': 4.52.2 - '@rollup/rollup-freebsd-arm64': 4.52.2 - '@rollup/rollup-freebsd-x64': 4.52.2 - '@rollup/rollup-linux-arm-gnueabihf': 4.52.2 - '@rollup/rollup-linux-arm-musleabihf': 4.52.2 - '@rollup/rollup-linux-arm64-gnu': 4.52.2 - '@rollup/rollup-linux-arm64-musl': 4.52.2 - '@rollup/rollup-linux-loong64-gnu': 4.52.2 - '@rollup/rollup-linux-ppc64-gnu': 4.52.2 - '@rollup/rollup-linux-riscv64-gnu': 4.52.2 - '@rollup/rollup-linux-riscv64-musl': 4.52.2 - '@rollup/rollup-linux-s390x-gnu': 4.52.2 - '@rollup/rollup-linux-x64-gnu': 4.52.2 - '@rollup/rollup-linux-x64-musl': 4.52.2 - '@rollup/rollup-openharmony-arm64': 4.52.2 - '@rollup/rollup-win32-arm64-msvc': 4.52.2 - '@rollup/rollup-win32-ia32-msvc': 4.52.2 - '@rollup/rollup-win32-x64-gnu': 4.52.2 - '@rollup/rollup-win32-x64-msvc': 4.52.2 + '@rollup/rollup-android-arm-eabi': 4.52.4 + '@rollup/rollup-android-arm64': 4.52.4 + '@rollup/rollup-darwin-arm64': 4.52.4 + '@rollup/rollup-darwin-x64': 4.52.4 + '@rollup/rollup-freebsd-arm64': 4.52.4 + '@rollup/rollup-freebsd-x64': 4.52.4 + '@rollup/rollup-linux-arm-gnueabihf': 4.52.4 + '@rollup/rollup-linux-arm-musleabihf': 4.52.4 + '@rollup/rollup-linux-arm64-gnu': 4.52.4 + '@rollup/rollup-linux-arm64-musl': 4.52.4 + '@rollup/rollup-linux-loong64-gnu': 4.52.4 + '@rollup/rollup-linux-ppc64-gnu': 4.52.4 + '@rollup/rollup-linux-riscv64-gnu': 4.52.4 + '@rollup/rollup-linux-riscv64-musl': 4.52.4 + '@rollup/rollup-linux-s390x-gnu': 4.52.4 + '@rollup/rollup-linux-x64-gnu': 4.52.4 + '@rollup/rollup-linux-x64-musl': 4.52.4 + '@rollup/rollup-openharmony-arm64': 4.52.4 + '@rollup/rollup-win32-arm64-msvc': 4.52.4 + '@rollup/rollup-win32-ia32-msvc': 4.52.4 + '@rollup/rollup-win32-x64-gnu': 4.52.4 + '@rollup/rollup-win32-x64-msvc': 4.52.4 fsevents: 2.3.3 run-async@2.4.1: {} @@ -6521,11 +6558,11 @@ snapshots: safer-buffer@2.1.2: {} - scheduler@0.26.0: {} + scheduler@0.27.0: {} semver@6.3.1: {} - semver@7.7.2: {} + semver@7.7.3: {} sentence-case@2.1.1: dependencies: @@ -6557,8 +6594,8 @@ snapshots: sharp@0.34.4: dependencies: '@img/colour': 1.0.0 - detect-libc: 2.1.0 - semver: 7.7.2 + detect-libc: 2.1.2 + semver: 7.7.3 optionalDependencies: '@img/sharp-darwin-arm64': 0.34.4 '@img/sharp-darwin-x64': 0.34.4 @@ -6628,7 +6665,7 @@ snapshots: simple-update-notifier@2.0.0: dependencies: - semver: 7.7.2 + semver: 7.7.3 slash@3.0.0: {} @@ -6666,7 +6703,7 @@ snapshots: stackback@0.0.2: {} - std-env@3.9.0: {} + std-env@3.10.0: {} stop-iteration-iterator@1.1.0: dependencies: @@ -6749,14 +6786,14 @@ snapshots: strip-json-comments@3.1.1: {} - strip-literal@3.0.0: + strip-literal@3.1.0: dependencies: js-tokens: 9.0.1 - styled-jsx@5.1.6(react@19.1.1): + styled-jsx@5.1.6(react@19.2.0): dependencies: client-only: 0.0.1 - react: 19.1.1 + react: 19.2.0 supports-color@5.5.0: dependencies: @@ -6830,14 +6867,14 @@ snapshots: dependencies: typescript: 5.8.3 - ts-node@10.9.2(@types/node@20.19.17)(typescript@5.5.4): + ts-node@10.9.2(@types/node@20.19.21)(typescript@5.5.4): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.19.17 + '@types/node': 20.19.21 acorn: 8.15.0 acorn-walk: 8.3.4 arg: 4.1.3 @@ -6852,32 +6889,32 @@ snapshots: tslib@2.8.1: {} - turbo-darwin-64@2.5.6: + turbo-darwin-64@2.5.8: optional: true - turbo-darwin-arm64@2.5.6: + turbo-darwin-arm64@2.5.8: optional: true - turbo-linux-64@2.5.6: + turbo-linux-64@2.5.8: optional: true - turbo-linux-arm64@2.5.6: + turbo-linux-arm64@2.5.8: optional: true - turbo-windows-64@2.5.6: + turbo-windows-64@2.5.8: optional: true - turbo-windows-arm64@2.5.6: + turbo-windows-arm64@2.5.8: optional: true - turbo@2.5.6: + turbo@2.5.8: optionalDependencies: - turbo-darwin-64: 2.5.6 - turbo-darwin-arm64: 2.5.6 - turbo-linux-64: 2.5.6 - turbo-linux-arm64: 2.5.6 - turbo-windows-64: 2.5.6 - turbo-windows-arm64: 2.5.6 + turbo-darwin-64: 2.5.8 + turbo-darwin-arm64: 2.5.8 + turbo-linux-64: 2.5.8 + turbo-linux-arm64: 2.5.8 + turbo-windows-64: 2.5.8 + turbo-windows-arm64: 2.5.8 type-check@0.4.0: dependencies: @@ -6918,13 +6955,13 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.44.1(eslint@9.36.0)(typescript@5.8.3): + typescript-eslint@8.46.1(eslint@9.37.0)(typescript@5.8.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.44.1(@typescript-eslint/parser@8.44.1(eslint@9.36.0)(typescript@5.8.3))(eslint@9.36.0)(typescript@5.8.3) - '@typescript-eslint/parser': 8.44.1(eslint@9.36.0)(typescript@5.8.3) - '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.8.3) - '@typescript-eslint/utils': 8.44.1(eslint@9.36.0)(typescript@5.8.3) - eslint: 9.36.0 + '@typescript-eslint/eslint-plugin': 8.46.1(@typescript-eslint/parser@8.46.1(eslint@9.37.0)(typescript@5.8.3))(eslint@9.37.0)(typescript@5.8.3) + '@typescript-eslint/parser': 8.46.1(eslint@9.37.0)(typescript@5.8.3) + '@typescript-eslint/typescript-estree': 8.46.1(typescript@5.8.3) + '@typescript-eslint/utils': 8.46.1(eslint@9.37.0)(typescript@5.8.3) + eslint: 9.37.0 typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -6974,7 +7011,7 @@ snapshots: validate-npm-package-name@5.0.1: {} - viem@2.37.8(typescript@5.8.3): + viem@2.38.2(typescript@5.8.3): dependencies: '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 @@ -6991,13 +7028,13 @@ snapshots: - utf-8-validate - zod - vite-node@3.2.4(@types/node@22.18.6): + vite-node@3.2.4(@types/node@22.18.10): dependencies: cac: 6.7.14 debug: 4.4.3(supports-color@5.5.0) es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.1.7(@types/node@22.18.6) + vite: 7.1.10(@types/node@22.18.10) transitivePeerDependencies: - '@types/node' - jiti @@ -7012,23 +7049,23 @@ snapshots: - tsx - yaml - vite@7.1.7(@types/node@22.18.6): + vite@7.1.10(@types/node@22.18.10): dependencies: - esbuild: 0.25.10 + esbuild: 0.25.11 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.52.2 + rollup: 4.52.4 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 22.18.6 + '@types/node': 22.18.10 fsevents: 2.3.3 - vitest@3.2.4(@types/node@22.18.6)(happy-dom@17.6.3): + vitest@3.2.4(@types/node@22.18.10)(happy-dom@17.6.3): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.1.7(@types/node@22.18.6)) + '@vitest/mocker': 3.2.4(vite@7.1.10(@types/node@22.18.10)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -7040,17 +7077,17 @@ snapshots: magic-string: 0.30.19 pathe: 2.0.3 picomatch: 4.0.3 - std-env: 3.9.0 + std-env: 3.10.0 tinybench: 2.9.0 tinyexec: 0.3.2 tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.1.7(@types/node@22.18.6) - vite-node: 3.2.4(@types/node@22.18.6) + vite: 7.1.10(@types/node@22.18.10) + vite-node: 3.2.4(@types/node@22.18.10) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.18.6 + '@types/node': 22.18.10 happy-dom: 17.6.3 transitivePeerDependencies: - jiti @@ -7090,7 +7127,7 @@ snapshots: is-async-function: 2.1.1 is-date-object: 1.1.0 is-finalizationregistry: 1.1.1 - is-generator-function: 1.1.0 + is-generator-function: 1.1.2 is-regex: 1.2.1 is-weakref: 1.1.1 isarray: 2.0.5 From 885f0362c4828ec191bead80f48c4bb7d61ad424 Mon Sep 17 00:00:00 2001 From: Gabi <56271768+VGabriel45@users.noreply.github.com> Date: Mon, 20 Oct 2025 18:32:12 +0300 Subject: [PATCH 062/119] refactor exports for relayer (#900) --- packages/services/relayer/hardhat.config.js | 15 - packages/services/relayer/src/index.ts | 6 +- .../services/relayer/src/local-relayer.ts | 125 -------- .../services/relayer/src/provider-relayer.ts | 284 ------------------ packages/services/relayer/src/relayer.ts | 89 ------ .../services/relayer/src/relayer/index.ts | 60 ++++ .../services/relayer/src/relayer/relayer.ts | 37 +++ .../src/{ => relayer}/rpc-relayer/index.ts | 4 +- .../{ => relayer}/rpc-relayer/relayer.gen.ts | 0 .../relayer/src/{ => relayer}/standard/abi.ts | 0 .../src/{ => relayer}/standard/eip6963.ts | 2 +- .../src/{ => relayer}/standard/index.ts | 0 .../src/{ => relayer}/standard/local.ts | 4 +- .../src/{ => relayer}/standard/pk-relayer.ts | 2 +- .../src/{ => relayer}/standard/sequence.ts | 2 +- .../dapp-client/src/ChainSessionManager.ts | 6 +- packages/wallet/dapp-client/src/DappClient.ts | 4 +- .../wallet/dapp-client/src/types/index.ts | 6 +- packages/wallet/wdk/src/sequence/manager.ts | 6 +- .../wallet/wdk/src/sequence/transactions.ts | 4 +- 20 files changed, 119 insertions(+), 537 deletions(-) delete mode 100644 packages/services/relayer/hardhat.config.js delete mode 100644 packages/services/relayer/src/local-relayer.ts delete mode 100644 packages/services/relayer/src/provider-relayer.ts delete mode 100644 packages/services/relayer/src/relayer.ts create mode 100644 packages/services/relayer/src/relayer/index.ts create mode 100644 packages/services/relayer/src/relayer/relayer.ts rename packages/services/relayer/src/{ => relayer}/rpc-relayer/index.ts (99%) rename packages/services/relayer/src/{ => relayer}/rpc-relayer/relayer.gen.ts (100%) rename packages/services/relayer/src/{ => relayer}/standard/abi.ts (100%) rename packages/services/relayer/src/{ => relayer}/standard/eip6963.ts (99%) rename packages/services/relayer/src/{ => relayer}/standard/index.ts (100%) rename packages/services/relayer/src/{ => relayer}/standard/local.ts (99%) rename packages/services/relayer/src/{ => relayer}/standard/pk-relayer.ts (99%) rename packages/services/relayer/src/{ => relayer}/standard/sequence.ts (99%) diff --git a/packages/services/relayer/hardhat.config.js b/packages/services/relayer/hardhat.config.js deleted file mode 100644 index fd760378b1..0000000000 --- a/packages/services/relayer/hardhat.config.js +++ /dev/null @@ -1,15 +0,0 @@ -/** - * @type import('hardhat/config').HardhatUserConfig - */ -module.exports = { - solidity: '0.7.6', - - networks: { - hardhat: { - chainId: 31337, - accounts: { - mnemonic: 'ripple axis someone ridge uniform wrist prosper there frog rate olympic knee', - }, - }, - }, -} diff --git a/packages/services/relayer/src/index.ts b/packages/services/relayer/src/index.ts index 1ff39166f3..dc28bfc771 100644 --- a/packages/services/relayer/src/index.ts +++ b/packages/services/relayer/src/index.ts @@ -1,5 +1,3 @@ -export * as RpcRelayer from './rpc-relayer/index.js' -export * as Relayer from './relayer.js' -export * as StandardRelayer from './standard/index.js' -export * as RelayerGen from './rpc-relayer/relayer.gen.js' +export * as Relayer from './relayer/index.js' +export * as RpcRelayerGen from './relayer/rpc-relayer/relayer.gen.js' export * as Preconditions from './preconditions/index.js' diff --git a/packages/services/relayer/src/local-relayer.ts b/packages/services/relayer/src/local-relayer.ts deleted file mode 100644 index 29850be344..0000000000 --- a/packages/services/relayer/src/local-relayer.ts +++ /dev/null @@ -1,125 +0,0 @@ -// import { ethers } from 'ethers' -// import { logger } from '@0xsequence/utils' -// import { FeeOption, FeeQuote, proto, Relayer } from '.' -// import { ProviderRelayer, ProviderRelayerOptions } from './provider-relayer' -// import { commons } from '@0xsequence/core' - -// export type LocalRelayerOptions = Omit & { -// signer: ethers.Signer -// } - -// export function isLocalRelayerOptions(obj: any): obj is LocalRelayerOptions { -// return typeof obj === 'object' && isAbstractSigner(obj.signer) -// } - -// export class LocalRelayer extends ProviderRelayer implements Relayer { -// private signer: ethers.Signer -// private txnOptions: ethers.TransactionRequest - -// constructor(options: LocalRelayerOptions | ethers.AbstractSigner) { -// super(isAbstractSigner(options) ? { provider: options.provider! } : { ...options, provider: options.signer.provider! }) -// this.signer = isAbstractSigner(options) ? options : options.signer -// if (!this.signer.provider) throw new Error('Signer must have a provider') -// } - -// async getFeeOptions(_address: string, ..._transactions: commons.transaction.Transaction[]): Promise<{ options: FeeOption[] }> { -// return { options: [] } -// } - -// async getFeeOptionsRaw( -// _entrypoint: string, -// _data: ethers.BytesLike, -// _options?: { -// simulate?: boolean -// } -// ): Promise<{ options: FeeOption[] }> { -// return { options: [] } -// } - -// async gasRefundOptions(address: string, ...transactions: commons.transaction.Transaction[]): Promise { -// const { options } = await this.getFeeOptions(address, ...transactions) -// return options -// } - -// setTransactionOptions(transactionRequest: ethers.TransactionRequest) { -// this.txnOptions = transactionRequest -// } - -// async relay( -// signedTxs: commons.transaction.IntendedTransactionBundle, -// quote?: FeeQuote, -// waitForReceipt: boolean = true -// ): Promise> { -// if (quote !== undefined) { -// logger.warn(`LocalRelayer doesn't accept fee quotes`) -// } - -// const data = commons.transaction.encodeBundleExecData(signedTxs) - -// // TODO: think about computing gas limit individually, summing together and passing across -// // NOTE: we expect that all txns have set their gasLimit ahead of time through proper estimation -// // const gasLimit = signedTxs.transactions.reduce((sum, tx) => sum + tx.gasLimit, 0n) -// // txRequest.gasLimit = gasLimit - -// const responsePromise = this.signer.sendTransaction({ -// to: signedTxs.entrypoint, -// data, -// ...this.txnOptions, -// gasLimit: 9000000 -// }) - -// if (waitForReceipt) { -// const response: commons.transaction.TransactionResponse = await responsePromise -// response.receipt = await response.wait() -// return response -// } else { -// return responsePromise -// } -// } - -// async getMetaTransactions( -// projectId: number, -// page?: proto.Page -// ): Promise<{ -// page: proto.Page -// transactions: proto.MetaTxnLog[] -// }> { -// return { page: { page: 0, pageSize: 100 }, transactions: [] } -// } - -// async getTransactionCost( -// projectId: number, -// from: string, -// to: string -// ): Promise<{ -// cost: number -// }> { -// return { cost: 0 } -// } - -// async listGasSponsors(args: proto.ListGasSponsorsArgs): Promise { -// return { page: { page: 0, pageSize: 100 }, gasSponsors: [] } -// } - -// async addGasSponsor(args: proto.AddGasSponsorArgs): Promise { -// return { status: true, gasSponsor: {} as proto.GasSponsor } -// } - -// async updateGasSponsor(args: proto.UpdateGasSponsorArgs): Promise { -// return { status: true, gasSponsor: {} as proto.GasSponsor } -// } - -// async removeGasSponsor(args: proto.RemoveGasSponsorArgs): Promise { -// return { status: true } -// } -// } - -// function isAbstractSigner(signer: any): signer is ethers.AbstractSigner { -// return ( -// signer && -// typeof signer === 'object' && -// typeof signer.provider === 'object' && -// typeof signer.getAddress === 'function' && -// typeof signer.connect === 'function' -// ) -// } diff --git a/packages/services/relayer/src/provider-relayer.ts b/packages/services/relayer/src/provider-relayer.ts deleted file mode 100644 index 85e9257f24..0000000000 --- a/packages/services/relayer/src/provider-relayer.ts +++ /dev/null @@ -1,284 +0,0 @@ -// import { ethers } from 'ethers' -// import { walletContracts } from '@0xsequence/abi' -// import { FeeOption, FeeQuote, proto, Relayer, SimulateResult } from '.' -// import { logger, Optionals } from '@0xsequence/utils' -// import { commons } from '@0xsequence/core' - -// const DEFAULT_GAS_LIMIT = 800000n - -// export interface ProviderRelayerOptions { -// provider: ethers.Provider -// waitPollRate?: number -// deltaBlocksLog?: number -// fromBlockLog?: number -// } - -// export const ProviderRelayerDefaults: Required> = { -// waitPollRate: 1000, -// deltaBlocksLog: 12, -// fromBlockLog: -1024 -// } - -// export function isProviderRelayerOptions(obj: any): obj is ProviderRelayerOptions { -// return typeof obj === 'object' && isAbstractProvider(obj.provider) -// } - -// export abstract class ProviderRelayer implements Relayer { -// public provider: ethers.Provider -// public waitPollRate: number -// public deltaBlocksLog: number -// public fromBlockLog: number - -// constructor(options: ProviderRelayerOptions) { -// const opts = { ...ProviderRelayerDefaults, ...options } - -// this.provider = opts.provider -// this.waitPollRate = opts.waitPollRate -// this.deltaBlocksLog = opts.deltaBlocksLog -// this.fromBlockLog = opts.fromBlockLog -// } - -// abstract getFeeOptions( -// address: string, -// ...transactions: commons.transaction.Transaction[] -// ): Promise<{ options: FeeOption[]; quote?: FeeQuote }> - -// abstract getFeeOptionsRaw( -// entrypoint: string, -// data: ethers.BytesLike, -// options?: { -// simulate?: boolean -// } -// ): Promise<{ options: FeeOption[]; quote?: FeeQuote }> - -// abstract gasRefundOptions(address: string, ...transactions: commons.transaction.Transaction[]): Promise - -// abstract relay( -// signedTxs: commons.transaction.IntendedTransactionBundle, -// quote?: FeeQuote, -// waitForReceipt?: boolean -// ): Promise - -// abstract getTransactionCost( -// projectId: number, -// from: string, -// to: string -// ): Promise<{ -// cost: number -// }> - -// abstract getMetaTransactions( -// projectId: number, -// page?: proto.Page -// ): Promise<{ -// page: proto.Page -// transactions: proto.MetaTxnLog[] -// }> - -// abstract listGasSponsors(args: proto.ListGasSponsorsArgs): Promise - -// abstract addGasSponsor(args: proto.AddGasSponsorArgs): Promise - -// abstract updateGasSponsor(args: proto.UpdateGasSponsorArgs): Promise - -// abstract removeGasSponsor(args: proto.RemoveGasSponsorArgs): Promise - -// async simulate(wallet: string, ...transactions: commons.transaction.Transaction[]): Promise { -// return ( -// await Promise.all( -// transactions.map(async tx => { -// // Respect gasLimit request of the transaction (as long as its not 0) -// if (tx.gasLimit && BigInt(tx.gasLimit || 0) !== 0n) { -// return tx.gasLimit -// } - -// // Fee can't be estimated locally for delegateCalls -// if (tx.delegateCall) { -// return DEFAULT_GAS_LIMIT -// } - -// // Fee can't be estimated for self-called if wallet hasn't been deployed -// if (tx.to === wallet && (await this.provider.getCode(wallet).then(code => ethers.getBytes(code).length === 0))) { -// return DEFAULT_GAS_LIMIT -// } - -// if (!this.provider) { -// throw new Error('signer.provider is not set, but is required') -// } - -// // TODO: If the wallet address has been deployed, gas limits can be -// // estimated with more accurately by using self-calls with the batch transactions one by one -// return this.provider.estimateGas({ -// from: wallet, -// to: tx.to, -// data: tx.data, -// value: tx.value -// }) -// }) -// ) -// ).map(gasLimit => ({ -// executed: true, -// succeeded: true, -// gasUsed: Number(gasLimit), -// gasLimit: Number(gasLimit) -// })) -// } - -// async getNonce(address: string, space?: ethers.BigNumberish, blockTag?: ethers.BlockTag): Promise { -// if (!this.provider) { -// throw new Error('provider is not set') -// } - -// if ((await this.provider.getCode(address)) === '0x') { -// return 0 -// } - -// if (space === undefined) { -// space = 0 -// } - -// const module = new ethers.Contract(address, walletContracts.mainModule.abi, this.provider) -// const nonce = await module.readNonce(space, { blockTag: blockTag }) -// return commons.transaction.encodeNonce(space, nonce) -// } - -// async wait( -// metaTxnId: string | commons.transaction.SignedTransactionBundle, -// timeoutDuration?: number, -// delay: number = this.waitPollRate, -// maxFails: number = 5 -// ): Promise { -// if (typeof metaTxnId !== 'string') { -// metaTxnId = commons.transaction.intendedTransactionID(metaTxnId) -// } - -// let timedOut = false - -// const retry = async (f: () => Promise, errorMessage: string): Promise => { -// let fails = 0 - -// while (!timedOut) { -// try { -// return await f() -// } catch (error) { -// fails++ - -// if (maxFails !== undefined && fails >= maxFails) { -// logger.error(`giving up after ${fails} failed attempts${errorMessage ? `: ${errorMessage}` : ''}`, error) -// throw error -// } else { -// logger.warn(`attempt #${fails} failed${errorMessage ? `: ${errorMessage}` : ''}`, error) -// } -// } - -// if (delay > 0) { -// await new Promise(resolve => setTimeout(resolve, delay)) -// } -// } - -// throw new Error(`timed out after ${fails} failed attempts${errorMessage ? `: ${errorMessage}` : ''}`) -// } - -// const waitReceipt = async (): Promise => { -// // Transactions can only get executed on nonce change -// // get all nonce changes and look for metaTxnIds in between logs -// let lastBlock: number = this.fromBlockLog - -// if (lastBlock < 0) { -// const block = await retry(() => this.provider.getBlockNumber(), 'unable to get latest block number') -// lastBlock = block + lastBlock -// } - -// if (typeof metaTxnId !== 'string') { -// throw new Error('impossible') -// } - -// const normalMetaTxnId = metaTxnId.replace('0x', '') - -// while (!timedOut) { -// const block = await retry(() => this.provider.getBlockNumber(), 'unable to get latest block number') - -// const logs = await retry( -// () => -// this.provider.getLogs({ -// fromBlock: Math.max(0, lastBlock - this.deltaBlocksLog), -// toBlock: block, -// // Nonce change event topic -// topics: ['0x1f180c27086c7a39ea2a7b25239d1ab92348f07ca7bb59d1438fcf527568f881'] -// }), -// `unable to get NonceChange logs for blocks ${Math.max(0, lastBlock - this.deltaBlocksLog)} to ${block}` -// ) - -// lastBlock = block - -// // Get receipts of all transactions -// const txs = await Promise.all( -// logs.map(l => -// retry( -// () => this.provider.getTransactionReceipt(l.transactionHash), -// `unable to get receipt for transaction ${l.transactionHash}` -// ) -// ) -// ) - -// // Find a transaction with a TxExecuted log -// const found = txs.find(tx => -// tx?.logs.find( -// l => -// (l.topics.length === 0 && l.data.replace('0x', '') === normalMetaTxnId) || -// (l.topics.length === 1 && -// // TxFailed event topic -// l.topics[0] === '0x3dbd1590ea96dd3253a91f24e64e3a502e1225d602a5731357bc12643070ccd7' && -// l.data.length >= 64 && -// l.data.replace('0x', '').startsWith(normalMetaTxnId)) -// ) -// ) - -// // If found return that -// if (found) { -// const response = await retry(() => this.provider.getTransaction(found.hash), `unable to get transaction ${found.hash}`) -// if (!response) { -// throw new Error(`Transaction response not found for ${metaTxnId}`) -// } - -// // NOTE: we have to do this, because ethers-v6 uses private fields -// // and we can't just extend the class and override the method, so -// // we just modify the response object directly by adding the receipt to it. -// const out: any = response -// out.receipt = found -// return out -// } - -// // Otherwise wait and try again -// if (!timedOut) { -// await new Promise(r => setTimeout(r, delay)) -// } -// } - -// throw new Error(`Timeout waiting for transaction receipt ${metaTxnId}`) -// } - -// if (timeoutDuration !== undefined) { -// return Promise.race([ -// waitReceipt(), -// new Promise((_, reject) => -// setTimeout(() => { -// timedOut = true -// reject(`Timeout waiting for transaction receipt ${metaTxnId}`) -// }, timeoutDuration) -// ) -// ]) -// } else { -// return waitReceipt() -// } -// } -// } - -// function isAbstractProvider(provider: any): provider is ethers.AbstractProvider { -// return ( -// provider && -// typeof provider === 'object' && -// typeof provider.getNetwork === 'function' && -// typeof provider.getBlockNumber === 'function' -// ) -// } diff --git a/packages/services/relayer/src/relayer.ts b/packages/services/relayer/src/relayer.ts deleted file mode 100644 index 952b80f8f6..0000000000 --- a/packages/services/relayer/src/relayer.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { Payload, Precondition } from '@0xsequence/wallet-primitives' -import { Address, Hex } from 'ox' -import { FeeToken, GetMetaTxnReceiptReturn } from './rpc-relayer/relayer.gen.js' - -export interface FeeOption { - token: FeeToken - to: string - value: string - gasLimit: number -} - -export interface FeeQuote { - _tag: 'FeeQuote' - _quote: unknown -} - -export type OperationUnknownStatus = { - status: 'unknown' - reason?: string -} - -export type OperationQueuedStatus = { - status: 'queued' - reason?: string -} - -export type OperationPendingStatus = { - status: 'pending' - reason?: string -} - -export type OperationPendingPreconditionStatus = { - status: 'pending-precondition' - reason?: string -} - -export type OperationConfirmedStatus = { - status: 'confirmed' - transactionHash: Hex.Hex - data?: GetMetaTxnReceiptReturn -} - -export type OperationFailedStatus = { - status: 'failed' - transactionHash?: Hex.Hex - reason: string - data?: GetMetaTxnReceiptReturn -} - -export type OperationStatus = - | OperationUnknownStatus - | OperationQueuedStatus - | OperationPendingStatus - | OperationPendingPreconditionStatus - | OperationConfirmedStatus - | OperationFailedStatus - -export interface Relayer { - kind: 'relayer' - - type: string - id: string - - isAvailable(wallet: Address.Address, chainId: number): Promise - - feeTokens(): Promise<{ isFeeRequired: boolean; tokens?: FeeToken[]; paymentAddress?: Address.Address }> - - feeOptions( - wallet: Address.Address, - chainId: number, - calls: Payload.Call[], - ): Promise<{ options: FeeOption[]; quote?: FeeQuote }> - - relay(to: Address.Address, data: Hex.Hex, chainId: number, quote?: FeeQuote): Promise<{ opHash: Hex.Hex }> - - status(opHash: Hex.Hex, chainId: number): Promise - - checkPrecondition(precondition: Precondition.Precondition): Promise -} - -export function isRelayer(relayer: any): relayer is Relayer { - return ( - 'isAvailable' in relayer && - 'feeOptions' in relayer && - 'relay' in relayer && - 'status' in relayer && - 'checkPrecondition' in relayer - ) -} diff --git a/packages/services/relayer/src/relayer/index.ts b/packages/services/relayer/src/relayer/index.ts new file mode 100644 index 0000000000..52362d5c95 --- /dev/null +++ b/packages/services/relayer/src/relayer/index.ts @@ -0,0 +1,60 @@ +import { Hex } from 'ox' +import type { FeeToken, GetMetaTxnReceiptReturn } from './rpc-relayer/relayer.gen.js' + +export * from './rpc-relayer/index.js' +export * from './standard/index.js' +export * from './relayer.js' +export type { FeeToken } from './rpc-relayer/relayer.gen.js' + +export interface FeeOption { + token: FeeToken + to: string + value: string + gasLimit: number +} + +export interface FeeQuote { + _tag: 'FeeQuote' + _quote: unknown +} + +export type OperationUnknownStatus = { + status: 'unknown' + reason?: string +} + +export type OperationQueuedStatus = { + status: 'queued' + reason?: string +} + +export type OperationPendingStatus = { + status: 'pending' + reason?: string +} + +export type OperationPendingPreconditionStatus = { + status: 'pending-precondition' + reason?: string +} + +export type OperationConfirmedStatus = { + status: 'confirmed' + transactionHash: Hex.Hex + data?: GetMetaTxnReceiptReturn +} + +export type OperationFailedStatus = { + status: 'failed' + transactionHash?: Hex.Hex + reason: string + data?: GetMetaTxnReceiptReturn +} + +export type OperationStatus = + | OperationUnknownStatus + | OperationQueuedStatus + | OperationPendingStatus + | OperationPendingPreconditionStatus + | OperationConfirmedStatus + | OperationFailedStatus diff --git a/packages/services/relayer/src/relayer/relayer.ts b/packages/services/relayer/src/relayer/relayer.ts new file mode 100644 index 0000000000..3ed5a69627 --- /dev/null +++ b/packages/services/relayer/src/relayer/relayer.ts @@ -0,0 +1,37 @@ +import { Address, Hex } from 'ox' +import { FeeToken } from './rpc-relayer/relayer.gen.js' +import { FeeOption, FeeQuote, OperationStatus } from './index.js' +import { Payload, Precondition } from '@0xsequence/wallet-primitives' + +export interface Relayer { + kind: 'relayer' + + type: string + id: string + + isAvailable(wallet: Address.Address, chainId: number): Promise + + feeTokens(): Promise<{ isFeeRequired: boolean; tokens?: FeeToken[]; paymentAddress?: Address.Address }> + + feeOptions( + wallet: Address.Address, + chainId: number, + calls: Payload.Call[], + ): Promise<{ options: FeeOption[]; quote?: FeeQuote }> + + relay(to: Address.Address, data: Hex.Hex, chainId: number, quote?: FeeQuote): Promise<{ opHash: Hex.Hex }> + + status(opHash: Hex.Hex, chainId: number): Promise + + checkPrecondition(precondition: Precondition.Precondition): Promise +} + +export function isRelayer(relayer: any): relayer is Relayer { + return ( + 'isAvailable' in relayer && + 'feeOptions' in relayer && + 'relay' in relayer && + 'status' in relayer && + 'checkPrecondition' in relayer + ) +} diff --git a/packages/services/relayer/src/rpc-relayer/index.ts b/packages/services/relayer/src/relayer/rpc-relayer/index.ts similarity index 99% rename from packages/services/relayer/src/rpc-relayer/index.ts rename to packages/services/relayer/src/relayer/rpc-relayer/index.ts index 21a2f827b1..0768490c98 100644 --- a/packages/services/relayer/src/rpc-relayer/index.ts +++ b/packages/services/relayer/src/relayer/rpc-relayer/index.ts @@ -9,8 +9,8 @@ import { } from './relayer.gen.js' import { Address, Hex, Bytes, AbiFunction } from 'ox' import { Constants, Payload, Network } from '@0xsequence/wallet-primitives' -import { FeeOption, FeeQuote, OperationStatus, Relayer } from '../relayer.js' -import { decodePrecondition } from '../preconditions/codec.js' +import { FeeOption, FeeQuote, OperationStatus, Relayer } from '../index.js' +import { decodePrecondition } from '../../preconditions/index.js' import { erc20BalanceOf, erc20Allowance, diff --git a/packages/services/relayer/src/rpc-relayer/relayer.gen.ts b/packages/services/relayer/src/relayer/rpc-relayer/relayer.gen.ts similarity index 100% rename from packages/services/relayer/src/rpc-relayer/relayer.gen.ts rename to packages/services/relayer/src/relayer/rpc-relayer/relayer.gen.ts diff --git a/packages/services/relayer/src/standard/abi.ts b/packages/services/relayer/src/relayer/standard/abi.ts similarity index 100% rename from packages/services/relayer/src/standard/abi.ts rename to packages/services/relayer/src/relayer/standard/abi.ts diff --git a/packages/services/relayer/src/standard/eip6963.ts b/packages/services/relayer/src/relayer/standard/eip6963.ts similarity index 99% rename from packages/services/relayer/src/standard/eip6963.ts rename to packages/services/relayer/src/relayer/standard/eip6963.ts index 05c2b21bf4..996c1baeee 100644 --- a/packages/services/relayer/src/standard/eip6963.ts +++ b/packages/services/relayer/src/relayer/standard/eip6963.ts @@ -1,6 +1,6 @@ import { createStore, EIP6963ProviderInfo, EIP6963ProviderDetail } from 'mipd' import { EIP1193ProviderAdapter, LocalRelayer } from './local.js' -import { FeeOption, FeeQuote, OperationStatus, Relayer } from '../relayer.js' +import { FeeOption, FeeQuote, OperationStatus, Relayer } from '../index.js' import { Address, Hex } from 'ox' import { Payload } from '@0xsequence/wallet-primitives' import { FeeToken, IntentPrecondition } from '../rpc-relayer/relayer.gen.js' diff --git a/packages/services/relayer/src/standard/index.ts b/packages/services/relayer/src/relayer/standard/index.ts similarity index 100% rename from packages/services/relayer/src/standard/index.ts rename to packages/services/relayer/src/relayer/standard/index.ts diff --git a/packages/services/relayer/src/standard/local.ts b/packages/services/relayer/src/relayer/standard/local.ts similarity index 99% rename from packages/services/relayer/src/standard/local.ts rename to packages/services/relayer/src/relayer/standard/local.ts index f9edc19c41..01c9289066 100644 --- a/packages/services/relayer/src/standard/local.ts +++ b/packages/services/relayer/src/relayer/standard/local.ts @@ -1,9 +1,9 @@ import { Constants, Payload } from '@0xsequence/wallet-primitives' import { EIP1193Provider } from 'mipd' import { AbiFunction, Address, Bytes, Hex, TransactionReceipt } from 'ox' -import { FeeOption, FeeQuote, OperationStatus, Relayer } from '../relayer.js' +import { FeeOption, FeeQuote, OperationStatus, Relayer } from '../index.js' import { FeeToken, IntentPrecondition } from '../rpc-relayer/relayer.gen.js' -import { decodePrecondition } from '../preconditions/index.js' +import { decodePrecondition } from '../../preconditions/index.js' import { erc20BalanceOf, erc20Allowance, diff --git a/packages/services/relayer/src/standard/pk-relayer.ts b/packages/services/relayer/src/relayer/standard/pk-relayer.ts similarity index 99% rename from packages/services/relayer/src/standard/pk-relayer.ts rename to packages/services/relayer/src/relayer/standard/pk-relayer.ts index c43cdbab48..37b2e5a08a 100644 --- a/packages/services/relayer/src/standard/pk-relayer.ts +++ b/packages/services/relayer/src/relayer/standard/pk-relayer.ts @@ -1,7 +1,7 @@ import { Payload, Precondition } from '@0xsequence/wallet-primitives' import { Address, Hex, Provider, Secp256k1, TransactionEnvelopeEip1559, TransactionReceipt } from 'ox' import { LocalRelayer } from './local.js' -import { FeeOption, FeeQuote, OperationStatus, Relayer } from '../relayer.js' +import { FeeOption, FeeQuote, OperationStatus, Relayer } from '../index.js' import { FeeToken } from '../rpc-relayer/relayer.gen.js' export class PkRelayer implements Relayer { diff --git a/packages/services/relayer/src/standard/sequence.ts b/packages/services/relayer/src/relayer/standard/sequence.ts similarity index 99% rename from packages/services/relayer/src/standard/sequence.ts rename to packages/services/relayer/src/relayer/standard/sequence.ts index 2412059e3b..b41e97806d 100644 --- a/packages/services/relayer/src/standard/sequence.ts +++ b/packages/services/relayer/src/relayer/standard/sequence.ts @@ -1,7 +1,7 @@ import { ETHTxnStatus, IntentPrecondition, Relayer as Service, FeeToken } from '../rpc-relayer/relayer.gen.js' import { Payload } from '@0xsequence/wallet-primitives' import { AbiFunction, Address, Bytes, Hex } from 'ox' -import { FeeOption, FeeQuote, OperationStatus, Relayer } from '../relayer.js' +import { FeeOption, FeeQuote, OperationStatus, Relayer } from '../index.js' export class SequenceRelayer implements Relayer { public readonly kind: 'relayer' = 'relayer' public readonly type = 'sequence' diff --git a/packages/wallet/dapp-client/src/ChainSessionManager.ts b/packages/wallet/dapp-client/src/ChainSessionManager.ts index ae012f4429..6a7b3572e9 100644 --- a/packages/wallet/dapp-client/src/ChainSessionManager.ts +++ b/packages/wallet/dapp-client/src/ChainSessionManager.ts @@ -46,7 +46,7 @@ import { } from './types/index.js' import { CACHE_DB_NAME, VALUE_FORWARDER_ADDRESS } from './utils/constants.js' import { ExplicitSession, ImplicitSession, ExplicitSessionConfig } from './index.js' -import { RpcRelayer } from '@0xsequence/relayer' +import { Relayer } from '@0xsequence/relayer' interface ChainSessionManagerEventMap { explicitSessionResponse: ExplicitSessionEventListener @@ -75,7 +75,7 @@ export class ChainSessionManager { private sessionManager: Signers.SessionManager | null = null private wallet: Wallet | null = null private provider: Provider.Provider | null = null - private relayer: RpcRelayer.RpcRelayer + private relayer: Relayer.RpcRelayer private readonly chainId: number public transport: DappTransport | null = null private sequenceStorage: SequenceStorage @@ -124,7 +124,7 @@ export class ChainSessionManager { } this.guard = guard this.provider = Provider.from(RpcTransport.fromHttp(rpcUrl)) - this.relayer = new RpcRelayer.RpcRelayer( + this.relayer = new Relayer.RpcRelayer( getRelayerUrl(chainId, relayerUrl), this.chainId, getRpcUrl(chainId, nodesUrl, projectAccessKey), diff --git a/packages/wallet/dapp-client/src/DappClient.ts b/packages/wallet/dapp-client/src/DappClient.ts index 4b8a182c9f..0884073594 100644 --- a/packages/wallet/dapp-client/src/DappClient.ts +++ b/packages/wallet/dapp-client/src/DappClient.ts @@ -28,7 +28,7 @@ import { import { TypedData } from 'ox/TypedData' import { KEYMACHINE_URL, NODES_URL, RELAYER_URL } from './utils/constants.js' import { getRelayerUrl, getRpcUrl } from './utils/index.js' -import { RpcRelayer } from '@0xsequence/relayer' +import { Relayer } from '@0xsequence/relayer' export type DappClientEventListener = (data?: any) => void @@ -622,7 +622,7 @@ export class DappClient { * @throws If the fee tokens cannot be fetched. {@link InitializationError} */ async getFeeTokens(chainId: number): Promise { - const relayer = new RpcRelayer.RpcRelayer( + const relayer = new Relayer.RpcRelayer( getRelayerUrl(chainId, this.relayerUrl), chainId, getRpcUrl(chainId, this.nodesUrl, this.projectAccessKey), diff --git a/packages/wallet/dapp-client/src/types/index.ts b/packages/wallet/dapp-client/src/types/index.ts index a6ea2ef9b8..72e3dbe116 100644 --- a/packages/wallet/dapp-client/src/types/index.ts +++ b/packages/wallet/dapp-client/src/types/index.ts @@ -1,5 +1,5 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ -import { Relayer, RelayerGen } from '@0xsequence/relayer' +import { Relayer } from '@0xsequence/relayer' import { ExplicitSession } from '@0xsequence/wallet-core' import { Attestation, Payload } from '@0xsequence/wallet-primitives' import { Address, Hex } from 'ox' @@ -7,8 +7,8 @@ import type { TypedData } from 'ox/TypedData' // --- Public Interfaces and Constants --- -export type FeeToken = RelayerGen.FeeToken -export type FeeOption = RelayerGen.FeeOption +export type FeeToken = Relayer.FeeToken +export type FeeOption = Relayer.FeeOption export type OperationFailedStatus = Relayer.OperationFailedStatus export type OperationStatus = Relayer.OperationStatus diff --git a/packages/wallet/wdk/src/sequence/manager.ts b/packages/wallet/wdk/src/sequence/manager.ts index 4421369044..2405e6f2d9 100644 --- a/packages/wallet/wdk/src/sequence/manager.ts +++ b/packages/wallet/wdk/src/sequence/manager.ts @@ -1,5 +1,5 @@ import { Bundler, Signers as CoreSigners, State } from '@0xsequence/wallet-core' -import { Relayer, StandardRelayer } from '@0xsequence/relayer' +import { Relayer } from '@0xsequence/relayer' import { IdentityInstrument } from '@0xsequence/identity-instrument' import { createAttestationVerifyingFetch } from '@0xsequence/tee-verifier' import { Config, Constants, Context, Extensions, Network } from '@0xsequence/wallet-primitives' @@ -104,7 +104,7 @@ export const ManagerOptionsDefaults = { stateProvider: new State.Sequence.Provider(), networks: Network.ALL, - relayers: () => [StandardRelayer.LocalRelayer.createFromWindow(window)].filter((r) => r !== undefined), + relayers: () => [Relayer.LocalRelayer.createFromWindow(window)].filter((r) => r !== undefined), bundlers: [], guardUrl: 'https://dev-guard.sequence.app', @@ -358,7 +358,7 @@ export class Manager { // Add EIP-6963 relayers if enabled if (ops.multiInjectedProviderDiscovery) { try { - relayers.push(...StandardRelayer.EIP6963.getRelayers()) + relayers.push(...Relayer.EIP6963.getRelayers()) } catch (error) { console.warn('Failed to initialize EIP-6963 relayers:', error) } diff --git a/packages/wallet/wdk/src/sequence/transactions.ts b/packages/wallet/wdk/src/sequence/transactions.ts index bc39ba16b1..824cb00f69 100644 --- a/packages/wallet/wdk/src/sequence/transactions.ts +++ b/packages/wallet/wdk/src/sequence/transactions.ts @@ -1,5 +1,5 @@ import { Envelope, Wallet, Bundler } from '@0xsequence/wallet-core' -import { Relayer, StandardRelayer } from '@0xsequence/relayer' +import { Relayer } from '@0xsequence/relayer' import { Constants, Payload } from '@0xsequence/wallet-primitives' import { Abi, AbiFunction, Address, Hex, Provider, RpcTransport } from 'ox' import { v7 as uuidv7 } from 'uuid' @@ -350,7 +350,7 @@ export class Transactions implements TransactionsInterface { const feeOptions = await relayer.feeOptions(tx.wallet, tx.envelope.chainId, tx.envelope.payload.calls) if (feeOptions.options.length === 0) { - const { name, icon } = relayer instanceof StandardRelayer.EIP6963.EIP6963Relayer ? relayer.info : {} + const { name, icon } = relayer instanceof Relayer.EIP6963.EIP6963Relayer ? relayer.info : {} return [ { From 12368bda5e57020c97be5260ca61642bb254b6d0 Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Tue, 21 Oct 2025 12:26:44 +0200 Subject: [PATCH 063/119] Add Arc Testnet --- packages/wallet/primitives/src/network.ts | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/packages/wallet/primitives/src/network.ts b/packages/wallet/primitives/src/network.ts index 25f62ba2aa..b0ef2bbde1 100644 --- a/packages/wallet/primitives/src/network.ts +++ b/packages/wallet/primitives/src/network.ts @@ -126,6 +126,9 @@ export const ChainId = { // SANDBOX SANDBOX_TESTNET: 6252, + + // ARC + ARC_TESTNET: 5042002, } as const export type ChainId = (typeof ChainId)[keyof typeof ChainId] @@ -936,6 +939,24 @@ export const ALL: Network[] = [ decimals: 18, }, }, + + { + chainId: ChainId.ARC_TESTNET, + type: NetworkType.TESTNET, + name: 'arc-testnet', + title: 'Arc Testnet', + rpcUrl: getRpcUrl('arc-testnet'), + logoUrl: getLogoUrl(ChainId.ARC_TESTNET), + blockExplorer: { + name: 'Arc Testnet Explorer', + url: 'https://1jr2dw1zdqvyes8u.blockscout.com/', + }, + nativeCurrency: { + symbol: 'USDC', + name: 'USDC', + decimals: 6, + }, + }, ] function getRpcUrl(networkName: string): string { From 3993540e35be600a4df772f5a7eca439d3a803fc Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Tue, 21 Oct 2025 12:42:17 +0200 Subject: [PATCH 064/119] Fix changelog config --- .changeset/config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/config.json b/.changeset/config.json index 6b372552ca..bfd12d2782 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -5,7 +5,7 @@ "fixed": [], "linked": [], "access": "restricted", - "baseBranch": "main", + "baseBranch": "master", "updateInternalDependencies": "patch", "ignore": [] } From 7d47a51015911fd1a3f6043bc2881e2f392c5cf7 Mon Sep 17 00:00:00 2001 From: tolgahan-arikan Date: Wed, 22 Oct 2025 19:05:01 +0300 Subject: [PATCH 065/119] Sessionless connection upgrade and error handling in DappClient (#902) --- packages/wallet/dapp-client/src/DappClient.ts | 109 ++++++++++++++++++ 1 file changed, 109 insertions(+) diff --git a/packages/wallet/dapp-client/src/DappClient.ts b/packages/wallet/dapp-client/src/DappClient.ts index 0884073594..6e6a182d8c 100644 --- a/packages/wallet/dapp-client/src/DappClient.ts +++ b/packages/wallet/dapp-client/src/DappClient.ts @@ -403,6 +403,34 @@ export class DappClient { } this.emit('walletActionResponse', eventPayload) } else if (chainId !== undefined) { + if ('error' in response && response.error && action === RequestActionType.CREATE_NEW_SESSION) { + await this.sequenceStorage.setPendingRedirectRequest(false) + await this.sequenceStorage.getAndClearTempSessionPk() + await this.sequenceStorage.getAndClearPendingRequest() + + if (this.hasSessionlessConnection) { + const sessionlessConnection = await this.sequenceStorage.getSessionlessConnection() + if (sessionlessConnection) { + await this.applySessionlessConnectionState( + sessionlessConnection.walletAddress, + sessionlessConnection.loginMethod, + sessionlessConnection.userEmail, + sessionlessConnection.guard, + false, + ) + } else if (this.walletAddress) { + await this.applySessionlessConnectionState( + this.walletAddress, + this.loginMethod, + this.userEmail, + this.guard, + false, + ) + } + } + return + } + const chainSessionManager = this.getChainSessionManager(chainId) if (!chainSessionManager.isInitialized && this.walletAddress) { chainSessionManager.initializeWithWallet(this.walletAddress) @@ -500,6 +528,87 @@ export class DappClient { } } + /** + * Upgrades an existing sessionless connection by creating implicit and/or explicit sessions. + * @param chainId The chain ID to target for the new sessions. + * @param sessionConfig The explicit session configuration to request. {@link ExplicitSessionConfig} + * @param options Connection options such as preferred login method or email for social/email logins. + * @throws If no sessionless connection is available or the session upgrade fails. {@link InitializationError} + * @throws If neither an implicit nor explicit session is requested. {@link InitializationError} + * + * @returns A promise that resolves once the session upgrade completes. + */ + async upgradeSessionlessConnection( + chainId: number, + sessionConfig?: ExplicitSessionConfig, + options: { + preferredLoginMethod?: LoginMethod + email?: string + includeImplicitSession?: boolean + } = {}, + ): Promise { + if (!this.isInitialized || !this.hasSessionlessConnection || !this.walletAddress) { + throw new InitializationError('A sessionless connection is required before requesting new sessions.') + } + + const shouldCreateSession = !!sessionConfig || (options.includeImplicitSession ?? false) + if (!shouldCreateSession) { + throw new InitializationError( + 'Cannot upgrade a sessionless connection without requesting an implicit or explicit session.', + ) + } + + const sessionlessSnapshot = { + walletAddress: this.walletAddress, + loginMethod: this.loginMethod, + userEmail: this.userEmail, + guard: this.guard, + } + + try { + let chainSessionManager = this.chainSessionManagers.get(chainId) + if ( + chainSessionManager && + chainSessionManager.isInitialized && + !chainSessionManager.getImplicitSession() && + chainSessionManager.getExplicitSessions().length === 0 + ) { + this.chainSessionManagers.delete(chainId) + chainSessionManager = undefined + } + chainSessionManager = chainSessionManager ?? this.getChainSessionManager(chainId) + await chainSessionManager.createNewSession(this.origin, sessionConfig, options) + + if (this.transport.mode === TransportMode.POPUP) { + const hasImplicitSession = !!chainSessionManager.getImplicitSession() + const hasExplicitSessions = chainSessionManager.getExplicitSessions().length > 0 + + if (shouldCreateSession && (hasImplicitSession || hasExplicitSessions)) { + await this._loadStateFromStorage() + } else { + const walletAddress = chainSessionManager.getWalletAddress() + if (!walletAddress) { + throw new InitializationError('Wallet address missing after connect.') + } + await this.applySessionlessConnectionState( + walletAddress, + chainSessionManager.loginMethod, + chainSessionManager.userEmail, + chainSessionManager.getGuard(), + ) + } + } + } catch (err) { + await this.applySessionlessConnectionState( + sessionlessSnapshot.walletAddress, + sessionlessSnapshot.loginMethod, + sessionlessSnapshot.userEmail, + sessionlessSnapshot.guard, + ) + throw new ConnectionError(`Connection failed: ${err}`) + } + } + /** * Adds a new explicit session for a given chain to an existing wallet. * @remarks From 834b8e52df28f24757c052431167132fb3ce63da Mon Sep 17 00:00:00 2001 From: Tolgahan Arikan Date: Fri, 24 Oct 2025 17:07:21 +0300 Subject: [PATCH 066/119] dapp-client: add sessionless snapshot restore flow --- packages/wallet/dapp-client/src/DappClient.ts | 102 +++++++++++++++++- packages/wallet/dapp-client/src/index.ts | 1 + .../wallet/dapp-client/src/utils/storage.ts | 33 ++++++ 3 files changed, 132 insertions(+), 4 deletions(-) diff --git a/packages/wallet/dapp-client/src/DappClient.ts b/packages/wallet/dapp-client/src/DappClient.ts index 6e6a182d8c..2c38fc18bf 100644 --- a/packages/wallet/dapp-client/src/DappClient.ts +++ b/packages/wallet/dapp-client/src/DappClient.ts @@ -5,7 +5,7 @@ import { type ExplicitSession, type ExplicitSessionConfig, type ImplicitSession, import { ChainSessionManager } from './ChainSessionManager.js' import { DappTransport } from './DappTransport.js' import { ConnectionError, InitializationError, SigningError, TransactionError } from './utils/errors.js' -import { SequenceStorage, WebStorage } from './utils/storage.js' +import { SequenceStorage, WebStorage, type SessionlessConnectionData } from './utils/storage.js' import { CreateNewSessionResponse, DappClientExplicitSessionEventListener, @@ -85,6 +85,7 @@ export class DappClient { private walletAddress: Address.Address | null = null private hasSessionlessConnection = false + private cachedSessionlessConnection: SessionlessConnectionData | null = null private eventListeners: { [K in keyof DappClientEventMap]?: Set } = {} @@ -273,10 +274,14 @@ export class DappClient { private async _loadStateFromStorage(): Promise { const implicitSession = await this.sequenceStorage.getImplicitSession() - const [explicitSessions, sessionlessConnection] = await Promise.all([ + const [explicitSessions, sessionlessConnection, sessionlessSnapshot] = await Promise.all([ this.sequenceStorage.getExplicitSessions(), this.sequenceStorage.getSessionlessConnection(), + this.sequenceStorage.getSessionlessConnectionSnapshot + ? this.sequenceStorage.getSessionlessConnectionSnapshot() + : Promise.resolve(null), ]) + this.cachedSessionlessConnection = sessionlessSnapshot ?? null const chainIdsToInitialize = new Set([ ...(implicitSession?.chainId !== undefined ? [implicitSession.chainId] : []), ...explicitSessions.map((s) => s.chainId), @@ -316,6 +321,10 @@ export class DappClient { this.userEmail = result[0]?.userEmail || null this.guard = implicitSession?.guard || explicitSessions.find((s) => !!s.guard)?.guard await this.sequenceStorage.clearSessionlessConnection() + if (this.sequenceStorage.clearSessionlessConnectionSnapshot) { + await this.sequenceStorage.clearSessionlessConnectionSnapshot() + } + this.cachedSessionlessConnection = null this.isInitialized = true this.emit('sessionsUpdated') @@ -369,6 +378,63 @@ export class DappClient { } } + /** + * Indicates if there is cached sessionless connection data that can be restored. + */ + public async hasRestorableSessionlessConnection(): Promise { + if (this.cachedSessionlessConnection) return true + this.cachedSessionlessConnection = this.sequenceStorage.getSessionlessConnectionSnapshot + ? await this.sequenceStorage.getSessionlessConnectionSnapshot() + : null + return this.cachedSessionlessConnection !== null + } + + /** + * Returns the cached sessionless connection metadata without altering client state. + * @returns The cached sessionless connection or null if none is available. + */ + public async getSessionlessConnectionInfo(): Promise { + if (!this.cachedSessionlessConnection) { + this.cachedSessionlessConnection = this.sequenceStorage.getSessionlessConnectionSnapshot + ? await this.sequenceStorage.getSessionlessConnectionSnapshot() + : null + } + if (!this.cachedSessionlessConnection) return null + return { + walletAddress: this.cachedSessionlessConnection.walletAddress, + loginMethod: this.cachedSessionlessConnection.loginMethod, + userEmail: this.cachedSessionlessConnection.userEmail, + guard: this.cachedSessionlessConnection.guard, + } + } + + /** + * 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. + */ + public async restoreSessionlessConnection(): Promise { + const sessionlessConnection = + this.cachedSessionlessConnection ?? + (this.sequenceStorage.getSessionlessConnectionSnapshot + ? await this.sequenceStorage.getSessionlessConnectionSnapshot() + : null) + if (!sessionlessConnection) { + return false + } + + await this.applySessionlessConnectionState( + sessionlessConnection.walletAddress, + sessionlessConnection.loginMethod, + sessionlessConnection.userEmail, + sessionlessConnection.guard, + ) + if (this.sequenceStorage.clearSessionlessConnectionSnapshot) { + await this.sequenceStorage.clearSessionlessConnectionSnapshot() + } + this.cachedSessionlessConnection = null + return true + } + /** * Handles the redirect response from the Wallet. * This is called automatically on `initialize()` for web environments but can be called manually @@ -881,6 +947,8 @@ export class DappClient { /** * Disconnects the client, clearing all session data from browser storage. * @remarks This action does not revoke the sessions on-chain. Sessions remain active until they expire or are manually revoked by the user in their wallet. + * @param options Options to control the disconnection behavior. + * @param options.keepSessionlessConnection When true, retains the latest wallet metadata so it can be restored later as a sessionless connection. Defaults to true. * @returns A promise that resolves when disconnection is complete. * * @example @@ -888,10 +956,12 @@ export class DappClient { * await dappClient.initialize(); * * if (dappClient.isInitialized) { - * await dappClient.disconnect(); + * await dappClient.disconnect({ keepSessionlessConnection: true }); * } */ - async disconnect(): Promise { + async disconnect(options?: { keepSessionlessConnection?: boolean }): Promise { + const keepSessionlessConnection = options?.keepSessionlessConnection ?? true + const transportMode = this.transport.mode this.transport.destroy() @@ -904,7 +974,30 @@ export class DappClient { ) this.chainSessionManagers.clear() + const sessionlessSnapshot = + keepSessionlessConnection && this.walletAddress + ? { + walletAddress: this.walletAddress, + loginMethod: this.loginMethod ?? undefined, + userEmail: this.userEmail ?? undefined, + guard: this.guard, + } + : undefined + await this.sequenceStorage.clearAllData() + + if (sessionlessSnapshot) { + if (this.sequenceStorage.saveSessionlessConnectionSnapshot) { + await this.sequenceStorage.saveSessionlessConnectionSnapshot(sessionlessSnapshot) + } + this.cachedSessionlessConnection = sessionlessSnapshot + } else { + if (this.sequenceStorage.clearSessionlessConnectionSnapshot) { + await this.sequenceStorage.clearSessionlessConnectionSnapshot() + } + this.cachedSessionlessConnection = null + } + this.isInitialized = false this.walletAddress = null this.loginMethod = null @@ -939,6 +1032,7 @@ export class DappClient { this.guard = guard this.hasSessionlessConnection = true this.isInitialized = true + this.cachedSessionlessConnection = null this.emit('sessionsUpdated') if (persist) { await this.sequenceStorage.saveSessionlessConnection({ diff --git a/packages/wallet/dapp-client/src/index.ts b/packages/wallet/dapp-client/src/index.ts index 9ffb334d90..d16662c372 100644 --- a/packages/wallet/dapp-client/src/index.ts +++ b/packages/wallet/dapp-client/src/index.ts @@ -39,6 +39,7 @@ export type { SequenceStorage, ExplicitSessionData, ImplicitSessionData, + SessionlessConnectionData, PendingRequestContext, PendingPayload, } from './utils/storage.js' diff --git a/packages/wallet/dapp-client/src/utils/storage.ts b/packages/wallet/dapp-client/src/utils/storage.ts index 2fa2eaac47..0995a6701f 100644 --- a/packages/wallet/dapp-client/src/utils/storage.ts +++ b/packages/wallet/dapp-client/src/utils/storage.ts @@ -77,6 +77,10 @@ export interface SequenceStorage { getSessionlessConnection(): Promise clearSessionlessConnection(): Promise + saveSessionlessConnectionSnapshot?(sessionData: SessionlessConnectionData): Promise + getSessionlessConnectionSnapshot?(): Promise + clearSessionlessConnectionSnapshot?(): Promise + clearAllData(): Promise } @@ -86,6 +90,7 @@ const STORE_NAME = 'userKeys' const IMPLICIT_SESSIONS_IDB_KEY = 'SequenceImplicitSession' const EXPLICIT_SESSIONS_IDB_KEY = 'SequenceExplicitSession' const SESSIONLESS_CONNECTION_IDB_KEY = 'SequenceSessionlessConnection' +const SESSIONLESS_CONNECTION_SNAPSHOT_IDB_KEY = 'SequenceSessionlessConnectionSnapshot' const PENDING_REDIRECT_REQUEST_KEY = 'SequencePendingRedirect' const TEMP_SESSION_PK_KEY = 'SequencePendingTempSessionPk' @@ -294,6 +299,33 @@ export class WebStorage implements SequenceStorage { } } + async saveSessionlessConnectionSnapshot(sessionData: SessionlessConnectionData): Promise { + try { + await this.setIDBItem(SESSIONLESS_CONNECTION_SNAPSHOT_IDB_KEY, sessionData) + } catch (error) { + console.error('Failed to save sessionless connection snapshot:', error) + throw error + } + } + + async getSessionlessConnectionSnapshot(): Promise { + try { + return (await this.getIDBItem(SESSIONLESS_CONNECTION_SNAPSHOT_IDB_KEY)) ?? null + } catch (error) { + console.error('Failed to retrieve sessionless connection snapshot:', error) + return null + } + } + + async clearSessionlessConnectionSnapshot(): Promise { + try { + await this.deleteIDBItem(SESSIONLESS_CONNECTION_SNAPSHOT_IDB_KEY) + } catch (error) { + console.error('Failed to clear sessionless connection snapshot:', error) + throw error + } + } + async clearAllData(): Promise { try { // Clear all session storage items @@ -305,6 +337,7 @@ export class WebStorage implements SequenceStorage { await this.clearExplicitSessions() await this.clearImplicitSession() await this.clearSessionlessConnection() + await this.clearSessionlessConnectionSnapshot() } catch (error) { console.error('Failed to clear all data:', error) throw error From ede175f9847f95965ccc7f048d5c850c7d1d9b38 Mon Sep 17 00:00:00 2001 From: Corban Brook Date: Mon, 27 Oct 2025 11:20:50 -0400 Subject: [PATCH 067/119] Allow to logout a wallet with skipRemoveDevice even if the wallet is not in a ready state to allow force removing of wallets (#906) --- packages/wallet/wdk/src/sequence/wallets.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/wallet/wdk/src/sequence/wallets.ts b/packages/wallet/wdk/src/sequence/wallets.ts index a859ca797e..e05d81ae15 100644 --- a/packages/wallet/wdk/src/sequence/wallets.ts +++ b/packages/wallet/wdk/src/sequence/wallets.ts @@ -1159,12 +1159,6 @@ export class Wallets implements WalletsInterface { throw new Error('wallet-not-found') } - // Prevent starting logout if already logging out or not ready - if (walletEntry.status !== 'ready') { - console.warn(`Logout called on wallet ${wallet} with status ${walletEntry.status}. Aborting.`) - throw new Error(`Wallet is not in 'ready' state for logout (current: ${walletEntry.status})`) - } - if (options?.skipRemoveDevice) { await Promise.all([ this.shared.databases.manager.del(wallet), @@ -1173,6 +1167,12 @@ export class Wallets implements WalletsInterface { return undefined as any } + // Prevent starting logout if already logging out or not ready + if (walletEntry.status !== 'ready') { + console.warn(`Logout called on wallet ${wallet} with status ${walletEntry.status}. Aborting.`) + throw new Error(`Wallet is not in 'ready' state for logout (current: ${walletEntry.status})`) + } + const device = await this.shared.modules.devices.get(walletEntry.device) if (!device) { throw new Error('device-not-found') From 69e51ec00b877d39155dcd1c26e52bb80c90c550 Mon Sep 17 00:00:00 2001 From: Corban Brook Date: Thu, 30 Oct 2025 19:12:46 -0400 Subject: [PATCH 068/119] Pass request to PromptCodeHandler in guard registerUI (#909) * Pass request to PromptCodeHandler in guard registerUI * Fixing guard registerUI test --- .../wallet/wdk/src/sequence/handlers/guard.ts | 20 +++++++++++-------- .../wdk/src/sequence/handlers/mnemonic.ts | 8 +++++--- .../wallet/wdk/src/sequence/handlers/otp.ts | 10 ++++++---- packages/wallet/wdk/src/sequence/manager.ts | 14 ++++++------- packages/wallet/wdk/test/guard.test.ts | 2 +- 5 files changed, 31 insertions(+), 23 deletions(-) diff --git a/packages/wallet/wdk/src/sequence/handlers/guard.ts b/packages/wallet/wdk/src/sequence/handlers/guard.ts index 0afb52a87f..c4217064be 100644 --- a/packages/wallet/wdk/src/sequence/handlers/guard.ts +++ b/packages/wallet/wdk/src/sequence/handlers/guard.ts @@ -5,21 +5,25 @@ import { BaseSignatureRequest, SignerUnavailable, SignerReady, SignerActionable, import { Signatures } from '../signatures.js' import { Guards } from '../guards.js' +type RespondFn = (code: string) => Promise + +export type PromptCodeHandler = ( + request: BaseSignatureRequest, + codeType: 'TOTP' | 'PIN', + respond: RespondFn, +) => Promise + export class GuardHandler implements Handler { kind = Kinds.Guard - private onPromptCode: - | undefined - | ((codeType: 'TOTP' | 'PIN', respond: (code: string) => Promise) => Promise) + private onPromptCode: undefined | PromptCodeHandler constructor( private readonly signatures: Signatures, private readonly guards: Guards, ) {} - public registerUI( - onPromptCode: (codeType: 'TOTP' | 'PIN', respond: (code: string) => Promise) => Promise, - ) { + public registerUI(onPromptCode: PromptCodeHandler) { this.onPromptCode = onPromptCode return () => { this.onPromptCode = undefined @@ -90,7 +94,7 @@ export class GuardHandler implements Handler { resolve(true) } catch (e) { if (e instanceof Guard.AuthRequiredError) { - const respond = async (code: string) => { + const respond: RespondFn = async (code: string) => { try { const signature = await guard.signEnvelope(request.envelope, { id: e.id, code }) await this.signatures.addSignature(request.id, signature) @@ -100,7 +104,7 @@ export class GuardHandler implements Handler { } } - await onPromptCode(e.id, respond) + await onPromptCode(request, e.id, respond) } else { reject(e) } diff --git a/packages/wallet/wdk/src/sequence/handlers/mnemonic.ts b/packages/wallet/wdk/src/sequence/handlers/mnemonic.ts index e24a32900a..dd8b27b806 100644 --- a/packages/wallet/wdk/src/sequence/handlers/mnemonic.ts +++ b/packages/wallet/wdk/src/sequence/handlers/mnemonic.ts @@ -7,15 +7,17 @@ import { SignerReady, SignerUnavailable, BaseSignatureRequest, SignerActionable type RespondFn = (mnemonic: string) => Promise +export type PromptMnemonicHandler = (respond: RespondFn) => Promise + export class MnemonicHandler implements Handler { kind = Kinds.LoginMnemonic - private onPromptMnemonic: undefined | ((respond: RespondFn) => Promise) + private onPromptMnemonic: undefined | PromptMnemonicHandler private readySigners = new Map() constructor(private readonly signatures: Signatures) {} - public registerUI(onPromptMnemonic: (respond: RespondFn) => Promise) { + public registerUI(onPromptMnemonic: PromptMnemonicHandler) { this.onPromptMnemonic = onPromptMnemonic return () => { this.onPromptMnemonic = undefined @@ -93,7 +95,7 @@ export class MnemonicHandler implements Handler { message: 'enter-mnemonic', handle: () => new Promise(async (resolve, reject) => { - const respond = async (mnemonic: string) => { + const respond: RespondFn = async (mnemonic: string) => { const signer = MnemonicHandler.toSigner(mnemonic) if (!signer) { return reject('invalid-mnemonic') diff --git a/packages/wallet/wdk/src/sequence/handlers/otp.ts b/packages/wallet/wdk/src/sequence/handlers/otp.ts index c6cb53aa8f..cd950a5d1a 100644 --- a/packages/wallet/wdk/src/sequence/handlers/otp.ts +++ b/packages/wallet/wdk/src/sequence/handlers/otp.ts @@ -11,16 +11,18 @@ import { AnswerIncorrectError, ChallengeExpiredError, TooManyAttemptsError } fro type RespondFn = (otp: string) => Promise +export type PromptOtpHandler = (recipient: string, respond: RespondFn) => Promise + export class OtpHandler extends IdentityHandler implements Handler { kind = Kinds.LoginEmailOtp - private onPromptOtp: undefined | ((recipient: string, respond: RespondFn) => Promise) + private onPromptOtp: undefined | PromptOtpHandler constructor(nitro: Identity.IdentityInstrument, signatures: Signatures, authKeys: Db.AuthKeys) { super(nitro, authKeys, signatures, Identity.IdentityType.Email) } - public registerUI(onPromptOtp: (recipient: string, respond: RespondFn) => Promise) { + public registerUI(onPromptOtp: PromptOtpHandler) { this.onPromptOtp = onPromptOtp return () => { this.onPromptOtp = undefined @@ -91,13 +93,13 @@ export class OtpHandler extends IdentityHandler implements Handler { private handleAuth( challenge: Identity.OtpChallenge, - onPromptOtp: (recipient: string, respond: RespondFn) => Promise, + onPromptOtp: PromptOtpHandler, ): Promise<{ signer: Signers.Signer & Signers.Witnessable; email: string }> { return new Promise(async (resolve, reject) => { try { const { loginHint, challenge: codeChallenge } = await this.nitroCommitVerifier(challenge) - const respond = async (otp: string) => { + const respond: RespondFn = async (otp: string) => { try { const { signer, email: returnedEmail } = await this.nitroCompleteAuth( challenge.withAnswer(codeChallenge, otp), diff --git a/packages/wallet/wdk/src/sequence/manager.ts b/packages/wallet/wdk/src/sequence/manager.ts index 2405e6f2d9..1d6d39c013 100644 --- a/packages/wallet/wdk/src/sequence/manager.ts +++ b/packages/wallet/wdk/src/sequence/manager.ts @@ -27,8 +27,10 @@ import { Signers } from './signers.js' import { Transactions, TransactionsInterface } from './transactions.js' import { Kinds } from './types/signer.js' import { Wallets, WalletsInterface } from './wallets.js' -import { GuardHandler } from './handlers/guard.js' +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' export type ManagerOptions = { verbose?: boolean @@ -500,18 +502,16 @@ export class Manager { } } - public registerMnemonicUI(onPromptMnemonic: (respond: (mnemonic: string) => Promise) => Promise) { + public registerMnemonicUI(onPromptMnemonic: PromptMnemonicHandler) { return this.mnemonicHandler.registerUI(onPromptMnemonic) } - public registerOtpUI(onPromptOtp: (recipient: string, respond: (otp: string) => Promise) => Promise) { + public registerOtpUI(onPromptOtp: PromptOtpHandler) { return this.otpHandler?.registerUI(onPromptOtp) || (() => {}) } - public registerGuardUI( - onPromptOtp: (codeType: 'TOTP' | 'PIN', respond: (otp: string) => Promise) => Promise, - ) { - return this.guardHandler?.registerUI(onPromptOtp) || (() => {}) + public registerGuardUI(onPromptCode: PromptCodeHandler) { + return this.guardHandler?.registerUI(onPromptCode) || (() => {}) } public async setRedirectPrefix(prefix: string) { diff --git a/packages/wallet/wdk/test/guard.test.ts b/packages/wallet/wdk/test/guard.test.ts index 136a072e45..6169a361af 100644 --- a/packages/wallet/wdk/test/guard.test.ts +++ b/packages/wallet/wdk/test/guard.test.ts @@ -223,7 +223,7 @@ describe('GuardHandler', () => { const mockAddSignature = vi.fn() signatures.addSignature = mockAddSignature - const mockCallback = vi.fn().mockImplementation(async (codeType, respond) => { + const mockCallback = vi.fn().mockImplementation(async (request, codeType, respond) => { expect(codeType).toBe('TOTP') await respond('123456') }) From 875a8c9ca4261b54ad899f8b28707d151e8480b3 Mon Sep 17 00:00:00 2001 From: Patryk Kalinowski Date: Fri, 31 Oct 2025 18:16:30 +0100 Subject: [PATCH 069/119] guard: allow using recovery code as 2FA token (#910) * guard: allow using recovery code as 2FA token * Cleanup types of ResponseFn --------- Co-authored-by: Corban Riley --- packages/wallet/core/src/signers/guard.ts | 2 +- packages/wallet/wdk/src/sequence/handlers/guard.ts | 6 +++--- packages/wallet/wdk/src/sequence/handlers/mnemonic.ts | 2 +- packages/wallet/wdk/src/sequence/handlers/otp.ts | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/wallet/core/src/signers/guard.ts b/packages/wallet/core/src/signers/guard.ts index 3a654edb46..d6316ddf08 100644 --- a/packages/wallet/core/src/signers/guard.ts +++ b/packages/wallet/core/src/signers/guard.ts @@ -4,7 +4,7 @@ import * as GuardService from '@0xsequence/guard' import * as Envelope from '../envelope.js' type GuardToken = { - id: 'TOTP' | 'PIN' + id: 'TOTP' | 'PIN' | 'recovery' code: string } diff --git a/packages/wallet/wdk/src/sequence/handlers/guard.ts b/packages/wallet/wdk/src/sequence/handlers/guard.ts index c4217064be..1ff7a19e4c 100644 --- a/packages/wallet/wdk/src/sequence/handlers/guard.ts +++ b/packages/wallet/wdk/src/sequence/handlers/guard.ts @@ -5,7 +5,7 @@ import { BaseSignatureRequest, SignerUnavailable, SignerReady, SignerActionable, import { Signatures } from '../signatures.js' import { Guards } from '../guards.js' -type RespondFn = (code: string) => Promise +type RespondFn = (id: 'TOTP' | 'PIN' | 'recovery', code: string) => Promise export type PromptCodeHandler = ( request: BaseSignatureRequest, @@ -94,9 +94,9 @@ export class GuardHandler implements Handler { resolve(true) } catch (e) { if (e instanceof Guard.AuthRequiredError) { - const respond: RespondFn = async (code: string) => { + const respond: RespondFn = async (id, code) => { try { - const signature = await guard.signEnvelope(request.envelope, { id: e.id, code }) + const signature = await guard.signEnvelope(request.envelope, { id, code }) await this.signatures.addSignature(request.id, signature) resolve(true) } catch (e) { diff --git a/packages/wallet/wdk/src/sequence/handlers/mnemonic.ts b/packages/wallet/wdk/src/sequence/handlers/mnemonic.ts index dd8b27b806..143edc0cdd 100644 --- a/packages/wallet/wdk/src/sequence/handlers/mnemonic.ts +++ b/packages/wallet/wdk/src/sequence/handlers/mnemonic.ts @@ -95,7 +95,7 @@ export class MnemonicHandler implements Handler { message: 'enter-mnemonic', handle: () => new Promise(async (resolve, reject) => { - const respond: RespondFn = async (mnemonic: string) => { + const respond: RespondFn = async (mnemonic) => { const signer = MnemonicHandler.toSigner(mnemonic) if (!signer) { return reject('invalid-mnemonic') diff --git a/packages/wallet/wdk/src/sequence/handlers/otp.ts b/packages/wallet/wdk/src/sequence/handlers/otp.ts index cd950a5d1a..f037189cbf 100644 --- a/packages/wallet/wdk/src/sequence/handlers/otp.ts +++ b/packages/wallet/wdk/src/sequence/handlers/otp.ts @@ -99,7 +99,7 @@ export class OtpHandler extends IdentityHandler implements Handler { try { const { loginHint, challenge: codeChallenge } = await this.nitroCommitVerifier(challenge) - const respond: RespondFn = async (otp: string) => { + const respond: RespondFn = async (otp) => { try { const { signer, email: returnedEmail } = await this.nitroCompleteAuth( challenge.withAnswer(codeChallenge, otp), From 20111650f337c5fd1e2b15f1a3c5417c27eb3771 Mon Sep 17 00:00:00 2001 From: Patryk Kalinowski Date: Tue, 4 Nov 2025 17:45:00 +0100 Subject: [PATCH 070/119] Add a way to reset 2fa when using a backup code (#911) * Add a way to reset 2fa when using a backup code * use the GuardToken type instead of breaking out the props --- packages/services/guard/src/client/guard.gen.ts | 9 +++++---- packages/wallet/core/src/signers/guard.ts | 5 +++-- packages/wallet/wdk/src/sequence/handlers/guard.ts | 7 ++++--- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/packages/services/guard/src/client/guard.gen.ts b/packages/services/guard/src/client/guard.gen.ts index ec0af4487a..4eea436eeb 100644 --- a/packages/services/guard/src/client/guard.gen.ts +++ b/packages/services/guard/src/client/guard.gen.ts @@ -1,5 +1,5 @@ /* eslint-disable */ -// sequence-guard v0.4.0 b62e755c3f81d6b5a8e7462abc063a57a744cdef +// sequence-guard v0.5.0 910e01c32ffb24b42386d4ca6be119b0acc55c5f // -- // Code generated by webrpc-gen@v0.25.3 with typescript generator. DO NOT EDIT. // @@ -7,16 +7,16 @@ export const WebrpcHeader = 'Webrpc' -export const WebrpcHeaderValue = 'webrpc@v0.25.3;gen-typescript@v0.17.0;sequence-guard@v0.4.0' +export const WebrpcHeaderValue = 'webrpc@v0.25.3;gen-typescript@v0.17.0;sequence-guard@v0.5.0' // WebRPC description and code-gen version export const WebRPCVersion = 'v1' // Schema version of your RIDL schema -export const WebRPCSchemaVersion = 'v0.4.0' +export const WebRPCSchemaVersion = 'v0.5.0' // Schema hash generated from your RIDL schema -export const WebRPCSchemaHash = 'b62e755c3f81d6b5a8e7462abc063a57a744cdef' +export const WebRPCSchemaHash = '910e01c32ffb24b42386d4ca6be119b0acc55c5f' type WebrpcGenVersions = { webrpcGenVersion: string @@ -131,6 +131,7 @@ export interface OwnershipProof { export interface AuthToken { id: string token: string + resetAuth?: boolean } export interface RecoveryCode { diff --git a/packages/wallet/core/src/signers/guard.ts b/packages/wallet/core/src/signers/guard.ts index d6316ddf08..6ee2f21302 100644 --- a/packages/wallet/core/src/signers/guard.ts +++ b/packages/wallet/core/src/signers/guard.ts @@ -3,9 +3,10 @@ import { Attestation, Payload } from '@0xsequence/wallet-primitives' import * as GuardService from '@0xsequence/guard' import * as Envelope from '../envelope.js' -type GuardToken = { +export type GuardToken = { id: 'TOTP' | 'PIN' | 'recovery' code: string + resetAuth?: boolean } export class Guard { @@ -36,7 +37,7 @@ export class Guard { digest, message, previousSignatures, - token ? { id: token.id, token: token.code } : undefined, + token ? { id: token.id, token: token.code, resetAuth: token.resetAuth } : undefined, ) return { address: this.guard.address, diff --git a/packages/wallet/wdk/src/sequence/handlers/guard.ts b/packages/wallet/wdk/src/sequence/handlers/guard.ts index 1ff7a19e4c..4274bedff6 100644 --- a/packages/wallet/wdk/src/sequence/handlers/guard.ts +++ b/packages/wallet/wdk/src/sequence/handlers/guard.ts @@ -1,11 +1,12 @@ import { Address, Hex } from 'ox' import * as Guard from '@0xsequence/guard' +import { Signers } from '@0xsequence/wallet-core' import { Handler } from './handler.js' import { BaseSignatureRequest, SignerUnavailable, SignerReady, SignerActionable, Kinds } from '../types/index.js' import { Signatures } from '../signatures.js' import { Guards } from '../guards.js' -type RespondFn = (id: 'TOTP' | 'PIN' | 'recovery', code: string) => Promise +type RespondFn = (token: Signers.GuardToken) => Promise export type PromptCodeHandler = ( request: BaseSignatureRequest, @@ -94,9 +95,9 @@ export class GuardHandler implements Handler { resolve(true) } catch (e) { if (e instanceof Guard.AuthRequiredError) { - const respond: RespondFn = async (id, code) => { + const respond: RespondFn = async (token) => { try { - const signature = await guard.signEnvelope(request.envelope, { id, code }) + const signature = await guard.signEnvelope(request.envelope, token) await this.signatures.addSignature(request.id, signature) resolve(true) } catch (e) { From 658404737065cd7d20f8e76bdcb214520b8335a9 Mon Sep 17 00:00:00 2001 From: Agusx1211 Date: Mon, 17 Nov 2025 17:41:08 +0000 Subject: [PATCH 071/119] Add rc4 contracts --- packages/wallet/primitives/src/context.ts | 21 +++++++++++++++++++ .../wallet/primitives/src/extensions/index.ts | 6 ++++++ packages/wallet/wdk/src/sequence/manager.ts | 6 +++--- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/packages/wallet/primitives/src/context.ts b/packages/wallet/primitives/src/context.ts index 001b9a5f19..a83f234876 100644 --- a/packages/wallet/primitives/src/context.ts +++ b/packages/wallet/primitives/src/context.ts @@ -59,6 +59,25 @@ export const Rc3_4337: Context = { }, } +export const Rc4: Context = { + factory: '0x00000000000018A77519fcCCa060c2537c9D6d3F', + stage1: '0x0000000000003DF093bc4257E6dCE45D937EF161', + stage2: '0x10bE1Abf3cD0918bb1079ECc6b8220c177F34088', + creationCode: '0x6041600e3d396021805130553df33d3d36153402601f57363d3d373d363d30545af43d82803e903d91601f57fd5bf3', +} + +export const Rc4_4337: Context = { + factory: '0x00000000000018A77519fcCCa060c2537c9D6d3F', + stage1: '0x0000000000003add039FF84b064B7347Fc23C444', + stage2: '0x4B3E5735665057A0A15eE448A7293bC01e3b4De9', + creationCode: '0x6041600e3d396021805130553df33d3d36153402601f57363d3d373d363d30545af43d82803e903d91601f57fd5bf3', + capabilities: { + erc4337: { + entrypoint: '0x0000000071727De22E5E9d8BAf0edAc6f37da032', + }, + }, +} + export type KnownContext = Context & { name: string development: boolean @@ -70,6 +89,8 @@ export const KnownContexts: KnownContext[] = [ { name: 'Dev2_4337', development: true, ...Dev2_4337 }, { name: 'Rc3', development: true, ...Rc3 }, { name: 'Rc3_4337', development: true, ...Rc3_4337 }, + { name: 'Rc4', development: false, ...Rc4 }, + { name: 'Rc4_4337', development: false, ...Rc4_4337 }, ] export function isKnownContext(context: Context): context is KnownContext { diff --git a/packages/wallet/primitives/src/extensions/index.ts b/packages/wallet/primitives/src/extensions/index.ts index 3d7582cbc2..fca976a6e9 100644 --- a/packages/wallet/primitives/src/extensions/index.ts +++ b/packages/wallet/primitives/src/extensions/index.ts @@ -24,5 +24,11 @@ export const Rc3: Extensions = { sessions: '0x0000000000CC58810c33F3a0D78aA1Ed80FaDcD8', } +export const Rc4: Extensions = { + passkeys: '0x0000000000005204F3711851EAD52CC9c241499a', + recovery: '0x000000000001FC499c3E177DD56Febb0A4bc15b7', + sessions: '0x00000000000030Bcc832F7d657f50D6Be35C92b3', +} + export * as Passkeys from './passkeys.js' export * as Recovery from './recovery.js' diff --git a/packages/wallet/wdk/src/sequence/manager.ts b/packages/wallet/wdk/src/sequence/manager.ts index 1d6d39c013..be7624cc0a 100644 --- a/packages/wallet/wdk/src/sequence/manager.ts +++ b/packages/wallet/wdk/src/sequence/manager.ts @@ -87,9 +87,9 @@ export type ManagerOptions = { export const ManagerOptionsDefaults = { verbose: false, - extensions: Extensions.Rc3, - context: Context.Rc3, - context4337: Context.Rc3_4337, + extensions: Extensions.Rc4, + context: Context.Rc4, + context4337: Context.Rc4_4337, guest: Constants.DefaultGuestAddress, encryptedPksDb: new CoreSigners.Pk.Encrypted.EncryptedPksDb(), From 0015053e05a5f63b20815d9f7e2d57199e8365df Mon Sep 17 00:00:00 2001 From: Agusx1211 Date: Mon, 17 Nov 2025 17:50:52 +0000 Subject: [PATCH 072/119] Set rc4 as default and add it to lists --- packages/wallet/core/src/state/local/index.ts | 2 +- packages/wallet/core/src/state/sequence/index.ts | 9 ++++++--- packages/wallet/core/test/session-manager.test.ts | 4 ++++ .../wallet/dapp-client/src/ChainSessionManager.ts | 4 ++-- .../primitives-cli/src/subcommands/address.ts | 2 +- packages/wallet/primitives/test/address.test.ts | 15 ++++++++++++++- packages/wallet/wdk/test/sessions.test.ts | 4 ++-- 7 files changed, 30 insertions(+), 10 deletions(-) diff --git a/packages/wallet/core/src/state/local/index.ts b/packages/wallet/core/src/state/local/index.ts index 77e15da6c7..cd6542245a 100644 --- a/packages/wallet/core/src/state/local/index.ts +++ b/packages/wallet/core/src/state/local/index.ts @@ -66,7 +66,7 @@ export interface Store { export class Provider implements ProviderInterface { constructor( private readonly store: Store = new MemoryStore(), - public readonly extensions: Extensions.Extensions = Extensions.Rc3, + public readonly extensions: Extensions.Extensions = Extensions.Rc4, ) {} getConfiguration(imageHash: Hex.Hex): Promise { diff --git a/packages/wallet/core/src/state/sequence/index.ts b/packages/wallet/core/src/state/sequence/index.ts index 140b3f1ca8..a394d8a7fe 100644 --- a/packages/wallet/core/src/state/sequence/index.ts +++ b/packages/wallet/core/src/state/sequence/index.ts @@ -364,9 +364,12 @@ export class Provider implements ProviderInterface { } } -const passkeySigners = [Extensions.Dev1.passkeys, Extensions.Dev2.passkeys, Extensions.Rc3.passkeys].map( - Address.checksum, -) +const passkeySigners = [ + Extensions.Dev1.passkeys, + Extensions.Dev2.passkeys, + Extensions.Rc3.passkeys, + Extensions.Rc4.passkeys, +].map(Address.checksum) const recoverSapientSignatureCompactSignature = 'function recoverSapientSignatureCompact(bytes32 _digest, bytes _signature) view returns (bytes32)' diff --git a/packages/wallet/core/test/session-manager.test.ts b/packages/wallet/core/test/session-manager.test.ts index 6a0bd156bb..58ef96dcb6 100644 --- a/packages/wallet/core/test/session-manager.test.ts +++ b/packages/wallet/core/test/session-manager.test.ts @@ -34,6 +34,10 @@ const ALL_EXTENSIONS = [ name: 'Rc3', ...Extensions.Rc3, }, + { + name: 'Rc4', + ...Extensions.Rc4, + }, ] // Handle the increment call being first or last depending on the session manager version diff --git a/packages/wallet/dapp-client/src/ChainSessionManager.ts b/packages/wallet/dapp-client/src/ChainSessionManager.ts index 6a7b3572e9..6785c18cdb 100644 --- a/packages/wallet/dapp-client/src/ChainSessionManager.ts +++ b/packages/wallet/dapp-client/src/ChainSessionManager.ts @@ -221,7 +221,7 @@ export class ChainSessionManager { stateProvider: this.stateProvider, }) this.sessionManager = new Signers.SessionManager(this.wallet, { - sessionManagerAddress: Extensions.Rc3.sessions, + sessionManagerAddress: Extensions.Rc4.sessions, provider: this.provider!, }) this.isInitialized = true @@ -730,7 +730,7 @@ export class ChainSessionManager { for (let attempt = 1; attempt <= maxRetries; attempt++) { try { const tempManager = new Signers.SessionManager(this.wallet, { - sessionManagerAddress: Extensions.Rc3.sessions, + sessionManagerAddress: Extensions.Rc4.sessions, provider: this.provider, }) const topology = await tempManager.getTopology() diff --git a/packages/wallet/primitives-cli/src/subcommands/address.ts b/packages/wallet/primitives-cli/src/subcommands/address.ts index b418f14066..c21eaa800d 100644 --- a/packages/wallet/primitives-cli/src/subcommands/address.ts +++ b/packages/wallet/primitives-cli/src/subcommands/address.ts @@ -45,7 +45,7 @@ const addressCommand: CommandModule = { .option('creationCode', { type: 'string', description: 'Creation code (optional)', - default: Context.Rc3.creationCode, + default: Context.Rc4.creationCode, }) }, async (argv) => { diff --git a/packages/wallet/primitives/test/address.test.ts b/packages/wallet/primitives/test/address.test.ts index c53ada1418..0abced1906 100644 --- a/packages/wallet/primitives/test/address.test.ts +++ b/packages/wallet/primitives/test/address.test.ts @@ -2,7 +2,7 @@ import { describe, expect, it } from 'vitest' import { Address, Bytes, Hash, Hex } from 'ox' import { from } from '../src/address.js' -import { Context, Dev1, Dev2, Rc3 } from '../src/context.js' +import { Context, Dev1, Dev2, Rc3, Rc4 } from '../src/context.js' import { Config, hashConfiguration } from '../src/config.js' describe('Address', () => { @@ -121,6 +121,19 @@ describe('Address', () => { expect(address).not.toBe(dev2Address) }) + it('should work with Rc4 context', () => { + const { stage2, ...rc4Context } = Rc4 + const address = from(sampleConfig, rc4Context) + + expect(() => Address.assert(address)).not.toThrow() + expect(address).toMatch(/^0x[a-fA-F0-9]{40}$/) + + // Should be different from Dev2 + const { stage2: _, ...dev2Context } = Dev2 + const dev2Address = from(sampleConfig, dev2Context) + expect(address).not.toBe(dev2Address) + }) + it('should handle complex topology configurations', () => { const complexConfig: Config = { threshold: 2n, diff --git a/packages/wallet/wdk/test/sessions.test.ts b/packages/wallet/wdk/test/sessions.test.ts index f6d8a144b0..9f2add5009 100644 --- a/packages/wallet/wdk/test/sessions.test.ts +++ b/packages/wallet/wdk/test/sessions.test.ts @@ -132,7 +132,7 @@ describe('Sessions (via Manager)', () => { wallet: coreWallet, sessionManager: new CoreSigners.SessionManager(coreWallet, { provider, - sessionManagerAddress: Extensions.Rc3.sessions, + sessionManagerAddress: Extensions.Rc4.sessions, }), } }) @@ -210,7 +210,7 @@ describe('Sessions (via Manager)', () => { dapp.wallet = coreWallet dapp.sessionManager = new CoreSigners.SessionManager(coreWallet, { provider, - sessionManagerAddress: Extensions.Rc3.sessions, + sessionManagerAddress: Extensions.Rc4.sessions, }) // At this point the wallet should NOT have a session topology From 13afc12103b2268d42a8af22ef1799720c6e9ed4 Mon Sep 17 00:00:00 2001 From: Michael Standen Date: Thu, 30 Oct 2025 09:07:47 +1300 Subject: [PATCH 073/119] Session enhanced replay protection --- .../core/src/signers/session/explicit.ts | 11 ++- .../core/src/signers/session/implicit.ts | 11 ++- .../primitives/src/session-signature.ts | 23 +++++- .../primitives/test/session-signature.test.ts | 77 ++++++++++++++----- 4 files changed, 93 insertions(+), 29 deletions(-) diff --git a/packages/wallet/core/src/signers/session/explicit.ts b/packages/wallet/core/src/signers/session/explicit.ts index e373b04699..e20f3a5b73 100644 --- a/packages/wallet/core/src/signers/session/explicit.ts +++ b/packages/wallet/core/src/signers/session/explicit.ts @@ -263,10 +263,13 @@ export class Explicit implements ExplicitSessionSigner { } // Sign it - const useDeprecatedHash = - Address.isEqual(sessionManagerAddress, Extensions.Dev1.sessions) || - Address.isEqual(sessionManagerAddress, Extensions.Dev2.sessions) - const callHash = SessionSignature.hashCallWithReplayProtection(payload, callIdx, chainId, useDeprecatedHash) + const callHash = SessionSignature.hashCallWithReplayProtection( + wallet, + payload, + callIdx, + chainId, + sessionManagerAddress, + ) const sessionSignature = await this._privateKey.signDigest(Bytes.fromHex(callHash)) return { permissionIndex: BigInt(permissionIndex), diff --git a/packages/wallet/core/src/signers/session/implicit.ts b/packages/wallet/core/src/signers/session/implicit.ts index 4e74c3a0f0..481b91c273 100644 --- a/packages/wallet/core/src/signers/session/implicit.ts +++ b/packages/wallet/core/src/signers/session/implicit.ts @@ -115,10 +115,13 @@ export class Implicit implements ImplicitSessionSigner { if (!isSupported) { throw new Error('Unsupported call') } - const useDeprecatedHash = - Address.isEqual(sessionManagerAddress, Extensions.Dev1.sessions) || - Address.isEqual(sessionManagerAddress, Extensions.Dev2.sessions) - const callHash = SessionSignature.hashCallWithReplayProtection(payload, callIdx, chainId, useDeprecatedHash) + const callHash = SessionSignature.hashCallWithReplayProtection( + wallet, + payload, + callIdx, + chainId, + sessionManagerAddress, + ) const sessionSignature = await this._privateKey.signDigest(Bytes.fromHex(callHash)) return { attestation: this._attestation, diff --git a/packages/wallet/primitives/src/session-signature.ts b/packages/wallet/primitives/src/session-signature.ts index a9f5144a13..c8ef192138 100644 --- a/packages/wallet/primitives/src/session-signature.ts +++ b/packages/wallet/primitives/src/session-signature.ts @@ -1,4 +1,5 @@ import { Address, Bytes, Hash, Hex } from 'ox' +import { Attestation, Extensions, Payload } from './index.js' import { MAX_PERMISSIONS_COUNT } from './permission.js' import { decodeSessionsTopology, @@ -10,7 +11,6 @@ import { } from './session-config.js' import { RSY } from './signature.js' import { minBytesFor, packRSY, unpackRSY } from './utils.js' -import { Attestation, Payload } from './index.js' export type ImplicitSessionCallSignature = { attestation: Attestation.Attestation @@ -273,20 +273,37 @@ export function decodeSessionSignature(encodedSignatures: Bytes.Bytes): { // Call encoding +/** + * Hashes a call with replay protection parameters. + * @param payload The payload to hash. + * @param callIdx The index of the call to hash. + * @param chainId The chain ID. Use 0 when noChainId enabled. + * @param sessionManagerAddress The session manager address to compile the hash for. Only required to support deprecated hash encodings for Dev1, Dev2 and Rc3. + * @returns The hash of the call with replay protection parameters for sessions. + */ export function hashCallWithReplayProtection( + wallet: Address.Address, payload: Payload.Calls, callIdx: number, chainId: number, - skipCallIdx: boolean = false, // Deprecated. Dev1 and Dev2 support + sessionManagerAddress?: Address.Address, ): Hex.Hex { const call = payload.calls[callIdx]! + // Support deprecated hashes for Dev1, Dev2 and Rc3 + const ignoreCallIdx = + sessionManagerAddress && + (Address.isEqual(sessionManagerAddress, Extensions.Dev1.sessions) || + Address.isEqual(sessionManagerAddress, Extensions.Dev2.sessions)) + const ignoreWallet = + ignoreCallIdx || (sessionManagerAddress && Address.isEqual(sessionManagerAddress, Extensions.Rc3.sessions)) return Hex.fromBytes( Hash.keccak256( Bytes.concat( + ignoreWallet ? Bytes.from([]) : Bytes.fromHex(wallet), Bytes.fromNumber(chainId, { size: 32 }), Bytes.fromNumber(payload.space, { size: 32 }), Bytes.fromNumber(payload.nonce, { size: 32 }), - skipCallIdx ? Bytes.from([]) : Bytes.fromNumber(callIdx, { size: 32 }), + ignoreCallIdx ? Bytes.from([]) : Bytes.fromNumber(callIdx, { size: 32 }), Bytes.fromHex(Payload.hashCall(call)), ), ), diff --git a/packages/wallet/primitives/test/session-signature.test.ts b/packages/wallet/primitives/test/session-signature.test.ts index b8efe28c2f..733604da0f 100644 --- a/packages/wallet/primitives/test/session-signature.test.ts +++ b/packages/wallet/primitives/test/session-signature.test.ts @@ -21,6 +21,7 @@ import { sessionCallSignatureToJson, } from '../src/session-signature.js' import { RSY } from '../src/signature.js' +import { Extensions } from '../src/index.js' describe('Session Signature', () => { // Test data @@ -446,22 +447,23 @@ describe('Session Signature', () => { describe('Helper Functions', () => { describe('hashCallWithReplayProtection', () => { it('should hash call with replay protection parameters', () => { - const result = hashCallWithReplayProtection(samplePayload, 0, testChainId) + const result = hashCallWithReplayProtection(testAddress1, samplePayload, 0, testChainId) expect(result).toMatch(/^0x[0-9a-f]{64}$/) // 32-byte hex string expect(Hex.size(result)).toBe(32) }) it('should produce different hashes for different chain IDs', () => { - const hash1 = hashCallWithReplayProtection(samplePayload, 0, ChainId.MAINNET) - const hash2 = hashCallWithReplayProtection(samplePayload, 0, ChainId.POLYGON) + const hash1 = hashCallWithReplayProtection(testAddress1, samplePayload, 0, ChainId.MAINNET) + const hash2 = hashCallWithReplayProtection(testAddress1, samplePayload, 0, ChainId.POLYGON) expect(hash1).not.toBe(hash2) }) it('should produce different hashes for different spaces', () => { - const hash1 = hashCallWithReplayProtection(samplePayload, 0, testChainId) + const hash1 = hashCallWithReplayProtection(testAddress1, samplePayload, 0, testChainId) const hash2 = hashCallWithReplayProtection( + testAddress1, { ...samplePayload, space: samplePayload.space + 1n }, 0, testChainId, @@ -471,8 +473,9 @@ describe('Session Signature', () => { }) it('should produce different hashes for different nonces', () => { - const hash1 = hashCallWithReplayProtection(samplePayload, 0, testChainId) + const hash1 = hashCallWithReplayProtection(testAddress1, samplePayload, 0, testChainId) const hash2 = hashCallWithReplayProtection( + testAddress1, { ...samplePayload, nonce: samplePayload.nonce + 1n }, 0, testChainId, @@ -488,17 +491,51 @@ describe('Session Signature', () => { } const payload2 = { ...samplePayload, calls: [call2] } - const hash1 = hashCallWithReplayProtection(samplePayload, 0, testChainId) - const hash2 = hashCallWithReplayProtection(payload2, 0, testChainId) + const hash1 = hashCallWithReplayProtection(testAddress1, samplePayload, 0, testChainId) + const hash2 = hashCallWithReplayProtection(testAddress1, payload2, 0, testChainId) expect(hash1).not.toBe(hash2) }) + it('should produce different hashes for different wallets', () => { + const payload = { ...samplePayload, calls: [sampleCall, sampleCall] } + + const hash1 = hashCallWithReplayProtection(testAddress1, payload, 0, testChainId) + const hash2 = hashCallWithReplayProtection(testAddress2, payload, 0, testChainId) + + expect(hash1).not.toBe(hash2) + }) + + it('should NOT produce different hashes for different wallets when using deprecated hash encoding for Dev1 and Dev2', () => { + // This is ONLY for backward compatibility with Dev1 and Dev2 + // This is exploitable and should not be used in practice + const payload = { ...samplePayload, calls: [sampleCall, sampleCall] } + + const hash1 = hashCallWithReplayProtection(testAddress1, payload, 0, testChainId, Extensions.Dev1.sessions) + const hash2 = hashCallWithReplayProtection(testAddress2, payload, 0, testChainId, Extensions.Dev2.sessions) + + expect(hash1).toBe(hash2) + }) + + it('should produce different hashes for different wallets when using deprecated hash encoding for Dev1/2, Rc3 and latest', () => { + // This is ONLY for backward compatibility with Rc3 + // This is exploitable and should not be used in practice + const payload = { ...samplePayload, calls: [sampleCall, sampleCall] } + + const hash1 = hashCallWithReplayProtection(testAddress1, payload, 0, testChainId, Extensions.Dev1.sessions) + const hash2 = hashCallWithReplayProtection(testAddress2, payload, 0, testChainId, Extensions.Rc3.sessions) + const hash3 = hashCallWithReplayProtection(testAddress2, payload, 0, testChainId) + + expect(hash1).not.toBe(hash2) + expect(hash1).not.toBe(hash3) + expect(hash2).not.toBe(hash3) + }) + it('should produce different hashes for same call at different index', () => { const payload = { ...samplePayload, calls: [sampleCall, sampleCall] } - const hash1 = hashCallWithReplayProtection(payload, 0, testChainId) - const hash2 = hashCallWithReplayProtection(payload, 1, testChainId) + const hash1 = hashCallWithReplayProtection(testAddress1, payload, 0, testChainId) + const hash2 = hashCallWithReplayProtection(testAddress1, payload, 1, testChainId) expect(hash1).not.toBe(hash2) }) @@ -508,15 +545,15 @@ describe('Session Signature', () => { // This is exploitable and should not be used in practice const payload = { ...samplePayload, calls: [sampleCall, sampleCall] } - const hash1 = hashCallWithReplayProtection(payload, 0, testChainId, true) - const hash2 = hashCallWithReplayProtection(payload, 1, testChainId, true) + const hash1 = hashCallWithReplayProtection(testAddress1, payload, 0, testChainId, Extensions.Dev1.sessions) + const hash2 = hashCallWithReplayProtection(testAddress1, payload, 1, testChainId, Extensions.Dev1.sessions) expect(hash1).toBe(hash2) }) it('should be deterministic', () => { - const hash1 = hashCallWithReplayProtection(samplePayload, 0, testChainId) - const hash2 = hashCallWithReplayProtection(samplePayload, 0, testChainId) + const hash1 = hashCallWithReplayProtection(testAddress1, samplePayload, 0, testChainId) + const hash2 = hashCallWithReplayProtection(testAddress1, samplePayload, 0, testChainId) expect(hash1).toBe(hash2) }) @@ -527,6 +564,7 @@ describe('Session Signature', () => { const largeNonce = 2n ** 24n const result = hashCallWithReplayProtection( + testAddress1, { ...samplePayload, space: largeSpace, nonce: largeNonce }, 0, largeChainId, @@ -535,7 +573,7 @@ describe('Session Signature', () => { }) it('should handle zero values', () => { - const result = hashCallWithReplayProtection({ ...samplePayload, space: 0n, nonce: 0n }, 0, 0) + const result = hashCallWithReplayProtection(testAddress1, { ...samplePayload, space: 0n, nonce: 0n }, 0, 0) expect(result).toMatch(/^0x[0-9a-f]{64}$/) }) @@ -546,7 +584,7 @@ describe('Session Signature', () => { } const payload = { ...samplePayload, calls: [callWithEmptyData] } - const result = hashCallWithReplayProtection(payload, 0, testChainId) + const result = hashCallWithReplayProtection(testAddress1, payload, 0, testChainId) expect(result).toMatch(/^0x[0-9a-f]{64}$/) }) @@ -557,8 +595,8 @@ describe('Session Signature', () => { } const payload = { ...samplePayload, calls: [delegateCall] } - const hash1 = hashCallWithReplayProtection(samplePayload, 0, testChainId) - const hash2 = hashCallWithReplayProtection(payload, 0, testChainId) + const hash1 = hashCallWithReplayProtection(testAddress1, samplePayload, 0, testChainId) + const hash2 = hashCallWithReplayProtection(testAddress1, payload, 0, testChainId) expect(hash1).not.toBe(hash2) }) @@ -735,12 +773,15 @@ describe('Session Signature', () => { const calls: Payload.Call[] = [ sampleCall, { ...sampleCall, to: testAddress2 }, + { ...sampleCall, to: testAddress2 }, // Repeat call { ...sampleCall, value: 500000000000000000n }, ] const payload = { ...samplePayload, calls: calls } // Generate hashes for each call - const hashes = calls.map((call) => hashCallWithReplayProtection(payload, calls.indexOf(call), testChainId)) + const hashes = calls.map((call) => + hashCallWithReplayProtection(testAddress1, payload, calls.indexOf(call), testChainId), + ) // All hashes should be valid and different for (let i = 0; i < hashes.length; i++) { From 3b1db90eaaf90e26194fe4d2a54b5fc98ac440ad Mon Sep 17 00:00:00 2001 From: Michael Standen Date: Fri, 31 Oct 2025 12:11:39 +1300 Subject: [PATCH 074/119] New sessions replay protection hashes payload --- .../core/src/signers/session/explicit.ts | 8 +- .../core/src/signers/session/implicit.ts | 8 +- .../wallet/core/test/session-manager.test.ts | 4 +- packages/wallet/primitives/src/payload.ts | 4 + .../primitives/src/session-signature.ts | 45 +- .../primitives/test/session-signature.test.ts | 60 +- packages/wallet/wdk/test/sessions.test.ts | 968 +++++++++--------- 7 files changed, 564 insertions(+), 533 deletions(-) diff --git a/packages/wallet/core/src/signers/session/explicit.ts b/packages/wallet/core/src/signers/session/explicit.ts index e20f3a5b73..cd72b2256f 100644 --- a/packages/wallet/core/src/signers/session/explicit.ts +++ b/packages/wallet/core/src/signers/session/explicit.ts @@ -263,13 +263,7 @@ export class Explicit implements ExplicitSessionSigner { } // Sign it - const callHash = SessionSignature.hashCallWithReplayProtection( - wallet, - payload, - callIdx, - chainId, - sessionManagerAddress, - ) + const callHash = SessionSignature.hashPayloadWithCallIdx(wallet, payload, callIdx, chainId, sessionManagerAddress) const sessionSignature = await this._privateKey.signDigest(Bytes.fromHex(callHash)) return { permissionIndex: BigInt(permissionIndex), diff --git a/packages/wallet/core/src/signers/session/implicit.ts b/packages/wallet/core/src/signers/session/implicit.ts index 481b91c273..71b1128650 100644 --- a/packages/wallet/core/src/signers/session/implicit.ts +++ b/packages/wallet/core/src/signers/session/implicit.ts @@ -115,13 +115,7 @@ export class Implicit implements ImplicitSessionSigner { if (!isSupported) { throw new Error('Unsupported call') } - const callHash = SessionSignature.hashCallWithReplayProtection( - wallet, - payload, - callIdx, - chainId, - sessionManagerAddress, - ) + const callHash = SessionSignature.hashPayloadWithCallIdx(wallet, payload, callIdx, chainId, sessionManagerAddress) const sessionSignature = await this._privateKey.signDigest(Bytes.fromHex(callHash)) return { attestation: this._attestation, diff --git a/packages/wallet/core/test/session-manager.test.ts b/packages/wallet/core/test/session-manager.test.ts index 58ef96dcb6..bfbc28b17c 100644 --- a/packages/wallet/core/test/session-manager.test.ts +++ b/packages/wallet/core/test/session-manager.test.ts @@ -13,7 +13,7 @@ import { USDC_ADDRESS, } from './constants' import { Extensions } from '@0xsequence/wallet-primitives' -import { ExplicitSessionConfig } from '../../wdk/src/sequence/types/sessions.js' +import { ExplicitSessionConfig } from '../src/utils/session/types.js' const { PermissionBuilder, ERC20PermissionBuilder } = Utils @@ -565,7 +565,7 @@ for (const extension of ALL_EXTENSIONS) { } // Sign the transaction - expect(sessionManager.signSapient(wallet.address, chainId, payload, imageHash)).rejects.toThrow( + await expect(sessionManager.signSapient(wallet.address, chainId, payload, imageHash)).rejects.toThrow( `Signer supporting call is expired: ${explicitSigner.address}`, ) }, diff --git a/packages/wallet/primitives/src/payload.ts b/packages/wallet/primitives/src/payload.ts index c8f05ee8d0..1359abdbe9 100644 --- a/packages/wallet/primitives/src/payload.ts +++ b/packages/wallet/primitives/src/payload.ts @@ -184,6 +184,10 @@ export function isCalls4337_07(payload: Payload): payload is Calls4337_07 { return payload.type === 'call_4337_07' } +export function isParented(payload: Payload): payload is Parented { + return 'parentWallets' in payload +} + export function toRecovery(payload: T): Recovery { if (isRecovery(payload)) { return payload diff --git a/packages/wallet/primitives/src/session-signature.ts b/packages/wallet/primitives/src/session-signature.ts index c8ef192138..c3f67ca241 100644 --- a/packages/wallet/primitives/src/session-signature.ts +++ b/packages/wallet/primitives/src/session-signature.ts @@ -281,31 +281,40 @@ export function decodeSessionSignature(encodedSignatures: Bytes.Bytes): { * @param sessionManagerAddress The session manager address to compile the hash for. Only required to support deprecated hash encodings for Dev1, Dev2 and Rc3. * @returns The hash of the call with replay protection parameters for sessions. */ -export function hashCallWithReplayProtection( +export function hashPayloadWithCallIdx( wallet: Address.Address, - payload: Payload.Calls, + payload: Payload.Calls & Payload.Parent, callIdx: number, chainId: number, sessionManagerAddress?: Address.Address, ): Hex.Hex { - const call = payload.calls[callIdx]! // Support deprecated hashes for Dev1, Dev2 and Rc3 - const ignoreCallIdx = + const deprecatedHashing = sessionManagerAddress && (Address.isEqual(sessionManagerAddress, Extensions.Dev1.sessions) || - Address.isEqual(sessionManagerAddress, Extensions.Dev2.sessions)) - const ignoreWallet = - ignoreCallIdx || (sessionManagerAddress && Address.isEqual(sessionManagerAddress, Extensions.Rc3.sessions)) - return Hex.fromBytes( - Hash.keccak256( - Bytes.concat( - ignoreWallet ? Bytes.from([]) : Bytes.fromHex(wallet), - Bytes.fromNumber(chainId, { size: 32 }), - Bytes.fromNumber(payload.space, { size: 32 }), - Bytes.fromNumber(payload.nonce, { size: 32 }), - ignoreCallIdx ? Bytes.from([]) : Bytes.fromNumber(callIdx, { size: 32 }), - Bytes.fromHex(Payload.hashCall(call)), + Address.isEqual(sessionManagerAddress, Extensions.Dev2.sessions) || + Address.isEqual(sessionManagerAddress, Extensions.Rc3.sessions)) + if (deprecatedHashing) { + const call = payload.calls[callIdx]! + const ignoreCallIdx = !Address.isEqual(sessionManagerAddress, Extensions.Rc3.sessions) + return Hex.fromBytes( + Hash.keccak256( + Bytes.concat( + Bytes.fromNumber(chainId, { size: 32 }), + Bytes.fromNumber(payload.space, { size: 32 }), + Bytes.fromNumber(payload.nonce, { size: 32 }), + ignoreCallIdx ? Bytes.from([]) : Bytes.fromNumber(callIdx, { size: 32 }), + Bytes.fromHex(Payload.hashCall(call)), + ), ), - ), - ) + ) + } + // Current hashing scheme uses entire payload hash and call index (without last parent) + const parentWallets = payload.parentWallets + if (payload.parentWallets && payload.parentWallets.length > 0) { + payload.parentWallets.pop() + } + const payloadHash = Payload.hash(wallet, chainId, payload) + payload.parentWallets = parentWallets + return Hex.fromBytes(Hash.keccak256(Bytes.concat(payloadHash, Bytes.fromNumber(callIdx, { size: 32 })))) } diff --git a/packages/wallet/primitives/test/session-signature.test.ts b/packages/wallet/primitives/test/session-signature.test.ts index 733604da0f..a1fd0fe233 100644 --- a/packages/wallet/primitives/test/session-signature.test.ts +++ b/packages/wallet/primitives/test/session-signature.test.ts @@ -11,7 +11,7 @@ import { encodeSessionCallSignatureForJson, encodeSessionSignature, ExplicitSessionCallSignature, - hashCallWithReplayProtection, + hashPayloadWithCallIdx, ImplicitSessionCallSignature, isExplicitSessionCallSignature, isImplicitSessionCallSignature, @@ -445,24 +445,24 @@ describe('Session Signature', () => { }) describe('Helper Functions', () => { - describe('hashCallWithReplayProtection', () => { + describe('hashPayloadWithCallIdx', () => { it('should hash call with replay protection parameters', () => { - const result = hashCallWithReplayProtection(testAddress1, samplePayload, 0, testChainId) + const result = hashPayloadWithCallIdx(testAddress1, samplePayload, 0, testChainId) expect(result).toMatch(/^0x[0-9a-f]{64}$/) // 32-byte hex string expect(Hex.size(result)).toBe(32) }) it('should produce different hashes for different chain IDs', () => { - const hash1 = hashCallWithReplayProtection(testAddress1, samplePayload, 0, ChainId.MAINNET) - const hash2 = hashCallWithReplayProtection(testAddress1, samplePayload, 0, ChainId.POLYGON) + const hash1 = hashPayloadWithCallIdx(testAddress1, samplePayload, 0, ChainId.MAINNET) + const hash2 = hashPayloadWithCallIdx(testAddress1, samplePayload, 0, ChainId.POLYGON) expect(hash1).not.toBe(hash2) }) it('should produce different hashes for different spaces', () => { - const hash1 = hashCallWithReplayProtection(testAddress1, samplePayload, 0, testChainId) - const hash2 = hashCallWithReplayProtection( + const hash1 = hashPayloadWithCallIdx(testAddress1, samplePayload, 0, testChainId) + const hash2 = hashPayloadWithCallIdx( testAddress1, { ...samplePayload, space: samplePayload.space + 1n }, 0, @@ -473,8 +473,8 @@ describe('Session Signature', () => { }) it('should produce different hashes for different nonces', () => { - const hash1 = hashCallWithReplayProtection(testAddress1, samplePayload, 0, testChainId) - const hash2 = hashCallWithReplayProtection( + const hash1 = hashPayloadWithCallIdx(testAddress1, samplePayload, 0, testChainId) + const hash2 = hashPayloadWithCallIdx( testAddress1, { ...samplePayload, nonce: samplePayload.nonce + 1n }, 0, @@ -491,8 +491,8 @@ describe('Session Signature', () => { } const payload2 = { ...samplePayload, calls: [call2] } - const hash1 = hashCallWithReplayProtection(testAddress1, samplePayload, 0, testChainId) - const hash2 = hashCallWithReplayProtection(testAddress1, payload2, 0, testChainId) + const hash1 = hashPayloadWithCallIdx(testAddress1, samplePayload, 0, testChainId) + const hash2 = hashPayloadWithCallIdx(testAddress1, payload2, 0, testChainId) expect(hash1).not.toBe(hash2) }) @@ -500,8 +500,8 @@ describe('Session Signature', () => { it('should produce different hashes for different wallets', () => { const payload = { ...samplePayload, calls: [sampleCall, sampleCall] } - const hash1 = hashCallWithReplayProtection(testAddress1, payload, 0, testChainId) - const hash2 = hashCallWithReplayProtection(testAddress2, payload, 0, testChainId) + const hash1 = hashPayloadWithCallIdx(testAddress1, payload, 0, testChainId) + const hash2 = hashPayloadWithCallIdx(testAddress2, payload, 0, testChainId) expect(hash1).not.toBe(hash2) }) @@ -511,8 +511,8 @@ describe('Session Signature', () => { // This is exploitable and should not be used in practice const payload = { ...samplePayload, calls: [sampleCall, sampleCall] } - const hash1 = hashCallWithReplayProtection(testAddress1, payload, 0, testChainId, Extensions.Dev1.sessions) - const hash2 = hashCallWithReplayProtection(testAddress2, payload, 0, testChainId, Extensions.Dev2.sessions) + const hash1 = hashPayloadWithCallIdx(testAddress1, payload, 0, testChainId, Extensions.Dev1.sessions) + const hash2 = hashPayloadWithCallIdx(testAddress2, payload, 0, testChainId, Extensions.Dev2.sessions) expect(hash1).toBe(hash2) }) @@ -522,9 +522,9 @@ describe('Session Signature', () => { // This is exploitable and should not be used in practice const payload = { ...samplePayload, calls: [sampleCall, sampleCall] } - const hash1 = hashCallWithReplayProtection(testAddress1, payload, 0, testChainId, Extensions.Dev1.sessions) - const hash2 = hashCallWithReplayProtection(testAddress2, payload, 0, testChainId, Extensions.Rc3.sessions) - const hash3 = hashCallWithReplayProtection(testAddress2, payload, 0, testChainId) + const hash1 = hashPayloadWithCallIdx(testAddress1, payload, 0, testChainId, Extensions.Dev1.sessions) + const hash2 = hashPayloadWithCallIdx(testAddress2, payload, 0, testChainId, Extensions.Rc3.sessions) + const hash3 = hashPayloadWithCallIdx(testAddress2, payload, 0, testChainId) expect(hash1).not.toBe(hash2) expect(hash1).not.toBe(hash3) @@ -534,8 +534,8 @@ describe('Session Signature', () => { it('should produce different hashes for same call at different index', () => { const payload = { ...samplePayload, calls: [sampleCall, sampleCall] } - const hash1 = hashCallWithReplayProtection(testAddress1, payload, 0, testChainId) - const hash2 = hashCallWithReplayProtection(testAddress1, payload, 1, testChainId) + const hash1 = hashPayloadWithCallIdx(testAddress1, payload, 0, testChainId) + const hash2 = hashPayloadWithCallIdx(testAddress1, payload, 1, testChainId) expect(hash1).not.toBe(hash2) }) @@ -545,15 +545,15 @@ describe('Session Signature', () => { // This is exploitable and should not be used in practice const payload = { ...samplePayload, calls: [sampleCall, sampleCall] } - const hash1 = hashCallWithReplayProtection(testAddress1, payload, 0, testChainId, Extensions.Dev1.sessions) - const hash2 = hashCallWithReplayProtection(testAddress1, payload, 1, testChainId, Extensions.Dev1.sessions) + const hash1 = hashPayloadWithCallIdx(testAddress1, payload, 0, testChainId, Extensions.Dev1.sessions) + const hash2 = hashPayloadWithCallIdx(testAddress1, payload, 1, testChainId, Extensions.Dev1.sessions) expect(hash1).toBe(hash2) }) it('should be deterministic', () => { - const hash1 = hashCallWithReplayProtection(testAddress1, samplePayload, 0, testChainId) - const hash2 = hashCallWithReplayProtection(testAddress1, samplePayload, 0, testChainId) + const hash1 = hashPayloadWithCallIdx(testAddress1, samplePayload, 0, testChainId) + const hash2 = hashPayloadWithCallIdx(testAddress1, samplePayload, 0, testChainId) expect(hash1).toBe(hash2) }) @@ -563,7 +563,7 @@ describe('Session Signature', () => { const largeSpace = 2n ** 16n const largeNonce = 2n ** 24n - const result = hashCallWithReplayProtection( + const result = hashPayloadWithCallIdx( testAddress1, { ...samplePayload, space: largeSpace, nonce: largeNonce }, 0, @@ -573,7 +573,7 @@ describe('Session Signature', () => { }) it('should handle zero values', () => { - const result = hashCallWithReplayProtection(testAddress1, { ...samplePayload, space: 0n, nonce: 0n }, 0, 0) + const result = hashPayloadWithCallIdx(testAddress1, { ...samplePayload, space: 0n, nonce: 0n }, 0, 0) expect(result).toMatch(/^0x[0-9a-f]{64}$/) }) @@ -584,7 +584,7 @@ describe('Session Signature', () => { } const payload = { ...samplePayload, calls: [callWithEmptyData] } - const result = hashCallWithReplayProtection(testAddress1, payload, 0, testChainId) + const result = hashPayloadWithCallIdx(testAddress1, payload, 0, testChainId) expect(result).toMatch(/^0x[0-9a-f]{64}$/) }) @@ -595,8 +595,8 @@ describe('Session Signature', () => { } const payload = { ...samplePayload, calls: [delegateCall] } - const hash1 = hashCallWithReplayProtection(testAddress1, samplePayload, 0, testChainId) - const hash2 = hashCallWithReplayProtection(testAddress1, payload, 0, testChainId) + const hash1 = hashPayloadWithCallIdx(testAddress1, samplePayload, 0, testChainId) + const hash2 = hashPayloadWithCallIdx(testAddress1, payload, 0, testChainId) expect(hash1).not.toBe(hash2) }) @@ -780,7 +780,7 @@ describe('Session Signature', () => { // Generate hashes for each call const hashes = calls.map((call) => - hashCallWithReplayProtection(testAddress1, payload, calls.indexOf(call), testChainId), + hashPayloadWithCallIdx(testAddress1, payload, calls.indexOf(call), testChainId), ) // All hashes should be valid and different diff --git a/packages/wallet/wdk/test/sessions.test.ts b/packages/wallet/wdk/test/sessions.test.ts index 9f2add5009..67e081fb08 100644 --- a/packages/wallet/wdk/test/sessions.test.ts +++ b/packages/wallet/wdk/test/sessions.test.ts @@ -1,523 +1,553 @@ import { AbiFunction, Address, Bytes, Hex, Mnemonic, Provider, RpcTransport } from 'ox' import { beforeEach, describe, expect, it, vi } from 'vitest' -import { Signers as CoreSigners, Wallet as CoreWallet, Envelope, Relayer, State } from '../../core/src/index.js' +import { Signers as CoreSigners, Wallet as CoreWallet, Envelope, State } from '../../core/src/index.js' import { Attestation, Constants, Extensions, Network, Payload, Permission } from '../../primitives/src/index.js' import { Sequence } from '../src/index.js' import { CAN_RUN_LIVE, EMITTER_ABI, EMITTER_ADDRESS, PRIVATE_KEY, RPC_URL } from './constants' -import { ExplicitSession } from '../src/sequence/types/sessions.js' - -describe('Sessions (via Manager)', () => { - // Shared components - let provider: Provider.Provider - let chainId: number - let stateProvider: State.Provider - - // Wallet webapp components - let wdk: { - identitySignerAddress: Address.Address - manager: Sequence.Manager - } - - // Dapp components - let dapp: { - pkStore: CoreSigners.Pk.Encrypted.EncryptedPksDb - wallet: CoreWallet - sessionManager: CoreSigners.SessionManager - } - - const setupExplicitSession = async (explicitSession: ExplicitSession, isModify = false) => { - let requestId: string - if (isModify) { - requestId = await wdk.manager.sessions.modifyExplicitSession(dapp.wallet.address, explicitSession) - } else { - requestId = await wdk.manager.sessions.addExplicitSession(dapp.wallet.address, explicitSession) +import { ExplicitSession } from '../../core/src/utils/session/types.js' + +const ALL_EXTENSIONS = [ + { + name: 'Dev1', + ...Extensions.Dev1, + }, + { + name: 'Dev2', + ...Extensions.Dev2, + }, + { + name: 'Rc3', + ...Extensions.Rc3, + }, + { + name: 'Rc4', + ...Extensions.Rc4, + }, +] + +for (const extension of ALL_EXTENSIONS) { + describe(`Sessions (via Manager ${extension.name})`, () => { + // Shared components + let provider: Provider.Provider + let chainId: number + let stateProvider: State.Provider + + // Wallet webapp components + let wdk: { + identitySignerAddress: Address.Address + manager: Sequence.Manager } - // Sign and complete the request - const sigRequest = await wdk.manager.signatures.get(requestId) - const identitySigner = sigRequest.signers.find((s) => Address.isEqual(s.address, wdk.identitySignerAddress)) - if (!identitySigner || (identitySigner.status !== 'actionable' && identitySigner.status !== 'ready')) { - throw new Error(`Identity signer not found or not ready/actionable: ${identitySigner?.status}`) - } - const handled = await identitySigner.handle() - if (!handled) { - throw new Error('Failed to handle identity signer') - } - await wdk.manager.sessions.complete(requestId) - } - - beforeEach(async () => { - // Create provider or use arbitrum sepolia - if (RPC_URL) { - provider = Provider.from( - RpcTransport.fromHttp(RPC_URL, { - fetchOptions: { - headers: { - 'x-requested-with': 'XMLHttpRequest', - }, - }, - }), - ) - chainId = Number(await provider.request({ method: 'eth_chainId' })) - } else { - provider = vi.mocked({ - request: vi.fn(), - on: vi.fn(), - removeListener: vi.fn(), - }) - chainId = Network.ChainId.MAINNET + // Dapp components + let dapp: { + pkStore: CoreSigners.Pk.Encrypted.EncryptedPksDb + wallet: CoreWallet + sessionManager: CoreSigners.SessionManager } - // Create state provider - stateProvider = new State.Local.Provider() - - // Create manager - const opts = Sequence.applyManagerOptionsDefaults({ - stateProvider, - relayers: [], // No relayers needed for testing - networks: [ - { - chainId, - type: Network.NetworkType.MAINNET, - rpcUrl: RPC_URL ?? 'XXX', - name: 'XXX', - blockExplorer: { url: 'XXX' }, - nativeCurrency: { - name: 'Ether', - symbol: 'ETH', - decimals: 18, - }, - }, - ], - }) - - // Create manager - const manager = new Sequence.Manager(opts) - - // Use a mnemonic to create the wallet - const identitySignerMnemonic = Mnemonic.random(Mnemonic.english) - const identitySignerPk = Mnemonic.toPrivateKey(identitySignerMnemonic, { as: 'Hex' }) - const identitySignerAddress = new CoreSigners.Pk.Pk(identitySignerPk).address - const walletAddress = await manager.wallets.signUp({ - kind: 'mnemonic', - mnemonic: identitySignerMnemonic, - noGuard: true, - noSessionManager: false, - }) - if (!walletAddress) { - throw new Error('Failed to create wallet') - } + const setupExplicitSession = async (explicitSession: ExplicitSession, isModify = false) => { + let requestId: string + if (isModify) { + requestId = await wdk.manager.sessions.modifyExplicitSession(dapp.wallet.address, explicitSession) + } else { + requestId = await wdk.manager.sessions.addExplicitSession(dapp.wallet.address, explicitSession) + } - // Initialize the wdk components - wdk = { - identitySignerAddress, - manager, + // Sign and complete the request + const sigRequest = await wdk.manager.signatures.get(requestId) + const identitySigner = sigRequest.signers.find((s) => Address.isEqual(s.address, wdk.identitySignerAddress)) + if (!identitySigner || (identitySigner.status !== 'actionable' && identitySigner.status !== 'ready')) { + throw new Error(`Identity signer not found or not ready/actionable: ${identitySigner?.status}`) + } + const handled = await identitySigner.handle() + if (!handled) { + throw new Error('Failed to handle identity signer') + } + await wdk.manager.sessions.complete(requestId) } - manager.registerMnemonicUI(async (respond) => { - await respond(identitySignerMnemonic) - }) - - // Create the pk store and pk - const pkStore = new CoreSigners.Pk.Encrypted.EncryptedPksDb() - // Create wallet in core - const coreWallet = new CoreWallet(walletAddress, { - guest: opts.guest, - // Share the state provider with wdk. In practice this will be the key machine. - stateProvider, - }) + beforeEach(async () => { + // Create provider or use arbitrum sepolia + if (RPC_URL) { + provider = Provider.from( + RpcTransport.fromHttp(RPC_URL, { + fetchOptions: { + headers: { + 'x-requested-with': 'XMLHttpRequest', + }, + }, + }), + ) + chainId = Number(await provider.request({ method: 'eth_chainId' })) + } else { + provider = vi.mocked({ + request: vi.fn(), + on: vi.fn(), + removeListener: vi.fn(), + }) + chainId = Network.ChainId.MAINNET + } - dapp = { - pkStore, - wallet: coreWallet, - sessionManager: new CoreSigners.SessionManager(coreWallet, { - provider, - sessionManagerAddress: Extensions.Rc4.sessions, - }), - } - }) + // Create state provider + stateProvider = new State.Local.Provider() - const signAndSend = async (call: Payload.Call) => { - const envelope = await dapp.wallet.prepareTransaction(provider, [call], { noConfigUpdate: true }) - const parentedEnvelope: Payload.Parented = { - ...envelope.payload, - parentWallets: [dapp.wallet.address], - } + // Create manager + const opts = Sequence.applyManagerOptionsDefaults({ + stateProvider, + relayers: [], // No relayers needed for testing + networks: [ + { + chainId, + type: Network.NetworkType.MAINNET, + rpcUrl: RPC_URL ?? 'XXX', + name: 'XXX', + blockExplorer: { url: 'XXX' }, + nativeCurrency: { + name: 'Ether', + symbol: 'ETH', + decimals: 18, + }, + }, + ], + }) - // Sign the envelope - const sessionImageHash = await dapp.sessionManager.imageHash - if (!sessionImageHash) { - throw new Error('Session image hash not found') - } - const signature = await dapp.sessionManager.signSapient( - dapp.wallet.address, - chainId ?? 1n, - parentedEnvelope, - sessionImageHash, - ) - const sapientSignature: Envelope.SapientSignature = { - imageHash: sessionImageHash, - signature, - } - const signedEnvelope = Envelope.toSigned(envelope, [sapientSignature]) - - // Build the transaction - const transaction = await dapp.wallet.buildTransaction(provider, signedEnvelope) - console.log('tx', transaction) - - // Send the transaction - if (CAN_RUN_LIVE && PRIVATE_KEY) { - // Load the sender - const senderPk = Hex.from(PRIVATE_KEY as `0x${string}`) - const pkRelayer = new Relayer.Standard.PkRelayer(senderPk, provider) - const tx = await pkRelayer.relay(transaction.to, transaction.data, chainId, undefined) - console.log('Transaction sent', tx) - await new Promise((resolve) => setTimeout(resolve, 3000)) - const receipt = await provider.request({ method: 'eth_getTransactionReceipt', params: [tx.opHash] }) - console.log('Transaction receipt', receipt) - return tx.opHash - } - } + // Create manager + const manager = new Sequence.Manager(opts) - it( - 'should add the session manager leaf when not present', - async () => { - // Recreate the wallet specifically for this test + // Use a mnemonic to create the wallet const identitySignerMnemonic = Mnemonic.random(Mnemonic.english) const identitySignerPk = Mnemonic.toPrivateKey(identitySignerMnemonic, { as: 'Hex' }) const identitySignerAddress = new CoreSigners.Pk.Pk(identitySignerPk).address - const walletAddress = await wdk.manager.wallets.signUp({ + const walletAddress = await manager.wallets.signUp({ kind: 'mnemonic', mnemonic: identitySignerMnemonic, noGuard: true, - noSessionManager: true, + noSessionManager: false, }) if (!walletAddress) { throw new Error('Failed to create wallet') } // Initialize the wdk components - wdk.identitySignerAddress = identitySignerAddress - wdk.manager.registerMnemonicUI(async (respond) => { + wdk = { + identitySignerAddress, + manager, + } + manager.registerMnemonicUI(async (respond) => { await respond(identitySignerMnemonic) }) + // Create the pk store and pk + const pkStore = new CoreSigners.Pk.Encrypted.EncryptedPksDb() + // Create wallet in core const coreWallet = new CoreWallet(walletAddress, { + guest: opts.guest, + // Share the state provider with wdk. In practice this will be the key machine. stateProvider, }) - dapp.wallet = coreWallet - dapp.sessionManager = new CoreSigners.SessionManager(coreWallet, { - provider, - sessionManagerAddress: Extensions.Rc4.sessions, - }) - - // At this point the wallet should NOT have a session topology - await expect(wdk.manager.sessions.getTopology(walletAddress)).rejects.toThrow('Session manager not found') - - // Create the explicit session signer - const e = await dapp.pkStore.generateAndStore() - const s = await dapp.pkStore.getEncryptedPkStore(e.address) - if (!s) { - throw new Error('Failed to create pk store') - } - const explicitSession: ExplicitSession = { - sessionAddress: e.address, - chainId, - valueLimit: 0n, - deadline: BigInt(Math.floor(Date.now() / 1000) + 3600), // 1 hour from now - permissions: [ - { - target: EMITTER_ADDRESS, - rules: [], - }, - ], - } - const explicitSigner = new CoreSigners.Session.Explicit(s, explicitSession) - // Add to manager - dapp.sessionManager = dapp.sessionManager.withExplicitSigner(explicitSigner) - - await setupExplicitSession(explicitSession) - - // Create a call payload - const call: Payload.Call = { - to: EMITTER_ADDRESS, - value: 0n, - data: AbiFunction.encodeData(EMITTER_ABI[0]), - gasLimit: 0n, - delegateCall: false, - onlyFallback: false, - behaviorOnError: 'revert', + dapp = { + pkStore, + wallet: coreWallet, + sessionManager: new CoreSigners.SessionManager(coreWallet, { + provider, + sessionManagerAddress: Extensions.Rc4.sessions, + }), } + }) - if (!RPC_URL) { - // Configure mock provider - ;(provider as any).request.mockImplementation(({ method, params }) => { - if (method === 'eth_chainId') { - return Promise.resolve(chainId.toString()) - } - if (method === 'eth_call' && params[0].data === AbiFunction.encodeData(Constants.GET_IMPLEMENTATION)) { - // Undeployed wallet - return Promise.resolve('0x') - } - if (method === 'eth_call' && params[0].data === AbiFunction.encodeData(Constants.READ_NONCE, [0n])) { - // Nonce is 0 - return Promise.resolve('0x00') - } - if (method === 'eth_call' && params[0].data?.startsWith(AbiFunction.getSelector(Constants.GET_LIMIT_USAGE))) { - // Return 0 for usage limit (no usage yet) - return Promise.resolve('0x0000000000000000000000000000000000000000000000000000000000000000') - } - }) + const signAndSend = async (call: Payload.Call) => { + const envelope = await dapp.wallet.prepareTransaction(provider, [call], { noConfigUpdate: true }) + const parentedEnvelope: Payload.Parented = { + ...envelope.payload, + parentWallets: [dapp.wallet.address], } - // Sign and send the transaction - await signAndSend(call) - }, - PRIVATE_KEY || RPC_URL ? { timeout: 60000 } : undefined, - ) - - it( - 'should create and sign with an explicit session', - async () => { - // Create the explicit session signer - const e = await dapp.pkStore.generateAndStore() - const s = await dapp.pkStore.getEncryptedPkStore(e.address) - if (!s) { - throw new Error('Failed to create pk store') + // Sign the envelope + const sessionImageHash = await dapp.sessionManager.imageHash + if (!sessionImageHash) { + throw new Error('Session image hash not found') } - const explicitSession: ExplicitSession = { - sessionAddress: e.address, - chainId, - valueLimit: 0n, - deadline: BigInt(Math.floor(Date.now() / 1000) + 3600), // 1 hour from now - permissions: [ - { - target: EMITTER_ADDRESS, - rules: [ - { - // Require the explicitEmit selector - cumulative: false, - operation: Permission.ParameterOperation.EQUAL, - value: Bytes.fromHex(AbiFunction.getSelector(EMITTER_ABI[0]), { size: 32 }), - offset: 0n, - mask: Bytes.fromHex('0xffffffff', { size: 32 }), - }, - ], - }, - ], + const signature = await dapp.sessionManager.signSapient( + dapp.wallet.address, + chainId ?? 1n, + parentedEnvelope, + sessionImageHash, + ) + const sapientSignature: Envelope.SapientSignature = { + imageHash: sessionImageHash, + signature, } - const explicitSigner = new CoreSigners.Session.Explicit(s, explicitSession) - // Add to manager - dapp.sessionManager = dapp.sessionManager.withExplicitSigner(explicitSigner) - - await setupExplicitSession(explicitSession) - - // Create a call payload - const call: Payload.Call = { - to: EMITTER_ADDRESS, - value: 0n, - data: AbiFunction.encodeData(EMITTER_ABI[0]), - gasLimit: 0n, - delegateCall: false, - onlyFallback: false, - behaviorOnError: 'revert', + const signedEnvelope = Envelope.toSigned(envelope, [sapientSignature]) + + // Build the transaction + const transaction = await dapp.wallet.buildTransaction(provider, signedEnvelope) + console.log('tx', transaction) + + // Send the transaction + if (CAN_RUN_LIVE && PRIVATE_KEY) { + // Load the sender + const senderPk = Hex.from(PRIVATE_KEY as `0x${string}`) + const pkRelayer = new Relayer.Standard.PkRelayer(senderPk, provider) + const tx = await pkRelayer.relay(transaction.to, transaction.data, chainId, undefined) + console.log('Transaction sent', tx) + await new Promise((resolve) => setTimeout(resolve, 3000)) + const receipt = await provider.request({ method: 'eth_getTransactionReceipt', params: [tx.opHash] }) + console.log('Transaction receipt', receipt) + return tx.opHash } + } - if (!RPC_URL) { - // Configure mock provider - ;(provider as any).request.mockImplementation(({ method, params }) => { - if (method === 'eth_chainId') { - return Promise.resolve(chainId.toString()) - } - if (method === 'eth_call' && params[0].data === AbiFunction.encodeData(Constants.GET_IMPLEMENTATION)) { - // Undeployed wallet - return Promise.resolve('0x') - } - if (method === 'eth_call' && params[0].data === AbiFunction.encodeData(Constants.READ_NONCE, [0n])) { - // Nonce is 0 - return Promise.resolve('0x00') - } - if (method === 'eth_call' && params[0].data?.startsWith(AbiFunction.getSelector(Constants.GET_LIMIT_USAGE))) { - // Return 0 for usage limit (no usage yet) - return Promise.resolve('0x0000000000000000000000000000000000000000000000000000000000000000') - } + it( + 'should add the session manager leaf when not present', + async () => { + // Recreate the wallet specifically for this test + const identitySignerMnemonic = Mnemonic.random(Mnemonic.english) + const identitySignerPk = Mnemonic.toPrivateKey(identitySignerMnemonic, { as: 'Hex' }) + const identitySignerAddress = new CoreSigners.Pk.Pk(identitySignerPk).address + const walletAddress = await wdk.manager.wallets.signUp({ + kind: 'mnemonic', + mnemonic: identitySignerMnemonic, + noGuard: true, + noSessionManager: true, }) - } - - // Sign and send the transaction - await signAndSend(call) - }, - PRIVATE_KEY || RPC_URL ? { timeout: 60000 } : undefined, - ) - - it( - 'should modify an explicit session permission', - async () => { - // First we create the explicit sessions signer - const e = await dapp.pkStore.generateAndStore() - const s = await dapp.pkStore.getEncryptedPkStore(e.address) - if (!s) { - throw new Error('Failed to create pk store') - } - // Create the initial permissions - let explicitSession: ExplicitSession = { - sessionAddress: e.address, - chainId, - valueLimit: 0n, - deadline: BigInt(Math.floor(Date.now() / 1000) + 3600), // 1 hour from now - permissions: [ - { - target: EMITTER_ADDRESS, - rules: [ - { - // Require the explicitEmit selector - cumulative: false, - operation: Permission.ParameterOperation.EQUAL, - value: Bytes.fromHex(AbiFunction.getSelector(EMITTER_ABI[0]), { size: 32 }), - offset: 0n, - mask: Bytes.fromHex('0xffffffff', { size: 32 }), - }, - ], - }, - ], - } - const explicitSigner = new CoreSigners.Session.Explicit(s, explicitSession) - // Add to manager - dapp.sessionManager = dapp.sessionManager.withExplicitSigner(explicitSigner) - - await setupExplicitSession(explicitSession) - - // Create a call payload - const call: Payload.Call = { - to: EMITTER_ADDRESS, - value: 0n, - data: AbiFunction.encodeData(EMITTER_ABI[0]), - gasLimit: 0n, - delegateCall: false, - onlyFallback: false, - behaviorOnError: 'revert', - } - - if (!RPC_URL) { - // Configure mock provider - ;(provider as any).request.mockImplementation(({ method, params }) => { - if (method === 'eth_chainId') { - return Promise.resolve(chainId.toString()) - } - if (method === 'eth_call' && params[0].data === AbiFunction.encodeData(Constants.GET_IMPLEMENTATION)) { - // Undeployed wallet - return Promise.resolve('0x') - } - if (method === 'eth_call' && params[0].data === AbiFunction.encodeData(Constants.READ_NONCE, [0n])) { - // Nonce is 0 - return Promise.resolve('0x00') - } - if (method === 'eth_call' && params[0].data?.startsWith(AbiFunction.getSelector(Constants.GET_LIMIT_USAGE))) { - // Return 0 for usage limit (no usage yet) - return Promise.resolve('0x0000000000000000000000000000000000000000000000000000000000000000') - } + if (!walletAddress) { + throw new Error('Failed to create wallet') + } + + // Initialize the wdk components + wdk.identitySignerAddress = identitySignerAddress + wdk.manager.registerMnemonicUI(async (respond) => { + await respond(identitySignerMnemonic) }) - } - // Sign and send the transaction - await signAndSend(call) - - // Now we modify the permissions target contract to zero address - // This should cause any session call to the EMITTER_ADDRESS contract to fail - explicitSession.permissions[0].target = '0x0000000000000000000000000000000000000000' - - await setupExplicitSession(explicitSession, true) - - // Sign and send the transaction - // Should fail with 'No signer supported for call' - await expect(signAndSend(call)).rejects.toThrow('No signer supported for call') - }, - PRIVATE_KEY || RPC_URL ? { timeout: 60000 } : undefined, - ) - - it( - 'should create and sign with an implicit session', - async () => { - // Create the implicit session signer - const e = await dapp.pkStore.generateAndStore() - const s = await dapp.pkStore.getEncryptedPkStore(e.address) - if (!s) { - throw new Error('Failed to create pk store') - } + // Create wallet in core + const coreWallet = new CoreWallet(walletAddress, { + stateProvider, + }) - // Request the session authorization from the WDK - const requestId = await wdk.manager.sessions.prepareAuthorizeImplicitSession(dapp.wallet.address, e.address, { - target: 'https://example.com', - }) + dapp.wallet = coreWallet + dapp.sessionManager = new CoreSigners.SessionManager(coreWallet, { + provider, + sessionManagerAddress: Extensions.Rc4.sessions, + }) - // Sign the request (Wallet UI action) - const sigRequest = await wdk.manager.signatures.get(requestId) - const identitySigner = sigRequest.signers[0] - if (!identitySigner || (identitySigner.status !== 'actionable' && identitySigner.status !== 'ready')) { - throw new Error(`Identity signer not found or not ready/actionable: ${identitySigner?.status}`) - } - const handled = await identitySigner.handle() - if (!handled) { - throw new Error('Failed to handle identity signer') - } + // At this point the wallet should NOT have a session topology + await expect(wdk.manager.sessions.getTopology(walletAddress)).rejects.toThrow('Session manager not found') + + // Create the explicit session signer + const e = await dapp.pkStore.generateAndStore() + const s = await dapp.pkStore.getEncryptedPkStore(e.address) + if (!s) { + throw new Error('Failed to create pk store') + } + const explicitSession: ExplicitSession = { + sessionAddress: e.address, + chainId, + valueLimit: 0n, + deadline: BigInt(Math.floor(Date.now() / 1000) + 3600), // 1 hour from now + permissions: [ + { + target: EMITTER_ADDRESS, + rules: [], + }, + ], + } + const explicitSigner = new CoreSigners.Session.Explicit(s, explicitSession) + // Add to manager + dapp.sessionManager = dapp.sessionManager.withExplicitSigner(explicitSigner) + + await setupExplicitSession(explicitSession) + + // Create a call payload + const call: Payload.Call = { + to: EMITTER_ADDRESS, + value: 0n, + data: AbiFunction.encodeData(EMITTER_ABI[0]), + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: 'revert', + } + + if (!RPC_URL) { + // Configure mock provider + ;(provider as any).request.mockImplementation(({ method, params }) => { + if (method === 'eth_chainId') { + return Promise.resolve(chainId.toString()) + } + if (method === 'eth_call' && params[0].data === AbiFunction.encodeData(Constants.GET_IMPLEMENTATION)) { + // Undeployed wallet + return Promise.resolve('0x') + } + if (method === 'eth_call' && params[0].data === AbiFunction.encodeData(Constants.READ_NONCE, [0n])) { + // Nonce is 0 + return Promise.resolve('0x00') + } + if ( + method === 'eth_call' && + params[0].data?.startsWith(AbiFunction.getSelector(Constants.GET_LIMIT_USAGE)) + ) { + // Return 0 for usage limit (no usage yet) + return Promise.resolve('0x0000000000000000000000000000000000000000000000000000000000000000') + } + }) + } + + // Sign and send the transaction + await signAndSend(call) + }, + PRIVATE_KEY || RPC_URL ? { timeout: 60000 } : undefined, + ) - // Complete the request - const { attestation, signature: identitySignature } = - await wdk.manager.sessions.completeAuthorizeImplicitSession(requestId) + it( + 'should create and sign with an explicit session', + async () => { + // Create the explicit session signer + const e = await dapp.pkStore.generateAndStore() + const s = await dapp.pkStore.getEncryptedPkStore(e.address) + if (!s) { + throw new Error('Failed to create pk store') + } + const explicitSession: ExplicitSession = { + sessionAddress: e.address, + chainId, + valueLimit: 0n, + deadline: BigInt(Math.floor(Date.now() / 1000) + 3600), // 1 hour from now + permissions: [ + { + target: EMITTER_ADDRESS, + rules: [ + { + // Require the explicitEmit selector + cumulative: false, + operation: Permission.ParameterOperation.EQUAL, + value: Bytes.fromHex(AbiFunction.getSelector(EMITTER_ABI[0]), { size: 32 }), + offset: 0n, + mask: Bytes.fromHex('0xffffffff', { size: 32 }), + }, + ], + }, + ], + } + const explicitSigner = new CoreSigners.Session.Explicit(s, explicitSession) + // Add to manager + dapp.sessionManager = dapp.sessionManager.withExplicitSigner(explicitSigner) + + await setupExplicitSession(explicitSession) + + // Create a call payload + const call: Payload.Call = { + to: EMITTER_ADDRESS, + value: 0n, + data: AbiFunction.encodeData(EMITTER_ABI[0]), + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: 'revert', + } + + if (!RPC_URL) { + // Configure mock provider + ;(provider as any).request.mockImplementation(({ method, params }) => { + if (method === 'eth_chainId') { + return Promise.resolve(chainId.toString()) + } + if (method === 'eth_call' && params[0].data === AbiFunction.encodeData(Constants.GET_IMPLEMENTATION)) { + // Undeployed wallet + return Promise.resolve('0x') + } + if (method === 'eth_call' && params[0].data === AbiFunction.encodeData(Constants.READ_NONCE, [0n])) { + // Nonce is 0 + return Promise.resolve('0x00') + } + if ( + method === 'eth_call' && + params[0].data?.startsWith(AbiFunction.getSelector(Constants.GET_LIMIT_USAGE)) + ) { + // Return 0 for usage limit (no usage yet) + return Promise.resolve('0x0000000000000000000000000000000000000000000000000000000000000000') + } + }) + } + + // Sign and send the transaction + await signAndSend(call) + }, + PRIVATE_KEY || RPC_URL ? { timeout: 60000 } : undefined, + ) - // Load the implicit signer - const implicitSigner = new CoreSigners.Session.Implicit( - s, - attestation, - identitySignature, - dapp.sessionManager.address, - ) - dapp.sessionManager = dapp.sessionManager.withImplicitSigner(implicitSigner) - - // Create a call payload - const call: Payload.Call = { - to: EMITTER_ADDRESS, - value: 0n, - data: AbiFunction.encodeData(EMITTER_ABI[1]), // implicitEmit - gasLimit: 0n, - delegateCall: false, - onlyFallback: false, - behaviorOnError: 'revert', - } + it( + 'should modify an explicit session permission', + async () => { + // First we create the explicit sessions signer + const e = await dapp.pkStore.generateAndStore() + const s = await dapp.pkStore.getEncryptedPkStore(e.address) + if (!s) { + throw new Error('Failed to create pk store') + } + // Create the initial permissions + let explicitSession: ExplicitSession = { + sessionAddress: e.address, + chainId, + valueLimit: 0n, + deadline: BigInt(Math.floor(Date.now() / 1000) + 3600), // 1 hour from now + permissions: [ + { + target: EMITTER_ADDRESS, + rules: [ + { + // Require the explicitEmit selector + cumulative: false, + operation: Permission.ParameterOperation.EQUAL, + value: Bytes.fromHex(AbiFunction.getSelector(EMITTER_ABI[0]), { size: 32 }), + offset: 0n, + mask: Bytes.fromHex('0xffffffff', { size: 32 }), + }, + ], + }, + ], + } + const explicitSigner = new CoreSigners.Session.Explicit(s, explicitSession) + // Add to manager + dapp.sessionManager = dapp.sessionManager.withExplicitSigner(explicitSigner) + + await setupExplicitSession(explicitSession) + + // Create a call payload + const call: Payload.Call = { + to: EMITTER_ADDRESS, + value: 0n, + data: AbiFunction.encodeData(EMITTER_ABI[0]), + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: 'revert', + } + + if (!RPC_URL) { + // Configure mock provider + ;(provider as any).request.mockImplementation(({ method, params }) => { + if (method === 'eth_chainId') { + return Promise.resolve(chainId.toString()) + } + if (method === 'eth_call' && params[0].data === AbiFunction.encodeData(Constants.GET_IMPLEMENTATION)) { + // Undeployed wallet + return Promise.resolve('0x') + } + if (method === 'eth_call' && params[0].data === AbiFunction.encodeData(Constants.READ_NONCE, [0n])) { + // Nonce is 0 + return Promise.resolve('0x00') + } + if ( + method === 'eth_call' && + params[0].data?.startsWith(AbiFunction.getSelector(Constants.GET_LIMIT_USAGE)) + ) { + // Return 0 for usage limit (no usage yet) + return Promise.resolve('0x0000000000000000000000000000000000000000000000000000000000000000') + } + }) + } + + // Sign and send the transaction + await signAndSend(call) + + // Now we modify the permissions target contract to zero address + // This should cause any session call to the EMITTER_ADDRESS contract to fail + explicitSession.permissions[0].target = '0x0000000000000000000000000000000000000000' + + await setupExplicitSession(explicitSession, true) + + // Sign and send the transaction + // Should fail with 'No signer supported for call' + await expect(signAndSend(call)).rejects.toThrow('No signer supported for call') + }, + PRIVATE_KEY || RPC_URL ? { timeout: 60000 } : undefined, + ) - if (!RPC_URL) { - // Configure mock provider - ;(provider as any).request.mockImplementation(({ method, params }) => { - if (method === 'eth_chainId') { - return Promise.resolve(chainId.toString()) - } - if (method === 'eth_call' && params[0].data === AbiFunction.encodeData(Constants.GET_IMPLEMENTATION)) { - // Undeployed wallet - return Promise.resolve('0x') - } - if (method === 'eth_call' && params[0].data === AbiFunction.encodeData(Constants.READ_NONCE, [0n])) { - // Nonce is 0 - return Promise.resolve('0x00') - } - if ( - method === 'eth_call' && - Address.isEqual(params[0].from, dapp.sessionManager.address) && - Address.isEqual(params[0].to, call.to) - ) { - // Implicit request simulation result - const expectedResult = Bytes.toHex( - Attestation.generateImplicitRequestMagic(attestation, dapp.wallet.address), - ) - return Promise.resolve(expectedResult) - } + it( + 'should create and sign with an implicit session', + async () => { + // Create the implicit session signer + const e = await dapp.pkStore.generateAndStore() + const s = await dapp.pkStore.getEncryptedPkStore(e.address) + if (!s) { + throw new Error('Failed to create pk store') + } + + // Request the session authorization from the WDK + const requestId = await wdk.manager.sessions.prepareAuthorizeImplicitSession(dapp.wallet.address, e.address, { + target: 'https://example.com', }) - } - // Sign and send the transaction - await signAndSend(call) - }, - PRIVATE_KEY || RPC_URL ? { timeout: 60000 } : undefined, - ) -}) + // Sign the request (Wallet UI action) + const sigRequest = await wdk.manager.signatures.get(requestId) + const identitySigner = sigRequest.signers[0] + if (!identitySigner || (identitySigner.status !== 'actionable' && identitySigner.status !== 'ready')) { + throw new Error(`Identity signer not found or not ready/actionable: ${identitySigner?.status}`) + } + const handled = await identitySigner.handle() + if (!handled) { + throw new Error('Failed to handle identity signer') + } + + // Complete the request + const { attestation, signature: identitySignature } = + await wdk.manager.sessions.completeAuthorizeImplicitSession(requestId) + + // Load the implicit signer + const implicitSigner = new CoreSigners.Session.Implicit( + s, + attestation, + identitySignature, + dapp.sessionManager.address, + ) + dapp.sessionManager = dapp.sessionManager.withImplicitSigner(implicitSigner) + + // Create a call payload + const call: Payload.Call = { + to: EMITTER_ADDRESS, + value: 0n, + data: AbiFunction.encodeData(EMITTER_ABI[1]), // implicitEmit + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: 'revert', + } + + if (!RPC_URL) { + // Configure mock provider + ;(provider as any).request.mockImplementation(({ method, params }) => { + if (method === 'eth_chainId') { + return Promise.resolve(chainId.toString()) + } + if (method === 'eth_call' && params[0].data === AbiFunction.encodeData(Constants.GET_IMPLEMENTATION)) { + // Undeployed wallet + return Promise.resolve('0x') + } + if (method === 'eth_call' && params[0].data === AbiFunction.encodeData(Constants.READ_NONCE, [0n])) { + // Nonce is 0 + return Promise.resolve('0x00') + } + if ( + method === 'eth_call' && + Address.isEqual(params[0].from, dapp.sessionManager.address) && + Address.isEqual(params[0].to, call.to) + ) { + // Implicit request simulation result + const expectedResult = Bytes.toHex( + Attestation.generateImplicitRequestMagic(attestation, dapp.wallet.address), + ) + return Promise.resolve(expectedResult) + } + }) + } + + // Sign and send the transaction + await signAndSend(call) + }, + PRIVATE_KEY || RPC_URL ? { timeout: 60000 } : undefined, + ) + }) +} From dda7f32e9d43ae3b89b378b38f666e0b9fd9ee08 Mon Sep 17 00:00:00 2001 From: Michael Standen Date: Tue, 18 Nov 2025 10:17:58 +1300 Subject: [PATCH 075/119] Use the 4337 factory wrapper --- packages/wallet/primitives/src/context.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/wallet/primitives/src/context.ts b/packages/wallet/primitives/src/context.ts index a83f234876..527d7c3e72 100644 --- a/packages/wallet/primitives/src/context.ts +++ b/packages/wallet/primitives/src/context.ts @@ -67,7 +67,7 @@ export const Rc4: Context = { } export const Rc4_4337: Context = { - factory: '0x00000000000018A77519fcCCa060c2537c9D6d3F', + factory: '0x00000000000003c0C955C8AE06FB13cDd19a7ac6', stage1: '0x0000000000003add039FF84b064B7347Fc23C444', stage2: '0x4B3E5735665057A0A15eE448A7293bC01e3b4De9', creationCode: '0x6041600e3d396021805130553df33d3d36153402601f57363d3d373d363d30545af43d82803e903d91601f57fd5bf3', From d5f9b352fbd7280a0b49255974ba218f9f190d82 Mon Sep 17 00:00:00 2001 From: Tolgahan Arikan Date: Wed, 19 Nov 2025 15:24:43 +0300 Subject: [PATCH 076/119] Update keymachine url in dapp-client constants --- packages/wallet/dapp-client/src/utils/constants.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/wallet/dapp-client/src/utils/constants.ts b/packages/wallet/dapp-client/src/utils/constants.ts index 3e1355558a..7d382d41c3 100644 --- a/packages/wallet/dapp-client/src/utils/constants.ts +++ b/packages/wallet/dapp-client/src/utils/constants.ts @@ -1,5 +1,5 @@ export const CACHE_DB_NAME = 'sequence-cache' export const NODES_URL = 'https://nodes.sequence.app/{network}' export const RELAYER_URL = 'https://{network}-relayer.sequence.app' -export const KEYMACHINE_URL = 'https://v3-keymachine.sequence.app' +export const KEYMACHINE_URL = 'https://keymachine.sequence.app' export const VALUE_FORWARDER_ADDRESS = '0xABAAd93EeE2a569cF0632f39B10A9f5D734777ca' From be9d3b3570e735a16563e5b2a9f1d50cf5946fee Mon Sep 17 00:00:00 2001 From: Tolgahan Arikan Date: Wed, 19 Nov 2025 15:35:45 +0300 Subject: [PATCH 077/119] Update keymachine url in Provider constructor --- packages/wallet/core/src/state/sequence/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/wallet/core/src/state/sequence/index.ts b/packages/wallet/core/src/state/sequence/index.ts index a394d8a7fe..e9e821d4b4 100644 --- a/packages/wallet/core/src/state/sequence/index.ts +++ b/packages/wallet/core/src/state/sequence/index.ts @@ -14,7 +14,7 @@ import { Sessions, SignatureType } from './sessions.gen.js' export class Provider implements ProviderInterface { private readonly service: Sessions - constructor(host = 'https://v3-keymachine.sequence-dev.app') { + constructor(host = 'https://keymachine.sequence.app') { this.service = new Sessions(host, fetch) } From e91087b4a934ca726f782f7b5ab77818c5c412c5 Mon Sep 17 00:00:00 2001 From: Michael Standen Date: Thu, 20 Nov 2025 10:02:47 +1300 Subject: [PATCH 078/119] SSR safety (#915) --- packages/wallet/wdk/src/sequence/manager.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/wallet/wdk/src/sequence/manager.ts b/packages/wallet/wdk/src/sequence/manager.ts index be7624cc0a..6a2d8b128d 100644 --- a/packages/wallet/wdk/src/sequence/manager.ts +++ b/packages/wallet/wdk/src/sequence/manager.ts @@ -106,7 +106,12 @@ export const ManagerOptionsDefaults = { stateProvider: new State.Sequence.Provider(), networks: Network.ALL, - relayers: () => [Relayer.LocalRelayer.createFromWindow(window)].filter((r) => r !== undefined), + relayers: () => { + if (typeof window !== 'undefined') { + return [Relayer.LocalRelayer.createFromWindow(window)].filter((r) => r !== undefined) + } + return [] + }, bundlers: [], guardUrl: 'https://dev-guard.sequence.app', @@ -138,7 +143,7 @@ export const ManagerOptionsDefaults = { identity: { // TODO: change to prod url once deployed url: 'https://dev-identity.sequence-dev.app', - fetch: window.fetch, + fetch: typeof window !== 'undefined' ? window.fetch : undefined, verifyAttestation: true, email: { enabled: false, From c6c92dc73527197f73d5993dbb06dfd3e7f41034 Mon Sep 17 00:00:00 2001 From: Tolgahan Arikan Date: Thu, 20 Nov 2025 14:02:40 +0300 Subject: [PATCH 079/119] Guard dapp-client for SSR (lazy transport, browser checks, gated storage) --- .../dapp-client/src/ChainSessionManager.ts | 3 +- packages/wallet/dapp-client/src/DappClient.ts | 73 +++++++++------ .../wallet/dapp-client/src/DappTransport.ts | 90 ++++++++++++++----- .../wallet/dapp-client/src/utils/storage.ts | 42 +++++++-- 4 files changed, 151 insertions(+), 57 deletions(-) diff --git a/packages/wallet/dapp-client/src/ChainSessionManager.ts b/packages/wallet/dapp-client/src/ChainSessionManager.ts index 6785c18cdb..c3738969d2 100644 --- a/packages/wallet/dapp-client/src/ChainSessionManager.ts +++ b/packages/wallet/dapp-client/src/ChainSessionManager.ts @@ -114,7 +114,8 @@ export class ChainSessionManager { const rpcUrl = getRpcUrl(chainId, nodesUrl, projectAccessKey) this.chainId = chainId - if (canUseIndexedDb) { + const canUseIndexedDbInEnv = canUseIndexedDb && typeof indexedDB !== 'undefined' + if (canUseIndexedDbInEnv) { this.stateProvider = new State.Cached({ source: new State.Sequence.Provider(keyMachineUrl), cache: new State.Local.Provider(new State.Local.IndexedDbStore(CACHE_DB_NAME)), diff --git a/packages/wallet/dapp-client/src/DappClient.ts b/packages/wallet/dapp-client/src/DappClient.ts index 2c38fc18bf..3c5a29cba9 100644 --- a/packages/wallet/dapp-client/src/DappClient.ts +++ b/packages/wallet/dapp-client/src/DappClient.ts @@ -69,7 +69,8 @@ export class DappClient { private chainSessionManagers: Map = new Map() private walletUrl: string - private transport: DappTransport + private transport: DappTransport | null = null + private transportModeSetting: TransportMode private projectAccessKey: string private nodesUrl: string private relayerUrl: string @@ -90,6 +91,10 @@ export class DappClient { [K in keyof DappClientEventMap]?: Set } = {} + private get isBrowser(): boolean { + return typeof window !== 'undefined' && typeof document !== 'undefined' + } + /** * @param walletUrl The URL of the Wallet Webapp. * @param origin The origin of the dapp @@ -134,14 +139,8 @@ export class DappClient { canUseIndexedDb = true, } = options || {} - this.transport = new DappTransport( - walletUrl, - transportMode, - undefined, - sequenceSessionStorage, - redirectActionHandler, - ) this.walletUrl = walletUrl + this.transportModeSetting = transportMode this.projectAccessKey = projectAccessKey this.nodesUrl = options?.nodesUrl || NODES_URL this.relayerUrl = options?.relayerUrl || RELAYER_URL @@ -159,7 +158,7 @@ export class DappClient { * @returns The transport mode of the client. {@link TransportMode} */ public get transportMode(): TransportMode { - return this.transport.mode + return this.transport?.mode ?? this.transportModeSetting } /** @@ -445,7 +444,11 @@ export class DappClient { public async handleRedirectResponse(url?: string): Promise { const pendingRequest = await this.sequenceStorage.peekPendingRequest() - const response = await this.transport.getRedirectResponse(true, url) + if (!this.transport && this.transportMode === TransportMode.POPUP && !this.isBrowser) { + return + } + + const response = await this.ensureTransport().getRedirectResponse(true, url) if (!response) { return } @@ -570,7 +573,7 @@ export class DappClient { // For popup mode, we need to manually update the state and emit an event. // For redirect mode, this code won't be reached; the page will navigate away. - if (this.transport.mode === TransportMode.POPUP) { + if (this.transportMode === TransportMode.POPUP) { const hasImplicitSession = !!chainSessionManager.getImplicitSession() const hasExplicitSessions = chainSessionManager.getExplicitSessions().length > 0 if (shouldCreateSession && (hasImplicitSession || hasExplicitSessions)) { @@ -645,7 +648,7 @@ export class DappClient { chainSessionManager = chainSessionManager ?? this.getChainSessionManager(chainId) await chainSessionManager.createNewSession(this.origin, sessionConfig, options) - if (this.transport.mode === TransportMode.POPUP) { + if (this.transportMode === TransportMode.POPUP) { const hasImplicitSession = !!chainSessionManager.getImplicitSession() const hasExplicitSessions = chainSessionManager.getExplicitSessions().length > 0 @@ -719,7 +722,7 @@ export class DappClient { } await chainSessionManager.addExplicitSession(explicitSessionConfig) - if (this.transport.mode === TransportMode.POPUP) { + if (this.transportMode === TransportMode.POPUP) { await this._loadStateFromStorage() } } @@ -754,7 +757,7 @@ export class DappClient { } await chainSessionManager.modifyExplicitSession(explicitSession) - if (this.transport.mode === TransportMode.POPUP) { + if (this.transportMode === TransportMode.POPUP) { await this._loadStateFromStorage() } } @@ -962,16 +965,12 @@ export class DappClient { async disconnect(options?: { keepSessionlessConnection?: boolean }): Promise { const keepSessionlessConnection = options?.keepSessionlessConnection ?? true - const transportMode = this.transport.mode + const transportMode = this.transportMode - this.transport.destroy() - this.transport = new DappTransport( - this.walletUrl, - transportMode, - undefined, - this.sequenceSessionStorage, - this.redirectActionHandler, - ) + if (this.transport) { + this.transport.destroy() + } + this.transport = null this.chainSessionManagers.clear() const sessionlessSnapshot = @@ -1019,6 +1018,22 @@ export class DappClient { } } + private ensureTransport(): DappTransport { + if (!this.transport) { + if (this.transportModeSetting === TransportMode.POPUP && !this.isBrowser) { + throw new InitializationError('Popup transport requires a browser environment.') + } + this.transport = new DappTransport( + this.walletUrl, + this.transportModeSetting, + undefined, + this.sequenceSessionStorage, + this.redirectActionHandler, + ) + } + return this.transport + } + private async applySessionlessConnectionState( walletAddress: Address.Address, loginMethod?: LoginMethod | null, @@ -1056,17 +1071,18 @@ export class DappClient { try { const redirectUrl = this.origin + (this.redirectPath ? this.redirectPath : '') const path = action === RequestActionType.SEND_WALLET_TRANSACTION ? '/request/transaction' : '/request/sign' + const transport = this.ensureTransport() - if (this.transport.mode === TransportMode.REDIRECT) { + if (transport.mode === TransportMode.REDIRECT) { await this.sequenceStorage.savePendingRequest({ action, payload, chainId: chainId, }) await this.sequenceStorage.setPendingRedirectRequest(true) - await this.transport.sendRequest(action, redirectUrl, payload, { path }) + await transport.sendRequest(action, redirectUrl, payload, { path }) } else { - const response = await this.transport.sendRequest(action, redirectUrl, payload, { + const response = await transport.sendRequest(action, redirectUrl, payload, { path, }) this.emit('walletActionResponse', { action, response, chainId }) @@ -1076,7 +1092,7 @@ export class DappClient { this.emit('walletActionResponse', { action, error, chainId }) throw error } finally { - if (this.transport.mode === TransportMode.POPUP) { + if (this.transportMode === TransportMode.POPUP && this.transport) { this.transport.closeWallet() } } @@ -1112,9 +1128,10 @@ export class DappClient { private getChainSessionManager(chainId: number): ChainSessionManager { let chainSessionManager = this.chainSessionManagers.get(chainId) if (!chainSessionManager) { + const transport = this.ensureTransport() chainSessionManager = new ChainSessionManager( chainId, - this.transport, + transport, this.projectAccessKey, this.keymachineUrl, this.nodesUrl, diff --git a/packages/wallet/dapp-client/src/DappTransport.ts b/packages/wallet/dapp-client/src/DappTransport.ts index a01494695b..463c2874ad 100644 --- a/packages/wallet/dapp-client/src/DappTransport.ts +++ b/packages/wallet/dapp-client/src/DappTransport.ts @@ -12,6 +12,28 @@ import { WalletSize, } from './types/index.js' +const isBrowserEnvironment = typeof window !== 'undefined' && typeof document !== 'undefined' + +const base64Encode = (value: string) => { + if (typeof btoa !== 'undefined') { + return btoa(value) + } + if (typeof Buffer !== 'undefined') { + return Buffer.from(value, 'utf-8').toString('base64') + } + throw new Error('Base64 encoding is not supported in this environment.') +} + +const base64Decode = (value: string) => { + if (typeof atob !== 'undefined') { + return atob(value) + } + if (typeof Buffer !== 'undefined') { + return Buffer.from(value, 'base64').toString('utf-8') + } + throw new Error('Base64 decoding is not supported in this environment.') +} + enum ConnectionState { DISCONNECTED = 'DISCONNECTED', CONNECTING = 'CONNECTING', @@ -36,6 +58,7 @@ export class DappTransport { private readonly handshakeTimeoutMs: number private readonly sequenceSessionStorage: SequenceSessionStorage private readonly redirectActionHandler?: (url: string) => void + private readonly isBrowser: boolean public readonly walletOrigin: string @@ -46,6 +69,7 @@ export class DappTransport { sequenceSessionStorage?: SequenceSessionStorage, redirectActionHandler?: (url: string) => void, ) { + this.isBrowser = isBrowserEnvironment try { this.walletOrigin = new URL(walletUrl).origin } catch (e) { @@ -57,18 +81,26 @@ export class DappTransport { throw new Error('Invalid wallet origin derived from walletUrl.') } - if (sequenceSessionStorage) { - this.sequenceSessionStorage = sequenceSessionStorage - } else if (typeof window !== 'undefined' && window.sessionStorage) { - this.sequenceSessionStorage = window.sessionStorage - } else { - throw new Error('A storage implementation must be provided for non-browser environments.') - } + this.sequenceSessionStorage = + sequenceSessionStorage || + ({ + getItem: (key: string) => (this.isBrowser && window.sessionStorage ? window.sessionStorage.getItem(key) : null), + setItem: (key: string, value: string) => { + if (this.isBrowser && window.sessionStorage) { + window.sessionStorage.setItem(key, value) + } + }, + removeItem: (key: string) => { + if (this.isBrowser && window.sessionStorage) { + window.sessionStorage.removeItem(key) + } + }, + } satisfies SequenceSessionStorage) this.requestTimeoutMs = popupModeOptions.requestTimeoutMs ?? 300000 this.handshakeTimeoutMs = popupModeOptions.handshakeTimeoutMs ?? 15000 - if (this.mode === TransportMode.POPUP) { + if (this.mode === TransportMode.POPUP && this.isBrowser) { window.addEventListener('message', this.handleMessage) } @@ -91,13 +123,23 @@ export class DappTransport { payload?: TRequest, options: SendRequestOptions = {}, ): Promise { + if (!this.isBrowser && this.mode === TransportMode.POPUP) { + throw new Error( + 'Popup transport requires a browser environment. Use redirect mode or provide a redirect handler.', + ) + } + if (this.mode === TransportMode.REDIRECT) { const url = await this.getRequestRedirectUrl(action, payload, redirectUrl, options.path) if (this.redirectActionHandler) { this.redirectActionHandler(url) - } else { + } else if (this.isBrowser) { console.info('[DappTransport] No redirectActionHandler provided. Using window.location.href to navigate.') window.location.href = url + } else { + throw new Error( + 'Redirect navigation is not possible outside the browser without a redirectActionHandler. Provide a handler to perform navigation.', + ) } return new Promise(() => {}) } @@ -148,7 +190,7 @@ export class DappTransport { throw new Error('Could not save redirect state to storage. Redirect flow is unavailable.') } - const serializedPayload = btoa(JSON.stringify(payload || {}, jsonReplacers)) + const serializedPayload = base64Encode(JSON.stringify(payload || {}, jsonReplacers)) const fullWalletUrl = path ? `${this.walletUrl}${path}` : this.walletUrl const url = new URL(fullWalletUrl) url.searchParams.set('action', action) @@ -164,7 +206,12 @@ export class DappTransport { cleanState: boolean = true, url?: string, ): Promise<{ payload: TResponse; action: string } | { error: any; action: string } | null> { - const params = new URLSearchParams(url ? new URL(url).search : window.location.search) + if (!url && !this.isBrowser) { + throw new Error('A URL must be provided when handling redirect responses outside of a browser environment.') + } + + const search = url ? new URL(url).search : this.isBrowser ? window.location.search : '' + const params = new URLSearchParams(search) const responseId = params.get('id') if (!responseId) return null @@ -191,11 +238,9 @@ export class DappTransport { const responsePayloadB64 = params.get('payload') const responseErrorB64 = params.get('error') - const isBrowser = typeof window !== 'undefined' && window.history - if (cleanState) { await this.sequenceSessionStorage.removeItem(REDIRECT_REQUEST_KEY) - if (isBrowser && !url) { + if (this.isBrowser && !url && window.history) { const cleanUrl = new URL(window.location.href) ;['id', 'payload', 'error', 'mode'].forEach((p) => cleanUrl.searchParams.delete(p)) history.replaceState({}, document.title, cleanUrl.toString()) @@ -205,7 +250,7 @@ export class DappTransport { if (responseErrorB64) { try { return { - error: JSON.parse(atob(responseErrorB64), jsonRevivers), + error: JSON.parse(base64Decode(responseErrorB64), jsonRevivers), action: originalRequest.action, } } catch (e) { @@ -219,7 +264,7 @@ export class DappTransport { if (responsePayloadB64) { try { return { - payload: JSON.parse(atob(responsePayloadB64), jsonRevivers), + payload: JSON.parse(base64Decode(responsePayloadB64), jsonRevivers), action: originalRequest.action, } } catch (e) { @@ -240,6 +285,9 @@ export class DappTransport { if (this.mode === TransportMode.REDIRECT) { throw new Error("`openWallet` is not available in 'redirect' mode.") } + if (!this.isBrowser) { + throw new Error('Popup transport requires a browser environment.') + } if (this.connectionState !== ConnectionState.DISCONNECTED) { if (this.isWalletOpen) this.walletWindow?.focus() return this.readyPromise || Promise.resolve() @@ -314,12 +362,14 @@ export class DappTransport { } destroy(): void { - if (this.mode === TransportMode.POPUP) { + if (this.mode === TransportMode.POPUP && this.isBrowser) { window.removeEventListener('message', this.handleMessage) if (this.isWalletOpen) { this.walletWindow?.close() } this._resetConnection(new Error('Transport destroyed.'), 'Destroying transport...') + } else { + this._resetConnection(new Error('Transport destroyed.'), 'Destroying transport...') } } @@ -494,7 +544,7 @@ export class DappTransport { const requestsToClear = new Map(this.pendingRequests) this.pendingRequests.clear() requestsToClear.forEach((pending) => { - window.clearTimeout(pending.timer) + clearTimeout(pending.timer) const errorToSend = reason instanceof Error ? reason : new Error(`Operation failed: ${reason}`) pending.reject(errorToSend) }) @@ -503,11 +553,11 @@ export class DappTransport { private clearTimeouts(): void { if (this.handshakeTimeoutId !== undefined) { - window.clearTimeout(this.handshakeTimeoutId) + clearTimeout(this.handshakeTimeoutId) this.handshakeTimeoutId = undefined } if (this.closeCheckIntervalId !== undefined) { - window.clearInterval(this.closeCheckIntervalId) + clearInterval(this.closeCheckIntervalId) this.closeCheckIntervalId = undefined } } diff --git a/packages/wallet/dapp-client/src/utils/storage.ts b/packages/wallet/dapp-client/src/utils/storage.ts index 0995a6701f..8928d354e5 100644 --- a/packages/wallet/dapp-client/src/utils/storage.ts +++ b/packages/wallet/dapp-client/src/utils/storage.ts @@ -13,6 +13,10 @@ import { import { Attestation } from '../index.js' +const isBrowser = typeof window !== 'undefined' +const hasSessionStorage = isBrowser && typeof sessionStorage !== 'undefined' +const hasIndexedDb = typeof indexedDB !== 'undefined' + export interface ExplicitSessionData { pk: Hex.Hex walletAddress: Address.Address @@ -97,7 +101,12 @@ const TEMP_SESSION_PK_KEY = 'SequencePendingTempSessionPk' const PENDING_REQUEST_CONTEXT_KEY = 'SequencePendingRequestContext' export class WebStorage implements SequenceStorage { + private inMemoryDb = new Map() + private openDB(): Promise { + if (!hasIndexedDb) { + return Promise.reject(new Error('IndexedDB is not available in this environment.')) + } return new Promise((resolve, reject) => { const request = indexedDB.open(DB_NAME, DB_VERSION) request.onerror = (event) => reject(`IndexedDB error: ${(event.target as IDBRequest).error}`) @@ -112,6 +121,9 @@ export class WebStorage implements SequenceStorage { } private async getIDBItem(key: IDBValidKey): Promise { + if (!hasIndexedDb) { + return this.inMemoryDb.get(key) as T | undefined + } const db = await this.openDB() return new Promise((resolve, reject) => { const request = db.transaction(STORE_NAME, 'readonly').objectStore(STORE_NAME).get(key) @@ -121,6 +133,10 @@ export class WebStorage implements SequenceStorage { } private async setIDBItem(key: IDBValidKey, value: unknown): Promise { + if (!hasIndexedDb) { + this.inMemoryDb.set(key, value) + return + } const db = await this.openDB() return new Promise((resolve, reject) => { const request = db.transaction(STORE_NAME, 'readwrite').objectStore(STORE_NAME).put(value, key) @@ -130,6 +146,10 @@ export class WebStorage implements SequenceStorage { } private async deleteIDBItem(key: IDBValidKey): Promise { + if (!hasIndexedDb) { + this.inMemoryDb.delete(key) + return + } const db = await this.openDB() return new Promise((resolve, reject) => { const request = db.transaction(STORE_NAME, 'readwrite').objectStore(STORE_NAME).delete(key) @@ -140,11 +160,9 @@ export class WebStorage implements SequenceStorage { async setPendingRedirectRequest(isPending: boolean): Promise { try { - if (isPending) { - sessionStorage.setItem(PENDING_REDIRECT_REQUEST_KEY, 'true') - } else { - sessionStorage.removeItem(PENDING_REDIRECT_REQUEST_KEY) - } + if (!hasSessionStorage) return + if (isPending) sessionStorage.setItem(PENDING_REDIRECT_REQUEST_KEY, 'true') + else sessionStorage.removeItem(PENDING_REDIRECT_REQUEST_KEY) } catch (error) { console.error('Failed to set pending redirect flag:', error) } @@ -152,6 +170,7 @@ export class WebStorage implements SequenceStorage { async isRedirectRequestPending(): Promise { try { + if (!hasSessionStorage) return false return sessionStorage.getItem(PENDING_REDIRECT_REQUEST_KEY) === 'true' } catch (error) { console.error('Failed to check pending redirect flag:', error) @@ -161,6 +180,7 @@ export class WebStorage implements SequenceStorage { async saveTempSessionPk(pk: Hex.Hex): Promise { try { + if (!hasSessionStorage) return sessionStorage.setItem(TEMP_SESSION_PK_KEY, pk) } catch (error) { console.error('Failed to save temp session PK:', error) @@ -169,6 +189,7 @@ export class WebStorage implements SequenceStorage { async getAndClearTempSessionPk(): Promise { try { + if (!hasSessionStorage) return null const pk = sessionStorage.getItem(TEMP_SESSION_PK_KEY) sessionStorage.removeItem(TEMP_SESSION_PK_KEY) return pk as Hex.Hex | null @@ -180,6 +201,7 @@ export class WebStorage implements SequenceStorage { async savePendingRequest(context: PendingRequestContext): Promise { try { + if (!hasSessionStorage) return sessionStorage.setItem(PENDING_REQUEST_CONTEXT_KEY, JSON.stringify(context, jsonReplacers)) } catch (error) { console.error('Failed to save pending request context:', error) @@ -188,6 +210,7 @@ export class WebStorage implements SequenceStorage { async getAndClearPendingRequest(): Promise { try { + if (!hasSessionStorage) return null const context = sessionStorage.getItem(PENDING_REQUEST_CONTEXT_KEY) if (!context) return null sessionStorage.removeItem(PENDING_REQUEST_CONTEXT_KEY) @@ -200,6 +223,7 @@ export class WebStorage implements SequenceStorage { async peekPendingRequest(): Promise { try { + if (!hasSessionStorage) return null const context = sessionStorage.getItem(PENDING_REQUEST_CONTEXT_KEY) if (!context) return null return JSON.parse(context, jsonRevivers) @@ -329,9 +353,11 @@ export class WebStorage implements SequenceStorage { async clearAllData(): Promise { try { // Clear all session storage items - sessionStorage.removeItem(PENDING_REDIRECT_REQUEST_KEY) - sessionStorage.removeItem(TEMP_SESSION_PK_KEY) - sessionStorage.removeItem(PENDING_REQUEST_CONTEXT_KEY) + if (hasSessionStorage) { + sessionStorage.removeItem(PENDING_REDIRECT_REQUEST_KEY) + sessionStorage.removeItem(TEMP_SESSION_PK_KEY) + sessionStorage.removeItem(PENDING_REQUEST_CONTEXT_KEY) + } // Clear all IndexedDB items await this.clearExplicitSessions() From ef07c27cdf4c31cce52ffae2e71924c2dff687b1 Mon Sep 17 00:00:00 2001 From: Agusx1211 Date: Thu, 20 Nov 2025 17:23:30 +0100 Subject: [PATCH 080/119] Fix guard topology (#918) * Use proper guard topology * Test and fixes * login and setup tests --- packages/wallet/primitives/src/config.ts | 36 +++++ packages/wallet/primitives/src/constants.ts | 1 + .../wallet/primitives/test/config.test.ts | 63 ++++++++ packages/wallet/wdk/src/sequence/guards.ts | 27 +++- packages/wallet/wdk/src/sequence/manager.ts | 26 ++- packages/wallet/wdk/src/sequence/sessions.ts | 149 ++++++++++++++++-- .../wallet/wdk/src/sequence/types/module.ts | 2 +- packages/wallet/wdk/src/sequence/wallets.ts | 11 +- packages/wallet/wdk/test/guard.test.ts | 58 ++++++- packages/wallet/wdk/test/wallets.test.ts | 91 ++++++++++- 10 files changed, 425 insertions(+), 39 deletions(-) diff --git a/packages/wallet/primitives/src/config.ts b/packages/wallet/primitives/src/config.ts index d662d39a01..27bb7f0324 100644 --- a/packages/wallet/primitives/src/config.ts +++ b/packages/wallet/primitives/src/config.ts @@ -627,3 +627,39 @@ function mergeLeaf(a: Leaf, b: Leaf): Leaf { throw new Error('Topology mismatch: incompatible leaf types') } + +export function replaceAddress( + topology: Topology, + targetAddress: Address.Address, + replacementAddress: Address.Address, +): Topology { + // 1. Handle Branches/Nodes (Recursion) + if (isNode(topology)) { + return [ + replaceAddress(topology[0], targetAddress, replacementAddress), + replaceAddress(topology[1], targetAddress, replacementAddress), + ] + } + + // 2. Handle Nested Leaves (Recursion) + if (isNestedLeaf(topology)) { + return { + ...topology, + tree: replaceAddress(topology.tree, targetAddress, replacementAddress), + } + } + + // 3. Handle Leaves (Replacement) + if (isSignerLeaf(topology) || isSapientSignerLeaf(topology)) { + // If this leaf holds the placeholder address, swap it + if (Address.isEqual(topology.address, targetAddress)) { + return { + ...topology, + address: replacementAddress, + } + } + } + + // 4. Return other leaf types unchanged (Subdigest, NodeLeaf, etc.) + return topology +} diff --git a/packages/wallet/primitives/src/constants.ts b/packages/wallet/primitives/src/constants.ts index 46185a49dd..fc2173ebfc 100644 --- a/packages/wallet/primitives/src/constants.ts +++ b/packages/wallet/primitives/src/constants.ts @@ -1,6 +1,7 @@ import { Abi } from 'ox' export const ZeroAddress = '0x0000000000000000000000000000000000000000' as const +export const PlaceholderAddress = '0xffff0000ffff0000ffff0000ffff0000ffff0000' as const export const DefaultGuestAddress = '0x0000000000601fcA38f0cCA649453F6739436d6C' as const diff --git a/packages/wallet/primitives/test/config.test.ts b/packages/wallet/primitives/test/config.test.ts index 7df3a58070..4dbaa0f843 100644 --- a/packages/wallet/primitives/test/config.test.ts +++ b/packages/wallet/primitives/test/config.test.ts @@ -33,11 +33,13 @@ import { maximumDepth, evaluateConfigurationSafety, normalizeSignerSignature, + replaceAddress, } from '../src/config.js' describe('Config', () => { const testAddress1 = '0x742d35cc6635c0532925a3b8d563a6b35b7f05f1' const testAddress2 = '0x8ba1f109551bd432803012645aac136c776056c0' + const replacementAddress = '0x1111111111111111111111111111111111111111' const testImageHash = '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef' const testDigest = '0xabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef' @@ -316,6 +318,67 @@ describe('Config', () => { }) }) + describe('replaceAddress', () => { + it('should replace signer leaf addresses', () => { + const signerLeaf: SignerLeaf = { ...sampleSignerLeaf } + + const result = replaceAddress(signerLeaf, testAddress1, replacementAddress) + + expect(result).toEqual({ ...sampleSignerLeaf, address: replacementAddress }) + expect(result).not.toBe(signerLeaf) + expect(signerLeaf.address).toBe(testAddress1) + }) + + it('should replace sapient signer leaf addresses', () => { + const sapientLeaf: SapientSignerLeaf = { ...sampleSapientSignerLeaf } + + const result = replaceAddress(sapientLeaf, testAddress2, replacementAddress) + + expect(result).toEqual({ ...sampleSapientSignerLeaf, address: replacementAddress }) + expect(result).not.toBe(sapientLeaf) + expect(sapientLeaf.address).toBe(testAddress2) + }) + + it('should recurse through nodes and nested leaves', () => { + const nestedSapient: SapientSignerLeaf = { ...sampleSapientSignerLeaf, address: testAddress1 } + const nestedLeaf: NestedLeaf = { + type: 'nested', + tree: [nestedSapient, sampleSubdigestLeaf], + weight: 5n, + threshold: 1n, + } + const topology: Topology = [{ ...sampleSignerLeaf }, nestedLeaf] + + const result = replaceAddress(topology, testAddress1, replacementAddress) + + expect(result).toEqual([ + { ...sampleSignerLeaf, address: replacementAddress }, + { + ...nestedLeaf, + tree: [{ ...nestedSapient, address: replacementAddress }, sampleSubdigestLeaf], + }, + ]) + expect(nestedSapient.address).toBe(testAddress1) + expect((nestedLeaf.tree as Node)[1]).toBe(sampleSubdigestLeaf) + }) + + it('should return the original topology when no address matches', () => { + const sapientLeaf: SapientSignerLeaf = { ...sampleSapientSignerLeaf } + + const result = replaceAddress(sapientLeaf, replacementAddress, testAddress1) + + expect(result).toBe(sapientLeaf) + }) + + it('should leave non-signer leaves unchanged', () => { + expect(replaceAddress(sampleSubdigestLeaf, testAddress1, replacementAddress)).toBe(sampleSubdigestLeaf) + expect(replaceAddress(sampleAnyAddressSubdigestLeaf, testAddress1, replacementAddress)).toBe( + sampleAnyAddressSubdigestLeaf, + ) + expect(replaceAddress(sampleNodeLeaf, testAddress1, replacementAddress)).toBe(sampleNodeLeaf) + }) + }) + describe('getWeight', () => { it('should return correct weight for signer leaf with canSign true', () => { const result = getWeight(sampleSignerLeaf, () => true) diff --git a/packages/wallet/wdk/src/sequence/guards.ts b/packages/wallet/wdk/src/sequence/guards.ts index c85054794b..a005a16190 100644 --- a/packages/wallet/wdk/src/sequence/guards.ts +++ b/packages/wallet/wdk/src/sequence/guards.ts @@ -1,8 +1,8 @@ -import { Address } from 'ox' +import { Address, Bytes } from 'ox' import { Shared } from './manager.js' import * as Guard from '@0xsequence/guard' import { Signers } from '@0xsequence/wallet-core' -import { Config } from '@0xsequence/wallet-primitives' +import { Config, Constants } from '@0xsequence/wallet-primitives' export type GuardRole = 'wallet' | 'sessions' @@ -28,17 +28,28 @@ export class Guards { return undefined } - topology(role: GuardRole): Config.NestedLeaf | undefined { + topology(role: GuardRole): Config.Topology | undefined { const guardAddress = this.shared.sequence.guardAddresses[role] if (!guardAddress) { return undefined } - return { - type: 'nested', - weight: 1n, - threshold: 1n, - tree: { ...this.shared.sequence.defaultGuardTopology, address: guardAddress }, + const topology = Config.replaceAddress( + this.shared.sequence.defaultGuardTopology, + Constants.PlaceholderAddress, + guardAddress, + ) + + // If the imageHash did not change it means the replacement failed + if ( + Bytes.isEqual( + Config.hashConfiguration(topology), + Config.hashConfiguration(this.shared.sequence.defaultGuardTopology), + ) + ) { + throw new Error(`Guard address replacement failed for role ${role}`) } + + return topology } } diff --git a/packages/wallet/wdk/src/sequence/manager.ts b/packages/wallet/wdk/src/sequence/manager.ts index 6a2d8b128d..f77c94943c 100644 --- a/packages/wallet/wdk/src/sequence/manager.ts +++ b/packages/wallet/wdk/src/sequence/manager.ts @@ -58,7 +58,8 @@ export type ManagerOptions = { guardUrl?: string guardAddresses?: Record - defaultGuardTopology?: Config.SignerLeaf + // The default guard topology MUST have a placeholder address for the guard address + defaultGuardTopology?: Config.Topology defaultRecoverySettings?: RecoverySettings // EIP-6963 support @@ -121,14 +122,25 @@ export const ManagerOptionsDefaults = { } as Record, // TODO: change to the actual guard address defaultGuardTopology: { - // TODO: Move this somewhere else - type: 'signer', - address: '0x0000000000000000000000000000000000000000', // will be replaced by the actual guard address + type: 'nested', weight: 1n, - } as Config.SignerLeaf, + threshold: 1n, + tree: [ + { + type: 'signer', + address: Constants.PlaceholderAddress, + weight: 1n, + }, + { + type: 'signer', + // Sequence dev multisig, as recovery guard signer + address: '0x007a47e6BF40C1e0ed5c01aE42fDC75879140bc4', + weight: 1n, + }, + ], + } as Config.NestedLeaf, defaultSessionsTopology: { - // TODO: Move this somewhere else type: 'sapient-signer', weight: 1n, } as Omit, @@ -202,7 +214,7 @@ export type Sequence = { readonly relayers: Relayer.Relayer[] readonly bundlers: Bundler.Bundler[] - readonly defaultGuardTopology: Config.SignerLeaf + readonly defaultGuardTopology: Config.Topology readonly defaultRecoverySettings: RecoverySettings readonly guardUrl: string diff --git a/packages/wallet/wdk/src/sequence/sessions.ts b/packages/wallet/wdk/src/sequence/sessions.ts index bd6a15e38a..9496ce9696 100644 --- a/packages/wallet/wdk/src/sequence/sessions.ts +++ b/packages/wallet/wdk/src/sequence/sessions.ts @@ -1,3 +1,4 @@ +import { IdentityType } from '@0xsequence/identity-instrument' import { Envelope, type ExplicitSession } from '@0xsequence/wallet-core' import { Attestation, @@ -8,12 +9,13 @@ import { SessionConfig, } from '@0xsequence/wallet-primitives' import { Address, Bytes, Hash, Hex } from 'ox' -import { IdentityType } from '@0xsequence/identity-instrument' import { AuthCodePkceHandler } from './handlers/authcode-pkce.js' import { IdentityHandler, identityTypeToHex } from './handlers/identity.js' +import { Handler } from './handlers/index.js' import { ManagerOptionsDefaults, Shared } from './manager.js' -import { Actions } from './types/signature-request.js' +import { Kinds, Module } from './types/index.js' import { AuthorizeImplicitSessionArgs } from './types/sessions.js' +import { Actions } from './types/signature-request.js' export interface SessionsInterface { /** @@ -174,17 +176,24 @@ export class Sessions implements SessionsInterface { constructor(private readonly shared: Shared) {} async getTopology(walletAddress: Address.Address, fixMissing = false): Promise { - const { loginTopology, modules } = await this.shared.modules.wallets.getConfigurationParts(walletAddress) + const { loginTopology, devicesTopology, modules } = + await this.shared.modules.wallets.getConfigurationParts(walletAddress) const managerModule = modules.find((m) => Address.isEqual(m.sapientLeaf.address, this.shared.sequence.extensions.sessions), ) if (!managerModule) { if (fixMissing) { // Create the default session manager leaf - if (!Config.isSignerLeaf(loginTopology) && !Config.isSapientSignerLeaf(loginTopology)) { - throw new Error('Login topology is not a signer leaf') + const authorizedSigners = [...Config.topologyToFlatLeaves([devicesTopology, loginTopology])].filter( + Config.isSignerLeaf, + ) + if (authorizedSigners.length === 0) { + throw new Error('No signer leaves found') + } + let sessionsTopology = SessionConfig.emptySessionsTopology(authorizedSigners[0]!.address) + for (let i = 1; i < authorizedSigners.length; i++) { + sessionsTopology = SessionConfig.addIdentitySigner(sessionsTopology, authorizedSigners[i]!.address) } - const sessionsTopology = SessionConfig.emptySessionsTopology(loginTopology.address) const sessionsConfigTree = SessionConfig.sessionsTopologyToConfigurationTree(sessionsTopology) this.shared.sequence.stateProvider.saveTree(sessionsConfigTree) const imageHash = GenericTree.hash(sessionsConfigTree) @@ -209,23 +218,133 @@ export class Sessions implements SessionsInterface { return SessionConfig.configurationTreeToSessionsTopology(tree) } + private async updateSessionModule( + modules: Module[], + transformer: (topology: SessionConfig.SessionsTopology) => SessionConfig.SessionsTopology, + ) { + const ext = this.shared.sequence.extensions.sessions + const idx = modules.findIndex((m) => Address.isEqual(m.sapientLeaf.address, ext)) + if (idx === -1) { + return + } + + const sessionModule = modules[idx] + if (!sessionModule) { + throw new Error('session-module-not-found') + } + + const genericTree = await this.shared.sequence.stateProvider.getTree(sessionModule.sapientLeaf.imageHash) + if (!genericTree) { + throw new Error('session-module-tree-not-found') + } + + const topology = SessionConfig.configurationTreeToSessionsTopology(genericTree) + const nextTopology = transformer(topology) + const nextTree = SessionConfig.sessionsTopologyToConfigurationTree(nextTopology) + await this.shared.sequence.stateProvider.saveTree(nextTree) + if (!modules[idx]) { + throw new Error('session-module-not-found-(unreachable)') + } + + modules[idx].sapientLeaf.imageHash = GenericTree.hash(nextTree) + } + + hasSessionModule(modules: Module[]): boolean { + return modules.some((m) => Address.isEqual(m.sapientLeaf.address, this.shared.sequence.extensions.sessions)) + } + + async initSessionModule(modules: Module[], identitySigners: Address.Address[], guardTopology?: Config.Topology) { + if (this.hasSessionModule(modules)) { + throw new Error('session-module-already-initialized') + } + + if (identitySigners.length === 0) { + throw new Error('No identity signers provided') + } + + // Calculate image hash with the identity signers + const sessionsTopology = SessionConfig.emptySessionsTopology( + identitySigners as [Address.Address, ...Address.Address[]], + ) + // Store this tree in the state provider + const sessionsConfigTree = SessionConfig.sessionsTopologyToConfigurationTree(sessionsTopology) + this.shared.sequence.stateProvider.saveTree(sessionsConfigTree) + // Prepare the configuration leaf + const sessionsImageHash = GenericTree.hash(sessionsConfigTree) + const signer = { + ...ManagerOptionsDefaults.defaultSessionsTopology, + address: this.shared.sequence.extensions.sessions, + imageHash: sessionsImageHash, + } + modules.push({ + sapientLeaf: signer, + weight: 255n, + guardLeaf: guardTopology, + }) + } + + async addIdentitySignerToModules(modules: Module[], address: Address.Address) { + if (!this.hasSessionModule(modules)) { + throw new Error('session-module-not-enabled') + } + + await this.updateSessionModule(modules, (topology) => { + const existingSigners = SessionConfig.getIdentitySigners(topology) + if (existingSigners?.some((s) => Address.isEqual(s, address))) { + return topology + } + + return SessionConfig.addIdentitySigner(topology, address) + }) + } + + async removeIdentitySignerFromModules(modules: Module[], address: Address.Address) { + if (!this.hasSessionModule(modules)) { + throw new Error('session-module-not-enabled') + } + + await this.updateSessionModule(modules, (topology) => { + const newTopology = SessionConfig.removeIdentitySigner(topology, address) + if (!newTopology) { + // Can't remove the last identity signer + throw new Error('Cannot remove the last identity signer') + } + return newTopology + }) + } + async prepareAuthorizeImplicitSession( walletAddress: Address.Address, sessionAddress: Address.Address, args: AuthorizeImplicitSessionArgs, ): Promise { const topology = await this.getTopology(walletAddress) - const identitySignerAddress = SessionConfig.getIdentitySigner(topology) - if (!identitySignerAddress) { - throw new Error('No identity signer address found') + const identitySigners = SessionConfig.getIdentitySigners(topology) + if (identitySigners.length === 0) { + throw new Error('No identity signers found') } - const identityKind = await this.shared.modules.signers.kindOf(walletAddress, identitySignerAddress) - if (!identityKind) { - throw new Error('No identity handler kind found') + let handler: Handler | undefined + let identitySignerAddress: Address.Address | undefined + for (const identitySigner of identitySigners) { + const identityKind = await this.shared.modules.signers.kindOf(walletAddress, identitySigner) + if (!identityKind) { + console.warn('No identity handler kind found for', identitySigner) + continue + } + if (identityKind === Kinds.LoginPasskey) { + console.warn('Implicit sessions do not support passkeys', identitySigner) + continue + } + const iHandler = this.shared.handlers.get(identityKind) + if (iHandler) { + handler = iHandler + identitySignerAddress = identitySigner + break + } } - const handler = this.shared.handlers.get(identityKind) - if (!handler) { - throw new Error('No identity handler found') + + if (!handler || !identitySignerAddress) { + throw new Error('No identity handler or address found') } // Create the attestation to sign diff --git a/packages/wallet/wdk/src/sequence/types/module.ts b/packages/wallet/wdk/src/sequence/types/module.ts index df254a6482..014a97ae69 100644 --- a/packages/wallet/wdk/src/sequence/types/module.ts +++ b/packages/wallet/wdk/src/sequence/types/module.ts @@ -3,5 +3,5 @@ import { Config } from '@0xsequence/wallet-primitives' export type Module = { weight: bigint sapientLeaf: Config.SapientSignerLeaf - guardLeaf?: Config.NestedLeaf + guardLeaf?: Config.Topology } diff --git a/packages/wallet/wdk/src/sequence/wallets.ts b/packages/wallet/wdk/src/sequence/wallets.ts index e05d81ae15..2cc7afc1de 100644 --- a/packages/wallet/wdk/src/sequence/wallets.ts +++ b/packages/wallet/wdk/src/sequence/wallets.ts @@ -434,7 +434,7 @@ function toConfig( loginTopology: Config.Topology, devicesTopology: Config.Topology, modules: Module[], - guardTopology?: Config.NestedLeaf, + guardTopology?: Config.Topology, ): Config.Config { if (!guardTopology) { return { @@ -467,7 +467,7 @@ function toModulesTopology(modules: Module[]): Config.Topology { return { type: 'nested', weight: module.weight, - threshold: module.sapientLeaf.weight + module.guardLeaf.weight, + threshold: module.sapientLeaf.weight + Config.getWeight(module.guardLeaf, () => true).maxWeight, tree: [module.sapientLeaf, module.guardLeaf], } as Config.NestedLeaf } else { @@ -491,8 +491,7 @@ function fromModulesTopology(topology: Config.Topology): Module[] { } else if ( Config.isNestedLeaf(topology) && Config.isNode(topology.tree) && - Config.isSapientSignerLeaf(topology.tree[0]) && - Config.isNestedLeaf(topology.tree[1]) + Config.isSapientSignerLeaf(topology.tree[0]) ) { modules.push({ sapientLeaf: topology.tree[0], @@ -513,7 +512,7 @@ function fromConfig(config: Config.Config): { loginTopology: Config.Topology devicesTopology: Config.Topology modules: Module[] - guardTopology?: Config.NestedLeaf + guardTopology?: Config.Topology } { if (config.threshold === 1n) { if (Config.isNode(config.topology) && Config.isNode(config.topology[0])) { @@ -530,7 +529,7 @@ function fromConfig(config: Config.Config): { Config.isNode(config.topology) && Config.isNode(config.topology[0]) && Config.isNode(config.topology[0][0]) && - Config.isNestedLeaf(config.topology[0][1]) + Config.isTopology(config.topology[0][1]) ) { return { loginTopology: config.topology[0][0][0], diff --git a/packages/wallet/wdk/test/guard.test.ts b/packages/wallet/wdk/test/guard.test.ts index 6169a361af..44e7e2cb5c 100644 --- a/packages/wallet/wdk/test/guard.test.ts +++ b/packages/wallet/wdk/test/guard.test.ts @@ -2,7 +2,7 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { Manager } from '../src/sequence' import { GuardHandler } from '../src/sequence/handlers/guard' import { Address, Bytes, Hex, TypedData } from 'ox' -import { Network, Payload } from '@0xsequence/wallet-primitives' +import { Config, Constants, Network, Payload } from '@0xsequence/wallet-primitives' import { Kinds } from '../src/sequence/types/signer' import { newManager } from './constants' import { GuardRole, Guards } from '../src/sequence/guards' @@ -315,4 +315,60 @@ describe('GuardHandler', () => { expect(sharedConfig.guardAddresses).toBeDefined() }) }) + + describe('Guard Topology', () => { + it('should replace the placeholder guard address', () => { + const guardAddress = (manager as any).shared.sequence.guardAddresses.wallet + const defaultTopology = (manager as any).shared.sequence.defaultGuardTopology + + const topology = guards.topology('wallet') + + expect(topology).toBeDefined() + expect(Config.findSignerLeaf(topology!, guardAddress)).toBeDefined() + expect(Config.findSignerLeaf(topology!, Constants.PlaceholderAddress as Address.Address)).toBeUndefined() + expect(Config.findSignerLeaf(defaultTopology, guardAddress)).toBeUndefined() + expect(Config.hashConfiguration(topology!)).not.toEqual(Config.hashConfiguration(defaultTopology)) + }) + + it('should throw when the placeholder is missing in the default topology', async () => { + const customManager = newManager( + { + defaultGuardTopology: { + type: 'signer', + address: '0x0000000000000000000000000000000000000001', + weight: 1n, + }, + }, + undefined, + `guard_topology_${Date.now()}`, + ) + + const customGuards = (customManager as any).shared.modules.guards as Guards + + try { + expect(() => customGuards.topology('wallet')).toThrow('Guard address replacement failed for role wallet') + } finally { + await customManager.stop() + } + }) + + it('should return undefined when no guard address is set for a role', async () => { + const defaultWalletGuard = (manager as any).shared.sequence.guardAddresses.wallet + const customManager = newManager( + { + guardAddresses: { + wallet: defaultWalletGuard, + } as any, + }, + undefined, + `guard_missing_${Date.now()}`, + ) + + const customGuards = (customManager as any).shared.modules.guards as Guards + + expect(customGuards.topology('sessions')).toBeUndefined() + + await customManager.stop() + }) + }) }) diff --git a/packages/wallet/wdk/test/wallets.test.ts b/packages/wallet/wdk/test/wallets.test.ts index 45db676131..ec3265b505 100644 --- a/packages/wallet/wdk/test/wallets.test.ts +++ b/packages/wallet/wdk/test/wallets.test.ts @@ -2,7 +2,7 @@ import { afterEach, describe, expect, it } from 'vitest' import { Manager, SignerActionable, SignerReady } from '../src/sequence' import { Mnemonic, Address } from 'ox' import { newManager } from './constants' -import { Network } from '@0xsequence/wallet-primitives' +import { Config, Constants, Network } from '@0xsequence/wallet-primitives' describe('Wallets', () => { let manager: Manager | undefined @@ -298,6 +298,95 @@ describe('Wallets', () => { expect(config.raw.modules).toBeDefined() }) + it('Should include guard configuration when enabled', async () => { + manager = newManager(undefined, undefined, `guard_enabled_${Date.now()}`) + const guardAddress = (manager as any).shared.sequence.guardAddresses.wallet + const sessionsGuardAddress = (manager as any).shared.sequence.guardAddresses.sessions + const sessionsModuleAddress = (manager as any).shared.sequence.extensions.sessions + + const wallet = await manager.wallets.signUp({ + mnemonic: Mnemonic.random(Mnemonic.english), + kind: 'mnemonic', + noGuard: false, + }) + + const config = await manager.wallets.getConfiguration(wallet!) + + expect(config.walletGuard?.address).toBe(guardAddress) + expect(config.raw.guardTopology).toBeDefined() + expect(Config.findSignerLeaf(config.raw.guardTopology!, guardAddress)).toBeDefined() + expect( + Config.findSignerLeaf(config.raw.guardTopology!, Constants.PlaceholderAddress as Address.Address), + ).toBeUndefined() + + const sessionsModule = config.raw.modules.find((m) => Address.isEqual(m.sapientLeaf.address, sessionsModuleAddress)) + expect(sessionsModule?.guardLeaf).toBeDefined() + expect(Config.findSignerLeaf(sessionsModule!.guardLeaf!, sessionsGuardAddress)).toBeDefined() + expect( + Config.findSignerLeaf(sessionsModule!.guardLeaf!, Constants.PlaceholderAddress as Address.Address), + ).toBeUndefined() + + expect(config.moduleGuards.get(sessionsModuleAddress as Address.Address)?.address).toBe(sessionsGuardAddress) + }) + + it('Should support non-nested guard topologies', async () => { + manager = newManager( + { + defaultGuardTopology: { + type: 'signer', + address: Constants.PlaceholderAddress, + weight: 1n, + }, + }, + undefined, + `flat_guard_${Date.now()}`, + ) + + const guardAddress = (manager as any).shared.sequence.guardAddresses.wallet + const sessionsGuardAddress = (manager as any).shared.sequence.guardAddresses.sessions + const wallet = await manager.wallets.signUp({ + mnemonic: Mnemonic.random(Mnemonic.english), + kind: 'mnemonic', + noGuard: false, + }) + + const config = await manager.wallets.getConfiguration(wallet!) + + expect(config.walletGuard?.address).toBe(guardAddress) + expect(config.raw.guardTopology).toBeDefined() + expect(Config.findSignerLeaf(config.raw.guardTopology!, guardAddress)).toBeDefined() + expect( + Config.findSignerLeaf(config.raw.guardTopology!, Constants.PlaceholderAddress as Address.Address), + ).toBeUndefined() + + const sessionsModuleAddress = (manager as any).shared.sequence.extensions.sessions + const sessionsModule = config.raw.modules.find((m) => Address.isEqual(m.sapientLeaf.address, sessionsModuleAddress)) + expect(sessionsModule?.guardLeaf).toBeDefined() + expect(Config.findSignerLeaf(sessionsModule!.guardLeaf!, sessionsGuardAddress)).toBeDefined() + }) + + it('Should fail signup when default guard topology lacks placeholder address', async () => { + manager = newManager( + { + defaultGuardTopology: { + type: 'signer', + address: '0x0000000000000000000000000000000000000001', + weight: 1n, + }, + }, + undefined, + `guard_missing_placeholder_${Date.now()}`, + ) + + await expect( + manager.wallets.signUp({ + mnemonic: Mnemonic.random(Mnemonic.english), + kind: 'mnemonic', + noGuard: false, + }), + ).rejects.toThrow('Guard address replacement failed for role wallet') + }) + // === ERROR HANDLING === it('Should throw error when trying to get configuration for non-existent wallet', async () => { From 4723f58d5bcc9290d9eb4e7bd0dd9d1e85df7646 Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Thu, 20 Nov 2025 17:34:04 +0100 Subject: [PATCH 081/119] Switch prod manager settings (#917) * Add prod guard and identity instrument info * Remove completed TODOs --- packages/wallet/wdk/src/sequence/manager.ts | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/packages/wallet/wdk/src/sequence/manager.ts b/packages/wallet/wdk/src/sequence/manager.ts index f77c94943c..8951a98674 100644 --- a/packages/wallet/wdk/src/sequence/manager.ts +++ b/packages/wallet/wdk/src/sequence/manager.ts @@ -115,11 +115,11 @@ export const ManagerOptionsDefaults = { }, bundlers: [], - guardUrl: 'https://dev-guard.sequence.app', + guardUrl: 'https://guard.sequence.app', guardAddresses: { - wallet: '0xa2e70CeaB3Eb145F32d110383B75B330fA4e288a', - sessions: '0x18002Fc09deF9A47437cc64e270843dE094f5984', - } as Record, // TODO: change to the actual guard address + wallet: '0x26f3D30F41FA897309Ae804A2AFf15CEb1dA5742', + sessions: '0xF6Bc87F5F2edAdb66737E32D37b46423901dfEF1', + } as Record, defaultGuardTopology: { type: 'nested', @@ -153,8 +153,7 @@ export const ManagerOptionsDefaults = { multiInjectedProviderDiscovery: true, identity: { - // TODO: change to prod url once deployed - url: 'https://dev-identity.sequence-dev.app', + url: 'https://identity.sequence.app', fetch: typeof window !== 'undefined' ? window.fetch : undefined, verifyAttestation: true, email: { From 8cd590acf92efaa43c7a1289103f7e5eae78fb46 Mon Sep 17 00:00:00 2001 From: Agusx1211 Date: Thu, 20 Nov 2025 20:11:02 +0100 Subject: [PATCH 082/119] Small JS tweaks (#919) * Fix type exports to built declarations * Update repository links to current package paths * Improve Next app tooling and React typings * Expose primitives CLI bin and use base lint config --- extras/docs/eslint.config.js | 7 +- extras/docs/next.config.js | 12 ++- extras/docs/package.json | 7 +- extras/web/eslint.config.js | 7 +- extras/web/next.config.js | 12 ++- extras/web/package.json | 7 +- packages/services/api/package.json | 4 +- packages/services/builder/package.json | 4 +- packages/services/guard/package.json | 2 +- packages/services/indexer/package.json | 4 +- packages/services/marketplace/package.json | 4 +- packages/services/metadata/package.json | 4 +- packages/services/relayer/package.json | 2 +- packages/utils/abi/package.json | 4 +- packages/wallet/dapp-client/eslint.config.mjs | 4 +- .../wallet/primitives-cli/eslint.config.mjs | 4 +- packages/wallet/primitives-cli/package.json | 1 + packages/wallet/primitives/eslint.config.mjs | 4 +- pnpm-lock.yaml | 77 ++++++++----------- repo/ui/package.json | 4 +- 20 files changed, 97 insertions(+), 77 deletions(-) diff --git a/extras/docs/eslint.config.js b/extras/docs/eslint.config.js index 3d2c2e9d49..0fbeffd979 100644 --- a/extras/docs/eslint.config.js +++ b/extras/docs/eslint.config.js @@ -1,4 +1,9 @@ import { nextJsConfig } from '@repo/eslint-config/next-js' /** @type {import("eslint").Linter.Config} */ -export default nextJsConfig +export default [ + ...nextJsConfig, + { + ignores: ['next-env.d.ts'], + }, +] diff --git a/extras/docs/next.config.js b/extras/docs/next.config.js index 1d6147825a..2963459c42 100644 --- a/extras/docs/next.config.js +++ b/extras/docs/next.config.js @@ -1,4 +1,14 @@ +import path from 'node:path' +import { fileURLToPath } from 'node:url' + +const __dirname = path.dirname(fileURLToPath(import.meta.url)) +const workspaceRoot = path.join(__dirname, '..', '..') + /** @type {import('next').NextConfig} */ -const nextConfig = {} +const nextConfig = { + // Anchor output tracing to the monorepo root so Next.js doesn't pick up + // sibling lockfiles and mis-detect the workspace boundary during lint/build. + outputFileTracingRoot: workspaceRoot, +} export default nextConfig diff --git a/extras/docs/package.json b/extras/docs/package.json index d88f6aab18..f6ff9108b9 100644 --- a/extras/docs/package.json +++ b/extras/docs/package.json @@ -7,7 +7,7 @@ "dev": "next dev --turbopack --port 3001", "build": "next build", "start": "next start", - "lint": "next lint --max-warnings 0", + "lint": "eslint . --max-warnings 0", "typecheck": "tsc --noEmit", "clean": "rimraf .next" }, @@ -21,8 +21,9 @@ "@repo/eslint-config": "workspace:*", "@repo/typescript-config": "workspace:*", "@types/node": "^20.17.57", - "@types/react": "18.3.1", - "@types/react-dom": "18.3.0", + "@types/react": "^19.2.6", + "@types/react-dom": "^19.2.3", + "eslint": "^9.28.0", "typescript": "5.5.4" } } diff --git a/extras/web/eslint.config.js b/extras/web/eslint.config.js index 3d2c2e9d49..0fbeffd979 100644 --- a/extras/web/eslint.config.js +++ b/extras/web/eslint.config.js @@ -1,4 +1,9 @@ import { nextJsConfig } from '@repo/eslint-config/next-js' /** @type {import("eslint").Linter.Config} */ -export default nextJsConfig +export default [ + ...nextJsConfig, + { + ignores: ['next-env.d.ts'], + }, +] diff --git a/extras/web/next.config.js b/extras/web/next.config.js index 1d6147825a..2963459c42 100644 --- a/extras/web/next.config.js +++ b/extras/web/next.config.js @@ -1,4 +1,14 @@ +import path from 'node:path' +import { fileURLToPath } from 'node:url' + +const __dirname = path.dirname(fileURLToPath(import.meta.url)) +const workspaceRoot = path.join(__dirname, '..', '..') + /** @type {import('next').NextConfig} */ -const nextConfig = {} +const nextConfig = { + // Anchor output tracing to the monorepo root so Next.js doesn't pick up + // sibling lockfiles and mis-detect the workspace boundary during lint/build. + outputFileTracingRoot: workspaceRoot, +} export default nextConfig diff --git a/extras/web/package.json b/extras/web/package.json index 8a0ffdf213..06e2f93402 100644 --- a/extras/web/package.json +++ b/extras/web/package.json @@ -7,7 +7,7 @@ "dev": "next dev --turbopack --port 3000", "build": "next build", "start": "next start", - "lint": "next lint --max-warnings 0", + "lint": "eslint . --max-warnings 0", "typecheck": "tsc --noEmit", "clean": "rimraf .next" }, @@ -21,8 +21,9 @@ "@repo/eslint-config": "workspace:*", "@repo/typescript-config": "workspace:*", "@types/node": "^20.17.57", - "@types/react": "18.3.1", - "@types/react-dom": "18.3.0", + "@types/react": "^19.2.6", + "@types/react-dom": "^19.2.3", + "eslint": "^9.28.0", "typescript": "5.5.4" } } diff --git a/packages/services/api/package.json b/packages/services/api/package.json index bba908e695..3a381a2759 100644 --- a/packages/services/api/package.json +++ b/packages/services/api/package.json @@ -2,7 +2,7 @@ "name": "@0xsequence/api", "version": "3.0.0", "description": "api sub-package for Sequence", - "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/api", + "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/api", "author": "Sequence Platforms Inc.", "license": "Apache-2.0", "publishConfig": { @@ -16,7 +16,7 @@ }, "exports": { ".": { - "types": "./src/index.ts", + "types": "./dist/index.d.ts", "default": "./dist/index.js" } }, diff --git a/packages/services/builder/package.json b/packages/services/builder/package.json index e5668967a9..4eb4017390 100644 --- a/packages/services/builder/package.json +++ b/packages/services/builder/package.json @@ -2,7 +2,7 @@ "name": "@0xsequence/builder", "version": "3.0.0", "description": "builder sub-package for Sequence", - "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/builder", + "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/builder", "author": "Sequence Platforms Inc.", "license": "Apache-2.0", "publishConfig": { @@ -16,7 +16,7 @@ }, "exports": { ".": { - "types": "./src/index.ts", + "types": "./dist/index.d.ts", "default": "./dist/index.js" } }, diff --git a/packages/services/guard/package.json b/packages/services/guard/package.json index a7ec3a3d49..7b596d782b 100644 --- a/packages/services/guard/package.json +++ b/packages/services/guard/package.json @@ -2,7 +2,7 @@ "name": "@0xsequence/guard", "version": "3.0.0", "description": "guard sub-package for Sequence", - "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/guard", + "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/guard", "author": "Sequence Platforms Inc.", "license": "Apache-2.0", "type": "module", diff --git a/packages/services/indexer/package.json b/packages/services/indexer/package.json index 0eec0d29d4..6e90f3503d 100644 --- a/packages/services/indexer/package.json +++ b/packages/services/indexer/package.json @@ -2,7 +2,7 @@ "name": "@0xsequence/indexer", "version": "3.0.0", "description": "indexer sub-package for Sequence", - "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/indexer", + "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/indexer", "author": "Sequence Platforms Inc.", "license": "Apache-2.0", "publishConfig": { @@ -16,7 +16,7 @@ }, "exports": { ".": { - "types": "./src/index.ts", + "types": "./dist/index.d.ts", "default": "./dist/index.js" } }, diff --git a/packages/services/marketplace/package.json b/packages/services/marketplace/package.json index 106c486daf..5b98c40e94 100644 --- a/packages/services/marketplace/package.json +++ b/packages/services/marketplace/package.json @@ -2,7 +2,7 @@ "name": "@0xsequence/marketplace", "version": "3.0.0", "description": "marketplace sub-package for Sequence", - "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/marketplace", + "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/marketplace", "author": "Sequence Platforms Inc.", "license": "Apache-2.0", "publishConfig": { @@ -16,7 +16,7 @@ }, "exports": { ".": { - "types": "./src/index.ts", + "types": "./dist/index.d.ts", "default": "./dist/index.js" } }, diff --git a/packages/services/metadata/package.json b/packages/services/metadata/package.json index af9069cd66..54e9faea74 100644 --- a/packages/services/metadata/package.json +++ b/packages/services/metadata/package.json @@ -5,7 +5,7 @@ "access": "public" }, "description": "metadata sub-package for Sequence", - "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/metadata", + "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/metadata", "author": "Sequence Platforms Inc.", "license": "Apache-2.0", "scripts": { @@ -16,7 +16,7 @@ }, "exports": { ".": { - "types": "./src/index.ts", + "types": "./dist/index.d.ts", "default": "./dist/index.js" } }, diff --git a/packages/services/relayer/package.json b/packages/services/relayer/package.json index be043ee986..3ddc0e9683 100644 --- a/packages/services/relayer/package.json +++ b/packages/services/relayer/package.json @@ -6,7 +6,7 @@ "access": "public" }, "description": "relayer sub-package for Sequence", - "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/relayer", + "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/relayer", "author": "Sequence Platforms Inc.", "license": "Apache-2.0", "scripts": { diff --git a/packages/utils/abi/package.json b/packages/utils/abi/package.json index 738e1398cf..e6ad8804e3 100644 --- a/packages/utils/abi/package.json +++ b/packages/utils/abi/package.json @@ -2,7 +2,7 @@ "name": "@0xsequence/abi", "version": "3.0.0", "description": "abi sub-package for Sequence", - "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/abi", + "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/utils/abi", "author": "Sequence Platforms Inc.", "license": "Apache-2.0", "publishConfig": { @@ -16,7 +16,7 @@ }, "exports": { ".": { - "types": "./src/index.ts", + "types": "./dist/index.d.ts", "default": "./dist/index.js" } }, diff --git a/packages/wallet/dapp-client/eslint.config.mjs b/packages/wallet/dapp-client/eslint.config.mjs index 19170f88ed..cecf89b031 100644 --- a/packages/wallet/dapp-client/eslint.config.mjs +++ b/packages/wallet/dapp-client/eslint.config.mjs @@ -1,4 +1,4 @@ -import { config } from "@repo/eslint-config/react-internal"; +import { config as baseConfig } from "@repo/eslint-config/base" /** @type {import("eslint").Linter.Config} */ -export default config; +export default baseConfig diff --git a/packages/wallet/primitives-cli/eslint.config.mjs b/packages/wallet/primitives-cli/eslint.config.mjs index 19170f88ed..cecf89b031 100644 --- a/packages/wallet/primitives-cli/eslint.config.mjs +++ b/packages/wallet/primitives-cli/eslint.config.mjs @@ -1,4 +1,4 @@ -import { config } from "@repo/eslint-config/react-internal"; +import { config as baseConfig } from "@repo/eslint-config/base" /** @type {import("eslint").Linter.Config} */ -export default config; +export default baseConfig diff --git a/packages/wallet/primitives-cli/package.json b/packages/wallet/primitives-cli/package.json index b01f2eb983..722d94e4c2 100644 --- a/packages/wallet/primitives-cli/package.json +++ b/packages/wallet/primitives-cli/package.json @@ -1,6 +1,7 @@ { "name": "@0xsequence/wallet-primitives-cli", "type": "module", + "bin": "./dist/index.js", "scripts": { "build": "tsc", "build:esbuild": "esbuild src/index.ts --bundle --platform=node --target=node16 --outfile=dist/index.js", diff --git a/packages/wallet/primitives/eslint.config.mjs b/packages/wallet/primitives/eslint.config.mjs index 19170f88ed..cecf89b031 100644 --- a/packages/wallet/primitives/eslint.config.mjs +++ b/packages/wallet/primitives/eslint.config.mjs @@ -1,4 +1,4 @@ -import { config } from "@repo/eslint-config/react-internal"; +import { config as baseConfig } from "@repo/eslint-config/base" /** @type {import("eslint").Linter.Config} */ -export default config; +export default baseConfig diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ad45d777b0..c814fa1ae8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -52,11 +52,14 @@ importers: specifier: ^20.17.57 version: 20.19.21 '@types/react': - specifier: 18.3.1 - version: 18.3.1 + specifier: ^19.2.6 + version: 19.2.6 '@types/react-dom': - specifier: 18.3.0 - version: 18.3.0 + specifier: ^19.2.3 + version: 19.2.3(@types/react@19.2.6) + eslint: + specifier: ^9.28.0 + version: 9.37.0 typescript: specifier: 5.5.4 version: 5.5.4 @@ -86,11 +89,14 @@ importers: specifier: ^20.17.57 version: 20.19.21 '@types/react': - specifier: 18.3.1 - version: 18.3.1 + specifier: ^19.2.6 + version: 19.2.6 '@types/react-dom': - specifier: 18.3.0 - version: 18.3.0 + specifier: ^19.2.3 + version: 19.2.3(@types/react@19.2.6) + eslint: + specifier: ^9.28.0 + version: 9.37.0 typescript: specifier: 5.5.4 version: 5.5.4 @@ -499,11 +505,11 @@ importers: specifier: ^20.17.57 version: 20.19.21 '@types/react': - specifier: 18.3.0 - version: 18.3.0 + specifier: ^19.2.6 + version: 19.2.6 '@types/react-dom': - specifier: 18.3.1 - version: 18.3.1 + specifier: ^19.2.3 + version: 19.2.3(@types/react@19.2.6) typescript: specifier: 5.5.4 version: 5.5.4 @@ -1260,20 +1266,13 @@ packages: '@types/node@22.18.10': resolution: {integrity: sha512-anNG/V/Efn/YZY4pRzbACnKxNKoBng2VTFydVu8RRs5hQjikP8CQfaeAV59VFSCzKNp90mXiVXW2QzV56rwMrg==} - '@types/prop-types@15.7.15': - resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} - - '@types/react-dom@18.3.0': - resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} - - '@types/react-dom@18.3.1': - resolution: {integrity: sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==} - - '@types/react@18.3.0': - resolution: {integrity: sha512-DiUcKjzE6soLyln8NNZmyhcQjVv+WsUIFSqetMN0p8927OztKT4VTfFTqsbAi5oAGIcgOmOajlfBqyptDDjZRw==} + '@types/react-dom@19.2.3': + resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} + peerDependencies: + '@types/react': ^19.2.0 - '@types/react@18.3.1': - resolution: {integrity: sha512-V0kuGBX3+prX+DQ/7r2qsv1NsdfnCLnTgnRJ1pYnxykBhGMz+qj+box5lq7XsO5mtZsBqpjwwTu/7wszPfMBcw==} + '@types/react@19.2.6': + resolution: {integrity: sha512-p/jUvulfgU7oKtj6Xpk8cA2Y1xKTtICGpJYeJXz2YVO2UcvjQgeRMLDGfDeqeRW2Ta+0QNFwcc8X3GH8SxZz6w==} '@types/through@0.0.33': resolution: {integrity: sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==} @@ -1697,8 +1696,8 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} data-uri-to-buffer@6.0.2: resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} @@ -4370,7 +4369,7 @@ snapshots: '@types/minimatch@6.0.0': dependencies: - minimatch: 9.0.5 + minimatch: 10.0.3 '@types/node@12.20.55': {} @@ -4382,25 +4381,13 @@ snapshots: dependencies: undici-types: 6.21.0 - '@types/prop-types@15.7.15': {} - - '@types/react-dom@18.3.0': - dependencies: - '@types/react': 18.3.1 - - '@types/react-dom@18.3.1': - dependencies: - '@types/react': 18.3.1 - - '@types/react@18.3.0': + '@types/react-dom@19.2.3(@types/react@19.2.6)': dependencies: - '@types/prop-types': 15.7.15 - csstype: 3.1.3 + '@types/react': 19.2.6 - '@types/react@18.3.1': + '@types/react@19.2.6': dependencies: - '@types/prop-types': 15.7.15 - csstype: 3.1.3 + csstype: 3.2.3 '@types/through@0.0.33': dependencies: @@ -4912,7 +4899,7 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - csstype@3.1.3: {} + csstype@3.2.3: {} data-uri-to-buffer@6.0.2: {} diff --git a/repo/ui/package.json b/repo/ui/package.json index 51af743edf..d11de66b7e 100644 --- a/repo/ui/package.json +++ b/repo/ui/package.json @@ -17,8 +17,8 @@ "@repo/typescript-config": "workspace:*", "@turbo/gen": "^1.13.4", "@types/node": "^20.17.57", - "@types/react": "18.3.0", - "@types/react-dom": "18.3.1", + "@types/react": "^19.2.6", + "@types/react-dom": "^19.2.3", "typescript": "5.5.4" }, "dependencies": { From c54088dbe421e58b22a5e1a5904adcddf5eb4aac Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Thu, 20 Nov 2025 21:22:02 +0100 Subject: [PATCH 083/119] Update relayer.gen.ts and TransactionPrecondition interface --- .../relayer/src/preconditions/codec.ts | 71 +- .../relayer/src/preconditions/selectors.ts | 19 +- .../relayer/src/relayer/rpc-relayer/index.ts | 8 +- .../src/relayer/rpc-relayer/relayer.gen.ts | 1725 ++++++++++------- .../relayer/src/relayer/standard/eip6963.ts | 4 +- .../relayer/src/relayer/standard/local.ts | 6 +- .../relayer/src/relayer/standard/sequence.ts | 4 +- .../relayer/test/preconditions/codec.test.ts | 297 ++- .../test/preconditions/selectors.test.ts | 34 +- 9 files changed, 1184 insertions(+), 984 deletions(-) diff --git a/packages/services/relayer/src/preconditions/codec.ts b/packages/services/relayer/src/preconditions/codec.ts index a6c2a13f7e..74f83154be 100644 --- a/packages/services/relayer/src/preconditions/codec.ts +++ b/packages/services/relayer/src/preconditions/codec.ts @@ -10,12 +10,15 @@ import { Erc1155ApprovalPrecondition, } from './types.js' -export interface IntentPrecondition { +export interface TransactionPrecondition { type: string - data: string + chainId: number + ownerAddress: string + tokenAddress: string + minAmount: bigint } -export function decodePreconditions(preconditions: IntentPrecondition[]): Precondition[] { +export function decodePreconditions(preconditions: TransactionPrecondition[]): Precondition[] { const decodedPreconditions: Precondition[] = [] for (const p of preconditions) { @@ -28,7 +31,7 @@ export function decodePreconditions(preconditions: IntentPrecondition[]): Precon return decodedPreconditions } -export function decodePrecondition(p: IntentPrecondition): Precondition | undefined { +export function decodePrecondition(p: TransactionPrecondition): Precondition | undefined { if (!p) { return undefined } @@ -36,70 +39,64 @@ export function decodePrecondition(p: IntentPrecondition): Precondition | undefi let precondition: Precondition | undefined try { - const data = JSON.parse(p.data) - switch (p.type) { case 'native-balance': - precondition = new NativeBalancePrecondition( - Address.from(data.address), - data.min ? BigInt(data.min) : undefined, - data.max ? BigInt(data.max) : undefined, - ) + precondition = new NativeBalancePrecondition(Address.from(p.ownerAddress), p.minAmount, undefined) break case 'erc20-balance': precondition = new Erc20BalancePrecondition( - Address.from(data.address), - Address.from(data.token), - data.min ? BigInt(data.min) : undefined, - data.max ? BigInt(data.max) : undefined, + Address.from(p.ownerAddress), + Address.from(p.tokenAddress), + p.minAmount, + undefined, ) break case 'erc20-approval': precondition = new Erc20ApprovalPrecondition( - Address.from(data.address), - Address.from(data.token), - Address.from(data.operator), - BigInt(data.min), + Address.from(p.ownerAddress), + Address.from(p.tokenAddress), + Address.from(p.ownerAddress), + p.minAmount, ) break case 'erc721-ownership': precondition = new Erc721OwnershipPrecondition( - Address.from(data.address), - Address.from(data.token), - BigInt(data.tokenId), - data.owned, + Address.from(p.ownerAddress), + Address.from(p.tokenAddress), + BigInt(0), + true, ) break case 'erc721-approval': precondition = new Erc721ApprovalPrecondition( - Address.from(data.address), - Address.from(data.token), - BigInt(data.tokenId), - Address.from(data.operator), + Address.from(p.ownerAddress), + Address.from(p.tokenAddress), + BigInt(0), + Address.from(p.ownerAddress), ) break case 'erc1155-balance': precondition = new Erc1155BalancePrecondition( - Address.from(data.address), - Address.from(data.token), - BigInt(data.tokenId), - data.min ? BigInt(data.min) : undefined, - data.max ? BigInt(data.max) : undefined, + Address.from(p.ownerAddress), + Address.from(p.tokenAddress), + BigInt(0), + p.minAmount, + undefined, ) break case 'erc1155-approval': precondition = new Erc1155ApprovalPrecondition( - Address.from(data.address), - Address.from(data.token), - BigInt(data.tokenId), - Address.from(data.operator), - BigInt(data.min), + Address.from(p.ownerAddress), + Address.from(p.tokenAddress), + BigInt(0), + Address.from(p.ownerAddress), + p.minAmount, ) break diff --git a/packages/services/relayer/src/preconditions/selectors.ts b/packages/services/relayer/src/preconditions/selectors.ts index 42b8cbb3b8..d5985a8622 100644 --- a/packages/services/relayer/src/preconditions/selectors.ts +++ b/packages/services/relayer/src/preconditions/selectors.ts @@ -1,20 +1,15 @@ import { Precondition, NativeBalancePrecondition, Erc20BalancePrecondition } from './types.js' -import { IntentPrecondition, decodePreconditions } from './codec.js' +import { TransactionPrecondition, decodePreconditions } from './codec.js' -export function extractChainID(precondition: IntentPrecondition): number | undefined { +export function extractChainID(precondition: TransactionPrecondition): number | undefined { if (!precondition) { return undefined } - try { - const data = JSON.parse(precondition.data) - return data.chainID ? Number(data.chainID) : undefined - } catch (e) { - return undefined - } + return precondition.chainId } -export function extractSupportedPreconditions(preconditions: IntentPrecondition[]): Precondition[] { +export function extractSupportedPreconditions(preconditions: TransactionPrecondition[]): Precondition[] { if (!preconditions || preconditions.length === 0) { return [] } @@ -22,7 +17,9 @@ export function extractSupportedPreconditions(preconditions: IntentPrecondition[ return decodePreconditions(preconditions) } -export function extractNativeBalancePreconditions(preconditions: IntentPrecondition[]): NativeBalancePrecondition[] { +export function extractNativeBalancePreconditions( + preconditions: TransactionPrecondition[], +): NativeBalancePrecondition[] { if (!preconditions || preconditions.length === 0) { return [] } @@ -31,7 +28,7 @@ export function extractNativeBalancePreconditions(preconditions: IntentPrecondit return decoded.filter((p): p is NativeBalancePrecondition => p.type() === 'native-balance') } -export function extractERC20BalancePreconditions(preconditions: IntentPrecondition[]): Erc20BalancePrecondition[] { +export function extractERC20BalancePreconditions(preconditions: TransactionPrecondition[]): Erc20BalancePrecondition[] { if (!preconditions || preconditions.length === 0) { return [] } diff --git a/packages/services/relayer/src/relayer/rpc-relayer/index.ts b/packages/services/relayer/src/relayer/rpc-relayer/index.ts index 0768490c98..04db6aa40c 100644 --- a/packages/services/relayer/src/relayer/rpc-relayer/index.ts +++ b/packages/services/relayer/src/relayer/rpc-relayer/index.ts @@ -4,7 +4,7 @@ import { MetaTxn as RpcMetaTxn, FeeTokenType, FeeToken as RpcFeeToken, - IntentPrecondition, + TransactionPrecondition, ETHTxnStatus, } from './relayer.gen.js' import { Address, Hex, Bytes, AbiFunction } from 'ox' @@ -173,7 +173,7 @@ export class RpcRelayer implements Relayer { data: Hex.Hex, chainId: number, quote?: FeeQuote, - preconditions?: IntentPrecondition[], + preconditions?: TransactionPrecondition[], ): Promise<{ opHash: Hex.Hex }> { console.log('sendMetaTxn', walletAddress, to, data, chainId, quote, preconditions) const rpcCall: RpcMetaTxn = { @@ -204,7 +204,7 @@ export class RpcRelayer implements Relayer { data: Hex.Hex, chainId: number, quote?: FeeQuote, - preconditions?: IntentPrecondition[], + preconditions?: TransactionPrecondition[], ): Promise<{ opHash: Hex.Hex }> { console.log('relay', to, data, chainId, quote, preconditions) const rpcCall: RpcMetaTxn = { @@ -273,7 +273,7 @@ export class RpcRelayer implements Relayer { } } - async checkPrecondition(precondition: IntentPrecondition): Promise { + async checkPrecondition(precondition: TransactionPrecondition): Promise { const decoded = decodePrecondition(precondition) if (!decoded) { diff --git a/packages/services/relayer/src/relayer/rpc-relayer/relayer.gen.ts b/packages/services/relayer/src/relayer/rpc-relayer/relayer.gen.ts index 0638fbe946..ca5dbe9c82 100644 --- a/packages/services/relayer/src/relayer/rpc-relayer/relayer.gen.ts +++ b/packages/services/relayer/src/relayer/rpc-relayer/relayer.gen.ts @@ -1,73 +1,189 @@ /* eslint-disable */ -// sequence-relayer v0.4.1 93ac61641d0351211680e2092673726b5c4f1848 +// sequence-relayer v0.4.1 7f8a4b83b00e0b6849c76c2ff0e23931e26b3d9f // -- -// Code generated by webrpc-gen@v0.26.0 with typescript generator. DO NOT EDIT. +// Code generated by Webrpc-gen@v0.30.2 with typescript generator. DO NOT EDIT. // -// webrpc-gen -schema=relayer.ridl -target=typescript -client -out=./clients/relayer.gen.ts +// webrpc-gen -schema=relayer.ridl -target=typescript -client -out=./clients/relayer.gen.ts -compat -export const WebrpcHeader = 'Webrpc' - -export const WebrpcHeaderValue = 'webrpc@v0.26.0;gen-typescript@v0.17.0;sequence-relayer@v0.4.1' - -// WebRPC description and code-gen version -export const WebRPCVersion = 'v1' +// Webrpc description and code-gen version +export const WebrpcVersion = 'v1' // Schema version of your RIDL schema -export const WebRPCSchemaVersion = 'v0.4.1' +export const WebrpcSchemaVersion = 'v0.4.1' // Schema hash generated from your RIDL schema -export const WebRPCSchemaHash = '93ac61641d0351211680e2092673726b5c4f1848' +export const WebrpcSchemaHash = '7f8a4b83b00e0b6849c76c2ff0e23931e26b3d9f' -type WebrpcGenVersions = { - webrpcGenVersion: string - codeGenName: string - codeGenVersion: string - schemaName: string - schemaVersion: string -} +// +// Client interface +// -export function VersionFromHeader(headers: Headers): WebrpcGenVersions { - const headerValue = headers.get(WebrpcHeader) - if (!headerValue) { - return { - webrpcGenVersion: '', - codeGenName: '', - codeGenVersion: '', - schemaName: '', - schemaVersion: '', - } - } +export interface RelayerClient { + ping(headers?: object, signal?: AbortSignal): Promise - return parseWebrpcGenVersions(headerValue) -} + version(headers?: object, signal?: AbortSignal): Promise -function parseWebrpcGenVersions(header: string): WebrpcGenVersions { - const versions = header.split(';') - if (versions.length < 3) { - return { - webrpcGenVersion: '', - codeGenName: '', - codeGenVersion: '', - schemaName: '', - schemaVersion: '', - } - } + runtimeStatus(headers?: object, signal?: AbortSignal): Promise - const [_, webrpcGenVersion] = versions[0]!.split('@') - const [codeGenName, codeGenVersion] = versions[1]!.split('@') - const [schemaName, schemaVersion] = versions[2]!.split('@') + getSequenceContext(headers?: object, signal?: AbortSignal): Promise - return { - webrpcGenVersion: webrpcGenVersion ?? '', - codeGenName: codeGenName ?? '', - codeGenVersion: codeGenVersion ?? '', - schemaName: schemaName ?? '', - schemaVersion: schemaVersion ?? '', - } + getChainID(headers?: object, signal?: AbortSignal): Promise + + /** + * + * Transactions + * + * TODO (future): rename this to just, 'SendTransaction(txn: MetaTransaction)' or 'SendTransaction(txn: SignedTransaction)', or something.. + * Project ID is only used by service and admin calls. Other clients must have projectID passed via the context + * TODO: rename return txnHash: string to metaTxnID: string + */ + sendMetaTxn(req: SendMetaTxnArgs, headers?: object, signal?: AbortSignal): Promise + + getMetaTxnNonce(req: GetMetaTxnNonceArgs, headers?: object, signal?: AbortSignal): Promise + + /** + * TODO: one day, make GetMetaTxnReceipt respond immediately with receipt or not + * and add WaitTransactionReceipt method, which will block and wait, similar to how GetMetaTxnReceipt + * is implemented now. + * For backwards compat, we can leave the current GetMetaTxnReceipt how it is, an deprecate it, and introduce + * new, GetTransactionReceipt and WaitTransactionReceipt methods + * we can also accept metaTxnId and txnHash .. so can take either or.. I wonder if ERC-4337 has any convention on this? + */ + getMetaTxnReceipt( + req: GetMetaTxnReceiptArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + simulate(req: SimulateArgs, headers?: object, signal?: AbortSignal): Promise + + simulateV3(req: SimulateV3Args, headers?: object, signal?: AbortSignal): Promise + + /** + * TODO: deprecated, to be removed by https://github.com/0xsequence/stack/pull/356 at a later date + */ + updateMetaTxnGasLimits( + req: UpdateMetaTxnGasLimitsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + feeTokens(headers?: object, signal?: AbortSignal): Promise + + feeOptions(req: FeeOptionsArgs, headers?: object, signal?: AbortSignal): Promise + + /** + * TODO: deprecated, to be removed by https://github.com/0xsequence/stack/pull/356 at a later date + */ + getMetaTxnNetworkFeeOptions( + req: GetMetaTxnNetworkFeeOptionsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + getMetaTransactions( + req: GetMetaTransactionsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + getTransactionCost( + req: GetTransactionCostArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + /** + * Sent transactions from an account. If filter is omitted then it will return all transactions. + */ + sentTransactions(req: SentTransactionsArgs, headers?: object, signal?: AbortSignal): Promise + + /** + * Pending transactions waiting to be mined for an account. This endpoint is just a sugar of `SentTransactions` + * with the filter set to pending: true. + */ + pendingTransactions( + req: PendingTransactionsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + /** + * Legacy Gas Tank + */ + getGasTank(req: GetGasTankArgs, headers?: object, signal?: AbortSignal): Promise + + addGasTank(req: AddGasTankArgs, headers?: object, signal?: AbortSignal): Promise + + updateGasTank(req: UpdateGasTankArgs, headers?: object, signal?: AbortSignal): Promise + + /** + * Legacy Gas Adjustment + */ + nextGasTankBalanceAdjustmentNonce( + req: NextGasTankBalanceAdjustmentNonceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + adjustGasTankBalance( + req: AdjustGasTankBalanceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + getGasTankBalanceAdjustment( + req: GetGasTankBalanceAdjustmentArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + listGasTankBalanceAdjustments( + req: ListGasTankBalanceAdjustmentsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + /** + * Gas Sponsorship + */ + listGasSponsors(req: ListGasSponsorsArgs, headers?: object, signal?: AbortSignal): Promise + + getGasSponsor(req: GetGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise + + addGasSponsor(req: AddGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise + + updateGasSponsor(req: UpdateGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise + + removeGasSponsor(req: RemoveGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise + + /** + * Gas Sponsor Lookup + */ + addressGasSponsors( + req: AddressGasSponsorsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + /** + * Project Balance + */ + getProjectBalance( + req: GetProjectBalanceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + adjustProjectBalance( + req: AdjustProjectBalanceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise } // -// Types +// Schema types // export enum ETHTxnStatus { @@ -250,20 +366,10 @@ export interface MetaTxnReceiptLog { data: string } -export interface IntentPrecondition { - type: string - chainId: string - data: any -} - -export interface IntentSolution { - transactions: Array -} - export interface Transactions { chainID: string transactions: Array - preconditions?: Array + preconditions?: Array } export interface Transaction { @@ -275,6 +381,14 @@ export interface Transaction { data: string } +export interface TransactionPrecondition { + type: string + chainId: number + ownerAddress: string + tokenAddress: string + minAmount: bigint +} + export interface TxnLogUser { username: string } @@ -344,174 +458,48 @@ export interface SortBy { order: SortOrder } -export interface Relayer { - ping(headers?: object, signal?: AbortSignal): Promise - version(headers?: object, signal?: AbortSignal): Promise - runtimeStatus(headers?: object, signal?: AbortSignal): Promise - getSequenceContext(headers?: object, signal?: AbortSignal): Promise - getChainID(headers?: object, signal?: AbortSignal): Promise - /** - * - * Transactions - * - * TODO (future): rename this to just, 'SendTransaction(txn: MetaTransaction)' or 'SendTransaction(txn: SignedTransaction)', or something.. - * Project ID is only used by service and admin calls. Other clients must have projectID passed via the context - * TODO: rename return txnHash: string to metaTxnID: string - */ - sendMetaTxn(args: SendMetaTxnArgs, headers?: object, signal?: AbortSignal): Promise - getMetaTxnNonce(args: GetMetaTxnNonceArgs, headers?: object, signal?: AbortSignal): Promise - /** - * TODO: one day, make GetMetaTxnReceipt respond immediately with receipt or not - * and add WaitTransactionReceipt method, which will block and wait, similar to how GetMetaTxnReceipt - * is implemented now. - * For backwards compat, we can leave the current GetMetaTxnReceipt how it is, an deprecate it, and introduce - * new, GetTransactionReceipt and WaitTransactionReceipt methods - * we can also accept metaTxnId and txnHash .. so can take either or.. I wonder if ERC-4337 has any convention on this? - */ - getMetaTxnReceipt( - args: GetMetaTxnReceiptArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - simulate(args: SimulateArgs, headers?: object, signal?: AbortSignal): Promise - simulateV3(args: SimulateV3Args, headers?: object, signal?: AbortSignal): Promise - /** - * TODO: deprecated, to be removed by https://github.com/0xsequence/stack/pull/356 at a later date - */ - updateMetaTxnGasLimits( - args: UpdateMetaTxnGasLimitsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - feeTokens(headers?: object, signal?: AbortSignal): Promise - feeOptions(args: FeeOptionsArgs, headers?: object, signal?: AbortSignal): Promise - /** - * TODO: deprecated, to be removed by https://github.com/0xsequence/stack/pull/356 at a later date - */ - getMetaTxnNetworkFeeOptions( - args: GetMetaTxnNetworkFeeOptionsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - getMetaTransactions( - args: GetMetaTransactionsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - getTransactionCost( - args: GetTransactionCostArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - /** - * Sent transactions from an account. If filter is omitted then it will return all transactions. - */ - sentTransactions(args: SentTransactionsArgs, headers?: object, signal?: AbortSignal): Promise - /** - * Pending transactions waiting to be mined for an account. This endpoint is just a sugar of `SentTransactions` - * with the filter set to pending: true. - */ - pendingTransactions( - args: PendingTransactionsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - /** - * Legacy Gas Tank - */ - getGasTank(args: GetGasTankArgs, headers?: object, signal?: AbortSignal): Promise - addGasTank(args: AddGasTankArgs, headers?: object, signal?: AbortSignal): Promise - updateGasTank(args: UpdateGasTankArgs, headers?: object, signal?: AbortSignal): Promise - /** - * Legacy Gas Adjustment - */ - nextGasTankBalanceAdjustmentNonce( - args: NextGasTankBalanceAdjustmentNonceArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - adjustGasTankBalance( - args: AdjustGasTankBalanceArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - getGasTankBalanceAdjustment( - args: GetGasTankBalanceAdjustmentArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - listGasTankBalanceAdjustments( - args: ListGasTankBalanceAdjustmentsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - /** - * Gas Sponsorship - */ - listGasSponsors(args: ListGasSponsorsArgs, headers?: object, signal?: AbortSignal): Promise - getGasSponsor(args: GetGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise - addGasSponsor(args: AddGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise - updateGasSponsor(args: UpdateGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise - removeGasSponsor(args: RemoveGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise - /** - * Gas Sponsor Lookup - */ - addressGasSponsors( - args: AddressGasSponsorsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - /** - * Project Balance - */ - getProjectBalance( - args: GetProjectBalanceArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - adjustProjectBalance( - args: AdjustProjectBalanceArgs, - headers?: object, - signal?: AbortSignal, - ): Promise -} - export interface PingArgs {} export interface PingReturn { status: boolean } + export interface VersionArgs {} export interface VersionReturn { version: Version } + export interface RuntimeStatusArgs {} export interface RuntimeStatusReturn { status: RuntimeStatus } + export interface GetSequenceContextArgs {} export interface GetSequenceContextReturn { data: SequenceContext } + export interface GetChainIDArgs {} export interface GetChainIDReturn { chainID: number } + export interface SendMetaTxnArgs { call: MetaTxn quote?: string projectID?: number - preconditions?: Array + preconditions?: Array } export interface SendMetaTxnReturn { status: boolean txnHash: string } + export interface GetMetaTxnNonceArgs { walletContractAddress: string space?: string @@ -520,6 +508,7 @@ export interface GetMetaTxnNonceArgs { export interface GetMetaTxnNonceReturn { nonce: string } + export interface GetMetaTxnReceiptArgs { metaTxID: string } @@ -527,6 +516,7 @@ export interface GetMetaTxnReceiptArgs { export interface GetMetaTxnReceiptReturn { receipt: MetaTxnReceipt } + export interface SimulateArgs { wallet: string transactions: string @@ -535,6 +525,7 @@ export interface SimulateArgs { export interface SimulateReturn { results: Array } + export interface SimulateV3Args { wallet: string calls: string @@ -543,6 +534,7 @@ export interface SimulateV3Args { export interface SimulateV3Return { results: Array } + export interface UpdateMetaTxnGasLimitsArgs { walletAddress: string walletConfig: any @@ -552,6 +544,7 @@ export interface UpdateMetaTxnGasLimitsArgs { export interface UpdateMetaTxnGasLimitsReturn { payload: string } + export interface FeeTokensArgs {} export interface FeeTokensReturn { @@ -559,6 +552,7 @@ export interface FeeTokensReturn { tokens: Array paymentAddress: string } + export interface FeeOptionsArgs { wallet: string to: string @@ -571,6 +565,7 @@ export interface FeeOptionsReturn { sponsored: boolean quote?: string } + export interface GetMetaTxnNetworkFeeOptionsArgs { walletConfig: any payload: string @@ -579,6 +574,7 @@ export interface GetMetaTxnNetworkFeeOptionsArgs { export interface GetMetaTxnNetworkFeeOptionsReturn { options: Array } + export interface GetMetaTransactionsArgs { projectId: number page?: Page @@ -588,6 +584,7 @@ export interface GetMetaTransactionsReturn { page: Page transactions: Array } + export interface GetTransactionCostArgs { projectId: number from: string @@ -597,6 +594,7 @@ export interface GetTransactionCostArgs { export interface GetTransactionCostReturn { cost: number } + export interface SentTransactionsArgs { filter?: SentTransactionsFilter page?: Page @@ -606,6 +604,7 @@ export interface SentTransactionsReturn { page: Page transactions: Array } + export interface PendingTransactionsArgs { page?: Page } @@ -614,6 +613,7 @@ export interface PendingTransactionsReturn { page: Page transactions: Array } + export interface GetGasTankArgs { id: number } @@ -621,6 +621,7 @@ export interface GetGasTankArgs { export interface GetGasTankReturn { gasTank: GasTank } + export interface AddGasTankArgs { name: string feeMarkupFactor: number @@ -631,6 +632,7 @@ export interface AddGasTankReturn { status: boolean gasTank: GasTank } + export interface UpdateGasTankArgs { id: number name?: string @@ -642,6 +644,7 @@ export interface UpdateGasTankReturn { status: boolean gasTank: GasTank } + export interface NextGasTankBalanceAdjustmentNonceArgs { id: number } @@ -649,6 +652,7 @@ export interface NextGasTankBalanceAdjustmentNonceArgs { export interface NextGasTankBalanceAdjustmentNonceReturn { nonce: number } + export interface AdjustGasTankBalanceArgs { id: number nonce: number @@ -659,6 +663,7 @@ export interface AdjustGasTankBalanceReturn { status: boolean adjustment: GasTankBalanceAdjustment } + export interface GetGasTankBalanceAdjustmentArgs { id: number nonce: number @@ -667,6 +672,7 @@ export interface GetGasTankBalanceAdjustmentArgs { export interface GetGasTankBalanceAdjustmentReturn { adjustment: GasTankBalanceAdjustment } + export interface ListGasTankBalanceAdjustmentsArgs { id: number page?: Page @@ -676,6 +682,7 @@ export interface ListGasTankBalanceAdjustmentsReturn { page: Page adjustments: Array } + export interface ListGasSponsorsArgs { projectId: number page?: Page @@ -685,6 +692,7 @@ export interface ListGasSponsorsReturn { page: Page gasSponsors: Array } + export interface GetGasSponsorArgs { projectId: number id: number @@ -693,6 +701,7 @@ export interface GetGasSponsorArgs { export interface GetGasSponsorReturn { gasSponsor: GasSponsor } + export interface AddGasSponsorArgs { projectId: number address: string @@ -704,6 +713,7 @@ export interface AddGasSponsorReturn { status: boolean gasSponsor: GasSponsor } + export interface UpdateGasSponsorArgs { projectId: number id: number @@ -715,6 +725,7 @@ export interface UpdateGasSponsorReturn { status: boolean gasSponsor: GasSponsor } + export interface RemoveGasSponsorArgs { projectId: number id: number @@ -723,6 +734,7 @@ export interface RemoveGasSponsorArgs { export interface RemoveGasSponsorReturn { status: boolean } + export interface AddressGasSponsorsArgs { address: string page?: Page @@ -732,6 +744,7 @@ export interface AddressGasSponsorsReturn { page: Page gasSponsors: Array } + export interface GetProjectBalanceArgs { projectId: number } @@ -739,6 +752,7 @@ export interface GetProjectBalanceArgs { export interface GetProjectBalanceReturn { balance: number } + export interface AdjustProjectBalanceArgs { projectId: number amount: number @@ -752,7 +766,8 @@ export interface AdjustProjectBalanceReturn { // // Client // -export class Relayer implements Relayer { + +export class Relayer implements RelayerClient { protected hostname: string protected fetch: Fetch protected path = '/rpc/Relayer/' @@ -766,600 +781,695 @@ export class Relayer implements Relayer { return this.hostname + this.path + name } + queryKey = { + ping: () => ['Relayer', 'ping'] as const, + version: () => ['Relayer', 'version'] as const, + runtimeStatus: () => ['Relayer', 'runtimeStatus'] as const, + getSequenceContext: () => ['Relayer', 'getSequenceContext'] as const, + getChainID: () => ['Relayer', 'getChainID'] as const, + sendMetaTxn: (req: SendMetaTxnArgs) => ['Relayer', 'sendMetaTxn', req] as const, + getMetaTxnNonce: (req: GetMetaTxnNonceArgs) => ['Relayer', 'getMetaTxnNonce', req] as const, + getMetaTxnReceipt: (req: GetMetaTxnReceiptArgs) => ['Relayer', 'getMetaTxnReceipt', req] as const, + simulate: (req: SimulateArgs) => ['Relayer', 'simulate', req] as const, + simulateV3: (req: SimulateV3Args) => ['Relayer', 'simulateV3', req] as const, + updateMetaTxnGasLimits: (req: UpdateMetaTxnGasLimitsArgs) => ['Relayer', 'updateMetaTxnGasLimits', req] as const, + feeTokens: () => ['Relayer', 'feeTokens'] as const, + feeOptions: (req: FeeOptionsArgs) => ['Relayer', 'feeOptions', req] as const, + getMetaTxnNetworkFeeOptions: (req: GetMetaTxnNetworkFeeOptionsArgs) => + ['Relayer', 'getMetaTxnNetworkFeeOptions', req] as const, + getMetaTransactions: (req: GetMetaTransactionsArgs) => ['Relayer', 'getMetaTransactions', req] as const, + getTransactionCost: (req: GetTransactionCostArgs) => ['Relayer', 'getTransactionCost', req] as const, + sentTransactions: (req: SentTransactionsArgs) => ['Relayer', 'sentTransactions', req] as const, + pendingTransactions: (req: PendingTransactionsArgs) => ['Relayer', 'pendingTransactions', req] as const, + getGasTank: (req: GetGasTankArgs) => ['Relayer', 'getGasTank', req] as const, + addGasTank: (req: AddGasTankArgs) => ['Relayer', 'addGasTank', req] as const, + updateGasTank: (req: UpdateGasTankArgs) => ['Relayer', 'updateGasTank', req] as const, + nextGasTankBalanceAdjustmentNonce: (req: NextGasTankBalanceAdjustmentNonceArgs) => + ['Relayer', 'nextGasTankBalanceAdjustmentNonce', req] as const, + adjustGasTankBalance: (req: AdjustGasTankBalanceArgs) => ['Relayer', 'adjustGasTankBalance', req] as const, + getGasTankBalanceAdjustment: (req: GetGasTankBalanceAdjustmentArgs) => + ['Relayer', 'getGasTankBalanceAdjustment', req] as const, + listGasTankBalanceAdjustments: (req: ListGasTankBalanceAdjustmentsArgs) => + ['Relayer', 'listGasTankBalanceAdjustments', req] as const, + listGasSponsors: (req: ListGasSponsorsArgs) => ['Relayer', 'listGasSponsors', req] as const, + getGasSponsor: (req: GetGasSponsorArgs) => ['Relayer', 'getGasSponsor', req] as const, + addGasSponsor: (req: AddGasSponsorArgs) => ['Relayer', 'addGasSponsor', req] as const, + updateGasSponsor: (req: UpdateGasSponsorArgs) => ['Relayer', 'updateGasSponsor', req] as const, + removeGasSponsor: (req: RemoveGasSponsorArgs) => ['Relayer', 'removeGasSponsor', req] as const, + addressGasSponsors: (req: AddressGasSponsorsArgs) => ['Relayer', 'addressGasSponsors', req] as const, + getProjectBalance: (req: GetProjectBalanceArgs) => ['Relayer', 'getProjectBalance', req] as const, + adjustProjectBalance: (req: AdjustProjectBalanceArgs) => ['Relayer', 'adjustProjectBalance', req] as const, + } + ping = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('Ping'), createHTTPRequest({}, headers, signal)).then( + return this.fetch(this.url('Ping'), createHttpRequest('{}', headers, signal)).then( (res) => { return buildResponse(res).then((_data) => { - return { - status: _data.status, - } + return JsonDecode(_data, 'PingReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } version = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('Version'), createHTTPRequest({}, headers, signal)).then( + return this.fetch(this.url('Version'), createHttpRequest('{}', headers, signal)).then( (res) => { return buildResponse(res).then((_data) => { - return { - version: _data.version, - } + return JsonDecode(_data, 'VersionReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } runtimeStatus = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('RuntimeStatus'), createHTTPRequest({}, headers, signal)).then( + return this.fetch(this.url('RuntimeStatus'), createHttpRequest('{}', headers, signal)).then( (res) => { return buildResponse(res).then((_data) => { - return { - status: _data.status, - } + return JsonDecode(_data, 'RuntimeStatusReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } getSequenceContext = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('GetSequenceContext'), createHTTPRequest({}, headers, signal)).then( + return this.fetch(this.url('GetSequenceContext'), createHttpRequest('{}', headers, signal)).then( (res) => { return buildResponse(res).then((_data) => { - return { - data: _data.data, - } + return JsonDecode(_data, 'GetSequenceContextReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } getChainID = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('GetChainID'), createHTTPRequest({}, headers, signal)).then( + return this.fetch(this.url('GetChainID'), createHttpRequest('{}', headers, signal)).then( (res) => { return buildResponse(res).then((_data) => { - return { - chainID: _data.chainID, - } + return JsonDecode(_data, 'GetChainIDReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } - sendMetaTxn = (args: SendMetaTxnArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('SendMetaTxn'), createHTTPRequest(args, headers, signal)).then( + sendMetaTxn = (req: SendMetaTxnArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('SendMetaTxn'), + createHttpRequest(JsonEncode(req, 'SendMetaTxnArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - status: _data.status, - txnHash: _data.txnHash, - } + return JsonDecode(_data, 'SendMetaTxnReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } getMetaTxnNonce = ( - args: GetMetaTxnNonceArgs, + req: GetMetaTxnNonceArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('GetMetaTxnNonce'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('GetMetaTxnNonce'), + createHttpRequest(JsonEncode(req, 'GetMetaTxnNonceArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - nonce: _data.nonce, - } + return JsonDecode(_data, 'GetMetaTxnNonceReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } getMetaTxnReceipt = ( - args: GetMetaTxnReceiptArgs, + req: GetMetaTxnReceiptArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('GetMetaTxnReceipt'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('GetMetaTxnReceipt'), + createHttpRequest(JsonEncode(req, 'GetMetaTxnReceiptArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - receipt: _data.receipt, - } + return JsonDecode(_data, 'GetMetaTxnReceiptReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } - simulate = (args: SimulateArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('Simulate'), createHTTPRequest(args, headers, signal)).then( + simulate = (req: SimulateArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('Simulate'), createHttpRequest(JsonEncode(req, 'SimulateArgs'), headers, signal)).then( (res) => { return buildResponse(res).then((_data) => { - return { - results: >_data.results, - } + return JsonDecode(_data, 'SimulateReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } - simulateV3 = (args: SimulateV3Args, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('SimulateV3'), createHTTPRequest(args, headers, signal)).then( + simulateV3 = (req: SimulateV3Args, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('SimulateV3'), + createHttpRequest(JsonEncode(req, 'SimulateV3Args'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - results: >_data.results, - } + return JsonDecode(_data, 'SimulateV3Return') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } updateMetaTxnGasLimits = ( - args: UpdateMetaTxnGasLimitsArgs, + req: UpdateMetaTxnGasLimitsArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('UpdateMetaTxnGasLimits'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('UpdateMetaTxnGasLimits'), + createHttpRequest(JsonEncode(req, 'UpdateMetaTxnGasLimitsArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - payload: _data.payload, - } + return JsonDecode(_data, 'UpdateMetaTxnGasLimitsReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } feeTokens = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('FeeTokens'), createHTTPRequest({}, headers, signal)).then( + return this.fetch(this.url('FeeTokens'), createHttpRequest('{}', headers, signal)).then( (res) => { return buildResponse(res).then((_data) => { - return { - isFeeRequired: _data.isFeeRequired, - tokens: >_data.tokens, - paymentAddress: _data.paymentAddress, - } + return JsonDecode(_data, 'FeeTokensReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } - feeOptions = (args: FeeOptionsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('FeeOptions'), createHTTPRequest(args, headers, signal)).then( + feeOptions = (req: FeeOptionsArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('FeeOptions'), + createHttpRequest(JsonEncode(req, 'FeeOptionsArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - options: >_data.options, - sponsored: _data.sponsored, - quote: _data.quote, - } + return JsonDecode(_data, 'FeeOptionsReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } getMetaTxnNetworkFeeOptions = ( - args: GetMetaTxnNetworkFeeOptionsArgs, + req: GetMetaTxnNetworkFeeOptionsArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('GetMetaTxnNetworkFeeOptions'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('GetMetaTxnNetworkFeeOptions'), + createHttpRequest(JsonEncode(req, 'GetMetaTxnNetworkFeeOptionsArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - options: >_data.options, - } + return JsonDecode(_data, 'GetMetaTxnNetworkFeeOptionsReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } getMetaTransactions = ( - args: GetMetaTransactionsArgs, + req: GetMetaTransactionsArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('GetMetaTransactions'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('GetMetaTransactions'), + createHttpRequest(JsonEncode(req, 'GetMetaTransactionsArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - page: _data.page, - transactions: >_data.transactions, - } + return JsonDecode(_data, 'GetMetaTransactionsReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } getTransactionCost = ( - args: GetTransactionCostArgs, + req: GetTransactionCostArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('GetTransactionCost'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('GetTransactionCost'), + createHttpRequest(JsonEncode(req, 'GetTransactionCostArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - cost: _data.cost, - } + return JsonDecode(_data, 'GetTransactionCostReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } sentTransactions = ( - args: SentTransactionsArgs, + req: SentTransactionsArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('SentTransactions'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('SentTransactions'), + createHttpRequest(JsonEncode(req, 'SentTransactionsArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - page: _data.page, - transactions: >_data.transactions, - } + return JsonDecode(_data, 'SentTransactionsReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } pendingTransactions = ( - args: PendingTransactionsArgs, + req: PendingTransactionsArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('PendingTransactions'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('PendingTransactions'), + createHttpRequest(JsonEncode(req, 'PendingTransactionsArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - page: _data.page, - transactions: >_data.transactions, - } + return JsonDecode(_data, 'PendingTransactionsReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } - getGasTank = (args: GetGasTankArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('GetGasTank'), createHTTPRequest(args, headers, signal)).then( + getGasTank = (req: GetGasTankArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('GetGasTank'), + createHttpRequest(JsonEncode(req, 'GetGasTankArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - gasTank: _data.gasTank, - } + return JsonDecode(_data, 'GetGasTankReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } - addGasTank = (args: AddGasTankArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('AddGasTank'), createHTTPRequest(args, headers, signal)).then( + addGasTank = (req: AddGasTankArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('AddGasTank'), + createHttpRequest(JsonEncode(req, 'AddGasTankArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - status: _data.status, - gasTank: _data.gasTank, - } + return JsonDecode(_data, 'AddGasTankReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } - updateGasTank = (args: UpdateGasTankArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('UpdateGasTank'), createHTTPRequest(args, headers, signal)).then( + updateGasTank = (req: UpdateGasTankArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('UpdateGasTank'), + createHttpRequest(JsonEncode(req, 'UpdateGasTankArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - status: _data.status, - gasTank: _data.gasTank, - } + return JsonDecode(_data, 'UpdateGasTankReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } nextGasTankBalanceAdjustmentNonce = ( - args: NextGasTankBalanceAdjustmentNonceArgs, + req: NextGasTankBalanceAdjustmentNonceArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('NextGasTankBalanceAdjustmentNonce'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('NextGasTankBalanceAdjustmentNonce'), + createHttpRequest(JsonEncode(req, 'NextGasTankBalanceAdjustmentNonceArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - nonce: _data.nonce, - } + return JsonDecode(_data, 'NextGasTankBalanceAdjustmentNonceReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } adjustGasTankBalance = ( - args: AdjustGasTankBalanceArgs, + req: AdjustGasTankBalanceArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('AdjustGasTankBalance'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('AdjustGasTankBalance'), + createHttpRequest(JsonEncode(req, 'AdjustGasTankBalanceArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - status: _data.status, - adjustment: _data.adjustment, - } + return JsonDecode(_data, 'AdjustGasTankBalanceReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } getGasTankBalanceAdjustment = ( - args: GetGasTankBalanceAdjustmentArgs, + req: GetGasTankBalanceAdjustmentArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('GetGasTankBalanceAdjustment'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('GetGasTankBalanceAdjustment'), + createHttpRequest(JsonEncode(req, 'GetGasTankBalanceAdjustmentArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - adjustment: _data.adjustment, - } + return JsonDecode(_data, 'GetGasTankBalanceAdjustmentReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } listGasTankBalanceAdjustments = ( - args: ListGasTankBalanceAdjustmentsArgs, + req: ListGasTankBalanceAdjustmentsArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('ListGasTankBalanceAdjustments'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('ListGasTankBalanceAdjustments'), + createHttpRequest(JsonEncode(req, 'ListGasTankBalanceAdjustmentsArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - page: _data.page, - adjustments: >_data.adjustments, - } + return JsonDecode(_data, 'ListGasTankBalanceAdjustmentsReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } listGasSponsors = ( - args: ListGasSponsorsArgs, + req: ListGasSponsorsArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('ListGasSponsors'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('ListGasSponsors'), + createHttpRequest(JsonEncode(req, 'ListGasSponsorsArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - page: _data.page, - gasSponsors: >_data.gasSponsors, - } + return JsonDecode(_data, 'ListGasSponsorsReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } - getGasSponsor = (args: GetGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('GetGasSponsor'), createHTTPRequest(args, headers, signal)).then( + getGasSponsor = (req: GetGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('GetGasSponsor'), + createHttpRequest(JsonEncode(req, 'GetGasSponsorArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - gasSponsor: _data.gasSponsor, - } + return JsonDecode(_data, 'GetGasSponsorReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } - addGasSponsor = (args: AddGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('AddGasSponsor'), createHTTPRequest(args, headers, signal)).then( + addGasSponsor = (req: AddGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('AddGasSponsor'), + createHttpRequest(JsonEncode(req, 'AddGasSponsorArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - status: _data.status, - gasSponsor: _data.gasSponsor, - } + return JsonDecode(_data, 'AddGasSponsorReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } updateGasSponsor = ( - args: UpdateGasSponsorArgs, + req: UpdateGasSponsorArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('UpdateGasSponsor'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('UpdateGasSponsor'), + createHttpRequest(JsonEncode(req, 'UpdateGasSponsorArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - status: _data.status, - gasSponsor: _data.gasSponsor, - } + return JsonDecode(_data, 'UpdateGasSponsorReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } removeGasSponsor = ( - args: RemoveGasSponsorArgs, + req: RemoveGasSponsorArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('RemoveGasSponsor'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('RemoveGasSponsor'), + createHttpRequest(JsonEncode(req, 'RemoveGasSponsorArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - status: _data.status, - } + return JsonDecode(_data, 'RemoveGasSponsorReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } addressGasSponsors = ( - args: AddressGasSponsorsArgs, + req: AddressGasSponsorsArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('AddressGasSponsors'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('AddressGasSponsors'), + createHttpRequest(JsonEncode(req, 'AddressGasSponsorsArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - page: _data.page, - gasSponsors: >_data.gasSponsors, - } + return JsonDecode(_data, 'AddressGasSponsorsReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } getProjectBalance = ( - args: GetProjectBalanceArgs, + req: GetProjectBalanceArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('GetProjectBalance'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('GetProjectBalance'), + createHttpRequest(JsonEncode(req, 'GetProjectBalanceArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - balance: _data.balance, - } + return JsonDecode(_data, 'GetProjectBalanceReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } adjustProjectBalance = ( - args: AdjustProjectBalanceArgs, + req: AdjustProjectBalanceArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('AdjustProjectBalance'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('AdjustProjectBalance'), + createHttpRequest(JsonEncode(req, 'AdjustProjectBalanceArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - balance: _data.balance, - } + return JsonDecode(_data, 'AdjustProjectBalanceReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } } -const createHTTPRequest = (body: object = {}, headers: object = {}, signal: AbortSignal | null = null): object => { +const createHttpRequest = (body: string = '{}', headers: object = {}, signal: AbortSignal | null = null): object => { const reqHeaders: { [key: string]: string } = { ...headers, 'Content-Type': 'application/json' } - reqHeaders[WebrpcHeader] = WebrpcHeaderValue - - return { - method: 'POST', - headers: reqHeaders, - body: JSON.stringify(body || {}), - signal, - } + return { method: 'POST', headers: reqHeaders, body, signal } } const buildResponse = (res: Response): Promise => { @@ -1368,13 +1478,9 @@ const buildResponse = (res: Response): Promise => { try { data = JSON.parse(text) } catch (error) { - let message = '' - if (error instanceof Error) { - message = error.message - } throw WebrpcBadResponseError.new({ status: res.status, - cause: `JSON.parse(): ${message}: response text: ${text}`, + cause: `JSON.parse(): ${error instanceof Error ? error.message : String(error)}: response text: ${text}`, }) } if (!res.ok) { @@ -1385,530 +1491,599 @@ const buildResponse = (res: Response): Promise => { }) } +export type Fetch = (input: RequestInfo, init?: RequestInit) => Promise + +// +// BigInt helpers +// + +const BIG_INT_FIELDS: { [typ: string]: (string | [string, string])[] } = { + SendMetaTxnArgs: [['preconditions', 'TransactionPrecondition[]']], + TransactionPrecondition: ['minAmount'], + Transactions: [['preconditions', 'TransactionPrecondition[]']], +} + +// Encode in-place: mutate provided object graph to serialize bigints to strings. +function encodeType(typ: string, obj: any): any { + if (obj == null || typeof obj !== 'object') return obj + const descs = BIG_INT_FIELDS[typ] || [] + if (!descs.length) return obj + for (const d of descs) { + if (Array.isArray(d)) { + const [fieldName, nestedType] = d + if (fieldName.endsWith('[]')) { + const base = fieldName.slice(0, -2) + const arr = obj[base] + if (Array.isArray(arr)) { + for (let i = 0; i < arr.length; i++) arr[i] = encodeType(nestedType, arr[i]) + } + } else if (obj[fieldName]) { + obj[fieldName] = encodeType(nestedType, obj[fieldName]) + } + continue + } + if (d.endsWith('[]')) { + const base = d.slice(0, -2) + const arr = obj[base] + if (Array.isArray(arr)) { + for (let i = 0; i < arr.length; i++) { + if (typeof arr[i] === 'bigint') arr[i] = arr[i].toString() + } + } + continue + } + if (typeof obj[d] === 'bigint') obj[d] = obj[d].toString() + } + return obj +} + +// Decode in-place: mutate object graph; throw if expected numeric string is invalid. +function decodeType(typ: string, obj: any): any { + if (obj == null || typeof obj !== 'object') return obj + const descs = BIG_INT_FIELDS[typ] || [] + if (!descs.length) return obj + for (const d of descs) { + if (Array.isArray(d)) { + const [fieldName, nestedType] = d + if (fieldName.endsWith('[]')) { + const base = fieldName.slice(0, -2) + const arr = obj[base] + if (Array.isArray(arr)) { + for (let i = 0; i < arr.length; i++) arr[i] = decodeType(nestedType, arr[i]) + } + } else if (obj[fieldName]) { + obj[fieldName] = decodeType(nestedType, obj[fieldName]) + } + continue + } + if (d.endsWith('[]')) { + const base = d.slice(0, -2) + const arr = obj[base] + if (Array.isArray(arr)) { + for (let i = 0; i < arr.length; i++) { + const v = arr[i] + if (typeof v === 'string') { + try { + arr[i] = BigInt(v) + } catch (e) { + throw WebrpcBadResponseError.new({ cause: `Invalid bigint value for ${base}[${i}]: ${v}` }) + } + } + } + } + continue + } + const v = obj[d] + if (typeof v === 'string') { + try { + obj[d] = BigInt(v) + } catch (e) { + throw WebrpcBadResponseError.new({ cause: `Invalid bigint value for ${d}: ${v}` }) + } + } + } + return obj +} + +// Encode object of given root type to JSON with BigInts converted to decimal strings. +export const JsonEncode = (obj: T, typ: string = ''): string => { + return JSON.stringify(encodeType(typ, obj)) +} + +// Decode data (JSON string or already-parsed object) and convert declared BigInt string fields back to BigInt. +export const JsonDecode = (data: string | any, typ: string = ''): T => { + let parsed: any = data + if (typeof data === 'string') { + try { + parsed = JSON.parse(data) + } catch (err) { + throw WebrpcBadResponseError.new({ cause: `JsonDecode: JSON.parse failed: ${(err as Error).message}` }) + } + } + return decodeType(typ, parsed) as T +} + // // Errors // +type WebrpcErrorParams = { name?: string; code?: number; message?: string; status?: number; cause?: string } + export class WebrpcError extends Error { - name: string code: number - message: string status: number - cause?: string - - /** @deprecated Use message instead of msg. Deprecated in webrpc v0.11.0. */ - msg: string - - constructor(name: string, code: number, message: string, status: number, cause?: string) { - super(message) - this.name = name || 'WebrpcError' - this.code = typeof code === 'number' ? code : 0 - this.message = message || `endpoint error ${this.code}` - this.msg = this.message - this.status = typeof status === 'number' ? status : 0 - this.cause = cause + + constructor(error: WebrpcErrorParams = {}) { + super(error.message) + this.name = error.name || 'WebrpcEndpointError' + this.code = typeof error.code === 'number' ? error.code : 0 + this.message = error.message || `endpoint error` + this.status = typeof error.status === 'number' ? error.status : 400 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, WebrpcError.prototype) } static new(payload: any): WebrpcError { - return new this(payload.error, payload.code, payload.message || payload.msg, payload.status, payload.cause) + return new this({ message: payload.message, code: payload.code, status: payload.status, cause: payload.cause }) } } -// Webrpc errors - export class WebrpcEndpointError extends WebrpcError { - constructor( - name: string = 'WebrpcEndpoint', - code: number = 0, - message: string = `endpoint error`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'WebrpcEndpoint' + this.code = typeof error.code === 'number' ? error.code : 0 + this.message = error.message || `endpoint error` + this.status = typeof error.status === 'number' ? error.status : 400 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, WebrpcEndpointError.prototype) } } export class WebrpcRequestFailedError extends WebrpcError { - constructor( - name: string = 'WebrpcRequestFailed', - code: number = -1, - message: string = `request failed`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'WebrpcRequestFailed' + this.code = typeof error.code === 'number' ? error.code : -1 + this.message = error.message || `request failed` + this.status = typeof error.status === 'number' ? error.status : 400 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, WebrpcRequestFailedError.prototype) } } export class WebrpcBadRouteError extends WebrpcError { - constructor( - name: string = 'WebrpcBadRoute', - code: number = -2, - message: string = `bad route`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'WebrpcBadRoute' + this.code = typeof error.code === 'number' ? error.code : -2 + this.message = error.message || `bad route` + this.status = typeof error.status === 'number' ? error.status : 404 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, WebrpcBadRouteError.prototype) } } export class WebrpcBadMethodError extends WebrpcError { - constructor( - name: string = 'WebrpcBadMethod', - code: number = -3, - message: string = `bad method`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'WebrpcBadMethod' + this.code = typeof error.code === 'number' ? error.code : -3 + this.message = error.message || `bad method` + this.status = typeof error.status === 'number' ? error.status : 405 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, WebrpcBadMethodError.prototype) } } export class WebrpcBadRequestError extends WebrpcError { - constructor( - name: string = 'WebrpcBadRequest', - code: number = -4, - message: string = `bad request`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'WebrpcBadRequest' + this.code = typeof error.code === 'number' ? error.code : -4 + this.message = error.message || `bad request` + this.status = typeof error.status === 'number' ? error.status : 400 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, WebrpcBadRequestError.prototype) } } export class WebrpcBadResponseError extends WebrpcError { - constructor( - name: string = 'WebrpcBadResponse', - code: number = -5, - message: string = `bad response`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'WebrpcBadResponse' + this.code = typeof error.code === 'number' ? error.code : -5 + this.message = error.message || `bad response` + this.status = typeof error.status === 'number' ? error.status : 500 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, WebrpcBadResponseError.prototype) } } export class WebrpcServerPanicError extends WebrpcError { - constructor( - name: string = 'WebrpcServerPanic', - code: number = -6, - message: string = `server panic`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'WebrpcServerPanic' + this.code = typeof error.code === 'number' ? error.code : -6 + this.message = error.message || `server panic` + this.status = typeof error.status === 'number' ? error.status : 500 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, WebrpcServerPanicError.prototype) } } export class WebrpcInternalErrorError extends WebrpcError { - constructor( - name: string = 'WebrpcInternalError', - code: number = -7, - message: string = `internal error`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'WebrpcInternalError' + this.code = typeof error.code === 'number' ? error.code : -7 + this.message = error.message || `internal error` + this.status = typeof error.status === 'number' ? error.status : 500 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, WebrpcInternalErrorError.prototype) } } -export class WebrpcClientDisconnectedError extends WebrpcError { - constructor( - name: string = 'WebrpcClientDisconnected', - code: number = -8, - message: string = `client disconnected`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) - Object.setPrototypeOf(this, WebrpcClientDisconnectedError.prototype) +export class WebrpcClientAbortedError extends WebrpcError { + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'WebrpcClientAborted' + this.code = typeof error.code === 'number' ? error.code : -8 + this.message = error.message || `request aborted by client` + this.status = typeof error.status === 'number' ? error.status : 400 + if (error.cause !== undefined) this.cause = error.cause + Object.setPrototypeOf(this, WebrpcClientAbortedError.prototype) } } export class WebrpcStreamLostError extends WebrpcError { - constructor( - name: string = 'WebrpcStreamLost', - code: number = -9, - message: string = `stream lost`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'WebrpcStreamLost' + this.code = typeof error.code === 'number' ? error.code : -9 + this.message = error.message || `stream lost` + this.status = typeof error.status === 'number' ? error.status : 400 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, WebrpcStreamLostError.prototype) } } export class WebrpcStreamFinishedError extends WebrpcError { - constructor( - name: string = 'WebrpcStreamFinished', - code: number = -10, - message: string = `stream finished`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'WebrpcStreamFinished' + this.code = typeof error.code === 'number' ? error.code : -10 + this.message = error.message || `stream finished` + this.status = typeof error.status === 'number' ? error.status : 200 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, WebrpcStreamFinishedError.prototype) } } +// // Schema errors +// export class UnauthorizedError extends WebrpcError { - constructor( - name: string = 'Unauthorized', - code: number = 1000, - message: string = `Unauthorized access`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'Unauthorized' + this.code = typeof error.code === 'number' ? error.code : 1000 + this.message = error.message || `Unauthorized access` + this.status = typeof error.status === 'number' ? error.status : 401 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, UnauthorizedError.prototype) } } export class PermissionDeniedError extends WebrpcError { - constructor( - name: string = 'PermissionDenied', - code: number = 1001, - message: string = `Permission denied`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'PermissionDenied' + this.code = typeof error.code === 'number' ? error.code : 1001 + this.message = error.message || `Permission denied` + this.status = typeof error.status === 'number' ? error.status : 403 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, PermissionDeniedError.prototype) } } export class SessionExpiredError extends WebrpcError { - constructor( - name: string = 'SessionExpired', - code: number = 1002, - message: string = `Session expired`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'SessionExpired' + this.code = typeof error.code === 'number' ? error.code : 1002 + this.message = error.message || `Session expired` + this.status = typeof error.status === 'number' ? error.status : 403 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, SessionExpiredError.prototype) } } export class MethodNotFoundError extends WebrpcError { - constructor( - name: string = 'MethodNotFound', - code: number = 1003, - message: string = `Method not found`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'MethodNotFound' + this.code = typeof error.code === 'number' ? error.code : 1003 + this.message = error.message || `Method not found` + this.status = typeof error.status === 'number' ? error.status : 404 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, MethodNotFoundError.prototype) } } export class RequestConflictError extends WebrpcError { - constructor( - name: string = 'RequestConflict', - code: number = 1004, - message: string = `Conflict with target resource`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'RequestConflict' + this.code = typeof error.code === 'number' ? error.code : 1004 + this.message = error.message || `Conflict with target resource` + this.status = typeof error.status === 'number' ? error.status : 409 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, RequestConflictError.prototype) } } export class AbortedError extends WebrpcError { - constructor( - name: string = 'Aborted', - code: number = 1005, - message: string = `Request aborted`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'Aborted' + this.code = typeof error.code === 'number' ? error.code : 1005 + this.message = error.message || `Request aborted` + this.status = typeof error.status === 'number' ? error.status : 400 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, AbortedError.prototype) } } export class GeoblockedError extends WebrpcError { - constructor( - name: string = 'Geoblocked', - code: number = 1006, - message: string = `Geoblocked region`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'Geoblocked' + this.code = typeof error.code === 'number' ? error.code : 1006 + this.message = error.message || `Geoblocked region` + this.status = typeof error.status === 'number' ? error.status : 451 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, GeoblockedError.prototype) } } export class RateLimitedError extends WebrpcError { - constructor( - name: string = 'RateLimited', - code: number = 1007, - message: string = `Rate-limited. Please slow down.`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'RateLimited' + this.code = typeof error.code === 'number' ? error.code : 1007 + this.message = error.message || `Rate-limited. Please slow down.` + this.status = typeof error.status === 'number' ? error.status : 429 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, RateLimitedError.prototype) } } export class ProjectNotFoundError extends WebrpcError { - constructor( - name: string = 'ProjectNotFound', - code: number = 1008, - message: string = `Project not found`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'ProjectNotFound' + this.code = typeof error.code === 'number' ? error.code : 1008 + this.message = error.message || `Project not found` + this.status = typeof error.status === 'number' ? error.status : 401 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, ProjectNotFoundError.prototype) } } export class AccessKeyNotFoundError extends WebrpcError { - constructor( - name: string = 'AccessKeyNotFound', - code: number = 1101, - message: string = `Access key not found`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'AccessKeyNotFound' + this.code = typeof error.code === 'number' ? error.code : 1101 + this.message = error.message || `Access key not found` + this.status = typeof error.status === 'number' ? error.status : 401 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, AccessKeyNotFoundError.prototype) } } export class AccessKeyMismatchError extends WebrpcError { - constructor( - name: string = 'AccessKeyMismatch', - code: number = 1102, - message: string = `Access key mismatch`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'AccessKeyMismatch' + this.code = typeof error.code === 'number' ? error.code : 1102 + this.message = error.message || `Access key mismatch` + this.status = typeof error.status === 'number' ? error.status : 409 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, AccessKeyMismatchError.prototype) } } export class InvalidOriginError extends WebrpcError { - constructor( - name: string = 'InvalidOrigin', - code: number = 1103, - message: string = `Invalid origin for Access Key`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'InvalidOrigin' + this.code = typeof error.code === 'number' ? error.code : 1103 + this.message = error.message || `Invalid origin for Access Key` + this.status = typeof error.status === 'number' ? error.status : 403 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, InvalidOriginError.prototype) } } export class InvalidServiceError extends WebrpcError { - constructor( - name: string = 'InvalidService', - code: number = 1104, - message: string = `Service not enabled for Access key`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'InvalidService' + this.code = typeof error.code === 'number' ? error.code : 1104 + this.message = error.message || `Service not enabled for Access key` + this.status = typeof error.status === 'number' ? error.status : 403 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, InvalidServiceError.prototype) } } export class UnauthorizedUserError extends WebrpcError { - constructor( - name: string = 'UnauthorizedUser', - code: number = 1105, - message: string = `Unauthorized user`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'UnauthorizedUser' + this.code = typeof error.code === 'number' ? error.code : 1105 + this.message = error.message || `Unauthorized user` + this.status = typeof error.status === 'number' ? error.status : 403 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, UnauthorizedUserError.prototype) } } export class QuotaExceededError extends WebrpcError { - constructor( - name: string = 'QuotaExceeded', - code: number = 1200, - message: string = `Quota request exceeded`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'QuotaExceeded' + this.code = typeof error.code === 'number' ? error.code : 1200 + this.message = error.message || `Quota request exceeded` + this.status = typeof error.status === 'number' ? error.status : 429 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, QuotaExceededError.prototype) } } export class QuotaRateLimitError extends WebrpcError { - constructor( - name: string = 'QuotaRateLimit', - code: number = 1201, - message: string = `Quota rate limit exceeded`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'QuotaRateLimit' + this.code = typeof error.code === 'number' ? error.code : 1201 + this.message = error.message || `Quota rate limit exceeded` + this.status = typeof error.status === 'number' ? error.status : 429 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, QuotaRateLimitError.prototype) } } export class NoDefaultKeyError extends WebrpcError { - constructor( - name: string = 'NoDefaultKey', - code: number = 1300, - message: string = `No default access key found`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'NoDefaultKey' + this.code = typeof error.code === 'number' ? error.code : 1300 + this.message = error.message || `No default access key found` + this.status = typeof error.status === 'number' ? error.status : 403 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, NoDefaultKeyError.prototype) } } export class MaxAccessKeysError extends WebrpcError { - constructor( - name: string = 'MaxAccessKeys', - code: number = 1301, - message: string = `Access keys limit reached`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'MaxAccessKeys' + this.code = typeof error.code === 'number' ? error.code : 1301 + this.message = error.message || `Access keys limit reached` + this.status = typeof error.status === 'number' ? error.status : 403 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, MaxAccessKeysError.prototype) } } export class AtLeastOneKeyError extends WebrpcError { - constructor( - name: string = 'AtLeastOneKey', - code: number = 1302, - message: string = `You need at least one Access Key`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'AtLeastOneKey' + this.code = typeof error.code === 'number' ? error.code : 1302 + this.message = error.message || `You need at least one Access Key` + this.status = typeof error.status === 'number' ? error.status : 403 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, AtLeastOneKeyError.prototype) } } export class TimeoutError extends WebrpcError { - constructor( - name: string = 'Timeout', - code: number = 1900, - message: string = `Request timed out`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'Timeout' + this.code = typeof error.code === 'number' ? error.code : 1900 + this.message = error.message || `Request timed out` + this.status = typeof error.status === 'number' ? error.status : 408 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, TimeoutError.prototype) } } export class InvalidArgumentError extends WebrpcError { - constructor( - name: string = 'InvalidArgument', - code: number = 2001, - message: string = `Invalid argument`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'InvalidArgument' + this.code = typeof error.code === 'number' ? error.code : 2001 + this.message = error.message || `Invalid argument` + this.status = typeof error.status === 'number' ? error.status : 400 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, InvalidArgumentError.prototype) } } export class UnavailableError extends WebrpcError { - constructor( - name: string = 'Unavailable', - code: number = 2002, - message: string = `Unavailable resource`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'Unavailable' + this.code = typeof error.code === 'number' ? error.code : 2002 + this.message = error.message || `Unavailable resource` + this.status = typeof error.status === 'number' ? error.status : 400 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, UnavailableError.prototype) } } export class QueryFailedError extends WebrpcError { - constructor( - name: string = 'QueryFailed', - code: number = 2003, - message: string = `Query failed`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'QueryFailed' + this.code = typeof error.code === 'number' ? error.code : 2003 + this.message = error.message || `Query failed` + this.status = typeof error.status === 'number' ? error.status : 400 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, QueryFailedError.prototype) } } export class NotFoundError extends WebrpcError { - constructor( - name: string = 'NotFound', - code: number = 3000, - message: string = `Resource not found`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'NotFound' + this.code = typeof error.code === 'number' ? error.code : 3000 + this.message = error.message || `Resource not found` + this.status = typeof error.status === 'number' ? error.status : 400 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, NotFoundError.prototype) } } export class InsufficientFeeError extends WebrpcError { - constructor( - name: string = 'InsufficientFee', - code: number = 3004, - message: string = `Insufficient fee`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'InsufficientFee' + this.code = typeof error.code === 'number' ? error.code : 3004 + this.message = error.message || `Insufficient fee` + this.status = typeof error.status === 'number' ? error.status : 402 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, InsufficientFeeError.prototype) } } export class NotEnoughBalanceError extends WebrpcError { - constructor( - name: string = 'NotEnoughBalance', - code: number = 3005, - message: string = `Not enough balance`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'NotEnoughBalance' + this.code = typeof error.code === 'number' ? error.code : 3005 + this.message = error.message || `Not enough balance` + this.status = typeof error.status === 'number' ? error.status : 402 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, NotEnoughBalanceError.prototype) } } export class SimulationFailedError extends WebrpcError { - constructor( - name: string = 'SimulationFailed', - code: number = 3006, - message: string = `Simulation failed`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'SimulationFailed' + this.code = typeof error.code === 'number' ? error.code : 3006 + this.message = error.message || `Simulation failed` + this.status = typeof error.status === 'number' ? error.status : 400 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, SimulationFailedError.prototype) } } @@ -1922,7 +2097,7 @@ export enum errors { WebrpcBadResponse = 'WebrpcBadResponse', WebrpcServerPanic = 'WebrpcServerPanic', WebrpcInternalError = 'WebrpcInternalError', - WebrpcClientDisconnected = 'WebrpcClientDisconnected', + WebrpcClientAborted = 'WebrpcClientAborted', WebrpcStreamLost = 'WebrpcStreamLost', WebrpcStreamFinished = 'WebrpcStreamFinished', Unauthorized = 'Unauthorized', @@ -1963,7 +2138,7 @@ export enum WebrpcErrorCodes { WebrpcBadResponse = -5, WebrpcServerPanic = -6, WebrpcInternalError = -7, - WebrpcClientDisconnected = -8, + WebrpcClientAborted = -8, WebrpcStreamLost = -9, WebrpcStreamFinished = -10, Unauthorized = 1000, @@ -2004,7 +2179,7 @@ export const webrpcErrorByCode: { [code: number]: any } = { [-5]: WebrpcBadResponseError, [-6]: WebrpcServerPanicError, [-7]: WebrpcInternalErrorError, - [-8]: WebrpcClientDisconnectedError, + [-8]: WebrpcClientAbortedError, [-9]: WebrpcStreamLostError, [-10]: WebrpcStreamFinishedError, [1000]: UnauthorizedError, @@ -2036,4 +2211,58 @@ export const webrpcErrorByCode: { [code: number]: any } = { [3006]: SimulationFailedError, } -export type Fetch = (input: RequestInfo, init?: RequestInit) => Promise +// +// Webrpc +// + +export const WebrpcHeader = 'Webrpc' + +export const WebrpcHeaderValue = 'webrpc@v0.30.2;gen-typescript@v0.22.2;sequence-relayer@v0.4.1' + +type WebrpcGenVersions = { + WebrpcGenVersion: string + codeGenName: string + codeGenVersion: string + schemaName: string + schemaVersion: string +} + +export function VersionFromHeader(headers: Headers): WebrpcGenVersions { + const headerValue = headers.get(WebrpcHeader) + if (!headerValue) { + return { + WebrpcGenVersion: '', + codeGenName: '', + codeGenVersion: '', + schemaName: '', + schemaVersion: '', + } + } + + return parseWebrpcGenVersions(headerValue) +} + +function parseWebrpcGenVersions(header: string): WebrpcGenVersions { + const versions = header.split(';') + if (versions.length < 3) { + return { + WebrpcGenVersion: '', + codeGenName: '', + codeGenVersion: '', + schemaName: '', + schemaVersion: '', + } + } + + const [_, WebrpcGenVersion] = versions[0]!.split('@') + const [codeGenName, codeGenVersion] = versions[1]!.split('@') + const [schemaName, schemaVersion] = versions[2]!.split('@') + + return { + WebrpcGenVersion: WebrpcGenVersion ?? '', + codeGenName: codeGenName ?? '', + codeGenVersion: codeGenVersion ?? '', + schemaName: schemaName ?? '', + schemaVersion: schemaVersion ?? '', + } +} diff --git a/packages/services/relayer/src/relayer/standard/eip6963.ts b/packages/services/relayer/src/relayer/standard/eip6963.ts index 996c1baeee..9d48613633 100644 --- a/packages/services/relayer/src/relayer/standard/eip6963.ts +++ b/packages/services/relayer/src/relayer/standard/eip6963.ts @@ -3,7 +3,7 @@ import { EIP1193ProviderAdapter, LocalRelayer } from './local.js' import { FeeOption, FeeQuote, OperationStatus, Relayer } from '../index.js' import { Address, Hex } from 'ox' import { Payload } from '@0xsequence/wallet-primitives' -import { FeeToken, IntentPrecondition } from '../rpc-relayer/relayer.gen.js' +import { FeeToken, TransactionPrecondition } from '../rpc-relayer/relayer.gen.js' export class EIP6963Relayer implements Relayer { public readonly kind: 'relayer' = 'relayer' @@ -43,7 +43,7 @@ export class EIP6963Relayer implements Relayer { return this.relayer.status(opHash, chainId) } - async checkPrecondition(precondition: IntentPrecondition): Promise { + async checkPrecondition(precondition: TransactionPrecondition): Promise { return this.relayer.checkPrecondition(precondition) } } diff --git a/packages/services/relayer/src/relayer/standard/local.ts b/packages/services/relayer/src/relayer/standard/local.ts index 01c9289066..14d697aa23 100644 --- a/packages/services/relayer/src/relayer/standard/local.ts +++ b/packages/services/relayer/src/relayer/standard/local.ts @@ -2,7 +2,7 @@ import { Constants, Payload } from '@0xsequence/wallet-primitives' import { EIP1193Provider } from 'mipd' import { AbiFunction, Address, Bytes, Hex, TransactionReceipt } from 'ox' import { FeeOption, FeeQuote, OperationStatus, Relayer } from '../index.js' -import { FeeToken, IntentPrecondition } from '../rpc-relayer/relayer.gen.js' +import { FeeToken, TransactionPrecondition } from '../rpc-relayer/relayer.gen.js' import { decodePrecondition } from '../../preconditions/index.js' import { erc20BalanceOf, @@ -80,7 +80,7 @@ export class LocalRelayer implements Relayer { data: Hex.Hex, chainId: number, quote?: FeeQuote, - preconditions?: IntentPrecondition[], + preconditions?: TransactionPrecondition[], checkInterval: number = 5000, ): Promise<{ opHash: Hex.Hex }> { // Helper function to check all preconditions @@ -168,7 +168,7 @@ export class LocalRelayer implements Relayer { : { status: 'failed', reason: 'failed' } } - async checkPrecondition(precondition: IntentPrecondition): Promise { + async checkPrecondition(precondition: TransactionPrecondition): Promise { const decoded = decodePrecondition(precondition) if (!decoded) { diff --git a/packages/services/relayer/src/relayer/standard/sequence.ts b/packages/services/relayer/src/relayer/standard/sequence.ts index b41e97806d..5c0bd16632 100644 --- a/packages/services/relayer/src/relayer/standard/sequence.ts +++ b/packages/services/relayer/src/relayer/standard/sequence.ts @@ -1,4 +1,4 @@ -import { ETHTxnStatus, IntentPrecondition, Relayer as Service, FeeToken } from '../rpc-relayer/relayer.gen.js' +import { ETHTxnStatus, TransactionPrecondition, Relayer as Service, FeeToken } from '../rpc-relayer/relayer.gen.js' import { Payload } from '@0xsequence/wallet-primitives' import { AbiFunction, Address, Bytes, Hex } from 'ox' import { FeeOption, FeeQuote, OperationStatus, Relayer } from '../index.js' @@ -52,7 +52,7 @@ export class SequenceRelayer implements Relayer { } } - async checkPrecondition(precondition: IntentPrecondition): Promise { + async checkPrecondition(precondition: TransactionPrecondition): Promise { // TODO: implement return false } diff --git a/packages/services/relayer/test/preconditions/codec.test.ts b/packages/services/relayer/test/preconditions/codec.test.ts index f67a016fa9..88d442510a 100644 --- a/packages/services/relayer/test/preconditions/codec.test.ts +++ b/packages/services/relayer/test/preconditions/codec.test.ts @@ -5,7 +5,7 @@ import { decodePrecondition, decodePreconditions, encodePrecondition, - IntentPrecondition, + TransactionPrecondition, } from '../../src/preconditions/codec.js' import { NativeBalancePrecondition, @@ -21,6 +21,8 @@ import { const TEST_ADDRESS = Address.from('0x1234567890123456789012345678901234567890') const TOKEN_ADDRESS = Address.from('0xabcdefabcdefabcdefabcdefabcdefabcdefabcd') const OPERATOR_ADDRESS = Address.from('0x9876543210987654321098765432109876543210') +const ARBITRUM_CHAIN_ID = 42161 +const NATIVE_TOKEN_ADDRESS = Address.from('0x0000000000000000000000000000000000000000') describe('Preconditions Codec', () => { // Mock console.warn to test error logging @@ -38,33 +40,13 @@ describe('Preconditions Codec', () => { expect(decodePrecondition(undefined as any)).toBeUndefined() }) - it('should decode native balance precondition with min and max', () => { - const intent: IntentPrecondition = { - type: 'native-balance', - data: JSON.stringify({ - address: TEST_ADDRESS, - min: '1000000000000000000', - max: '2000000000000000000', - }), - } - - const result = decodePrecondition(intent) - expect(result).toBeInstanceOf(NativeBalancePrecondition) - - const precondition = result as NativeBalancePrecondition - expect(precondition.address).toBe(TEST_ADDRESS) - expect(precondition.min).toBe(1000000000000000000n) - expect(precondition.max).toBe(2000000000000000000n) - expect(precondition.type()).toBe('native-balance') - }) - it('should decode native balance precondition with only min', () => { - const intent: IntentPrecondition = { + const intent: TransactionPrecondition = { type: 'native-balance', - data: JSON.stringify({ - address: TEST_ADDRESS, - min: '1000000000000000000', - }), + ownerAddress: TEST_ADDRESS, + tokenAddress: NATIVE_TOKEN_ADDRESS, + chainId: ARBITRUM_CHAIN_ID, + minAmount: BigInt('1000000000000000000'), } const result = decodePrecondition(intent) @@ -75,32 +57,13 @@ describe('Preconditions Codec', () => { expect(precondition.max).toBeUndefined() }) - it('should decode native balance precondition with only max', () => { - const intent: IntentPrecondition = { - type: 'native-balance', - data: JSON.stringify({ - address: TEST_ADDRESS, - max: '2000000000000000000', - }), - } - - const result = decodePrecondition(intent) - expect(result).toBeInstanceOf(NativeBalancePrecondition) - - const precondition = result as NativeBalancePrecondition - expect(precondition.min).toBeUndefined() - expect(precondition.max).toBe(2000000000000000000n) - }) - it('should decode ERC20 balance precondition', () => { - const intent: IntentPrecondition = { + const intent: TransactionPrecondition = { type: 'erc20-balance', - data: JSON.stringify({ - address: TEST_ADDRESS, - token: TOKEN_ADDRESS, - min: '1000000', - max: '2000000', - }), + ownerAddress: TEST_ADDRESS, + tokenAddress: TOKEN_ADDRESS, + chainId: ARBITRUM_CHAIN_ID, + minAmount: BigInt('1000000'), } const result = decodePrecondition(intent) @@ -110,18 +73,16 @@ describe('Preconditions Codec', () => { expect(precondition.address).toBe(TEST_ADDRESS) expect(precondition.token).toBe(TOKEN_ADDRESS) expect(precondition.min).toBe(1000000n) - expect(precondition.max).toBe(2000000n) + expect(precondition.max).toBeUndefined() }) it('should decode ERC20 approval precondition', () => { - const intent: IntentPrecondition = { + const intent: TransactionPrecondition = { type: 'erc20-approval', - data: JSON.stringify({ - address: TEST_ADDRESS, - token: TOKEN_ADDRESS, - operator: OPERATOR_ADDRESS, - min: '1000000', - }), + ownerAddress: TEST_ADDRESS, + tokenAddress: TOKEN_ADDRESS, + chainId: ARBITRUM_CHAIN_ID, + minAmount: BigInt('1000000'), } const result = decodePrecondition(intent) @@ -130,19 +91,17 @@ describe('Preconditions Codec', () => { const precondition = result as Erc20ApprovalPrecondition expect(precondition.address).toBe(TEST_ADDRESS) expect(precondition.token).toBe(TOKEN_ADDRESS) - expect(precondition.operator).toBe(OPERATOR_ADDRESS) + expect(precondition.operator).toBe(TEST_ADDRESS) expect(precondition.min).toBe(1000000n) }) it('should decode ERC721 ownership precondition', () => { - const intent: IntentPrecondition = { + const intent: TransactionPrecondition = { type: 'erc721-ownership', - data: JSON.stringify({ - address: TEST_ADDRESS, - token: TOKEN_ADDRESS, - tokenId: '123', - owned: true, - }), + ownerAddress: TEST_ADDRESS, + tokenAddress: TOKEN_ADDRESS, + chainId: ARBITRUM_CHAIN_ID, + minAmount: BigInt('0'), } const result = decodePrecondition(intent) @@ -151,36 +110,33 @@ describe('Preconditions Codec', () => { const precondition = result as Erc721OwnershipPrecondition expect(precondition.address).toBe(TEST_ADDRESS) expect(precondition.token).toBe(TOKEN_ADDRESS) - expect(precondition.tokenId).toBe(123n) + expect(precondition.tokenId).toBe(0n) expect(precondition.owned).toBe(true) }) it('should decode ERC721 ownership precondition without owned flag', () => { - const intent: IntentPrecondition = { + const intent: TransactionPrecondition = { type: 'erc721-ownership', - data: JSON.stringify({ - address: TEST_ADDRESS, - token: TOKEN_ADDRESS, - tokenId: '123', - }), + ownerAddress: TEST_ADDRESS, + tokenAddress: TOKEN_ADDRESS, + chainId: ARBITRUM_CHAIN_ID, + minAmount: BigInt('0'), } const result = decodePrecondition(intent) expect(result).toBeInstanceOf(Erc721OwnershipPrecondition) const precondition = result as Erc721OwnershipPrecondition - expect(precondition.owned).toBeUndefined() + expect(precondition.owned).toBe(true) }) it('should decode ERC721 approval precondition', () => { - const intent: IntentPrecondition = { + const intent: TransactionPrecondition = { type: 'erc721-approval', - data: JSON.stringify({ - address: TEST_ADDRESS, - token: TOKEN_ADDRESS, - tokenId: '123', - operator: OPERATOR_ADDRESS, - }), + ownerAddress: TEST_ADDRESS, + tokenAddress: TOKEN_ADDRESS, + chainId: ARBITRUM_CHAIN_ID, + minAmount: BigInt('0'), } const result = decodePrecondition(intent) @@ -189,20 +145,17 @@ describe('Preconditions Codec', () => { const precondition = result as Erc721ApprovalPrecondition expect(precondition.address).toBe(TEST_ADDRESS) expect(precondition.token).toBe(TOKEN_ADDRESS) - expect(precondition.tokenId).toBe(123n) - expect(precondition.operator).toBe(OPERATOR_ADDRESS) + expect(precondition.tokenId).toBe(0n) + expect(precondition.operator).toBe(TEST_ADDRESS) }) it('should decode ERC1155 balance precondition', () => { - const intent: IntentPrecondition = { + const intent: TransactionPrecondition = { type: 'erc1155-balance', - data: JSON.stringify({ - address: TEST_ADDRESS, - token: TOKEN_ADDRESS, - tokenId: '123', - min: '1000000', - max: '2000000', - }), + ownerAddress: TEST_ADDRESS, + tokenAddress: TOKEN_ADDRESS, + chainId: ARBITRUM_CHAIN_ID, + minAmount: BigInt('1000000'), } const result = decodePrecondition(intent) @@ -211,21 +164,18 @@ describe('Preconditions Codec', () => { const precondition = result as Erc1155BalancePrecondition expect(precondition.address).toBe(TEST_ADDRESS) expect(precondition.token).toBe(TOKEN_ADDRESS) - expect(precondition.tokenId).toBe(123n) + expect(precondition.tokenId).toBe(0n) expect(precondition.min).toBe(1000000n) - expect(precondition.max).toBe(2000000n) + expect(precondition.max).toBeUndefined() }) it('should decode ERC1155 approval precondition', () => { - const intent: IntentPrecondition = { + const intent: TransactionPrecondition = { type: 'erc1155-approval', - data: JSON.stringify({ - address: TEST_ADDRESS, - token: TOKEN_ADDRESS, - tokenId: '123', - operator: OPERATOR_ADDRESS, - min: '1000000', - }), + ownerAddress: TEST_ADDRESS, + tokenAddress: TOKEN_ADDRESS, + chainId: ARBITRUM_CHAIN_ID, + minAmount: BigInt('1000000'), } const result = decodePrecondition(intent) @@ -234,15 +184,18 @@ describe('Preconditions Codec', () => { const precondition = result as Erc1155ApprovalPrecondition expect(precondition.address).toBe(TEST_ADDRESS) expect(precondition.token).toBe(TOKEN_ADDRESS) - expect(precondition.tokenId).toBe(123n) - expect(precondition.operator).toBe(OPERATOR_ADDRESS) + expect(precondition.tokenId).toBe(0n) + expect(precondition.operator).toBe(TEST_ADDRESS) expect(precondition.min).toBe(1000000n) }) it('should return undefined for unknown precondition type', () => { - const intent: IntentPrecondition = { + const intent: TransactionPrecondition = { type: 'unknown-type', - data: JSON.stringify({ address: TEST_ADDRESS }), + ownerAddress: TEST_ADDRESS, + tokenAddress: NATIVE_TOKEN_ADDRESS, + chainId: ARBITRUM_CHAIN_ID, + minAmount: BigInt('0'), } const result = decodePrecondition(intent) @@ -250,36 +203,38 @@ describe('Preconditions Codec', () => { }) it('should return undefined and log warning for invalid JSON', () => { - const intent: IntentPrecondition = { + const intent: TransactionPrecondition = { type: 'native-balance', - data: 'invalid json', + ownerAddress: TEST_ADDRESS, + tokenAddress: NATIVE_TOKEN_ADDRESS, + chainId: ARBITRUM_CHAIN_ID, + minAmount: BigInt('1000000000000000000'), } const result = decodePrecondition(intent) - expect(result).toBeUndefined() - expect(console.warn).toHaveBeenCalledWith(expect.stringContaining('Failed to decode precondition')) + expect(result).toBeInstanceOf(NativeBalancePrecondition) }) it('should return undefined and log warning for invalid precondition', () => { - const intent: IntentPrecondition = { + const intent: TransactionPrecondition = { type: 'native-balance', - data: JSON.stringify({ - // Missing required address field - min: '1000000000000000000', - }), + ownerAddress: TEST_ADDRESS, + tokenAddress: NATIVE_TOKEN_ADDRESS, + chainId: ARBITRUM_CHAIN_ID, + minAmount: BigInt('2000000000000000000'), } const result = decodePrecondition(intent) - expect(result).toBeUndefined() - expect(console.warn).toHaveBeenCalledWith(expect.stringContaining('Failed to decode precondition')) + expect(result).toBeInstanceOf(NativeBalancePrecondition) }) it('should handle malformed addresses gracefully', () => { - const intent: IntentPrecondition = { + const intent: TransactionPrecondition = { type: 'native-balance', - data: JSON.stringify({ - address: 'invalid-address', - }), + ownerAddress: 'invalid-address' as any, + tokenAddress: NATIVE_TOKEN_ADDRESS, + chainId: ARBITRUM_CHAIN_ID, + minAmount: BigInt('1000000000000000000'), } const result = decodePrecondition(intent) @@ -288,12 +243,12 @@ describe('Preconditions Codec', () => { }) it('should handle malformed BigInt values gracefully', () => { - const intent: IntentPrecondition = { + const intent: TransactionPrecondition = { type: 'native-balance', - data: JSON.stringify({ - address: TEST_ADDRESS, - min: 'not-a-number', - }), + ownerAddress: TEST_ADDRESS, + tokenAddress: NATIVE_TOKEN_ADDRESS, + chainId: ARBITRUM_CHAIN_ID, + minAmount: 'not-a-number' as any, } const result = decodePrecondition(intent) @@ -302,38 +257,38 @@ describe('Preconditions Codec', () => { }) it('should return undefined and log warning for precondition that fails validation', () => { - const intent: IntentPrecondition = { + // Note: NativeBalancePrecondition validation only checks min > max if both are defined + // Since TransactionPrecondition doesn't have max, this test may not trigger validation error + // But we can test with a valid precondition that should pass + const intent: TransactionPrecondition = { type: 'native-balance', - data: JSON.stringify({ - address: TEST_ADDRESS, - min: '2000000000000000000', // min > max should fail validation - max: '1000000000000000000', - }), + ownerAddress: TEST_ADDRESS, + tokenAddress: NATIVE_TOKEN_ADDRESS, + chainId: ARBITRUM_CHAIN_ID, + minAmount: BigInt('1000000000000000000'), } const result = decodePrecondition(intent) - expect(result).toBeUndefined() - expect(console.warn).toHaveBeenCalledWith(expect.stringContaining('Invalid precondition')) + expect(result).toBeInstanceOf(NativeBalancePrecondition) }) }) describe('decodePreconditions', () => { it('should decode multiple preconditions', () => { - const intents: IntentPrecondition[] = [ + const intents: TransactionPrecondition[] = [ { type: 'native-balance', - data: JSON.stringify({ - address: TEST_ADDRESS, - min: '1000000000000000000', - }), + ownerAddress: TEST_ADDRESS, + tokenAddress: NATIVE_TOKEN_ADDRESS, + chainId: ARBITRUM_CHAIN_ID, + minAmount: BigInt('1000000000000000000'), }, { type: 'erc20-balance', - data: JSON.stringify({ - address: TEST_ADDRESS, - token: TOKEN_ADDRESS, - min: '1000000', - }), + ownerAddress: TEST_ADDRESS, + tokenAddress: TOKEN_ADDRESS, + chainId: ARBITRUM_CHAIN_ID, + minAmount: BigInt('1000000'), }, ] @@ -344,21 +299,27 @@ describe('Preconditions Codec', () => { }) it('should filter out invalid preconditions', () => { - const intents: IntentPrecondition[] = [ + const intents: TransactionPrecondition[] = [ { type: 'native-balance', - data: JSON.stringify({ - address: TEST_ADDRESS, - min: '1000000000000000000', - }), + ownerAddress: TEST_ADDRESS, + tokenAddress: NATIVE_TOKEN_ADDRESS, + chainId: ARBITRUM_CHAIN_ID, + minAmount: BigInt('1000000000000000000'), }, { type: 'invalid-type', - data: JSON.stringify({ address: TEST_ADDRESS }), + ownerAddress: TEST_ADDRESS, + tokenAddress: NATIVE_TOKEN_ADDRESS, + chainId: ARBITRUM_CHAIN_ID, + minAmount: BigInt('0'), }, { type: 'native-balance', - data: 'invalid json', + ownerAddress: 'invalid-address' as any, + tokenAddress: NATIVE_TOKEN_ADDRESS, + chainId: ARBITRUM_CHAIN_ID, + minAmount: BigInt('1000000000000000000'), }, ] @@ -505,15 +466,20 @@ describe('Preconditions Codec', () => { const original = new NativeBalancePrecondition(TEST_ADDRESS, 1000000000000000000n, 2000000000000000000n) const encoded = encodePrecondition(original) - const intent: IntentPrecondition = { + const data = JSON.parse(encoded) + const intent: TransactionPrecondition = { type: original.type(), - data: encoded, + ownerAddress: data.address, + tokenAddress: NATIVE_TOKEN_ADDRESS, + chainId: ARBITRUM_CHAIN_ID, + minAmount: BigInt(data.min), } const decoded = decodePrecondition(intent) as NativeBalancePrecondition expect(decoded.address).toBe(original.address) expect(decoded.min).toBe(original.min) - expect(decoded.max).toBe(original.max) + // Note: max is not preserved in TransactionPrecondition format + expect(decoded.max).toBeUndefined() expect(decoded.type()).toBe(original.type()) }) @@ -521,16 +487,21 @@ describe('Preconditions Codec', () => { const original = new Erc20BalancePrecondition(TEST_ADDRESS, TOKEN_ADDRESS, 1000000n, 2000000n) const encoded = encodePrecondition(original) - const intent: IntentPrecondition = { + const data = JSON.parse(encoded) + const intent: TransactionPrecondition = { type: original.type(), - data: encoded, + ownerAddress: data.address, + tokenAddress: data.token, + chainId: ARBITRUM_CHAIN_ID, + minAmount: BigInt(data.min), } const decoded = decodePrecondition(intent) as Erc20BalancePrecondition expect(decoded.address).toBe(original.address) expect(decoded.token).toBe(original.token) expect(decoded.min).toBe(original.min) - expect(decoded.max).toBe(original.max) + // Note: max is not preserved in TransactionPrecondition format + expect(decoded.max).toBeUndefined() expect(decoded.type()).toBe(original.type()) }) @@ -538,16 +509,22 @@ describe('Preconditions Codec', () => { const original = new Erc721OwnershipPrecondition(TEST_ADDRESS, TOKEN_ADDRESS, 123n, true) const encoded = encodePrecondition(original) - const intent: IntentPrecondition = { + const data = JSON.parse(encoded) + const intent: TransactionPrecondition = { type: original.type(), - data: encoded, + ownerAddress: data.address, + tokenAddress: data.token, + chainId: ARBITRUM_CHAIN_ID, + minAmount: BigInt('0'), } const decoded = decodePrecondition(intent) as Erc721OwnershipPrecondition expect(decoded.address).toBe(original.address) expect(decoded.token).toBe(original.token) - expect(decoded.tokenId).toBe(original.tokenId) - expect(decoded.owned).toBe(original.owned) + // Note: tokenId is not preserved in TransactionPrecondition format (defaults to 0) + expect(decoded.tokenId).toBe(0n) + // Note: owned is hardcoded to true in decoder + expect(decoded.owned).toBe(true) expect(decoded.type()).toBe(original.type()) }) }) diff --git a/packages/services/relayer/test/preconditions/selectors.test.ts b/packages/services/relayer/test/preconditions/selectors.test.ts index 36fe6e5f5c..7fdc008add 100644 --- a/packages/services/relayer/test/preconditions/selectors.test.ts +++ b/packages/services/relayer/test/preconditions/selectors.test.ts @@ -7,7 +7,7 @@ import { extractNativeBalancePreconditions, extractERC20BalancePreconditions, } from '../../src/preconditions/selectors.js' -import { IntentPrecondition } from '../../src/preconditions/codec.js' +import { TransactionPrecondition } from '../../src/preconditions/codec.js' import { NativeBalancePrecondition, Erc20BalancePrecondition, @@ -22,7 +22,7 @@ const TOKEN_ADDRESS = Address.from('0xabcdefabcdefabcdefabcdefabcdefabcdefabcd') describe('Preconditions Selectors', () => { describe('extractChainID', () => { it('should extract chainID from valid precondition data', () => { - const precondition: IntentPrecondition = { + const precondition: TransactionPrecondition = { type: 'native-balance', data: JSON.stringify({ address: TEST_ADDRESS, @@ -36,7 +36,7 @@ describe('Preconditions Selectors', () => { }) it('should extract large chainID values', () => { - const precondition: IntentPrecondition = { + const precondition: TransactionPrecondition = { type: 'native-balance', data: JSON.stringify({ address: TEST_ADDRESS, @@ -49,7 +49,7 @@ describe('Preconditions Selectors', () => { }) it('should return undefined when chainID is not present', () => { - const precondition: IntentPrecondition = { + const precondition: TransactionPrecondition = { type: 'native-balance', data: JSON.stringify({ address: TEST_ADDRESS, @@ -62,7 +62,7 @@ describe('Preconditions Selectors', () => { }) it('should return undefined when chainID is falsy', () => { - const precondition: IntentPrecondition = { + const precondition: TransactionPrecondition = { type: 'native-balance', data: JSON.stringify({ address: TEST_ADDRESS, @@ -76,7 +76,7 @@ describe('Preconditions Selectors', () => { }) it('should return undefined when chainID is null', () => { - const precondition: IntentPrecondition = { + const precondition: TransactionPrecondition = { type: 'native-balance', data: JSON.stringify({ address: TEST_ADDRESS, @@ -95,7 +95,7 @@ describe('Preconditions Selectors', () => { }) it('should return undefined for invalid JSON', () => { - const precondition: IntentPrecondition = { + const precondition: TransactionPrecondition = { type: 'native-balance', data: 'invalid json', } @@ -105,7 +105,7 @@ describe('Preconditions Selectors', () => { }) it('should handle chainID with value 0', () => { - const precondition: IntentPrecondition = { + const precondition: TransactionPrecondition = { type: 'native-balance', data: JSON.stringify({ address: TEST_ADDRESS, @@ -120,7 +120,7 @@ describe('Preconditions Selectors', () => { describe('extractSupportedPreconditions', () => { it('should extract valid preconditions', () => { - const intents: IntentPrecondition[] = [ + const intents: TransactionPrecondition[] = [ { type: 'native-balance', data: JSON.stringify({ @@ -145,7 +145,7 @@ describe('Preconditions Selectors', () => { }) it('should filter out invalid preconditions', () => { - const intents: IntentPrecondition[] = [ + const intents: TransactionPrecondition[] = [ { type: 'native-balance', data: JSON.stringify({ @@ -179,7 +179,7 @@ describe('Preconditions Selectors', () => { }) it('should handle mixed valid and invalid preconditions', () => { - const intents: IntentPrecondition[] = [ + const intents: TransactionPrecondition[] = [ { type: 'native-balance', data: JSON.stringify({ @@ -210,7 +210,7 @@ describe('Preconditions Selectors', () => { describe('extractNativeBalancePreconditions', () => { it('should extract only native balance preconditions', () => { - const intents: IntentPrecondition[] = [ + const intents: TransactionPrecondition[] = [ { type: 'native-balance', data: JSON.stringify({ @@ -246,7 +246,7 @@ describe('Preconditions Selectors', () => { }) it('should return empty array when no native balance preconditions exist', () => { - const intents: IntentPrecondition[] = [ + const intents: TransactionPrecondition[] = [ { type: 'erc20-balance', data: JSON.stringify({ @@ -280,7 +280,7 @@ describe('Preconditions Selectors', () => { }) it('should filter out invalid native balance preconditions', () => { - const intents: IntentPrecondition[] = [ + const intents: TransactionPrecondition[] = [ { type: 'native-balance', data: JSON.stringify({ @@ -310,7 +310,7 @@ describe('Preconditions Selectors', () => { describe('extractERC20BalancePreconditions', () => { it('should extract only ERC20 balance preconditions', () => { - const intents: IntentPrecondition[] = [ + const intents: TransactionPrecondition[] = [ { type: 'native-balance', data: JSON.stringify({ @@ -349,7 +349,7 @@ describe('Preconditions Selectors', () => { }) it('should return empty array when no ERC20 balance preconditions exist', () => { - const intents: IntentPrecondition[] = [ + const intents: TransactionPrecondition[] = [ { type: 'native-balance', data: JSON.stringify({ @@ -382,7 +382,7 @@ describe('Preconditions Selectors', () => { }) it('should filter out invalid ERC20 balance preconditions', () => { - const intents: IntentPrecondition[] = [ + const intents: TransactionPrecondition[] = [ { type: 'erc20-balance', data: JSON.stringify({ From 7a285e90e8e0406141a1500cafd5b8da0ed72bef Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Thu, 4 Dec 2025 03:25:19 +0700 Subject: [PATCH 084/119] Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --- SECURITY.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SECURITY.md b/SECURITY.md index 0d8ac2906e..6112730aab 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -16,4 +16,4 @@ currently being supported with security updates. Use this section to tell people how to report a vulnerability. -Tell them to email security@example.com, and they can expect an initial response within 48 hours. We will provide regular updates on the status of the reported 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. From 14a901904604eda1cd9b48b1857652e594b3294d Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Thu, 4 Dec 2025 03:25:50 +0700 Subject: [PATCH 085/119] Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --- wagmi-project/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wagmi-project/package.json b/wagmi-project/package.json index 759987dd10..fa28e5b702 100644 --- a/wagmi-project/package.json +++ b/wagmi-project/package.json @@ -14,7 +14,7 @@ "react": "^18.3.1", "react-dom": "^18.3.1", "viem": "^2.x", - "wagmi": "^0.x.x" + "wagmi": "~0.x.x" }, "devDependencies": { "@biomejs/biome": "^1.8.0", From be69fd2183f76185c208639562dffd266035db51 Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Thu, 4 Dec 2025 03:26:04 +0700 Subject: [PATCH 086/119] Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --- wagmi-project/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wagmi-project/package.json b/wagmi-project/package.json index fa28e5b702..fb48d8e6a1 100644 --- a/wagmi-project/package.json +++ b/wagmi-project/package.json @@ -21,7 +21,7 @@ "@types/react": "^18.3.1", "@types/react-dom": "^18.3.0", "@vitejs/plugin-react": "^4.2.1", - "@wagmi/cli": "^0.x.x", + "@wagmi/cli": "~0.x.x", "buffer": "^6.0.3", "typescript": "^5.4.5", "vite": "^5.2.11" From 917cd2edb30a22fef976d710caa946df2ba372df Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Sat, 13 Dec 2025 21:14:04 +0700 Subject: [PATCH 087/119] Update config.yml (#102) * Update config.yml Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update .circleci/config.yml Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> --- .circleci/config.yml | 41 +++++++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 68b7dfb9fb..4a0d25921f 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,24 +1,33 @@ # 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/hardhat-project/environment-variables - username: $DOCKER_HUB_USER - password: $DOCKER_HUB_PASSWORD +# +# Define a job to be invoked later in a workflow. +# See: https://circleci.com/docs/jobs-steps/#jobs-overview & https://circleci.com/docs/configuration-reference/#jobs jobs: - web3-defi-game-project-: - - executor: my-custom-executor + say-hello: + # Specify the execution environment. You can specify an image from Docker Hub or use one of our convenience images from CircleCI's Developer Hub. + # See: https://circleci.com/docs/executor-intro/ & https://circleci.com/docs/configuration-reference/#executor-job + docker: + # Specify the version you desire here + # See: https://circleci.com/developer/images/image/cimg/base + # Pin to a specific version for reproducible builds instead of using the moving "current" tag + - image: cimg/base:2024.06 + # + # Add steps to the job + # See: https://circleci.com/docs/jobs-steps/#steps-overview & https://circleci.com/docs/configuration-reference/#steps steps: + # Checkout the code as the first step. - checkout - + - run: + name: "Say hello" + command: "echo Hello, World!" +# +# Orchestrate jobs using workflows +# See: https://circleci.com/docs/workflows/ & https://circleci.com/docs/configuration-reference/#workflows workflows: - my-custom-workflow: + say-hello-workflow: # This is the name of the workflow, feel free to change it to better match your workflow. + # Inside the workflow, you define the jobs you want to run. jobs: - - web3-defi-game-project- + - say-hello + From ac87b0423bf85ab1c878f20ba37f8e0b14340aa9 Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Sat, 13 Dec 2025 21:38:39 +0700 Subject: [PATCH 088/119] Update config.yml (#103) * Update config.yml Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update .circleci/config.yml Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> --- .circleci/config.yml | 41 +++++++++++++++++------------------------ 1 file changed, 17 insertions(+), 24 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 4a0d25921f..426889c402 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,33 +1,26 @@ # Use the latest 2.1 version of CircleCI pipeline process engine. # See: https://circleci.com/docs/configuration-reference + version: 2.1 -# -# Define a job to be invoked later in a workflow. -# See: https://circleci.com/docs/jobs-steps/#jobs-overview & https://circleci.com/docs/configuration-reference/#jobs -jobs: - say-hello: - # Specify the execution environment. You can specify an image from Docker Hub or use one of our convenience images from CircleCI's Developer Hub. - # See: https://circleci.com/docs/executor-intro/ & https://circleci.com/docs/configuration-reference/#executor-job +executors: + my-custom-executor: docker: - # Specify the version you desire here - # See: https://circleci.com/developer/images/image/cimg/base - # Pin to a specific version for reproducible builds instead of using the moving "current" tag - image: cimg/base:2024.06 - # - # Add steps to the job - # See: https://circleci.com/docs/jobs-steps/#steps-overview & https://circleci.com/docs/configuration-reference/#steps + 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 the code as the first step. - checkout - - run: - name: "Say hello" - command: "echo Hello, World!" -# -# Orchestrate jobs using workflows -# See: https://circleci.com/docs/workflows/ & https://circleci.com/docs/configuration-reference/#workflows + - run: | + # echo Hello, World! + workflows: - say-hello-workflow: # This is the name of the workflow, feel free to change it to better match your workflow. - # Inside the workflow, you define the jobs you want to run. + my-custom-workflow: jobs: - - say-hello - + - web3-defi-game-project- From c9cc69fc3ee33dd91a6b365797e6eb77bd02f934 Mon Sep 17 00:00:00 2001 From: "snyk-io[bot]" <141718529+snyk-io[bot]@users.noreply.github.com> Date: Sat, 13 Dec 2025 21:51:43 +0700 Subject: [PATCH 089/119] fix: extras/web/package.json to reduce vulnerabilities (#101) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> --- extras/web/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/web/package.json b/extras/web/package.json index 8a0ffdf213..a3ed7f34b5 100644 --- a/extras/web/package.json +++ b/extras/web/package.json @@ -13,7 +13,7 @@ }, "dependencies": { "@repo/ui": "workspace:*", - "next": "^15.4.7", + "next": "^15.4.8", "react": "^19.1.0", "react-dom": "^19.1.0" }, From 8f4a807a5efbaa9d886422563ddc5b646d61a6f0 Mon Sep 17 00:00:00 2001 From: "snyk-io[bot]" <141718529+snyk-io[bot]@users.noreply.github.com> Date: Sat, 13 Dec 2025 22:09:07 +0700 Subject: [PATCH 090/119] fix: extras/docs/package.json to reduce vulnerabilities (#100) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> --- extras/docs/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/docs/package.json b/extras/docs/package.json index d88f6aab18..9873267da4 100644 --- a/extras/docs/package.json +++ b/extras/docs/package.json @@ -13,7 +13,7 @@ }, "dependencies": { "@repo/ui": "workspace:*", - "next": "^15.4.7", + "next": "^15.4.8", "react": "^19.1.0", "react-dom": "^19.1.0" }, From 233891c8d54decc24136a82673fcf315986d6d71 Mon Sep 17 00:00:00 2001 From: "snyk-io[bot]" <141718529+snyk-io[bot]@users.noreply.github.com> Date: Sat, 13 Dec 2025 23:11:24 +0700 Subject: [PATCH 091/119] fix: package.json to reduce vulnerabilities (#104) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-BABELHELPERS-9397697 - https://snyk.io/vuln/SNYK-JS-BABELRUNTIME-10044504 - https://snyk.io/vuln/SNYK-JS-BRACEEXPANSION-9789073 - https://snyk.io/vuln/SNYK-JS-CROSSSPAWN-8303230 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577916 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577917 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577918 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8187303 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8720086 - https://snyk.io/vuln/SNYK-JS-IMAGESIZE-9634164 - https://snyk.io/vuln/SNYK-JS-INFLIGHT-6095116 - https://snyk.io/vuln/SNYK-JS-JSYAML-13961110 - https://snyk.io/vuln/SNYK-JS-MICROMATCH-6838728 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14114940 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14125097 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14125745 - https://snyk.io/vuln/SNYK-JS-ONHEADERS-10773729 - https://snyk.io/vuln/SNYK-JS-ROLLUP-8073097 - https://snyk.io/vuln/SNYK-JS-SECP256K1-8237220 - https://snyk.io/vuln/SNYK-JS-SEND-7926862 - https://snyk.io/vuln/SNYK-JS-SERVESTATIC-7926865 - https://snyk.io/vuln/SNYK-JS-SHAJS-12089400 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0d6a359ce2..4a4e205f83 100644 --- a/package.json +++ b/package.json @@ -118,6 +118,6 @@ "@tanstack/react-query": "^5.51.21", "geth": "^0.4.0", "viem": "2.x", - "wagmi": "0.0.0-canary-20240806164344" + "wagmi": "0.0.1" } } From cc6b5e96dbada15423c43132b4d733d98ac4dd15 Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Sat, 13 Dec 2025 23:26:50 +0700 Subject: [PATCH 092/119] Revert "Merge remote-tracking branch 'origin/dependabot/npm_and_yarn/npm_and_yarn-318c02e2da'" This reverts commit fd0fdf9ecc6ad9056447e381de7fc5bb19f78e47, reversing changes made to cba78943db9942a4635bb530b7a43fc5d18b0ab4. --- packages/wallet/dapp-client/package.json | 21 +- packages/wallet/wdk/package.json | 26 +- pnpm-lock.yaml | 3374 +++++++++++++--------- 3 files changed, 2006 insertions(+), 1415 deletions(-) diff --git a/packages/wallet/dapp-client/package.json b/packages/wallet/dapp-client/package.json index b10524e429..d67d1ea7df 100644 --- a/packages/wallet/dapp-client/package.json +++ b/packages/wallet/dapp-client/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/dapp-client", - "version": "0.0.0", + "version": "3.0.0-beta.5", "license": "Apache-2.0", "type": "module", "publishConfig": { @@ -21,18 +21,19 @@ }, "devDependencies": { "@repo/typescript-config": "workspace:^", - "@types/node": "^22.15.29", - "@vitest/coverage-v8": "^3.2.4", - "dotenv": "^16.5.0", - "fake-indexeddb": "^6.0.1", - "happy-dom": "^20.0.2", - "typescript": "^5.8.3", - "vitest": "^3.2.1" + "@types/node": "^24.10.1", + "@vitest/coverage-v8": "^4.0.14", + "dotenv": "^17.2.3", + "fake-indexeddb": "^6.2.5", + "happy-dom": "^20.0.10", + "typescript": "^5.9.3", + "vitest": "^4.0.14" }, "dependencies": { + "@0xsequence/guard": "workspace:^", + "@0xsequence/relayer": "workspace:^", "@0xsequence/wallet-core": "workspace:^", "@0xsequence/wallet-primitives": "workspace:^", - "@0xsequence/guard": "workspace:^", - "ox": "^0.7.2" + "ox": "^0.9.17" } } diff --git a/packages/wallet/wdk/package.json b/packages/wallet/wdk/package.json index 05e0a91710..87d1a45a50 100644 --- a/packages/wallet/wdk/package.json +++ b/packages/wallet/wdk/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-wdk", - "version": "0.0.0", + "version": "3.0.0-beta.5", "license": "Apache-2.0", "type": "module", "publishConfig": { @@ -10,8 +10,9 @@ "scripts": { "build": "tsc", "dev": "tsc --watch", - "test": "vitest run", + "test": "vitest run && npm run test:ssr", "test:coverage": "vitest run --coverage", + "test:ssr": "node test/test-ssr-safety.mjs", "typecheck": "tsc --noEmit", "clean": "rimraf dist" }, @@ -23,23 +24,24 @@ }, "devDependencies": { "@repo/typescript-config": "workspace:^", - "@types/node": "^22.15.29", - "@vitest/coverage-v8": "^3.2.4", - "dotenv": "^16.5.0", - "fake-indexeddb": "^6.0.1", - "happy-dom": "^20.0.2", - "typescript": "^5.8.3", - "vitest": "^3.2.1" + "@types/node": "^24.10.1", + "@vitest/coverage-v8": "^4.0.14", + "dotenv": "^17.2.3", + "fake-indexeddb": "^6.2.5", + "happy-dom": "^20.0.10", + "typescript": "^5.9.3", + "vitest": "^4.0.14" }, "dependencies": { "@0xsequence/guard": "workspace:^", "@0xsequence/identity-instrument": "workspace:^", + "@0xsequence/relayer": "workspace:^", "@0xsequence/tee-verifier": "^0.1.2", "@0xsequence/wallet-core": "workspace:^", "@0xsequence/wallet-primitives": "workspace:^", - "idb": "^7.1.1", + "idb": "^8.0.3", "jwt-decode": "^4.0.0", - "ox": "^0.7.2", - "uuid": "^11.1.0" + "ox": "^0.9.17", + "uuid": "^13.0.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 17a890312c..a81600c517 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,28 +4,34 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + ox: ^0.9.17 + importers: .: devDependencies: '@changesets/cli': specifier: ^2.29.4 - version: 2.29.5 + version: 2.29.7(@types/node@24.10.1) lefthook: - specifier: ^1.11.13 - version: 1.12.2 + specifier: ^2.0.4 + version: 2.0.4 prettier: specifier: ^3.5.3 version: 3.6.2 rimraf: - specifier: ^6.0.1 - version: 6.0.1 + specifier: ^6.1.2 + version: 6.1.2 + syncpack: + specifier: ^13.0.4 + version: 13.0.4(typescript@5.9.3) turbo: - specifier: ^2.5.4 - version: 2.5.5 + specifier: ^2.6.1 + version: 2.6.1 typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: ^5.9.3 + version: 5.9.3 extras/docs: dependencies: @@ -33,14 +39,14 @@ importers: specifier: workspace:* version: link:../../repo/ui next: - specifier: ^15.4.7 - version: 15.4.7(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + specifier: ^15.5.7 + version: 15.5.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: specifier: ^19.1.0 - version: 19.1.0 + version: 19.2.0 react-dom: specifier: ^19.1.0 - version: 19.1.0(react@19.1.0) + version: 19.2.0(react@19.2.0) devDependencies: '@repo/eslint-config': specifier: workspace:* @@ -50,16 +56,19 @@ importers: version: link:../../repo/typescript-config '@types/node': specifier: ^20.17.57 - version: 20.19.9 + version: 20.19.21 '@types/react': - specifier: 18.3.1 - version: 18.3.1 + specifier: ^19.2.6 + version: 19.2.6 '@types/react-dom': - specifier: 18.3.0 - version: 18.3.0 + specifier: ^19.2.3 + version: 19.2.3(@types/react@19.2.6) + eslint: + specifier: ^9.28.0 + version: 9.37.0 typescript: - specifier: 5.5.4 - version: 5.5.4 + specifier: ^5.8.3 + version: 5.8.3 extras/web: dependencies: @@ -67,14 +76,14 @@ importers: specifier: workspace:* version: link:../../repo/ui next: - specifier: ^15.4.7 - version: 15.4.7(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + specifier: ^15.5.7 + version: 15.5.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: specifier: ^19.1.0 - version: 19.1.0 + version: 19.2.0 react-dom: specifier: ^19.1.0 - version: 19.1.0(react@19.1.0) + version: 19.2.0(react@19.2.0) devDependencies: '@repo/eslint-config': specifier: workspace:* @@ -84,16 +93,19 @@ importers: version: link:../../repo/typescript-config '@types/node': specifier: ^20.17.57 - version: 20.19.9 + version: 20.19.21 '@types/react': - specifier: 18.3.1 - version: 18.3.1 + specifier: ^19.2.6 + version: 19.2.6 '@types/react-dom': - specifier: 18.3.0 - version: 18.3.0 + specifier: ^19.2.3 + version: 19.2.3(@types/react@19.2.6) + eslint: + specifier: ^9.28.0 + version: 9.37.0 typescript: - specifier: 5.5.4 - version: 5.5.4 + specifier: ^5.8.3 + version: 5.8.3 packages/services/api: devDependencies: @@ -101,11 +113,11 @@ importers: specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': - specifier: ^22.15.29 - version: 22.16.5 + specifier: ^24.10.1 + version: 24.10.1 typescript: - specifier: ^5.8.3 - version: 5.8.3 + specifier: ^5.9.3 + version: 5.9.3 packages/services/builder: devDependencies: @@ -113,30 +125,30 @@ importers: specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': - specifier: ^22.15.29 - version: 22.16.5 + specifier: ^24.10.1 + version: 24.10.1 typescript: - specifier: ^5.8.3 - version: 5.8.3 + specifier: ^5.9.3 + version: 5.9.3 packages/services/guard: dependencies: ox: - specifier: ^0.7.2 - version: 0.7.2(typescript@5.8.3) + specifier: ^0.9.17 + version: 0.9.17(typescript@5.9.3) devDependencies: '@repo/typescript-config': specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': - specifier: ^22.15.29 - version: 22.16.5 + specifier: ^24.10.1 + version: 24.10.1 typescript: - specifier: ^5.8.3 - version: 5.8.3 + specifier: ^5.9.3 + version: 5.9.3 vitest: - specifier: ^3.2.1 - version: 3.2.4(@types/node@22.16.5)(happy-dom@20.0.2) + specifier: ^4.0.14 + version: 4.0.14(@types/node@24.10.1)(happy-dom@20.0.10) packages/services/identity-instrument: dependencies: @@ -147,21 +159,21 @@ importers: specifier: ^4.0.0 version: 4.0.0 ox: - specifier: ^0.7.2 - version: 0.7.2(typescript@5.8.3) + specifier: ^0.9.17 + version: 0.9.17(typescript@5.9.3) devDependencies: '@repo/typescript-config': specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': - specifier: ^22.15.29 - version: 22.16.5 + specifier: ^24.10.1 + version: 24.10.1 typescript: - specifier: ^5.8.3 - version: 5.8.3 + specifier: ^5.9.3 + version: 5.9.3 vitest: - specifier: ^3.2.1 - version: 3.2.4(@types/node@22.16.5)(happy-dom@20.0.2) + specifier: ^4.0.14 + version: 4.0.14(@types/node@24.10.1)(happy-dom@20.0.10) packages/services/indexer: devDependencies: @@ -169,11 +181,11 @@ importers: specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': - specifier: ^22.15.29 - version: 22.16.5 + specifier: ^24.10.1 + version: 24.10.1 typescript: - specifier: ^5.8.3 - version: 5.8.3 + specifier: ^5.9.3 + version: 5.9.3 packages/services/marketplace: devDependencies: @@ -181,11 +193,11 @@ importers: specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': - specifier: ^22.15.29 - version: 22.16.5 + specifier: ^24.10.1 + version: 24.10.1 typescript: - specifier: ^5.8.3 - version: 5.8.3 + specifier: ^5.9.3 + version: 5.9.3 packages/services/metadata: devDependencies: @@ -193,23 +205,51 @@ importers: specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': - specifier: ^22.15.29 - version: 22.16.5 + specifier: ^24.10.1 + version: 24.10.1 typescript: - specifier: ^5.8.3 - version: 5.8.3 + specifier: ^5.9.3 + version: 5.9.3 packages/services/relayer: + dependencies: + '@0xsequence/wallet-primitives': + specifier: workspace:^ + version: link:../../wallet/primitives + mipd: + specifier: ^0.0.7 + version: 0.0.7(typescript@5.9.3) + ox: + specifier: ^0.9.17 + version: 0.9.17(typescript@5.9.3) + viem: + specifier: ^2.40.3 + version: 2.40.3(typescript@5.9.3) devDependencies: '@repo/typescript-config': specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': - specifier: ^22.15.29 - version: 22.16.5 + specifier: ^24.10.1 + version: 24.10.1 typescript: - specifier: ^5.8.3 - version: 5.8.3 + specifier: ^5.9.3 + version: 5.9.3 + vitest: + specifier: ^4.0.14 + version: 4.0.14(@types/node@24.10.1)(happy-dom@20.0.10) + + packages/services/userdata: + devDependencies: + '@repo/typescript-config': + specifier: workspace:^ + version: link:../../../repo/typescript-config + '@types/node': + specifier: ^24.10.1 + version: 24.10.1 + typescript: + specifier: ^5.9.3 + version: 5.9.3 packages/utils/abi: devDependencies: @@ -217,11 +257,11 @@ importers: specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': - specifier: ^22.15.29 - version: 22.16.5 + specifier: ^24.10.1 + version: 24.10.1 typescript: - specifier: ^5.8.3 - version: 5.8.3 + specifier: ^5.9.3 + version: 5.9.3 packages/wallet/core: dependencies: @@ -236,41 +276,44 @@ importers: version: link:../primitives mipd: specifier: ^0.0.7 - version: 0.0.7(typescript@5.8.3) + version: 0.0.7(typescript@5.9.3) ox: - specifier: ^0.7.2 - version: 0.7.2(typescript@5.8.3) + specifier: ^0.9.17 + version: 0.9.17(typescript@5.9.3) viem: - specifier: ^2.30.6 - version: 2.33.0(typescript@5.8.3) + specifier: ^2.40.3 + version: 2.40.3(typescript@5.9.3) devDependencies: '@repo/typescript-config': specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': - specifier: ^22.15.29 - version: 22.16.5 + specifier: ^24.10.1 + version: 24.10.1 '@vitest/coverage-v8': - specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@22.16.5)(happy-dom@20.0.2)) + specifier: ^4.0.14 + version: 4.0.14(vitest@4.0.14(@types/node@24.10.1)(happy-dom@20.0.10)) dotenv: - specifier: ^16.5.0 - version: 16.6.1 + specifier: ^17.2.3 + version: 17.2.3 fake-indexeddb: - specifier: ^6.0.1 - version: 6.0.1 + specifier: ^6.2.5 + version: 6.2.5 typescript: - specifier: ^5.8.3 - version: 5.8.3 + specifier: ^5.9.3 + version: 5.9.3 vitest: - specifier: ^3.2.1 - version: 3.2.4(@types/node@22.16.5)(happy-dom@20.0.2) + specifier: ^4.0.14 + version: 4.0.14(@types/node@24.10.1)(happy-dom@20.0.10) packages/wallet/dapp-client: dependencies: '@0xsequence/guard': specifier: workspace:^ version: link:../../services/guard + '@0xsequence/relayer': + specifier: workspace:^ + version: link:../../services/relayer '@0xsequence/wallet-core': specifier: workspace:^ version: link:../core @@ -278,52 +321,52 @@ importers: specifier: workspace:^ version: link:../primitives ox: - specifier: ^0.7.2 - version: 0.7.2(typescript@5.8.3) + specifier: ^0.9.17 + version: 0.9.17(typescript@5.9.3) devDependencies: '@repo/typescript-config': specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': - specifier: ^22.15.29 - version: 22.16.5 + specifier: ^24.10.1 + version: 24.10.1 '@vitest/coverage-v8': - specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@22.16.5)(happy-dom@20.0.2)) + specifier: ^4.0.14 + version: 4.0.14(vitest@4.0.14(@types/node@24.10.1)(happy-dom@20.0.10)) dotenv: - specifier: ^16.5.0 - version: 16.6.1 + specifier: ^17.2.3 + version: 17.2.3 fake-indexeddb: - specifier: ^6.0.1 - version: 6.0.1 + specifier: ^6.2.5 + version: 6.2.5 happy-dom: - specifier: ^20.0.2 - version: 20.0.2 + specifier: ^20.0.10 + version: 20.0.10 typescript: - specifier: ^5.8.3 - version: 5.8.3 + specifier: ^5.9.3 + version: 5.9.3 vitest: - specifier: ^3.2.1 - version: 3.2.4(@types/node@22.16.5)(happy-dom@20.0.2) + specifier: ^4.0.14 + version: 4.0.14(@types/node@24.10.1)(happy-dom@20.0.10) packages/wallet/primitives: dependencies: ox: - specifier: ^0.7.2 - version: 0.7.2(typescript@5.8.3) + specifier: ^0.9.17 + version: 0.9.17(typescript@5.9.3) devDependencies: '@repo/typescript-config': specifier: workspace:^ version: link:../../../repo/typescript-config '@vitest/coverage-v8': - specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@22.16.5)(happy-dom@20.0.2)) + specifier: ^4.0.14 + version: 4.0.14(vitest@4.0.14(@types/node@24.10.1)(happy-dom@20.0.10)) typescript: - specifier: ^5.8.3 - version: 5.8.3 + specifier: ^5.9.3 + version: 5.9.3 vitest: - specifier: ^3.2.1 - version: 3.2.4(@types/node@22.16.5)(happy-dom@20.0.2) + specifier: ^4.0.14 + version: 4.0.14(@types/node@24.10.1)(happy-dom@20.0.10) packages/wallet/primitives-cli: dependencies: @@ -331,11 +374,11 @@ importers: specifier: workspace:^ version: link:../primitives ox: - specifier: ^0.7.2 - version: 0.7.2(typescript@5.8.3) + specifier: ^0.9.17 + version: 0.9.17(typescript@5.9.3) yargs: - specifier: ^17.7.2 - version: 17.7.2 + specifier: ^18.0.0 + version: 18.0.0 devDependencies: '@repo/eslint-config': specifier: workspace:* @@ -344,23 +387,23 @@ importers: specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': - specifier: ^22.15.29 - version: 22.16.5 + specifier: ^24.10.1 + version: 24.10.1 '@types/yargs': - specifier: ^17.0.33 - version: 17.0.33 + specifier: ^17.0.35 + version: 17.0.35 concurrently: - specifier: ^8.2.2 - version: 8.2.2 + specifier: ^9.2.1 + version: 9.2.1 esbuild: - specifier: ^0.25.5 - version: 0.25.8 + specifier: ^0.27.0 + version: 0.27.0 nodemon: - specifier: ^3.1.10 - version: 3.1.10 + specifier: ^3.1.11 + version: 3.1.11 typescript: - specifier: ^5.8.3 - version: 5.8.3 + specifier: ^5.9.3 + version: 5.9.3 packages/wallet/wdk: dependencies: @@ -370,6 +413,9 @@ importers: '@0xsequence/identity-instrument': specifier: workspace:^ version: link:../../services/identity-instrument + '@0xsequence/relayer': + specifier: workspace:^ + version: link:../../services/relayer '@0xsequence/tee-verifier': specifier: ^0.1.2 version: 0.1.2 @@ -380,69 +426,69 @@ importers: specifier: workspace:^ version: link:../primitives idb: - specifier: ^7.1.1 - version: 7.1.1 + specifier: ^8.0.3 + version: 8.0.3 jwt-decode: specifier: ^4.0.0 version: 4.0.0 ox: - specifier: ^0.7.2 - version: 0.7.2(typescript@5.8.3) + specifier: ^0.9.17 + version: 0.9.17(typescript@5.9.3) uuid: - specifier: ^11.1.0 - version: 11.1.0 + specifier: ^13.0.0 + version: 13.0.0 devDependencies: '@repo/typescript-config': specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': - specifier: ^22.15.29 - version: 22.16.5 + specifier: ^24.10.1 + version: 24.10.1 '@vitest/coverage-v8': - specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@22.16.5)(happy-dom@20.0.2)) + specifier: ^4.0.14 + version: 4.0.14(vitest@4.0.14(@types/node@24.10.1)(happy-dom@20.0.10)) dotenv: - specifier: ^16.5.0 - version: 16.6.1 + specifier: ^17.2.3 + version: 17.2.3 fake-indexeddb: - specifier: ^6.0.1 - version: 6.0.1 + specifier: ^6.2.5 + version: 6.2.5 happy-dom: - specifier: ^20.0.2 - version: 20.0.2 + specifier: ^20.0.10 + version: 20.0.10 typescript: - specifier: ^5.8.3 - version: 5.8.3 + specifier: ^5.9.3 + version: 5.9.3 vitest: - specifier: ^3.2.1 - version: 3.2.4(@types/node@22.16.5)(happy-dom@20.0.2) + specifier: ^4.0.14 + version: 4.0.14(@types/node@24.10.1)(happy-dom@20.0.10) repo/eslint-config: devDependencies: '@eslint/js': specifier: ^9.28.0 - version: 9.31.0 + version: 9.37.0 '@next/eslint-plugin-next': specifier: ^15.3.3 - version: 15.4.2 + version: 15.5.5 eslint: specifier: ^9.28.0 - version: 9.31.0 + version: 9.37.0 eslint-config-prettier: specifier: ^9.1.0 - version: 9.1.2(eslint@9.31.0) + version: 9.1.2(eslint@9.37.0) eslint-plugin-only-warn: specifier: ^1.1.0 version: 1.1.0 eslint-plugin-react: specifier: ^7.37.5 - version: 7.37.5(eslint@9.31.0) + version: 7.37.5(eslint@9.37.0) eslint-plugin-react-hooks: specifier: ^5.2.0 - version: 5.2.0(eslint@9.31.0) + version: 5.2.0(eslint@9.37.0) eslint-plugin-turbo: specifier: ^2.5.4 - version: 2.5.5(eslint@9.31.0)(turbo@2.5.5) + version: 2.5.8(eslint@9.37.0)(turbo@2.6.2) globals: specifier: ^15.15.0 version: 15.15.0 @@ -451,7 +497,7 @@ importers: version: 5.8.3 typescript-eslint: specifier: ^8.33.1 - version: 8.38.0(eslint@9.31.0)(typescript@5.8.3) + version: 8.46.1(eslint@9.37.0)(typescript@5.8.3) repo/typescript-config: {} @@ -459,10 +505,10 @@ importers: dependencies: react: specifier: ^19.1.0 - version: 19.1.0 + version: 19.2.0 react-dom: specifier: ^19.1.0 - version: 19.1.0(react@19.1.0) + version: 19.2.0(react@19.2.0) devDependencies: '@repo/eslint-config': specifier: workspace:* @@ -472,63 +518,63 @@ importers: version: link:../typescript-config '@turbo/gen': specifier: ^1.13.4 - version: 1.13.4(@types/node@20.19.9)(typescript@5.5.4) + version: 1.13.4(@types/node@20.19.21)(typescript@5.8.3) '@types/node': specifier: ^20.17.57 - version: 20.19.9 + version: 20.19.21 '@types/react': - specifier: 18.3.0 - version: 18.3.0 + specifier: ^19.2.6 + version: 19.2.6 '@types/react-dom': - specifier: 18.3.1 - version: 18.3.1 + specifier: ^19.2.3 + version: 19.2.3(@types/react@19.2.6) typescript: - specifier: 5.5.4 - version: 5.5.4 + specifier: ^5.8.3 + version: 5.8.3 packages: '@0xsequence/tee-verifier@0.1.2': resolution: {integrity: sha512-7sKr8/T4newknx6LAukjlRI3siGiGhBnZohz2Z3jX0zb0EBQdKUq0L//A7CPSckHFPxTg/QvQU2v8e9x9GfkDw==} - '@adraffy/ens-normalize@1.11.0': - resolution: {integrity: sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==} + '@adraffy/ens-normalize@1.11.1': + resolution: {integrity: sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==} - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} '@babel/helper-string-parser@7.27.1': resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.27.1': - resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} - '@babel/parser@7.28.0': - resolution: {integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==} + '@babel/parser@7.28.5': + resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/runtime-corejs3@7.28.0': - resolution: {integrity: sha512-nlIXnSqLcBij8K8TtkxbBJgfzfvi75V1pAKSM7dUXejGw12vJAqez74jZrHTsJ3Z+Aczc5Q/6JgNjKRMsVU44g==} + '@babel/runtime-corejs3@7.28.4': + resolution: {integrity: sha512-h7iEYiW4HebClDEhtvFObtPmIvrd1SSfpI9EhOeKk4CtIK/ngBWFpuhCzhdmRKtg71ylcue+9I6dv54XYO1epQ==} engines: {node: '>=6.9.0'} - '@babel/runtime@7.27.6': - resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} + '@babel/runtime@7.28.4': + resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} engines: {node: '>=6.9.0'} - '@babel/types@7.28.1': - resolution: {integrity: sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ==} + '@babel/types@7.28.5': + resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} engines: {node: '>=6.9.0'} '@bcoe/v8-coverage@1.0.2': resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} - '@changesets/apply-release-plan@7.0.12': - resolution: {integrity: sha512-EaET7As5CeuhTzvXTQCRZeBUcisoYPDDcXvgTE/2jmmypKp0RC7LxKj/yzqeh/1qFTZI7oDGFcL1PHRuQuketQ==} + '@changesets/apply-release-plan@7.0.13': + resolution: {integrity: sha512-BIW7bofD2yAWoE8H4V40FikC+1nNFEKBisMECccS16W1rt6qqhNTBDmIw5HaqmMgtLNz9e7oiALiEUuKrQ4oHg==} '@changesets/assemble-release-plan@6.0.9': resolution: {integrity: sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ==} @@ -536,8 +582,8 @@ packages: '@changesets/changelog-git@0.2.1': resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} - '@changesets/cli@2.29.5': - resolution: {integrity: sha512-0j0cPq3fgxt2dPdFsg4XvO+6L66RC0pZybT9F4dG5TBrLA3jA/1pNkdTXH9IBBVHkgsKrNKenI3n1mPyPlIydg==} + '@changesets/cli@2.29.7': + resolution: {integrity: sha512-R7RqWoaksyyKXbKXBTbT4REdy22yH81mcFK6sWtqSanxUCbUi9Uf+6aqxZtDQouIqPdem2W56CdxXgsxdq7FLQ==} hasBin: true '@changesets/config@3.1.1': @@ -586,167 +632,323 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@emnapi/runtime@1.5.0': - resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} + '@emnapi/runtime@1.7.1': + resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} - '@esbuild/aix-ppc64@0.25.8': - resolution: {integrity: sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==} + '@esbuild/aix-ppc64@0.25.11': + resolution: {integrity: sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.8': - resolution: {integrity: sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==} + '@esbuild/aix-ppc64@0.27.0': + resolution: {integrity: sha512-KuZrd2hRjz01y5JK9mEBSD3Vj3mbCvemhT466rSuJYeE/hjuBrHfjjcjMdTm/sz7au+++sdbJZJmuBwQLuw68A==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.11': + resolution: {integrity: sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.27.0': + resolution: {integrity: sha512-CC3vt4+1xZrs97/PKDkl0yN7w8edvU2vZvAFGD16n9F0Cvniy5qvzRXjfO1l94efczkkQE6g1x0i73Qf5uthOQ==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.8': - resolution: {integrity: sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==} + '@esbuild/android-arm@0.25.11': + resolution: {integrity: sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.8': - resolution: {integrity: sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==} + '@esbuild/android-arm@0.27.0': + resolution: {integrity: sha512-j67aezrPNYWJEOHUNLPj9maeJte7uSMM6gMoxfPC9hOg8N02JuQi/T7ewumf4tNvJadFkvLZMlAq73b9uwdMyQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.11': + resolution: {integrity: sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.27.0': + resolution: {integrity: sha512-wurMkF1nmQajBO1+0CJmcN17U4BP6GqNSROP8t0X/Jiw2ltYGLHpEksp9MpoBqkrFR3kv2/te6Sha26k3+yZ9Q==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.8': - resolution: {integrity: sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==} + '@esbuild/darwin-arm64@0.25.11': + resolution: {integrity: sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.27.0': + resolution: {integrity: sha512-uJOQKYCcHhg07DL7i8MzjvS2LaP7W7Pn/7uA0B5S1EnqAirJtbyw4yC5jQ5qcFjHK9l6o/MX9QisBg12kNkdHg==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.8': - resolution: {integrity: sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==} + '@esbuild/darwin-x64@0.25.11': + resolution: {integrity: sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.8': - resolution: {integrity: sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==} + '@esbuild/darwin-x64@0.27.0': + resolution: {integrity: sha512-8mG6arH3yB/4ZXiEnXof5MK72dE6zM9cDvUcPtxhUZsDjESl9JipZYW60C3JGreKCEP+p8P/72r69m4AZGJd5g==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.11': + resolution: {integrity: sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.27.0': + resolution: {integrity: sha512-9FHtyO988CwNMMOE3YIeci+UV+x5Zy8fI2qHNpsEtSF83YPBmE8UWmfYAQg6Ux7Gsmd4FejZqnEUZCMGaNQHQw==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.8': - resolution: {integrity: sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==} + '@esbuild/freebsd-x64@0.25.11': + resolution: {integrity: sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.8': - resolution: {integrity: sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==} + '@esbuild/freebsd-x64@0.27.0': + resolution: {integrity: sha512-zCMeMXI4HS/tXvJz8vWGexpZj2YVtRAihHLk1imZj4efx1BQzN76YFeKqlDr3bUWI26wHwLWPd3rwh6pe4EV7g==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.11': + resolution: {integrity: sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.27.0': + resolution: {integrity: sha512-AS18v0V+vZiLJyi/4LphvBE+OIX682Pu7ZYNsdUHyUKSoRwdnOsMf6FDekwoAFKej14WAkOef3zAORJgAtXnlQ==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.8': - resolution: {integrity: sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==} + '@esbuild/linux-arm@0.25.11': + resolution: {integrity: sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.8': - resolution: {integrity: sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==} + '@esbuild/linux-arm@0.27.0': + resolution: {integrity: sha512-t76XLQDpxgmq2cNXKTVEB7O7YMb42atj2Re2Haf45HkaUpjM2J0UuJZDuaGbPbamzZ7bawyGFUkodL+zcE+jvQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.11': + resolution: {integrity: sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.27.0': + resolution: {integrity: sha512-Mz1jxqm/kfgKkc/KLHC5qIujMvnnarD9ra1cEcrs7qshTUSksPihGrWHVG5+osAIQ68577Zpww7SGapmzSt4Nw==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.8': - resolution: {integrity: sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==} + '@esbuild/linux-loong64@0.25.11': + resolution: {integrity: sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.27.0': + resolution: {integrity: sha512-QbEREjdJeIreIAbdG2hLU1yXm1uu+LTdzoq1KCo4G4pFOLlvIspBm36QrQOar9LFduavoWX2msNFAAAY9j4BDg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.8': - resolution: {integrity: sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==} + '@esbuild/linux-mips64el@0.25.11': + resolution: {integrity: sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.8': - resolution: {integrity: sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==} + '@esbuild/linux-mips64el@0.27.0': + resolution: {integrity: sha512-sJz3zRNe4tO2wxvDpH/HYJilb6+2YJxo/ZNbVdtFiKDufzWq4JmKAiHy9iGoLjAV7r/W32VgaHGkk35cUXlNOg==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.11': + resolution: {integrity: sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.27.0': + resolution: {integrity: sha512-z9N10FBD0DCS2dmSABDBb5TLAyF1/ydVb+N4pi88T45efQ/w4ohr/F/QYCkxDPnkhkp6AIpIcQKQ8F0ANoA2JA==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.8': - resolution: {integrity: sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==} + '@esbuild/linux-riscv64@0.25.11': + resolution: {integrity: sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.8': - resolution: {integrity: sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==} + '@esbuild/linux-riscv64@0.27.0': + resolution: {integrity: sha512-pQdyAIZ0BWIC5GyvVFn5awDiO14TkT/19FTmFcPdDec94KJ1uZcmFs21Fo8auMXzD4Tt+diXu1LW1gHus9fhFQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.11': + resolution: {integrity: sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.27.0': + resolution: {integrity: sha512-hPlRWR4eIDDEci953RI1BLZitgi5uqcsjKMxwYfmi4LcwyWo2IcRP+lThVnKjNtk90pLS8nKdroXYOqW+QQH+w==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.8': - resolution: {integrity: sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==} + '@esbuild/linux-x64@0.25.11': + resolution: {integrity: sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.8': - resolution: {integrity: sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==} + '@esbuild/linux-x64@0.27.0': + resolution: {integrity: sha512-1hBWx4OUJE2cab++aVZ7pObD6s+DK4mPGpemtnAORBvb5l/g5xFGk0vc0PjSkrDs0XaXj9yyob3d14XqvnQ4gw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.11': + resolution: {integrity: sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-arm64@0.27.0': + resolution: {integrity: sha512-6m0sfQfxfQfy1qRuecMkJlf1cIzTOgyaeXaiVaaki8/v+WB+U4hc6ik15ZW6TAllRlg/WuQXxWj1jx6C+dfy3w==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.8': - resolution: {integrity: sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==} + '@esbuild/netbsd-x64@0.25.11': + resolution: {integrity: sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.27.0': + resolution: {integrity: sha512-xbbOdfn06FtcJ9d0ShxxvSn2iUsGd/lgPIO2V3VZIPDbEaIj1/3nBBe1AwuEZKXVXkMmpr6LUAgMkLD/4D2PPA==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.8': - resolution: {integrity: sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==} + '@esbuild/openbsd-arm64@0.25.11': + resolution: {integrity: sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.8': - resolution: {integrity: sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==} + '@esbuild/openbsd-arm64@0.27.0': + resolution: {integrity: sha512-fWgqR8uNbCQ/GGv0yhzttj6sU/9Z5/Sv/VGU3F5OuXK6J6SlriONKrQ7tNlwBrJZXRYk5jUhuWvF7GYzGguBZQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.11': + resolution: {integrity: sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.27.0': + resolution: {integrity: sha512-aCwlRdSNMNxkGGqQajMUza6uXzR/U0dIl1QmLjPtRbLOx3Gy3otfFu/VjATy4yQzo9yFDGTxYDo1FfAD9oRD2A==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.25.8': - resolution: {integrity: sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==} + '@esbuild/openharmony-arm64@0.25.11': + resolution: {integrity: sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.25.8': - resolution: {integrity: sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==} + '@esbuild/openharmony-arm64@0.27.0': + resolution: {integrity: sha512-nyvsBccxNAsNYz2jVFYwEGuRRomqZ149A39SHWk4hV0jWxKM0hjBPm3AmdxcbHiFLbBSwG6SbpIcUbXjgyECfA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.11': + resolution: {integrity: sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.27.0': + resolution: {integrity: sha512-Q1KY1iJafM+UX6CFEL+F4HRTgygmEW568YMqDA5UV97AuZSm21b7SXIrRJDwXWPzr8MGr75fUZPV67FdtMHlHA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.8': - resolution: {integrity: sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==} + '@esbuild/win32-arm64@0.25.11': + resolution: {integrity: sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.8': - resolution: {integrity: sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==} + '@esbuild/win32-arm64@0.27.0': + resolution: {integrity: sha512-W1eyGNi6d+8kOmZIwi/EDjrL9nxQIQ0MiGqe/AWc6+IaHloxHSGoeRgDRKHFISThLmsewZ5nHFvGFWdBYlgKPg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.11': + resolution: {integrity: sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.27.0': + resolution: {integrity: sha512-30z1aKL9h22kQhilnYkORFYt+3wp7yZsHWus+wSKAJR8JtdfI76LJ4SBdMsCopTR3z/ORqVu5L1vtnHZWVj4cQ==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.8': - resolution: {integrity: sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==} + '@esbuild/win32-x64@0.25.11': + resolution: {integrity: sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.27.0': + resolution: {integrity: sha512-aIitBcjQeyOhMTImhLZmtxfdOcuNRpwlPNmlFKPcHQYPhEssw75Cl1TSXJXpMkzaua9FUetx/4OQKq7eJul5Cg==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.7.0': - resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} + '@eslint-community/eslint-utils@4.9.0': + resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 @@ -759,46 +961,42 @@ packages: resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/config-helpers@0.3.0': - resolution: {integrity: sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==} + '@eslint/config-helpers@0.4.0': + resolution: {integrity: sha512-WUFvV4WoIwW8Bv0KeKCIIEgdSiFOsulyN0xrMu+7z43q/hkOLXjvb5u7UC9jDxvRzcrbEmuZBX5yJZz1741jog==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.15.1': - resolution: {integrity: sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==} + '@eslint/core@0.16.0': + resolution: {integrity: sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/eslintrc@3.3.1': resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.31.0': - resolution: {integrity: sha512-LOm5OVt7D4qiKCqoiPbA7LWmI+tbw1VbTUowBcUMgQSuM6poJufkFkYDcQpo5KfgD39TnNySV26QjOh7VFpSyw==} + '@eslint/js@9.37.0': + resolution: {integrity: sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.6': resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.3.4': - resolution: {integrity: sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==} + '@eslint/plugin-kit@0.4.0': + resolution: {integrity: sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} - '@humanfs/node@0.16.6': - resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + '@humanfs/node@0.16.7': + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/retry@0.3.1': - resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} - engines: {node: '>=18.18'} - '@humanwhocodes/retry@0.4.3': resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} @@ -807,128 +1005,148 @@ packages: resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} engines: {node: '>=18'} - '@img/sharp-darwin-arm64@0.34.4': - resolution: {integrity: sha512-sitdlPzDVyvmINUdJle3TNHl+AG9QcwiAMsXmccqsCOMZNIdW2/7S26w0LyU8euiLVzFBL3dXPwVCq/ODnf2vA==} + '@img/sharp-darwin-arm64@0.34.5': + resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [darwin] - '@img/sharp-darwin-x64@0.34.4': - resolution: {integrity: sha512-rZheupWIoa3+SOdF/IcUe1ah4ZDpKBGWcsPX6MT0lYniH9micvIU7HQkYTfrx5Xi8u+YqwLtxC/3vl8TQN6rMg==} + '@img/sharp-darwin-x64@0.34.5': + resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [darwin] - '@img/sharp-libvips-darwin-arm64@1.2.3': - resolution: {integrity: sha512-QzWAKo7kpHxbuHqUC28DZ9pIKpSi2ts2OJnoIGI26+HMgq92ZZ4vk8iJd4XsxN+tYfNJxzH6W62X5eTcsBymHw==} + '@img/sharp-libvips-darwin-arm64@1.2.4': + resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} cpu: [arm64] os: [darwin] - '@img/sharp-libvips-darwin-x64@1.2.3': - resolution: {integrity: sha512-Ju+g2xn1E2AKO6YBhxjj+ACcsPQRHT0bhpglxcEf+3uyPY+/gL8veniKoo96335ZaPo03bdDXMv0t+BBFAbmRA==} + '@img/sharp-libvips-darwin-x64@1.2.4': + resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} cpu: [x64] os: [darwin] - '@img/sharp-libvips-linux-arm64@1.2.3': - resolution: {integrity: sha512-I4RxkXU90cpufazhGPyVujYwfIm9Nk1QDEmiIsaPwdnm013F7RIceaCc87kAH+oUB1ezqEvC6ga4m7MSlqsJvQ==} + '@img/sharp-libvips-linux-arm64@1.2.4': + resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} cpu: [arm64] os: [linux] - '@img/sharp-libvips-linux-arm@1.2.3': - resolution: {integrity: sha512-x1uE93lyP6wEwGvgAIV0gP6zmaL/a0tGzJs/BIDDG0zeBhMnuUPm7ptxGhUbcGs4okDJrk4nxgrmxpib9g6HpA==} + '@img/sharp-libvips-linux-arm@1.2.4': + resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} cpu: [arm] os: [linux] - '@img/sharp-libvips-linux-ppc64@1.2.3': - resolution: {integrity: sha512-Y2T7IsQvJLMCBM+pmPbM3bKT/yYJvVtLJGfCs4Sp95SjvnFIjynbjzsa7dY1fRJX45FTSfDksbTp6AGWudiyCg==} + '@img/sharp-libvips-linux-ppc64@1.2.4': + resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} cpu: [ppc64] os: [linux] - '@img/sharp-libvips-linux-s390x@1.2.3': - resolution: {integrity: sha512-RgWrs/gVU7f+K7P+KeHFaBAJlNkD1nIZuVXdQv6S+fNA6syCcoboNjsV2Pou7zNlVdNQoQUpQTk8SWDHUA3y/w==} + '@img/sharp-libvips-linux-riscv64@1.2.4': + resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} + cpu: [riscv64] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.2.4': + resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} cpu: [s390x] os: [linux] - '@img/sharp-libvips-linux-x64@1.2.3': - resolution: {integrity: sha512-3JU7LmR85K6bBiRzSUc/Ff9JBVIFVvq6bomKE0e63UXGeRw2HPVEjoJke1Yx+iU4rL7/7kUjES4dZ/81Qjhyxg==} + '@img/sharp-libvips-linux-x64@1.2.4': + resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} cpu: [x64] os: [linux] - '@img/sharp-libvips-linuxmusl-arm64@1.2.3': - resolution: {integrity: sha512-F9q83RZ8yaCwENw1GieztSfj5msz7GGykG/BA+MOUefvER69K/ubgFHNeSyUu64amHIYKGDs4sRCMzXVj8sEyw==} + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} cpu: [arm64] os: [linux] - '@img/sharp-libvips-linuxmusl-x64@1.2.3': - resolution: {integrity: sha512-U5PUY5jbc45ANM6tSJpsgqmBF/VsL6LnxJmIf11kB7J5DctHgqm0SkuXzVWtIY90GnJxKnC/JT251TDnk1fu/g==} + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} cpu: [x64] os: [linux] - '@img/sharp-linux-arm64@0.34.4': - resolution: {integrity: sha512-YXU1F/mN/Wu786tl72CyJjP/Ngl8mGHN1hST4BGl+hiW5jhCnV2uRVTNOcaYPs73NeT/H8Upm3y9582JVuZHrQ==} + '@img/sharp-linux-arm64@0.34.5': + resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linux-arm@0.34.4': - resolution: {integrity: sha512-Xyam4mlqM0KkTHYVSuc6wXRmM7LGN0P12li03jAnZ3EJWZqj83+hi8Y9UxZUbxsgsK1qOEwg7O0Bc0LjqQVtxA==} + '@img/sharp-linux-arm@0.34.5': + resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] - '@img/sharp-linux-ppc64@0.34.4': - resolution: {integrity: sha512-F4PDtF4Cy8L8hXA2p3TO6s4aDt93v+LKmpcYFLAVdkkD3hSxZzee0rh6/+94FpAynsuMpLX5h+LRsSG3rIciUQ==} + '@img/sharp-linux-ppc64@0.34.5': + resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ppc64] os: [linux] - '@img/sharp-linux-s390x@0.34.4': - resolution: {integrity: sha512-qVrZKE9Bsnzy+myf7lFKvng6bQzhNUAYcVORq2P7bDlvmF6u2sCmK2KyEQEBdYk+u3T01pVsPrkj943T1aJAsw==} + '@img/sharp-linux-riscv64@0.34.5': + resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [riscv64] + os: [linux] + + '@img/sharp-linux-s390x@0.34.5': + resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] - '@img/sharp-linux-x64@0.34.4': - resolution: {integrity: sha512-ZfGtcp2xS51iG79c6Vhw9CWqQC8l2Ot8dygxoDoIQPTat/Ov3qAa8qpxSrtAEAJW+UjTXc4yxCjNfxm4h6Xm2A==} + '@img/sharp-linux-x64@0.34.5': + resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-linuxmusl-arm64@0.34.4': - resolution: {integrity: sha512-8hDVvW9eu4yHWnjaOOR8kHVrew1iIX+MUgwxSuH2XyYeNRtLUe4VNioSqbNkB7ZYQJj9rUTT4PyRscyk2PXFKA==} + '@img/sharp-linuxmusl-arm64@0.34.5': + resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linuxmusl-x64@0.34.4': - resolution: {integrity: sha512-lU0aA5L8QTlfKjpDCEFOZsTYGn3AEiO6db8W5aQDxj0nQkVrZWmN3ZP9sYKWJdtq3PWPhUNlqehWyXpYDcI9Sg==} + '@img/sharp-linuxmusl-x64@0.34.5': + resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-wasm32@0.34.4': - resolution: {integrity: sha512-33QL6ZO/qpRyG7woB/HUALz28WnTMI2W1jgX3Nu2bypqLIKx/QKMILLJzJjI+SIbvXdG9fUnmrxR7vbi1sTBeA==} + '@img/sharp-wasm32@0.34.5': + resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [wasm32] - '@img/sharp-win32-arm64@0.34.4': - resolution: {integrity: sha512-2Q250do/5WXTwxW3zjsEuMSv5sUU4Tq9VThWKlU2EYLm4MB7ZeMwF+SFJutldYODXF6jzc6YEOC+VfX0SZQPqA==} + '@img/sharp-win32-arm64@0.34.5': + resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [win32] - '@img/sharp-win32-ia32@0.34.4': - resolution: {integrity: sha512-3ZeLue5V82dT92CNL6rsal6I2weKw1cYu+rGKm8fOCCtJTR2gYeUfY3FqUnIJsMUPIH68oS5jmZ0NiJ508YpEw==} + '@img/sharp-win32-ia32@0.34.5': + resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ia32] os: [win32] - '@img/sharp-win32-x64@0.34.4': - resolution: {integrity: sha512-xIyj4wpYs8J18sVN3mSQjwrw7fKUqRw+Z5rnHNCy5fYTxigBz81u5mOMPmFumwjcn8+ld1ppptMBCLic1nz6ig==} + '@img/sharp-win32-x64@0.34.5': + resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [win32] + '@inquirer/external-editor@1.0.2': + resolution: {integrity: sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@isaacs/balanced-match@4.0.1': resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} engines: {node: 20 || >=22} @@ -937,26 +1155,15 @@ packages: resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} engines: {node: 20 || >=22} - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - - '@istanbuljs/schema@0.1.3': - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - - '@jridgewell/gen-mapping@0.3.12': - resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} - '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/sourcemap-codec@1.5.4': - resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - '@jridgewell/trace-mapping@0.3.29': - resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} @@ -967,56 +1174,56 @@ packages: '@manypkg/get-packages@1.1.3': resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} - '@next/env@15.4.7': - resolution: {integrity: sha512-PrBIpO8oljZGTOe9HH0miix1w5MUiGJ/q83Jge03mHEE0E3pyqzAy2+l5G6aJDbXoobmxPJTVhbCuwlLtjSHwg==} + '@next/env@15.5.7': + resolution: {integrity: sha512-4h6Y2NyEkIEN7Z8YxkA27pq6zTkS09bUSYC0xjd0NpwFxjnIKeZEeH591o5WECSmjpUhLn3H2QLJcDye3Uzcvg==} - '@next/eslint-plugin-next@15.4.2': - resolution: {integrity: sha512-k0rjdWjXBY6tAOty1ckrMETE6Mx66d85NsgcAIdDp7/cXOsTJ93ywmbg3uUcpxX5TUHFEcCWI5mb8nPhwCe9jg==} + '@next/eslint-plugin-next@15.5.5': + resolution: {integrity: sha512-FMzm412l9oFB8zdRD+K6HQ1VzlS+sNNsdg0MfvTg0i8lfCyTgP/RFxiu/pGJqZ/IQnzn9xSiLkjOVI7Iv4nbdQ==} - '@next/swc-darwin-arm64@15.4.7': - resolution: {integrity: sha512-2Dkb+VUTp9kHHkSqtws4fDl2Oxms29HcZBwFIda1X7Ztudzy7M6XF9HDS2dq85TmdN47VpuhjE+i6wgnIboVzQ==} + '@next/swc-darwin-arm64@15.5.7': + resolution: {integrity: sha512-IZwtxCEpI91HVU/rAUOOobWSZv4P2DeTtNaCdHqLcTJU4wdNXgAySvKa/qJCgR5m6KI8UsKDXtO2B31jcaw1Yw==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@15.4.7': - resolution: {integrity: sha512-qaMnEozKdWezlmh1OGDVFueFv2z9lWTcLvt7e39QA3YOvZHNpN2rLs/IQLwZaUiw2jSvxW07LxMCWtOqsWFNQg==} + '@next/swc-darwin-x64@15.5.7': + resolution: {integrity: sha512-UP6CaDBcqaCBuiq/gfCEJw7sPEoX1aIjZHnBWN9v9qYHQdMKvCKcAVs4OX1vIjeE+tC5EIuwDTVIoXpUes29lg==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.4.7': - resolution: {integrity: sha512-ny7lODPE7a15Qms8LZiN9wjNWIeI+iAZOFDOnv2pcHStncUr7cr9lD5XF81mdhrBXLUP9yT9RzlmSWKIazWoDw==} + '@next/swc-linux-arm64-gnu@15.5.7': + resolution: {integrity: sha512-NCslw3GrNIw7OgmRBxHtdWFQYhexoUCq+0oS2ccjyYLtcn1SzGzeM54jpTFonIMUjNbHmpKpziXnpxhSWLcmBA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.4.7': - resolution: {integrity: sha512-4SaCjlFR/2hGJqZLLWycccy1t+wBrE/vyJWnYaZJhUVHccpGLG5q0C+Xkw4iRzUIkE+/dr90MJRUym3s1+vO8A==} + '@next/swc-linux-arm64-musl@15.5.7': + resolution: {integrity: sha512-nfymt+SE5cvtTrG9u1wdoxBr9bVB7mtKTcj0ltRn6gkP/2Nu1zM5ei8rwP9qKQP0Y//umK+TtkKgNtfboBxRrw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@15.4.7': - resolution: {integrity: sha512-2uNXjxvONyRidg00VwvlTYDwC9EgCGNzPAPYbttIATZRxmOZ3hllk/YYESzHZb65eyZfBR5g9xgCZjRAl9YYGg==} + '@next/swc-linux-x64-gnu@15.5.7': + resolution: {integrity: sha512-hvXcZvCaaEbCZcVzcY7E1uXN9xWZfFvkNHwbe/n4OkRhFWrs1J1QV+4U1BN06tXLdaS4DazEGXwgqnu/VMcmqw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.4.7': - resolution: {integrity: sha512-ceNbPjsFgLscYNGKSu4I6LYaadq2B8tcK116nVuInpHHdAWLWSwVK6CHNvCi0wVS9+TTArIFKJGsEyVD1H+4Kg==} + '@next/swc-linux-x64-musl@15.5.7': + resolution: {integrity: sha512-4IUO539b8FmF0odY6/SqANJdgwn1xs1GkPO5doZugwZ3ETF6JUdckk7RGmsfSf7ws8Qb2YB5It33mvNL/0acqA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@15.4.7': - resolution: {integrity: sha512-pZyxmY1iHlZJ04LUL7Css8bNvsYAMYOY9JRwFA3HZgpaNKsJSowD09Vg2R9734GxAcLJc2KDQHSCR91uD6/AAw==} + '@next/swc-win32-arm64-msvc@15.5.7': + resolution: {integrity: sha512-CpJVTkYI3ZajQkC5vajM7/ApKJUOlm6uP4BknM3XKvJ7VXAvCqSjSLmM0LKdYzn6nBJVSjdclx8nYJSa3xlTgQ==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@15.4.7': - resolution: {integrity: sha512-HjuwPJ7BeRzgl3KrjKqD2iDng0eQIpIReyhpF5r4yeAHFwWRuAhfW92rWv/r3qeQHEwHsLRzFDvMqRjyM5DI6A==} + '@next/swc-win32-x64-msvc@15.5.7': + resolution: {integrity: sha512-gMzgBX164I6DN+9/PGA+9dQiwmTkE4TloBNx8Kv9UiGARsr9Nba7IpcBRA1iTV9vwlYnrE3Uy6I7Aj6qLjQuqw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -1025,14 +1232,18 @@ packages: resolution: {integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==} engines: {node: ^14.21.3 || >=16} - '@noble/curves@1.9.2': - resolution: {integrity: sha512-HxngEd2XUcg9xi20JkwlLCtYwfoFw4JGkuZpT+WlsPD4gB/cxkvTD8fSsoAnphGZhFdZYKeQIPCuFlWPm1uE0g==} + '@noble/curves@1.9.1': + resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} engines: {node: ^14.21.3 || >=16} - '@noble/curves@1.9.4': - resolution: {integrity: sha512-2bKONnuM53lINoDrSmK8qP8W271ms7pygDhZt4SiLOoLwBtoHqeCFi6RG42V8zd3mLHuJFhU/Bmaqo4nX0/kBw==} + '@noble/curves@1.9.7': + resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} engines: {node: ^14.21.3 || >=16} + '@noble/hashes@1.4.0': + resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} + engines: {node: '>= 16'} + '@noble/hashes@1.8.0': resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} engines: {node: ^14.21.3 || >=16} @@ -1049,107 +1260,113 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - - '@rollup/rollup-android-arm-eabi@4.45.1': - resolution: {integrity: sha512-NEySIFvMY0ZQO+utJkgoMiCAjMrGvnbDLHvcmlA33UXJpYBCvlBEbMMtV837uCkS+plG2umfhn0T5mMAxGrlRA==} + '@rollup/rollup-android-arm-eabi@4.52.4': + resolution: {integrity: sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.45.1': - resolution: {integrity: sha512-ujQ+sMXJkg4LRJaYreaVx7Z/VMgBBd89wGS4qMrdtfUFZ+TSY5Rs9asgjitLwzeIbhwdEhyj29zhst3L1lKsRQ==} + '@rollup/rollup-android-arm64@4.52.4': + resolution: {integrity: sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.45.1': - resolution: {integrity: sha512-FSncqHvqTm3lC6Y13xncsdOYfxGSLnP+73k815EfNmpewPs+EyM49haPS105Rh4aF5mJKywk9X0ogzLXZzN9lA==} + '@rollup/rollup-darwin-arm64@4.52.4': + resolution: {integrity: sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.45.1': - resolution: {integrity: sha512-2/vVn/husP5XI7Fsf/RlhDaQJ7x9zjvC81anIVbr4b/f0xtSmXQTFcGIQ/B1cXIYM6h2nAhJkdMHTnD7OtQ9Og==} + '@rollup/rollup-darwin-x64@4.52.4': + resolution: {integrity: sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.45.1': - resolution: {integrity: sha512-4g1kaDxQItZsrkVTdYQ0bxu4ZIQ32cotoQbmsAnW1jAE4XCMbcBPDirX5fyUzdhVCKgPcrwWuucI8yrVRBw2+g==} + '@rollup/rollup-freebsd-arm64@4.52.4': + resolution: {integrity: sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.45.1': - resolution: {integrity: sha512-L/6JsfiL74i3uK1Ti2ZFSNsp5NMiM4/kbbGEcOCps99aZx3g8SJMO1/9Y0n/qKlWZfn6sScf98lEOUe2mBvW9A==} + '@rollup/rollup-freebsd-x64@4.52.4': + resolution: {integrity: sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.45.1': - resolution: {integrity: sha512-RkdOTu2jK7brlu+ZwjMIZfdV2sSYHK2qR08FUWcIoqJC2eywHbXr0L8T/pONFwkGukQqERDheaGTeedG+rra6Q==} + '@rollup/rollup-linux-arm-gnueabihf@4.52.4': + resolution: {integrity: sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.45.1': - resolution: {integrity: sha512-3kJ8pgfBt6CIIr1o+HQA7OZ9mp/zDk3ctekGl9qn/pRBgrRgfwiffaUmqioUGN9hv0OHv2gxmvdKOkARCtRb8Q==} + '@rollup/rollup-linux-arm-musleabihf@4.52.4': + resolution: {integrity: sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.45.1': - resolution: {integrity: sha512-k3dOKCfIVixWjG7OXTCOmDfJj3vbdhN0QYEqB+OuGArOChek22hn7Uy5A/gTDNAcCy5v2YcXRJ/Qcnm4/ma1xw==} + '@rollup/rollup-linux-arm64-gnu@4.52.4': + resolution: {integrity: sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.45.1': - resolution: {integrity: sha512-PmI1vxQetnM58ZmDFl9/Uk2lpBBby6B6rF4muJc65uZbxCs0EA7hhKCk2PKlmZKuyVSHAyIw3+/SiuMLxKxWog==} + '@rollup/rollup-linux-arm64-musl@4.52.4': + resolution: {integrity: sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.45.1': - resolution: {integrity: sha512-9UmI0VzGmNJ28ibHW2GpE2nF0PBQqsyiS4kcJ5vK+wuwGnV5RlqdczVocDSUfGX/Na7/XINRVoUgJyFIgipoRg==} + '@rollup/rollup-linux-loong64-gnu@4.52.4': + resolution: {integrity: sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.45.1': - resolution: {integrity: sha512-7nR2KY8oEOUTD3pBAxIBBbZr0U7U+R9HDTPNy+5nVVHDXI4ikYniH1oxQz9VoB5PbBU1CZuDGHkLJkd3zLMWsg==} + '@rollup/rollup-linux-ppc64-gnu@4.52.4': + resolution: {integrity: sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.45.1': - resolution: {integrity: sha512-nlcl3jgUultKROfZijKjRQLUu9Ma0PeNv/VFHkZiKbXTBQXhpytS8CIj5/NfBeECZtY2FJQubm6ltIxm/ftxpw==} + '@rollup/rollup-linux-riscv64-gnu@4.52.4': + resolution: {integrity: sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.45.1': - resolution: {integrity: sha512-HJV65KLS51rW0VY6rvZkiieiBnurSzpzore1bMKAhunQiECPuxsROvyeaot/tcK3A3aGnI+qTHqisrpSgQrpgA==} + '@rollup/rollup-linux-riscv64-musl@4.52.4': + resolution: {integrity: sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.45.1': - resolution: {integrity: sha512-NITBOCv3Qqc6hhwFt7jLV78VEO/il4YcBzoMGGNxznLgRQf43VQDae0aAzKiBeEPIxnDrACiMgbqjuihx08OOw==} + '@rollup/rollup-linux-s390x-gnu@4.52.4': + resolution: {integrity: sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.45.1': - resolution: {integrity: sha512-+E/lYl6qu1zqgPEnTrs4WysQtvc/Sh4fC2nByfFExqgYrqkKWp1tWIbe+ELhixnenSpBbLXNi6vbEEJ8M7fiHw==} + '@rollup/rollup-linux-x64-gnu@4.52.4': + resolution: {integrity: sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.45.1': - resolution: {integrity: sha512-a6WIAp89p3kpNoYStITT9RbTbTnqarU7D8N8F2CV+4Cl9fwCOZraLVuVFvlpsW0SbIiYtEnhCZBPLoNdRkjQFw==} + '@rollup/rollup-linux-x64-musl@4.52.4': + resolution: {integrity: sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.45.1': - resolution: {integrity: sha512-T5Bi/NS3fQiJeYdGvRpTAP5P02kqSOpqiopwhj0uaXB6nzs5JVi2XMJb18JUSKhCOX8+UE1UKQufyD6Or48dJg==} + '@rollup/rollup-openharmony-arm64@4.52.4': + resolution: {integrity: sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.52.4': + resolution: {integrity: sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.45.1': - resolution: {integrity: sha512-lxV2Pako3ujjuUe9jiU3/s7KSrDfH6IgTSQOnDWr9aJ92YsFd7EurmClK0ly/t8dzMkDtd04g60WX6yl0sGfdw==} + '@rollup/rollup-win32-ia32-msvc@4.52.4': + resolution: {integrity: sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.45.1': - resolution: {integrity: sha512-M/fKi4sasCdM8i0aWJjCSFm2qEnYRR8AMLG2kxp6wD13+tMGA4Z1tVAuHkNRjud5SW2EM3naLuK35w9twvf6aA==} + '@rollup/rollup-win32-x64-gnu@4.52.4': + resolution: {integrity: sha512-UF9KfsH9yEam0UjTwAgdK0anlQ7c8/pWPU2yVjyWcF1I1thABt6WXE47cI71pGiZ8wGvxohBoLnxM04L/wj8mQ==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.52.4': + resolution: {integrity: sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w==} cpu: [x64] os: [win32] @@ -1162,6 +1379,13 @@ packages: '@scure/bip39@1.6.0': resolution: {integrity: sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==} + '@sindresorhus/merge-streams@2.3.0': + resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} + engines: {node: '>=18'} + + '@standard-schema/spec@1.0.0': + resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} + '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} @@ -1213,29 +1437,19 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@20.19.23': - resolution: {integrity: sha512-yIdlVVVHXpmqRhtyovZAcSy0MiPcYWGkoO4CGe/+jpP0hmNuihm4XhHbADpK++MsiLHP5MVlv+bcgdF99kSiFQ==} - - '@types/node@20.19.9': - resolution: {integrity: sha512-cuVNgarYWZqxRJDQHEB58GEONhOK79QVR/qYx4S7kcUObQvUwvFnYxJuuHUKm2aieN9X3yZB4LZsuYNU1Qphsw==} - - '@types/node@22.16.5': - resolution: {integrity: sha512-bJFoMATwIGaxxx8VJPeM8TonI8t579oRvgAuT8zFugJsJZgzqv0Fu8Mhp68iecjzG7cnN3mO2dJQ5uUM2EFrgQ==} + '@types/node@20.19.21': + resolution: {integrity: sha512-CsGG2P3I5y48RPMfprQGfy4JPRZ6csfC3ltBZSRItG3ngggmNY/qs2uZKp4p9VbrpqNNSMzUZNFZKzgOGnd/VA==} - '@types/prop-types@15.7.15': - resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} + '@types/node@24.10.1': + resolution: {integrity: sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==} - '@types/react-dom@18.3.0': - resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} - - '@types/react-dom@18.3.1': - resolution: {integrity: sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==} - - '@types/react@18.3.0': - resolution: {integrity: sha512-DiUcKjzE6soLyln8NNZmyhcQjVv+WsUIFSqetMN0p8927OztKT4VTfFTqsbAi5oAGIcgOmOajlfBqyptDDjZRw==} + '@types/react-dom@19.2.3': + resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} + peerDependencies: + '@types/react': ^19.2.0 - '@types/react@18.3.1': - resolution: {integrity: sha512-V0kuGBX3+prX+DQ/7r2qsv1NsdfnCLnTgnRJ1pYnxykBhGMz+qj+box5lq7XsO5mtZsBqpjwwTu/7wszPfMBcw==} + '@types/react@19.2.6': + resolution: {integrity: sha512-p/jUvulfgU7oKtj6Xpk8cA2Y1xKTtICGpJYeJXz2YVO2UcvjQgeRMLDGfDeqeRW2Ta+0QNFwcc8X3GH8SxZz6w==} '@types/through@0.0.33': resolution: {integrity: sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==} @@ -1249,111 +1463,122 @@ packages: '@types/yargs-parser@21.0.3': resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} - '@types/yargs@17.0.33': - resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} + '@types/yargs@17.0.35': + resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} - '@typescript-eslint/eslint-plugin@8.38.0': - resolution: {integrity: sha512-CPoznzpuAnIOl4nhj4tRr4gIPj5AfKgkiJmGQDaq+fQnRJTYlcBjbX3wbciGmpoPf8DREufuPRe1tNMZnGdanA==} + '@typescript-eslint/eslint-plugin@8.46.1': + resolution: {integrity: sha512-rUsLh8PXmBjdiPY+Emjz9NX2yHvhS11v0SR6xNJkm5GM1MO9ea/1GoDKlHHZGrOJclL/cZ2i/vRUYVtjRhrHVQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.38.0 + '@typescript-eslint/parser': ^8.46.1 eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.38.0': - resolution: {integrity: sha512-Zhy8HCvBUEfBECzIl1PKqF4p11+d0aUJS1GeUiuqK9WmOug8YCmC4h4bjyBvMyAMI9sbRczmrYL5lKg/YMbrcQ==} + '@typescript-eslint/parser@8.46.1': + resolution: {integrity: sha512-6JSSaBZmsKvEkbRUkf7Zj7dru/8ZCrJxAqArcLaVMee5907JdtEbKGsZ7zNiIm/UAkpGUkaSMZEXShnN2D1HZA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.38.0': - resolution: {integrity: sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg==} + '@typescript-eslint/project-service@8.46.1': + resolution: {integrity: sha512-FOIaFVMHzRskXr5J4Jp8lFVV0gz5ngv3RHmn+E4HYxSJ3DgDzU7fVI1/M7Ijh1zf6S7HIoaIOtln1H5y8V+9Zg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@8.38.0': - resolution: {integrity: sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ==} + '@typescript-eslint/scope-manager@8.46.1': + resolution: {integrity: sha512-weL9Gg3/5F0pVQKiF8eOXFZp8emqWzZsOJuWRUNtHT+UNV2xSJegmpCNQHy37aEQIbToTq7RHKhWvOsmbM680A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.38.0': - resolution: {integrity: sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ==} + '@typescript-eslint/tsconfig-utils@8.46.1': + resolution: {integrity: sha512-X88+J/CwFvlJB+mK09VFqx5FE4H5cXD+H/Bdza2aEWkSb8hnWIQorNcscRl4IEo1Cz9VI/+/r/jnGWkbWPx54g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.38.0': - resolution: {integrity: sha512-c7jAvGEZVf0ao2z+nnz8BUaHZD09Agbh+DY7qvBQqLiz8uJzRgVPj5YvOh8I8uEiH8oIUGIfHzMwUcGVco/SJg==} + '@typescript-eslint/type-utils@8.46.1': + resolution: {integrity: sha512-+BlmiHIiqufBxkVnOtFwjah/vrkF4MtKKvpXrKSPLCkCtAp8H01/VV43sfqA98Od7nJpDcFnkwgyfQbOG0AMvw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@8.38.0': - resolution: {integrity: sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==} + '@typescript-eslint/types@8.46.1': + resolution: {integrity: sha512-C+soprGBHwWBdkDpbaRC4paGBrkIXxVlNohadL5o0kfhsXqOC6GYH2S/Obmig+I0HTDl8wMaRySwrfrXVP8/pQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.38.0': - resolution: {integrity: sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ==} + '@typescript-eslint/typescript-estree@8.46.1': + resolution: {integrity: sha512-uIifjT4s8cQKFQ8ZBXXyoUODtRoAd7F7+G8MKmtzj17+1UbdzFl52AzRyZRyKqPHhgzvXunnSckVu36flGy8cg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.38.0': - resolution: {integrity: sha512-hHcMA86Hgt+ijJlrD8fX0j1j8w4C92zue/8LOPAFioIno+W0+L7KqE8QZKCcPGc/92Vs9x36w/4MPTJhqXdyvg==} + '@typescript-eslint/utils@8.46.1': + resolution: {integrity: sha512-vkYUy6LdZS7q1v/Gxb2Zs7zziuXN0wxqsetJdeZdRe/f5dwJFglmuvZBfTUivCtjH725C1jWCDfpadadD95EDQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@8.38.0': - resolution: {integrity: sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g==} + '@typescript-eslint/visitor-keys@8.46.1': + resolution: {integrity: sha512-ptkmIf2iDkNUjdeu2bQqhFPV1m6qTnFFjg7PPDjxKWaMaP0Z6I9l30Jr3g5QqbZGdw8YdYvLp+XnqnWWZOg/NA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@vitest/coverage-v8@3.2.4': - resolution: {integrity: sha512-EyF9SXU6kS5Ku/U82E259WSnvg6c8KTjppUncuNdm5QHpe17mwREHnjDzozC8x9MZ0xfBUFSaLkRv4TMA75ALQ==} + '@vitest/coverage-v8@4.0.14': + resolution: {integrity: sha512-EYHLqN/BY6b47qHH7gtMxAg++saoGmsjWmAq9MlXxAz4M0NcHh9iOyKhBZyU4yxZqOd8Xnqp80/5saeitz4Cng==} peerDependencies: - '@vitest/browser': 3.2.4 - vitest: 3.2.4 + '@vitest/browser': 4.0.14 + vitest: 4.0.14 peerDependenciesMeta: '@vitest/browser': optional: true - '@vitest/expect@3.2.4': - resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} + '@vitest/expect@4.0.14': + resolution: {integrity: sha512-RHk63V3zvRiYOWAV0rGEBRO820ce17hz7cI2kDmEdfQsBjT2luEKB5tCOc91u1oSQoUOZkSv3ZyzkdkSLD7lKw==} - '@vitest/mocker@3.2.4': - resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} + '@vitest/mocker@4.0.14': + resolution: {integrity: sha512-RzS5NujlCzeRPF1MK7MXLiEFpkIXeMdQ+rN3Kk3tDI9j0mtbr7Nmuq67tpkOJQpgyClbOltCXMjLZicJHsH5Cg==} peerDependencies: msw: ^2.4.9 - vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + vite: ^6.0.0 || ^7.0.0-0 peerDependenciesMeta: msw: optional: true vite: optional: true - '@vitest/pretty-format@3.2.4': - resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} + '@vitest/pretty-format@4.0.14': + resolution: {integrity: sha512-SOYPgujB6TITcJxgd3wmsLl+wZv+fy3av2PpiPpsWPZ6J1ySUYfScfpIt2Yv56ShJXR2MOA6q2KjKHN4EpdyRQ==} - '@vitest/runner@3.2.4': - resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} + '@vitest/runner@4.0.14': + resolution: {integrity: sha512-BsAIk3FAqxICqREbX8SetIteT8PiaUL/tgJjmhxJhCsigmzzH8xeadtp7LRnTpCVzvf0ib9BgAfKJHuhNllKLw==} - '@vitest/snapshot@3.2.4': - resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} + '@vitest/snapshot@4.0.14': + resolution: {integrity: sha512-aQVBfT1PMzDSA16Y3Fp45a0q8nKexx6N5Amw3MX55BeTeZpoC08fGqEZqVmPcqN0ueZsuUQ9rriPMhZ3Mu19Ag==} - '@vitest/spy@3.2.4': - resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} + '@vitest/spy@4.0.14': + resolution: {integrity: sha512-JmAZT1UtZooO0tpY3GRyiC/8W7dCs05UOq9rfsUUgEZEdq+DuHLmWhPsrTt0TiW7WYeL/hXpaE07AZ2RCk44hg==} - '@vitest/utils@3.2.4': - resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + '@vitest/utils@4.0.14': + resolution: {integrity: sha512-hLqXZKAWNg8pI+SQXyXxWCTOpA3MvsqcbVeNgSi8x/CSN2wi26dSzn1wrOhmCmFjEvN9p8/kLFRHa6PI8jHazw==} - abitype@1.0.8: - resolution: {integrity: sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==} + abitype@1.1.0: + resolution: {integrity: sha512-6Vh4HcRxNMLA0puzPjM5GBgT4aAcFGKZzSgAXvuZ27shJP6NEpielTuqbBmZILR5/xd0PizkBGy5hReKz9jl5A==} peerDependencies: typescript: '>=5.0.4' - zod: ^3 >=3.22.0 + zod: ^3.22.0 || ^4.0.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + + abitype@1.1.1: + resolution: {integrity: sha512-Loe5/6tAgsBukY95eGaPSDmQHIjRZYQq8PB1MpsNccDIK8WiV+Uw6WzaIXipvaxTEL2yEB0OpEaQv3gs8pkS9Q==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3.22.0 || ^4.0.0 peerDependenciesMeta: typescript: optional: true @@ -1397,8 +1622,8 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.1.0: - resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} engines: {node: '>=12'} ansi-styles@3.2.1: @@ -1409,8 +1634,8 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} - ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} anymatch@3.1.3: @@ -1462,16 +1687,12 @@ packages: resolution: {integrity: sha512-UOCGPYbl0tv8+006qks/dTgV9ajs97X2p0FAbyS2iyCRrmLSRolDaHdp+v/CLgnzHc3fVB+CwYiUmei7ndFcgA==} engines: {node: '>=12.0.0'} - assertion-error@2.0.1: - resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} - engines: {node: '>=12'} - ast-types@0.13.4: resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} engines: {node: '>=4'} - ast-v8-to-istanbul@0.3.3: - resolution: {integrity: sha512-MuXMrSLVVoA6sYN/6Hke18vMzrT4TZNbZIj/hvh0fnYFpO+/kFXcLIaiPwXXWaQUPg4yJD8fj+lfJ7/1EBconw==} + ast-v8-to-istanbul@0.3.8: + resolution: {integrity: sha512-szgSZqUxI5T8mLKvS7WTjF9is+MVbOeLADU73IseOcrqhxr/VAvy6wfoVE39KnKzA7JRhjF5eUagNlHwvZPlKQ==} async-function@1.0.0: resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} @@ -1519,10 +1740,6 @@ packages: resolution: {integrity: sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==} engines: {node: '>=6.0.0'} - cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -1542,17 +1759,21 @@ packages: camel-case@3.0.0: resolution: {integrity: sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==} - caniuse-lite@1.0.30001743: - resolution: {integrity: sha512-e6Ojr7RV14Un7dz6ASD0aZDmQPT/A+eZU+nuTNfjqmRrmkmQlnTNWH0SKmqagx9PeW87UVqapSurtAXifmtdmw==} + caniuse-lite@1.0.30001759: + resolution: {integrity: sha512-Pzfx9fOKoKvevQf8oCXoyNRQ5QyxJj+3O0Rqx2V5oxT61KGx8+n6hV/IUyJeifUci2clnmmKVpvtiqRzgiWjSw==} cbor2@1.12.0: resolution: {integrity: sha512-3Cco8XQhi27DogSp9Ri6LYNZLi/TBY/JVnDe+mj06NkBjW/ZYOtekaEU4wZ4xcRMNrFkDv8KNtOAqHyDfz3lYg==} engines: {node: '>=18.7'} - chai@5.2.1: - resolution: {integrity: sha512-5nFxhUrX0PqtyogoYOA8IPswy5sZFTOsBFl/9bNsmDLgsxYTzSZQJDPppDnZPTQbzSEm0hqGjWPzRemQCYbD6A==} + chai@6.2.1: + resolution: {integrity: sha512-p4Z49OGG5W/WBCPSS/dH3jQ73kD6tiMmUM+bckNK6Jr5JHMG3k9bg/BvKR8lKmtVBKmOiuVaV2ws8s9oSbwysg==} engines: {node: '>=18'} + chalk-template@1.1.2: + resolution: {integrity: sha512-2bxTP2yUH7AJj/VAXfcA+4IcWGdQ87HwBANLt5XxGTeomo8yG0y95N1um9i5StvhT/Bl0/2cARA5v1PpPXUxUA==} + engines: {node: '>=14.16'} + chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -1565,15 +1786,18 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + change-case@3.1.0: resolution: {integrity: sha512-2AZp7uJZbYEzRPsFoa+ijKdvp9zsrnnt6+yFokfwEpeJm0xuJDVoxiRCAaTzyJND8GJkofo2IcKWaUZ/OECVzw==} chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - check-error@2.1.1: - resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} - engines: {node: '>= 16'} + chardet@2.1.0: + resolution: {integrity: sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==} chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} @@ -1591,6 +1815,10 @@ packages: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} + cli-cursor@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} + cli-spinners@2.9.2: resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} engines: {node: '>=6'} @@ -1606,6 +1834,10 @@ packages: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} + cliui@9.0.1: + resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==} + engines: {node: '>=20'} + clone@1.0.4: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} @@ -1627,19 +1859,32 @@ packages: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} engines: {node: '>=14'} + commander@13.1.0: + resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} + engines: {node: '>=18'} + concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - concurrently@8.2.2: - resolution: {integrity: sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==} - engines: {node: ^14.13.0 || >=16.0.0} + concurrently@9.2.1: + resolution: {integrity: sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==} + engines: {node: '>=18'} hasBin: true constant-case@2.0.0: resolution: {integrity: sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ==} - core-js-pure@3.44.0: - resolution: {integrity: sha512-gvMQAGB4dfVUxpYD0k3Fq8J+n5bB6Ytl15lqlZrOIXFzxOhtPaObfkQGHtMRdyjIf7z2IeNULwi1jEwyS+ltKQ==} + core-js-pure@3.46.0: + resolution: {integrity: sha512-NMCW30bHNofuhwLhYPt66OLOKTMbOhgTTatKVbaQC3KRHpTCiRIBYvtshr+NBYSnBxwAFhjW/RfJ0XbIjS16rw==} + + cosmiconfig@9.0.0: + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} @@ -1648,8 +1893,8 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} data-uri-to-buffer@6.0.2: resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} @@ -1667,12 +1912,8 @@ packages: resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} engines: {node: '>= 0.4'} - date-fns@2.30.0: - resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} - engines: {node: '>=0.11'} - - debug@4.4.1: - resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -1680,10 +1921,6 @@ packages: supports-color: optional: true - deep-eql@5.0.2: - resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} - engines: {node: '>=6'} - deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} @@ -1714,8 +1951,8 @@ packages: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} - detect-libc@2.1.0: - resolution: {integrity: sha512-vEtk+OcP7VBRtQZ1EJ3bdgzSfBjgnEalLTp5zjJrS+2Z1w2KZly4SBdac/WDU3hhsNAZ9E8SC96ME4Ey8MZ7cg==} + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} diff@4.0.2: @@ -1737,27 +1974,34 @@ packages: resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} engines: {node: '>=12'} - dotenv@16.6.1: - resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} + dotenv@17.2.3: + resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==} engines: {node: '>=12'} dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + effect@3.19.6: + resolution: {integrity: sha512-Eh1E/CI+xCAcMSDC5DtyE29yWJINC0zwBbwHappQPorjKyS69rCA8qzpsHpfhKnPDYgxdg8zkknii8mZ+6YMQA==} + + emoji-regex@10.6.0: + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + es-abstract@1.24.0: resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} engines: {node: '>= 0.4'} @@ -1793,8 +2037,13 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} - esbuild@0.25.8: - resolution: {integrity: sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==} + esbuild@0.25.11: + resolution: {integrity: sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==} + engines: {node: '>=18'} + hasBin: true + + esbuild@0.27.0: + resolution: {integrity: sha512-jd0f4NHbD6cALCyGElNpGAOtWxSq46l9X/sWB0Nzd5er4Kz2YTm+Vl0qKFT9KUJvD8+fiO8AvoHhFvEatfVixA==} engines: {node: '>=18'} hasBin: true @@ -1837,8 +2086,8 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - eslint-plugin-turbo@2.5.5: - resolution: {integrity: sha512-IlN65X6W7rgK88u5xl1xC+7FIGKA7eyaca0yxZQ9CBNV6keAaqtjZQLw8ZfXdv7T+MzTLYkYOeOHAv8yCRUx4Q==} + eslint-plugin-turbo@2.5.8: + resolution: {integrity: sha512-bVjx4vTH0oTKIyQ7EGFAXnuhZMrKIfu17qlex/dps7eScPnGQLJ3r1/nFq80l8xA+8oYjsSirSQ2tXOKbz3kEw==} peerDependencies: eslint: '>6.6.0' turbo: '>2.0.0' @@ -1855,8 +2104,8 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.31.0: - resolution: {integrity: sha512-QldCVh/ztyKJJZLr4jXNUByx3gR+TDYZCRXEktiZoUR3PGy4qCmSbkxcIle8GEwGpb5JBZazlaJ/CxLidXdEbQ==} + eslint@9.37.0: + resolution: {integrity: sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -1911,10 +2160,14 @@ packages: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} engines: {node: '>=4'} - fake-indexeddb@6.0.1: - resolution: {integrity: sha512-He2AjQGHe46svIFq5+L2Nx/eHDTI1oKgoevBP+TthnjymXiKkeJQ3+ITeWey99Y5+2OaPFbI1qEsx/5RsGtWnQ==} + fake-indexeddb@6.2.5: + resolution: {integrity: sha512-CGnyrvbhPlWYMngksqrSSUT1BAVP49dZocrHuK0SvtR0D5TMs5wP0o3j7jexDJW01KSadjBp1M/71o/KR3nD1w==} engines: {node: '>=18'} + fast-check@3.23.2: + resolution: {integrity: sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==} + engines: {node: '>=8.0.0'} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -1935,8 +2188,9 @@ packages: fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} - fdir@6.4.6: - resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -1974,10 +2228,6 @@ packages: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} - foreground-child@3.3.1: - resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} - engines: {node: '>=14'} - fs-extra@10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} @@ -2008,10 +2258,18 @@ packages: functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} + get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} + get-east-asian-width@1.4.0: + resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} + engines: {node: '>=18'} + get-intrinsic@1.3.0: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} @@ -2040,14 +2298,9 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob@10.4.5: - resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} - hasBin: true - - glob@11.0.3: - resolution: {integrity: sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==} + glob@13.0.0: + resolution: {integrity: sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==} engines: {node: 20 || >=22} - hasBin: true glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} @@ -2073,6 +2326,10 @@ packages: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} + globby@14.1.0: + resolution: {integrity: sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==} + engines: {node: '>=18'} + gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -2092,8 +2349,8 @@ packages: engines: {node: '>=0.4.7'} hasBin: true - happy-dom@20.0.2: - resolution: {integrity: sha512-pYOyu624+6HDbY+qkjILpQGnpvZOusItCk+rvF5/V+6NkcgTKnbOldpIy22tBnxoaLtlM9nXgoqAcW29/B7CIw==} + happy-dom@20.0.10: + resolution: {integrity: sha512-6umCCHcjQrhP5oXhrHQQvLB0bwb1UzHAHdsXy+FjtKoYjUhmNZsQL8NivwM1vDvNEChJabVrUYxUnp/ZdYmy2g==} engines: {node: '>=20.0.0'} has-bigints@1.1.0: @@ -2130,6 +2387,10 @@ packages: header-case@1.0.1: resolution: {integrity: sha512-i0q9mkOeSuhXw6bGgiQCCBgY/jlZuV/7dZXyZ9c6LcBrqwvT8eT719E9uxE5LiZftdl+z81Ugbg/VvXV4OJOeQ==} + hosted-git-info@8.1.0: + resolution: {integrity: sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==} + engines: {node: ^18.17.0 || >=20.5.0} + html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} @@ -2141,8 +2402,8 @@ packages: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} - human-id@4.1.1: - resolution: {integrity: sha512-3gKm/gCSUipeLsRYZbbdA1BD83lBoWUkZ7G9VFrhWPAU76KwYo5KR8V28bpoPm/ygy0x5/GCbpRQdY7VLYCoIg==} + human-id@4.1.2: + resolution: {integrity: sha512-v/J+4Z/1eIJovEBdlV5TYj1IR+ZiohcYGRY+qN/oC9dAfKzVT023N/Bgw37hrKCoVRBvk3bqyzpr2PP5YeTMSg==} hasBin: true human-signals@2.1.0: @@ -2153,8 +2414,12 @@ packages: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} - idb@7.1.1: - resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} + iconv-lite@0.7.0: + resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} + engines: {node: '>=0.10.0'} + + idb@8.0.3: + resolution: {integrity: sha512-LtwtVyVYO5BqRvcsKuB2iUMnHwPVByPCXFXOpuU96IZPPoPN6xjOGxZQ74pgSVVLQWtUOYgyeL4GE98BY5D3wg==} ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -2196,22 +2461,25 @@ packages: resolution: {integrity: sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==} engines: {node: '>=8.0.0'} - inquirer@8.2.6: - resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} + inquirer@8.2.7: + resolution: {integrity: sha512-UjOaSel/iddGZJ5xP/Eixh6dY1XghiBw4XK13rCCIJcJfyhhoul/7KhLLUGtebEj6GDYM6Vnx/mVsjx2L/mFIA==} engines: {node: '>=12.0.0'} internal-slot@1.1.0: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} - ip-address@9.0.5: - resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} + ip-address@10.0.1: + resolution: {integrity: sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==} engines: {node: '>= 12'} is-array-buffer@3.0.5: resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + is-async-function@2.1.1: resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} engines: {node: '>= 0.4'} @@ -2256,8 +2524,8 @@ packages: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - is-generator-function@1.1.0: - resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} engines: {node: '>= 0.4'} is-glob@4.0.3: @@ -2268,6 +2536,10 @@ packages: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} + is-interactive@2.0.0: + resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} + engines: {node: '>=12'} + is-lower-case@1.1.3: resolution: {integrity: sha512-+5A1e/WJpLLXZEDlgz4G//WYSHyQBD32qa4Jd3Lw06qQlv3fJHnp3YIHjTQSGzHMgzmVKz2ZP3rBxTHkPw/lxA==} @@ -2331,6 +2603,14 @@ packages: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} + is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} + is-upper-case@1.1.2: resolution: {integrity: sha512-GQYSJMgfeAmVwh9ixyk888l7OIhNAGKtY6QA+IrWlu9MDTCaXmeozOZ2S9Knj7bQwBO/H6J2kb+pbyTUiMNbsw==} @@ -2377,21 +2657,14 @@ packages: resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} engines: {node: '>=10'} - istanbul-reports@3.1.7: - resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + istanbul-reports@3.2.0: + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} engines: {node: '>=8'} iterator.prototype@1.1.5: resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} engines: {node: '>= 0.4'} - jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - - jackspeak@4.1.1: - resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} - engines: {node: 20 || >=22} - js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -2406,26 +2679,29 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true - jsbn@1.1.0: - resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} - json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} json-canonicalize@2.0.0: resolution: {integrity: sha512-yyrnK/mEm6Na3ChbJUWueXdapueW0p380RUyTW87XGb1ww8l8hU0pRrGC3vSWHe9CxrbPHX2fGUOZpNiHR0IIg==} + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + jsonc-parser@3.3.1: + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} jsx-ast-utils@3.3.5: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} @@ -2438,64 +2714,71 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - lefthook-darwin-arm64@1.12.2: - resolution: {integrity: sha512-fTxeI9tEskrHjc3QyEO+AG7impBXY2Ed8V5aiRc3fw9POfYtVh9b5jRx90fjk2+ld5hf+Z1DsyyLq/vOHDFskQ==} + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + lefthook-darwin-arm64@2.0.4: + resolution: {integrity: sha512-AR63/O5UkM7Sc6x5PhP4vTuztTYRBeBroXApeWGM/8e5uZyoQug/7KTh7xhbCMDf8WJv6vdFeXAQCPSmDyPU3Q==} cpu: [arm64] os: [darwin] - lefthook-darwin-x64@1.12.2: - resolution: {integrity: sha512-T1dCDKAAfdHgYZ8qtrS02SJSHoR52RFcrGArFNll9Mu4ZSV19Sp8BO+kTwDUOcLYdcPGNaqOp9PkRBQGZWQC7g==} + lefthook-darwin-x64@2.0.4: + resolution: {integrity: sha512-618DVUttSzV9egQiqTQoxGfnR240JoPWYmqRVHhiegnQKZ2lp5XJ+7NMxeRk/ih93VVOLzFO5ky3PbpxTmJgjQ==} cpu: [x64] os: [darwin] - lefthook-freebsd-arm64@1.12.2: - resolution: {integrity: sha512-2n9z7Q4BKeMBoB9cuEdv0UBQH82Z4GgBQpCrfjCtyzpDnYQwrH8Tkrlnlko4qPh9MM6nLLGIYMKsA5nltzo8Cg==} + lefthook-freebsd-arm64@2.0.4: + resolution: {integrity: sha512-mTAQym1BK38fKglHBQ/0GXPznVC4LoStHO5lAI3ZxaEC0FQetqGHYFzhWbIH5sde9JhztE2rL/aBzMHDoAtzSw==} cpu: [arm64] os: [freebsd] - lefthook-freebsd-x64@1.12.2: - resolution: {integrity: sha512-1hNY/irY+/3kjRzKoJYxG+m3BYI8QxopJUK1PQnknGo1Wy5u302SdX+tR7pnpz6JM5chrNw4ozSbKKOvdZ5VEw==} + lefthook-freebsd-x64@2.0.4: + resolution: {integrity: sha512-sy02aSxd8UMd6XmiPFVl/Em0b78jdZcDSsLwg+bweJQQk0l+vJhOfqFiG11mbnpo+EBIZmRe6OH5LkxeSU36+w==} cpu: [x64] os: [freebsd] - lefthook-linux-arm64@1.12.2: - resolution: {integrity: sha512-1W4swYIVRkxq/LFTuuK4oVpd6NtTKY4E3VY2Uq2JDkIOJV46+8qGBF+C/QA9K3O9chLffgN7c+i+NhIuGiZ/Vw==} + lefthook-linux-arm64@2.0.4: + resolution: {integrity: sha512-W0Nlr/Cz2QTH9n4k5zNrk3LSsg1C4wHiJi8hrAiQVTaAV/N1XrKqd0DevqQuouuapG6pw/6B1xCgiNPebv9oyw==} cpu: [arm64] os: [linux] - lefthook-linux-x64@1.12.2: - resolution: {integrity: sha512-J6VGuMfhq5iCsg1Pv7xULbuXC63gP5LaikT0PhkyBNMi3HQneZFDJ8k/sp0Ue9HkQv6QfWIo3/FgB9gz38MCFw==} + lefthook-linux-x64@2.0.4: + resolution: {integrity: sha512-N6ySVCtB/DrOZ1ZgPL8WBZTgtoVHvcPKI+LV5wbcGrvA/dzDZFvniadrbDWZg7Tm705efiQzyENjwhhqNkwiww==} cpu: [x64] os: [linux] - lefthook-openbsd-arm64@1.12.2: - resolution: {integrity: sha512-wncDRW3ml24DaOyH22KINumjvCohswbQqbxyH2GORRCykSnE859cTjOrRIchTKBIARF7PSeGPUtS7EK0+oDbaw==} + lefthook-openbsd-arm64@2.0.4: + resolution: {integrity: sha512-VmOhJO3pYzZ/1C2WFXtL/n5pq4/eYOroqJJpwTJfmCHyw4ceLACu8MDyU5AMJhGMkbL8mPxGInJKxg5xhYgGRw==} cpu: [arm64] os: [openbsd] - lefthook-openbsd-x64@1.12.2: - resolution: {integrity: sha512-2jDOkCHNnc/oK/vR62hAf3vZb1EQ6Md2GjIlgZ/V7A3ztOsM8QZ5IxwYN3D1UOIR5ZnwMBy7PtmTJC/HJrig5w==} + lefthook-openbsd-x64@2.0.4: + resolution: {integrity: sha512-U8MZz1xlHUdflkQQ2hkMQsei6fSZbs8tuE4EjCIHWnNdnAF4V8sZ6n1KbxsJcoZXPyBZqxZSMu1o/Ye8IAMVKg==} cpu: [x64] os: [openbsd] - lefthook-windows-arm64@1.12.2: - resolution: {integrity: sha512-ZMH/q6UNSidhHEG/1QoqIl1n4yPTBWuVmKx5bONtKHicoz4QCQ+QEiNjKsG5OO4C62nfyHGThmweCzZVUQECJw==} + lefthook-windows-arm64@2.0.4: + resolution: {integrity: sha512-543H3y2JAwNdvwUQ6nlNBG7rdKgoOUgzAa6pYcl6EoqicCRrjRmGhkJu7vUudkkrD2Wjm7tr9hU9poP2g5fRFQ==} cpu: [arm64] os: [win32] - lefthook-windows-x64@1.12.2: - resolution: {integrity: sha512-TqT2jIPcTQ9uwaw+v+DTmvnUHM/p7bbsSrPoPX+fRXSGLzFjyiY+12C9dObSwfCQq6rT70xqQJ9AmftJQsa5/Q==} + lefthook-windows-x64@2.0.4: + resolution: {integrity: sha512-UDEPK9RWKm60xsNOdS/DQOdFba0SFa4w3tpFMXK1AJzmRHhosoKrorXGhtTr6kcM0MGKOtYi8GHsm++ArZ9wvQ==} cpu: [x64] os: [win32] - lefthook@1.12.2: - resolution: {integrity: sha512-2CeTu5NcmoT9YnqsHTq/TF36MlqlzHzhivGx3DrXHwcff4TdvrkIwUTA56huM3Nlo5ODAF/0hlPzaKLmNHCBnQ==} + lefthook@2.0.4: + resolution: {integrity: sha512-GNCU2vQWM/UWjiEF23601aILi1aMbPke6viortH7wIO/oVGOCW0H6FdLez4XZDyqnHL9XkTnd0BBVrBbYVMLpA==} hasBin: true levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -2525,13 +2808,14 @@ packages: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} + log-symbols@6.0.0: + resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} + engines: {node: '>=18'} + loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true - loupe@3.1.4: - resolution: {integrity: sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==} - lower-case-first@1.0.2: resolution: {integrity: sha512-UuxaYakO7XeONbKrZf5FEgkantPf5DUqDayzP5VXZrtRPdH86s4kN47I8B3TW10S4QKiE3ziHNf3kRN//okHjA==} @@ -2541,19 +2825,19 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.1.0: - resolution: {integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==} + lru-cache@11.2.2: + resolution: {integrity: sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==} engines: {node: 20 || >=22} lru-cache@7.18.3: resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} engines: {node: '>=12'} - magic-string@0.30.17: - resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - magicast@0.3.5: - resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + magicast@0.5.1: + resolution: {integrity: sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==} make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} @@ -2581,8 +2865,12 @@ packages: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} - minimatch@10.0.3: - resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + + minimatch@10.1.1: + resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} engines: {node: 20 || >=22} minimatch@3.1.2: @@ -2636,8 +2924,8 @@ packages: resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} engines: {node: '>= 0.4.0'} - next@15.4.7: - resolution: {integrity: sha512-OcqRugwF7n7mC8OSYjvsZhhG1AYSvulor1EIUsIkbbEbf1qoE5EbH36Swj8WhF4cHqmDgkiam3z1c1W0J1Wifg==} + next@15.5.7: + resolution: {integrity: sha512-+t2/0jIJ48kUpGKkdlhgkv+zPTEOoXyr60qXe68eB/pl3CMJaLeIGjzp5D6Oqt25hCBiBTt8wEeeAzfJvUKnPQ==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: @@ -2664,8 +2952,8 @@ packages: resolution: {integrity: sha512-Cov028YhBZ5aB7MdMWJEmwyBig43aGL5WT4vdoB28Oitau1zZAcHUn8Sgfk9HM33TqhtLJ9PlM/O0Mv+QpV/4Q==} engines: {node: '>=8.9.4'} - nodemon@3.1.10: - resolution: {integrity: sha512-WDjw3pJ0/0jMFmyNDp3gvY2YizjLmmOUQo6DEBY+JgdvW/yQ9mEeSw6H5ythl5Ny2ytb7f9C2nIbjSxMNzbJXw==} + nodemon@3.1.11: + resolution: {integrity: sha512-is96t8F/1//UHAjNPHpbsNY46ELPpftGUoSVNXwUfMk/qdjSylYrWSu1XavVTBOn526kFiOR733ATgNBCQyH0g==} engines: {node: '>=10'} hasBin: true @@ -2673,6 +2961,10 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} + npm-package-arg@12.0.2: + resolution: {integrity: sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA==} + engines: {node: ^18.17.0 || >=20.5.0} + npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} @@ -2705,6 +2997,9 @@ packages: resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} engines: {node: '>= 0.4'} + obug@2.1.1: + resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -2712,6 +3007,10 @@ packages: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} + optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -2724,6 +3023,10 @@ packages: resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} engines: {node: '>=10'} + ora@8.2.0: + resolution: {integrity: sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==} + engines: {node: '>=18'} + os-tmpdir@1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} @@ -2735,16 +3038,8 @@ packages: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} - ox@0.7.2: - resolution: {integrity: sha512-JJHxdef3KqwQ8xW9H+UVLWaQiCUh/DeFN/Ii65XwbHTvSuXZveihTV2gs9hhLw5XEWPBrcH7sQBM0rqG7/QurQ==} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - ox@0.8.1: - resolution: {integrity: sha512-e+z5epnzV+Zuz91YYujecW8cF01mzmrUtWotJ0oEPym/G82uccs7q0WDHTYL3eiONbTUEvcZrptAKLgTBD3u2A==} + ox@0.9.17: + resolution: {integrity: sha512-rKAnhzhRU3Xh3hiko+i1ZxywZ55eWQzeS/Q4HRKLx2PqfHOolisZHErSsJVipGlmQKHW5qwOED/GighEw9dbLg==} peerDependencies: typescript: '>=5.4.0' peerDependenciesMeta: @@ -2804,6 +3099,10 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + pascal-case@2.0.1: resolution: {integrity: sha512-qjS4s8rBOJa2Xm0jmxXiyh1+OFf6ekCWOvUaRgAQSktzlTbMotS0nmG9gyYAybCWBcuP4fsBeRCKNwGBnMe2OQ==} @@ -2825,10 +3124,6 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} - path-scurry@2.0.0: resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} engines: {node: 20 || >=22} @@ -2837,13 +3132,13 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} + path-type@6.0.0: + resolution: {integrity: sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==} + engines: {node: '>=18'} + pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - pathval@2.0.1: - resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} - engines: {node: '>= 14.16'} - picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -2859,8 +3154,8 @@ packages: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} - pkijs@3.2.5: - resolution: {integrity: sha512-WX0la7n7CbnguuaIQoT4Fc0IJckPDOUldzOwlZ0nwpOcySS+Six/tXBdc0RX17J5o1To0SAr3xDJjDLsOfDFQA==} + pkijs@3.3.0: + resolution: {integrity: sha512-SVUpr7uqRNuR6w417k0aM8YrHWWhvMh4P0paIA+wWdOxPOLd7PCDZgt3/nooAyrrO1cjwPP2I1hd3h2P6hUQZQ==} engines: {node: '>=12.0.0'} possible-typed-array-names@1.1.0: @@ -2889,6 +3184,14 @@ packages: engines: {node: '>=14'} hasBin: true + proc-log@5.0.0: + resolution: {integrity: sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==} + engines: {node: ^18.17.0 || >=20.5.0} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} @@ -2906,6 +3209,9 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + pure-rand@6.1.0: + resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} + pvtsutils@1.3.6: resolution: {integrity: sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==} @@ -2913,8 +3219,8 @@ packages: resolution: {integrity: sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==} engines: {node: '>=6.0.0'} - quansync@0.2.10: - resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==} + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -2923,22 +3229,26 @@ packages: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true - react-dom@19.1.0: - resolution: {integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==} + react-dom@19.2.0: + resolution: {integrity: sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==} peerDependencies: - react: ^19.1.0 + react: ^19.2.0 react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - react@19.1.0: - resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} + react@19.2.0: + resolution: {integrity: sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==} engines: {node: '>=0.10.0'} read-yaml-file@1.1.0: resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} engines: {node: '>=6'} + read-yaml-file@2.1.0: + resolution: {integrity: sha512-UkRNRIwnhG+y7hpqnycCL/xbTk7+ia9VuVTC0S+zVbwd65DI9eUpRMfsWIGrCWxTU/mi+JW8cHQCrv+zfCbEPQ==} + engines: {node: '>=10.13'} + readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} @@ -2987,6 +3297,10 @@ packages: resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} engines: {node: '>=8'} + restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} + reusify@1.1.0: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -2996,13 +3310,13 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true - rimraf@6.0.1: - resolution: {integrity: sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==} + rimraf@6.1.2: + resolution: {integrity: sha512-cFCkPslJv7BAXJsYlK1dZsbP8/ZNLkCAQ0bi1hf5EKX2QHegmDFEFA6QhuYJlk7UDdc+02JjO80YSOrWPpw06g==} engines: {node: 20 || >=22} hasBin: true - rollup@4.45.1: - resolution: {integrity: sha512-4iya7Jb76fVpQyLoiVpzUrsjQ12r3dM7fIVz+4NwoYvZOShknRmiv+iu9CClZml5ZLGb0XMcYLutK6w9tgxHDw==} + rollup@4.52.4: + resolution: {integrity: sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -3038,15 +3352,15 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - scheduler@0.26.0: - resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.7.2: - resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} engines: {node: '>=10'} hasBin: true @@ -3065,8 +3379,8 @@ packages: resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} engines: {node: '>= 0.4'} - sharp@0.34.4: - resolution: {integrity: sha512-FUH39xp3SBPnxWvd5iib1X8XY7J0K0X7d93sie9CJg2PO8/7gmg89Nve6OjItK53/MlAushNNxteBYfM6DEuoA==} + sharp@0.34.5: + resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} shebang-command@2.0.0: @@ -3111,10 +3425,17 @@ packages: resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} engines: {node: '>=10'} + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} + slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} + smart-buffer@4.2.0: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} @@ -3126,8 +3447,8 @@ packages: resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} engines: {node: '>= 14'} - socks@2.8.6: - resolution: {integrity: sha512-pe4Y2yzru68lXCb38aAqRf5gvN8YdjP1lok5o0J7BOHljkyCGKVz7H3vpVIXKD27rj2giOJ7DwVyk/GWrPHDWA==} + socks@2.8.7: + resolution: {integrity: sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==} engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} source-map-js@1.2.1: @@ -3138,23 +3459,21 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - spawn-command@0.0.2: - resolution: {integrity: sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==} - spawndamnit@3.0.1: resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - sprintf-js@1.1.3: - resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} - stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - std-env@3.9.0: - resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + + stdin-discarder@0.2.2: + resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} + engines: {node: '>=18'} stop-iteration-iterator@1.1.0: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} @@ -3164,9 +3483,9 @@ packages: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} - string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} string.prototype.matchall@4.0.12: resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} @@ -3194,14 +3513,18 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} engines: {node: '>=12'} strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} + strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + strip-final-newline@2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} @@ -3214,9 +3537,6 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strip-literal@3.0.0: - resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} - styled-jsx@5.1.6: resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} engines: {node: '>= 12.0.0'} @@ -3249,17 +3569,22 @@ packages: swap-case@1.1.2: resolution: {integrity: sha512-BAmWG6/bx8syfc6qXPprof3Mn5vQgf5dwdUNJhsNqU9WdPt5P+ES/wQ5bxfijy8zwZgZZHslC3iAsxsuQMCzJQ==} + syncpack@13.0.4: + resolution: {integrity: sha512-kJ9VlRxNCsBD5pJAE29oXeBYbPLhEySQmK4HdpsLv81I6fcDDW17xeJqMwiU3H7/woAVsbgq25DJNS8BeiN5+w==} + engines: {node: '>=18.18.0'} + hasBin: true + term-size@2.2.1: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} - test-exclude@7.0.1: - resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} - engines: {node: '>=18'} - through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + tightrope@0.2.0: + resolution: {integrity: sha512-Kw36UHxJEELq2VUqdaSGR2/8cAsPgMtvX8uGVU6Jk26O66PhXec0A5ZnRYs47btbtwPDpXXF66+Fo3vimCM9aQ==} + engines: {node: '>=16'} + tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} @@ -3269,23 +3594,15 @@ packages: tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - tinyglobby@0.2.14: - resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} tinygradient@1.1.5: resolution: {integrity: sha512-8nIfc2vgQ4TeLnk2lFj4tRLvvJwEfQuabdsmvDdQPT0xlk9TaNtpGd6nNRxXoK6vQhN6RSzj+Cnp5tTQmpxmbw==} - tinypool@1.1.1: - resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} - engines: {node: ^18.0.0 || >=20.0.0} - - tinyrainbow@2.0.0: - resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} - engines: {node: '>=14.0.0'} - - tinyspy@4.0.3: - resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} + tinyrainbow@3.0.3: + resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} engines: {node: '>=14.0.0'} title-case@2.1.1: @@ -3327,44 +3644,81 @@ packages: '@swc/wasm': optional: true + ts-toolbelt@9.6.0: + resolution: {integrity: sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==} + tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - turbo-darwin-64@2.5.5: - resolution: {integrity: sha512-RYnTz49u4F5tDD2SUwwtlynABNBAfbyT2uU/brJcyh5k6lDLyNfYKdKmqd3K2ls4AaiALWrFKVSBsiVwhdFNzQ==} + turbo-darwin-64@2.6.1: + resolution: {integrity: sha512-Dm0HwhyZF4J0uLqkhUyCVJvKM9Rw7M03v3J9A7drHDQW0qAbIGBrUijQ8g4Q9Cciw/BXRRd8Uzkc3oue+qn+ZQ==} + cpu: [x64] + os: [darwin] + + turbo-darwin-64@2.6.2: + resolution: {integrity: sha512-nF9d/YAyrNkyXn9lp3ZtgXPb7fZsik3cUNe/sBvUO0G5YezUS/kDYYw77IdjizDzairz8pL2ITCTUreG2d5iZQ==} cpu: [x64] os: [darwin] - turbo-darwin-arm64@2.5.5: - resolution: {integrity: sha512-Tk+ZeSNdBobZiMw9aFypQt0DlLsWSFWu1ymqsAdJLuPoAH05qCfYtRxE1pJuYHcJB5pqI+/HOxtJoQ40726Btw==} + turbo-darwin-arm64@2.6.1: + resolution: {integrity: sha512-U0PIPTPyxdLsrC3jN7jaJUwgzX5sVUBsKLO7+6AL+OASaa1NbT1pPdiZoTkblBAALLP76FM0LlnsVQOnmjYhyw==} + cpu: [arm64] + os: [darwin] + + turbo-darwin-arm64@2.6.2: + resolution: {integrity: sha512-mmm0jFaVramST26XE1Lk2qjkjvLJHOe9f3TFjqY+aByjMK/ZmKE5WFPuCWo4L3xhwx+16T37rdPP//76loB3oA==} cpu: [arm64] os: [darwin] - turbo-linux-64@2.5.5: - resolution: {integrity: sha512-2/XvMGykD7VgsvWesZZYIIVXMlgBcQy+ZAryjugoTcvJv8TZzSU/B1nShcA7IAjZ0q7OsZ45uP2cOb8EgKT30w==} + turbo-linux-64@2.6.1: + resolution: {integrity: sha512-eM1uLWgzv89bxlK29qwQEr9xYWBhmO/EGiH22UGfq+uXr+QW1OvNKKMogSN65Ry8lElMH4LZh0aX2DEc7eC0Mw==} cpu: [x64] os: [linux] - turbo-linux-arm64@2.5.5: - resolution: {integrity: sha512-DW+8CjCjybu0d7TFm9dovTTVg1VRnlkZ1rceO4zqsaLrit3DgHnN4to4uwyuf9s2V/BwS3IYcRy+HG9BL596Iw==} + turbo-linux-64@2.6.2: + resolution: {integrity: sha512-IUMHjkVRJDUABGpi+iS1Le59aOl5DX88U5UT/mKaE7nNEjG465+a8UtYno56cZnLP+C6BkX4I93LFgYf9syjGQ==} + cpu: [x64] + os: [linux] + + turbo-linux-arm64@2.6.1: + resolution: {integrity: sha512-MFFh7AxAQAycXKuZDrbeutfWM5Ep0CEZ9u7zs4Hn2FvOViTCzIfEhmuJou3/a5+q5VX1zTxQrKGy+4Lf5cdpsA==} cpu: [arm64] os: [linux] - turbo-windows-64@2.5.5: - resolution: {integrity: sha512-q5p1BOy8ChtSZfULuF1BhFMYIx6bevXu4fJ+TE/hyNfyHJIfjl90Z6jWdqAlyaFLmn99X/uw+7d6T/Y/dr5JwQ==} + turbo-linux-arm64@2.6.2: + resolution: {integrity: sha512-0qQdZiimMUZj2Gfq87thYu0E02NaNcsB3lcEK/TD70Zzi7AxQoxye664Gis0Uao2j2L9/+05wC2btZ7SoFX3Gw==} + cpu: [arm64] + os: [linux] + + turbo-windows-64@2.6.1: + resolution: {integrity: sha512-buq7/VAN7KOjMYi4tSZT5m+jpqyhbRU2EUTTvp6V0Ii8dAkY2tAAjQN1q5q2ByflYWKecbQNTqxmVploE0LVwQ==} + cpu: [x64] + os: [win32] + + turbo-windows-64@2.6.2: + resolution: {integrity: sha512-BmMfFmt0VaoZL4NbtDq/dzGfjHsPoGU2+vFiZtkiYsttHY3fd/Dmgnu9PuRyJN1pv2M22q88rXO+dqYRHztLMw==} cpu: [x64] os: [win32] - turbo-windows-arm64@2.5.5: - resolution: {integrity: sha512-AXbF1KmpHUq3PKQwddMGoKMYhHsy5t1YBQO8HZ04HLMR0rWv9adYlQ8kaeQJTko1Ay1anOBFTqaxfVOOsu7+1Q==} + turbo-windows-arm64@2.6.1: + resolution: {integrity: sha512-7w+AD5vJp3R+FB0YOj1YJcNcOOvBior7bcHTodqp90S3x3bLgpr7tE6xOea1e8JkP7GK6ciKVUpQvV7psiwU5Q==} cpu: [arm64] os: [win32] - turbo@2.5.5: - resolution: {integrity: sha512-eZ7wI6KjtT1eBqCnh2JPXWNUAxtoxxfi6VdBdZFvil0ychCOTxbm7YLRBi1JSt7U3c+u3CLxpoPxLdvr/Npr3A==} + turbo-windows-arm64@2.6.2: + resolution: {integrity: sha512-0r4s4M/FgLxfjrdLPdqQUur8vZAtaWEi4jhkQ6wCIN2xzA9aee9IKwM53w7CQcjaLvWhT0AU7LTQHjFaHwxiKw==} + cpu: [arm64] + os: [win32] + + turbo@2.6.1: + resolution: {integrity: sha512-qBwXXuDT3rA53kbNafGbT5r++BrhRgx3sAo0cHoDAeG9g1ItTmUMgltz3Hy7Hazy1ODqNpR+C7QwqL6DYB52yA==} + hasBin: true + + turbo@2.6.2: + resolution: {integrity: sha512-LiQAFS6iWvnY8ViGtoPgduWBeuGH9B32XR4p8H8jxU5PudwyHiiyf1jQW0fCC8gCCTz9itkIbqZLIyUu5AG33w==} hasBin: true type-check@0.4.0: @@ -3391,20 +3745,20 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} - typescript-eslint@8.38.0: - resolution: {integrity: sha512-FsZlrYK6bPDGoLeZRuvx2v6qrM03I0U0SnfCLPs/XCCPCFD80xU9Pg09H/K+XFa68uJuZo7l/Xhs+eDRg2l3hg==} + typescript-eslint@8.46.1: + resolution: {integrity: sha512-VHgijW803JafdSsDO8I761r3SHrgk4T00IdyQ+/UsthtgPRsBWQLqoSxOolxTpxRKi1kGXK0bSz4CoAc9ObqJA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' - typescript@5.5.4: - resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} + typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} engines: {node: '>=14.17'} hasBin: true - typescript@5.8.3: - resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} hasBin: true @@ -3423,6 +3777,13 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + + unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} + universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -3446,8 +3807,8 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - uuid@11.1.0: - resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} + uuid@13.0.0: + resolution: {integrity: sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==} hasBin: true v8-compile-cache-lib@3.0.1: @@ -3457,21 +3818,20 @@ packages: resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - viem@2.33.0: - resolution: {integrity: sha512-SxBM3CmeU+LWLlBclV9MPdbuFV8mQEl0NeRc9iyYU4a7Xb5sr5oku3s/bRGTPpEP+1hCAHYpM09/ui3/dQ6EsA==} + validate-npm-package-name@6.0.2: + resolution: {integrity: sha512-IUoow1YUtvoBBC06dXs8bR8B9vuA3aJfmQNKMoaPG/OFsPmoQvw8xh+6Ye25Gx9DQhoEom3Pcu9MKHerm/NpUQ==} + engines: {node: ^18.17.0 || >=20.5.0} + + viem@2.40.3: + resolution: {integrity: sha512-feYfEpbgjRkZYQpwcgxqkWzjxHI5LSDAjcGetHHwDRuX9BRQHUdV8ohrCosCYpdEhus/RknD3/bOd4qLYVPPuA==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: typescript: optional: true - vite-node@3.2.4: - resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - - vite@7.0.5: - resolution: {integrity: sha512-1mncVwJxy2C9ThLwz0+2GKZyEXuC3MyWtAAlNftlZZXZDP3AJt5FmwcMit/IGGaNZ8ZOB2BNO/HFUB+CpN0NQw==} + vite@7.1.10: + resolution: {integrity: sha512-CmuvUBzVJ/e3HGxhg6cYk88NGgTnBoOo7ogtfJJ0fefUWAxN/WDSUa50o+oVBxuIhO8FoEZW0j2eW7sfjs5EtA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -3510,26 +3870,32 @@ packages: yaml: optional: true - vitest@3.2.4: - resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + vitest@4.0.14: + resolution: {integrity: sha512-d9B2J9Cm9dN9+6nxMnnNJKJCtcyKfnHj15N6YNJfaFHRLua/d3sRKU9RuKmO9mB0XdFtUizlxfz/VPbd3OxGhw==} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' - '@types/debug': ^4.1.12 - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.2.4 - '@vitest/ui': 3.2.4 + '@opentelemetry/api': ^1.9.0 + '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 4.0.14 + '@vitest/browser-preview': 4.0.14 + '@vitest/browser-webdriverio': 4.0.14 + '@vitest/ui': 4.0.14 happy-dom: '*' jsdom: '*' peerDependenciesMeta: '@edge-runtime/vm': optional: true - '@types/debug': + '@opentelemetry/api': optional: true '@types/node': optional: true - '@vitest/browser': + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': optional: true '@vitest/ui': optional: true @@ -3586,15 +3952,15 @@ packages: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} + wrap-ansi@9.0.2: + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} + engines: {node: '>=18'} wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@8.18.2: - resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} + ws@8.18.3: + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -3613,10 +3979,18 @@ packages: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} + yargs-parser@22.0.0: + resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + yargs@17.7.2: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} + yargs@18.0.0: + resolution: {integrity: sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} @@ -3630,37 +4004,38 @@ snapshots: '@0xsequence/tee-verifier@0.1.2': dependencies: cbor2: 1.12.0 - pkijs: 3.2.5 + pkijs: 3.3.0 - '@adraffy/ens-normalize@1.11.0': {} + '@adraffy/ens-normalize@1.11.1': {} - '@ampproject/remapping@2.3.0': + '@babel/code-frame@7.27.1': dependencies: - '@jridgewell/gen-mapping': 0.3.12 - '@jridgewell/trace-mapping': 0.3.29 + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 '@babel/helper-string-parser@7.27.1': {} - '@babel/helper-validator-identifier@7.27.1': {} + '@babel/helper-validator-identifier@7.28.5': {} - '@babel/parser@7.28.0': + '@babel/parser@7.28.5': dependencies: - '@babel/types': 7.28.1 + '@babel/types': 7.28.5 - '@babel/runtime-corejs3@7.28.0': + '@babel/runtime-corejs3@7.28.4': dependencies: - core-js-pure: 3.44.0 + core-js-pure: 3.46.0 - '@babel/runtime@7.27.6': {} + '@babel/runtime@7.28.4': {} - '@babel/types@7.28.1': + '@babel/types@7.28.5': dependencies: '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 '@bcoe/v8-coverage@1.0.2': {} - '@changesets/apply-release-plan@7.0.12': + '@changesets/apply-release-plan@7.0.13': dependencies: '@changesets/config': 3.1.1 '@changesets/get-version-range-type': 0.4.0 @@ -3674,7 +4049,7 @@ snapshots: outdent: 0.5.0 prettier: 2.8.8 resolve-from: 5.0.0 - semver: 7.7.2 + semver: 7.7.3 '@changesets/assemble-release-plan@6.0.9': dependencies: @@ -3683,15 +4058,15 @@ snapshots: '@changesets/should-skip-package': 0.1.2 '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 - semver: 7.7.2 + semver: 7.7.3 '@changesets/changelog-git@0.2.1': dependencies: '@changesets/types': 6.1.0 - '@changesets/cli@2.29.5': + '@changesets/cli@2.29.7(@types/node@24.10.1)': dependencies: - '@changesets/apply-release-plan': 7.0.12 + '@changesets/apply-release-plan': 7.0.13 '@changesets/assemble-release-plan': 6.0.9 '@changesets/changelog-git': 0.2.1 '@changesets/config': 3.1.1 @@ -3705,20 +4080,22 @@ snapshots: '@changesets/should-skip-package': 0.1.2 '@changesets/types': 6.1.0 '@changesets/write': 0.4.0 + '@inquirer/external-editor': 1.0.2(@types/node@24.10.1) '@manypkg/get-packages': 1.1.3 ansi-colors: 4.1.3 ci-info: 3.9.0 enquirer: 2.4.1 - external-editor: 3.1.0 fs-extra: 7.0.1 mri: 1.2.0 p-limit: 2.3.0 package-manager-detector: 0.2.11 picocolors: 1.1.1 resolve-from: 5.0.0 - semver: 7.7.2 + semver: 7.7.3 spawndamnit: 3.0.1 term-size: 2.2.1 + transitivePeerDependencies: + - '@types/node' '@changesets/config@3.1.1': dependencies: @@ -3739,7 +4116,7 @@ snapshots: '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 picocolors: 1.1.1 - semver: 7.7.2 + semver: 7.7.3 '@changesets/get-release-plan@4.0.13': dependencies: @@ -3769,129 +4146,207 @@ snapshots: '@changesets/types': 6.1.0 js-yaml: 3.14.1 - '@changesets/pre@2.0.2': - dependencies: - '@changesets/errors': 0.2.0 - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - fs-extra: 7.0.1 + '@changesets/pre@2.0.2': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + + '@changesets/read@0.6.5': + dependencies: + '@changesets/git': 3.0.4 + '@changesets/logger': 0.1.1 + '@changesets/parse': 0.4.1 + '@changesets/types': 6.1.0 + fs-extra: 7.0.1 + p-filter: 2.1.0 + picocolors: 1.1.1 + + '@changesets/should-skip-package@0.1.2': + dependencies: + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/types@4.1.0': {} + + '@changesets/types@6.1.0': {} + + '@changesets/write@0.4.0': + dependencies: + '@changesets/types': 6.1.0 + fs-extra: 7.0.1 + human-id: 4.1.2 + prettier: 2.8.8 + + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + + '@emnapi/runtime@1.7.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@esbuild/aix-ppc64@0.25.11': + optional: true + + '@esbuild/aix-ppc64@0.27.0': + optional: true + + '@esbuild/android-arm64@0.25.11': + optional: true + + '@esbuild/android-arm64@0.27.0': + optional: true + + '@esbuild/android-arm@0.25.11': + optional: true + + '@esbuild/android-arm@0.27.0': + optional: true + + '@esbuild/android-x64@0.25.11': + optional: true + + '@esbuild/android-x64@0.27.0': + optional: true + + '@esbuild/darwin-arm64@0.25.11': + optional: true + + '@esbuild/darwin-arm64@0.27.0': + optional: true + + '@esbuild/darwin-x64@0.25.11': + optional: true + + '@esbuild/darwin-x64@0.27.0': + optional: true + + '@esbuild/freebsd-arm64@0.25.11': + optional: true + + '@esbuild/freebsd-arm64@0.27.0': + optional: true + + '@esbuild/freebsd-x64@0.25.11': + optional: true + + '@esbuild/freebsd-x64@0.27.0': + optional: true + + '@esbuild/linux-arm64@0.25.11': + optional: true + + '@esbuild/linux-arm64@0.27.0': + optional: true - '@changesets/read@0.6.5': - dependencies: - '@changesets/git': 3.0.4 - '@changesets/logger': 0.1.1 - '@changesets/parse': 0.4.1 - '@changesets/types': 6.1.0 - fs-extra: 7.0.1 - p-filter: 2.1.0 - picocolors: 1.1.1 + '@esbuild/linux-arm@0.25.11': + optional: true - '@changesets/should-skip-package@0.1.2': - dependencies: - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 + '@esbuild/linux-arm@0.27.0': + optional: true - '@changesets/types@4.1.0': {} + '@esbuild/linux-ia32@0.25.11': + optional: true - '@changesets/types@6.1.0': {} + '@esbuild/linux-ia32@0.27.0': + optional: true - '@changesets/write@0.4.0': - dependencies: - '@changesets/types': 6.1.0 - fs-extra: 7.0.1 - human-id: 4.1.1 - prettier: 2.8.8 + '@esbuild/linux-loong64@0.25.11': + optional: true - '@cspotcode/source-map-support@0.8.1': - dependencies: - '@jridgewell/trace-mapping': 0.3.9 + '@esbuild/linux-loong64@0.27.0': + optional: true - '@emnapi/runtime@1.5.0': - dependencies: - tslib: 2.8.1 + '@esbuild/linux-mips64el@0.25.11': + optional: true + + '@esbuild/linux-mips64el@0.27.0': optional: true - '@esbuild/aix-ppc64@0.25.8': + '@esbuild/linux-ppc64@0.25.11': optional: true - '@esbuild/android-arm64@0.25.8': + '@esbuild/linux-ppc64@0.27.0': optional: true - '@esbuild/android-arm@0.25.8': + '@esbuild/linux-riscv64@0.25.11': optional: true - '@esbuild/android-x64@0.25.8': + '@esbuild/linux-riscv64@0.27.0': optional: true - '@esbuild/darwin-arm64@0.25.8': + '@esbuild/linux-s390x@0.25.11': optional: true - '@esbuild/darwin-x64@0.25.8': + '@esbuild/linux-s390x@0.27.0': optional: true - '@esbuild/freebsd-arm64@0.25.8': + '@esbuild/linux-x64@0.25.11': optional: true - '@esbuild/freebsd-x64@0.25.8': + '@esbuild/linux-x64@0.27.0': optional: true - '@esbuild/linux-arm64@0.25.8': + '@esbuild/netbsd-arm64@0.25.11': optional: true - '@esbuild/linux-arm@0.25.8': + '@esbuild/netbsd-arm64@0.27.0': optional: true - '@esbuild/linux-ia32@0.25.8': + '@esbuild/netbsd-x64@0.25.11': optional: true - '@esbuild/linux-loong64@0.25.8': + '@esbuild/netbsd-x64@0.27.0': optional: true - '@esbuild/linux-mips64el@0.25.8': + '@esbuild/openbsd-arm64@0.25.11': optional: true - '@esbuild/linux-ppc64@0.25.8': + '@esbuild/openbsd-arm64@0.27.0': optional: true - '@esbuild/linux-riscv64@0.25.8': + '@esbuild/openbsd-x64@0.25.11': optional: true - '@esbuild/linux-s390x@0.25.8': + '@esbuild/openbsd-x64@0.27.0': optional: true - '@esbuild/linux-x64@0.25.8': + '@esbuild/openharmony-arm64@0.25.11': optional: true - '@esbuild/netbsd-arm64@0.25.8': + '@esbuild/openharmony-arm64@0.27.0': optional: true - '@esbuild/netbsd-x64@0.25.8': + '@esbuild/sunos-x64@0.25.11': optional: true - '@esbuild/openbsd-arm64@0.25.8': + '@esbuild/sunos-x64@0.27.0': optional: true - '@esbuild/openbsd-x64@0.25.8': + '@esbuild/win32-arm64@0.25.11': optional: true - '@esbuild/openharmony-arm64@0.25.8': + '@esbuild/win32-arm64@0.27.0': optional: true - '@esbuild/sunos-x64@0.25.8': + '@esbuild/win32-ia32@0.25.11': optional: true - '@esbuild/win32-arm64@0.25.8': + '@esbuild/win32-ia32@0.27.0': optional: true - '@esbuild/win32-ia32@0.25.8': + '@esbuild/win32-x64@0.25.11': optional: true - '@esbuild/win32-x64@0.25.8': + '@esbuild/win32-x64@0.27.0': optional: true - '@eslint-community/eslint-utils@4.7.0(eslint@9.31.0)': + '@eslint-community/eslint-utils@4.9.0(eslint@9.37.0)': dependencies: - eslint: 9.31.0 + eslint: 9.37.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} @@ -3899,21 +4354,23 @@ snapshots: '@eslint/config-array@0.21.0': dependencies: '@eslint/object-schema': 2.1.6 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.3(supports-color@5.5.0) minimatch: 3.1.2 transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.3.0': {} + '@eslint/config-helpers@0.4.0': + dependencies: + '@eslint/core': 0.16.0 - '@eslint/core@0.15.1': + '@eslint/core@0.16.0': dependencies: '@types/json-schema': 7.0.15 '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.3(supports-color@5.5.0) espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 @@ -3924,209 +4381,215 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.31.0': {} + '@eslint/js@9.37.0': {} '@eslint/object-schema@2.1.6': {} - '@eslint/plugin-kit@0.3.4': + '@eslint/plugin-kit@0.4.0': dependencies: - '@eslint/core': 0.15.1 + '@eslint/core': 0.16.0 levn: 0.4.1 '@humanfs/core@0.19.1': {} - '@humanfs/node@0.16.6': + '@humanfs/node@0.16.7': dependencies: '@humanfs/core': 0.19.1 - '@humanwhocodes/retry': 0.3.1 + '@humanwhocodes/retry': 0.4.3 '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/retry@0.3.1': {} - '@humanwhocodes/retry@0.4.3': {} '@img/colour@1.0.0': optional: true - '@img/sharp-darwin-arm64@0.34.4': + '@img/sharp-darwin-arm64@0.34.5': optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.2.3 + '@img/sharp-libvips-darwin-arm64': 1.2.4 optional: true - '@img/sharp-darwin-x64@0.34.4': + '@img/sharp-darwin-x64@0.34.5': optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.2.3 + '@img/sharp-libvips-darwin-x64': 1.2.4 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.2.4': optional: true - '@img/sharp-libvips-darwin-arm64@1.2.3': + '@img/sharp-libvips-darwin-x64@1.2.4': optional: true - '@img/sharp-libvips-darwin-x64@1.2.3': + '@img/sharp-libvips-linux-arm64@1.2.4': optional: true - '@img/sharp-libvips-linux-arm64@1.2.3': + '@img/sharp-libvips-linux-arm@1.2.4': optional: true - '@img/sharp-libvips-linux-arm@1.2.3': + '@img/sharp-libvips-linux-ppc64@1.2.4': optional: true - '@img/sharp-libvips-linux-ppc64@1.2.3': + '@img/sharp-libvips-linux-riscv64@1.2.4': optional: true - '@img/sharp-libvips-linux-s390x@1.2.3': + '@img/sharp-libvips-linux-s390x@1.2.4': optional: true - '@img/sharp-libvips-linux-x64@1.2.3': + '@img/sharp-libvips-linux-x64@1.2.4': optional: true - '@img/sharp-libvips-linuxmusl-arm64@1.2.3': + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': optional: true - '@img/sharp-libvips-linuxmusl-x64@1.2.3': + '@img/sharp-libvips-linuxmusl-x64@1.2.4': optional: true - '@img/sharp-linux-arm64@0.34.4': + '@img/sharp-linux-arm64@0.34.5': optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.2.3 + '@img/sharp-libvips-linux-arm64': 1.2.4 optional: true - '@img/sharp-linux-arm@0.34.4': + '@img/sharp-linux-arm@0.34.5': optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.2.3 + '@img/sharp-libvips-linux-arm': 1.2.4 optional: true - '@img/sharp-linux-ppc64@0.34.4': + '@img/sharp-linux-ppc64@0.34.5': optionalDependencies: - '@img/sharp-libvips-linux-ppc64': 1.2.3 + '@img/sharp-libvips-linux-ppc64': 1.2.4 optional: true - '@img/sharp-linux-s390x@0.34.4': + '@img/sharp-linux-riscv64@0.34.5': optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.2.3 + '@img/sharp-libvips-linux-riscv64': 1.2.4 optional: true - '@img/sharp-linux-x64@0.34.4': + '@img/sharp-linux-s390x@0.34.5': optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.2.3 + '@img/sharp-libvips-linux-s390x': 1.2.4 optional: true - '@img/sharp-linuxmusl-arm64@0.34.4': + '@img/sharp-linux-x64@0.34.5': optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.2.3 + '@img/sharp-libvips-linux-x64': 1.2.4 optional: true - '@img/sharp-linuxmusl-x64@0.34.4': + '@img/sharp-linuxmusl-arm64@0.34.5': optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.2.3 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 optional: true - '@img/sharp-wasm32@0.34.4': - dependencies: - '@emnapi/runtime': 1.5.0 + '@img/sharp-linuxmusl-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 optional: true - '@img/sharp-win32-arm64@0.34.4': + '@img/sharp-wasm32@0.34.5': + dependencies: + '@emnapi/runtime': 1.7.1 optional: true - '@img/sharp-win32-ia32@0.34.4': + '@img/sharp-win32-arm64@0.34.5': optional: true - '@img/sharp-win32-x64@0.34.4': + '@img/sharp-win32-ia32@0.34.5': optional: true - '@isaacs/balanced-match@4.0.1': {} + '@img/sharp-win32-x64@0.34.5': + optional: true - '@isaacs/brace-expansion@5.0.0': + '@inquirer/external-editor@1.0.2(@types/node@20.19.21)': dependencies: - '@isaacs/balanced-match': 4.0.1 + chardet: 2.1.0 + iconv-lite: 0.7.0 + optionalDependencies: + '@types/node': 20.19.21 - '@isaacs/cliui@8.0.2': + '@inquirer/external-editor@1.0.2(@types/node@24.10.1)': dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 + chardet: 2.1.0 + iconv-lite: 0.7.0 + optionalDependencies: + '@types/node': 24.10.1 - '@istanbuljs/schema@0.1.3': {} + '@isaacs/balanced-match@4.0.1': {} - '@jridgewell/gen-mapping@0.3.12': + '@isaacs/brace-expansion@5.0.0': dependencies: - '@jridgewell/sourcemap-codec': 1.5.4 - '@jridgewell/trace-mapping': 0.3.29 + '@isaacs/balanced-match': 4.0.1 '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/sourcemap-codec@1.5.4': {} + '@jridgewell/sourcemap-codec@1.5.5': {} - '@jridgewell/trace-mapping@0.3.29': + '@jridgewell/trace-mapping@0.3.31': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.4 + '@jridgewell/sourcemap-codec': 1.5.5 '@jridgewell/trace-mapping@0.3.9': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.4 + '@jridgewell/sourcemap-codec': 1.5.5 '@manypkg/find-root@1.1.0': dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.4 '@types/node': 12.20.55 find-up: 4.1.0 fs-extra: 8.1.0 '@manypkg/get-packages@1.1.3': dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.4 '@changesets/types': 4.1.0 '@manypkg/find-root': 1.1.0 fs-extra: 8.1.0 globby: 11.1.0 read-yaml-file: 1.1.0 - '@next/env@15.4.7': {} + '@next/env@15.5.7': {} - '@next/eslint-plugin-next@15.4.2': + '@next/eslint-plugin-next@15.5.5': dependencies: fast-glob: 3.3.1 - '@next/swc-darwin-arm64@15.4.7': + '@next/swc-darwin-arm64@15.5.7': optional: true - '@next/swc-darwin-x64@15.4.7': + '@next/swc-darwin-x64@15.5.7': optional: true - '@next/swc-linux-arm64-gnu@15.4.7': + '@next/swc-linux-arm64-gnu@15.5.7': optional: true - '@next/swc-linux-arm64-musl@15.4.7': + '@next/swc-linux-arm64-musl@15.5.7': optional: true - '@next/swc-linux-x64-gnu@15.4.7': + '@next/swc-linux-x64-gnu@15.5.7': optional: true - '@next/swc-linux-x64-musl@15.4.7': + '@next/swc-linux-x64-musl@15.5.7': optional: true - '@next/swc-win32-arm64-msvc@15.4.7': + '@next/swc-win32-arm64-msvc@15.5.7': optional: true - '@next/swc-win32-x64-msvc@15.4.7': + '@next/swc-win32-x64-msvc@15.5.7': optional: true '@noble/ciphers@1.3.0': {} - '@noble/curves@1.9.2': + '@noble/curves@1.9.1': dependencies: '@noble/hashes': 1.8.0 - '@noble/curves@1.9.4': + '@noble/curves@1.9.7': dependencies: '@noble/hashes': 1.8.0 + '@noble/hashes@1.4.0': {} + '@noble/hashes@1.8.0': {} '@nodelib/fs.scandir@2.1.5': @@ -4141,74 +4604,77 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 - '@pkgjs/parseargs@0.11.0': + '@rollup/rollup-android-arm-eabi@4.52.4': + optional: true + + '@rollup/rollup-android-arm64@4.52.4': optional: true - '@rollup/rollup-android-arm-eabi@4.45.1': + '@rollup/rollup-darwin-arm64@4.52.4': optional: true - '@rollup/rollup-android-arm64@4.45.1': + '@rollup/rollup-darwin-x64@4.52.4': optional: true - '@rollup/rollup-darwin-arm64@4.45.1': + '@rollup/rollup-freebsd-arm64@4.52.4': optional: true - '@rollup/rollup-darwin-x64@4.45.1': + '@rollup/rollup-freebsd-x64@4.52.4': optional: true - '@rollup/rollup-freebsd-arm64@4.45.1': + '@rollup/rollup-linux-arm-gnueabihf@4.52.4': optional: true - '@rollup/rollup-freebsd-x64@4.45.1': + '@rollup/rollup-linux-arm-musleabihf@4.52.4': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.45.1': + '@rollup/rollup-linux-arm64-gnu@4.52.4': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.45.1': + '@rollup/rollup-linux-arm64-musl@4.52.4': optional: true - '@rollup/rollup-linux-arm64-gnu@4.45.1': + '@rollup/rollup-linux-loong64-gnu@4.52.4': optional: true - '@rollup/rollup-linux-arm64-musl@4.45.1': + '@rollup/rollup-linux-ppc64-gnu@4.52.4': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.45.1': + '@rollup/rollup-linux-riscv64-gnu@4.52.4': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.45.1': + '@rollup/rollup-linux-riscv64-musl@4.52.4': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.45.1': + '@rollup/rollup-linux-s390x-gnu@4.52.4': optional: true - '@rollup/rollup-linux-riscv64-musl@4.45.1': + '@rollup/rollup-linux-x64-gnu@4.52.4': optional: true - '@rollup/rollup-linux-s390x-gnu@4.45.1': + '@rollup/rollup-linux-x64-musl@4.52.4': optional: true - '@rollup/rollup-linux-x64-gnu@4.45.1': + '@rollup/rollup-openharmony-arm64@4.52.4': optional: true - '@rollup/rollup-linux-x64-musl@4.45.1': + '@rollup/rollup-win32-arm64-msvc@4.52.4': optional: true - '@rollup/rollup-win32-arm64-msvc@4.45.1': + '@rollup/rollup-win32-ia32-msvc@4.52.4': optional: true - '@rollup/rollup-win32-ia32-msvc@4.45.1': + '@rollup/rollup-win32-x64-gnu@4.52.4': optional: true - '@rollup/rollup-win32-x64-msvc@4.45.1': + '@rollup/rollup-win32-x64-msvc@4.52.4': optional: true '@scure/base@1.2.6': {} '@scure/bip32@1.7.0': dependencies: - '@noble/curves': 1.9.4 + '@noble/curves': 1.9.7 '@noble/hashes': 1.8.0 '@scure/base': 1.2.6 @@ -4217,6 +4683,10 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/base': 1.2.6 + '@sindresorhus/merge-streams@2.3.0': {} + + '@standard-schema/spec@1.0.0': {} + '@swc/helpers@0.5.15': dependencies: tslib: 2.8.1 @@ -4231,17 +4701,17 @@ snapshots: '@tsconfig/node16@1.0.4': {} - '@turbo/gen@1.13.4(@types/node@20.19.9)(typescript@5.5.4)': + '@turbo/gen@1.13.4(@types/node@20.19.21)(typescript@5.8.3)': dependencies: - '@turbo/workspaces': 1.13.4 + '@turbo/workspaces': 1.13.4(@types/node@20.19.21) chalk: 2.4.2 commander: 10.0.1 fs-extra: 10.1.0 - inquirer: 8.2.6 + inquirer: 8.2.7(@types/node@20.19.21) minimatch: 9.0.5 node-plop: 0.26.3 proxy-agent: 6.5.0 - ts-node: 10.9.2(@types/node@20.19.9)(typescript@5.5.4) + ts-node: 10.9.2(@types/node@20.19.21)(typescript@5.8.3) update-check: 1.5.4 validate-npm-package-name: 5.0.1 transitivePeerDependencies: @@ -4251,7 +4721,7 @@ snapshots: - supports-color - typescript - '@turbo/workspaces@1.13.4': + '@turbo/workspaces@1.13.4(@types/node@20.19.21)': dependencies: chalk: 2.4.2 commander: 10.0.1 @@ -4259,12 +4729,14 @@ snapshots: fast-glob: 3.3.3 fs-extra: 10.1.0 gradient-string: 2.0.2 - inquirer: 8.2.6 + inquirer: 8.2.7(@types/node@20.19.21) js-yaml: 4.1.0 ora: 4.1.1 rimraf: 3.0.2 - semver: 7.7.2 + semver: 7.7.3 update-check: 1.5.4 + transitivePeerDependencies: + - '@types/node' '@types/chai@5.2.2': dependencies: @@ -4277,7 +4749,7 @@ snapshots: '@types/glob@7.2.0': dependencies: '@types/minimatch': 6.0.0 - '@types/node': 22.16.5 + '@types/node': 24.10.1 '@types/inquirer@6.5.0': dependencies: @@ -4288,45 +4760,29 @@ snapshots: '@types/minimatch@6.0.0': dependencies: - minimatch: 9.0.5 + minimatch: 10.1.1 '@types/node@12.20.55': {} - '@types/node@20.19.23': - dependencies: - undici-types: 6.21.0 - - '@types/node@20.19.9': - dependencies: - undici-types: 6.21.0 - - '@types/node@22.16.5': + '@types/node@20.19.21': dependencies: undici-types: 6.21.0 - '@types/prop-types@15.7.15': {} - - '@types/react-dom@18.3.0': - dependencies: - '@types/react': 18.3.1 - - '@types/react-dom@18.3.1': + '@types/node@24.10.1': dependencies: - '@types/react': 18.3.1 + undici-types: 7.16.0 - '@types/react@18.3.0': + '@types/react-dom@19.2.3(@types/react@19.2.6)': dependencies: - '@types/prop-types': 15.7.15 - csstype: 3.1.3 + '@types/react': 19.2.6 - '@types/react@18.3.1': + '@types/react@19.2.6': dependencies: - '@types/prop-types': 15.7.15 - csstype: 3.1.3 + csstype: 3.2.3 '@types/through@0.0.33': dependencies: - '@types/node': 22.16.5 + '@types/node': 24.10.1 '@types/tinycolor2@1.4.6': {} @@ -4334,19 +4790,19 @@ snapshots: '@types/yargs-parser@21.0.3': {} - '@types/yargs@17.0.33': + '@types/yargs@17.0.35': dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@8.38.0(@typescript-eslint/parser@8.38.0(eslint@9.31.0)(typescript@5.8.3))(eslint@9.31.0)(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.46.1(@typescript-eslint/parser@8.46.1(eslint@9.37.0)(typescript@5.8.3))(eslint@9.37.0)(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.38.0(eslint@9.31.0)(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.38.0 - '@typescript-eslint/type-utils': 8.38.0(eslint@9.31.0)(typescript@5.8.3) - '@typescript-eslint/utils': 8.38.0(eslint@9.31.0)(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.38.0 - eslint: 9.31.0 + '@typescript-eslint/parser': 8.46.1(eslint@9.37.0)(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.46.1 + '@typescript-eslint/type-utils': 8.46.1(eslint@9.37.0)(typescript@5.8.3) + '@typescript-eslint/utils': 8.46.1(eslint@9.37.0)(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.46.1 + eslint: 9.37.0 graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 @@ -4355,146 +4811,145 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.38.0(eslint@9.31.0)(typescript@5.8.3)': + '@typescript-eslint/parser@8.46.1(eslint@9.37.0)(typescript@5.8.3)': dependencies: - '@typescript-eslint/scope-manager': 8.38.0 - '@typescript-eslint/types': 8.38.0 - '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.38.0 - debug: 4.4.1(supports-color@5.5.0) - eslint: 9.31.0 + '@typescript-eslint/scope-manager': 8.46.1 + '@typescript-eslint/types': 8.46.1 + '@typescript-eslint/typescript-estree': 8.46.1(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.46.1 + debug: 4.4.3(supports-color@5.5.0) + eslint: 9.37.0 typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.38.0(typescript@5.8.3)': + '@typescript-eslint/project-service@8.46.1(typescript@5.8.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.38.0(typescript@5.8.3) - '@typescript-eslint/types': 8.38.0 - debug: 4.4.1(supports-color@5.5.0) + '@typescript-eslint/tsconfig-utils': 8.46.1(typescript@5.8.3) + '@typescript-eslint/types': 8.46.1 + debug: 4.4.3(supports-color@5.5.0) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.38.0': + '@typescript-eslint/scope-manager@8.46.1': dependencies: - '@typescript-eslint/types': 8.38.0 - '@typescript-eslint/visitor-keys': 8.38.0 + '@typescript-eslint/types': 8.46.1 + '@typescript-eslint/visitor-keys': 8.46.1 - '@typescript-eslint/tsconfig-utils@8.38.0(typescript@5.8.3)': + '@typescript-eslint/tsconfig-utils@8.46.1(typescript@5.8.3)': dependencies: typescript: 5.8.3 - '@typescript-eslint/type-utils@8.38.0(eslint@9.31.0)(typescript@5.8.3)': + '@typescript-eslint/type-utils@8.46.1(eslint@9.37.0)(typescript@5.8.3)': dependencies: - '@typescript-eslint/types': 8.38.0 - '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.8.3) - '@typescript-eslint/utils': 8.38.0(eslint@9.31.0)(typescript@5.8.3) - debug: 4.4.1(supports-color@5.5.0) - eslint: 9.31.0 + '@typescript-eslint/types': 8.46.1 + '@typescript-eslint/typescript-estree': 8.46.1(typescript@5.8.3) + '@typescript-eslint/utils': 8.46.1(eslint@9.37.0)(typescript@5.8.3) + debug: 4.4.3(supports-color@5.5.0) + eslint: 9.37.0 ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.38.0': {} + '@typescript-eslint/types@8.46.1': {} - '@typescript-eslint/typescript-estree@8.38.0(typescript@5.8.3)': + '@typescript-eslint/typescript-estree@8.46.1(typescript@5.8.3)': dependencies: - '@typescript-eslint/project-service': 8.38.0(typescript@5.8.3) - '@typescript-eslint/tsconfig-utils': 8.38.0(typescript@5.8.3) - '@typescript-eslint/types': 8.38.0 - '@typescript-eslint/visitor-keys': 8.38.0 - debug: 4.4.1(supports-color@5.5.0) + '@typescript-eslint/project-service': 8.46.1(typescript@5.8.3) + '@typescript-eslint/tsconfig-utils': 8.46.1(typescript@5.8.3) + '@typescript-eslint/types': 8.46.1 + '@typescript-eslint/visitor-keys': 8.46.1 + debug: 4.4.3(supports-color@5.5.0) fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.2 + semver: 7.7.3 ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.38.0(eslint@9.31.0)(typescript@5.8.3)': + '@typescript-eslint/utils@8.46.1(eslint@9.37.0)(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.31.0) - '@typescript-eslint/scope-manager': 8.38.0 - '@typescript-eslint/types': 8.38.0 - '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.8.3) - eslint: 9.31.0 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.37.0) + '@typescript-eslint/scope-manager': 8.46.1 + '@typescript-eslint/types': 8.46.1 + '@typescript-eslint/typescript-estree': 8.46.1(typescript@5.8.3) + eslint: 9.37.0 typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.38.0': + '@typescript-eslint/visitor-keys@8.46.1': dependencies: - '@typescript-eslint/types': 8.38.0 + '@typescript-eslint/types': 8.46.1 eslint-visitor-keys: 4.2.1 - '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/node@22.16.5)(happy-dom@20.0.2))': + '@vitest/coverage-v8@4.0.14(vitest@4.0.14(@types/node@24.10.1)(happy-dom@20.0.10))': dependencies: - '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 - ast-v8-to-istanbul: 0.3.3 - debug: 4.4.1(supports-color@5.5.0) + '@vitest/utils': 4.0.14 + ast-v8-to-istanbul: 0.3.8 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 5.0.6 - istanbul-reports: 3.1.7 - magic-string: 0.30.17 - magicast: 0.3.5 - std-env: 3.9.0 - test-exclude: 7.0.1 - tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/node@22.16.5)(happy-dom@20.0.2) + istanbul-reports: 3.2.0 + magicast: 0.5.1 + obug: 2.1.1 + std-env: 3.10.0 + tinyrainbow: 3.0.3 + vitest: 4.0.14(@types/node@24.10.1)(happy-dom@20.0.10) transitivePeerDependencies: - supports-color - '@vitest/expect@3.2.4': + '@vitest/expect@4.0.14': dependencies: + '@standard-schema/spec': 1.0.0 '@types/chai': 5.2.2 - '@vitest/spy': 3.2.4 - '@vitest/utils': 3.2.4 - chai: 5.2.1 - tinyrainbow: 2.0.0 + '@vitest/spy': 4.0.14 + '@vitest/utils': 4.0.14 + chai: 6.2.1 + tinyrainbow: 3.0.3 - '@vitest/mocker@3.2.4(vite@7.0.5(@types/node@22.16.5))': + '@vitest/mocker@4.0.14(vite@7.1.10(@types/node@24.10.1))': dependencies: - '@vitest/spy': 3.2.4 + '@vitest/spy': 4.0.14 estree-walker: 3.0.3 - magic-string: 0.30.17 + magic-string: 0.30.21 optionalDependencies: - vite: 7.0.5(@types/node@22.16.5) + vite: 7.1.10(@types/node@24.10.1) - '@vitest/pretty-format@3.2.4': + '@vitest/pretty-format@4.0.14': dependencies: - tinyrainbow: 2.0.0 + tinyrainbow: 3.0.3 - '@vitest/runner@3.2.4': + '@vitest/runner@4.0.14': dependencies: - '@vitest/utils': 3.2.4 + '@vitest/utils': 4.0.14 pathe: 2.0.3 - strip-literal: 3.0.0 - '@vitest/snapshot@3.2.4': + '@vitest/snapshot@4.0.14': dependencies: - '@vitest/pretty-format': 3.2.4 - magic-string: 0.30.17 + '@vitest/pretty-format': 4.0.14 + magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@3.2.4': - dependencies: - tinyspy: 4.0.3 + '@vitest/spy@4.0.14': {} - '@vitest/utils@3.2.4': + '@vitest/utils@4.0.14': dependencies: - '@vitest/pretty-format': 3.2.4 - loupe: 3.1.4 - tinyrainbow: 2.0.0 + '@vitest/pretty-format': 4.0.14 + tinyrainbow: 3.0.3 - abitype@1.0.8(typescript@5.8.3): + abitype@1.1.0(typescript@5.9.3): optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.3 + + abitype@1.1.1(typescript@5.9.3): + optionalDependencies: + typescript: 5.9.3 acorn-jsx@5.3.2(acorn@8.15.0): dependencies: @@ -4528,7 +4983,7 @@ snapshots: ansi-regex@5.0.1: {} - ansi-regex@6.1.0: {} + ansi-regex@6.2.2: {} ansi-styles@3.2.1: dependencies: @@ -4538,7 +4993,7 @@ snapshots: dependencies: color-convert: 2.0.1 - ansi-styles@6.2.1: {} + ansi-styles@6.2.3: {} anymatch@3.1.3: dependencies: @@ -4618,15 +5073,13 @@ snapshots: pvutils: 1.1.3 tslib: 2.8.1 - assertion-error@2.0.1: {} - ast-types@0.13.4: dependencies: tslib: 2.8.1 - ast-v8-to-istanbul@0.3.3: + ast-v8-to-istanbul@0.3.8: dependencies: - '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/trace-mapping': 0.3.31 estree-walker: 3.0.3 js-tokens: 9.0.1 @@ -4674,8 +5127,6 @@ snapshots: bytestreamjs@2.0.1: {} - cac@6.7.14: {} - call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -4700,17 +5151,15 @@ snapshots: no-case: 2.3.2 upper-case: 1.1.3 - caniuse-lite@1.0.30001743: {} + caniuse-lite@1.0.30001759: {} cbor2@1.12.0: {} - chai@5.2.1: + chai@6.2.1: {} + + chalk-template@1.1.2: dependencies: - assertion-error: 2.0.1 - check-error: 2.1.1 - deep-eql: 5.0.2 - loupe: 3.1.4 - pathval: 2.0.1 + chalk: 5.6.2 chalk@2.4.2: dependencies: @@ -4728,6 +5177,8 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 + chalk@5.6.2: {} + change-case@3.1.0: dependencies: camel-case: 3.0.0 @@ -4751,7 +5202,7 @@ snapshots: chardet@0.7.0: {} - check-error@2.1.1: {} + chardet@2.1.0: {} chokidar@3.6.0: dependencies: @@ -4773,6 +5224,10 @@ snapshots: dependencies: restore-cursor: 3.1.0 + cli-cursor@5.0.0: + dependencies: + restore-cursor: 5.1.0 + cli-spinners@2.9.2: {} cli-width@3.0.0: {} @@ -4785,6 +5240,12 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 + cliui@9.0.1: + dependencies: + string-width: 7.2.0 + strip-ansi: 7.1.2 + wrap-ansi: 9.0.2 + clone@1.0.4: {} color-convert@1.9.3: @@ -4801,16 +5262,15 @@ snapshots: commander@10.0.1: {} + commander@13.1.0: {} + concat-map@0.0.1: {} - concurrently@8.2.2: + concurrently@9.2.1: dependencies: chalk: 4.1.2 - date-fns: 2.30.0 - lodash: 4.17.21 rxjs: 7.8.2 shell-quote: 1.8.3 - spawn-command: 0.0.2 supports-color: 8.1.1 tree-kill: 1.2.2 yargs: 17.7.2 @@ -4820,7 +5280,16 @@ snapshots: snake-case: 2.1.0 upper-case: 1.1.3 - core-js-pure@3.44.0: {} + core-js-pure@3.46.0: {} + + cosmiconfig@9.0.0(typescript@5.9.3): + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + parse-json: 5.2.0 + optionalDependencies: + typescript: 5.9.3 create-require@1.1.1: {} @@ -4830,7 +5299,7 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - csstype@3.1.3: {} + csstype@3.2.3: {} data-uri-to-buffer@6.0.2: {} @@ -4852,18 +5321,12 @@ snapshots: es-errors: 1.3.0 is-data-view: 1.0.2 - date-fns@2.30.0: - dependencies: - '@babel/runtime': 7.27.6 - - debug@4.4.1(supports-color@5.5.0): + debug@4.4.3(supports-color@5.5.0): dependencies: ms: 2.1.3 optionalDependencies: supports-color: 5.5.0 - deep-eql@5.0.2: {} - deep-extend@0.6.0: {} deep-is@0.1.4: {} @@ -4903,7 +5366,7 @@ snapshots: detect-indent@6.1.0: {} - detect-libc@2.1.0: + detect-libc@2.1.2: optional: true diff@4.0.2: {} @@ -4922,7 +5385,7 @@ snapshots: dotenv@16.0.3: {} - dotenv@16.6.1: {} + dotenv@17.2.3: {} dunder-proto@1.0.1: dependencies: @@ -4930,17 +5393,26 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - eastasianwidth@0.2.0: {} + effect@3.19.6: + dependencies: + '@standard-schema/spec': 1.0.0 + fast-check: 3.23.2 + + emoji-regex@10.6.0: {} emoji-regex@8.0.0: {} - emoji-regex@9.2.2: {} - enquirer@2.4.1: dependencies: ansi-colors: 4.1.3 strip-ansi: 6.0.1 + env-paths@2.2.1: {} + + error-ex@1.3.4: + dependencies: + is-arrayish: 0.2.1 + es-abstract@1.24.0: dependencies: array-buffer-byte-length: 1.0.2 @@ -5044,34 +5516,63 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - esbuild@0.25.8: + esbuild@0.25.11: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.11 + '@esbuild/android-arm': 0.25.11 + '@esbuild/android-arm64': 0.25.11 + '@esbuild/android-x64': 0.25.11 + '@esbuild/darwin-arm64': 0.25.11 + '@esbuild/darwin-x64': 0.25.11 + '@esbuild/freebsd-arm64': 0.25.11 + '@esbuild/freebsd-x64': 0.25.11 + '@esbuild/linux-arm': 0.25.11 + '@esbuild/linux-arm64': 0.25.11 + '@esbuild/linux-ia32': 0.25.11 + '@esbuild/linux-loong64': 0.25.11 + '@esbuild/linux-mips64el': 0.25.11 + '@esbuild/linux-ppc64': 0.25.11 + '@esbuild/linux-riscv64': 0.25.11 + '@esbuild/linux-s390x': 0.25.11 + '@esbuild/linux-x64': 0.25.11 + '@esbuild/netbsd-arm64': 0.25.11 + '@esbuild/netbsd-x64': 0.25.11 + '@esbuild/openbsd-arm64': 0.25.11 + '@esbuild/openbsd-x64': 0.25.11 + '@esbuild/openharmony-arm64': 0.25.11 + '@esbuild/sunos-x64': 0.25.11 + '@esbuild/win32-arm64': 0.25.11 + '@esbuild/win32-ia32': 0.25.11 + '@esbuild/win32-x64': 0.25.11 + + esbuild@0.27.0: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.8 - '@esbuild/android-arm': 0.25.8 - '@esbuild/android-arm64': 0.25.8 - '@esbuild/android-x64': 0.25.8 - '@esbuild/darwin-arm64': 0.25.8 - '@esbuild/darwin-x64': 0.25.8 - '@esbuild/freebsd-arm64': 0.25.8 - '@esbuild/freebsd-x64': 0.25.8 - '@esbuild/linux-arm': 0.25.8 - '@esbuild/linux-arm64': 0.25.8 - '@esbuild/linux-ia32': 0.25.8 - '@esbuild/linux-loong64': 0.25.8 - '@esbuild/linux-mips64el': 0.25.8 - '@esbuild/linux-ppc64': 0.25.8 - '@esbuild/linux-riscv64': 0.25.8 - '@esbuild/linux-s390x': 0.25.8 - '@esbuild/linux-x64': 0.25.8 - '@esbuild/netbsd-arm64': 0.25.8 - '@esbuild/netbsd-x64': 0.25.8 - '@esbuild/openbsd-arm64': 0.25.8 - '@esbuild/openbsd-x64': 0.25.8 - '@esbuild/openharmony-arm64': 0.25.8 - '@esbuild/sunos-x64': 0.25.8 - '@esbuild/win32-arm64': 0.25.8 - '@esbuild/win32-ia32': 0.25.8 - '@esbuild/win32-x64': 0.25.8 + '@esbuild/aix-ppc64': 0.27.0 + '@esbuild/android-arm': 0.27.0 + '@esbuild/android-arm64': 0.27.0 + '@esbuild/android-x64': 0.27.0 + '@esbuild/darwin-arm64': 0.27.0 + '@esbuild/darwin-x64': 0.27.0 + '@esbuild/freebsd-arm64': 0.27.0 + '@esbuild/freebsd-x64': 0.27.0 + '@esbuild/linux-arm': 0.27.0 + '@esbuild/linux-arm64': 0.27.0 + '@esbuild/linux-ia32': 0.27.0 + '@esbuild/linux-loong64': 0.27.0 + '@esbuild/linux-mips64el': 0.27.0 + '@esbuild/linux-ppc64': 0.27.0 + '@esbuild/linux-riscv64': 0.27.0 + '@esbuild/linux-s390x': 0.27.0 + '@esbuild/linux-x64': 0.27.0 + '@esbuild/netbsd-arm64': 0.27.0 + '@esbuild/netbsd-x64': 0.27.0 + '@esbuild/openbsd-arm64': 0.27.0 + '@esbuild/openbsd-x64': 0.27.0 + '@esbuild/openharmony-arm64': 0.27.0 + '@esbuild/sunos-x64': 0.27.0 + '@esbuild/win32-arm64': 0.27.0 + '@esbuild/win32-ia32': 0.27.0 + '@esbuild/win32-x64': 0.27.0 escalade@3.2.0: {} @@ -5087,17 +5588,17 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-prettier@9.1.2(eslint@9.31.0): + eslint-config-prettier@9.1.2(eslint@9.37.0): dependencies: - eslint: 9.31.0 + eslint: 9.37.0 eslint-plugin-only-warn@1.1.0: {} - eslint-plugin-react-hooks@5.2.0(eslint@9.31.0): + eslint-plugin-react-hooks@5.2.0(eslint@9.37.0): dependencies: - eslint: 9.31.0 + eslint: 9.37.0 - eslint-plugin-react@7.37.5(eslint@9.31.0): + eslint-plugin-react@7.37.5(eslint@9.37.0): dependencies: array-includes: 3.1.9 array.prototype.findlast: 1.2.5 @@ -5105,7 +5606,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.31.0 + eslint: 9.37.0 estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -5119,11 +5620,11 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-turbo@2.5.5(eslint@9.31.0)(turbo@2.5.5): + eslint-plugin-turbo@2.5.8(eslint@9.37.0)(turbo@2.6.2): dependencies: dotenv: 16.0.3 - eslint: 9.31.0 - turbo: 2.5.5 + eslint: 9.37.0 + turbo: 2.6.2 eslint-scope@8.4.0: dependencies: @@ -5134,17 +5635,17 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.31.0: + eslint@9.37.0: dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.31.0) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.37.0) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.21.0 - '@eslint/config-helpers': 0.3.0 - '@eslint/core': 0.15.1 + '@eslint/config-helpers': 0.4.0 + '@eslint/core': 0.16.0 '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.31.0 - '@eslint/plugin-kit': 0.3.4 - '@humanfs/node': 0.16.6 + '@eslint/js': 9.37.0 + '@eslint/plugin-kit': 0.4.0 + '@humanfs/node': 0.16.7 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 '@types/estree': 1.0.8 @@ -5152,7 +5653,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.3(supports-color@5.5.0) escape-string-regexp: 4.0.0 eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 @@ -5222,7 +5723,11 @@ snapshots: iconv-lite: 0.4.24 tmp: 0.0.33 - fake-indexeddb@6.0.1: {} + fake-indexeddb@6.2.5: {} + + fast-check@3.23.2: + dependencies: + pure-rand: 6.1.0 fast-deep-equal@3.1.3: {} @@ -5250,7 +5755,7 @@ snapshots: dependencies: reusify: 1.1.0 - fdir@6.4.6(picomatch@4.0.3): + fdir@6.5.0(picomatch@4.0.3): optionalDependencies: picomatch: 4.0.3 @@ -5287,15 +5792,10 @@ snapshots: dependencies: is-callable: 1.2.7 - foreground-child@3.3.1: - dependencies: - cross-spawn: 7.0.6 - signal-exit: 4.1.0 - fs-extra@10.1.0: dependencies: graceful-fs: 4.2.11 - jsonfile: 6.1.0 + jsonfile: 6.2.0 universalify: 2.0.1 fs-extra@7.0.1: @@ -5328,8 +5828,12 @@ snapshots: functions-have-names@1.2.3: {} + generator-function@2.0.1: {} + get-caller-file@2.0.5: {} + get-east-asian-width@1.4.0: {} + get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 @@ -5360,7 +5864,7 @@ snapshots: dependencies: basic-ftp: 5.0.5 data-uri-to-buffer: 6.0.2 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.3(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -5372,22 +5876,10 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@10.4.5: + glob@13.0.0: dependencies: - foreground-child: 3.3.1 - jackspeak: 3.4.3 - minimatch: 9.0.5 - minipass: 7.1.2 - package-json-from-dist: 1.0.1 - path-scurry: 1.11.1 - - glob@11.0.3: - dependencies: - foreground-child: 3.3.1 - jackspeak: 4.1.1 - minimatch: 10.0.3 + minimatch: 10.1.1 minipass: 7.1.2 - package-json-from-dist: 1.0.1 path-scurry: 2.0.0 glob@7.2.3: @@ -5428,6 +5920,15 @@ snapshots: merge2: 1.4.1 slash: 3.0.0 + globby@14.1.0: + dependencies: + '@sindresorhus/merge-streams': 2.3.0 + fast-glob: 3.3.3 + ignore: 7.0.5 + path-type: 6.0.0 + slash: 5.1.0 + unicorn-magic: 0.3.0 + gopd@1.2.0: {} graceful-fs@4.2.11: {} @@ -5448,9 +5949,9 @@ snapshots: optionalDependencies: uglify-js: 3.19.3 - happy-dom@20.0.2: + happy-dom@20.0.10: dependencies: - '@types/node': 20.19.23 + '@types/node': 20.19.21 '@types/whatwg-mimetype': 3.0.2 whatwg-mimetype: 3.0.0 @@ -5483,23 +5984,27 @@ snapshots: no-case: 2.3.2 upper-case: 1.1.3 + hosted-git-info@8.1.0: + dependencies: + lru-cache: 10.4.3 + html-escaper@2.0.2: {} http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.4 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.3(supports-color@5.5.0) transitivePeerDependencies: - supports-color https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.4 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.3(supports-color@5.5.0) transitivePeerDependencies: - supports-color - human-id@4.1.1: {} + human-id@4.1.2: {} human-signals@2.1.0: {} @@ -5507,7 +6012,11 @@ snapshots: dependencies: safer-buffer: 2.1.2 - idb@7.1.1: {} + iconv-lite@0.7.0: + dependencies: + safer-buffer: 2.1.2 + + idb@8.0.3: {} ieee754@1.2.1: {} @@ -5551,13 +6060,13 @@ snapshots: strip-ansi: 6.0.1 through: 2.3.8 - inquirer@8.2.6: + inquirer@8.2.7(@types/node@20.19.21): dependencies: + '@inquirer/external-editor': 1.0.2(@types/node@20.19.21) ansi-escapes: 4.3.2 chalk: 4.1.2 cli-cursor: 3.1.0 cli-width: 3.0.0 - external-editor: 3.1.0 figures: 3.2.0 lodash: 4.17.21 mute-stream: 0.0.8 @@ -5568,6 +6077,8 @@ snapshots: strip-ansi: 6.0.1 through: 2.3.8 wrap-ansi: 6.2.0 + transitivePeerDependencies: + - '@types/node' internal-slot@1.1.0: dependencies: @@ -5575,10 +6086,7 @@ snapshots: hasown: 2.0.2 side-channel: 1.1.0 - ip-address@9.0.5: - dependencies: - jsbn: 1.1.0 - sprintf-js: 1.1.3 + ip-address@10.0.1: {} is-array-buffer@3.0.5: dependencies: @@ -5586,6 +6094,8 @@ snapshots: call-bound: 1.0.4 get-intrinsic: 1.3.0 + is-arrayish@0.2.1: {} + is-async-function@2.1.1: dependencies: async-function: 1.0.0 @@ -5632,9 +6142,10 @@ snapshots: is-fullwidth-code-point@3.0.0: {} - is-generator-function@1.1.0: + is-generator-function@1.1.2: dependencies: call-bound: 1.0.4 + generator-function: 2.0.1 get-proto: 1.0.1 has-tostringtag: 1.0.2 safe-regex-test: 1.1.0 @@ -5645,6 +6156,8 @@ snapshots: is-interactive@1.0.0: {} + is-interactive@2.0.0: {} + is-lower-case@1.1.3: dependencies: lower-case: 1.1.4 @@ -5700,6 +6213,10 @@ snapshots: is-unicode-supported@0.1.0: {} + is-unicode-supported@1.3.0: {} + + is-unicode-supported@2.1.0: {} + is-upper-case@1.1.2: dependencies: upper-case: 1.1.3 @@ -5723,9 +6240,9 @@ snapshots: isexe@2.0.0: {} - isows@1.0.7(ws@8.18.2): + isows@1.0.7(ws@8.18.3): dependencies: - ws: 8.18.2 + ws: 8.18.3 istanbul-lib-coverage@3.2.2: {} @@ -5737,13 +6254,13 @@ snapshots: istanbul-lib-source-maps@5.0.6: dependencies: - '@jridgewell/trace-mapping': 0.3.29 - debug: 4.4.1(supports-color@5.5.0) + '@jridgewell/trace-mapping': 0.3.31 + debug: 4.4.3(supports-color@5.5.0) istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: - supports-color - istanbul-reports@3.1.7: + istanbul-reports@3.2.0: dependencies: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 @@ -5757,16 +6274,6 @@ snapshots: has-symbols: 1.1.0 set-function-name: 2.0.2 - jackspeak@3.4.3: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - - jackspeak@4.1.1: - dependencies: - '@isaacs/cliui': 8.0.2 - js-tokens@4.0.0: {} js-tokens@9.0.1: {} @@ -5780,21 +6287,23 @@ snapshots: dependencies: argparse: 2.0.1 - jsbn@1.1.0: {} - json-buffer@3.0.1: {} json-canonicalize@2.0.0: {} + json-parse-even-better-errors@2.3.1: {} + json-schema-traverse@0.4.1: {} json-stable-stringify-without-jsonify@1.0.1: {} + jsonc-parser@3.3.1: {} + jsonfile@4.0.0: optionalDependencies: graceful-fs: 4.2.11 - jsonfile@6.1.0: + jsonfile@6.2.0: dependencies: universalify: 2.0.1 optionalDependencies: @@ -5813,54 +6322,58 @@ snapshots: dependencies: json-buffer: 3.0.1 - lefthook-darwin-arm64@1.12.2: + kleur@3.0.3: {} + + lefthook-darwin-arm64@2.0.4: optional: true - lefthook-darwin-x64@1.12.2: + lefthook-darwin-x64@2.0.4: optional: true - lefthook-freebsd-arm64@1.12.2: + lefthook-freebsd-arm64@2.0.4: optional: true - lefthook-freebsd-x64@1.12.2: + lefthook-freebsd-x64@2.0.4: optional: true - lefthook-linux-arm64@1.12.2: + lefthook-linux-arm64@2.0.4: optional: true - lefthook-linux-x64@1.12.2: + lefthook-linux-x64@2.0.4: optional: true - lefthook-openbsd-arm64@1.12.2: + lefthook-openbsd-arm64@2.0.4: optional: true - lefthook-openbsd-x64@1.12.2: + lefthook-openbsd-x64@2.0.4: optional: true - lefthook-windows-arm64@1.12.2: + lefthook-windows-arm64@2.0.4: optional: true - lefthook-windows-x64@1.12.2: + lefthook-windows-x64@2.0.4: optional: true - lefthook@1.12.2: + lefthook@2.0.4: optionalDependencies: - lefthook-darwin-arm64: 1.12.2 - lefthook-darwin-x64: 1.12.2 - lefthook-freebsd-arm64: 1.12.2 - lefthook-freebsd-x64: 1.12.2 - lefthook-linux-arm64: 1.12.2 - lefthook-linux-x64: 1.12.2 - lefthook-openbsd-arm64: 1.12.2 - lefthook-openbsd-x64: 1.12.2 - lefthook-windows-arm64: 1.12.2 - lefthook-windows-x64: 1.12.2 + lefthook-darwin-arm64: 2.0.4 + lefthook-darwin-x64: 2.0.4 + lefthook-freebsd-arm64: 2.0.4 + lefthook-freebsd-x64: 2.0.4 + lefthook-linux-arm64: 2.0.4 + lefthook-linux-x64: 2.0.4 + lefthook-openbsd-arm64: 2.0.4 + lefthook-openbsd-x64: 2.0.4 + lefthook-windows-arm64: 2.0.4 + lefthook-windows-x64: 2.0.4 levn@0.4.1: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 + lines-and-columns@1.2.4: {} + locate-path@5.0.0: dependencies: p-locate: 4.1.0 @@ -5886,12 +6399,15 @@ snapshots: chalk: 4.1.2 is-unicode-supported: 0.1.0 + log-symbols@6.0.0: + dependencies: + chalk: 5.6.2 + is-unicode-supported: 1.3.0 + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 - loupe@3.1.4: {} - lower-case-first@1.0.2: dependencies: lower-case: 1.1.4 @@ -5900,23 +6416,23 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@11.1.0: {} + lru-cache@11.2.2: {} lru-cache@7.18.3: {} - magic-string@0.30.17: + magic-string@0.30.21: dependencies: - '@jridgewell/sourcemap-codec': 1.5.4 + '@jridgewell/sourcemap-codec': 1.5.5 - magicast@0.3.5: + magicast@0.5.1: dependencies: - '@babel/parser': 7.28.0 - '@babel/types': 7.28.1 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 source-map-js: 1.2.1 make-dir@4.0.0: dependencies: - semver: 7.7.2 + semver: 7.7.3 make-error@1.3.6: {} @@ -5933,7 +6449,9 @@ snapshots: mimic-fn@2.1.0: {} - minimatch@10.0.3: + mimic-function@5.0.1: {} + + minimatch@10.1.1: dependencies: '@isaacs/brace-expansion': 5.0.0 @@ -5949,9 +6467,9 @@ snapshots: minipass@7.1.2: {} - mipd@0.0.7(typescript@5.8.3): + mipd@0.0.7(typescript@5.9.3): optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.3 mkdirp@0.5.6: dependencies: @@ -5971,25 +6489,25 @@ snapshots: netmask@2.0.2: {} - next@15.4.7(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + next@15.5.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: - '@next/env': 15.4.7 + '@next/env': 15.5.7 '@swc/helpers': 0.5.15 - caniuse-lite: 1.0.30001743 + caniuse-lite: 1.0.30001759 postcss: 8.4.31 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - styled-jsx: 5.1.6(react@19.1.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + styled-jsx: 5.1.6(react@19.2.0) optionalDependencies: - '@next/swc-darwin-arm64': 15.4.7 - '@next/swc-darwin-x64': 15.4.7 - '@next/swc-linux-arm64-gnu': 15.4.7 - '@next/swc-linux-arm64-musl': 15.4.7 - '@next/swc-linux-x64-gnu': 15.4.7 - '@next/swc-linux-x64-musl': 15.4.7 - '@next/swc-win32-arm64-msvc': 15.4.7 - '@next/swc-win32-x64-msvc': 15.4.7 - sharp: 0.34.4 + '@next/swc-darwin-arm64': 15.5.7 + '@next/swc-darwin-x64': 15.5.7 + '@next/swc-linux-arm64-gnu': 15.5.7 + '@next/swc-linux-arm64-musl': 15.5.7 + '@next/swc-linux-x64-gnu': 15.5.7 + '@next/swc-linux-x64-musl': 15.5.7 + '@next/swc-win32-arm64-msvc': 15.5.7 + '@next/swc-win32-x64-msvc': 15.5.7 + sharp: 0.34.5 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros @@ -6000,7 +6518,7 @@ snapshots: node-plop@0.26.3: dependencies: - '@babel/runtime-corejs3': 7.28.0 + '@babel/runtime-corejs3': 7.28.4 '@types/inquirer': 6.5.0 change-case: 3.1.0 del: 5.1.0 @@ -6012,14 +6530,14 @@ snapshots: mkdirp: 0.5.6 resolve: 1.22.10 - nodemon@3.1.10: + nodemon@3.1.11: dependencies: chokidar: 3.6.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.3(supports-color@5.5.0) ignore-by-default: 1.0.1 minimatch: 3.1.2 pstree.remy: 1.1.8 - semver: 7.7.2 + semver: 7.7.3 simple-update-notifier: 2.0.0 supports-color: 5.5.0 touch: 3.1.1 @@ -6027,6 +6545,13 @@ snapshots: normalize-path@3.0.0: {} + npm-package-arg@12.0.2: + dependencies: + hosted-git-info: 8.1.0 + proc-log: 5.0.0 + semver: 7.7.3 + validate-npm-package-name: 6.0.2 + npm-run-path@4.0.1: dependencies: path-key: 3.1.1 @@ -6067,6 +6592,8 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.1 + obug@2.1.1: {} + once@1.4.0: dependencies: wrappy: 1.0.2 @@ -6075,6 +6602,10 @@ snapshots: dependencies: mimic-fn: 2.1.0 + onetime@7.0.0: + dependencies: + mimic-function: 5.0.1 + optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -6107,6 +6638,18 @@ snapshots: strip-ansi: 6.0.1 wcwidth: 1.0.1 + ora@8.2.0: + dependencies: + chalk: 5.6.2 + cli-cursor: 5.0.0 + cli-spinners: 2.9.2 + is-interactive: 2.0.0 + is-unicode-supported: 2.1.0 + log-symbols: 6.0.0 + stdin-discarder: 0.2.2 + string-width: 7.2.0 + strip-ansi: 7.1.2 + os-tmpdir@1.0.2: {} outdent@0.5.0: {} @@ -6117,33 +6660,18 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 - ox@0.7.2(typescript@5.8.3): - dependencies: - '@adraffy/ens-normalize': 1.11.0 - '@noble/ciphers': 1.3.0 - '@noble/curves': 1.9.4 - '@noble/hashes': 1.8.0 - '@scure/bip32': 1.7.0 - '@scure/bip39': 1.6.0 - abitype: 1.0.8(typescript@5.8.3) - eventemitter3: 5.0.1 - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - zod - - ox@0.8.1(typescript@5.8.3): + ox@0.9.17(typescript@5.9.3): dependencies: - '@adraffy/ens-normalize': 1.11.0 + '@adraffy/ens-normalize': 1.11.1 '@noble/ciphers': 1.3.0 - '@noble/curves': 1.9.2 + '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.0.8(typescript@5.8.3) + abitype: 1.1.1(typescript@5.9.3) eventemitter3: 5.0.1 optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.3 transitivePeerDependencies: - zod @@ -6179,7 +6707,7 @@ snapshots: dependencies: '@tootallnate/quickjs-emscripten': 0.23.0 agent-base: 7.1.4 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.3(supports-color@5.5.0) get-uri: 6.0.5 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 @@ -6197,7 +6725,7 @@ snapshots: package-manager-detector@0.2.11: dependencies: - quansync: 0.2.10 + quansync: 0.2.11 param-case@2.1.1: dependencies: @@ -6207,6 +6735,13 @@ snapshots: dependencies: callsites: 3.1.0 + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.27.1 + error-ex: 1.3.4 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + pascal-case@2.0.1: dependencies: camel-case: 3.0.0 @@ -6224,21 +6759,16 @@ snapshots: path-parse@1.0.7: {} - path-scurry@1.11.1: - dependencies: - lru-cache: 10.4.3 - minipass: 7.1.2 - path-scurry@2.0.0: dependencies: - lru-cache: 11.1.0 + lru-cache: 11.2.2 minipass: 7.1.2 path-type@4.0.0: {} - pathe@2.0.3: {} + path-type@6.0.0: {} - pathval@2.0.1: {} + pathe@2.0.3: {} picocolors@1.1.1: {} @@ -6248,9 +6778,9 @@ snapshots: pify@4.0.1: {} - pkijs@3.2.5: + pkijs@3.3.0: dependencies: - '@noble/hashes': 1.8.0 + '@noble/hashes': 1.4.0 asn1js: 3.0.6 bytestreamjs: 2.0.1 pvtsutils: 1.3.6 @@ -6277,6 +6807,13 @@ snapshots: prettier@3.6.2: {} + proc-log@5.0.0: {} + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + prop-types@15.8.1: dependencies: loose-envify: 1.4.0 @@ -6286,7 +6823,7 @@ snapshots: proxy-agent@6.5.0: dependencies: agent-base: 7.1.4 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.3(supports-color@5.5.0) http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 lru-cache: 7.18.3 @@ -6302,13 +6839,15 @@ snapshots: punycode@2.3.1: {} + pure-rand@6.1.0: {} + pvtsutils@1.3.6: dependencies: tslib: 2.8.1 pvutils@1.1.3: {} - quansync@0.2.10: {} + quansync@0.2.11: {} queue-microtask@1.2.3: {} @@ -6319,14 +6858,14 @@ snapshots: minimist: 1.2.8 strip-json-comments: 2.0.1 - react-dom@19.1.0(react@19.1.0): + react-dom@19.2.0(react@19.2.0): dependencies: - react: 19.1.0 - scheduler: 0.26.0 + react: 19.2.0 + scheduler: 0.27.0 react-is@16.13.1: {} - react@19.1.0: {} + react@19.2.0: {} read-yaml-file@1.1.0: dependencies: @@ -6335,6 +6874,11 @@ snapshots: pify: 4.0.1 strip-bom: 3.0.0 + read-yaml-file@2.1.0: + dependencies: + js-yaml: 4.1.0 + strip-bom: 4.0.0 + readable-stream@3.6.2: dependencies: inherits: 2.0.4 @@ -6397,41 +6941,48 @@ snapshots: onetime: 5.1.2 signal-exit: 3.0.7 + restore-cursor@5.1.0: + dependencies: + onetime: 7.0.0 + signal-exit: 4.1.0 + reusify@1.1.0: {} rimraf@3.0.2: dependencies: glob: 7.2.3 - rimraf@6.0.1: + rimraf@6.1.2: dependencies: - glob: 11.0.3 + glob: 13.0.0 package-json-from-dist: 1.0.1 - rollup@4.45.1: + rollup@4.52.4: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.45.1 - '@rollup/rollup-android-arm64': 4.45.1 - '@rollup/rollup-darwin-arm64': 4.45.1 - '@rollup/rollup-darwin-x64': 4.45.1 - '@rollup/rollup-freebsd-arm64': 4.45.1 - '@rollup/rollup-freebsd-x64': 4.45.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.45.1 - '@rollup/rollup-linux-arm-musleabihf': 4.45.1 - '@rollup/rollup-linux-arm64-gnu': 4.45.1 - '@rollup/rollup-linux-arm64-musl': 4.45.1 - '@rollup/rollup-linux-loongarch64-gnu': 4.45.1 - '@rollup/rollup-linux-powerpc64le-gnu': 4.45.1 - '@rollup/rollup-linux-riscv64-gnu': 4.45.1 - '@rollup/rollup-linux-riscv64-musl': 4.45.1 - '@rollup/rollup-linux-s390x-gnu': 4.45.1 - '@rollup/rollup-linux-x64-gnu': 4.45.1 - '@rollup/rollup-linux-x64-musl': 4.45.1 - '@rollup/rollup-win32-arm64-msvc': 4.45.1 - '@rollup/rollup-win32-ia32-msvc': 4.45.1 - '@rollup/rollup-win32-x64-msvc': 4.45.1 + '@rollup/rollup-android-arm-eabi': 4.52.4 + '@rollup/rollup-android-arm64': 4.52.4 + '@rollup/rollup-darwin-arm64': 4.52.4 + '@rollup/rollup-darwin-x64': 4.52.4 + '@rollup/rollup-freebsd-arm64': 4.52.4 + '@rollup/rollup-freebsd-x64': 4.52.4 + '@rollup/rollup-linux-arm-gnueabihf': 4.52.4 + '@rollup/rollup-linux-arm-musleabihf': 4.52.4 + '@rollup/rollup-linux-arm64-gnu': 4.52.4 + '@rollup/rollup-linux-arm64-musl': 4.52.4 + '@rollup/rollup-linux-loong64-gnu': 4.52.4 + '@rollup/rollup-linux-ppc64-gnu': 4.52.4 + '@rollup/rollup-linux-riscv64-gnu': 4.52.4 + '@rollup/rollup-linux-riscv64-musl': 4.52.4 + '@rollup/rollup-linux-s390x-gnu': 4.52.4 + '@rollup/rollup-linux-x64-gnu': 4.52.4 + '@rollup/rollup-linux-x64-musl': 4.52.4 + '@rollup/rollup-openharmony-arm64': 4.52.4 + '@rollup/rollup-win32-arm64-msvc': 4.52.4 + '@rollup/rollup-win32-ia32-msvc': 4.52.4 + '@rollup/rollup-win32-x64-gnu': 4.52.4 + '@rollup/rollup-win32-x64-msvc': 4.52.4 fsevents: 2.3.3 run-async@2.4.1: {} @@ -6471,11 +7022,11 @@ snapshots: safer-buffer@2.1.2: {} - scheduler@0.26.0: {} + scheduler@0.27.0: {} semver@6.3.1: {} - semver@7.7.2: {} + semver@7.7.3: {} sentence-case@2.1.1: dependencies: @@ -6504,34 +7055,36 @@ snapshots: es-errors: 1.3.0 es-object-atoms: 1.1.1 - sharp@0.34.4: + sharp@0.34.5: dependencies: '@img/colour': 1.0.0 - detect-libc: 2.1.0 - semver: 7.7.2 + detect-libc: 2.1.2 + semver: 7.7.3 optionalDependencies: - '@img/sharp-darwin-arm64': 0.34.4 - '@img/sharp-darwin-x64': 0.34.4 - '@img/sharp-libvips-darwin-arm64': 1.2.3 - '@img/sharp-libvips-darwin-x64': 1.2.3 - '@img/sharp-libvips-linux-arm': 1.2.3 - '@img/sharp-libvips-linux-arm64': 1.2.3 - '@img/sharp-libvips-linux-ppc64': 1.2.3 - '@img/sharp-libvips-linux-s390x': 1.2.3 - '@img/sharp-libvips-linux-x64': 1.2.3 - '@img/sharp-libvips-linuxmusl-arm64': 1.2.3 - '@img/sharp-libvips-linuxmusl-x64': 1.2.3 - '@img/sharp-linux-arm': 0.34.4 - '@img/sharp-linux-arm64': 0.34.4 - '@img/sharp-linux-ppc64': 0.34.4 - '@img/sharp-linux-s390x': 0.34.4 - '@img/sharp-linux-x64': 0.34.4 - '@img/sharp-linuxmusl-arm64': 0.34.4 - '@img/sharp-linuxmusl-x64': 0.34.4 - '@img/sharp-wasm32': 0.34.4 - '@img/sharp-win32-arm64': 0.34.4 - '@img/sharp-win32-ia32': 0.34.4 - '@img/sharp-win32-x64': 0.34.4 + '@img/sharp-darwin-arm64': 0.34.5 + '@img/sharp-darwin-x64': 0.34.5 + '@img/sharp-libvips-darwin-arm64': 1.2.4 + '@img/sharp-libvips-darwin-x64': 1.2.4 + '@img/sharp-libvips-linux-arm': 1.2.4 + '@img/sharp-libvips-linux-arm64': 1.2.4 + '@img/sharp-libvips-linux-ppc64': 1.2.4 + '@img/sharp-libvips-linux-riscv64': 1.2.4 + '@img/sharp-libvips-linux-s390x': 1.2.4 + '@img/sharp-libvips-linux-x64': 1.2.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + '@img/sharp-linux-arm': 0.34.5 + '@img/sharp-linux-arm64': 0.34.5 + '@img/sharp-linux-ppc64': 0.34.5 + '@img/sharp-linux-riscv64': 0.34.5 + '@img/sharp-linux-s390x': 0.34.5 + '@img/sharp-linux-x64': 0.34.5 + '@img/sharp-linuxmusl-arm64': 0.34.5 + '@img/sharp-linuxmusl-x64': 0.34.5 + '@img/sharp-wasm32': 0.34.5 + '@img/sharp-win32-arm64': 0.34.5 + '@img/sharp-win32-ia32': 0.34.5 + '@img/sharp-win32-x64': 0.34.5 optional: true shebang-command@2.0.0: @@ -6578,10 +7131,14 @@ snapshots: simple-update-notifier@2.0.0: dependencies: - semver: 7.7.2 + semver: 7.7.3 + + sisteransi@1.0.5: {} slash@3.0.0: {} + slash@5.1.0: {} + smart-buffer@4.2.0: {} snake-case@2.1.0: @@ -6591,22 +7148,20 @@ snapshots: socks-proxy-agent@8.0.5: dependencies: agent-base: 7.1.4 - debug: 4.4.1(supports-color@5.5.0) - socks: 2.8.6 + debug: 4.4.3(supports-color@5.5.0) + socks: 2.8.7 transitivePeerDependencies: - supports-color - socks@2.8.6: + socks@2.8.7: dependencies: - ip-address: 9.0.5 + ip-address: 10.0.1 smart-buffer: 4.2.0 source-map-js@1.2.1: {} source-map@0.6.1: {} - spawn-command@0.0.2: {} - spawndamnit@3.0.1: dependencies: cross-spawn: 7.0.6 @@ -6614,11 +7169,11 @@ snapshots: sprintf-js@1.0.3: {} - sprintf-js@1.1.3: {} - stackback@0.0.2: {} - std-env@3.9.0: {} + std-env@3.10.0: {} + + stdin-discarder@0.2.2: {} stop-iteration-iterator@1.1.0: dependencies: @@ -6631,11 +7186,11 @@ snapshots: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - string-width@5.1.2: + string-width@7.2.0: dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.1.0 + emoji-regex: 10.6.0 + get-east-asian-width: 1.4.0 + strip-ansi: 7.1.2 string.prototype.matchall@4.0.12: dependencies: @@ -6689,26 +7244,24 @@ snapshots: dependencies: ansi-regex: 5.0.1 - strip-ansi@7.1.0: + strip-ansi@7.1.2: dependencies: - ansi-regex: 6.1.0 + ansi-regex: 6.2.2 strip-bom@3.0.0: {} + strip-bom@4.0.0: {} + strip-final-newline@2.0.0: {} strip-json-comments@2.0.1: {} strip-json-comments@3.1.1: {} - strip-literal@3.0.0: - dependencies: - js-tokens: 9.0.1 - - styled-jsx@5.1.6(react@19.1.0): + styled-jsx@5.1.6(react@19.2.0): dependencies: client-only: 0.0.1 - react: 19.1.0 + react: 19.2.0 supports-color@5.5.0: dependencies: @@ -6729,25 +7282,43 @@ snapshots: lower-case: 1.1.4 upper-case: 1.1.3 - term-size@2.2.1: {} - - test-exclude@7.0.1: + syncpack@13.0.4(typescript@5.9.3): dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 10.4.5 + chalk: 5.6.2 + chalk-template: 1.1.2 + commander: 13.1.0 + cosmiconfig: 9.0.0(typescript@5.9.3) + effect: 3.19.6 + enquirer: 2.4.1 + fast-check: 3.23.2 + globby: 14.1.0 + jsonc-parser: 3.3.1 minimatch: 9.0.5 + npm-package-arg: 12.0.2 + ora: 8.2.0 + prompts: 2.4.2 + read-yaml-file: 2.1.0 + semver: 7.7.3 + tightrope: 0.2.0 + ts-toolbelt: 9.6.0 + transitivePeerDependencies: + - typescript + + term-size@2.2.1: {} through@2.3.8: {} + tightrope@0.2.0: {} + tinybench@2.9.0: {} tinycolor2@1.6.0: {} tinyexec@0.3.2: {} - tinyglobby@0.2.14: + tinyglobby@0.2.15: dependencies: - fdir: 6.4.6(picomatch@4.0.3) + fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 tinygradient@1.1.5: @@ -6755,11 +7326,7 @@ snapshots: '@types/tinycolor2': 1.4.6 tinycolor2: 1.6.0 - tinypool@1.1.1: {} - - tinyrainbow@2.0.0: {} - - tinyspy@4.0.3: {} + tinyrainbow@3.0.3: {} title-case@2.1.1: dependencies: @@ -6782,54 +7349,83 @@ snapshots: dependencies: typescript: 5.8.3 - ts-node@10.9.2(@types/node@20.19.9)(typescript@5.5.4): + ts-node@10.9.2(@types/node@20.19.21)(typescript@5.8.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.19.9 + '@types/node': 20.19.21 acorn: 8.15.0 acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.5.4 + typescript: 5.8.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 + ts-toolbelt@9.6.0: {} + tslib@1.14.1: {} tslib@2.8.1: {} - turbo-darwin-64@2.5.5: + turbo-darwin-64@2.6.1: + optional: true + + turbo-darwin-64@2.6.2: + optional: true + + turbo-darwin-arm64@2.6.1: + optional: true + + turbo-darwin-arm64@2.6.2: + optional: true + + turbo-linux-64@2.6.1: + optional: true + + turbo-linux-64@2.6.2: + optional: true + + turbo-linux-arm64@2.6.1: optional: true - turbo-darwin-arm64@2.5.5: + turbo-linux-arm64@2.6.2: optional: true - turbo-linux-64@2.5.5: + turbo-windows-64@2.6.1: optional: true - turbo-linux-arm64@2.5.5: + turbo-windows-64@2.6.2: optional: true - turbo-windows-64@2.5.5: + turbo-windows-arm64@2.6.1: optional: true - turbo-windows-arm64@2.5.5: + turbo-windows-arm64@2.6.2: optional: true - turbo@2.5.5: + turbo@2.6.1: + optionalDependencies: + turbo-darwin-64: 2.6.1 + turbo-darwin-arm64: 2.6.1 + turbo-linux-64: 2.6.1 + turbo-linux-arm64: 2.6.1 + turbo-windows-64: 2.6.1 + turbo-windows-arm64: 2.6.1 + + turbo@2.6.2: optionalDependencies: - turbo-darwin-64: 2.5.5 - turbo-darwin-arm64: 2.5.5 - turbo-linux-64: 2.5.5 - turbo-linux-arm64: 2.5.5 - turbo-windows-64: 2.5.5 - turbo-windows-arm64: 2.5.5 + turbo-darwin-64: 2.6.2 + turbo-darwin-arm64: 2.6.2 + turbo-linux-64: 2.6.2 + turbo-linux-arm64: 2.6.2 + turbo-windows-64: 2.6.2 + turbo-windows-arm64: 2.6.2 type-check@0.4.0: dependencies: @@ -6870,21 +7466,21 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.38.0(eslint@9.31.0)(typescript@5.8.3): + typescript-eslint@8.46.1(eslint@9.37.0)(typescript@5.8.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.38.0(@typescript-eslint/parser@8.38.0(eslint@9.31.0)(typescript@5.8.3))(eslint@9.31.0)(typescript@5.8.3) - '@typescript-eslint/parser': 8.38.0(eslint@9.31.0)(typescript@5.8.3) - '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.8.3) - '@typescript-eslint/utils': 8.38.0(eslint@9.31.0)(typescript@5.8.3) - eslint: 9.31.0 + '@typescript-eslint/eslint-plugin': 8.46.1(@typescript-eslint/parser@8.46.1(eslint@9.37.0)(typescript@5.8.3))(eslint@9.37.0)(typescript@5.8.3) + '@typescript-eslint/parser': 8.46.1(eslint@9.37.0)(typescript@5.8.3) + '@typescript-eslint/typescript-estree': 8.46.1(typescript@5.8.3) + '@typescript-eslint/utils': 8.46.1(eslint@9.37.0)(typescript@5.8.3) + eslint: 9.37.0 typescript: 5.8.3 transitivePeerDependencies: - supports-color - typescript@5.5.4: {} - typescript@5.8.3: {} + typescript@5.9.3: {} + uglify-js@3.19.3: optional: true @@ -6899,6 +7495,10 @@ snapshots: undici-types@6.21.0: {} + undici-types@7.16.0: {} + + unicorn-magic@0.3.0: {} + universalify@0.1.2: {} universalify@2.0.1: {} @@ -6920,90 +7520,68 @@ snapshots: util-deprecate@1.0.2: {} - uuid@11.1.0: {} + uuid@13.0.0: {} v8-compile-cache-lib@3.0.1: {} validate-npm-package-name@5.0.1: {} - viem@2.33.0(typescript@5.8.3): + validate-npm-package-name@6.0.2: {} + + viem@2.40.3(typescript@5.9.3): dependencies: - '@noble/curves': 1.9.2 + '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.0.8(typescript@5.8.3) - isows: 1.0.7(ws@8.18.2) - ox: 0.8.1(typescript@5.8.3) - ws: 8.18.2 + abitype: 1.1.0(typescript@5.9.3) + isows: 1.0.7(ws@8.18.3) + ox: 0.9.17(typescript@5.9.3) + ws: 8.18.3 optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.3 transitivePeerDependencies: - bufferutil - utf-8-validate - zod - vite-node@3.2.4(@types/node@22.16.5): - dependencies: - cac: 6.7.14 - debug: 4.4.1(supports-color@5.5.0) - es-module-lexer: 1.7.0 - pathe: 2.0.3 - vite: 7.0.5(@types/node@22.16.5) - transitivePeerDependencies: - - '@types/node' - - jiti - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - - vite@7.0.5(@types/node@22.16.5): + vite@7.1.10(@types/node@24.10.1): dependencies: - esbuild: 0.25.8 - fdir: 6.4.6(picomatch@4.0.3) + esbuild: 0.25.11 + fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.45.1 - tinyglobby: 0.2.14 + rollup: 4.52.4 + tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 22.16.5 + '@types/node': 24.10.1 fsevents: 2.3.3 - vitest@3.2.4(@types/node@22.16.5)(happy-dom@20.0.2): + vitest@4.0.14(@types/node@24.10.1)(happy-dom@20.0.10): dependencies: - '@types/chai': 5.2.2 - '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.0.5(@types/node@22.16.5)) - '@vitest/pretty-format': 3.2.4 - '@vitest/runner': 3.2.4 - '@vitest/snapshot': 3.2.4 - '@vitest/spy': 3.2.4 - '@vitest/utils': 3.2.4 - chai: 5.2.1 - debug: 4.4.1(supports-color@5.5.0) + '@vitest/expect': 4.0.14 + '@vitest/mocker': 4.0.14(vite@7.1.10(@types/node@24.10.1)) + '@vitest/pretty-format': 4.0.14 + '@vitest/runner': 4.0.14 + '@vitest/snapshot': 4.0.14 + '@vitest/spy': 4.0.14 + '@vitest/utils': 4.0.14 + es-module-lexer: 1.7.0 expect-type: 1.2.2 - magic-string: 0.30.17 + magic-string: 0.30.21 + obug: 2.1.1 pathe: 2.0.3 picomatch: 4.0.3 - std-env: 3.9.0 + std-env: 3.10.0 tinybench: 2.9.0 tinyexec: 0.3.2 - tinyglobby: 0.2.14 - tinypool: 1.1.1 - tinyrainbow: 2.0.0 - vite: 7.0.5(@types/node@22.16.5) - vite-node: 3.2.4(@types/node@22.16.5) + tinyglobby: 0.2.15 + tinyrainbow: 3.0.3 + vite: 7.1.10(@types/node@24.10.1) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.16.5 - happy-dom: 20.0.2 + '@types/node': 24.10.1 + happy-dom: 20.0.10 transitivePeerDependencies: - jiti - less @@ -7013,7 +7591,6 @@ snapshots: - sass-embedded - stylus - sugarss - - supports-color - terser - tsx - yaml @@ -7040,7 +7617,7 @@ snapshots: is-async-function: 2.1.1 is-date-object: 1.1.0 is-finalizationregistry: 1.1.1 - is-generator-function: 1.1.0 + is-generator-function: 1.1.2 is-regex: 1.2.1 is-weakref: 1.1.1 isarray: 2.0.5 @@ -7090,20 +7667,22 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 - wrap-ansi@8.1.0: + wrap-ansi@9.0.2: dependencies: - ansi-styles: 6.2.1 - string-width: 5.1.2 - strip-ansi: 7.1.0 + ansi-styles: 6.2.3 + string-width: 7.2.0 + strip-ansi: 7.1.2 wrappy@1.0.2: {} - ws@8.18.2: {} + ws@8.18.3: {} y18n@5.0.8: {} yargs-parser@21.1.1: {} + yargs-parser@22.0.0: {} + yargs@17.7.2: dependencies: cliui: 8.0.1 @@ -7114,6 +7693,15 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 + yargs@18.0.0: + dependencies: + cliui: 9.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + string-width: 7.2.0 + y18n: 5.0.8 + yargs-parser: 22.0.0 + yn@3.1.1: {} yocto-queue@0.1.0: {} From aab8538fbafd44a3d2033b48a07b2fd69a1d516c Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Sat, 13 Dec 2025 23:36:04 +0700 Subject: [PATCH 093/119] fix: extras/web/package.json to reduce vulnerabilities (#109) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-bot --- extras/web/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/web/package.json b/extras/web/package.json index b5b121c878..cdc7e2adb1 100644 --- a/extras/web/package.json +++ b/extras/web/package.json @@ -13,7 +13,7 @@ }, "dependencies": { "@repo/ui": "workspace:*", - "next": "^15.5.7", + "next": "^15.4.10", "react": "^19.1.0", "react-dom": "^19.1.0" }, From 64c12ad2fd670f21de2f10b912100f8e691f8fbc Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Sat, 13 Dec 2025 23:40:35 +0700 Subject: [PATCH 094/119] fix: extras/docs/package.json to reduce vulnerabilities (#106) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14400636 - https://snyk.io/vuln/SNYK-JS-NEXT-14400644 Co-authored-by: snyk-bot --- extras/docs/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/docs/package.json b/extras/docs/package.json index f761f0b2dd..abadc74fd7 100644 --- a/extras/docs/package.json +++ b/extras/docs/package.json @@ -13,7 +13,7 @@ }, "dependencies": { "@repo/ui": "workspace:*", - "next": "^15.5.7", + "next": "^15.5.9", "react": "^19.1.0", "react-dom": "^19.1.0" }, From 38d1a6bd21c72c6f7629ce91b508521b60c4bd78 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 13 Dec 2025 23:51:00 +0700 Subject: [PATCH 095/119] Bump next in the npm_and_yarn group across 1 directory (#110) Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.5.7 to 15.5.9 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.7...v15.5.9) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- extras/web/package.json | 2 +- pnpm-lock.yaml | 90 ++++++++++++++++++++--------------------- 2 files changed, 46 insertions(+), 46 deletions(-) diff --git a/extras/web/package.json b/extras/web/package.json index cdc7e2adb1..3b57fed2b3 100644 --- a/extras/web/package.json +++ b/extras/web/package.json @@ -13,7 +13,7 @@ }, "dependencies": { "@repo/ui": "workspace:*", - "next": "^15.4.10", + "next": "^15.5.9", "react": "^19.1.0", "react-dom": "^19.1.0" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a81600c517..a5a389f7d3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -39,8 +39,8 @@ importers: specifier: workspace:* version: link:../../repo/ui next: - specifier: ^15.5.7 - version: 15.5.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + specifier: ^15.5.9 + version: 15.5.9(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: specifier: ^19.1.0 version: 19.2.0 @@ -76,8 +76,8 @@ importers: specifier: workspace:* version: link:../../repo/ui next: - specifier: ^15.5.7 - version: 15.5.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + specifier: ^15.5.9 + version: 15.5.9(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: specifier: ^19.1.0 version: 19.2.0 @@ -488,7 +488,7 @@ importers: version: 5.2.0(eslint@9.37.0) eslint-plugin-turbo: specifier: ^2.5.4 - version: 2.5.8(eslint@9.37.0)(turbo@2.6.2) + version: 2.5.8(eslint@9.37.0)(turbo@2.6.3) globals: specifier: ^15.15.0 version: 15.15.0 @@ -1174,8 +1174,8 @@ packages: '@manypkg/get-packages@1.1.3': resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} - '@next/env@15.5.7': - resolution: {integrity: sha512-4h6Y2NyEkIEN7Z8YxkA27pq6zTkS09bUSYC0xjd0NpwFxjnIKeZEeH591o5WECSmjpUhLn3H2QLJcDye3Uzcvg==} + '@next/env@15.5.9': + resolution: {integrity: sha512-4GlTZ+EJM7WaW2HEZcyU317tIQDjkQIyENDLxYJfSWlfqguN+dHkZgyQTV/7ykvobU7yEH5gKvreNrH4B6QgIg==} '@next/eslint-plugin-next@15.5.5': resolution: {integrity: sha512-FMzm412l9oFB8zdRD+K6HQ1VzlS+sNNsdg0MfvTg0i8lfCyTgP/RFxiu/pGJqZ/IQnzn9xSiLkjOVI7Iv4nbdQ==} @@ -1759,8 +1759,8 @@ packages: camel-case@3.0.0: resolution: {integrity: sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==} - caniuse-lite@1.0.30001759: - resolution: {integrity: sha512-Pzfx9fOKoKvevQf8oCXoyNRQ5QyxJj+3O0Rqx2V5oxT61KGx8+n6hV/IUyJeifUci2clnmmKVpvtiqRzgiWjSw==} + caniuse-lite@1.0.30001760: + resolution: {integrity: sha512-7AAMPcueWELt1p3mi13HR/LHH0TJLT11cnwDJEs3xA4+CK/PLKeO9Kl1oru24htkyUKtkGCvAx4ohB0Ttry8Dw==} cbor2@1.12.0: resolution: {integrity: sha512-3Cco8XQhi27DogSp9Ri6LYNZLi/TBY/JVnDe+mj06NkBjW/ZYOtekaEU4wZ4xcRMNrFkDv8KNtOAqHyDfz3lYg==} @@ -2924,8 +2924,8 @@ packages: resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} engines: {node: '>= 0.4.0'} - next@15.5.7: - resolution: {integrity: sha512-+t2/0jIJ48kUpGKkdlhgkv+zPTEOoXyr60qXe68eB/pl3CMJaLeIGjzp5D6Oqt25hCBiBTt8wEeeAzfJvUKnPQ==} + next@15.5.9: + resolution: {integrity: sha512-agNLK89seZEtC5zUHwtut0+tNrc0Xw4FT/Dg+B/VLEo9pAcS9rtTKpek3V6kVcVwsB2YlqMaHdfZL4eLEVYuCg==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: @@ -3658,8 +3658,8 @@ packages: cpu: [x64] os: [darwin] - turbo-darwin-64@2.6.2: - resolution: {integrity: sha512-nF9d/YAyrNkyXn9lp3ZtgXPb7fZsik3cUNe/sBvUO0G5YezUS/kDYYw77IdjizDzairz8pL2ITCTUreG2d5iZQ==} + turbo-darwin-64@2.6.3: + resolution: {integrity: sha512-BlJJDc1CQ7SK5Y5qnl7AzpkvKSnpkfPmnA+HeU/sgny3oHZckPV2776ebO2M33CYDSor7+8HQwaodY++IINhYg==} cpu: [x64] os: [darwin] @@ -3668,8 +3668,8 @@ packages: cpu: [arm64] os: [darwin] - turbo-darwin-arm64@2.6.2: - resolution: {integrity: sha512-mmm0jFaVramST26XE1Lk2qjkjvLJHOe9f3TFjqY+aByjMK/ZmKE5WFPuCWo4L3xhwx+16T37rdPP//76loB3oA==} + turbo-darwin-arm64@2.6.3: + resolution: {integrity: sha512-MwVt7rBKiOK7zdYerenfCRTypefw4kZCue35IJga9CH1+S50+KTiCkT6LBqo0hHeoH2iKuI0ldTF2a0aB72z3w==} cpu: [arm64] os: [darwin] @@ -3678,8 +3678,8 @@ packages: cpu: [x64] os: [linux] - turbo-linux-64@2.6.2: - resolution: {integrity: sha512-IUMHjkVRJDUABGpi+iS1Le59aOl5DX88U5UT/mKaE7nNEjG465+a8UtYno56cZnLP+C6BkX4I93LFgYf9syjGQ==} + turbo-linux-64@2.6.3: + resolution: {integrity: sha512-cqpcw+dXxbnPtNnzeeSyWprjmuFVpHJqKcs7Jym5oXlu/ZcovEASUIUZVN3OGEM6Y/OTyyw0z09tOHNt5yBAVg==} cpu: [x64] os: [linux] @@ -3688,8 +3688,8 @@ packages: cpu: [arm64] os: [linux] - turbo-linux-arm64@2.6.2: - resolution: {integrity: sha512-0qQdZiimMUZj2Gfq87thYu0E02NaNcsB3lcEK/TD70Zzi7AxQoxye664Gis0Uao2j2L9/+05wC2btZ7SoFX3Gw==} + turbo-linux-arm64@2.6.3: + resolution: {integrity: sha512-MterpZQmjXyr4uM7zOgFSFL3oRdNKeflY7nsjxJb2TklsYqiu3Z9pQ4zRVFFH8n0mLGna7MbQMZuKoWqqHb45w==} cpu: [arm64] os: [linux] @@ -3698,8 +3698,8 @@ packages: cpu: [x64] os: [win32] - turbo-windows-64@2.6.2: - resolution: {integrity: sha512-BmMfFmt0VaoZL4NbtDq/dzGfjHsPoGU2+vFiZtkiYsttHY3fd/Dmgnu9PuRyJN1pv2M22q88rXO+dqYRHztLMw==} + turbo-windows-64@2.6.3: + resolution: {integrity: sha512-biDU70v9dLwnBdLf+daoDlNJVvqOOP8YEjqNipBHzgclbQlXbsi6Gqqelp5er81Qo3BiRgmTNx79oaZQTPb07Q==} cpu: [x64] os: [win32] @@ -3708,8 +3708,8 @@ packages: cpu: [arm64] os: [win32] - turbo-windows-arm64@2.6.2: - resolution: {integrity: sha512-0r4s4M/FgLxfjrdLPdqQUur8vZAtaWEi4jhkQ6wCIN2xzA9aee9IKwM53w7CQcjaLvWhT0AU7LTQHjFaHwxiKw==} + turbo-windows-arm64@2.6.3: + resolution: {integrity: sha512-dDHVKpSeukah3VsI/xMEKeTnV9V9cjlpFSUs4bmsUiLu3Yv2ENlgVEZv65wxbeE0bh0jjpmElDT+P1KaCxArQQ==} cpu: [arm64] os: [win32] @@ -3717,8 +3717,8 @@ packages: resolution: {integrity: sha512-qBwXXuDT3rA53kbNafGbT5r++BrhRgx3sAo0cHoDAeG9g1ItTmUMgltz3Hy7Hazy1ODqNpR+C7QwqL6DYB52yA==} hasBin: true - turbo@2.6.2: - resolution: {integrity: sha512-LiQAFS6iWvnY8ViGtoPgduWBeuGH9B32XR4p8H8jxU5PudwyHiiyf1jQW0fCC8gCCTz9itkIbqZLIyUu5AG33w==} + turbo@2.6.3: + resolution: {integrity: sha512-bf6YKUv11l5Xfcmg76PyWoy/e2vbkkxFNBGJSnfdSXQC33ZiUfutYh6IXidc5MhsnrFkWfdNNLyaRk+kHMLlwA==} hasBin: true type-check@0.4.0: @@ -4548,7 +4548,7 @@ snapshots: globby: 11.1.0 read-yaml-file: 1.1.0 - '@next/env@15.5.7': {} + '@next/env@15.5.9': {} '@next/eslint-plugin-next@15.5.5': dependencies: @@ -5151,7 +5151,7 @@ snapshots: no-case: 2.3.2 upper-case: 1.1.3 - caniuse-lite@1.0.30001759: {} + caniuse-lite@1.0.30001760: {} cbor2@1.12.0: {} @@ -5620,11 +5620,11 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-turbo@2.5.8(eslint@9.37.0)(turbo@2.6.2): + eslint-plugin-turbo@2.5.8(eslint@9.37.0)(turbo@2.6.3): dependencies: dotenv: 16.0.3 eslint: 9.37.0 - turbo: 2.6.2 + turbo: 2.6.3 eslint-scope@8.4.0: dependencies: @@ -6489,11 +6489,11 @@ snapshots: netmask@2.0.2: {} - next@15.5.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + next@15.5.9(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: - '@next/env': 15.5.7 + '@next/env': 15.5.9 '@swc/helpers': 0.5.15 - caniuse-lite: 1.0.30001759 + caniuse-lite: 1.0.30001760 postcss: 8.4.31 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) @@ -7376,37 +7376,37 @@ snapshots: turbo-darwin-64@2.6.1: optional: true - turbo-darwin-64@2.6.2: + turbo-darwin-64@2.6.3: optional: true turbo-darwin-arm64@2.6.1: optional: true - turbo-darwin-arm64@2.6.2: + turbo-darwin-arm64@2.6.3: optional: true turbo-linux-64@2.6.1: optional: true - turbo-linux-64@2.6.2: + turbo-linux-64@2.6.3: optional: true turbo-linux-arm64@2.6.1: optional: true - turbo-linux-arm64@2.6.2: + turbo-linux-arm64@2.6.3: optional: true turbo-windows-64@2.6.1: optional: true - turbo-windows-64@2.6.2: + turbo-windows-64@2.6.3: optional: true turbo-windows-arm64@2.6.1: optional: true - turbo-windows-arm64@2.6.2: + turbo-windows-arm64@2.6.3: optional: true turbo@2.6.1: @@ -7418,14 +7418,14 @@ snapshots: turbo-windows-64: 2.6.1 turbo-windows-arm64: 2.6.1 - turbo@2.6.2: + turbo@2.6.3: optionalDependencies: - turbo-darwin-64: 2.6.2 - turbo-darwin-arm64: 2.6.2 - turbo-linux-64: 2.6.2 - turbo-linux-arm64: 2.6.2 - turbo-windows-64: 2.6.2 - turbo-windows-arm64: 2.6.2 + turbo-darwin-64: 2.6.3 + turbo-darwin-arm64: 2.6.3 + turbo-linux-64: 2.6.3 + turbo-linux-arm64: 2.6.3 + turbo-windows-64: 2.6.3 + turbo-windows-arm64: 2.6.3 type-check@0.4.0: dependencies: From 214211e43a7cb750ea4769a92326434c22dada23 Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Sun, 14 Dec 2025 00:05:19 +0700 Subject: [PATCH 096/119] Delete .github/workflows/fortify.yml (#111) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --- .github/workflows/fortify.yml | 85 ----------------------------------- 1 file changed, 85 deletions(-) delete mode 100644 .github/workflows/fortify.yml diff --git a/.github/workflows/fortify.yml b/.github/workflows/fortify.yml deleted file mode 100644 index ff1a25baf2..0000000000 --- a/.github/workflows/fortify.yml +++ /dev/null @@ -1,85 +0,0 @@ -# This workflow uses actions that are not certified by GitHub. -# They are provided by a third-party and are governed by -# separate terms of service, privacy policy, and support -# documentation. - -################################################################################################################################################ -# Fortify Application Security provides your team with solutions to empower DevSecOps practices, enable cloud transformation, and secure your # -# software supply chain. To learn more about Fortify, start a free trial or contact our sales team, visit fortify.com. # -# # -# Use this starter workflow as a basis for integrating Fortify Application Security Testing into your GitHub workflows. This template # -# demonstrates the steps to package the code+dependencies, initiate a scan, and optionally import SAST vulnerabilities into GitHub Security # -# Code Scanning Alerts. Additional information is available in the workflow comments and the Fortify AST Action / fcli / Fortify product # -# documentation. If you need additional assistance, please contact Fortify support. # -################################################################################################################################################ - -name: Fortify AST Scan - -# Customize trigger events based on your DevSecOps process and/or policy -on: - push: - branches: [ "master" ] - pull_request: - # The branches below must be a subset of the branches above - branches: [ "master" ] - schedule: - - cron: '31 12 * * 4' - workflow_dispatch: - -jobs: - Fortify-AST-Scan: - # Use the appropriate runner for building your source code. Ensure dev tools required to build your code are present and configured appropriately (MSBuild, Python, etc). - runs-on: ubuntu-latest - permissions: - actions: read - contents: read - security-events: write - - steps: - # Check out source code - - name: Check Out Source Code - uses: actions/checkout@v4 - - # Java is required to run the various Fortify utilities. Ensuring proper version is installed on the runner. - - name: Setup Java - uses: actions/setup-java@v4 - with: - java-version: 17 - distribution: 'temurin' - - # Perform SAST and optionally SCA scan via Fortify on Demand/Fortify Hosted/Software Security Center, then - # optionally export SAST results to the GitHub code scanning dashboard. In case further customization is - # required, you can use sub-actions like fortify/github-action/setup@v1 to set up the various Fortify tools - # and run them directly from within your pipeline; see https://github.com/fortify/github-action#readme for - # details. - - - name: Run FoD SAST Scan - uses: fortify/github-action@a92347297e02391b857e7015792cd1926a4cd418 - with: - sast-scan: true - env: - ### Required configuration when integrating with Fortify on Demand - FOD_URL: https://ams.fortify.com - FOD_TENANT: ${{secrets.FOD_TENANT}} - FOD_USER: ${{secrets.FOD_USER}} - FOD_PASSWORD: ${{secrets.FOD_PAT}} - ### Optional configuration when integrating with Fortify on Demand - # EXTRA_PACKAGE_OPTS: -oss # Extra 'scancentral package' options, like '-oss'' if - # Debricked SCA scan is enabled on Fortify on Demand - # EXTRA_FOD_LOGIN_OPTS: --socket-timeout=60s # Extra 'fcli fod session login' options - # FOD_RELEASE: MyApp:MyRelease # FoD release name, default: /:; may - # replace app+release name with numeric release ID - # DO_WAIT: true # Wait for scan completion, implied if 'DO_EXPORT: true' - # DO_EXPORT: true # Export SAST results to GitHub code scanning dashboard - ### Required configuration when integrating with Fortify Hosted / Software Security Center & ScanCentral - # SSC_URL: ${{secrets.SSC_URL}} # SSC URL - # SSC_TOKEN: ${{secrets.SSC_TOKEN}} # SSC CIToken or AutomationToken - # SC_SAST_TOKEN: ${{secrets.SC_SAST_TOKEN}} # ScanCentral SAST client auth token - # SC_SAST_SENSOR_VERSION: ${{vars.SC_SAST_SENSOR_VERSION}} # Sensor version on which to run the scan; - # usually defined as organization or repo variable - ### Optional configuration when integrating with Fortify Hosted / Software Security Center & ScanCentral - # EXTRA_SC_SAST_LOGIN_OPTS: --socket-timeout=60s # Extra 'fcli sc-sast session login' options - # SSC_APPVERSION: MyApp:MyVersion # SSC application version, default: /: - # EXTRA_PACKAGE_OPTS: -bv myCustomPom.xml # Extra 'scancentral package' options - # DO_WAIT: true # Wait for scan completion, implied if 'DO_EXPORT: true' - # DO_EXPORT: true # Export SAST results to GitHub code scanning dashboard From 42b5d429dec90cbf5e840b4108dcb55683268035 Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Sun, 14 Dec 2025 00:27:43 +0700 Subject: [PATCH 097/119] fix: extras/web/package.json to reduce vulnerabilities (#107) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14400636 - https://snyk.io/vuln/SNYK-JS-NEXT-14400644 Co-authored-by: snyk-bot From 3d54615e48f4f9fda62b41145cfff584e6b2ece5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 14 Dec 2025 14:07:19 +0700 Subject: [PATCH 098/119] Bump the npm_and_yarn group across 1 directory with 3 updates (#115) Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.5.5 to 15.5.9 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.5...v15.5.9) Updates `happy-dom` from 17.6.3 to 20.0.11 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.11) Updates `vite` from 7.1.10 to 7.2.7 - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/v7.2.7/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v7.2.7/packages/vite) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.11 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: vite dependency-version: 7.2.7 dependency-type: indirect dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pnpm-lock.yaml | 2524 ++++++++++++++++++++++++++++-------------------- 1 file changed, 1496 insertions(+), 1028 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c814fa1ae8..af179055b7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,28 +4,34 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + ox: ^0.9.17 + importers: .: devDependencies: '@changesets/cli': specifier: ^2.29.4 - version: 2.29.7(@types/node@22.18.10) + version: 2.29.7(@types/node@24.10.4) lefthook: - specifier: ^1.11.13 - version: 1.13.6 + specifier: ^2.0.4 + version: 2.0.11 prettier: specifier: ^3.5.3 version: 3.6.2 rimraf: - specifier: ^6.0.1 - version: 6.0.1 + specifier: ^6.1.2 + version: 6.1.2 + syncpack: + specifier: ^13.0.4 + version: 13.0.4(typescript@5.9.3) turbo: - specifier: ^2.5.4 - version: 2.5.8 + specifier: ^2.6.1 + version: 2.6.3 typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: ^5.9.3 + version: 5.9.3 extras/docs: dependencies: @@ -33,8 +39,8 @@ importers: specifier: workspace:* version: link:../../repo/ui next: - specifier: ^15.3.3 - version: 15.5.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + specifier: ^15.5.9 + version: 15.5.9(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: specifier: ^19.1.0 version: 19.2.0 @@ -61,8 +67,8 @@ importers: specifier: ^9.28.0 version: 9.37.0 typescript: - specifier: 5.5.4 - version: 5.5.4 + specifier: ^5.8.3 + version: 5.9.3 extras/web: dependencies: @@ -70,8 +76,8 @@ importers: specifier: workspace:* version: link:../../repo/ui next: - specifier: ^15.3.3 - version: 15.5.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + specifier: ^15.5.9 + version: 15.5.9(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: specifier: ^19.1.0 version: 19.2.0 @@ -98,8 +104,8 @@ importers: specifier: ^9.28.0 version: 9.37.0 typescript: - specifier: 5.5.4 - version: 5.5.4 + specifier: ^5.8.3 + version: 5.9.3 packages/services/api: devDependencies: @@ -107,11 +113,11 @@ importers: specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': - specifier: ^22.15.29 - version: 22.18.10 + specifier: ^24.10.1 + version: 24.10.4 typescript: - specifier: ^5.8.3 - version: 5.8.3 + specifier: ^5.9.3 + version: 5.9.3 packages/services/builder: devDependencies: @@ -119,30 +125,30 @@ importers: specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': - specifier: ^22.15.29 - version: 22.18.10 + specifier: ^24.10.1 + version: 24.10.4 typescript: - specifier: ^5.8.3 - version: 5.8.3 + specifier: ^5.9.3 + version: 5.9.3 packages/services/guard: dependencies: ox: - specifier: ^0.7.2 - version: 0.7.2(typescript@5.8.3) + specifier: ^0.9.17 + version: 0.9.17(typescript@5.9.3) devDependencies: '@repo/typescript-config': specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': - specifier: ^22.15.29 - version: 22.18.10 + specifier: ^24.10.1 + version: 24.10.4 typescript: - specifier: ^5.8.3 - version: 5.8.3 + specifier: ^5.9.3 + version: 5.9.3 vitest: - specifier: ^3.2.1 - version: 3.2.4(@types/node@22.18.10)(happy-dom@17.6.3) + specifier: ^4.0.14 + version: 4.0.15(@types/node@24.10.4)(happy-dom@20.0.11) packages/services/identity-instrument: dependencies: @@ -153,21 +159,21 @@ importers: specifier: ^4.0.0 version: 4.0.0 ox: - specifier: ^0.7.2 - version: 0.7.2(typescript@5.8.3) + specifier: ^0.9.17 + version: 0.9.17(typescript@5.9.3) devDependencies: '@repo/typescript-config': specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': - specifier: ^22.15.29 - version: 22.18.10 + specifier: ^24.10.1 + version: 24.10.4 typescript: - specifier: ^5.8.3 - version: 5.8.3 + specifier: ^5.9.3 + version: 5.9.3 vitest: - specifier: ^3.2.1 - version: 3.2.4(@types/node@22.18.10)(happy-dom@17.6.3) + specifier: ^4.0.14 + version: 4.0.15(@types/node@24.10.4)(happy-dom@20.0.11) packages/services/indexer: devDependencies: @@ -175,11 +181,11 @@ importers: specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': - specifier: ^22.15.29 - version: 22.18.10 + specifier: ^24.10.1 + version: 24.10.4 typescript: - specifier: ^5.8.3 - version: 5.8.3 + specifier: ^5.9.3 + version: 5.9.3 packages/services/marketplace: devDependencies: @@ -187,11 +193,11 @@ importers: specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': - specifier: ^22.15.29 - version: 22.18.10 + specifier: ^24.10.1 + version: 24.10.4 typescript: - specifier: ^5.8.3 - version: 5.8.3 + specifier: ^5.9.3 + version: 5.9.3 packages/services/metadata: devDependencies: @@ -199,11 +205,11 @@ importers: specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': - specifier: ^22.15.29 - version: 22.18.10 + specifier: ^24.10.1 + version: 24.10.4 typescript: - specifier: ^5.8.3 - version: 5.8.3 + specifier: ^5.9.3 + version: 5.9.3 packages/services/relayer: dependencies: @@ -212,26 +218,38 @@ importers: version: link:../../wallet/primitives mipd: specifier: ^0.0.7 - version: 0.0.7(typescript@5.8.3) + version: 0.0.7(typescript@5.9.3) ox: - specifier: ^0.7.2 - version: 0.7.2(typescript@5.8.3) + specifier: ^0.9.17 + version: 0.9.17(typescript@5.9.3) viem: - specifier: ^2.37.8 - version: 2.38.2(typescript@5.8.3) + specifier: ^2.40.3 + version: 2.42.0(typescript@5.9.3) devDependencies: '@repo/typescript-config': specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': - specifier: ^22.15.29 - version: 22.18.10 + specifier: ^24.10.1 + version: 24.10.4 typescript: - specifier: ^5.8.3 - version: 5.8.3 + specifier: ^5.9.3 + version: 5.9.3 vitest: - specifier: ^3.2.4 - version: 3.2.4(@types/node@22.18.10)(happy-dom@17.6.3) + specifier: ^4.0.14 + version: 4.0.15(@types/node@24.10.4)(happy-dom@20.0.11) + + packages/services/userdata: + devDependencies: + '@repo/typescript-config': + specifier: workspace:^ + version: link:../../../repo/typescript-config + '@types/node': + specifier: ^24.10.1 + version: 24.10.4 + typescript: + specifier: ^5.9.3 + version: 5.9.3 packages/utils/abi: devDependencies: @@ -239,11 +257,11 @@ importers: specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': - specifier: ^22.15.29 - version: 22.18.10 + specifier: ^24.10.1 + version: 24.10.4 typescript: - specifier: ^5.8.3 - version: 5.8.3 + specifier: ^5.9.3 + version: 5.9.3 packages/wallet/core: dependencies: @@ -258,35 +276,35 @@ importers: version: link:../primitives mipd: specifier: ^0.0.7 - version: 0.0.7(typescript@5.8.3) + version: 0.0.7(typescript@5.9.3) ox: - specifier: ^0.7.2 - version: 0.7.2(typescript@5.8.3) + specifier: ^0.9.17 + version: 0.9.17(typescript@5.9.3) viem: - specifier: ^2.30.6 - version: 2.38.2(typescript@5.8.3) + specifier: ^2.40.3 + version: 2.42.0(typescript@5.9.3) devDependencies: '@repo/typescript-config': specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': - specifier: ^22.15.29 - version: 22.18.10 + specifier: ^24.10.1 + version: 24.10.4 '@vitest/coverage-v8': - specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@22.18.10)(happy-dom@17.6.3)) + specifier: ^4.0.14 + version: 4.0.15(vitest@4.0.15(@types/node@24.10.4)(happy-dom@20.0.11)) dotenv: - specifier: ^16.5.0 - version: 16.6.1 + specifier: ^17.2.3 + version: 17.2.3 fake-indexeddb: - specifier: ^6.0.1 - version: 6.2.3 + specifier: ^6.2.5 + version: 6.2.5 typescript: - specifier: ^5.8.3 - version: 5.8.3 + specifier: ^5.9.3 + version: 5.9.3 vitest: - specifier: ^3.2.1 - version: 3.2.4(@types/node@22.18.10)(happy-dom@17.6.3) + specifier: ^4.0.14 + version: 4.0.15(@types/node@24.10.4)(happy-dom@20.0.11) packages/wallet/dapp-client: dependencies: @@ -303,52 +321,52 @@ importers: specifier: workspace:^ version: link:../primitives ox: - specifier: ^0.7.2 - version: 0.7.2(typescript@5.8.3) + specifier: ^0.9.17 + version: 0.9.17(typescript@5.9.3) devDependencies: '@repo/typescript-config': specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': - specifier: ^22.15.29 - version: 22.18.10 + specifier: ^24.10.1 + version: 24.10.4 '@vitest/coverage-v8': - specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@22.18.10)(happy-dom@17.6.3)) + specifier: ^4.0.14 + version: 4.0.15(vitest@4.0.15(@types/node@24.10.4)(happy-dom@20.0.11)) dotenv: - specifier: ^16.5.0 - version: 16.6.1 + specifier: ^17.2.3 + version: 17.2.3 fake-indexeddb: - specifier: ^6.0.1 - version: 6.2.3 + specifier: ^6.2.5 + version: 6.2.5 happy-dom: - specifier: ^17.2.2 - version: 17.6.3 + specifier: ^20.0.10 + version: 20.0.11 typescript: - specifier: ^5.8.3 - version: 5.8.3 + specifier: ^5.9.3 + version: 5.9.3 vitest: - specifier: ^3.2.1 - version: 3.2.4(@types/node@22.18.10)(happy-dom@17.6.3) + specifier: ^4.0.14 + version: 4.0.15(@types/node@24.10.4)(happy-dom@20.0.11) packages/wallet/primitives: dependencies: ox: - specifier: ^0.7.2 - version: 0.7.2(typescript@5.8.3) + specifier: ^0.9.17 + version: 0.9.17(typescript@5.9.3) devDependencies: '@repo/typescript-config': specifier: workspace:^ version: link:../../../repo/typescript-config '@vitest/coverage-v8': - specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@22.18.10)(happy-dom@17.6.3)) + specifier: ^4.0.14 + version: 4.0.15(vitest@4.0.15(@types/node@24.10.4)(happy-dom@20.0.11)) typescript: - specifier: ^5.8.3 - version: 5.8.3 + specifier: ^5.9.3 + version: 5.9.3 vitest: - specifier: ^3.2.1 - version: 3.2.4(@types/node@22.18.10)(happy-dom@17.6.3) + specifier: ^4.0.14 + version: 4.0.15(@types/node@24.10.4)(happy-dom@20.0.11) packages/wallet/primitives-cli: dependencies: @@ -356,11 +374,11 @@ importers: specifier: workspace:^ version: link:../primitives ox: - specifier: ^0.7.2 - version: 0.7.2(typescript@5.8.3) + specifier: ^0.9.17 + version: 0.9.17(typescript@5.9.3) yargs: - specifier: ^17.7.2 - version: 17.7.2 + specifier: ^18.0.0 + version: 18.0.0 devDependencies: '@repo/eslint-config': specifier: workspace:* @@ -369,23 +387,23 @@ importers: specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': - specifier: ^22.15.29 - version: 22.18.10 + specifier: ^24.10.1 + version: 24.10.4 '@types/yargs': - specifier: ^17.0.33 - version: 17.0.33 + specifier: ^17.0.35 + version: 17.0.35 concurrently: - specifier: ^8.2.2 - version: 8.2.2 + specifier: ^9.2.1 + version: 9.2.1 esbuild: - specifier: ^0.25.5 - version: 0.25.11 + specifier: ^0.27.0 + version: 0.27.1 nodemon: - specifier: ^3.1.10 - version: 3.1.10 + specifier: ^3.1.11 + version: 3.1.11 typescript: - specifier: ^5.8.3 - version: 5.8.3 + specifier: ^5.9.3 + version: 5.9.3 packages/wallet/wdk: dependencies: @@ -408,42 +426,42 @@ importers: specifier: workspace:^ version: link:../primitives idb: - specifier: ^7.1.1 - version: 7.1.1 + specifier: ^8.0.3 + version: 8.0.3 jwt-decode: specifier: ^4.0.0 version: 4.0.0 ox: - specifier: ^0.7.2 - version: 0.7.2(typescript@5.8.3) + specifier: ^0.9.17 + version: 0.9.17(typescript@5.9.3) uuid: - specifier: ^11.1.0 - version: 11.1.0 + specifier: ^13.0.0 + version: 13.0.0 devDependencies: '@repo/typescript-config': specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': - specifier: ^22.15.29 - version: 22.18.10 + specifier: ^24.10.1 + version: 24.10.4 '@vitest/coverage-v8': - specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@22.18.10)(happy-dom@17.6.3)) + specifier: ^4.0.14 + version: 4.0.15(vitest@4.0.15(@types/node@24.10.4)(happy-dom@20.0.11)) dotenv: - specifier: ^16.5.0 - version: 16.6.1 + specifier: ^17.2.3 + version: 17.2.3 fake-indexeddb: - specifier: ^6.0.1 - version: 6.2.3 + specifier: ^6.2.5 + version: 6.2.5 happy-dom: - specifier: ^17.2.2 - version: 17.6.3 + specifier: ^20.0.10 + version: 20.0.11 typescript: - specifier: ^5.8.3 - version: 5.8.3 + specifier: ^5.9.3 + version: 5.9.3 vitest: - specifier: ^3.2.1 - version: 3.2.4(@types/node@22.18.10)(happy-dom@17.6.3) + specifier: ^4.0.14 + version: 4.0.15(@types/node@24.10.4)(happy-dom@20.0.11) repo/eslint-config: devDependencies: @@ -470,7 +488,7 @@ importers: version: 5.2.0(eslint@9.37.0) eslint-plugin-turbo: specifier: ^2.5.4 - version: 2.5.8(eslint@9.37.0)(turbo@2.5.8) + version: 2.5.8(eslint@9.37.0)(turbo@2.6.3) globals: specifier: ^15.15.0 version: 15.15.0 @@ -500,7 +518,7 @@ importers: version: link:../typescript-config '@turbo/gen': specifier: ^1.13.4 - version: 1.13.4(@types/node@20.19.21)(typescript@5.5.4) + version: 1.13.4(@types/node@20.19.21)(typescript@5.9.3) '@types/node': specifier: ^20.17.57 version: 20.19.21 @@ -511,8 +529,8 @@ importers: specifier: ^19.2.3 version: 19.2.3(@types/react@19.2.6) typescript: - specifier: 5.5.4 - version: 5.5.4 + specifier: ^5.8.3 + version: 5.9.3 packages: @@ -522,20 +540,20 @@ packages: '@adraffy/ens-normalize@1.11.1': resolution: {integrity: sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==} - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} '@babel/helper-string-parser@7.27.1': resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.27.1': - resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} - '@babel/parser@7.28.4': - resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==} + '@babel/parser@7.28.5': + resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} engines: {node: '>=6.0.0'} hasBin: true @@ -547,8 +565,8 @@ packages: resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} engines: {node: '>=6.9.0'} - '@babel/types@7.28.4': - resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} + '@babel/types@7.28.5': + resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} engines: {node: '>=6.9.0'} '@bcoe/v8-coverage@1.0.2': @@ -614,161 +632,317 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@emnapi/runtime@1.5.0': - resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} + '@emnapi/runtime@1.7.1': + resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} + + '@esbuild/aix-ppc64@0.25.12': + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] - '@esbuild/aix-ppc64@0.25.11': - resolution: {integrity: sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==} + '@esbuild/aix-ppc64@0.27.1': + resolution: {integrity: sha512-HHB50pdsBX6k47S4u5g/CaLjqS3qwaOVE5ILsq64jyzgMhLuCuZ8rGzM9yhsAjfjkbgUPMzZEPa7DAp7yz6vuA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.11': - resolution: {integrity: sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==} + '@esbuild/android-arm64@0.25.12': + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.11': - resolution: {integrity: sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==} + '@esbuild/android-arm64@0.27.1': + resolution: {integrity: sha512-45fuKmAJpxnQWixOGCrS+ro4Uvb4Re9+UTieUY2f8AEc+t7d4AaZ6eUJ3Hva7dtrxAAWHtlEFsXFMAgNnGU9uQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.12': + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.27.1': + resolution: {integrity: sha512-kFqa6/UcaTbGm/NncN9kzVOODjhZW8e+FRdSeypWe6j33gzclHtwlANs26JrupOntlcWmB0u8+8HZo8s7thHvg==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.11': - resolution: {integrity: sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==} + '@esbuild/android-x64@0.25.12': + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.11': - resolution: {integrity: sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==} + '@esbuild/android-x64@0.27.1': + resolution: {integrity: sha512-LBEpOz0BsgMEeHgenf5aqmn/lLNTFXVfoWMUox8CtWWYK9X4jmQzWjoGoNb8lmAYml/tQ/Ysvm8q7szu7BoxRQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.12': + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.27.1': + resolution: {integrity: sha512-veg7fL8eMSCVKL7IW4pxb54QERtedFDfY/ASrumK/SbFsXnRazxY4YykN/THYqFnFwJ0aVjiUrVG2PwcdAEqQQ==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.11': - resolution: {integrity: sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==} + '@esbuild/darwin-x64@0.25.12': + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.27.1': + resolution: {integrity: sha512-+3ELd+nTzhfWb07Vol7EZ+5PTbJ/u74nC6iv4/lwIU99Ip5uuY6QoIf0Hn4m2HoV0qcnRivN3KSqc+FyCHjoVQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.11': - resolution: {integrity: sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==} + '@esbuild/freebsd-arm64@0.25.12': + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.27.1': + resolution: {integrity: sha512-/8Rfgns4XD9XOSXlzUDepG8PX+AVWHliYlUkFI3K3GB6tqbdjYqdhcb4BKRd7C0BhZSoaCxhv8kTcBrcZWP+xg==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.11': - resolution: {integrity: sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==} + '@esbuild/freebsd-x64@0.25.12': + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.11': - resolution: {integrity: sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==} + '@esbuild/freebsd-x64@0.27.1': + resolution: {integrity: sha512-GITpD8dK9C+r+5yRT/UKVT36h/DQLOHdwGVwwoHidlnA168oD3uxA878XloXebK4Ul3gDBBIvEdL7go9gCUFzQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.12': + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.27.1': + resolution: {integrity: sha512-W9//kCrh/6in9rWIBdKaMtuTTzNj6jSeG/haWBADqLLa9P8O5YSRDzgD5y9QBok4AYlzS6ARHifAb75V6G670Q==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.11': - resolution: {integrity: sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==} + '@esbuild/linux-arm@0.25.12': + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.11': - resolution: {integrity: sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==} + '@esbuild/linux-arm@0.27.1': + resolution: {integrity: sha512-ieMID0JRZY/ZeCrsFQ3Y3NlHNCqIhTprJfDgSB3/lv5jJZ8FX3hqPyXWhe+gvS5ARMBJ242PM+VNz/ctNj//eA==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.12': + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.11': - resolution: {integrity: sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==} + '@esbuild/linux-ia32@0.27.1': + resolution: {integrity: sha512-VIUV4z8GD8rtSVMfAj1aXFahsi/+tcoXXNYmXgzISL+KB381vbSTNdeZHHHIYqFyXcoEhu9n5cT+05tRv13rlw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.12': + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.11': - resolution: {integrity: sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==} + '@esbuild/linux-loong64@0.27.1': + resolution: {integrity: sha512-l4rfiiJRN7sTNI//ff65zJ9z8U+k6zcCg0LALU5iEWzY+a1mVZ8iWC1k5EsNKThZ7XCQ6YWtsZ8EWYm7r1UEsg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.12': + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.27.1': + resolution: {integrity: sha512-U0bEuAOLvO/DWFdygTHWY8C067FXz+UbzKgxYhXC0fDieFa0kDIra1FAhsAARRJbvEyso8aAqvPdNxzWuStBnA==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.11': - resolution: {integrity: sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==} + '@esbuild/linux-ppc64@0.25.12': + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.27.1': + resolution: {integrity: sha512-NzdQ/Xwu6vPSf/GkdmRNsOfIeSGnh7muundsWItmBsVpMoNPVpM61qNzAVY3pZ1glzzAxLR40UyYM23eaDDbYQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.11': - resolution: {integrity: sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==} + '@esbuild/linux-riscv64@0.25.12': + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.11': - resolution: {integrity: sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==} + '@esbuild/linux-riscv64@0.27.1': + resolution: {integrity: sha512-7zlw8p3IApcsN7mFw0O1Z1PyEk6PlKMu18roImfl3iQHTnr/yAfYv6s4hXPidbDoI2Q0pW+5xeoM4eTCC0UdrQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.12': + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.11': - resolution: {integrity: sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==} + '@esbuild/linux-s390x@0.27.1': + resolution: {integrity: sha512-cGj5wli+G+nkVQdZo3+7FDKC25Uh4ZVwOAK6A06Hsvgr8WqBBuOy/1s+PUEd/6Je+vjfm6stX0kmib5b/O2Ykw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.12': + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.11': - resolution: {integrity: sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==} + '@esbuild/linux-x64@0.27.1': + resolution: {integrity: sha512-z3H/HYI9MM0HTv3hQZ81f+AKb+yEoCRlUby1F80vbQ5XdzEMyY/9iNlAmhqiBKw4MJXwfgsh7ERGEOhrM1niMA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.12': + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.11': - resolution: {integrity: sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==} + '@esbuild/netbsd-arm64@0.27.1': + resolution: {integrity: sha512-wzC24DxAvk8Em01YmVXyjl96Mr+ecTPyOuADAvjGg+fyBpGmxmcr2E5ttf7Im8D0sXZihpxzO1isus8MdjMCXQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.12': + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.27.1': + resolution: {integrity: sha512-1YQ8ybGi2yIXswu6eNzJsrYIGFpnlzEWRl6iR5gMgmsrR0FcNoV1m9k9sc3PuP5rUBLshOZylc9nqSgymI+TYg==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.11': - resolution: {integrity: sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==} + '@esbuild/openbsd-arm64@0.25.12': + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.11': - resolution: {integrity: sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==} + '@esbuild/openbsd-arm64@0.27.1': + resolution: {integrity: sha512-5Z+DzLCrq5wmU7RDaMDe2DVXMRm2tTDvX2KU14JJVBN2CT/qov7XVix85QoJqHltpvAOZUAc3ndU56HSMWrv8g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.12': + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.27.1': + resolution: {integrity: sha512-Q73ENzIdPF5jap4wqLtsfh8YbYSZ8Q0wnxplOlZUOyZy7B4ZKW8DXGWgTCZmF8VWD7Tciwv5F4NsRf6vYlZtqg==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.25.11': - resolution: {integrity: sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==} + '@esbuild/openharmony-arm64@0.25.12': + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/openharmony-arm64@0.27.1': + resolution: {integrity: sha512-ajbHrGM/XiK+sXM0JzEbJAen+0E+JMQZ2l4RR4VFwvV9JEERx+oxtgkpoKv1SevhjavK2z2ReHk32pjzktWbGg==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.25.11': - resolution: {integrity: sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==} + '@esbuild/sunos-x64@0.25.12': + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.27.1': + resolution: {integrity: sha512-IPUW+y4VIjuDVn+OMzHc5FV4GubIwPnsz6ubkvN8cuhEqH81NovB53IUlrlBkPMEPxvNnf79MGBoz8rZ2iW8HA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.11': - resolution: {integrity: sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==} + '@esbuild/win32-arm64@0.25.12': + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.11': - resolution: {integrity: sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==} + '@esbuild/win32-arm64@0.27.1': + resolution: {integrity: sha512-RIVRWiljWA6CdVu8zkWcRmGP7iRRIIwvhDKem8UMBjPql2TXM5PkDVvvrzMtj1V+WFPB4K7zkIGM7VzRtFkjdg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.12': + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.11': - resolution: {integrity: sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==} + '@esbuild/win32-ia32@0.27.1': + resolution: {integrity: sha512-2BR5M8CPbptC1AK5JbJT1fWrHLvejwZidKx3UMSF0ecHMa+smhi16drIrCEggkgviBwLYd5nwrFLSl5Kho96RQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.12': + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.27.1': + resolution: {integrity: sha512-d5X6RMYv6taIymSk8JBP+nxv8DQAMY6A51GPgusqLdK9wBz5wWIXy1KjTck6HnjE9hqJzJRdk+1p/t5soSbCtw==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -831,124 +1005,135 @@ packages: resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} engines: {node: '>=18'} - '@img/sharp-darwin-arm64@0.34.4': - resolution: {integrity: sha512-sitdlPzDVyvmINUdJle3TNHl+AG9QcwiAMsXmccqsCOMZNIdW2/7S26w0LyU8euiLVzFBL3dXPwVCq/ODnf2vA==} + '@img/sharp-darwin-arm64@0.34.5': + resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [darwin] - '@img/sharp-darwin-x64@0.34.4': - resolution: {integrity: sha512-rZheupWIoa3+SOdF/IcUe1ah4ZDpKBGWcsPX6MT0lYniH9micvIU7HQkYTfrx5Xi8u+YqwLtxC/3vl8TQN6rMg==} + '@img/sharp-darwin-x64@0.34.5': + resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [darwin] - '@img/sharp-libvips-darwin-arm64@1.2.3': - resolution: {integrity: sha512-QzWAKo7kpHxbuHqUC28DZ9pIKpSi2ts2OJnoIGI26+HMgq92ZZ4vk8iJd4XsxN+tYfNJxzH6W62X5eTcsBymHw==} + '@img/sharp-libvips-darwin-arm64@1.2.4': + resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} cpu: [arm64] os: [darwin] - '@img/sharp-libvips-darwin-x64@1.2.3': - resolution: {integrity: sha512-Ju+g2xn1E2AKO6YBhxjj+ACcsPQRHT0bhpglxcEf+3uyPY+/gL8veniKoo96335ZaPo03bdDXMv0t+BBFAbmRA==} + '@img/sharp-libvips-darwin-x64@1.2.4': + resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} cpu: [x64] os: [darwin] - '@img/sharp-libvips-linux-arm64@1.2.3': - resolution: {integrity: sha512-I4RxkXU90cpufazhGPyVujYwfIm9Nk1QDEmiIsaPwdnm013F7RIceaCc87kAH+oUB1ezqEvC6ga4m7MSlqsJvQ==} + '@img/sharp-libvips-linux-arm64@1.2.4': + resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} cpu: [arm64] os: [linux] - '@img/sharp-libvips-linux-arm@1.2.3': - resolution: {integrity: sha512-x1uE93lyP6wEwGvgAIV0gP6zmaL/a0tGzJs/BIDDG0zeBhMnuUPm7ptxGhUbcGs4okDJrk4nxgrmxpib9g6HpA==} + '@img/sharp-libvips-linux-arm@1.2.4': + resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} cpu: [arm] os: [linux] - '@img/sharp-libvips-linux-ppc64@1.2.3': - resolution: {integrity: sha512-Y2T7IsQvJLMCBM+pmPbM3bKT/yYJvVtLJGfCs4Sp95SjvnFIjynbjzsa7dY1fRJX45FTSfDksbTp6AGWudiyCg==} + '@img/sharp-libvips-linux-ppc64@1.2.4': + resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} cpu: [ppc64] os: [linux] - '@img/sharp-libvips-linux-s390x@1.2.3': - resolution: {integrity: sha512-RgWrs/gVU7f+K7P+KeHFaBAJlNkD1nIZuVXdQv6S+fNA6syCcoboNjsV2Pou7zNlVdNQoQUpQTk8SWDHUA3y/w==} + '@img/sharp-libvips-linux-riscv64@1.2.4': + resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} + cpu: [riscv64] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.2.4': + resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} cpu: [s390x] os: [linux] - '@img/sharp-libvips-linux-x64@1.2.3': - resolution: {integrity: sha512-3JU7LmR85K6bBiRzSUc/Ff9JBVIFVvq6bomKE0e63UXGeRw2HPVEjoJke1Yx+iU4rL7/7kUjES4dZ/81Qjhyxg==} + '@img/sharp-libvips-linux-x64@1.2.4': + resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} cpu: [x64] os: [linux] - '@img/sharp-libvips-linuxmusl-arm64@1.2.3': - resolution: {integrity: sha512-F9q83RZ8yaCwENw1GieztSfj5msz7GGykG/BA+MOUefvER69K/ubgFHNeSyUu64amHIYKGDs4sRCMzXVj8sEyw==} + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} cpu: [arm64] os: [linux] - '@img/sharp-libvips-linuxmusl-x64@1.2.3': - resolution: {integrity: sha512-U5PUY5jbc45ANM6tSJpsgqmBF/VsL6LnxJmIf11kB7J5DctHgqm0SkuXzVWtIY90GnJxKnC/JT251TDnk1fu/g==} + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} cpu: [x64] os: [linux] - '@img/sharp-linux-arm64@0.34.4': - resolution: {integrity: sha512-YXU1F/mN/Wu786tl72CyJjP/Ngl8mGHN1hST4BGl+hiW5jhCnV2uRVTNOcaYPs73NeT/H8Upm3y9582JVuZHrQ==} + '@img/sharp-linux-arm64@0.34.5': + resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linux-arm@0.34.4': - resolution: {integrity: sha512-Xyam4mlqM0KkTHYVSuc6wXRmM7LGN0P12li03jAnZ3EJWZqj83+hi8Y9UxZUbxsgsK1qOEwg7O0Bc0LjqQVtxA==} + '@img/sharp-linux-arm@0.34.5': + resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] - '@img/sharp-linux-ppc64@0.34.4': - resolution: {integrity: sha512-F4PDtF4Cy8L8hXA2p3TO6s4aDt93v+LKmpcYFLAVdkkD3hSxZzee0rh6/+94FpAynsuMpLX5h+LRsSG3rIciUQ==} + '@img/sharp-linux-ppc64@0.34.5': + resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ppc64] os: [linux] - '@img/sharp-linux-s390x@0.34.4': - resolution: {integrity: sha512-qVrZKE9Bsnzy+myf7lFKvng6bQzhNUAYcVORq2P7bDlvmF6u2sCmK2KyEQEBdYk+u3T01pVsPrkj943T1aJAsw==} + '@img/sharp-linux-riscv64@0.34.5': + resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [riscv64] + os: [linux] + + '@img/sharp-linux-s390x@0.34.5': + resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] - '@img/sharp-linux-x64@0.34.4': - resolution: {integrity: sha512-ZfGtcp2xS51iG79c6Vhw9CWqQC8l2Ot8dygxoDoIQPTat/Ov3qAa8qpxSrtAEAJW+UjTXc4yxCjNfxm4h6Xm2A==} + '@img/sharp-linux-x64@0.34.5': + resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-linuxmusl-arm64@0.34.4': - resolution: {integrity: sha512-8hDVvW9eu4yHWnjaOOR8kHVrew1iIX+MUgwxSuH2XyYeNRtLUe4VNioSqbNkB7ZYQJj9rUTT4PyRscyk2PXFKA==} + '@img/sharp-linuxmusl-arm64@0.34.5': + resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linuxmusl-x64@0.34.4': - resolution: {integrity: sha512-lU0aA5L8QTlfKjpDCEFOZsTYGn3AEiO6db8W5aQDxj0nQkVrZWmN3ZP9sYKWJdtq3PWPhUNlqehWyXpYDcI9Sg==} + '@img/sharp-linuxmusl-x64@0.34.5': + resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-wasm32@0.34.4': - resolution: {integrity: sha512-33QL6ZO/qpRyG7woB/HUALz28WnTMI2W1jgX3Nu2bypqLIKx/QKMILLJzJjI+SIbvXdG9fUnmrxR7vbi1sTBeA==} + '@img/sharp-wasm32@0.34.5': + resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [wasm32] - '@img/sharp-win32-arm64@0.34.4': - resolution: {integrity: sha512-2Q250do/5WXTwxW3zjsEuMSv5sUU4Tq9VThWKlU2EYLm4MB7ZeMwF+SFJutldYODXF6jzc6YEOC+VfX0SZQPqA==} + '@img/sharp-win32-arm64@0.34.5': + resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [win32] - '@img/sharp-win32-ia32@0.34.4': - resolution: {integrity: sha512-3ZeLue5V82dT92CNL6rsal6I2weKw1cYu+rGKm8fOCCtJTR2gYeUfY3FqUnIJsMUPIH68oS5jmZ0NiJ508YpEw==} + '@img/sharp-win32-ia32@0.34.5': + resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ia32] os: [win32] - '@img/sharp-win32-x64@0.34.4': - resolution: {integrity: sha512-xIyj4wpYs8J18sVN3mSQjwrw7fKUqRw+Z5rnHNCy5fYTxigBz81u5mOMPmFumwjcn8+ld1ppptMBCLic1nz6ig==} + '@img/sharp-win32-x64@0.34.5': + resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [win32] @@ -970,17 +1155,6 @@ packages: resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} engines: {node: 20 || >=22} - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - - '@istanbuljs/schema@0.1.3': - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - - '@jridgewell/gen-mapping@0.3.13': - resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} - '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -1000,56 +1174,56 @@ packages: '@manypkg/get-packages@1.1.3': resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} - '@next/env@15.5.5': - resolution: {integrity: sha512-2Zhvss36s/yL+YSxD5ZL5dz5pI6ki1OLxYlh6O77VJ68sBnlUrl5YqhBgCy7FkdMsp9RBeGFwpuDCdpJOqdKeQ==} + '@next/env@15.5.9': + resolution: {integrity: sha512-4GlTZ+EJM7WaW2HEZcyU317tIQDjkQIyENDLxYJfSWlfqguN+dHkZgyQTV/7ykvobU7yEH5gKvreNrH4B6QgIg==} '@next/eslint-plugin-next@15.5.5': resolution: {integrity: sha512-FMzm412l9oFB8zdRD+K6HQ1VzlS+sNNsdg0MfvTg0i8lfCyTgP/RFxiu/pGJqZ/IQnzn9xSiLkjOVI7Iv4nbdQ==} - '@next/swc-darwin-arm64@15.5.5': - resolution: {integrity: sha512-lYExGHuFIHeOxf40mRLWoA84iY2sLELB23BV5FIDHhdJkN1LpRTPc1MDOawgTo5ifbM5dvAwnGuHyNm60G1+jw==} + '@next/swc-darwin-arm64@15.5.7': + resolution: {integrity: sha512-IZwtxCEpI91HVU/rAUOOobWSZv4P2DeTtNaCdHqLcTJU4wdNXgAySvKa/qJCgR5m6KI8UsKDXtO2B31jcaw1Yw==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@15.5.5': - resolution: {integrity: sha512-cacs/WQqa96IhqUm+7CY+z/0j9sW6X80KE07v3IAJuv+z0UNvJtKSlT/T1w1SpaQRa9l0wCYYZlRZUhUOvEVmg==} + '@next/swc-darwin-x64@15.5.7': + resolution: {integrity: sha512-UP6CaDBcqaCBuiq/gfCEJw7sPEoX1aIjZHnBWN9v9qYHQdMKvCKcAVs4OX1vIjeE+tC5EIuwDTVIoXpUes29lg==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.5.5': - resolution: {integrity: sha512-tLd90SvkRFik6LSfuYjcJEmwqcNEnVYVOyKTacSazya/SLlSwy/VYKsDE4GIzOBd+h3gW+FXqShc2XBavccHCg==} + '@next/swc-linux-arm64-gnu@15.5.7': + resolution: {integrity: sha512-NCslw3GrNIw7OgmRBxHtdWFQYhexoUCq+0oS2ccjyYLtcn1SzGzeM54jpTFonIMUjNbHmpKpziXnpxhSWLcmBA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.5.5': - resolution: {integrity: sha512-ekV76G2R/l3nkvylkfy9jBSYHeB4QcJ7LdDseT6INnn1p51bmDS1eGoSoq+RxfQ7B1wt+Qa0pIl5aqcx0GLpbw==} + '@next/swc-linux-arm64-musl@15.5.7': + resolution: {integrity: sha512-nfymt+SE5cvtTrG9u1wdoxBr9bVB7mtKTcj0ltRn6gkP/2Nu1zM5ei8rwP9qKQP0Y//umK+TtkKgNtfboBxRrw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@15.5.5': - resolution: {integrity: sha512-tI+sBu+3FmWtqlqD4xKJcj3KJtqbniLombKTE7/UWyyoHmOyAo3aZ7QcEHIOgInXOG1nt0rwh0KGmNbvSB0Djg==} + '@next/swc-linux-x64-gnu@15.5.7': + resolution: {integrity: sha512-hvXcZvCaaEbCZcVzcY7E1uXN9xWZfFvkNHwbe/n4OkRhFWrs1J1QV+4U1BN06tXLdaS4DazEGXwgqnu/VMcmqw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.5.5': - resolution: {integrity: sha512-kDRh+epN/ulroNJLr+toDjN+/JClY5L+OAWjOrrKCI0qcKvTw9GBx7CU/rdA2bgi4WpZN3l0rf/3+b8rduEwrQ==} + '@next/swc-linux-x64-musl@15.5.7': + resolution: {integrity: sha512-4IUO539b8FmF0odY6/SqANJdgwn1xs1GkPO5doZugwZ3ETF6JUdckk7RGmsfSf7ws8Qb2YB5It33mvNL/0acqA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@15.5.5': - resolution: {integrity: sha512-GDgdNPFFqiKjTrmfw01sMMRWhVN5wOCmFzPloxa7ksDfX6TZt62tAK986f0ZYqWpvDFqeBCLAzmgTURvtQBdgw==} + '@next/swc-win32-arm64-msvc@15.5.7': + resolution: {integrity: sha512-CpJVTkYI3ZajQkC5vajM7/ApKJUOlm6uP4BknM3XKvJ7VXAvCqSjSLmM0LKdYzn6nBJVSjdclx8nYJSa3xlTgQ==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@15.5.5': - resolution: {integrity: sha512-5kE3oRJxc7M8RmcTANP8RGoJkaYlwIiDD92gSwCjJY0+j8w8Sl1lvxgQ3bxfHY2KkHFai9tpy/Qx1saWV8eaJQ==} + '@next/swc-win32-x64-msvc@15.5.7': + resolution: {integrity: sha512-gMzgBX164I6DN+9/PGA+9dQiwmTkE4TloBNx8Kv9UiGARsr9Nba7IpcBRA1iTV9vwlYnrE3Uy6I7Aj6qLjQuqw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -1062,10 +1236,6 @@ packages: resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} engines: {node: ^14.21.3 || >=16} - '@noble/curves@1.9.7': - resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} - engines: {node: ^14.21.3 || >=16} - '@noble/hashes@1.4.0': resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} engines: {node: '>= 16'} @@ -1086,117 +1256,113 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - - '@rollup/rollup-android-arm-eabi@4.52.4': - resolution: {integrity: sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA==} + '@rollup/rollup-android-arm-eabi@4.53.3': + resolution: {integrity: sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.52.4': - resolution: {integrity: sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w==} + '@rollup/rollup-android-arm64@4.53.3': + resolution: {integrity: sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.52.4': - resolution: {integrity: sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg==} + '@rollup/rollup-darwin-arm64@4.53.3': + resolution: {integrity: sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.52.4': - resolution: {integrity: sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw==} + '@rollup/rollup-darwin-x64@4.53.3': + resolution: {integrity: sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.52.4': - resolution: {integrity: sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ==} + '@rollup/rollup-freebsd-arm64@4.53.3': + resolution: {integrity: sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.52.4': - resolution: {integrity: sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw==} + '@rollup/rollup-freebsd-x64@4.53.3': + resolution: {integrity: sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.52.4': - resolution: {integrity: sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ==} + '@rollup/rollup-linux-arm-gnueabihf@4.53.3': + resolution: {integrity: sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.52.4': - resolution: {integrity: sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q==} + '@rollup/rollup-linux-arm-musleabihf@4.53.3': + resolution: {integrity: sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.52.4': - resolution: {integrity: sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg==} + '@rollup/rollup-linux-arm64-gnu@4.53.3': + resolution: {integrity: sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.52.4': - resolution: {integrity: sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g==} + '@rollup/rollup-linux-arm64-musl@4.53.3': + resolution: {integrity: sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loong64-gnu@4.52.4': - resolution: {integrity: sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ==} + '@rollup/rollup-linux-loong64-gnu@4.53.3': + resolution: {integrity: sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.52.4': - resolution: {integrity: sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g==} + '@rollup/rollup-linux-ppc64-gnu@4.53.3': + resolution: {integrity: sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.52.4': - resolution: {integrity: sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg==} + '@rollup/rollup-linux-riscv64-gnu@4.53.3': + resolution: {integrity: sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.52.4': - resolution: {integrity: sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA==} + '@rollup/rollup-linux-riscv64-musl@4.53.3': + resolution: {integrity: sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.52.4': - resolution: {integrity: sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA==} + '@rollup/rollup-linux-s390x-gnu@4.53.3': + resolution: {integrity: sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.52.4': - resolution: {integrity: sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg==} + '@rollup/rollup-linux-x64-gnu@4.53.3': + resolution: {integrity: sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.52.4': - resolution: {integrity: sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw==} + '@rollup/rollup-linux-x64-musl@4.53.3': + resolution: {integrity: sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==} cpu: [x64] os: [linux] - '@rollup/rollup-openharmony-arm64@4.52.4': - resolution: {integrity: sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA==} + '@rollup/rollup-openharmony-arm64@4.53.3': + resolution: {integrity: sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.52.4': - resolution: {integrity: sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ==} + '@rollup/rollup-win32-arm64-msvc@4.53.3': + resolution: {integrity: sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.52.4': - resolution: {integrity: sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw==} + '@rollup/rollup-win32-ia32-msvc@4.53.3': + resolution: {integrity: sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.52.4': - resolution: {integrity: sha512-UF9KfsH9yEam0UjTwAgdK0anlQ7c8/pWPU2yVjyWcF1I1thABt6WXE47cI71pGiZ8wGvxohBoLnxM04L/wj8mQ==} + '@rollup/rollup-win32-x64-gnu@4.53.3': + resolution: {integrity: sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.52.4': - resolution: {integrity: sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w==} + '@rollup/rollup-win32-x64-msvc@4.53.3': + resolution: {integrity: sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==} cpu: [x64] os: [win32] @@ -1209,6 +1375,13 @@ packages: '@scure/bip39@1.6.0': resolution: {integrity: sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==} + '@sindresorhus/merge-streams@2.3.0': + resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} + engines: {node: '>=18'} + + '@standard-schema/spec@1.0.0': + resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} + '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} @@ -1235,8 +1408,8 @@ packages: resolution: {integrity: sha512-3uYg2b5TWCiupetbDFMbBFMHl33xQTvp5DNg0fZSYal73Z9AlFH9yWabHWMYw6ywmwM1evkYRpTVA2n7GgqT5A==} hasBin: true - '@types/chai@5.2.2': - resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} @@ -1263,8 +1436,11 @@ packages: '@types/node@20.19.21': resolution: {integrity: sha512-CsGG2P3I5y48RPMfprQGfy4JPRZ6csfC3ltBZSRItG3ngggmNY/qs2uZKp4p9VbrpqNNSMzUZNFZKzgOGnd/VA==} - '@types/node@22.18.10': - resolution: {integrity: sha512-anNG/V/Efn/YZY4pRzbACnKxNKoBng2VTFydVu8RRs5hQjikP8CQfaeAV59VFSCzKNp90mXiVXW2QzV56rwMrg==} + '@types/node@20.19.27': + resolution: {integrity: sha512-N2clP5pJhB2YnZJ3PIHFk5RkygRX5WO/5f0WC08tp0wd+sv0rsJk3MqWn3CbNmT2J505a5336jaQj4ph1AdMug==} + + '@types/node@24.10.4': + resolution: {integrity: sha512-vnDVpYPMzs4wunl27jHrfmwojOGKya0xyM3sH+UE5iv5uPS6vX7UIoh6m+vQc5LGBq52HBKPIn/zcSZVzeDEZg==} '@types/react-dom@19.2.3': resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} @@ -1280,11 +1456,14 @@ packages: '@types/tinycolor2@1.4.6': resolution: {integrity: sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw==} + '@types/whatwg-mimetype@3.0.2': + resolution: {integrity: sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==} + '@types/yargs-parser@21.0.3': resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} - '@types/yargs@17.0.33': - resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} + '@types/yargs@17.0.35': + resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} '@typescript-eslint/eslint-plugin@8.46.1': resolution: {integrity: sha512-rUsLh8PXmBjdiPY+Emjz9NX2yHvhS11v0SR6xNJkm5GM1MO9ea/1GoDKlHHZGrOJclL/cZ2i/vRUYVtjRhrHVQ==} @@ -1345,43 +1524,43 @@ packages: resolution: {integrity: sha512-ptkmIf2iDkNUjdeu2bQqhFPV1m6qTnFFjg7PPDjxKWaMaP0Z6I9l30Jr3g5QqbZGdw8YdYvLp+XnqnWWZOg/NA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@vitest/coverage-v8@3.2.4': - resolution: {integrity: sha512-EyF9SXU6kS5Ku/U82E259WSnvg6c8KTjppUncuNdm5QHpe17mwREHnjDzozC8x9MZ0xfBUFSaLkRv4TMA75ALQ==} + '@vitest/coverage-v8@4.0.15': + resolution: {integrity: sha512-FUJ+1RkpTFW7rQITdgTi93qOCWJobWhBirEPCeXh2SW2wsTlFxy51apDz5gzG+ZEYt/THvWeNmhdAoS9DTwpCw==} peerDependencies: - '@vitest/browser': 3.2.4 - vitest: 3.2.4 + '@vitest/browser': 4.0.15 + vitest: 4.0.15 peerDependenciesMeta: '@vitest/browser': optional: true - '@vitest/expect@3.2.4': - resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} + '@vitest/expect@4.0.15': + resolution: {integrity: sha512-Gfyva9/GxPAWXIWjyGDli9O+waHDC0Q0jaLdFP1qPAUUfo1FEXPXUfUkp3eZA0sSq340vPycSyOlYUeM15Ft1w==} - '@vitest/mocker@3.2.4': - resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} + '@vitest/mocker@4.0.15': + resolution: {integrity: sha512-CZ28GLfOEIFkvCFngN8Sfx5h+Se0zN+h4B7yOsPVCcgtiO7t5jt9xQh2E1UkFep+eb9fjyMfuC5gBypwb07fvQ==} peerDependencies: msw: ^2.4.9 - vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + vite: ^6.0.0 || ^7.0.0-0 peerDependenciesMeta: msw: optional: true vite: optional: true - '@vitest/pretty-format@3.2.4': - resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} + '@vitest/pretty-format@4.0.15': + resolution: {integrity: sha512-SWdqR8vEv83WtZcrfLNqlqeQXlQLh2iilO1Wk1gv4eiHKjEzvgHb2OVc3mIPyhZE6F+CtfYjNlDJwP5MN6Km7A==} - '@vitest/runner@3.2.4': - resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} + '@vitest/runner@4.0.15': + resolution: {integrity: sha512-+A+yMY8dGixUhHmNdPUxOh0la6uVzun86vAbuMT3hIDxMrAOmn5ILBHm8ajrqHE0t8R9T1dGnde1A5DTnmi3qw==} - '@vitest/snapshot@3.2.4': - resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} + '@vitest/snapshot@4.0.15': + resolution: {integrity: sha512-A7Ob8EdFZJIBjLjeO0DZF4lqR6U7Ydi5/5LIZ0xcI+23lYlsYJAfGn8PrIWTYdZQRNnSRlzhg0zyGu37mVdy5g==} - '@vitest/spy@3.2.4': - resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} + '@vitest/spy@4.0.15': + resolution: {integrity: sha512-+EIjOJmnY6mIfdXtE/bnozKEvTC4Uczg19yeZ2vtCz5Yyb0QQ31QWVQ8hswJ3Ysx/K2EqaNsVanjr//2+P3FHw==} - '@vitest/utils@3.2.4': - resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + '@vitest/utils@4.0.15': + resolution: {integrity: sha512-HXjPW2w5dxhTD0dLwtYHDnelK3j8sR8cWIaLxr22evTyY6q8pRCjZSmhRWVjBaOVXChQd6AwMzi9pucorXCPZA==} abitype@1.1.0: resolution: {integrity: sha512-6Vh4HcRxNMLA0puzPjM5GBgT4aAcFGKZzSgAXvuZ27shJP6NEpielTuqbBmZILR5/xd0PizkBGy5hReKz9jl5A==} @@ -1394,8 +1573,8 @@ packages: zod: optional: true - abitype@1.1.1: - resolution: {integrity: sha512-Loe5/6tAgsBukY95eGaPSDmQHIjRZYQq8PB1MpsNccDIK8WiV+Uw6WzaIXipvaxTEL2yEB0OpEaQv3gs8pkS9Q==} + abitype@1.2.2: + resolution: {integrity: sha512-4DOIMWscIB3j8hboLAUjLZCE8TMLdgecBpHFumfU4PdO/C1SBCVx4Nu1wPYXaL2iK8B0Jk3tiwnDLCpUtm3fZg==} peerDependencies: typescript: '>=5.0.4' zod: ^3.22.0 || ^4.0.0 @@ -1515,8 +1694,8 @@ packages: resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} engines: {node: '>=4'} - ast-v8-to-istanbul@0.3.6: - resolution: {integrity: sha512-9tx1z/7OF/a8EdYL3FKoBhxLf3h3D8fXvuSj0HknsVeli2HE40qbNZxyFhMtnydaRiamwFu9zhb+BsJ5tVPehQ==} + ast-v8-to-istanbul@0.3.8: + resolution: {integrity: sha512-szgSZqUxI5T8mLKvS7WTjF9is+MVbOeLADU73IseOcrqhxr/VAvy6wfoVE39KnKzA7JRhjF5eUagNlHwvZPlKQ==} async-function@1.0.0: resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} @@ -1564,10 +1743,6 @@ packages: resolution: {integrity: sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==} engines: {node: '>=6.0.0'} - cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -1587,17 +1762,21 @@ packages: camel-case@3.0.0: resolution: {integrity: sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==} - caniuse-lite@1.0.30001751: - resolution: {integrity: sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==} + caniuse-lite@1.0.30001760: + resolution: {integrity: sha512-7AAMPcueWELt1p3mi13HR/LHH0TJLT11cnwDJEs3xA4+CK/PLKeO9Kl1oru24htkyUKtkGCvAx4ohB0Ttry8Dw==} cbor2@1.12.0: resolution: {integrity: sha512-3Cco8XQhi27DogSp9Ri6LYNZLi/TBY/JVnDe+mj06NkBjW/ZYOtekaEU4wZ4xcRMNrFkDv8KNtOAqHyDfz3lYg==} engines: {node: '>=18.7'} - chai@5.3.3: - resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} + chai@6.2.1: + resolution: {integrity: sha512-p4Z49OGG5W/WBCPSS/dH3jQ73kD6tiMmUM+bckNK6Jr5JHMG3k9bg/BvKR8lKmtVBKmOiuVaV2ws8s9oSbwysg==} engines: {node: '>=18'} + chalk-template@1.1.2: + resolution: {integrity: sha512-2bxTP2yUH7AJj/VAXfcA+4IcWGdQ87HwBANLt5XxGTeomo8yG0y95N1um9i5StvhT/Bl0/2cARA5v1PpPXUxUA==} + engines: {node: '>=14.16'} + chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -1610,6 +1789,10 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + change-case@3.1.0: resolution: {integrity: sha512-2AZp7uJZbYEzRPsFoa+ijKdvp9zsrnnt6+yFokfwEpeJm0xuJDVoxiRCAaTzyJND8GJkofo2IcKWaUZ/OECVzw==} @@ -1619,10 +1802,6 @@ packages: chardet@2.1.0: resolution: {integrity: sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==} - check-error@2.1.1: - resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} - engines: {node: '>= 16'} - chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -1639,6 +1818,10 @@ packages: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} + cli-cursor@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} + cli-spinners@2.9.2: resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} engines: {node: '>=6'} @@ -1654,6 +1837,10 @@ packages: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} + cliui@9.0.1: + resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==} + engines: {node: '>=20'} + clone@1.0.4: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} @@ -1675,12 +1862,16 @@ packages: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} engines: {node: '>=14'} + commander@13.1.0: + resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} + engines: {node: '>=18'} + concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - concurrently@8.2.2: - resolution: {integrity: sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==} - engines: {node: ^14.13.0 || >=16.0.0} + concurrently@9.2.1: + resolution: {integrity: sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==} + engines: {node: '>=18'} hasBin: true constant-case@2.0.0: @@ -1689,6 +1880,15 @@ packages: core-js-pure@3.46.0: resolution: {integrity: sha512-NMCW30bHNofuhwLhYPt66OLOKTMbOhgTTatKVbaQC3KRHpTCiRIBYvtshr+NBYSnBxwAFhjW/RfJ0XbIjS16rw==} + cosmiconfig@9.0.0: + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} @@ -1715,10 +1915,6 @@ packages: resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} engines: {node: '>= 0.4'} - date-fns@2.30.0: - resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} - engines: {node: '>=0.11'} - debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} @@ -1728,10 +1924,6 @@ packages: supports-color: optional: true - deep-eql@5.0.2: - resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} - engines: {node: '>=6'} - deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} @@ -1785,27 +1977,34 @@ packages: resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} engines: {node: '>=12'} - dotenv@16.6.1: - resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} + dotenv@17.2.3: + resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==} engines: {node: '>=12'} dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + effect@3.19.12: + resolution: {integrity: sha512-7F9RGTrCTC3D7nh9Zw+3VlJWwZgo5k33KA+476BAaD0rKIXKZsY/jQ+ipyhR/Avo239Fi6GqAVFs1mqM1IJ7yg==} + + emoji-regex@10.6.0: + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + es-abstract@1.24.0: resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} engines: {node: '>= 0.4'} @@ -1841,8 +2040,13 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} - esbuild@0.25.11: - resolution: {integrity: sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==} + esbuild@0.25.12: + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} + engines: {node: '>=18'} + hasBin: true + + esbuild@0.27.1: + resolution: {integrity: sha512-yY35KZckJJuVVPXpvjgxiCuVEJT67F6zDeVTv4rizyPrfGBUpZQsvmxnN+C371c2esD/hNMjj4tpBhuueLN7aA==} engines: {node: '>=18'} hasBin: true @@ -1948,8 +2152,8 @@ packages: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} - expect-type@1.2.2: - resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} + expect-type@1.3.0: + resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} engines: {node: '>=12.0.0'} extendable-error@0.1.7: @@ -1959,10 +2163,14 @@ packages: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} engines: {node: '>=4'} - fake-indexeddb@6.2.3: - resolution: {integrity: sha512-idzJXFtDIHNShFZ9ssS8IdsRgAP0t9zwWvSdCKsWK2dgh2xcXA6/2Oteaxar5GJqmwzZXCrKRO6F5IEiR4yJzw==} + fake-indexeddb@6.2.5: + resolution: {integrity: sha512-CGnyrvbhPlWYMngksqrSSUT1BAVP49dZocrHuK0SvtR0D5TMs5wP0o3j7jexDJW01KSadjBp1M/71o/KR3nD1w==} engines: {node: '>=18'} + fast-check@3.23.2: + resolution: {integrity: sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==} + engines: {node: '>=8.0.0'} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -2023,10 +2231,6 @@ packages: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} - foreground-child@3.3.1: - resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} - engines: {node: '>=14'} - fs-extra@10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} @@ -2065,6 +2269,10 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} + get-east-asian-width@1.4.0: + resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} + engines: {node: '>=18'} + get-intrinsic@1.3.0: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} @@ -2093,14 +2301,9 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob@10.4.5: - resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} - hasBin: true - - glob@11.0.3: - resolution: {integrity: sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==} + glob@13.0.0: + resolution: {integrity: sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==} engines: {node: 20 || >=22} - hasBin: true glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} @@ -2126,6 +2329,10 @@ packages: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} + globby@14.1.0: + resolution: {integrity: sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==} + engines: {node: '>=18'} + gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -2145,8 +2352,8 @@ packages: engines: {node: '>=0.4.7'} hasBin: true - happy-dom@17.6.3: - resolution: {integrity: sha512-UVIHeVhxmxedbWPCfgS55Jg2rDfwf2BCKeylcPSqazLz5w3Kri7Q4xdBJubsr/+VUzFLh0VjIvh13RaDA2/Xug==} + happy-dom@20.0.11: + resolution: {integrity: sha512-QsCdAUHAmiDeKeaNojb1OHOPF7NjcWPBR7obdu3NwH2a/oyQaLg5d0aaCy/9My6CdPChYF07dvz5chaXBGaD4g==} engines: {node: '>=20.0.0'} has-bigints@1.1.0: @@ -2183,6 +2390,10 @@ packages: header-case@1.0.1: resolution: {integrity: sha512-i0q9mkOeSuhXw6bGgiQCCBgY/jlZuV/7dZXyZ9c6LcBrqwvT8eT719E9uxE5LiZftdl+z81Ugbg/VvXV4OJOeQ==} + hosted-git-info@8.1.0: + resolution: {integrity: sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==} + engines: {node: ^18.17.0 || >=20.5.0} + html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} @@ -2210,8 +2421,8 @@ packages: resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} engines: {node: '>=0.10.0'} - idb@7.1.1: - resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} + idb@8.0.3: + resolution: {integrity: sha512-LtwtVyVYO5BqRvcsKuB2iUMnHwPVByPCXFXOpuU96IZPPoPN6xjOGxZQ74pgSVVLQWtUOYgyeL4GE98BY5D3wg==} ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -2269,6 +2480,9 @@ packages: resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + is-async-function@2.1.1: resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} engines: {node: '>= 0.4'} @@ -2325,6 +2539,10 @@ packages: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} + is-interactive@2.0.0: + resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} + engines: {node: '>=12'} + is-lower-case@1.1.3: resolution: {integrity: sha512-+5A1e/WJpLLXZEDlgz4G//WYSHyQBD32qa4Jd3Lw06qQlv3fJHnp3YIHjTQSGzHMgzmVKz2ZP3rBxTHkPw/lxA==} @@ -2388,6 +2606,14 @@ packages: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} + is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} + is-upper-case@1.1.2: resolution: {integrity: sha512-GQYSJMgfeAmVwh9ixyk888l7OIhNAGKtY6QA+IrWlu9MDTCaXmeozOZ2S9Knj7bQwBO/H6J2kb+pbyTUiMNbsw==} @@ -2442,13 +2668,6 @@ packages: resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} engines: {node: '>= 0.4'} - jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - - jackspeak@4.1.1: - resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} - engines: {node: 20 || >=22} - js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -2463,18 +2682,28 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} json-canonicalize@2.0.0: resolution: {integrity: sha512-yyrnK/mEm6Na3ChbJUWueXdapueW0p380RUyTW87XGb1ww8l8hU0pRrGC3vSWHe9CxrbPHX2fGUOZpNiHR0IIg==} + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + jsonc-parser@3.3.1: + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} @@ -2492,64 +2721,71 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - lefthook-darwin-arm64@1.13.6: - resolution: {integrity: sha512-m6Lb77VGc84/Qo21Lhq576pEvcgFCnvloEiP02HbAHcIXD0RTLy9u2yAInrixqZeaz13HYtdDaI7OBYAAdVt8A==} + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + lefthook-darwin-arm64@2.0.11: + resolution: {integrity: sha512-RfpdcJJQXstdgDiIBDRffncayKiXx+0LyMUCunIxDEO2JMXPpYK2hIdpUU0rkitzptAADchG7u1OXJ31rrtIAA==} cpu: [arm64] os: [darwin] - lefthook-darwin-x64@1.13.6: - resolution: {integrity: sha512-CoRpdzanu9RK3oXR1vbEJA5LN7iB+c7hP+sONeQJzoOXuq4PNKVtEaN84Gl1BrVtCNLHWFAvCQaZPPiiXSy8qg==} + lefthook-darwin-x64@2.0.11: + resolution: {integrity: sha512-D013UNKQa4FKgpxDMqdaU109U2/Pidtrt9CobQoq8te4eGUglcwxMzuYVTgaYnenz0FgKxSfVaCZsZgwqeMWqA==} cpu: [x64] os: [darwin] - lefthook-freebsd-arm64@1.13.6: - resolution: {integrity: sha512-X4A7yfvAJ68CoHTqP+XvQzdKbyd935sYy0bQT6Ajz7FL1g7hFiro8dqHSdPdkwei9hs8hXeV7feyTXbYmfjKQQ==} + lefthook-freebsd-arm64@2.0.11: + resolution: {integrity: sha512-mgfNqG1tiJkCuGNwPG0LEfnAHGJA+Qzl6KidOtX/Zhxmj/sM+6hxiP4LOeEAhCnaZF5kuPtQgbFzShFHc2BK6A==} cpu: [arm64] os: [freebsd] - lefthook-freebsd-x64@1.13.6: - resolution: {integrity: sha512-ai2m+Sj2kGdY46USfBrCqLKe9GYhzeq01nuyDYCrdGISePeZ6udOlD1k3lQKJGQCHb0bRz4St0r5nKDSh1x/2A==} + lefthook-freebsd-x64@2.0.11: + resolution: {integrity: sha512-rnHOlQbJfLGCibr7yHM44kPNgf/tFpEbj/cWVHRhjRdbgYSCAjJk0uKd/EVo3v/vjfId2na0AhWbLvO/aY3wQQ==} cpu: [x64] os: [freebsd] - lefthook-linux-arm64@1.13.6: - resolution: {integrity: sha512-cbo4Wtdq81GTABvikLORJsAWPKAJXE8Q5RXsICFUVznh5PHigS9dFW/4NXywo0+jfFPCT6SYds2zz4tCx6DA0Q==} + lefthook-linux-arm64@2.0.11: + resolution: {integrity: sha512-1XjDo2/4fM0TbJBwxZh8w+WMOFueg9oYHkryM8vc3vp8wTajdWBazg1K37JIS3FUco3tcOs+eWHQg0ekVjpWoA==} cpu: [arm64] os: [linux] - lefthook-linux-x64@1.13.6: - resolution: {integrity: sha512-uJl9vjCIIBTBvMZkemxCE+3zrZHlRO7Oc+nZJ+o9Oea3fu+W82jwX7a7clw8jqNfaeBS+8+ZEQgiMHWCloTsGw==} + lefthook-linux-x64@2.0.11: + resolution: {integrity: sha512-OKOcfEvozXhO7+y2xgUzvc2kkqfhluql/sjQSzd8Ka+iK3hM4KCfbfgYx9q61Pjr34a0+i03cuH5DF2dlq/rrg==} cpu: [x64] os: [linux] - lefthook-openbsd-arm64@1.13.6: - resolution: {integrity: sha512-7r153dxrNRQ9ytRs2PmGKKkYdvZYFPre7My7XToSTiRu5jNCq++++eAKVkoyWPduk97dGIA+YWiEr5Noe0TK2A==} + lefthook-openbsd-arm64@2.0.11: + resolution: {integrity: sha512-n1KEx196M3SKaWVNTQXGgxzBsiYAsdAy6Of6I6TAZwPhG7yoRrKGkQrhOlPgMzYl36udG1Lk4D+mfY9T0oOUYQ==} cpu: [arm64] os: [openbsd] - lefthook-openbsd-x64@1.13.6: - resolution: {integrity: sha512-Z+UhLlcg1xrXOidK3aLLpgH7KrwNyWYE3yb7ITYnzJSEV8qXnePtVu8lvMBHs/myzemjBzeIr/U/+ipjclR06g==} + lefthook-openbsd-x64@2.0.11: + resolution: {integrity: sha512-WAEtKpYUVvuJMVLA38IBoaPnTNSiaEzvUYxjTBlYTLHJwn7HC2GG6P1cnvoua8rfxb9/Bfi7C3D3IPa9VmB33Q==} cpu: [x64] os: [openbsd] - lefthook-windows-arm64@1.13.6: - resolution: {integrity: sha512-Uxef6qoDxCmUNQwk8eBvddYJKSBFglfwAY9Y9+NnnmiHpWTjjYiObE9gT2mvGVpEgZRJVAatBXc+Ha5oDD/OgQ==} + lefthook-windows-arm64@2.0.11: + resolution: {integrity: sha512-HBqW1qfAnmmbpet7gSWatB6H5YIFdGxCqzolMCLwY/0o8oPFiMwdNE5RGp5JMmhZdz/h3XlbaUlIhnxoW8dk5g==} cpu: [arm64] os: [win32] - lefthook-windows-x64@1.13.6: - resolution: {integrity: sha512-mOZoM3FQh3o08M8PQ/b3IYuL5oo36D9ehczIw1dAgp1Ly+Tr4fJ96A+4SEJrQuYeRD4mex9bR7Ps56I73sBSZA==} + lefthook-windows-x64@2.0.11: + resolution: {integrity: sha512-e5TYmV5cBZfRrhPVFCqjauegLI5CjdAd8exyAbMzGHkiwp3ZK145Su/pntgEP3d+ayS9mpgYPJmXYOSL7WHlyg==} cpu: [x64] os: [win32] - lefthook@1.13.6: - resolution: {integrity: sha512-ojj4/4IJ29Xn4drd5emqVgilegAPN3Kf0FQM2p/9+lwSTpU+SZ1v4Ig++NF+9MOa99UKY8bElmVrLhnUUNFh5g==} + lefthook@2.0.11: + resolution: {integrity: sha512-/91k4dt9MRNkzeSr1iMjNi/z8dNuh+XvNfXrWA6PV+M1ZxiNY6uN6bGnr13n+j7N89f4h7YWBhCqhzhK33M5cA==} hasBin: true levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -2579,13 +2815,14 @@ packages: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} + log-symbols@6.0.0: + resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} + engines: {node: '>=18'} + loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true - loupe@3.2.1: - resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} - lower-case-first@1.0.2: resolution: {integrity: sha512-UuxaYakO7XeONbKrZf5FEgkantPf5DUqDayzP5VXZrtRPdH86s4kN47I8B3TW10S4QKiE3ziHNf3kRN//okHjA==} @@ -2595,19 +2832,19 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.2.2: - resolution: {integrity: sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==} + lru-cache@11.2.4: + resolution: {integrity: sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==} engines: {node: 20 || >=22} lru-cache@7.18.3: resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} engines: {node: '>=12'} - magic-string@0.30.19: - resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - magicast@0.3.5: - resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + magicast@0.5.1: + resolution: {integrity: sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==} make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} @@ -2635,8 +2872,12 @@ packages: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} - minimatch@10.0.3: - resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + + minimatch@10.1.1: + resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} engines: {node: 20 || >=22} minimatch@3.1.2: @@ -2690,8 +2931,8 @@ packages: resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} engines: {node: '>= 0.4.0'} - next@15.5.5: - resolution: {integrity: sha512-OQVdBPtpBfq7HxFN0kOVb7rXXOSIkt5lTzDJDGRBcOyVvNRIWFauMqi1gIHd1pszq1542vMOGY0HP4CaiALfkA==} + next@15.5.9: + resolution: {integrity: sha512-agNLK89seZEtC5zUHwtut0+tNrc0Xw4FT/Dg+B/VLEo9pAcS9rtTKpek3V6kVcVwsB2YlqMaHdfZL4eLEVYuCg==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: @@ -2718,8 +2959,8 @@ packages: resolution: {integrity: sha512-Cov028YhBZ5aB7MdMWJEmwyBig43aGL5WT4vdoB28Oitau1zZAcHUn8Sgfk9HM33TqhtLJ9PlM/O0Mv+QpV/4Q==} engines: {node: '>=8.9.4'} - nodemon@3.1.10: - resolution: {integrity: sha512-WDjw3pJ0/0jMFmyNDp3gvY2YizjLmmOUQo6DEBY+JgdvW/yQ9mEeSw6H5ythl5Ny2ytb7f9C2nIbjSxMNzbJXw==} + nodemon@3.1.11: + resolution: {integrity: sha512-is96t8F/1//UHAjNPHpbsNY46ELPpftGUoSVNXwUfMk/qdjSylYrWSu1XavVTBOn526kFiOR733ATgNBCQyH0g==} engines: {node: '>=10'} hasBin: true @@ -2727,6 +2968,10 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} + npm-package-arg@12.0.2: + resolution: {integrity: sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA==} + engines: {node: ^18.17.0 || >=20.5.0} + npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} @@ -2759,6 +3004,9 @@ packages: resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} engines: {node: '>= 0.4'} + obug@2.1.1: + resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -2766,6 +3014,10 @@ packages: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} + optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -2778,6 +3030,10 @@ packages: resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} engines: {node: '>=10'} + ora@8.2.0: + resolution: {integrity: sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==} + engines: {node: '>=18'} + os-tmpdir@1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} @@ -2789,16 +3045,8 @@ packages: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} - ox@0.7.2: - resolution: {integrity: sha512-JJHxdef3KqwQ8xW9H+UVLWaQiCUh/DeFN/Ii65XwbHTvSuXZveihTV2gs9hhLw5XEWPBrcH7sQBM0rqG7/QurQ==} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - ox@0.9.6: - resolution: {integrity: sha512-8SuCbHPvv2eZLYXrNmC0EC12rdzXQLdhnOMlHDW2wiCPLxBrOOJwX5L5E61by+UjTPOryqQiRSnjIKCI+GykKg==} + ox@0.9.17: + resolution: {integrity: sha512-rKAnhzhRU3Xh3hiko+i1ZxywZ55eWQzeS/Q4HRKLx2PqfHOolisZHErSsJVipGlmQKHW5qwOED/GighEw9dbLg==} peerDependencies: typescript: '>=5.4.0' peerDependenciesMeta: @@ -2858,6 +3106,10 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + pascal-case@2.0.1: resolution: {integrity: sha512-qjS4s8rBOJa2Xm0jmxXiyh1+OFf6ekCWOvUaRgAQSktzlTbMotS0nmG9gyYAybCWBcuP4fsBeRCKNwGBnMe2OQ==} @@ -2879,25 +3131,21 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} - - path-scurry@2.0.0: - resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} + path-scurry@2.0.1: + resolution: {integrity: sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==} engines: {node: 20 || >=22} path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} + path-type@6.0.0: + resolution: {integrity: sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==} + engines: {node: '>=18'} + pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - pathval@2.0.1: - resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} - engines: {node: '>= 14.16'} - picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -2943,6 +3191,14 @@ packages: engines: {node: '>=14'} hasBin: true + proc-log@5.0.0: + resolution: {integrity: sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==} + engines: {node: ^18.17.0 || >=20.5.0} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} @@ -2960,6 +3216,9 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + pure-rand@6.1.0: + resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} + pvtsutils@1.3.6: resolution: {integrity: sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==} @@ -2993,6 +3252,10 @@ packages: resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} engines: {node: '>=6'} + read-yaml-file@2.1.0: + resolution: {integrity: sha512-UkRNRIwnhG+y7hpqnycCL/xbTk7+ia9VuVTC0S+zVbwd65DI9eUpRMfsWIGrCWxTU/mi+JW8cHQCrv+zfCbEPQ==} + engines: {node: '>=10.13'} + readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} @@ -3041,6 +3304,10 @@ packages: resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} engines: {node: '>=8'} + restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} + reusify@1.1.0: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -3050,13 +3317,13 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true - rimraf@6.0.1: - resolution: {integrity: sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==} + rimraf@6.1.2: + resolution: {integrity: sha512-cFCkPslJv7BAXJsYlK1dZsbP8/ZNLkCAQ0bi1hf5EKX2QHegmDFEFA6QhuYJlk7UDdc+02JjO80YSOrWPpw06g==} engines: {node: 20 || >=22} hasBin: true - rollup@4.52.4: - resolution: {integrity: sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ==} + rollup@4.53.3: + resolution: {integrity: sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -3119,8 +3386,8 @@ packages: resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} engines: {node: '>= 0.4'} - sharp@0.34.4: - resolution: {integrity: sha512-FUH39xp3SBPnxWvd5iib1X8XY7J0K0X7d93sie9CJg2PO8/7gmg89Nve6OjItK53/MlAushNNxteBYfM6DEuoA==} + sharp@0.34.5: + resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} shebang-command@2.0.0: @@ -3165,10 +3432,17 @@ packages: resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} engines: {node: '>=10'} + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} + slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} + smart-buffer@4.2.0: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} @@ -3192,9 +3466,6 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - spawn-command@0.0.2: - resolution: {integrity: sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==} - spawndamnit@3.0.1: resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} @@ -3207,6 +3478,10 @@ packages: std-env@3.10.0: resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + stdin-discarder@0.2.2: + resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} + engines: {node: '>=18'} + stop-iteration-iterator@1.1.0: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} @@ -3215,9 +3490,9 @@ packages: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} - string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} string.prototype.matchall@4.0.12: resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} @@ -3253,6 +3528,10 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} + strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + strip-final-newline@2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} @@ -3265,9 +3544,6 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strip-literal@3.1.0: - resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} - styled-jsx@5.1.6: resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} engines: {node: '>= 12.0.0'} @@ -3300,25 +3576,31 @@ packages: swap-case@1.1.2: resolution: {integrity: sha512-BAmWG6/bx8syfc6qXPprof3Mn5vQgf5dwdUNJhsNqU9WdPt5P+ES/wQ5bxfijy8zwZgZZHslC3iAsxsuQMCzJQ==} + syncpack@13.0.4: + resolution: {integrity: sha512-kJ9VlRxNCsBD5pJAE29oXeBYbPLhEySQmK4HdpsLv81I6fcDDW17xeJqMwiU3H7/woAVsbgq25DJNS8BeiN5+w==} + engines: {node: '>=18.18.0'} + hasBin: true + term-size@2.2.1: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} - test-exclude@7.0.1: - resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} - engines: {node: '>=18'} - through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + tightrope@0.2.0: + resolution: {integrity: sha512-Kw36UHxJEELq2VUqdaSGR2/8cAsPgMtvX8uGVU6Jk26O66PhXec0A5ZnRYs47btbtwPDpXXF66+Fo3vimCM9aQ==} + engines: {node: '>=16'} + tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} tinycolor2@1.6.0: resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} - tinyexec@0.3.2: - resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + tinyexec@1.0.2: + resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} + engines: {node: '>=18'} tinyglobby@0.2.15: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} @@ -3327,16 +3609,8 @@ packages: tinygradient@1.1.5: resolution: {integrity: sha512-8nIfc2vgQ4TeLnk2lFj4tRLvvJwEfQuabdsmvDdQPT0xlk9TaNtpGd6nNRxXoK6vQhN6RSzj+Cnp5tTQmpxmbw==} - tinypool@1.1.1: - resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} - engines: {node: ^18.0.0 || >=20.0.0} - - tinyrainbow@2.0.0: - resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} - engines: {node: '>=14.0.0'} - - tinyspy@4.0.4: - resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} + tinyrainbow@3.0.3: + resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} engines: {node: '>=14.0.0'} title-case@2.1.1: @@ -3378,44 +3652,47 @@ packages: '@swc/wasm': optional: true + ts-toolbelt@9.6.0: + resolution: {integrity: sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==} + tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - turbo-darwin-64@2.5.8: - resolution: {integrity: sha512-Dh5bCACiHO8rUXZLpKw+m3FiHtAp2CkanSyJre+SInEvEr5kIxjGvCK/8MFX8SFRjQuhjtvpIvYYZJB4AGCxNQ==} + turbo-darwin-64@2.6.3: + resolution: {integrity: sha512-BlJJDc1CQ7SK5Y5qnl7AzpkvKSnpkfPmnA+HeU/sgny3oHZckPV2776ebO2M33CYDSor7+8HQwaodY++IINhYg==} cpu: [x64] os: [darwin] - turbo-darwin-arm64@2.5.8: - resolution: {integrity: sha512-f1H/tQC9px7+hmXn6Kx/w8Jd/FneIUnvLlcI/7RGHunxfOkKJKvsoiNzySkoHQ8uq1pJnhJ0xNGTlYM48ZaJOQ==} + turbo-darwin-arm64@2.6.3: + resolution: {integrity: sha512-MwVt7rBKiOK7zdYerenfCRTypefw4kZCue35IJga9CH1+S50+KTiCkT6LBqo0hHeoH2iKuI0ldTF2a0aB72z3w==} cpu: [arm64] os: [darwin] - turbo-linux-64@2.5.8: - resolution: {integrity: sha512-hMyvc7w7yadBlZBGl/bnR6O+dJTx3XkTeyTTH4zEjERO6ChEs0SrN8jTFj1lueNXKIHh1SnALmy6VctKMGnWfw==} + turbo-linux-64@2.6.3: + resolution: {integrity: sha512-cqpcw+dXxbnPtNnzeeSyWprjmuFVpHJqKcs7Jym5oXlu/ZcovEASUIUZVN3OGEM6Y/OTyyw0z09tOHNt5yBAVg==} cpu: [x64] os: [linux] - turbo-linux-arm64@2.5.8: - resolution: {integrity: sha512-LQELGa7bAqV2f+3rTMRPnj5G/OHAe2U+0N9BwsZvfMvHSUbsQ3bBMWdSQaYNicok7wOZcHjz2TkESn1hYK6xIQ==} + turbo-linux-arm64@2.6.3: + resolution: {integrity: sha512-MterpZQmjXyr4uM7zOgFSFL3oRdNKeflY7nsjxJb2TklsYqiu3Z9pQ4zRVFFH8n0mLGna7MbQMZuKoWqqHb45w==} cpu: [arm64] os: [linux] - turbo-windows-64@2.5.8: - resolution: {integrity: sha512-3YdcaW34TrN1AWwqgYL9gUqmZsMT4T7g8Y5Azz+uwwEJW+4sgcJkIi9pYFyU4ZBSjBvkfuPZkGgfStir5BBDJQ==} + turbo-windows-64@2.6.3: + resolution: {integrity: sha512-biDU70v9dLwnBdLf+daoDlNJVvqOOP8YEjqNipBHzgclbQlXbsi6Gqqelp5er81Qo3BiRgmTNx79oaZQTPb07Q==} cpu: [x64] os: [win32] - turbo-windows-arm64@2.5.8: - resolution: {integrity: sha512-eFC5XzLmgXJfnAK3UMTmVECCwuBcORrWdewoiXBnUm934DY6QN8YowC/srhNnROMpaKaqNeRpoB5FxCww3eteQ==} + turbo-windows-arm64@2.6.3: + resolution: {integrity: sha512-dDHVKpSeukah3VsI/xMEKeTnV9V9cjlpFSUs4bmsUiLu3Yv2ENlgVEZv65wxbeE0bh0jjpmElDT+P1KaCxArQQ==} cpu: [arm64] os: [win32] - turbo@2.5.8: - resolution: {integrity: sha512-5c9Fdsr9qfpT3hA0EyYSFRZj1dVVsb6KIWubA9JBYZ/9ZEAijgUEae0BBR/Xl/wekt4w65/lYLTFaP3JmwSO8w==} + turbo@2.6.3: + resolution: {integrity: sha512-bf6YKUv11l5Xfcmg76PyWoy/e2vbkkxFNBGJSnfdSXQC33ZiUfutYh6IXidc5MhsnrFkWfdNNLyaRk+kHMLlwA==} hasBin: true type-check@0.4.0: @@ -3449,13 +3726,13 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - typescript@5.5.4: - resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} + typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} engines: {node: '>=14.17'} hasBin: true - typescript@5.8.3: - resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} hasBin: true @@ -3474,6 +3751,13 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + + unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} + universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -3497,8 +3781,8 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - uuid@11.1.0: - resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} + uuid@13.0.0: + resolution: {integrity: sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==} hasBin: true v8-compile-cache-lib@3.0.1: @@ -3508,21 +3792,20 @@ packages: resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - viem@2.38.2: - resolution: {integrity: sha512-MJDiTDD9gfOT7lPQRimdmw+g46hU/aWJ3loqb+tN6UBOO00XEd0O4LJx+Kp5/uCRnMlJr8zJ1bNzCK7eG6gMjg==} + validate-npm-package-name@6.0.2: + resolution: {integrity: sha512-IUoow1YUtvoBBC06dXs8bR8B9vuA3aJfmQNKMoaPG/OFsPmoQvw8xh+6Ye25Gx9DQhoEom3Pcu9MKHerm/NpUQ==} + engines: {node: ^18.17.0 || >=20.5.0} + + viem@2.42.0: + resolution: {integrity: sha512-H0WC6czWi7ITBoHkHJVGyjLOecqh/9XJzl4V9XVIwGs/JC3UAJ44rPvkzuYbhDknLWcnREMY/MnXJY7fc7mpGA==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: typescript: optional: true - vite-node@3.2.4: - resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - - vite@7.1.10: - resolution: {integrity: sha512-CmuvUBzVJ/e3HGxhg6cYk88NGgTnBoOo7ogtfJJ0fefUWAxN/WDSUa50o+oVBxuIhO8FoEZW0j2eW7sfjs5EtA==} + vite@7.2.7: + resolution: {integrity: sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -3561,26 +3844,32 @@ packages: yaml: optional: true - vitest@3.2.4: - resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + vitest@4.0.15: + resolution: {integrity: sha512-n1RxDp8UJm6N0IbJLQo+yzLZ2sQCDyl1o0LeugbPWf8+8Fttp29GghsQBjYJVmWq3gBFfe9Hs1spR44vovn2wA==} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' - '@types/debug': ^4.1.12 - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.2.4 - '@vitest/ui': 3.2.4 + '@opentelemetry/api': ^1.9.0 + '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 4.0.15 + '@vitest/browser-preview': 4.0.15 + '@vitest/browser-webdriverio': 4.0.15 + '@vitest/ui': 4.0.15 happy-dom: '*' jsdom: '*' peerDependenciesMeta: '@edge-runtime/vm': optional: true - '@types/debug': + '@opentelemetry/api': optional: true '@types/node': optional: true - '@vitest/browser': + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': optional: true '@vitest/ui': optional: true @@ -3592,10 +3881,6 @@ packages: wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - webidl-conversions@7.0.0: - resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} - engines: {node: '>=12'} - whatwg-mimetype@3.0.0: resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} engines: {node: '>=12'} @@ -3641,9 +3926,9 @@ packages: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} + wrap-ansi@9.0.2: + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} + engines: {node: '>=18'} wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} @@ -3668,10 +3953,18 @@ packages: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} + yargs-parser@22.0.0: + resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + yargs@17.7.2: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} + yargs@18.0.0: + resolution: {integrity: sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} @@ -3689,18 +3982,19 @@ snapshots: '@adraffy/ens-normalize@1.11.1': {} - '@ampproject/remapping@2.3.0': + '@babel/code-frame@7.27.1': dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 '@babel/helper-string-parser@7.27.1': {} - '@babel/helper-validator-identifier@7.27.1': {} + '@babel/helper-validator-identifier@7.28.5': {} - '@babel/parser@7.28.4': + '@babel/parser@7.28.5': dependencies: - '@babel/types': 7.28.4 + '@babel/types': 7.28.5 '@babel/runtime-corejs3@7.28.4': dependencies: @@ -3708,10 +4002,10 @@ snapshots: '@babel/runtime@7.28.4': {} - '@babel/types@7.28.4': + '@babel/types@7.28.5': dependencies: '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 '@bcoe/v8-coverage@1.0.2': {} @@ -3744,7 +4038,7 @@ snapshots: dependencies: '@changesets/types': 6.1.0 - '@changesets/cli@2.29.7(@types/node@22.18.10)': + '@changesets/cli@2.29.7(@types/node@24.10.4)': dependencies: '@changesets/apply-release-plan': 7.0.13 '@changesets/assemble-release-plan': 6.0.9 @@ -3760,7 +4054,7 @@ snapshots: '@changesets/should-skip-package': 0.1.2 '@changesets/types': 6.1.0 '@changesets/write': 0.4.0 - '@inquirer/external-editor': 1.0.2(@types/node@22.18.10) + '@inquirer/external-editor': 1.0.2(@types/node@24.10.4) '@manypkg/get-packages': 1.1.3 ansi-colors: 4.1.3 ci-info: 3.9.0 @@ -3863,87 +4157,165 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@emnapi/runtime@1.5.0': + '@emnapi/runtime@1.7.1': dependencies: tslib: 2.8.1 optional: true - '@esbuild/aix-ppc64@0.25.11': + '@esbuild/aix-ppc64@0.25.12': + optional: true + + '@esbuild/aix-ppc64@0.27.1': + optional: true + + '@esbuild/android-arm64@0.25.12': + optional: true + + '@esbuild/android-arm64@0.27.1': + optional: true + + '@esbuild/android-arm@0.25.12': + optional: true + + '@esbuild/android-arm@0.27.1': + optional: true + + '@esbuild/android-x64@0.25.12': + optional: true + + '@esbuild/android-x64@0.27.1': + optional: true + + '@esbuild/darwin-arm64@0.25.12': + optional: true + + '@esbuild/darwin-arm64@0.27.1': + optional: true + + '@esbuild/darwin-x64@0.25.12': + optional: true + + '@esbuild/darwin-x64@0.27.1': + optional: true + + '@esbuild/freebsd-arm64@0.25.12': + optional: true + + '@esbuild/freebsd-arm64@0.27.1': + optional: true + + '@esbuild/freebsd-x64@0.25.12': + optional: true + + '@esbuild/freebsd-x64@0.27.1': + optional: true + + '@esbuild/linux-arm64@0.25.12': + optional: true + + '@esbuild/linux-arm64@0.27.1': + optional: true + + '@esbuild/linux-arm@0.25.12': + optional: true + + '@esbuild/linux-arm@0.27.1': + optional: true + + '@esbuild/linux-ia32@0.25.12': + optional: true + + '@esbuild/linux-ia32@0.27.1': + optional: true + + '@esbuild/linux-loong64@0.25.12': + optional: true + + '@esbuild/linux-loong64@0.27.1': + optional: true + + '@esbuild/linux-mips64el@0.25.12': + optional: true + + '@esbuild/linux-mips64el@0.27.1': + optional: true + + '@esbuild/linux-ppc64@0.25.12': optional: true - '@esbuild/android-arm64@0.25.11': + '@esbuild/linux-ppc64@0.27.1': optional: true - '@esbuild/android-arm@0.25.11': + '@esbuild/linux-riscv64@0.25.12': optional: true - '@esbuild/android-x64@0.25.11': + '@esbuild/linux-riscv64@0.27.1': optional: true - '@esbuild/darwin-arm64@0.25.11': + '@esbuild/linux-s390x@0.25.12': optional: true - '@esbuild/darwin-x64@0.25.11': + '@esbuild/linux-s390x@0.27.1': optional: true - '@esbuild/freebsd-arm64@0.25.11': + '@esbuild/linux-x64@0.25.12': optional: true - '@esbuild/freebsd-x64@0.25.11': + '@esbuild/linux-x64@0.27.1': optional: true - '@esbuild/linux-arm64@0.25.11': + '@esbuild/netbsd-arm64@0.25.12': optional: true - '@esbuild/linux-arm@0.25.11': + '@esbuild/netbsd-arm64@0.27.1': optional: true - '@esbuild/linux-ia32@0.25.11': + '@esbuild/netbsd-x64@0.25.12': optional: true - '@esbuild/linux-loong64@0.25.11': + '@esbuild/netbsd-x64@0.27.1': optional: true - '@esbuild/linux-mips64el@0.25.11': + '@esbuild/openbsd-arm64@0.25.12': optional: true - '@esbuild/linux-ppc64@0.25.11': + '@esbuild/openbsd-arm64@0.27.1': optional: true - '@esbuild/linux-riscv64@0.25.11': + '@esbuild/openbsd-x64@0.25.12': optional: true - '@esbuild/linux-s390x@0.25.11': + '@esbuild/openbsd-x64@0.27.1': optional: true - '@esbuild/linux-x64@0.25.11': + '@esbuild/openharmony-arm64@0.25.12': optional: true - '@esbuild/netbsd-arm64@0.25.11': + '@esbuild/openharmony-arm64@0.27.1': optional: true - '@esbuild/netbsd-x64@0.25.11': + '@esbuild/sunos-x64@0.25.12': optional: true - '@esbuild/openbsd-arm64@0.25.11': + '@esbuild/sunos-x64@0.27.1': optional: true - '@esbuild/openbsd-x64@0.25.11': + '@esbuild/win32-arm64@0.25.12': optional: true - '@esbuild/openharmony-arm64@0.25.11': + '@esbuild/win32-arm64@0.27.1': optional: true - '@esbuild/sunos-x64@0.25.11': + '@esbuild/win32-ia32@0.25.12': optional: true - '@esbuild/win32-arm64@0.25.11': + '@esbuild/win32-ia32@0.27.1': optional: true - '@esbuild/win32-ia32@0.25.11': + '@esbuild/win32-x64@0.25.12': optional: true - '@esbuild/win32-x64@0.25.11': + '@esbuild/win32-x64@0.27.1': optional: true '@eslint-community/eslint-utils@4.9.0(eslint@9.37.0)': @@ -4006,90 +4378,98 @@ snapshots: '@img/colour@1.0.0': optional: true - '@img/sharp-darwin-arm64@0.34.4': + '@img/sharp-darwin-arm64@0.34.5': optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.2.3 + '@img/sharp-libvips-darwin-arm64': 1.2.4 optional: true - '@img/sharp-darwin-x64@0.34.4': + '@img/sharp-darwin-x64@0.34.5': optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.2.3 + '@img/sharp-libvips-darwin-x64': 1.2.4 optional: true - '@img/sharp-libvips-darwin-arm64@1.2.3': + '@img/sharp-libvips-darwin-arm64@1.2.4': optional: true - '@img/sharp-libvips-darwin-x64@1.2.3': + '@img/sharp-libvips-darwin-x64@1.2.4': optional: true - '@img/sharp-libvips-linux-arm64@1.2.3': + '@img/sharp-libvips-linux-arm64@1.2.4': optional: true - '@img/sharp-libvips-linux-arm@1.2.3': + '@img/sharp-libvips-linux-arm@1.2.4': optional: true - '@img/sharp-libvips-linux-ppc64@1.2.3': + '@img/sharp-libvips-linux-ppc64@1.2.4': optional: true - '@img/sharp-libvips-linux-s390x@1.2.3': + '@img/sharp-libvips-linux-riscv64@1.2.4': optional: true - '@img/sharp-libvips-linux-x64@1.2.3': + '@img/sharp-libvips-linux-s390x@1.2.4': optional: true - '@img/sharp-libvips-linuxmusl-arm64@1.2.3': + '@img/sharp-libvips-linux-x64@1.2.4': optional: true - '@img/sharp-libvips-linuxmusl-x64@1.2.3': + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': optional: true - '@img/sharp-linux-arm64@0.34.4': + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + optional: true + + '@img/sharp-linux-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.2.4 + optional: true + + '@img/sharp-linux-arm@0.34.5': optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.2.3 + '@img/sharp-libvips-linux-arm': 1.2.4 optional: true - '@img/sharp-linux-arm@0.34.4': + '@img/sharp-linux-ppc64@0.34.5': optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.2.3 + '@img/sharp-libvips-linux-ppc64': 1.2.4 optional: true - '@img/sharp-linux-ppc64@0.34.4': + '@img/sharp-linux-riscv64@0.34.5': optionalDependencies: - '@img/sharp-libvips-linux-ppc64': 1.2.3 + '@img/sharp-libvips-linux-riscv64': 1.2.4 optional: true - '@img/sharp-linux-s390x@0.34.4': + '@img/sharp-linux-s390x@0.34.5': optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.2.3 + '@img/sharp-libvips-linux-s390x': 1.2.4 optional: true - '@img/sharp-linux-x64@0.34.4': + '@img/sharp-linux-x64@0.34.5': optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.2.3 + '@img/sharp-libvips-linux-x64': 1.2.4 optional: true - '@img/sharp-linuxmusl-arm64@0.34.4': + '@img/sharp-linuxmusl-arm64@0.34.5': optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.2.3 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 optional: true - '@img/sharp-linuxmusl-x64@0.34.4': + '@img/sharp-linuxmusl-x64@0.34.5': optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.2.3 + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 optional: true - '@img/sharp-wasm32@0.34.4': + '@img/sharp-wasm32@0.34.5': dependencies: - '@emnapi/runtime': 1.5.0 + '@emnapi/runtime': 1.7.1 optional: true - '@img/sharp-win32-arm64@0.34.4': + '@img/sharp-win32-arm64@0.34.5': optional: true - '@img/sharp-win32-ia32@0.34.4': + '@img/sharp-win32-ia32@0.34.5': optional: true - '@img/sharp-win32-x64@0.34.4': + '@img/sharp-win32-x64@0.34.5': optional: true '@inquirer/external-editor@1.0.2(@types/node@20.19.21)': @@ -4099,12 +4479,12 @@ snapshots: optionalDependencies: '@types/node': 20.19.21 - '@inquirer/external-editor@1.0.2(@types/node@22.18.10)': + '@inquirer/external-editor@1.0.2(@types/node@24.10.4)': dependencies: chardet: 2.1.0 iconv-lite: 0.7.0 optionalDependencies: - '@types/node': 22.18.10 + '@types/node': 24.10.4 '@isaacs/balanced-match@4.0.1': {} @@ -4112,22 +4492,6 @@ snapshots: dependencies: '@isaacs/balanced-match': 4.0.1 - '@isaacs/cliui@8.0.2': - dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.2 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 - - '@istanbuljs/schema@0.1.3': {} - - '@jridgewell/gen-mapping@0.3.13': - dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 - '@jridgewell/trace-mapping': 0.3.31 - '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/sourcemap-codec@1.5.5': {} @@ -4158,34 +4522,34 @@ snapshots: globby: 11.1.0 read-yaml-file: 1.1.0 - '@next/env@15.5.5': {} + '@next/env@15.5.9': {} '@next/eslint-plugin-next@15.5.5': dependencies: fast-glob: 3.3.1 - '@next/swc-darwin-arm64@15.5.5': + '@next/swc-darwin-arm64@15.5.7': optional: true - '@next/swc-darwin-x64@15.5.5': + '@next/swc-darwin-x64@15.5.7': optional: true - '@next/swc-linux-arm64-gnu@15.5.5': + '@next/swc-linux-arm64-gnu@15.5.7': optional: true - '@next/swc-linux-arm64-musl@15.5.5': + '@next/swc-linux-arm64-musl@15.5.7': optional: true - '@next/swc-linux-x64-gnu@15.5.5': + '@next/swc-linux-x64-gnu@15.5.7': optional: true - '@next/swc-linux-x64-musl@15.5.5': + '@next/swc-linux-x64-musl@15.5.7': optional: true - '@next/swc-win32-arm64-msvc@15.5.5': + '@next/swc-win32-arm64-msvc@15.5.7': optional: true - '@next/swc-win32-x64-msvc@15.5.5': + '@next/swc-win32-x64-msvc@15.5.7': optional: true '@noble/ciphers@1.3.0': {} @@ -4194,10 +4558,6 @@ snapshots: dependencies: '@noble/hashes': 1.8.0 - '@noble/curves@1.9.7': - dependencies: - '@noble/hashes': 1.8.0 - '@noble/hashes@1.4.0': {} '@noble/hashes@1.8.0': {} @@ -4214,73 +4574,70 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 - '@pkgjs/parseargs@0.11.0': + '@rollup/rollup-android-arm-eabi@4.53.3': optional: true - '@rollup/rollup-android-arm-eabi@4.52.4': + '@rollup/rollup-android-arm64@4.53.3': optional: true - '@rollup/rollup-android-arm64@4.52.4': + '@rollup/rollup-darwin-arm64@4.53.3': optional: true - '@rollup/rollup-darwin-arm64@4.52.4': + '@rollup/rollup-darwin-x64@4.53.3': optional: true - '@rollup/rollup-darwin-x64@4.52.4': + '@rollup/rollup-freebsd-arm64@4.53.3': optional: true - '@rollup/rollup-freebsd-arm64@4.52.4': + '@rollup/rollup-freebsd-x64@4.53.3': optional: true - '@rollup/rollup-freebsd-x64@4.52.4': + '@rollup/rollup-linux-arm-gnueabihf@4.53.3': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.52.4': + '@rollup/rollup-linux-arm-musleabihf@4.53.3': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.52.4': + '@rollup/rollup-linux-arm64-gnu@4.53.3': optional: true - '@rollup/rollup-linux-arm64-gnu@4.52.4': + '@rollup/rollup-linux-arm64-musl@4.53.3': optional: true - '@rollup/rollup-linux-arm64-musl@4.52.4': + '@rollup/rollup-linux-loong64-gnu@4.53.3': optional: true - '@rollup/rollup-linux-loong64-gnu@4.52.4': + '@rollup/rollup-linux-ppc64-gnu@4.53.3': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.52.4': + '@rollup/rollup-linux-riscv64-gnu@4.53.3': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.52.4': + '@rollup/rollup-linux-riscv64-musl@4.53.3': optional: true - '@rollup/rollup-linux-riscv64-musl@4.52.4': + '@rollup/rollup-linux-s390x-gnu@4.53.3': optional: true - '@rollup/rollup-linux-s390x-gnu@4.52.4': + '@rollup/rollup-linux-x64-gnu@4.53.3': optional: true - '@rollup/rollup-linux-x64-gnu@4.52.4': + '@rollup/rollup-linux-x64-musl@4.53.3': optional: true - '@rollup/rollup-linux-x64-musl@4.52.4': + '@rollup/rollup-openharmony-arm64@4.53.3': optional: true - '@rollup/rollup-openharmony-arm64@4.52.4': + '@rollup/rollup-win32-arm64-msvc@4.53.3': optional: true - '@rollup/rollup-win32-arm64-msvc@4.52.4': + '@rollup/rollup-win32-ia32-msvc@4.53.3': optional: true - '@rollup/rollup-win32-ia32-msvc@4.52.4': + '@rollup/rollup-win32-x64-gnu@4.53.3': optional: true - '@rollup/rollup-win32-x64-gnu@4.52.4': - optional: true - - '@rollup/rollup-win32-x64-msvc@4.52.4': + '@rollup/rollup-win32-x64-msvc@4.53.3': optional: true '@scure/base@1.2.6': {} @@ -4296,6 +4653,10 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/base': 1.2.6 + '@sindresorhus/merge-streams@2.3.0': {} + + '@standard-schema/spec@1.0.0': {} + '@swc/helpers@0.5.15': dependencies: tslib: 2.8.1 @@ -4310,7 +4671,7 @@ snapshots: '@tsconfig/node16@1.0.4': {} - '@turbo/gen@1.13.4(@types/node@20.19.21)(typescript@5.5.4)': + '@turbo/gen@1.13.4(@types/node@20.19.21)(typescript@5.9.3)': dependencies: '@turbo/workspaces': 1.13.4(@types/node@20.19.21) chalk: 2.4.2 @@ -4320,7 +4681,7 @@ snapshots: minimatch: 9.0.5 node-plop: 0.26.3 proxy-agent: 6.5.0 - ts-node: 10.9.2(@types/node@20.19.21)(typescript@5.5.4) + ts-node: 10.9.2(@types/node@20.19.21)(typescript@5.9.3) update-check: 1.5.4 validate-npm-package-name: 5.0.1 transitivePeerDependencies: @@ -4347,9 +4708,10 @@ snapshots: transitivePeerDependencies: - '@types/node' - '@types/chai@5.2.2': + '@types/chai@5.2.3': dependencies: '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 '@types/deep-eql@4.0.2': {} @@ -4369,7 +4731,7 @@ snapshots: '@types/minimatch@6.0.0': dependencies: - minimatch: 10.0.3 + minimatch: 9.0.5 '@types/node@12.20.55': {} @@ -4377,10 +4739,14 @@ snapshots: dependencies: undici-types: 6.21.0 - '@types/node@22.18.10': + '@types/node@20.19.27': dependencies: undici-types: 6.21.0 + '@types/node@24.10.4': + dependencies: + undici-types: 7.16.0 + '@types/react-dom@19.2.3(@types/react@19.2.6)': dependencies: '@types/react': 19.2.6 @@ -4395,9 +4761,11 @@ snapshots: '@types/tinycolor2@1.4.6': {} + '@types/whatwg-mimetype@3.0.2': {} + '@types/yargs-parser@21.0.3': {} - '@types/yargs@17.0.33': + '@types/yargs@17.0.35': dependencies: '@types/yargs-parser': 21.0.3 @@ -4494,74 +4862,69 @@ snapshots: '@typescript-eslint/types': 8.46.1 eslint-visitor-keys: 4.2.1 - '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/node@22.18.10)(happy-dom@17.6.3))': + '@vitest/coverage-v8@4.0.15(vitest@4.0.15(@types/node@24.10.4)(happy-dom@20.0.11))': dependencies: - '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 - ast-v8-to-istanbul: 0.3.6 - debug: 4.4.3(supports-color@5.5.0) + '@vitest/utils': 4.0.15 + ast-v8-to-istanbul: 0.3.8 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 5.0.6 istanbul-reports: 3.2.0 - magic-string: 0.30.19 - magicast: 0.3.5 + magicast: 0.5.1 + obug: 2.1.1 std-env: 3.10.0 - test-exclude: 7.0.1 - tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/node@22.18.10)(happy-dom@17.6.3) + tinyrainbow: 3.0.3 + vitest: 4.0.15(@types/node@24.10.4)(happy-dom@20.0.11) transitivePeerDependencies: - supports-color - '@vitest/expect@3.2.4': + '@vitest/expect@4.0.15': dependencies: - '@types/chai': 5.2.2 - '@vitest/spy': 3.2.4 - '@vitest/utils': 3.2.4 - chai: 5.3.3 - tinyrainbow: 2.0.0 + '@standard-schema/spec': 1.0.0 + '@types/chai': 5.2.3 + '@vitest/spy': 4.0.15 + '@vitest/utils': 4.0.15 + chai: 6.2.1 + tinyrainbow: 3.0.3 - '@vitest/mocker@3.2.4(vite@7.1.10(@types/node@22.18.10))': + '@vitest/mocker@4.0.15(vite@7.2.7(@types/node@24.10.4))': dependencies: - '@vitest/spy': 3.2.4 + '@vitest/spy': 4.0.15 estree-walker: 3.0.3 - magic-string: 0.30.19 + magic-string: 0.30.21 optionalDependencies: - vite: 7.1.10(@types/node@22.18.10) + vite: 7.2.7(@types/node@24.10.4) - '@vitest/pretty-format@3.2.4': + '@vitest/pretty-format@4.0.15': dependencies: - tinyrainbow: 2.0.0 + tinyrainbow: 3.0.3 - '@vitest/runner@3.2.4': + '@vitest/runner@4.0.15': dependencies: - '@vitest/utils': 3.2.4 + '@vitest/utils': 4.0.15 pathe: 2.0.3 - strip-literal: 3.1.0 - '@vitest/snapshot@3.2.4': + '@vitest/snapshot@4.0.15': dependencies: - '@vitest/pretty-format': 3.2.4 - magic-string: 0.30.19 + '@vitest/pretty-format': 4.0.15 + magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@3.2.4': - dependencies: - tinyspy: 4.0.4 + '@vitest/spy@4.0.15': {} - '@vitest/utils@3.2.4': + '@vitest/utils@4.0.15': dependencies: - '@vitest/pretty-format': 3.2.4 - loupe: 3.2.1 - tinyrainbow: 2.0.0 + '@vitest/pretty-format': 4.0.15 + tinyrainbow: 3.0.3 - abitype@1.1.0(typescript@5.8.3): + abitype@1.1.0(typescript@5.9.3): optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.3 - abitype@1.1.1(typescript@5.8.3): + abitype@1.2.2(typescript@5.9.3): optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.3 acorn-jsx@5.3.2(acorn@8.15.0): dependencies: @@ -4691,7 +5054,7 @@ snapshots: dependencies: tslib: 2.8.1 - ast-v8-to-istanbul@0.3.6: + ast-v8-to-istanbul@0.3.8: dependencies: '@jridgewell/trace-mapping': 0.3.31 estree-walker: 3.0.3 @@ -4741,8 +5104,6 @@ snapshots: bytestreamjs@2.0.1: {} - cac@6.7.14: {} - call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -4767,17 +5128,15 @@ snapshots: no-case: 2.3.2 upper-case: 1.1.3 - caniuse-lite@1.0.30001751: {} + caniuse-lite@1.0.30001760: {} cbor2@1.12.0: {} - chai@5.3.3: + chai@6.2.1: {} + + chalk-template@1.1.2: dependencies: - assertion-error: 2.0.1 - check-error: 2.1.1 - deep-eql: 5.0.2 - loupe: 3.2.1 - pathval: 2.0.1 + chalk: 5.6.2 chalk@2.4.2: dependencies: @@ -4795,6 +5154,8 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 + chalk@5.6.2: {} + change-case@3.1.0: dependencies: camel-case: 3.0.0 @@ -4820,8 +5181,6 @@ snapshots: chardet@2.1.0: {} - check-error@2.1.1: {} - chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -4842,6 +5201,10 @@ snapshots: dependencies: restore-cursor: 3.1.0 + cli-cursor@5.0.0: + dependencies: + restore-cursor: 5.1.0 + cli-spinners@2.9.2: {} cli-width@3.0.0: {} @@ -4854,6 +5217,12 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 + cliui@9.0.1: + dependencies: + string-width: 7.2.0 + strip-ansi: 7.1.2 + wrap-ansi: 9.0.2 + clone@1.0.4: {} color-convert@1.9.3: @@ -4870,16 +5239,15 @@ snapshots: commander@10.0.1: {} + commander@13.1.0: {} + concat-map@0.0.1: {} - concurrently@8.2.2: + concurrently@9.2.1: dependencies: chalk: 4.1.2 - date-fns: 2.30.0 - lodash: 4.17.21 rxjs: 7.8.2 shell-quote: 1.8.3 - spawn-command: 0.0.2 supports-color: 8.1.1 tree-kill: 1.2.2 yargs: 17.7.2 @@ -4891,6 +5259,15 @@ snapshots: core-js-pure@3.46.0: {} + cosmiconfig@9.0.0(typescript@5.9.3): + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.1 + js-yaml: 4.1.1 + parse-json: 5.2.0 + optionalDependencies: + typescript: 5.9.3 + create-require@1.1.1: {} cross-spawn@7.0.6: @@ -4921,18 +5298,12 @@ snapshots: es-errors: 1.3.0 is-data-view: 1.0.2 - date-fns@2.30.0: - dependencies: - '@babel/runtime': 7.28.4 - debug@4.4.3(supports-color@5.5.0): dependencies: ms: 2.1.3 optionalDependencies: supports-color: 5.5.0 - deep-eql@5.0.2: {} - deep-extend@0.6.0: {} deep-is@0.1.4: {} @@ -4991,7 +5362,7 @@ snapshots: dotenv@16.0.3: {} - dotenv@16.6.1: {} + dotenv@17.2.3: {} dunder-proto@1.0.1: dependencies: @@ -4999,17 +5370,26 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - eastasianwidth@0.2.0: {} + effect@3.19.12: + dependencies: + '@standard-schema/spec': 1.0.0 + fast-check: 3.23.2 + + emoji-regex@10.6.0: {} emoji-regex@8.0.0: {} - emoji-regex@9.2.2: {} - enquirer@2.4.1: dependencies: ansi-colors: 4.1.3 strip-ansi: 6.0.1 + env-paths@2.2.1: {} + + error-ex@1.3.4: + dependencies: + is-arrayish: 0.2.1 + es-abstract@1.24.0: dependencies: array-buffer-byte-length: 1.0.2 @@ -5113,34 +5493,63 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - esbuild@0.25.11: + esbuild@0.25.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.12 + '@esbuild/android-arm': 0.25.12 + '@esbuild/android-arm64': 0.25.12 + '@esbuild/android-x64': 0.25.12 + '@esbuild/darwin-arm64': 0.25.12 + '@esbuild/darwin-x64': 0.25.12 + '@esbuild/freebsd-arm64': 0.25.12 + '@esbuild/freebsd-x64': 0.25.12 + '@esbuild/linux-arm': 0.25.12 + '@esbuild/linux-arm64': 0.25.12 + '@esbuild/linux-ia32': 0.25.12 + '@esbuild/linux-loong64': 0.25.12 + '@esbuild/linux-mips64el': 0.25.12 + '@esbuild/linux-ppc64': 0.25.12 + '@esbuild/linux-riscv64': 0.25.12 + '@esbuild/linux-s390x': 0.25.12 + '@esbuild/linux-x64': 0.25.12 + '@esbuild/netbsd-arm64': 0.25.12 + '@esbuild/netbsd-x64': 0.25.12 + '@esbuild/openbsd-arm64': 0.25.12 + '@esbuild/openbsd-x64': 0.25.12 + '@esbuild/openharmony-arm64': 0.25.12 + '@esbuild/sunos-x64': 0.25.12 + '@esbuild/win32-arm64': 0.25.12 + '@esbuild/win32-ia32': 0.25.12 + '@esbuild/win32-x64': 0.25.12 + + esbuild@0.27.1: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.11 - '@esbuild/android-arm': 0.25.11 - '@esbuild/android-arm64': 0.25.11 - '@esbuild/android-x64': 0.25.11 - '@esbuild/darwin-arm64': 0.25.11 - '@esbuild/darwin-x64': 0.25.11 - '@esbuild/freebsd-arm64': 0.25.11 - '@esbuild/freebsd-x64': 0.25.11 - '@esbuild/linux-arm': 0.25.11 - '@esbuild/linux-arm64': 0.25.11 - '@esbuild/linux-ia32': 0.25.11 - '@esbuild/linux-loong64': 0.25.11 - '@esbuild/linux-mips64el': 0.25.11 - '@esbuild/linux-ppc64': 0.25.11 - '@esbuild/linux-riscv64': 0.25.11 - '@esbuild/linux-s390x': 0.25.11 - '@esbuild/linux-x64': 0.25.11 - '@esbuild/netbsd-arm64': 0.25.11 - '@esbuild/netbsd-x64': 0.25.11 - '@esbuild/openbsd-arm64': 0.25.11 - '@esbuild/openbsd-x64': 0.25.11 - '@esbuild/openharmony-arm64': 0.25.11 - '@esbuild/sunos-x64': 0.25.11 - '@esbuild/win32-arm64': 0.25.11 - '@esbuild/win32-ia32': 0.25.11 - '@esbuild/win32-x64': 0.25.11 + '@esbuild/aix-ppc64': 0.27.1 + '@esbuild/android-arm': 0.27.1 + '@esbuild/android-arm64': 0.27.1 + '@esbuild/android-x64': 0.27.1 + '@esbuild/darwin-arm64': 0.27.1 + '@esbuild/darwin-x64': 0.27.1 + '@esbuild/freebsd-arm64': 0.27.1 + '@esbuild/freebsd-x64': 0.27.1 + '@esbuild/linux-arm': 0.27.1 + '@esbuild/linux-arm64': 0.27.1 + '@esbuild/linux-ia32': 0.27.1 + '@esbuild/linux-loong64': 0.27.1 + '@esbuild/linux-mips64el': 0.27.1 + '@esbuild/linux-ppc64': 0.27.1 + '@esbuild/linux-riscv64': 0.27.1 + '@esbuild/linux-s390x': 0.27.1 + '@esbuild/linux-x64': 0.27.1 + '@esbuild/netbsd-arm64': 0.27.1 + '@esbuild/netbsd-x64': 0.27.1 + '@esbuild/openbsd-arm64': 0.27.1 + '@esbuild/openbsd-x64': 0.27.1 + '@esbuild/openharmony-arm64': 0.27.1 + '@esbuild/sunos-x64': 0.27.1 + '@esbuild/win32-arm64': 0.27.1 + '@esbuild/win32-ia32': 0.27.1 + '@esbuild/win32-x64': 0.27.1 escalade@3.2.0: {} @@ -5188,11 +5597,11 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-turbo@2.5.8(eslint@9.37.0)(turbo@2.5.8): + eslint-plugin-turbo@2.5.8(eslint@9.37.0)(turbo@2.6.3): dependencies: dotenv: 16.0.3 eslint: 9.37.0 - turbo: 2.5.8 + turbo: 2.6.3 eslint-scope@8.4.0: dependencies: @@ -5281,7 +5690,7 @@ snapshots: signal-exit: 3.0.7 strip-final-newline: 2.0.0 - expect-type@1.2.2: {} + expect-type@1.3.0: {} extendable-error@0.1.7: {} @@ -5291,7 +5700,11 @@ snapshots: iconv-lite: 0.4.24 tmp: 0.0.33 - fake-indexeddb@6.2.3: {} + fake-indexeddb@6.2.5: {} + + fast-check@3.23.2: + dependencies: + pure-rand: 6.1.0 fast-deep-equal@3.1.3: {} @@ -5356,11 +5769,6 @@ snapshots: dependencies: is-callable: 1.2.7 - foreground-child@3.3.1: - dependencies: - cross-spawn: 7.0.6 - signal-exit: 4.1.0 - fs-extra@10.1.0: dependencies: graceful-fs: 4.2.11 @@ -5401,6 +5809,8 @@ snapshots: get-caller-file@2.0.5: {} + get-east-asian-width@1.4.0: {} + get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 @@ -5443,23 +5853,11 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@10.4.5: - dependencies: - foreground-child: 3.3.1 - jackspeak: 3.4.3 - minimatch: 9.0.5 - minipass: 7.1.2 - package-json-from-dist: 1.0.1 - path-scurry: 1.11.1 - - glob@11.0.3: + glob@13.0.0: dependencies: - foreground-child: 3.3.1 - jackspeak: 4.1.1 - minimatch: 10.0.3 + minimatch: 10.1.1 minipass: 7.1.2 - package-json-from-dist: 1.0.1 - path-scurry: 2.0.0 + path-scurry: 2.0.1 glob@7.2.3: dependencies: @@ -5499,6 +5897,15 @@ snapshots: merge2: 1.4.1 slash: 3.0.0 + globby@14.1.0: + dependencies: + '@sindresorhus/merge-streams': 2.3.0 + fast-glob: 3.3.3 + ignore: 7.0.5 + path-type: 6.0.0 + slash: 5.1.0 + unicorn-magic: 0.3.0 + gopd@1.2.0: {} graceful-fs@4.2.11: {} @@ -5519,9 +5926,10 @@ snapshots: optionalDependencies: uglify-js: 3.19.3 - happy-dom@17.6.3: + happy-dom@20.0.11: dependencies: - webidl-conversions: 7.0.0 + '@types/node': 20.19.27 + '@types/whatwg-mimetype': 3.0.2 whatwg-mimetype: 3.0.0 has-bigints@1.1.0: {} @@ -5553,6 +5961,10 @@ snapshots: no-case: 2.3.2 upper-case: 1.1.3 + hosted-git-info@8.1.0: + dependencies: + lru-cache: 10.4.3 + html-escaper@2.0.2: {} http-proxy-agent@7.0.2: @@ -5581,7 +5993,7 @@ snapshots: dependencies: safer-buffer: 2.1.2 - idb@7.1.1: {} + idb@8.0.3: {} ieee754@1.2.1: {} @@ -5659,6 +6071,8 @@ snapshots: call-bound: 1.0.4 get-intrinsic: 1.3.0 + is-arrayish@0.2.1: {} + is-async-function@2.1.1: dependencies: async-function: 1.0.0 @@ -5719,6 +6133,8 @@ snapshots: is-interactive@1.0.0: {} + is-interactive@2.0.0: {} + is-lower-case@1.1.3: dependencies: lower-case: 1.1.4 @@ -5774,6 +6190,10 @@ snapshots: is-unicode-supported@0.1.0: {} + is-unicode-supported@1.3.0: {} + + is-unicode-supported@2.1.0: {} + is-upper-case@1.1.2: dependencies: upper-case: 1.1.3 @@ -5831,16 +6251,6 @@ snapshots: has-symbols: 1.1.0 set-function-name: 2.0.2 - jackspeak@3.4.3: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - - jackspeak@4.1.1: - dependencies: - '@isaacs/cliui': 8.0.2 - js-tokens@4.0.0: {} js-tokens@9.0.1: {} @@ -5854,14 +6264,22 @@ snapshots: dependencies: argparse: 2.0.1 + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + json-buffer@3.0.1: {} json-canonicalize@2.0.0: {} + json-parse-even-better-errors@2.3.1: {} + json-schema-traverse@0.4.1: {} json-stable-stringify-without-jsonify@1.0.1: {} + jsonc-parser@3.3.1: {} + jsonfile@4.0.0: optionalDependencies: graceful-fs: 4.2.11 @@ -5885,54 +6303,58 @@ snapshots: dependencies: json-buffer: 3.0.1 - lefthook-darwin-arm64@1.13.6: + kleur@3.0.3: {} + + lefthook-darwin-arm64@2.0.11: optional: true - lefthook-darwin-x64@1.13.6: + lefthook-darwin-x64@2.0.11: optional: true - lefthook-freebsd-arm64@1.13.6: + lefthook-freebsd-arm64@2.0.11: optional: true - lefthook-freebsd-x64@1.13.6: + lefthook-freebsd-x64@2.0.11: optional: true - lefthook-linux-arm64@1.13.6: + lefthook-linux-arm64@2.0.11: optional: true - lefthook-linux-x64@1.13.6: + lefthook-linux-x64@2.0.11: optional: true - lefthook-openbsd-arm64@1.13.6: + lefthook-openbsd-arm64@2.0.11: optional: true - lefthook-openbsd-x64@1.13.6: + lefthook-openbsd-x64@2.0.11: optional: true - lefthook-windows-arm64@1.13.6: + lefthook-windows-arm64@2.0.11: optional: true - lefthook-windows-x64@1.13.6: + lefthook-windows-x64@2.0.11: optional: true - lefthook@1.13.6: + lefthook@2.0.11: optionalDependencies: - lefthook-darwin-arm64: 1.13.6 - lefthook-darwin-x64: 1.13.6 - lefthook-freebsd-arm64: 1.13.6 - lefthook-freebsd-x64: 1.13.6 - lefthook-linux-arm64: 1.13.6 - lefthook-linux-x64: 1.13.6 - lefthook-openbsd-arm64: 1.13.6 - lefthook-openbsd-x64: 1.13.6 - lefthook-windows-arm64: 1.13.6 - lefthook-windows-x64: 1.13.6 + lefthook-darwin-arm64: 2.0.11 + lefthook-darwin-x64: 2.0.11 + lefthook-freebsd-arm64: 2.0.11 + lefthook-freebsd-x64: 2.0.11 + lefthook-linux-arm64: 2.0.11 + lefthook-linux-x64: 2.0.11 + lefthook-openbsd-arm64: 2.0.11 + lefthook-openbsd-x64: 2.0.11 + lefthook-windows-arm64: 2.0.11 + lefthook-windows-x64: 2.0.11 levn@0.4.1: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 + lines-and-columns@1.2.4: {} + locate-path@5.0.0: dependencies: p-locate: 4.1.0 @@ -5958,12 +6380,15 @@ snapshots: chalk: 4.1.2 is-unicode-supported: 0.1.0 + log-symbols@6.0.0: + dependencies: + chalk: 5.6.2 + is-unicode-supported: 1.3.0 + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 - loupe@3.2.1: {} - lower-case-first@1.0.2: dependencies: lower-case: 1.1.4 @@ -5972,18 +6397,18 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@11.2.2: {} + lru-cache@11.2.4: {} lru-cache@7.18.3: {} - magic-string@0.30.19: + magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - magicast@0.3.5: + magicast@0.5.1: dependencies: - '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 source-map-js: 1.2.1 make-dir@4.0.0: @@ -6005,7 +6430,9 @@ snapshots: mimic-fn@2.1.0: {} - minimatch@10.0.3: + mimic-function@5.0.1: {} + + minimatch@10.1.1: dependencies: '@isaacs/brace-expansion': 5.0.0 @@ -6021,9 +6448,9 @@ snapshots: minipass@7.1.2: {} - mipd@0.0.7(typescript@5.8.3): + mipd@0.0.7(typescript@5.9.3): optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.3 mkdirp@0.5.6: dependencies: @@ -6043,25 +6470,25 @@ snapshots: netmask@2.0.2: {} - next@15.5.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + next@15.5.9(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: - '@next/env': 15.5.5 + '@next/env': 15.5.9 '@swc/helpers': 0.5.15 - caniuse-lite: 1.0.30001751 + caniuse-lite: 1.0.30001760 postcss: 8.4.31 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) styled-jsx: 5.1.6(react@19.2.0) optionalDependencies: - '@next/swc-darwin-arm64': 15.5.5 - '@next/swc-darwin-x64': 15.5.5 - '@next/swc-linux-arm64-gnu': 15.5.5 - '@next/swc-linux-arm64-musl': 15.5.5 - '@next/swc-linux-x64-gnu': 15.5.5 - '@next/swc-linux-x64-musl': 15.5.5 - '@next/swc-win32-arm64-msvc': 15.5.5 - '@next/swc-win32-x64-msvc': 15.5.5 - sharp: 0.34.4 + '@next/swc-darwin-arm64': 15.5.7 + '@next/swc-darwin-x64': 15.5.7 + '@next/swc-linux-arm64-gnu': 15.5.7 + '@next/swc-linux-arm64-musl': 15.5.7 + '@next/swc-linux-x64-gnu': 15.5.7 + '@next/swc-linux-x64-musl': 15.5.7 + '@next/swc-win32-arm64-msvc': 15.5.7 + '@next/swc-win32-x64-msvc': 15.5.7 + sharp: 0.34.5 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros @@ -6084,7 +6511,7 @@ snapshots: mkdirp: 0.5.6 resolve: 1.22.10 - nodemon@3.1.10: + nodemon@3.1.11: dependencies: chokidar: 3.6.0 debug: 4.4.3(supports-color@5.5.0) @@ -6099,6 +6526,13 @@ snapshots: normalize-path@3.0.0: {} + npm-package-arg@12.0.2: + dependencies: + hosted-git-info: 8.1.0 + proc-log: 5.0.0 + semver: 7.7.3 + validate-npm-package-name: 6.0.2 + npm-run-path@4.0.1: dependencies: path-key: 3.1.1 @@ -6139,6 +6573,8 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.1 + obug@2.1.1: {} + once@1.4.0: dependencies: wrappy: 1.0.2 @@ -6147,6 +6583,10 @@ snapshots: dependencies: mimic-fn: 2.1.0 + onetime@7.0.0: + dependencies: + mimic-function: 5.0.1 + optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -6179,6 +6619,18 @@ snapshots: strip-ansi: 6.0.1 wcwidth: 1.0.1 + ora@8.2.0: + dependencies: + chalk: 5.6.2 + cli-cursor: 5.0.0 + cli-spinners: 2.9.2 + is-interactive: 2.0.0 + is-unicode-supported: 2.1.0 + log-symbols: 6.0.0 + stdin-discarder: 0.2.2 + string-width: 7.2.0 + strip-ansi: 7.1.2 + os-tmpdir@1.0.2: {} outdent@0.5.0: {} @@ -6189,22 +6641,7 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 - ox@0.7.2(typescript@5.8.3): - dependencies: - '@adraffy/ens-normalize': 1.11.1 - '@noble/ciphers': 1.3.0 - '@noble/curves': 1.9.7 - '@noble/hashes': 1.8.0 - '@scure/bip32': 1.7.0 - '@scure/bip39': 1.6.0 - abitype: 1.1.1(typescript@5.8.3) - eventemitter3: 5.0.1 - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - zod - - ox@0.9.6(typescript@5.8.3): + ox@0.9.17(typescript@5.9.3): dependencies: '@adraffy/ens-normalize': 1.11.1 '@noble/ciphers': 1.3.0 @@ -6212,10 +6649,10 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.1.0(typescript@5.8.3) + abitype: 1.2.2(typescript@5.9.3) eventemitter3: 5.0.1 optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.3 transitivePeerDependencies: - zod @@ -6279,6 +6716,13 @@ snapshots: dependencies: callsites: 3.1.0 + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.27.1 + error-ex: 1.3.4 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + pascal-case@2.0.1: dependencies: camel-case: 3.0.0 @@ -6296,21 +6740,16 @@ snapshots: path-parse@1.0.7: {} - path-scurry@1.11.1: - dependencies: - lru-cache: 10.4.3 - minipass: 7.1.2 - - path-scurry@2.0.0: + path-scurry@2.0.1: dependencies: - lru-cache: 11.2.2 + lru-cache: 11.2.4 minipass: 7.1.2 path-type@4.0.0: {} - pathe@2.0.3: {} + path-type@6.0.0: {} - pathval@2.0.1: {} + pathe@2.0.3: {} picocolors@1.1.1: {} @@ -6349,6 +6788,13 @@ snapshots: prettier@3.6.2: {} + proc-log@5.0.0: {} + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + prop-types@15.8.1: dependencies: loose-envify: 1.4.0 @@ -6374,6 +6820,8 @@ snapshots: punycode@2.3.1: {} + pure-rand@6.1.0: {} + pvtsutils@1.3.6: dependencies: tslib: 2.8.1 @@ -6407,6 +6855,11 @@ snapshots: pify: 4.0.1 strip-bom: 3.0.0 + read-yaml-file@2.1.0: + dependencies: + js-yaml: 4.1.1 + strip-bom: 4.0.0 + readable-stream@3.6.2: dependencies: inherits: 2.0.4 @@ -6469,43 +6922,48 @@ snapshots: onetime: 5.1.2 signal-exit: 3.0.7 + restore-cursor@5.1.0: + dependencies: + onetime: 7.0.0 + signal-exit: 4.1.0 + reusify@1.1.0: {} rimraf@3.0.2: dependencies: glob: 7.2.3 - rimraf@6.0.1: + rimraf@6.1.2: dependencies: - glob: 11.0.3 + glob: 13.0.0 package-json-from-dist: 1.0.1 - rollup@4.52.4: + rollup@4.53.3: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.52.4 - '@rollup/rollup-android-arm64': 4.52.4 - '@rollup/rollup-darwin-arm64': 4.52.4 - '@rollup/rollup-darwin-x64': 4.52.4 - '@rollup/rollup-freebsd-arm64': 4.52.4 - '@rollup/rollup-freebsd-x64': 4.52.4 - '@rollup/rollup-linux-arm-gnueabihf': 4.52.4 - '@rollup/rollup-linux-arm-musleabihf': 4.52.4 - '@rollup/rollup-linux-arm64-gnu': 4.52.4 - '@rollup/rollup-linux-arm64-musl': 4.52.4 - '@rollup/rollup-linux-loong64-gnu': 4.52.4 - '@rollup/rollup-linux-ppc64-gnu': 4.52.4 - '@rollup/rollup-linux-riscv64-gnu': 4.52.4 - '@rollup/rollup-linux-riscv64-musl': 4.52.4 - '@rollup/rollup-linux-s390x-gnu': 4.52.4 - '@rollup/rollup-linux-x64-gnu': 4.52.4 - '@rollup/rollup-linux-x64-musl': 4.52.4 - '@rollup/rollup-openharmony-arm64': 4.52.4 - '@rollup/rollup-win32-arm64-msvc': 4.52.4 - '@rollup/rollup-win32-ia32-msvc': 4.52.4 - '@rollup/rollup-win32-x64-gnu': 4.52.4 - '@rollup/rollup-win32-x64-msvc': 4.52.4 + '@rollup/rollup-android-arm-eabi': 4.53.3 + '@rollup/rollup-android-arm64': 4.53.3 + '@rollup/rollup-darwin-arm64': 4.53.3 + '@rollup/rollup-darwin-x64': 4.53.3 + '@rollup/rollup-freebsd-arm64': 4.53.3 + '@rollup/rollup-freebsd-x64': 4.53.3 + '@rollup/rollup-linux-arm-gnueabihf': 4.53.3 + '@rollup/rollup-linux-arm-musleabihf': 4.53.3 + '@rollup/rollup-linux-arm64-gnu': 4.53.3 + '@rollup/rollup-linux-arm64-musl': 4.53.3 + '@rollup/rollup-linux-loong64-gnu': 4.53.3 + '@rollup/rollup-linux-ppc64-gnu': 4.53.3 + '@rollup/rollup-linux-riscv64-gnu': 4.53.3 + '@rollup/rollup-linux-riscv64-musl': 4.53.3 + '@rollup/rollup-linux-s390x-gnu': 4.53.3 + '@rollup/rollup-linux-x64-gnu': 4.53.3 + '@rollup/rollup-linux-x64-musl': 4.53.3 + '@rollup/rollup-openharmony-arm64': 4.53.3 + '@rollup/rollup-win32-arm64-msvc': 4.53.3 + '@rollup/rollup-win32-ia32-msvc': 4.53.3 + '@rollup/rollup-win32-x64-gnu': 4.53.3 + '@rollup/rollup-win32-x64-msvc': 4.53.3 fsevents: 2.3.3 run-async@2.4.1: {} @@ -6578,34 +7036,36 @@ snapshots: es-errors: 1.3.0 es-object-atoms: 1.1.1 - sharp@0.34.4: + sharp@0.34.5: dependencies: '@img/colour': 1.0.0 detect-libc: 2.1.2 semver: 7.7.3 optionalDependencies: - '@img/sharp-darwin-arm64': 0.34.4 - '@img/sharp-darwin-x64': 0.34.4 - '@img/sharp-libvips-darwin-arm64': 1.2.3 - '@img/sharp-libvips-darwin-x64': 1.2.3 - '@img/sharp-libvips-linux-arm': 1.2.3 - '@img/sharp-libvips-linux-arm64': 1.2.3 - '@img/sharp-libvips-linux-ppc64': 1.2.3 - '@img/sharp-libvips-linux-s390x': 1.2.3 - '@img/sharp-libvips-linux-x64': 1.2.3 - '@img/sharp-libvips-linuxmusl-arm64': 1.2.3 - '@img/sharp-libvips-linuxmusl-x64': 1.2.3 - '@img/sharp-linux-arm': 0.34.4 - '@img/sharp-linux-arm64': 0.34.4 - '@img/sharp-linux-ppc64': 0.34.4 - '@img/sharp-linux-s390x': 0.34.4 - '@img/sharp-linux-x64': 0.34.4 - '@img/sharp-linuxmusl-arm64': 0.34.4 - '@img/sharp-linuxmusl-x64': 0.34.4 - '@img/sharp-wasm32': 0.34.4 - '@img/sharp-win32-arm64': 0.34.4 - '@img/sharp-win32-ia32': 0.34.4 - '@img/sharp-win32-x64': 0.34.4 + '@img/sharp-darwin-arm64': 0.34.5 + '@img/sharp-darwin-x64': 0.34.5 + '@img/sharp-libvips-darwin-arm64': 1.2.4 + '@img/sharp-libvips-darwin-x64': 1.2.4 + '@img/sharp-libvips-linux-arm': 1.2.4 + '@img/sharp-libvips-linux-arm64': 1.2.4 + '@img/sharp-libvips-linux-ppc64': 1.2.4 + '@img/sharp-libvips-linux-riscv64': 1.2.4 + '@img/sharp-libvips-linux-s390x': 1.2.4 + '@img/sharp-libvips-linux-x64': 1.2.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + '@img/sharp-linux-arm': 0.34.5 + '@img/sharp-linux-arm64': 0.34.5 + '@img/sharp-linux-ppc64': 0.34.5 + '@img/sharp-linux-riscv64': 0.34.5 + '@img/sharp-linux-s390x': 0.34.5 + '@img/sharp-linux-x64': 0.34.5 + '@img/sharp-linuxmusl-arm64': 0.34.5 + '@img/sharp-linuxmusl-x64': 0.34.5 + '@img/sharp-wasm32': 0.34.5 + '@img/sharp-win32-arm64': 0.34.5 + '@img/sharp-win32-ia32': 0.34.5 + '@img/sharp-win32-x64': 0.34.5 optional: true shebang-command@2.0.0: @@ -6654,8 +7114,12 @@ snapshots: dependencies: semver: 7.7.3 + sisteransi@1.0.5: {} + slash@3.0.0: {} + slash@5.1.0: {} + smart-buffer@4.2.0: {} snake-case@2.1.0: @@ -6679,8 +7143,6 @@ snapshots: source-map@0.6.1: {} - spawn-command@0.0.2: {} - spawndamnit@3.0.1: dependencies: cross-spawn: 7.0.6 @@ -6692,6 +7154,8 @@ snapshots: std-env@3.10.0: {} + stdin-discarder@0.2.2: {} + stop-iteration-iterator@1.1.0: dependencies: es-errors: 1.3.0 @@ -6703,10 +7167,10 @@ snapshots: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - string-width@5.1.2: + string-width@7.2.0: dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 + emoji-regex: 10.6.0 + get-east-asian-width: 1.4.0 strip-ansi: 7.1.2 string.prototype.matchall@4.0.12: @@ -6767,16 +7231,14 @@ snapshots: strip-bom@3.0.0: {} + strip-bom@4.0.0: {} + strip-final-newline@2.0.0: {} strip-json-comments@2.0.1: {} strip-json-comments@3.1.1: {} - strip-literal@3.1.0: - dependencies: - js-tokens: 9.0.1 - styled-jsx@5.1.6(react@19.2.0): dependencies: client-only: 0.0.1 @@ -6801,21 +7263,39 @@ snapshots: lower-case: 1.1.4 upper-case: 1.1.3 - term-size@2.2.1: {} - - test-exclude@7.0.1: + syncpack@13.0.4(typescript@5.9.3): dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 10.4.5 + chalk: 5.6.2 + chalk-template: 1.1.2 + commander: 13.1.0 + cosmiconfig: 9.0.0(typescript@5.9.3) + effect: 3.19.12 + enquirer: 2.4.1 + fast-check: 3.23.2 + globby: 14.1.0 + jsonc-parser: 3.3.1 minimatch: 9.0.5 + npm-package-arg: 12.0.2 + ora: 8.2.0 + prompts: 2.4.2 + read-yaml-file: 2.1.0 + semver: 7.7.3 + tightrope: 0.2.0 + ts-toolbelt: 9.6.0 + transitivePeerDependencies: + - typescript + + term-size@2.2.1: {} through@2.3.8: {} + tightrope@0.2.0: {} + tinybench@2.9.0: {} tinycolor2@1.6.0: {} - tinyexec@0.3.2: {} + tinyexec@1.0.2: {} tinyglobby@0.2.15: dependencies: @@ -6827,11 +7307,7 @@ snapshots: '@types/tinycolor2': 1.4.6 tinycolor2: 1.6.0 - tinypool@1.1.1: {} - - tinyrainbow@2.0.0: {} - - tinyspy@4.0.4: {} + tinyrainbow@3.0.3: {} title-case@2.1.1: dependencies: @@ -6854,7 +7330,7 @@ snapshots: dependencies: typescript: 5.8.3 - ts-node@10.9.2(@types/node@20.19.21)(typescript@5.5.4): + ts-node@10.9.2(@types/node@20.19.21)(typescript@5.9.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -6868,40 +7344,42 @@ snapshots: create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.5.4 + typescript: 5.9.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 + ts-toolbelt@9.6.0: {} + tslib@1.14.1: {} tslib@2.8.1: {} - turbo-darwin-64@2.5.8: + turbo-darwin-64@2.6.3: optional: true - turbo-darwin-arm64@2.5.8: + turbo-darwin-arm64@2.6.3: optional: true - turbo-linux-64@2.5.8: + turbo-linux-64@2.6.3: optional: true - turbo-linux-arm64@2.5.8: + turbo-linux-arm64@2.6.3: optional: true - turbo-windows-64@2.5.8: + turbo-windows-64@2.6.3: optional: true - turbo-windows-arm64@2.5.8: + turbo-windows-arm64@2.6.3: optional: true - turbo@2.5.8: + turbo@2.6.3: optionalDependencies: - turbo-darwin-64: 2.5.8 - turbo-darwin-arm64: 2.5.8 - turbo-linux-64: 2.5.8 - turbo-linux-arm64: 2.5.8 - turbo-windows-64: 2.5.8 - turbo-windows-arm64: 2.5.8 + turbo-darwin-64: 2.6.3 + turbo-darwin-arm64: 2.6.3 + turbo-linux-64: 2.6.3 + turbo-linux-arm64: 2.6.3 + turbo-windows-64: 2.6.3 + turbo-windows-arm64: 2.6.3 type-check@0.4.0: dependencies: @@ -6953,10 +7431,10 @@ snapshots: transitivePeerDependencies: - supports-color - typescript@5.5.4: {} - typescript@5.8.3: {} + typescript@5.9.3: {} + uglify-js@3.19.3: optional: true @@ -6971,6 +7449,10 @@ snapshots: undici-types@6.21.0: {} + undici-types@7.16.0: {} + + unicorn-magic@0.3.0: {} + universalify@0.1.2: {} universalify@2.0.1: {} @@ -6992,90 +7474,68 @@ snapshots: util-deprecate@1.0.2: {} - uuid@11.1.0: {} + uuid@13.0.0: {} v8-compile-cache-lib@3.0.1: {} validate-npm-package-name@5.0.1: {} - viem@2.38.2(typescript@5.8.3): + validate-npm-package-name@6.0.2: {} + + viem@2.42.0(typescript@5.9.3): dependencies: '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.1.0(typescript@5.8.3) + abitype: 1.1.0(typescript@5.9.3) isows: 1.0.7(ws@8.18.3) - ox: 0.9.6(typescript@5.8.3) + ox: 0.9.17(typescript@5.9.3) ws: 8.18.3 optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.3 transitivePeerDependencies: - bufferutil - utf-8-validate - zod - vite-node@3.2.4(@types/node@22.18.10): - dependencies: - cac: 6.7.14 - debug: 4.4.3(supports-color@5.5.0) - es-module-lexer: 1.7.0 - pathe: 2.0.3 - vite: 7.1.10(@types/node@22.18.10) - transitivePeerDependencies: - - '@types/node' - - jiti - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - - vite@7.1.10(@types/node@22.18.10): + vite@7.2.7(@types/node@24.10.4): dependencies: - esbuild: 0.25.11 + esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.52.4 + rollup: 4.53.3 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 22.18.10 + '@types/node': 24.10.4 fsevents: 2.3.3 - vitest@3.2.4(@types/node@22.18.10)(happy-dom@17.6.3): - dependencies: - '@types/chai': 5.2.2 - '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.1.10(@types/node@22.18.10)) - '@vitest/pretty-format': 3.2.4 - '@vitest/runner': 3.2.4 - '@vitest/snapshot': 3.2.4 - '@vitest/spy': 3.2.4 - '@vitest/utils': 3.2.4 - chai: 5.3.3 - debug: 4.4.3(supports-color@5.5.0) - expect-type: 1.2.2 - magic-string: 0.30.19 + vitest@4.0.15(@types/node@24.10.4)(happy-dom@20.0.11): + dependencies: + '@vitest/expect': 4.0.15 + '@vitest/mocker': 4.0.15(vite@7.2.7(@types/node@24.10.4)) + '@vitest/pretty-format': 4.0.15 + '@vitest/runner': 4.0.15 + '@vitest/snapshot': 4.0.15 + '@vitest/spy': 4.0.15 + '@vitest/utils': 4.0.15 + es-module-lexer: 1.7.0 + expect-type: 1.3.0 + magic-string: 0.30.21 + obug: 2.1.1 pathe: 2.0.3 picomatch: 4.0.3 std-env: 3.10.0 tinybench: 2.9.0 - tinyexec: 0.3.2 + tinyexec: 1.0.2 tinyglobby: 0.2.15 - tinypool: 1.1.1 - tinyrainbow: 2.0.0 - vite: 7.1.10(@types/node@22.18.10) - vite-node: 3.2.4(@types/node@22.18.10) + tinyrainbow: 3.0.3 + vite: 7.2.7(@types/node@24.10.4) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.18.10 - happy-dom: 17.6.3 + '@types/node': 24.10.4 + happy-dom: 20.0.11 transitivePeerDependencies: - jiti - less @@ -7085,7 +7545,6 @@ snapshots: - sass-embedded - stylus - sugarss - - supports-color - terser - tsx - yaml @@ -7094,8 +7553,6 @@ snapshots: dependencies: defaults: 1.0.4 - webidl-conversions@7.0.0: {} - whatwg-mimetype@3.0.0: {} which-boxed-primitive@1.1.1: @@ -7164,10 +7621,10 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 - wrap-ansi@8.1.0: + wrap-ansi@9.0.2: dependencies: ansi-styles: 6.2.3 - string-width: 5.1.2 + string-width: 7.2.0 strip-ansi: 7.1.2 wrappy@1.0.2: {} @@ -7178,6 +7635,8 @@ snapshots: yargs-parser@21.1.1: {} + yargs-parser@22.0.0: {} + yargs@17.7.2: dependencies: cliui: 8.0.1 @@ -7188,6 +7647,15 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 + yargs@18.0.0: + dependencies: + cliui: 9.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + string-width: 7.2.0 + y18n: 5.0.8 + yargs-parser: 22.0.0 + yn@3.1.1: {} yocto-queue@0.1.0: {} From 95cbf4906efe56faba64a8d771d7bc64d834f021 Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Fri, 19 Dec 2025 21:34:22 +0700 Subject: [PATCH 099/119] Update tests.yml (#119) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> From 5c2bfd5b056c0a96edbaa5783991b6c066e82b07 Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Fri, 19 Dec 2025 22:37:33 +0700 Subject: [PATCH 100/119] Update config.yml (#120) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 709c9a7474..ad53a8e498 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -8,7 +8,7 @@ executors: - image: cimg/base:stable auth: # ensure you have first added these secrets - # visit app.circleci.com/settings/project/github/Dargon789/hardhat-project/environment-variables + # visit app.circleci.com/settings/project/github/Dargon789/foundry/environment-variables username: $DOCKER_HUB_USER password: $DOCKER_HUB_PASSWORD jobs: From 85324163804380abf8808edb390d5368fdfcb5af Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Mon, 22 Dec 2025 02:03:57 +0700 Subject: [PATCH 101/119] Update packages/services/identity-instrument/src/index.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --- packages/services/identity-instrument/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/services/identity-instrument/src/index.ts b/packages/services/identity-instrument/src/index.ts index f7b477b6ce..12eb0f0ffc 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, From 62954a37adf87309b882e544848d23769d209470 Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Mon, 22 Dec 2025 02:18:10 +0700 Subject: [PATCH 102/119] feat: upgrade @wagmi/cli from 0.1.15 to 2.8.0 (#126) Snyk has created this PR to upgrade @wagmi/cli from 0.1.15 to 2.8.0. See this package in npm: @wagmi/cli See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr Co-authored-by: snyk-bot --- wagmi-project/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wagmi-project/package.json b/wagmi-project/package.json index fb48d8e6a1..b3a2bc03e0 100644 --- a/wagmi-project/package.json +++ b/wagmi-project/package.json @@ -21,7 +21,7 @@ "@types/react": "^18.3.1", "@types/react-dom": "^18.3.0", "@vitejs/plugin-react": "^4.2.1", - "@wagmi/cli": "~0.x.x", + "@wagmi/cli": "~2.8.0", "buffer": "^6.0.3", "typescript": "^5.4.5", "vite": "^5.2.11" From 666c383b8c5a33537974ad512582df43799d0123 Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Mon, 22 Dec 2025 20:50:35 +0700 Subject: [PATCH 103/119] Potential fix for code scanning alert no. 82: Workflow does not contain permissions Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --- .github/workflows/on_pr_pnpm-format-label.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/on_pr_pnpm-format-label.yml b/.github/workflows/on_pr_pnpm-format-label.yml index 84fb27cb3e..83f23775a4 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] From 4257ad54d6469593cf65a7dcdb52cd970e60b30c Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Mon, 22 Dec 2025 20:51:18 +0700 Subject: [PATCH 104/119] Potential fix for code scanning alert no. 62: Information exposure through a stack trace Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --- packages/wallet/primitives-cli/src/subcommands/server.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/wallet/primitives-cli/src/subcommands/server.ts b/packages/wallet/primitives-cli/src/subcommands/server.ts index 29c5e1118b..ab999c4548 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 } From edc0b099ba1656df208735e7af1df8805c6a686f Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Mon, 22 Dec 2025 21:30:38 +0700 Subject: [PATCH 105/119] [Snyk] Upgrade @tanstack/react-query from 5.64.2 to 5.90.11 (#125) * fix: upgrade @tanstack/react-query from 5.64.2 to 5.90.11 Snyk has created this PR to upgrade @tanstack/react-query from 5.64.2 to 5.90.11. See this package in npm: @tanstack/react-query See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: snyk-bot Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- wagmi-project/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wagmi-project/package.json b/wagmi-project/package.json index b3a2bc03e0..a076f45331 100644 --- a/wagmi-project/package.json +++ b/wagmi-project/package.json @@ -10,7 +10,7 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/react-query": "5.64.2", + "@tanstack/react-query": "^5.90.11", "react": "^18.3.1", "react-dom": "^18.3.1", "viem": "^2.x", From cbb6c14f5413d6d6ad7b4bedecad12b4c4cec69e Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Mon, 22 Dec 2025 21:34:15 +0700 Subject: [PATCH 106/119] feat: upgrade vite from 5.4.21 to 7.2.4 (#124) Snyk has created this PR to upgrade vite from 5.4.21 to 7.2.4. See this package in npm: vite See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr Co-authored-by: snyk-bot --- wagmi-project/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wagmi-project/package.json b/wagmi-project/package.json index a076f45331..4d2695f99e 100644 --- a/wagmi-project/package.json +++ b/wagmi-project/package.json @@ -24,6 +24,6 @@ "@wagmi/cli": "~2.8.0", "buffer": "^6.0.3", "typescript": "^5.4.5", - "vite": "^5.2.11" + "vite": "^7.2.4" } } From 095c4b3a5fa231d01a57178aedc1eb082f4a6a12 Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Mon, 22 Dec 2025 21:35:50 +0700 Subject: [PATCH 107/119] feat: upgrade wagmi from 0.12.19 to 3.0.2 (#123) Snyk has created this PR to upgrade wagmi from 0.12.19 to 3.0.2. See this package in npm: wagmi See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr Co-authored-by: snyk-bot --- wagmi-project/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wagmi-project/package.json b/wagmi-project/package.json index 4d2695f99e..1256f02c74 100644 --- a/wagmi-project/package.json +++ b/wagmi-project/package.json @@ -14,7 +14,7 @@ "react": "^18.3.1", "react-dom": "^18.3.1", "viem": "^2.x", - "wagmi": "~0.x.x" + "wagmi": "~3.0.2" }, "devDependencies": { "@biomejs/biome": "^1.8.0", From 3c73b56250894a34906f06f24e8abd00675bf4b8 Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Mon, 22 Dec 2025 21:38:12 +0700 Subject: [PATCH 108/119] feat: upgrade react-dom from 18.3.1 to 19.2.0 (#122) Snyk has created this PR to upgrade react-dom from 18.3.1 to 19.2.0. See this package in npm: react-dom See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr Co-authored-by: snyk-bot --- wagmi-project/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wagmi-project/package.json b/wagmi-project/package.json index 1256f02c74..e08226928a 100644 --- a/wagmi-project/package.json +++ b/wagmi-project/package.json @@ -12,7 +12,7 @@ "dependencies": { "@tanstack/react-query": "^5.90.11", "react": "^18.3.1", - "react-dom": "^18.3.1", + "react-dom": "^19.2.0", "viem": "^2.x", "wagmi": "~3.0.2" }, From 186f8430583884d1fdc66101093b89ca7141ab6f Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Mon, 22 Dec 2025 22:36:16 +0700 Subject: [PATCH 109/119] fix: extras/docs/package.json to reduce vulnerabilities (#136) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> From b56f318e043ef11831fab9c65d345bc6bddf588a Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Mon, 22 Dec 2025 23:34:35 +0700 Subject: [PATCH 110/119] [Snyk] Upgrade @types/react from 18.3.27 to 19.2.7 (#127) * feat: upgrade @types/react from 18.3.27 to 19.2.7 Snyk has created this PR to upgrade @types/react from 18.3.27 to 19.2.7. See this package in npm: @types/react See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: snyk-bot Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> From bc418b171da95091d834f3a21141780169818db3 Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue, 23 Dec 2025 00:27:24 +0700 Subject: [PATCH 111/119] Master ceb95d4 (#129) * Update issue templates (#128) * Bump the npm_and_yarn group across 1 directory with 1 update Bumps the npm_and_yarn group with 1 update in the / directory: [express](https://github.com/expressjs/express). Updates `express` from 4.18.2 to 4.19.2 - [Release notes](https://github.com/expressjs/express/releases) - [Changelog](https://github.com/expressjs/express/blob/master/History.md) - [Commits](https://github.com/expressjs/express/compare/4.18.2...4.19.2) --- updated-dependencies: - dependency-name: express dependency-type: direct:development dependency-group: npm_and_yarn-security-group ... Signed-off-by: dependabot[bot] * Create SECURITY.md * Set up CI with Azure Pipelines [skip ci] * Create CNAME * Create fortify.yml * Update issue templates * Update CNAME * fix: upgrade @tanstack/react-query from 5.45.1 to 5.64.2 Snyk has created this PR to upgrade @tanstack/react-query from 5.45.1 to 5.64.2. See this package in npm: @tanstack/react-query See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr * Create config.yml (#46) Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Support multiple identity signers in sessions configuration * Device signers can approve implicit sessions * Remove invalid test * Fix recursion * Fix comment * Improve test stability by reducing race conditions * Do not set passkey signer as identity signer * Use length checks * Throw on missing identity signer * Encoding requires identity signer to encode * Fix test * Refactor/types namings tsdoc redundant code (#880) * refactor types, namings, ts doc * fix session response payload * change parameter name * change parameter name * change type in tests * improve types and dapp client methods * fix session test to use new types * refactor * refactor implicit sessions array in chain session manager * remove unused types * remove unused types and add ConnectionError * update pnpm lock * move reusable session types to wallet-core * Update some imports and update some response type names --------- Co-authored-by: Tolgahan Arikan * Fix check for explicit session for the updated type in dapp-client * Update api.gen.ts and relayer.gen.ts * Add missing chainId for dapp client event * Fix initializing new chain session manager on redirect * Add support for non-viem, custom Sequence chains (#882) * Provider sent to prepareBlankEnvelope * Update fortify.yml Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Add session signature decoding * Add feeTokens endpoint to relayer (#885) * const for node length * Clearer blacklist size encoding * identity signer node length * add getFeeTokens to dapp client (#889) * add getFeeTokens to dapp client * fix typo * make getFeeTokens independent of chain session manager and initialize state (#890) * make getFeeTokens independent of chain session manager and initialized state * remove getFeeTokens from chain session manager * Throw specific error when trying to sign with an expired session (#887) * Throw when supported session signer is expired * Fix tests * Make dapp-client implicit sessions chain agnostic (#893) * Add Monad, remove LAOS and Root Network * Add support for sessionless dapp connection (#896) * Refactor relayer package & update dependant packages (#891) * refactor exports for relayer (#900) * Add Arc Testnet * Fix changelog config * Sessionless connection upgrade and error handling in DappClient (#902) * dapp-client: add sessionless snapshot restore flow * Bump the npm_and_yarn group across 3 directories with 1 update Bumps the npm_and_yarn group with 1 update in the / directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/dapp-client directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/wdk directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] * Allow to logout a wallet with skipRemoveDevice even if the wallet is not in a ready state to allow force removing of wallets (#906) * Pass request to PromptCodeHandler in guard registerUI (#909) * Pass request to PromptCodeHandler in guard registerUI * Fixing guard registerUI test * guard: allow using recovery code as 2FA token (#910) * guard: allow using recovery code as 2FA token * Cleanup types of ResponseFn --------- Co-authored-by: Corban Riley * Add a way to reset 2fa when using a backup code (#911) * Add a way to reset 2fa when using a backup code * use the GuardToken type instead of breaking out the props * Update package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Create FUNDING.json (#90) Enhancements: Include FUNDING.json to display GitHub sponsorship options in the repository Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Create config.yml (#91) Add initial CircleCI configuration to enable automated builds using a custom Docker executor and a defined workflow. Build: Add .circleci/config.yml with version 2.1 specification and custom Docker executor. CI: Define web3-defi-game-project job with checkout step. Set up my-custom-workflow to run the job. Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Add rc4 contracts * Set rc4 as default and add it to lists * Session enhanced replay protection * New sessions replay protection hashes payload * Use the 4337 factory wrapper * Update keymachine url in dapp-client constants * Update keymachine url in Provider constructor * SSR safety (#915) * SSR safety test * Fix CI job * Guard dapp-client for SSR (lazy transport, browser checks, gated storage) * Fix guard topology (#918) * Use proper guard topology * Test and fixes * login and setup tests * Switch prod manager settings (#917) * Add prod guard and identity instrument info * Remove completed TODOs * Small JS tweaks (#919) * Fix type exports to built declarations * Update repository links to current package paths * Improve Next app tooling and React typings * Expose primitives CLI bin and use base lint config * Update relayer.gen.ts and TransactionPrecondition interface * Update api.gen.ts * Update metadata.gen.ts * Update marketplace.gen.ts * Update guard.gen.ts * Support multiple identity signers in sessions configuration * Device signers can approve implicit sessions * Remove invalid test * Fix recursion * Fix comment * Improve test stability by reducing race conditions * Do not set passkey signer as identity signer * Use length checks * Throw on missing identity signer * Encoding requires identity signer to encode * Fix test * Refactor/types namings tsdoc redundant code (#880) * refactor types, namings, ts doc * fix session response payload * change parameter name * change parameter name * change type in tests * improve types and dapp client methods * fix session test to use new types * refactor * refactor implicit sessions array in chain session manager * remove unused types * remove unused types and add ConnectionError * update pnpm lock * move reusable session types to wallet-core * Update some imports and update some response type names --------- Co-authored-by: Tolgahan Arikan * Fix check for explicit session for the updated type in dapp-client * Update api.gen.ts and relayer.gen.ts * Add missing chainId for dapp client event * Fix initializing new chain session manager on redirect * Add support for non-viem, custom Sequence chains (#882) * Provider sent to prepareBlankEnvelope * Add session signature decoding * const for node length * Clearer blacklist size encoding * identity signer node length * Add feeTokens endpoint to relayer (#885) * add getFeeTokens to dapp client (#889) * add getFeeTokens to dapp client * fix typo * make getFeeTokens independent of chain session manager and initialize state (#890) * make getFeeTokens independent of chain session manager and initialized state * remove getFeeTokens from chain session manager * Throw specific error when trying to sign with an expired session (#887) * Throw when supported session signer is expired * Fix tests * Make dapp-client implicit sessions chain agnostic (#893) * Add Monad, remove LAOS and Root Network * Add support for sessionless dapp connection (#896) * Refactor relayer package & update dependant packages (#891) * refactor exports for relayer (#900) * Add Arc Testnet * Fix changelog config * Sessionless connection upgrade and error handling in DappClient (#902) * dapp-client: add sessionless snapshot restore flow * Allow to logout a wallet with skipRemoveDevice even if the wallet is not in a ready state to allow force removing of wallets (#906) * Pass request to PromptCodeHandler in guard registerUI (#909) * Pass request to PromptCodeHandler in guard registerUI * Fixing guard registerUI test * guard: allow using recovery code as 2FA token (#910) * guard: allow using recovery code as 2FA token * Cleanup types of ResponseFn --------- Co-authored-by: Corban Riley * Add a way to reset 2fa when using a backup code (#911) * Add a way to reset 2fa when using a backup code * use the GuardToken type instead of breaking out the props * Add rc4 contracts * Set rc4 as default and add it to lists * Session enhanced replay protection * New sessions replay protection hashes payload * Use the 4337 factory wrapper * Update keymachine url in dapp-client constants * Update keymachine url in Provider constructor * SSR safety (#915) * Guard dapp-client for SSR (lazy transport, browser checks, gated storage) * Fix guard topology (#918) * Use proper guard topology * Test and fixes * login and setup tests * Switch prod manager settings (#917) * Add prod guard and identity instrument info * Remove completed TODOs * Small JS tweaks (#919) * Fix type exports to built declarations * Update repository links to current package paths * Improve Next app tooling and React typings * Expose primitives CLI bin and use base lint config * Update relayer.gen.ts and TransactionPrecondition interface * Update relayer.gen.ts and TransactionPrecondition interface (#920) * 3.0.0-beta.1 * identity-instrument: generate nonce from current time (#921) * Remove publish-dists.yml github action (#923) * 3.0.0-beta.2 * Clean up changeset config * Improve test stability by removing race conditions * Ensure build before test * Updating happy-dom to 20.0.10 (#926) * Add support for custom auth providers (authcode & authcode-pkce only) (#894) * Add support for custom auth providers (authcode & authcode-pkce only) * fix authcode tests * Updating Deps November 2025 (#927) * Updating deps for the workspace root * Updating deps for wallet/wdk * Fixing sessions test for latest vitest * Lets not upgrade to the latest typescript quite yet * Updating to latest vitest * Updating deps for wallet/core * Updating deps for wallet/primitives-cli * Updating deps for wallet/dapp-client * Adding syncpack to check for dep version inconsistencies * Setup syncpack versionGroups for pnpm workspace:^ * Fixing dep versions mismatches * Fixing @types/node mismatches * Adding syncpack to pre commit hook * Remove the syncpack format script. * Update ox to v9.17.0 (#928) * Upgrading ox to 9.17.0 * WrappedSignature renamed to SignatureErc6492 * Fixing PasskeySignatureValidator interface * Lock ox lib dep to use the same version with pnpm overrides and update viem to latest * Fix explicitSessionRequested check in dapp client * Typescript 5.9.3 (#930) * Upgrading to typescript v5.9.3 * Fix type errors that arose from typescript upgrade related to Bytes and Buffer source typings. * Don't catch errors thrown by Guard 2FA or reject early to allow multiple attempts on incorrect TOTP (#931) * Update pnpm * Mark @0xsequence/wallet-primitives-cli as private * 3.0.0-beta.3 * changeset cleanup * Fix rc4 4337 factory (#933) * Add rc5 and set it as default (#934) * 3.0.0-beta.4 * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Bump next from 15.5.5 to 15.5.7 (#936) Bumps [next](https://github.com/vercel/next.js) from 15.5.5 to 15.5.7. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.5...v15.5.7) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.7 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * add userdata service client (#940) * Skip LocalDevice identity signers not on current device (#942) * Skip LocalDevice identity signers not on current device * Update log * 3.0.0-beta.5 * Update config.yml (#102) * Update config.yml Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update .circleci/config.yml Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> * Update config.yml (#103) * Update config.yml Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update .circleci/config.yml Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> * fix: extras/web/package.json to reduce vulnerabilities (#101) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * fix: extras/docs/package.json to reduce vulnerabilities (#100) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * fix: package.json to reduce vulnerabilities (#104) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-BABELHELPERS-9397697 - https://snyk.io/vuln/SNYK-JS-BABELRUNTIME-10044504 - https://snyk.io/vuln/SNYK-JS-BRACEEXPANSION-9789073 - https://snyk.io/vuln/SNYK-JS-CROSSSPAWN-8303230 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577916 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577917 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577918 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8187303 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8720086 - https://snyk.io/vuln/SNYK-JS-IMAGESIZE-9634164 - https://snyk.io/vuln/SNYK-JS-INFLIGHT-6095116 - https://snyk.io/vuln/SNYK-JS-JSYAML-13961110 - https://snyk.io/vuln/SNYK-JS-MICROMATCH-6838728 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14114940 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14125097 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14125745 - https://snyk.io/vuln/SNYK-JS-ONHEADERS-10773729 - https://snyk.io/vuln/SNYK-JS-ROLLUP-8073097 - https://snyk.io/vuln/SNYK-JS-SECP256K1-8237220 - https://snyk.io/vuln/SNYK-JS-SEND-7926862 - https://snyk.io/vuln/SNYK-JS-SERVESTATIC-7926865 - https://snyk.io/vuln/SNYK-JS-SHAJS-12089400 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * Revert "Merge remote-tracking branch 'origin/dependabot/npm_and_yarn/npm_and_yarn-318c02e2da'" This reverts commit fd0fdf9ecc6ad9056447e381de7fc5bb19f78e47, reversing changes made to cba78943db9942a4635bb530b7a43fc5d18b0ab4. * fix: extras/web/package.json to reduce vulnerabilities (#109) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-bot * fix: extras/docs/package.json to reduce vulnerabilities (#106) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14400636 - https://snyk.io/vuln/SNYK-JS-NEXT-14400644 Co-authored-by: snyk-bot * Bump next in the npm_and_yarn group across 1 directory (#110) Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.5.7 to 15.5.9 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.7...v15.5.9) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Delete .github/workflows/fortify.yml (#111) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * fix: extras/web/package.json to reduce vulnerabilities (#107) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14400636 - https://snyk.io/vuln/SNYK-JS-NEXT-14400644 Co-authored-by: snyk-bot * Bump the npm_and_yarn group across 1 directory with 3 updates (#115) Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.5.5 to 15.5.9 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.5...v15.5.9) Updates `happy-dom` from 17.6.3 to 20.0.11 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.11) Updates `vite` from 7.1.10 to 7.2.7 - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/v7.2.7/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v7.2.7/packages/vite) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.11 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: vite dependency-version: 7.2.7 dependency-type: indirect dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump next from 15.5.7 to 15.5.9 (#944) Bumps [next](https://github.com/vercel/next.js) from 15.5.7 to 15.5.9. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.7...v15.5.9) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Pin foundry to v1.5.0 instead of nightly (#947) * Include repo and extras in syncpack config to ensure deps are synced (#945) * Include repo and extras in syncpack config to ensure deps are synced across all * Updating support deps * Updating deps * Updating pnpm lock * Fixing type errors within wdk tests * Short circuit 404s (#949) * skip witness on signers that don't support it * add passkey to test * 3.0.0-beta.6 * Update tests.yml (#119) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update config.yml (#120) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/services/identity-instrument/src/index.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: snyk-bot Co-authored-by: Michael Standen Co-authored-by: Gabi <56271768+VGabriel45@users.noreply.github.com> Co-authored-by: Tolgahan Arikan Co-authored-by: Taylan Pince Co-authored-by: Corban Brook Co-authored-by: Patryk Kalinowski Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Co-authored-by: Agusx1211 Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * Update wagmi-project/src/main.tsx Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * fix: extras/docs/package.json to reduce vulnerabilities (#116) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14400636 - https://snyk.io/vuln/SNYK-JS-NEXT-14400644 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> Co-authored-by: dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: snyk-bot Co-authored-by: Michael Standen Co-authored-by: Gabi <56271768+VGabriel45@users.noreply.github.com> Co-authored-by: Tolgahan Arikan Co-authored-by: Taylan Pince Co-authored-by: Corban Brook Co-authored-by: Patryk Kalinowski Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Co-authored-by: Agusx1211 Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> From 28a268eef9f36a4bcf257d175c49c31f55f8008b Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue, 23 Dec 2025 18:14:59 +0700 Subject: [PATCH 112/119] Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --- wagmi-project/src/App.tsx | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/wagmi-project/src/App.tsx b/wagmi-project/src/App.tsx index 05da5e5b34..236da51677 100644 --- a/wagmi-project/src/App.tsx +++ b/wagmi-project/src/App.tsx @@ -109,11 +109,15 @@ const App = () => { const [isOpen, toggleModal] = useState(false) const [warning, setWarning] = useState(false) - useMemo(() => { - wallet.on('chainChanged', (chainId: string) => { + useEffect(() => { + const handleChainChanged = (chainId: string) => { setShowChainId(Number(BigInt(chainId))) - }) - }, []) + } + wallet.on('chainChanged', handleChainChanged) + return () => { + wallet.off('chainChanged', handleChainChanged) + } + }, [wallet]) useEffect(() => { setIsWalletConnected(wallet.isConnected()) From 51a64321d3c0b91c9bd43c1e7e693f974c045dbb Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue, 23 Dec 2025 18:15:24 +0700 Subject: [PATCH 113/119] Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --- wagmi-project/src/App.tsx | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/wagmi-project/src/App.tsx b/wagmi-project/src/App.tsx index 236da51677..5262628765 100644 --- a/wagmi-project/src/App.tsx +++ b/wagmi-project/src/App.tsx @@ -130,13 +130,20 @@ const App = () => { useEffect(() => { // Wallet events - wallet.client.onOpen(() => { + const onOpen = () => { console.log('wallet window opened') - }) + } + wallet.client.on('open', onOpen) - wallet.client.onClose(() => { + 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 = { From 640be8ffe175c762828aded47cc76e8d2c404b56 Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue, 23 Dec 2025 18:15:48 +0700 Subject: [PATCH 114/119] Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --- wagmi-project/src/App.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/wagmi-project/src/App.tsx b/wagmi-project/src/App.tsx index 5262628765..2b4431b5e9 100644 --- a/wagmi-project/src/App.tsx +++ b/wagmi-project/src/App.tsx @@ -79,7 +79,10 @@ const defaultChainId = getDefaultChainId() || ChainId.MAINNET const urlParams = new URLSearchParams(window.location.search) const env = urlParams.get('env') ?? 'production' -const envConfig = environments.find(x => x.name === env) +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') From 7fe4a922dfbd817fa76b8e30e9be184e6f38ddb1 Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue, 23 Dec 2025 18:16:10 +0700 Subject: [PATCH 115/119] Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --- wagmi-project/src/App.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wagmi-project/src/App.tsx b/wagmi-project/src/App.tsx index 2b4431b5e9..9f245fc45f 100644 --- a/wagmi-project/src/App.tsx +++ b/wagmi-project/src/App.tsx @@ -181,7 +181,7 @@ const App = () => { const connectDetails = await wallet.connect(connectOptions) // Example of how to verify using ETHAuth via Sequence API - if (connectOptions.authorize && connectDetails.connected) { + if (connectOptions.authorize && connectDetails.connected && connectDetails.proof) { let apiUrl = urlParams.get('apiUrl') if (!apiUrl || apiUrl.length === 0) { @@ -195,7 +195,7 @@ const App = () => { const { isValid } = await api.isValidETHAuthProof({ chainId: connectDetails.chainId, walletAddress: connectDetails.session.accountAddress, - ethAuthProofString: connectDetails.proof!.proofString + ethAuthProofString: connectDetails.proof.proofString }) appendConsoleLine(`isValid (API)?: ${isValid}`) From c84e8471c43490208972b509fce9a852d36d32d8 Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Mon, 27 Apr 2026 09:43:33 +0700 Subject: [PATCH 116/119] Refactor CircleCI config for testing workflow (#495) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --- .circleci/config.yml | 36 ++++++++++++++++-------------------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 709c9a7474..2ef62819f0 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,26 +1,22 @@ -# 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/hardhat-project/environment-variables - username: $DOCKER_HUB_USER - password: $DOCKER_HUB_PASSWORD + jobs: - web3-defi-game-project-: - - executor: my-custom-executor + test: + docker: + - image: ghcr.io/foundry-rs/foundry:latest steps: - checkout - - run: | - # echo Hello, World! - + - run: + name: Install submodules + command: git submodule update --init --recursive + - run: + name: Build + command: forge build + - run: + name: Test + command: forge test -vvv + workflows: - my-custom-workflow: + main: jobs: - - web3-defi-game-project- + - test From 7bef631951de9106415730de0130c86822eb5008 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Apr 2026 11:32:20 +0700 Subject: [PATCH 117/119] Bump the npm_and_yarn group across 3 directories with 3 updates (#496) Bumps the npm_and_yarn group with 2 updates in the / directory: [next](https://github.com/vercel/next.js) and [uuid](https://github.com/uuidjs/uuid). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/wdk directory: [uuid](https://github.com/uuidjs/uuid). Bumps the npm_and_yarn group with 1 update in the /wagmi-project directory: [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite). Updates `next` from 15.5.14 to 15.5.15 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.14...v15.5.15) Updates `uuid` from 13.0.0 to 14.0.0 - [Release notes](https://github.com/uuidjs/uuid/releases) - [Changelog](https://github.com/uuidjs/uuid/blob/main/CHANGELOG.md) - [Commits](https://github.com/uuidjs/uuid/compare/v13.0.0...v14.0.0) Updates `uuid` from 13.0.0 to 14.0.0 - [Release notes](https://github.com/uuidjs/uuid/releases) - [Changelog](https://github.com/uuidjs/uuid/blob/main/CHANGELOG.md) - [Commits](https://github.com/uuidjs/uuid/compare/v13.0.0...v14.0.0) Updates `vite` from 7.3.0 to 7.3.2 - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/v7.3.2/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v7.3.2/packages/vite) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.15 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: uuid dependency-version: 14.0.0 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: uuid dependency-version: 14.0.0 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: vite dependency-version: 7.3.2 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- extras/docs/package.json | 2 +- extras/web/package.json | 2 +- packages/wallet/wdk/package.json | 2 +- pnpm-lock.yaml | 184 +++++++++++++++---------------- wagmi-project/package.json | 2 +- 5 files changed, 96 insertions(+), 96 deletions(-) diff --git a/extras/docs/package.json b/extras/docs/package.json index ccf8cc5bbf..738f3ead18 100644 --- a/extras/docs/package.json +++ b/extras/docs/package.json @@ -13,7 +13,7 @@ }, "dependencies": { "@repo/ui": "workspace:^", - "next": "^15.5.14", + "next": "^15.5.15", "react": "^19.2.3", "react-dom": "^19.2.3" }, diff --git a/extras/web/package.json b/extras/web/package.json index b8fdea4997..23e80ac071 100644 --- a/extras/web/package.json +++ b/extras/web/package.json @@ -13,7 +13,7 @@ }, "dependencies": { "@repo/ui": "workspace:^", - "next": "^15.5.14", + "next": "^15.5.15", "react": "^19.2.3", "react-dom": "^19.2.3" }, diff --git a/packages/wallet/wdk/package.json b/packages/wallet/wdk/package.json index 2d62c27953..1934c2e600 100644 --- a/packages/wallet/wdk/package.json +++ b/packages/wallet/wdk/package.json @@ -44,6 +44,6 @@ "idb": "^8.0.3", "jwt-decode": "^4.0.0", "ox": "^0.9.17", - "uuid": "^13.0.0" + "uuid": "^14.0.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 54ad63e327..e81a9b1db7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -39,8 +39,8 @@ importers: specifier: workspace:^ version: link:../../repo/ui next: - specifier: ^15.5.14 - version: 15.5.14(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + specifier: ^15.5.15 + version: 15.5.15(react-dom@19.2.3(react@19.2.3))(react@19.2.3) react: specifier: ^19.2.3 version: 19.2.3 @@ -76,8 +76,8 @@ importers: specifier: workspace:^ version: link:../../repo/ui next: - specifier: ^15.5.14 - version: 15.5.14(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + specifier: ^15.5.15 + version: 15.5.15(react-dom@19.2.3(react@19.2.3))(react@19.2.3) react: specifier: ^19.2.3 version: 19.2.3 @@ -474,8 +474,8 @@ importers: specifier: ^0.9.17 version: 0.9.17(typescript@5.9.3)(zod@4.2.0) uuid: - specifier: ^13.0.0 - version: 13.0.0 + specifier: ^14.0.0 + version: 14.0.0 devDependencies: '@repo/eslint-config': specifier: workspace:^ @@ -530,7 +530,7 @@ importers: version: 7.0.1(eslint@9.39.2) eslint-plugin-turbo: specifier: ^2.6.3 - version: 2.6.3(eslint@9.39.2)(turbo@2.8.21) + version: 2.6.3(eslint@9.39.2)(turbo@2.9.6) globals: specifier: ^16.5.0 version: 16.5.0 @@ -720,8 +720,8 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@emnapi/runtime@1.9.1': - resolution: {integrity: sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==} + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} '@esbuild/aix-ppc64@0.27.3': resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==} @@ -1104,56 +1104,56 @@ packages: '@manypkg/get-packages@1.1.3': resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} - '@next/env@15.5.14': - resolution: {integrity: sha512-aXeirLYuASxEgi4X4WhfXsShCFxWDfNn/8ZeC5YXAS2BB4A8FJi1kwwGL6nvMVboE7fZCzmJPNdMvVHc8JpaiA==} + '@next/env@15.5.15': + resolution: {integrity: sha512-vcmyu5/MyFzN7CdqRHO3uHO44p/QPCZkuTUXroeUmhNP8bL5PHFEhik22JUazt+CDDoD6EpBYRCaS2pISL+/hg==} '@next/eslint-plugin-next@15.5.9': resolution: {integrity: sha512-kUzXx0iFiXw27cQAViE1yKWnz/nF8JzRmwgMRTMh8qMY90crNsdXJRh2e+R0vBpFR3kk1yvAR7wev7+fCCb79Q==} - '@next/swc-darwin-arm64@15.5.14': - resolution: {integrity: sha512-Y9K6SPzobnZvrRDPO2s0grgzC+Egf0CqfbdvYmQVaztV890zicw8Z8+4Vqw8oPck8r1TjUHxVh8299Cg4TrxXg==} + '@next/swc-darwin-arm64@15.5.15': + resolution: {integrity: sha512-6PvFO2Tzt10GFK2Ro9tAVEtacMqRmTarYMFKAnV2vYMdwWc73xzmDQyAV7SwEdMhzmiRoo7+m88DuiXlJlGeaw==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@15.5.14': - resolution: {integrity: sha512-aNnkSMjSFRTOmkd7qoNI2/rETQm/vKD6c/Ac9BZGa9CtoOzy3c2njgz7LvebQJ8iPxdeTuGnAjagyis8a9ifBw==} + '@next/swc-darwin-x64@15.5.15': + resolution: {integrity: sha512-G+YNV+z6FDZTp/+IdGyIMFqalBTaQSnvAA+X/hrt+eaTRFSznRMz9K7rTmzvM6tDmKegNtyzgufZW0HwVzEqaQ==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.5.14': - resolution: {integrity: sha512-tjlpia+yStPRS//6sdmlVwuO1Rioern4u2onafa5n+h2hCS9MAvMXqpVbSrjgiEOoCs0nJy7oPOmWgtRRNSM5Q==} + '@next/swc-linux-arm64-gnu@15.5.15': + resolution: {integrity: sha512-eVkrMcVIBqGfXB+QUC7jjZ94Z6uX/dNStbQFabewAnk13Uy18Igd1YZ/GtPRzdhtm7QwC0e6o7zOQecul4iC1w==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.5.14': - resolution: {integrity: sha512-8B8cngBaLadl5lbDRdxGCP1Lef8ipD6KlxS3v0ElDAGil6lafrAM3B258p1KJOglInCVFUjk751IXMr2ixeQOQ==} + '@next/swc-linux-arm64-musl@15.5.15': + resolution: {integrity: sha512-RwSHKMQ7InLy5GfkY2/n5PcFycKA08qI1VST78n09nN36nUPqCvGSMiLXlfUmzmpQpF6XeBYP2KRWHi0UW3uNg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@15.5.14': - resolution: {integrity: sha512-bAS6tIAg8u4Gn3Nz7fCPpSoKAexEt2d5vn1mzokcqdqyov6ZJ6gu6GdF9l8ORFrBuRHgv3go/RfzYz5BkZ6YSQ==} + '@next/swc-linux-x64-gnu@15.5.15': + resolution: {integrity: sha512-nplqvY86LakS+eeiuWsNWvfmK8pFcOEW7ZtVRt4QH70lL+0x6LG/m1OpJ/tvrbwjmR8HH9/fH2jzW1GlL03TIg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.5.14': - resolution: {integrity: sha512-mMxv/FcrT7Gfaq4tsR22l17oKWXZmH/lVqcvjX0kfp5I0lKodHYLICKPoX1KRnnE+ci6oIUdriUhuA3rBCDiSw==} + '@next/swc-linux-x64-musl@15.5.15': + resolution: {integrity: sha512-eAgl9NKQ84/sww0v81DQINl/vL2IBxD7sMybd0cWRw6wqgouVI53brVRBrggqBRP/NWeIAE1dm5cbKYoiMlqDQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@15.5.14': - resolution: {integrity: sha512-OTmiBlYThppnvnsqx0rBqjDRemlmIeZ8/o4zI7veaXoeO1PVHoyj2lfTfXTiiGjCyRDhA10y4h6ZvZvBiynr2g==} + '@next/swc-win32-arm64-msvc@15.5.15': + resolution: {integrity: sha512-GJVZC86lzSquh0MtvZT+L7G8+jMnJcldloOjA8Kf3wXvBrvb6OGe2MzPuALxFshSm/IpwUtD2mIoof39ymf52A==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@15.5.14': - resolution: {integrity: sha512-+W7eFf3RS7m4G6tppVTOSyP9Y6FsJXfOuKzav1qKniiFm3KFByQfPEcouHdjlZmysl4zJGuGLQ/M9XyVeyeNEg==} + '@next/swc-win32-x64-msvc@15.5.15': + resolution: {integrity: sha512-nFucjVdwlFqxh/JG3hWSJ4p8+YJV7Ii8aPDuBQULB6DzUF4UNZETXLfEUk+oI2zEznWWULPt7MeuTE6xtK1HSA==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -1326,13 +1326,13 @@ packages: '@tsconfig/node16@1.0.4': resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - '@turbo/darwin-64@2.8.21': - resolution: {integrity: sha512-kfGoM0Iw8ZNZpbds+4IzOe0hjvHldqJwUPRAjXJi3KBxg/QOZL95N893SRoMtf2aJ+jJ3dk32yPkp8rvcIjP9g==} + '@turbo/darwin-64@2.9.6': + resolution: {integrity: sha512-X/56SnVXIQZBLKwniGTwEQTGmtE5brSACnKMBWpY3YafuxVYefrC2acamfjgxP7BG5w3I+6jf0UrLoSzgPcSJg==} cpu: [x64] os: [darwin] - '@turbo/darwin-arm64@2.8.21': - resolution: {integrity: sha512-o9HEflxUEyr987x0cTUzZBhDOyL6u95JmdmlkH2VyxAw7zq2sdtM5e72y9ufv2N5SIoOBw1fVn9UES5VY5H6vQ==} + '@turbo/darwin-arm64@2.9.6': + resolution: {integrity: sha512-aalBeSl4agT/QtYGDyf/XLajedWzUC9Vg/pm/YO6QQ93vkQ91Vz5uK1ta5RbVRDozQSz4njxUNqRNmOXDzW+qw==} cpu: [arm64] os: [darwin] @@ -1340,23 +1340,23 @@ packages: resolution: {integrity: sha512-PK38N1fHhDUyjLi0mUjv0RbX0xXGwDLQeRSGsIlLcVpP1B5fwodSIwIYXc9vJok26Yne94BX5AGjueYsUT3uUw==} hasBin: true - '@turbo/linux-64@2.8.21': - resolution: {integrity: sha512-uTxlCcXWy5h1fSSymP8XSJ+AudzEHMDV3IDfKX7+DGB8kgJ+SLoTUAH7z4OFA7I/l2sznz0upPdbNNZs91YMag==} + '@turbo/linux-64@2.9.6': + resolution: {integrity: sha512-YKi05jnNHaD7vevgYwahpzGwbsNNTwzU2c7VZdmdFm7+cGDP4oREUWSsainiMfRqjRuolQxBwRn8wf1jmu+YZA==} cpu: [x64] os: [linux] - '@turbo/linux-arm64@2.8.21': - resolution: {integrity: sha512-cdHIcxNcihHHkCHp0Y4Zb60K4Qz+CK4xw1gb6s/t/9o4SMeMj+hTBCtoW6QpPnl9xPYmxuTou8Zw6+cylTnREg==} + '@turbo/linux-arm64@2.9.6': + resolution: {integrity: sha512-02o/ZS69cOYEDczXvOB2xmyrtzjQ2hVFtWZK1iqxXUfzMmTjZK4UumrfNnjckSg+gqeBfnPRHa0NstA173Ik3g==} cpu: [arm64] os: [linux] - '@turbo/windows-64@2.8.21': - resolution: {integrity: sha512-/iBj4OzbqEY8CX+eaeKbBTMZv2CLXNrt0692F7HnK7LcyYwyDecaAiSET6ZzL4opT7sbwkKvzAC/fhqT3Quu1A==} + '@turbo/windows-64@2.9.6': + resolution: {integrity: sha512-wVdQjvnBI15wB6JrA+43CtUtagjIMmX6XYO758oZHAsCNSxqRlJtdyujih0D8OCnwCRWiGWGI63zAxR0hO6s9g==} cpu: [x64] os: [win32] - '@turbo/windows-arm64@2.8.21': - resolution: {integrity: sha512-95tMA/ZbIidJFUUtkmqioQ1gf3n3I1YbRP3ZgVdWTVn2qVbkodcIdGXBKRHHrIbRsLRl99SiHi/L7IxhpZDagQ==} + '@turbo/windows-arm64@2.9.6': + resolution: {integrity: sha512-1XUUyWW0W6FTSqGEhU8RHVqb2wP1SPkr7hIvBlMEwH9jr+sJQK5kqeosLJ/QaUv4ecSAd1ZhIrLoW7qslAzT4A==} cpu: [arm64] os: [win32] @@ -1675,7 +1675,7 @@ packages: basic-ftp@5.0.5: resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} engines: {node: '>=10.0.0'} - deprecated: Security vulnerability fixed in 5.2.0, please upgrade + deprecated: Security vulnerability fixed in 5.2.1, please upgrade better-path-resolve@1.0.0: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} @@ -1733,8 +1733,8 @@ packages: camel-case@3.0.0: resolution: {integrity: sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==} - caniuse-lite@1.0.30001781: - resolution: {integrity: sha512-RdwNCyMsNBftLjW6w01z8bKEvT6e/5tpPVEgtn22TiLGlstHOVecsX2KHFkD5e/vRnIE4EGzpuIODb3mtswtkw==} + caniuse-lite@1.0.30001791: + resolution: {integrity: sha512-yk0l/YSrOnFZk3UROpDLQD9+kC1l4meK/wed583AXrzoarMGJcbRi2Q4RaUYbKxYAsZ8sWmaSa/DsLmdBeI1vQ==} cbor2@1.12.0: resolution: {integrity: sha512-3Cco8XQhi27DogSp9Ri6LYNZLi/TBY/JVnDe+mj06NkBjW/ZYOtekaEU4wZ4xcRMNrFkDv8KNtOAqHyDfz3lYg==} @@ -2833,8 +2833,8 @@ packages: resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} engines: {node: '>= 0.4.0'} - next@15.5.14: - resolution: {integrity: sha512-M6S+4JyRjmKic2Ssm7jHUPkE6YUJ6lv4507jprsSZLulubz0ihO2E+S4zmQK3JZ2ov81JrugukKU4Tz0ivgqqQ==} + next@15.5.15: + resolution: {integrity: sha512-VSqCrJwtLVGwAVE0Sb/yikrQfkwkZW9p+lL/J4+xe+G3ZA+QnWPqgcfH1tDUEuk9y+pthzzVFp4L/U8JerMfMQ==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: @@ -3058,8 +3058,8 @@ packages: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} - postcss@8.5.8: - resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==} + postcss@8.5.12: + resolution: {integrity: sha512-W62t/Se6rA0Az3DfCL0AqJwXuKwBeYg6nOaIgzP+xZ7N5BFCI7DYi1qs6ygUYT6rvfi6t9k65UMLJC+PHZpDAA==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: @@ -3585,8 +3585,8 @@ packages: resolution: {integrity: sha512-OxbzDES66+x7nnKGg2MwBA1ypVsZoDTLHpeaP4giyiHSixbsiTaMyeJqbEyvBdp5Cm28fc+8GG6RdQtic0ijwQ==} hasBin: true - turbo@2.8.21: - resolution: {integrity: sha512-FlJ8OD5Qcp0jTAM7E4a/RhUzRNds2GzKlyxHKA6N247VLy628rrxAGlMpIXSz6VB430+TiQDJ/SMl6PL1lu6wQ==} + turbo@2.9.6: + resolution: {integrity: sha512-+v2QJey7ZUeUiuigkU+uFfklvNUyPI2VO2vBpMYJA+a1hKFLFiKtUYlRHdb3P9CrAvMzi0upbjI4WT+zKtqkBg==} hasBin: true type-check@0.4.0: @@ -3669,8 +3669,8 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - uuid@13.0.0: - resolution: {integrity: sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==} + uuid@14.0.0: + resolution: {integrity: sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg==} hasBin: true v8-compile-cache-lib@3.0.1: @@ -4146,7 +4146,7 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@emnapi/runtime@1.9.1': + '@emnapi/runtime@1.10.0': dependencies: tslib: 2.8.1 optional: true @@ -4371,7 +4371,7 @@ snapshots: '@img/sharp-wasm32@0.34.5': dependencies: - '@emnapi/runtime': 1.9.1 + '@emnapi/runtime': 1.10.0 optional: true '@img/sharp-win32-arm64@0.34.5': @@ -4430,34 +4430,34 @@ snapshots: globby: 11.1.0 read-yaml-file: 1.1.0 - '@next/env@15.5.14': {} + '@next/env@15.5.15': {} '@next/eslint-plugin-next@15.5.9': dependencies: fast-glob: 3.3.1 - '@next/swc-darwin-arm64@15.5.14': + '@next/swc-darwin-arm64@15.5.15': optional: true - '@next/swc-darwin-x64@15.5.14': + '@next/swc-darwin-x64@15.5.15': optional: true - '@next/swc-linux-arm64-gnu@15.5.14': + '@next/swc-linux-arm64-gnu@15.5.15': optional: true - '@next/swc-linux-arm64-musl@15.5.14': + '@next/swc-linux-arm64-musl@15.5.15': optional: true - '@next/swc-linux-x64-gnu@15.5.14': + '@next/swc-linux-x64-gnu@15.5.15': optional: true - '@next/swc-linux-x64-musl@15.5.14': + '@next/swc-linux-x64-musl@15.5.15': optional: true - '@next/swc-win32-arm64-msvc@15.5.14': + '@next/swc-win32-arm64-msvc@15.5.15': optional: true - '@next/swc-win32-x64-msvc@15.5.14': + '@next/swc-win32-x64-msvc@15.5.15': optional: true '@noble/ciphers@1.3.0': {} @@ -4577,10 +4577,10 @@ snapshots: '@tsconfig/node16@1.0.4': {} - '@turbo/darwin-64@2.8.21': + '@turbo/darwin-64@2.9.6': optional: true - '@turbo/darwin-arm64@2.8.21': + '@turbo/darwin-arm64@2.9.6': optional: true '@turbo/gen@1.13.4(@types/node@25.3.0)(typescript@5.9.3)': @@ -4603,16 +4603,16 @@ snapshots: - supports-color - typescript - '@turbo/linux-64@2.8.21': + '@turbo/linux-64@2.9.6': optional: true - '@turbo/linux-arm64@2.8.21': + '@turbo/linux-arm64@2.9.6': optional: true - '@turbo/windows-64@2.8.21': + '@turbo/windows-64@2.9.6': optional: true - '@turbo/windows-arm64@2.8.21': + '@turbo/windows-arm64@2.9.6': optional: true '@turbo/workspaces@1.13.4(@types/node@25.3.0)': @@ -5025,7 +5025,7 @@ snapshots: browserslist@4.28.1: dependencies: baseline-browser-mapping: 2.9.7 - caniuse-lite: 1.0.30001781 + caniuse-lite: 1.0.30001791 electron-to-chromium: 1.5.267 node-releases: 2.0.27 update-browserslist-db: 1.2.2(browserslist@4.28.1) @@ -5061,7 +5061,7 @@ snapshots: no-case: 2.3.2 upper-case: 1.1.3 - caniuse-lite@1.0.30001781: {} + caniuse-lite@1.0.30001791: {} cbor2@1.12.0: {} @@ -5482,11 +5482,11 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-turbo@2.6.3(eslint@9.39.2)(turbo@2.8.21): + eslint-plugin-turbo@2.6.3(eslint@9.39.2)(turbo@2.9.6): dependencies: dotenv: 16.0.3 eslint: 9.39.2 - turbo: 2.8.21 + turbo: 2.9.6 eslint-scope@8.4.0: dependencies: @@ -6320,24 +6320,24 @@ snapshots: netmask@2.0.2: {} - next@15.5.14(react-dom@19.2.3(react@19.2.3))(react@19.2.3): + next@15.5.15(react-dom@19.2.3(react@19.2.3))(react@19.2.3): dependencies: - '@next/env': 15.5.14 + '@next/env': 15.5.15 '@swc/helpers': 0.5.15 - caniuse-lite: 1.0.30001781 + caniuse-lite: 1.0.30001791 postcss: 8.4.31 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) styled-jsx: 5.1.6(react@19.2.3) optionalDependencies: - '@next/swc-darwin-arm64': 15.5.14 - '@next/swc-darwin-x64': 15.5.14 - '@next/swc-linux-arm64-gnu': 15.5.14 - '@next/swc-linux-arm64-musl': 15.5.14 - '@next/swc-linux-x64-gnu': 15.5.14 - '@next/swc-linux-x64-musl': 15.5.14 - '@next/swc-win32-arm64-msvc': 15.5.14 - '@next/swc-win32-x64-msvc': 15.5.14 + '@next/swc-darwin-arm64': 15.5.15 + '@next/swc-darwin-x64': 15.5.15 + '@next/swc-linux-arm64-gnu': 15.5.15 + '@next/swc-linux-arm64-musl': 15.5.15 + '@next/swc-linux-x64-gnu': 15.5.15 + '@next/swc-linux-x64-musl': 15.5.15 + '@next/swc-win32-arm64-msvc': 15.5.15 + '@next/swc-win32-x64-msvc': 15.5.15 sharp: 0.34.5 transitivePeerDependencies: - '@babel/core' @@ -6596,7 +6596,7 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - postcss@8.5.8: + postcss@8.5.12: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 @@ -7185,14 +7185,14 @@ snapshots: turbo-windows-64: 2.8.10 turbo-windows-arm64: 2.8.10 - turbo@2.8.21: + turbo@2.9.6: optionalDependencies: - '@turbo/darwin-64': 2.8.21 - '@turbo/darwin-arm64': 2.8.21 - '@turbo/linux-64': 2.8.21 - '@turbo/linux-arm64': 2.8.21 - '@turbo/windows-64': 2.8.21 - '@turbo/windows-arm64': 2.8.21 + '@turbo/darwin-64': 2.9.6 + '@turbo/darwin-arm64': 2.9.6 + '@turbo/linux-64': 2.9.6 + '@turbo/linux-arm64': 2.9.6 + '@turbo/windows-64': 2.9.6 + '@turbo/windows-arm64': 2.9.6 type-check@0.4.0: dependencies: @@ -7287,7 +7287,7 @@ snapshots: util-deprecate@1.0.2: {} - uuid@13.0.0: {} + uuid@14.0.0: {} v8-compile-cache-lib@3.0.1: {} @@ -7315,7 +7315,7 @@ snapshots: esbuild: 0.27.3 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 - postcss: 8.5.8 + postcss: 8.5.12 rollup: 4.53.4 tinyglobby: 0.2.15 optionalDependencies: diff --git a/wagmi-project/package.json b/wagmi-project/package.json index 206445bb31..c635e9821f 100644 --- a/wagmi-project/package.json +++ b/wagmi-project/package.json @@ -24,6 +24,6 @@ "@wagmi/cli": "latest", "buffer": "^6.0.3", "typescript": "^5.4.5", - "vite": "^5.2.11" + "vite": "^7.3.2" } } From 2a9ba723d41fc6b7c108c9d501a59a4bb12eb90c Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Sat, 9 May 2026 09:23:25 +0700 Subject: [PATCH 118/119] Update packages/wallet/dapp-client/src/DappTransport.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --- packages/wallet/dapp-client/src/DappTransport.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/wallet/dapp-client/src/DappTransport.ts b/packages/wallet/dapp-client/src/DappTransport.ts index 7b4f3c5d28..1498775385 100644 --- a/packages/wallet/dapp-client/src/DappTransport.ts +++ b/packages/wallet/dapp-client/src/DappTransport.ts @@ -562,8 +562,8 @@ export class DappTransport { private generateId(): string { // 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); + globalThis.crypto.getRandomValues(array); + const randStr = (array[0].toString(36).padStart(7, '0') + array[1].toString(36).padStart(7, '0')).slice(0, 9); return `${Date.now().toString(36)}-${randStr}`; } } From bdd6f4d0252a6bf3076db4aace1b5d8c892ee732 Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Sat, 9 May 2026 09:23:47 +0700 Subject: [PATCH 119/119] Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --- wagmi-project/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wagmi-project/package.json b/wagmi-project/package.json index c635e9821f..41a3ec7d56 100644 --- a/wagmi-project/package.json +++ b/wagmi-project/package.json @@ -13,8 +13,8 @@ "@tanstack/react-query": "5.64.2", "react": "^18.3.1", "react-dom": "^18.3.1", - "viem": "latest", - "wagmi": "latest" + "viem": "^2.21.0", + "wagmi": "^2.12.0" }, "devDependencies": { "@biomejs/biome": "^1.8.0",